diff --git a/.gitattributes b/.gitattributes index 3cf319f25..584961e8b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,7 +2,6 @@ # in statistics about this repo # src/Parsec/** linguist-vendored -src/vendor/stp/src/** linguist-vendored testsuite/** linguist-vendored doc/** linguist-documentation diff --git a/.github/workflows/build-and-test-macos.yml b/.github/workflows/build-and-test-macos.yml index 3130c3674..1ac06b4ef 100644 --- a/.github/workflows/build-and-test-macos.yml +++ b/.github/workflows/build-and-test-macos.yml @@ -101,7 +101,7 @@ jobs: popd # Check that .ghci has all the right flags to load the source. # This is important for text editor integration & tools like ghcid - # NB stp, yices and htcl must be built first, so do this after Build. + # NB yices and htcl must be built first, so do this after Build. - name: Check GHCI :load run: | cd src/comp diff --git a/.github/workflows/build-and-test-ubuntu.yml b/.github/workflows/build-and-test-ubuntu.yml index c1092dff1..b6fcba699 100644 --- a/.github/workflows/build-and-test-ubuntu.yml +++ b/.github/workflows/build-and-test-ubuntu.yml @@ -86,7 +86,7 @@ jobs: popd # Check that .ghci has all the right flags to load the source. # This is important for text editor integration & tools like ghcid - # NB stp, yices and htcl must be built first, so do this after Build. + # NB yices and htcl must be built first, so do this after Build. - name: Check GHCI :load run: | cd src/comp diff --git a/COPYING b/COPYING index 9f4ba0def..0ef403df8 100644 --- a/COPYING +++ b/COPYING @@ -3,15 +3,6 @@ under the BSD-3-Clause license, as indicated at the end of this file. Individual files or directories may specify their own copyright and license. The following are known to have other authors and licenses: -* STP - Constraint solver - * The files in src/vendor/stp/src/ are adapted from a snapshot of STP - * See LICENSES/LICENSE.stp and LICENSES/LICENSE.stp_components - * The source and license were obtained from the SVN repository [1] - at revision 1643 on 2012-04-18. A patch at [2] obtained on - 2014-04-21 was also applied. - [1] https://stp-fast-prover.svn.sourceforge.net/svnroot/stp-fast-prover/trunk/stp - [2] https://github.com/stp/stp/commit/ece1a55fb367bd905078baca38476e35b4df06c3 - * The Yices SMT Solver * The files in src/vendor/yices/ define a Haskell interface for using the Yices library (via its C API); there is also code for a diff --git a/INSTALL.md b/INSTALL.md index cac6ca94d..10128c5bb 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -147,18 +147,6 @@ library to compile: autoconf \ gperf -Building the BSC tools will also recurse into a directory for the STP SMT -solver. This is currently an old snapshot of the STP source code, including the -code for various libraries that it uses. In the future, this may be replaced -with a submodule instantiation of the repository for [the STP SMT -solver](https://github.com/stp/stp). When that happens, additional requirements -from that repository will be added. -Building the STP library is optional (see below). -The current snapshot requires Perl, to -generate two source files. It also needs flex and bison: - - $ apt-get install flex bison - The `check-smoke` target runs a test using an external Verilog simulator, which is [Icarus Verilog] by default. You can install Icarus on Debian/Ubuntu with: @@ -226,29 +214,6 @@ compile in parallel, define `GHCJOBS` in the environment to that number: $ make GHCJOBS=4 -### Optionally avoiding the compile of STP or Yices - -The BSC tools expect to dynamically link with specific versions of STP and Yices, -found in `inst/lib/SAT/`. By default, the build process will compile both -libraries and install them in that directory. However, the BSC tools only need -one SMT solver; Yices is used by default, and STP can be selected via a flag. -Most users will never need to switch solvers, or even be aware of the option. -Thus, the build process offers the option of not compiling the STP library, -and instead installing a stub file, that the BSC tools will recognize and will -not allow the user to select that solver. This option is chosen by assigning -a non-empty value to `STP_STUB`: - - $ make STP_STUB=1 - -This can be used if STP does not build on your system or if you want to avoid -the work of building the library. A similar `YICES_STUB` option exists, for -skipping the build of the Yices library: - - $ make YICES_STUB=1 - -The BSC tools do need at least one SMT solver, so only one of these options -should be used. - ## Test the BSC toolchain The following command will run a smoke test to ensure the compiler and diff --git a/LICENSES/LICENSE.stp b/LICENSES/LICENSE.stp deleted file mode 100644 index 0891de8fb..000000000 --- a/LICENSES/LICENSE.stp +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************** - * PROGRAM NAME: STP (Simple Theorem Prover) - * - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - ********************************************************************/ - -The MIT License - -Copyright (c) 2008 Vijay Ganesh - -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. diff --git a/LICENSES/LICENSE.stp_components b/LICENSES/LICENSE.stp_components deleted file mode 100644 index 6d3ba5559..000000000 --- a/LICENSES/LICENSE.stp_components +++ /dev/null @@ -1,174 +0,0 @@ -STP links to copyrighted librarys: - * Minisat Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson. - * Bit::Vector Copyright (c) 1995 - 2004 by Steffen Beyer. - * CVC's SMT-LIB Parser Copyright (C) 2004 by the Board of Trustees of Leland Stanford Junior University and by New York University. - * CryptoMinisat Copyright (c) 2009 Mate Soos - * ocaml-wrapper Copyright BitBlaze, 2007. All rights reserved. - * ABC by Alan Mishchenko - * Boost by various: http://www.boost.org/ - -MINISAT - /**************************************************************************************** - MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - - 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. - **************************************************************************************************/ - -Bit::Vector - /*****************************************************************************/ - /* LICENSE: */ - /*****************************************************************************/ - /* */ - /* This library is free software; you can redistribute it and/or */ - /* modify it under the terms of the GNU Library General Public */ - /* License as published by the Free Software Foundation; either */ - /* version 2 of the License, || (at your option) any later version. */ - /* */ - /* This library is distributed in the hope that it will be useful, */ - /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ - /* MERCHANTABILITY || FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ - /* Library General Public License for more details. */ - /* */ - /* You should have received a copy of the GNU Library General Public */ - /* License along with this library; if not, write to the */ - /* Free Software Foundation, Inc., */ - /* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - /* */ - /* || download a copy from ftp://ftp.gnu.org/pub/gnu/COPYING.LIB-2.0 */ - /* */ - /*****************************************************************************/ - -CVC's SMT-LIB Parser - /******************************************************************** - * - * \file smtlib.y - * - * Author: Sergey Berezin, Clark Barrett - * - * Created: Apr 30 2005 - * - *
- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford - * Junior University and by New York University. - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - * - *
- ********************************************************************/ - -Cryptominisat - CryptoMiniSat -- Copyright (c) 2009 Mate Soos - - 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. - - -ocaml-wrapper - ////////////////////////////////////////////////////////// - // - // Owned and copyright BitBlaze, 2007. All rights reserved. - // - ////////////////////////////////////////////////////////// - - 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. - -ABC - Copyright (c) The Regents of the University of California. All rights reserved. - - Permission is hereby granted, without written agreement and without license or - royalty fees, to use, copy, modify, and distribute this software and its - documentation for any purpose, provided that the above copyright notice and - the following two paragraphs appear in all copies of this software. - - IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR - DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF - THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF - CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, - AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, - SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - - - -Boost - Boost Software License - Version 1.0 - August 17th, 2003 - - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - - 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. diff --git a/doc/user_guide/user_guide.tex b/doc/user_guide/user_guide.tex index 8856057c0..149a42e02 100644 --- a/doc/user_guide/user_guide.tex +++ b/doc/user_guide/user_guide.tex @@ -2171,7 +2171,6 @@ \subsection{Compiler optimizations} \label{flag-optundeterminedvals} \begin{centerboxverbatim} -opt-undetermined-vals aggressive optimization of undetermined values --sat-stp use STP SMT for disjoint testing and SAT -sat-yices use Yices SMT for disjoint testing and SAT \end{centerboxverbatim} @@ -2191,7 +2190,6 @@ \subsection{Compiler optimizations} flag on may produce better hardware in Verilog, but can result in the Bluesim and Verilog simulations producing different intermediate values. -\index{-sat-stp@\te{-sat-stp} (compiler flag)} \index{-sat-yices@\te{-sat-yices} (compiler flag)} It is possible to change the underlying proof engine used by the compiler. You should not use these flags diff --git a/release/Makefile b/release/Makefile index d4ff31457..1bad758bf 100644 --- a/release/Makefile +++ b/release/Makefile @@ -26,8 +26,6 @@ LICFILES = $(addprefix $(LICDIR)/, \ LICENSE.ghc \ LICENSE.hbc \ LICENSE.parsec \ - LICENSE.stp \ - LICENSE.stp_components \ LICENSE.yices \ LICENSE.yices-painless \ ) diff --git a/release/tarball-COPYING b/release/tarball-COPYING index 5c4998fda..b6a4f1833 100644 --- a/release/tarball-COPYING +++ b/release/tarball-COPYING @@ -11,12 +11,8 @@ indicated in the files themselves. If not otherwise specified, they are copyright Bluespec Inc and licensed under the BSD-3-Clause license, as indicated at the end of this file. -The library objects in the SAT directory, for STP and Yices, are -licensed and copyright as follows: - -* STP - Constraint solver - * The library is built from an adapted snapshot of STP - * See LICENSES/LICENSE.stp and LICENSES/LICENSE.stp_components +The library objects in the SAT directory for Yices are licensed +and copyright as follows: * The Yices SMT Solver * The library is built from the Yices GitHub repository @@ -28,10 +24,6 @@ under the BSD-3-Clause license, as indicated at the end of this file. They are also built with the following code or APIs with their own copyright and licensing: -* STP - Constraint solver - * BSC tools are linked with the library - * See LICENSES/LICENSE.stp - * The Yices SMT Solver * BSC tools are linked with the library * See LICENSES/LICENSE.yices diff --git a/src/Makefile b/src/Makefile index 13b36104b..bf3869540 100644 --- a/src/Makefile +++ b/src/Makefile @@ -9,12 +9,10 @@ ifndef NO_DEPS_CHECKS CC_TOOLS=$(CC) $(CXX) $(LD) BSC_TOOLS=ghc ghc-pkg YICES_TOOLS=gperf autoconf -STP_TOOLS=flex bison TOOLS=$(CC_TOOLS) \ $(BSC_TOOLS) \ - $(YICES_TOOLS) \ - $(STP_TOOLS) \ + $(YICES_TOOLS) GHC_PKGS=regex-compat syb old-time split @@ -54,7 +52,6 @@ all: install .PHONY: install clean full_clean install clean full_clean: - $(MAKE) -C vendor/stp PREFIX=$(PREFIX) $@ $(MAKE) -C vendor/yices PREFIX=$(PREFIX) $@ $(MAKE) -C vendor/htcl PREFIX=$(PREFIX) $@ # we need to build targets from here sequentially, as they operate in the same workspace @@ -68,4 +65,3 @@ install clean full_clean: $(MAKE) -C bluetcl PREFIX=$(PREFIX) $@ $(MAKE) -C bluesim PREFIX=$(PREFIX) $@ $(MAKE) -C Verilator PREFIX=$(PREFIX) $@ - diff --git a/src/comp/.ghci b/src/comp/.ghci index c8edd0a8f..28cb976bd 100644 --- a/src/comp/.ghci +++ b/src/comp/.ghci @@ -23,7 +23,6 @@ :set -i../comp:../comp/Libs:../comp/GHC:../comp/GHC/posix:../Parsec -- Shared libraries and FFI bindings -:set -i../vendor/stp/include_hs :set -i../vendor/yices/include_hs :set -i../vendor/htcl @@ -31,9 +30,6 @@ :set -L../vendor/htcl :set -lhtcl -:set -L../vendor/stp/lib -:set -lstp - :set -L../vendor/yices/lib :set -lyices diff --git a/src/comp/AExpr2STP.hs b/src/comp/AExpr2STP.hs deleted file mode 100644 index ce45f26cd..000000000 --- a/src/comp/AExpr2STP.hs +++ /dev/null @@ -1,986 +0,0 @@ -module AExpr2STP( - SState, - initSState, - addADefToSState, - - checkDisjointExpr, - checkDisjointRulePair, - - checkBiImplication, - isConstExpr, - checkEq, - checkNotEq -) where - -import Control.Monad(when) -import Control.Monad.State(StateT, runStateT, liftIO, - gets, get, put, modify) -import qualified Data.Map as M -import qualified STP as S - -import Data.Maybe(fromMaybe) - -import ErrorUtil(internalError) -import Flags -import Id(getIdBaseString, dummy_id) -import Prim -import IntLit -import ASyntax -import ASyntaxUtil(aAnds) -import VModInfo(VModInfo) -import PFPrint -import Util(itos, map_insertMany, makePairs) -import TopUtils(withElapsed) - -import AExpr2Util(getMethodOutputPort) - -import Debug.Trace(traceM) -import IOUtil(progArgs) - -traceTest :: Bool -traceTest = "-trace-smt-test" `elem` progArgs - -traceConv :: Bool -traceConv = "-trace-smt-conv" `elem` progArgs - --- ------------------------- - -initSState :: String -> Flags -> Bool -> - [ADef] -> [AVInst] -> [RuleTriple] -> IO SState -initSState str flags doHardFail ds avis rs = do - ctx <- S.mkContext - falseE <- S.mkFalse ctx - return (SState { context = ctx, - --flags = flags, - hardFail = doHardFail, - - defMap = M.fromList [(i,d) | d@(ADef i _ _ _) <- ds], - ruleMap = M.fromList [(i,r) | r@(i,_,_) <- rs], - stateMap = M.fromList [(avi_vname avi, avi_vmi avi) - | avi <- avis], - proofMap = M.empty, - proofMapS = M.empty, - - anyId = 0, - unknownId = 0, - - falseExpr = falseE, - - defSExprMap = M.empty, - portSExprMap = M.empty, - expSExprMap = M.empty - }) - - -addADefToSState :: SState -> [ADef] -> IO SState -addADefToSState s ds = do - let defmap = defMap s - defmap' = map_insertMany [(id, d) | d@(ADef id _ _ _) <- ds] defmap - return (s { defMap = defmap' }) - -withTraceTest :: PPrint a => SM a -> SM a -withTraceTest m = - if traceTest - then withElapsed $ do - res <- m - liftIO $ putStr ("result: " ++ ppReadable res) - return res - else m - --- ------------------------- - -checkDisjointExpr :: SState -> AExpr -> AExpr -> IO (Maybe Bool, SState) -checkDisjointExpr s e1 e2 = runStateT (checkDisjointExprM e1 e2) s - -checkDisjointExprM :: AExpr -> AExpr -> SM (Maybe Bool) -checkDisjointExprM e1 e2 = withTraceTest $ do - - when traceTest $ traceM("comparing exprs: " ++ ppString (e1, e2)) - when traceConv $ traceM(" e1 = " ++ show e1) - when traceConv $ traceM(" e2 = " ++ show e2) - - let doProof = do - ctx <- gets context - liftIO $ S.ctxPush ctx - -- - (ye1, _) <- convAExpr2SExpr_Force True e1 - --when traceTest $ traceM("conv1 done") - (ye2, _) <- convAExpr2SExpr_Force True e2 - --when traceTest $ traceM("conv2 done") - - liftIO $ S.assert ctx ye1 - liftIO $ S.assert ctx ye2 - - yf <- gets falseExpr - sat_res <- liftIO $ S.query ctx yf - liftIO $ S.ctxPop ctx - -- - addToProofMap e1 e2 sat_res - return sat_res - - memRes <- lookupProofMap e1 e2 - sat_res <- case memRes of - Just r -> return r - Nothing -> doProof - - -- if query(False) is Valid, then there is an inconsistency - -- when both "e1" and "e2" are asserted, so they are ME - return $ case (sat_res) of - S.Invalid -> Just False - S.Valid -> Just True - S.Timeout -> Nothing - S.Error -> internalError ("STP query error") - -checkDisjointRulePair :: SState -> (ARuleId, ARuleId) -> IO (Maybe Bool, SState) -checkDisjointRulePair s rp = runStateT (checkDisjointRulePairM rp) s - -checkDisjointRulePairM :: (ARuleId, ARuleId) -> SM (Maybe Bool) -checkDisjointRulePairM (r1, r2) = do - when traceTest $ traceM("comparing rules: " ++ ppString (r1,r2)) - c1 <- getRuleCond r1 - c2 <- getRuleCond r2 - checkDisjointExprM c1 c2 - -getRuleCond :: ARuleId -> SM AExpr -getRuleCond rid = do - rulemap <- gets ruleMap - case (M.lookup rid rulemap) of - Just (_, cond, _) -> return (aAnds cond) - Nothing -> internalError ("getRuleCond: cannot find rule: " ++ - ppReadable rid) - --- ------------------------- - -checkBiImplication :: SState -> AExpr -> AExpr -> IO ((Bool, Bool), SState) -checkBiImplication s e1 e2 = runStateT (checkBiImplicationM e1 e2) s - -checkBiImplicationM :: AExpr -> AExpr -> SM (Bool, Bool) -checkBiImplicationM e1 e2 = withTraceTest $ do - - when traceTest $ traceM("checking bi-implication: " ++ ppString (e1, e2)) - when traceConv $ traceM(" e1 = " ++ show e1) - when traceConv $ traceM(" e2 = " ++ show e2) - (ye1, _) <- convAExpr2SExpr_Force True e1 - when traceTest $ traceM("conv1 done") - (ye2, _) <- convAExpr2SExpr_Force True e2 - --when traceTest $ traceM("conv2 done") - e1_implies_e2 <- checkImplication ye1 ye2 - when traceTest $ traceM("e1_implies_e2") - e2_implies_e1 <- checkImplication ye2 ye1 - when traceTest $ traceM("e2_implies_e1") - return $ (e1_implies_e2, e2_implies_e1) - -checkImplication :: S.Expr -> S.Expr -> SM Bool -{- --- STP has a built in implication operator, so use it instead of this -checkImplication ye1 ye2 = do - ctx <- gets context - -- If (!a || b) is True, then a implies b - not_ye1 <- liftIO $ S.mkNot ctx ye1 - yor <- liftIO $ S.mkOr ctx not_ye1 ye2 - when traceTest $ traceM("checking if implication is true") - isTrueSExpr yor >>= return . fromMaybe False --} -checkImplication ye1 ye2 = do - ctx <- gets context - yimp <- liftIO $ S.mkImplies ctx ye1 ye2 - when traceTest $ traceM("checking if implication is true") - isTrueSExpr yimp >>= return . fromMaybe False - -isConstExpr :: SState -> AExpr -> IO (Maybe Bool, SState) -isConstExpr s e = runStateT (isConstExprM e) s - -isConstExprM :: AExpr -> SM (Maybe Bool) -isConstExprM e = withTraceTest $ do - - when traceTest $ traceM("checking is-constant: " ++ ppString e) - when traceConv $ traceM(" e = " ++ show e) - (ye, _) <- convAExpr2SExpr_Force True e - isConstSExpr ye - -isConstSExpr :: S.Expr -> SM (Maybe Bool) -isConstSExpr ye = do - is_true <- isTrueSExpr ye - case (is_true) of - Just True -> return $ Just True - otherwise -> do is_false <- isFalseSExpr ye - case (is_false) of - Just True -> return $ Just False - otherwise -> return Nothing - -isTrueSExpr :: S.Expr -> SM (Maybe Bool) -isTrueSExpr ye = do - ctx <- gets context - not_ye <- liftIO $ S.mkNot ctx ye - isFalseSExpr not_ye - -isFalseSExpr :: S.Expr -> SM (Maybe Bool) -isFalseSExpr ye = do - let doProof = do - ctx <- gets context - liftIO $ S.ctxPush ctx - liftIO $ S.assert ctx ye - -- - yf <- gets falseExpr - sat_res <- liftIO $ S.query ctx yf - liftIO $ S.ctxPop ctx - addToProofMapS ye sat_res - return sat_res - - memRes <- lookupProofMapS ye - sat_res <- case memRes of - Just r -> return r - Nothing -> doProof - - -- if query(False) is Valid, then there is an inconsistency, - -- so the expression is False - let res = case (sat_res) of - S.Invalid -> Just False - S.Valid -> Just True - S.Timeout -> Nothing - S.Error -> internalError ("STP query error") - return res - -checkEq :: SState -> AExpr -> AExpr -> IO (Maybe Bool, SState) -checkEq s e1 e2 = runStateT (checkEqM e1 e2) s - -checkNotEq :: SState -> AExpr -> AExpr -> IO (Maybe Bool, SState) -checkNotEq s e1 e2 = runStateT (checkNotEqM e1 e2) s - -checkEqM :: AExpr -> AExpr -> SM (Maybe Bool) -checkEqM e1 e2 = withTraceTest $ do - - when traceTest $ traceM("checking eq: " ++ ppString (e1,e2)) - when traceConv $ traceM(" e1 = " ++ show e1) - when traceConv $ traceM(" e2 = " ++ show e2) - -- force the exprs to be of the same type - (y_e1, ty_e1) <- convAExpr2SExpr Nothing e1 - --when traceTest $ traceM("conv1 done") - (y_e2, _) <- convAExpr2SExpr (Just ty_e1) e2 >>= convType (Just ty_e1) - --when traceTest $ traceM("conv2 done") - ctx <- gets context - - -- mkEq segfaults on Bool inputs, so use iff - let eqFn = if (ty_e1 == SBool) then S.mkIff else S.mkEq - yeq <- liftIO $ eqFn ctx y_e1 y_e2 - - isTrueSExpr yeq - - -checkNotEqM :: AExpr -> AExpr -> SM (Maybe Bool) -checkNotEqM e1 e2 = withTraceTest $ do - - when traceTest $ traceM("checking not eq: " ++ ppString (e1,e2)) - when traceConv $ traceM(" e1 = " ++ show e1) - when traceConv $ traceM(" e2 = " ++ show e2) - -- force the exprs to be of the same type - (y_e1, ty_e1) <- convAExpr2SExpr Nothing e1 - --when traceTest $ traceM("conv1 done") - (y_e2, _) <- convAExpr2SExpr (Just ty_e1) e2 >>= convType (Just ty_e1) - --when traceTest $ traceM("conv2 done") - ctx <- gets context - - -- mkEq segfaults on Bool inputs, so use iff - let eqFn = if (ty_e1 == SBool) then S.mkIff else S.mkEq - yeq <- liftIO $ eqFn ctx y_e1 y_e2 - - isFalseSExpr yeq - - --- ------------------------- - -data SState = - SState { - context :: S.Context, - --flags :: Flags, - hardFail :: Bool, - - defMap :: M.Map AId ADef, - ruleMap :: M.Map ARuleId RuleTriple, - stateMap :: M.Map AId VModInfo, - proofMap :: M.Map (AExpr, AExpr) S.Result, - proofMapS :: M.Map S.Expr S.Result, - - anyId :: Integer, - unknownId :: Integer, - - falseExpr :: S.Expr, - - defSExprMap :: M.Map AId (S.Expr, SType), - portSExprMap :: M.Map AId (S.Expr, SType), - -- for expressions which we treat as variables - expSExprMap :: M.Map AExpr (S.Expr, SType) - } - -type SM = StateT SState IO - -type RuleTriple = (ARuleId, [AExpr], Maybe ARuleId) - --- AExpr has no separate Bool type, and instead uses Bit#(1), --- while STP requires a conversion between the two. --- So we have to keep track of types, to insert conversion when necessary. -data SType = SBits Integer | SBool deriving (Show, Eq) - -instance PPrint SType where - pPrint d p t = text (show t) - - --- ------------------------- - --- Use these functions to make sure that info is added to the most recent maps. --- If you have a local copy of the map around, but then call monadic functions, --- the local copy may become stale, and you'll lose info if you write back the --- stale copy. - -addToExpMap :: AExpr -> (S.Expr, SType) -> SM () -addToExpMap e res = do - s <- get - let emap = expSExprMap s - emap' = M.insert e res emap - put (s { expSExprMap = emap' }) - -addToDefMap :: AId -> (S.Expr, SType) -> SM () -addToDefMap d res = do - s <- get - let dmap = defSExprMap s - dmap' = M.insert d res dmap - put (s { defSExprMap = dmap' }) - -addToPortMap :: AId -> (S.Expr, SType) -> SM () -addToPortMap p res = do - s <- get - let pmap = portSExprMap s - pmap' = M.insert p res pmap - put (s { portSExprMap = pmap' }) - -addToProofMap :: AExpr -> AExpr -> S.Result -> SM() -addToProofMap e1 e2 res = do - rmap <- gets proofMap - -- insert both orderings for expressions - let rmap1 = M.insert (e1,e2) res rmap - rmapX = M.insert (e2,e1) res rmap1 - modify (\s -> s {proofMap = rmapX}) - -lookupProofMap :: AExpr -> AExpr -> SM (Maybe S.Result) -lookupProofMap e1 e2 = do - rmap <- gets proofMap - return $ M.lookup (e1,e2) rmap - -addToProofMapS :: S.Expr -> S.Result -> SM() -addToProofMapS e1 res = do - rmap <- gets proofMapS - let rmapX = M.insert e1 res rmap - modify (\s -> s {proofMapS = rmapX}) - -lookupProofMapS :: S.Expr -> SM (Maybe S.Result) -lookupProofMapS e1 = do - rmap <- gets proofMapS - return $ M.lookup e1 rmap - --- ------------------------- - -getAnyName :: SM String -getAnyName = do - s <- get - let n = anyId s - -- XXX we need to check for name clash with the defs, ports, etc - let str = "__any_" ++ itos n - put (s { anyId = n + 1 }) - return str - -getUnknownName :: SM String -getUnknownName = do - s <- get - let n = unknownId s - -- XXX we need to check for name clash - let str = "__unknown_" ++ itos n - put (s { unknownId = n + 1}) - return str - -{- -assertDef :: AId -> (S.Expr, SType) -> SM (S.Expr, SType) -assertDef i (y_e, ty_e) = do - ctx <- gets context - let width = case ty_e of { SBool -> 1; SBits w -> w } - -- XXX we need to check for name clash - let str = "__def_" ++ ppString i - var@(y_var, _) <- makeDeclAndVar (Just ty_e) str width - yeq <- liftIO $ S.mkEq ctx y_var y_e - liftIO $ S.assert ctx yeq - return var --} - -makeDeclAndVar :: Maybe SType -> String -> Integer -> SM (S.Expr, SType) --- If the context expects Bool, create a Bool variable -makeDeclAndVar (Just SBool) str width = do - when (width /= 1) $ - internalError ("makeDeclAndVar: invalid width: " ++ ppReadable width) - ctx <- gets context - ty <- liftIO $ S.mkBoolType ctx - var <- liftIO $ S.mkVar ctx str ty - return (var, SBool) -makeDeclAndVar _ str width = do - ctx <- gets context - ty <- liftIO $ S.mkBitVectorType ctx (fromInteger width) - var <- liftIO $ S.mkVar ctx str ty - return (var, SBits width) - -addUnknownExpr :: Maybe SType -> AExpr -> Integer -> SM (S.Expr, SType) -addUnknownExpr mty e width = do - when traceConv $ traceM("addUnknownExpr: " ++ ppString e) - emap <- gets expSExprMap - case (M.lookup e emap) of - Just res -> do when traceConv $ traceM(" reusing.") - return res - Nothing -> do - when traceConv $ traceM(" making new var.") - str <- getUnknownName - res <- makeDeclAndVar mty str width - addToExpMap e res - return res - -convType :: Maybe SType -> (S.Expr, SType) -> SM (S.Expr, SType) -convType Nothing res = return res -convType (Just (SBool)) res@(_, SBool) = return res -convType (Just (SBits _)) res@(_, SBits _) = return res -convType (Just (SBool)) (ye, SBits width) = do - when traceConv $ traceM("converting Bits to Bool") - when (width /= 1) $ - internalError ("convType: invalid width: " ++ ppReadable width) - ctx <- gets context - -- XXX Can this be memoized? - yb <- liftIO $ S.mkBVConstantFromInteger ctx 1 1 - yeq <- liftIO $ S.mkEq ctx ye yb - return (yeq, SBool) -{- - -- this built-in conversion might be better? - yconv <- liftIO $ S.mkBVBoolExtract ctx 0 ye - return (yconv, SBool) --} -convType (Just (SBits width)) (ye, SBool) = do - when traceConv $ traceM("converting Bool to Bits") - when (width /= 1) $ - internalError ("convType: invalid width: " ++ ppReadable width) - ctx <- gets context - -- XXX Can this be memoized? - yb1 <- liftIO $ S.mkBVConstantFromInteger ctx 1 1 - yb0 <- liftIO $ S.mkBVConstantFromInteger ctx 1 0 - yif <- liftIO $ S.mkIte ctx ye yb1 yb0 - return (yif, SBits width) -{- - -- STP has a built-in conversion function - yconv <- liftIO $ S.mkBoolToBitVector ctx ye - return (yconv, SBits width) --} - -toBool :: (S.Expr, SType) -> SM (S.Expr, SType) -toBool res@(_, SBool) = return res -toBool res@(_, SBits 1) = convType (Just SBool) res -toBool res@(_, SBits n) = internalError("toBool: wrong size: " ++ ppReadable n) - -toBits :: (S.Expr, SType) -> SM (S.Expr, SType) -toBits res@(_, SBits _) = return res -toBits res = convType (Just (SBits 1)) res - --- This is needed because we pass an expected type that includes the width, --- rather than just saying whether we expect Bits or Bool (with no size) -getBitType :: AExpr -> SType -getBitType e = case (ae_type e) of - ATBit w -> SBits w - t -> internalError ("getBitType: " ++ ppReadable t) - --- ------------------------- - -convAExpr2SExpr :: Maybe SType -> AExpr -> SM (S.Expr, SType) - --- If the context expects Bool, create a Bool value -convAExpr2SExpr (Just SBool) (ASInt _ (ATBit width) (IntLit _ _ ilValue)) = do - when traceConv $ traceM("conv IntLit (Bool)" ++ itos ilValue) - when (width /= 1) $ - internalError ("convAExpr2SExpr: invalid width: " ++ ppReadable width) - ctx <- gets context - ye <- liftIO $ if (ilValue == 0) - then S.mkFalse ctx - else if (ilValue == 1) - then S.mkTrue ctx - else internalError ("convAExpr2SExpr: invalid Bool" ++ - ppReadable ilValue) - return (ye, SBool) -convAExpr2SExpr _ (ASInt _ (ATBit width) (IntLit _ _ ilValue)) = do - when traceConv $ traceM("conv IntLit " ++ itos ilValue) - ctx <- gets context - ye <- liftIO $ S.mkBVConstantFromInteger ctx width ilValue - return (ye, SBits width) - -convAExpr2SExpr mty e@(ASDef (ATBit width) aid) = do - when traceConv $ traceM("conv def " ++ ppString aid) - ymap <- gets defSExprMap - case (M.lookup aid ymap) of - Just res -> do when traceConv $ traceM(" reusing.") - return res - Nothing -> do - when traceConv $ traceM(" converting new.") - dmap <- gets defMap - case (M.lookup aid dmap) of - Just (ADef { adef_expr = e' }) -> do - when traceConv $ traceM(" e' = " ++ show e') - -- Go ahead and give it the current context - -- XXX This is just a heuristic - res_e <- convAExpr2SExpr mty e' - -{- -- XXX This appears to hurt more than it helps - -- assert it as a variable, to speed up the SMT solver - def <- assertDef aid res_e --} - let def = res_e - - -- memoize the result - addToDefMap aid def - return def - Nothing -> do - doHardFail <- gets hardFail - if (doHardFail) - then internalError ("convAExpr2SExpr: missing def: " ++ - ppReadable aid) - else addUnknownExpr mty e width - -convAExpr2SExpr mty (ASPort (ATBit width) aid) = do - when traceConv $ traceM("conv port " ++ ppReadable aid) - -- We could use "getVarDeclFromName" to see if a decl exists for this yet, - -- but we avoid the foreign call (two calls!) and keep our own map - ymap <- gets portSExprMap - case (M.lookup aid ymap) of - Just res -> do when traceConv $ traceM(" reusing.") - return res - Nothing -> do - when traceConv $ traceM(" making new var.") - let str = getIdBaseString aid - -- Go ahead and give it the current context - -- XXX This is just a heuristic - res <- makeDeclAndVar mty str width - addToPortMap aid res - return res - -convAExpr2SExpr mty (ASParam t@(ATBit _) aid) = - convAExpr2SExpr mty (ASPort t aid) - --- For ASAny, create an independent variable. --- If it has a tagged value, don't use it! That's not part of the formal --- meaning, it's an implementation optimization. -convAExpr2SExpr mty (ASAny (ATBit width) _) = do - when traceConv $ traceM("conv any") - str <- getAnyName - makeDeclAndVar mty str width - -convAExpr2SExpr mty (APrim i (ATBit width) p args) = do - when traceConv $ traceM("conv prim " ++ ppString p) - convPrim2SExpr mty p i width args - --- Method calls create independent variables, with given width --- XXX Passing the current context is just a heuristic --- XXX TODO: some methods calls may be mutex, such as FIFO.full and FIFO.empty -convAExpr2SExpr mty (AMethCall ty@(ATBit width) modId methId args) = do - -- get the actual port name, so that methods which share the same output port - -- will appear logically equivalent - smap <- gets stateMap - let portId = getMethodOutputPort smap modId methId - e = (AMethCall ty modId portId args) - -- XXX This could be an unevaluated function, applied to converted arguments - addUnknownExpr mty e width -convAExpr2SExpr mty (AMethValue ty@(ATBit width) modId methId) = do - -- get the actual port name, so that methods which share the same output port - -- will appear logically equivalent - smap <- gets stateMap - let portId = getMethodOutputPort smap modId methId - e = (AMethValue ty modId portId) - -- XXX This could be an unevaluated function, applied to converted arguments - addUnknownExpr mty e width - -convAExpr2SExpr mty e@(AMGate (ATBit 1) _ _) = - -- Gates are used as Bool, so the current context should be SBool, - -- but pass the current context just to be safe - -- XXX Passing the current context is just a heuristic - addUnknownExpr mty e 1 - --- For these unknown types, be safe and create an independent variable vector --- of the specified size. --- XXX Passing the current context is just a heuristic -convAExpr2SExpr mty e@(ASStr _ (ATString (Just width)) _ ) = - addUnknownExpr mty e width -convAExpr2SExpr mty e@(ANoInlineFunCall (ATBit width) _ _ _ ) = - -- XXX This could be an unevaluated function, applied to converted arguments - addUnknownExpr mty e width -convAExpr2SExpr mty e@(AFunCall (ATBit width) _ _ _ _ ) = - -- XXX This could be an unevaluated function, applied to converted arguments - addUnknownExpr mty e width -convAExpr2SExpr mty e@(ATaskValue (ATBit width) _ _ _ _) = - addUnknownExpr mty e width - --- For unknown abstract types, error out -convAExpr2SExpr _ e = - internalError ("unexpected expr/type in convAExpr2SExpr: " ++ show e) - - -convAExpr2SExpr_Force :: Bool -> AExpr -> SM (S.Expr, SType) -convAExpr2SExpr_Force True e = convAExpr2SExpr (Just SBool) e >>= toBool -convAExpr2SExpr_Force False e = - convAExpr2SExpr (Just (getBitType e)) e >>= toBits - -convPrim2SExpr :: Maybe SType -> - PrimOp -> AId -> Integer -> [AExpr] -> SM (S.Expr, SType) -convPrim2SExpr mty PrimIf _ _ [c, t, f] = do - -- force "c" to be Bool - (yc, _) <- convAExpr2SExpr_Force True c - res0_t@(y0_t, ty0_t) <- convAExpr2SExpr mty t - res0_f@(y0_f, ty0_f) <- convAExpr2SExpr mty f - -- if the types of the arms don't match, force them to the expected type - (yt, yf, ty) <- if (ty0_t == ty0_f) - then return (y0_t, y0_f, ty0_t) - else do (y1_t, ty1_t) <- convType mty res0_t - -- feed in ty1_t, in case mty is Nothing, - -- so that at least both arms match - (y1_f, ty1_f) <- convType (Just ty1_t) res0_f - return (y1_t, y1_f, ty1_f) - ctx <- gets context - yif <- liftIO $ S.mkIte ctx yc yt yf - return (yif, ty) - --- XXX what if the type of the case is String etc? -convPrim2SExpr mty PrimCase i w (idx : dflt : ces) = - -- in the absence of a "case" construct, just convert to if-then-else - let foldFn (v, e) res = - let c = APrim i aTBool PrimEQ [idx, v] - in APrim i (ATBit w) PrimIf [c, e, res] - in convAExpr2SExpr mty (foldr foldFn dflt (makePairs ces)) -{- - -- force "idx" to be Bits - (yidx, _) <- convAExpr2SExpr_Force False idx - let (cs, es) = split (makePairs ces) - -- force the conditions to be Bits - ycs <- mapM (convAExpr2SExpr_Force False) cs >>= mapM (return . fst) - -- convert the arms - res0_es <- mapM (convAExpr2SExpr mty) es - -- convert the default - res0_dflt@(y0_dflt, ty0_dflt) <- convAExpr2SExpr mty dflt - -- make sure that all the arms and default have the same type - (y_dflt, y_es, ty) <- - -- do all of the types of the arms match? - if (allSame (map snd) res0_es) - then do -- make sure the default has the same type - let mty_arms = - case res0_es of - ((_,ty):_) -> Just ty - _ -> mty -- no arms? use the expected type - (y_dflt, ty) <- convType mty_arms res0_dflt - return (y_dflt, map fst res0_es, ty) - else do -- force them all to the expected type - -- (if no expected type, use the first type) - let mty_arms = - if (isJust mty) - then mty - else case res0_es of - ((_,ty):_) -> Just ty - _ -> -- can't be no arms if they differ! - internalError ("convPrim2SExpr: case") - res_es <- map (convType mty_arms) res0_es - (y_dflt, ty) <- convType mty_arms res0_dflt - return (y_dflt, map fst res_es, ty) - -- put it all together --} - -convPrim2SExpr mty PrimArrayDynSelect i w args = - case args of - [APrim _ _ PrimBuildArray es, idx] -> - -- in the absence of a "case" construct, just convert to if-then-else - let foldFn (n, e) res = - let n_lit = ASInt i (ae_type idx) (ilDec n) - c = APrim i aTBool PrimEQ [idx, n_lit] - in APrim i (ATBit w) PrimIf [c, e, res] - -- number of arms is the min of the elems and the max index - idx_ty = ae_type idx - max_idx = case idx_ty of - ATBit sz -> (2^sz) - 1 - _ -> internalError ("convPrim2SExpr: idx_ty") - arms = zip [0..max_idx] es - -- default (even if it's not reachable) - dflt = ASAny (ATBit w) Nothing - in convAExpr2SExpr mty (foldr foldFn dflt arms) - [ASDef _ i_def, idx] -> do - dmap <- gets defMap - case (M.lookup i_def dmap) of - Just (ADef { adef_expr = e_def }) -> - convPrim2SExpr mty PrimArrayDynSelect i w [e_def, idx] - _ -> internalError ("convPrim2SExpr: PrimArrayDynSelect: " ++ - ppReadable args) - _ -> internalError ("convPrim2SExpr: PrimArrayDynSelect: " ++ - ppReadable args) - --- Arguments must be the same type (either Bits or Bool), result is Bool -convPrim2SExpr _ PrimEQ _ _ args = - case args of - [arg1, arg2] -> do - -- force the arms to be of the same type - (y_arg1, ty_arg1) <- convAExpr2SExpr Nothing arg1 - (y_arg2, _) <- convAExpr2SExpr (Just ty_arg1) arg2 - >>= convType (Just ty_arg1) - ctx <- gets context - - -- mkEq segfaults on Bool inputs, so use iff - let eqFn = if (ty_arg1 == SBool) then S.mkIff else S.mkEq - - yeq <- liftIO $ eqFn ctx y_arg1 y_arg2 - return (yeq, SBool) - _ -> internalError ("convPrim2SExpr: PrimEQ: wrong number of args: " ++ - ppReadable args) - --- Bool arguments, Bool result -convPrim2SExpr _ PrimBOr _ w args = doBinManyPrim_BoolBool S.mkOrMany args -convPrim2SExpr _ PrimBAnd _ w args = doBinManyPrim_BoolBool S.mkAndMany args -convPrim2SExpr _ PrimBNot _ w args = doUnPrim_BoolBool S.mkNot args - --- Bit arguments, Bool result -convPrim2SExpr _ PrimULE _ w args = doBinPrim_BitsBool S.mkBVLe args -convPrim2SExpr _ PrimULT _ w args = doBinPrim_BitsBool S.mkBVLt args -convPrim2SExpr _ PrimSLE _ w args = doBinPrim_BitsBool S.mkBVSle args -convPrim2SExpr _ PrimSLT _ w args = doBinPrim_BitsBool S.mkBVSlt args - --- Bit arguments, Bit result -convPrim2SExpr _ PrimAnd _ w args = doBinPrim_BitsBits w S.mkBVAnd args -convPrim2SExpr _ PrimOr _ w args = doBinPrim_BitsBits w S.mkBVOr args -convPrim2SExpr _ PrimXor _ w args = doBinPrim_BitsBits w S.mkBVXor args --- bitwise negation -convPrim2SExpr _ PrimInv _ w args = doUnPrim_BitsBits w S.mkBVNot args - --- Bit arguments, Bit result --- STP requires the arguments to be the same size --- (and the same size as the operator?) --- So Mul needs to have its arguments extended to the result size; --- Div and Rem need to have their arguments extended to the larger size, --- and the result truncated if the larger size is not the result size. -convPrim2SExpr _ PrimAdd _ w args = doBinPrimSz_BitsBits w S.mkBVAdd args -convPrim2SExpr _ PrimSub _ w args = doBinPrimSz_BitsBits w S.mkBVSub args -convPrim2SExpr _ PrimMul _ w args = - let args' = map (aZeroExtend w) args - in doBinPrimSz_BitsBits w S.mkBVMul args' -convPrim2SExpr _ PrimQuot _ w args = - let arg_size = maximum $ map (getWidth . ae_type) args - args' = map (aZeroExtend arg_size) args - in doBinPrimSz_BitsBits arg_size S.mkBVDiv args' >>= sTruncate w -convPrim2SExpr _ PrimRem _ w args = - let arg_size = maximum $ map (getWidth . ae_type) args - args' = map (aZeroExtend arg_size) args - in doBinPrimSz_BitsBits arg_size S.mkBVMod args' >>= sTruncate w --- arith negation -convPrim2SExpr _ PrimNeg _ w args = doUnPrim_BitsBits w S.mkBVMinus args - --- Bit argument, static Int argument, Bit result -convPrim2SExpr _ PrimSL _ w [e, n@(ASInt {})] = - doBinIntPrim_BitsBits w S.mkBVShiftLeft e (extractInt n) -convPrim2SExpr _ PrimSRL i w [e, n@(ASInt {})] = - doBinIntPrim_BitsBits w S.mkBVShiftRight e (extractInt n) - --- Dynamic Shifting must extend all arguments to same size -convPrim2SExpr mty PrimSL i w args = - let arg_size = maximum $ map (getWidth . ae_type) args - args' = map (aZeroExtend arg_size) args - in doBinPrimSz_BitsBits arg_size S.mkBVShiftLeftExpr args' >>= sTruncate w - -convPrim2SExpr mty PrimSRL i w args = - let arg_size = maximum $ map (getWidth . ae_type) args - args' = map (aZeroExtend arg_size) args - in doBinPrimSz_BitsBits arg_size S.mkBVShiftRightExpr args' >>= sTruncate w - --- For signed shift right, the left operator must be sign extended... -convPrim2SExpr mty PrimSRA i w [e1,e2] = - let arg_size = maximum $ map (getWidth . ae_type) [e1,e2] - e1' = aSignExtend arg_size e1 - e2' = aZeroExtend arg_size e2 - in doBinPrimSz_BitsBits arg_size S.mkBVSignedShiftRightExpr [e1',e2'] >>= sTruncate w - - --- Bit argument, identical static Int arguments, Bool result -convPrim2SExpr (Just SBool) PrimExtract _ _ - [e, ub@(ASInt {}), lb@(ASInt {})] | (yub == ylb) = do - (ye, _) <- convAExpr2SExpr_Force False e - ctx <- gets context - yext <- liftIO $ S.mkBVBoolExtract ctx ylb ye - return (yext, SBool) - where yub = extractInt ub - ylb = extractInt lb --- Bit argument, static Int arguments, Bit result -convPrim2SExpr _ PrimExtract _ _ [e, ub@(ASInt {}), lb@(ASInt {})] = do - let yub = extractInt ub - ylb = extractInt lb - width = toInteger (yub - ylb + 1) - ty = SBits width - (ye, _) <- convAExpr2SExpr_Force False e - ctx <- gets context - yext <- liftIO $ S.mkBVExtract ctx ylb yub ye - return (yext, ty) --- Don't handle dynamic extraction --- XXX We could implement the logic for this? -convPrim2SExpr mty PrimExtract i w args = - -- XXX This could be an unevaluated function, applied to converted arguments - addUnknownExpr mty (APrim i (ATBit w) PrimExtract args) w - --- Bit arguments, Bit result -convPrim2SExpr _ PrimConcat i w args@[_, _] = - doBinPrim_BitsBits w S.mkBVConcat args -convPrim2SExpr _ PrimConcat i width (a1:args) = - let a1width = case (ae_type a1) of - ATBit n -> n - t -> internalError ("convPrim2SExpr: PrimConcat width: " ++ - ppReadable t) - a2width = width - a1width - a2 = APrim i (ATBit a2width) PrimConcat args - in doBinPrim_BitsBits width S.mkBVConcat [a1, a2] - --- Sign extend, sizes take from argument and return type -convPrim2SExpr _ PrimSignExt i w [e] = - doBinIntPrim_BitsBits w S.mkBVSignExtend e (fromInteger w) - -convPrim2SExpr mty p i w args = - addUnknownExpr mty (APrim i (ATBit w) p args) w - --internalError ("unexpected prim: " ++ ppReadable (p, args)) - - --- ----- - -doBinManyPrim_BoolBool :: (S.Context -> [S.Expr] -> IO S.Expr) -> [AExpr] - -> SM (S.Expr, SType) -doBinManyPrim_BoolBool mkFn args = - boolArgs args >>= doBinManyPrim mkFn >>= boolRes - -doUnPrim_BoolBool :: (S.Context -> S.Expr -> IO S.Expr) -> [AExpr] - -> SM (S.Expr, SType) -doUnPrim_BoolBool mkFn args = - boolArgs args >>= doUnPrim mkFn >>= boolRes - -doBinPrim_BitsBool :: (S.Context -> S.Expr -> S.Expr -> IO S.Expr) -> [AExpr] - -> SM (S.Expr, SType) -doBinPrim_BitsBool mkFn args = - bitsArgs args >>= doBinPrim mkFn >>= boolRes - -doBinPrim_BitsBits :: Integer - -> (S.Context -> S.Expr -> S.Expr -> IO S.Expr) - -> [AExpr] - -> SM (S.Expr, SType) -doBinPrim_BitsBits w mkFn args = - bitsArgs args >>= doBinPrim mkFn >>= bitsRes w - -doBinPrimSz_BitsBits :: Integer - -> (S.Context -> Int -> S.Expr -> S.Expr -> IO S.Expr) - -> [AExpr] - -> SM (S.Expr, SType) -doBinPrimSz_BitsBits w mkFn args = - bitsArgs args >>= - doBinPrim (\ctx -> mkFn ctx (fromInteger w)) >>= - bitsRes w - -doUnPrim_BitsBits :: Integer - -> (S.Context -> S.Expr -> IO S.Expr) - -> [AExpr] - -> SM (S.Expr, SType) -doUnPrim_BitsBits w mkFn args = - bitsArgs args >>= doUnPrim mkFn >>= bitsRes w - -doBinIntPrim_BitsBits :: Integer - -> (S.Context -> S.Expr -> Int -> IO S.Expr) - -> AExpr - -> Int - -> StateT SState IO (S.Expr, SType) -doBinIntPrim_BitsBits w mkFn e n = do - (ye, _) <- convAExpr2SExpr_Force False e - yp <- doBinIntPrim mkFn ye n - bitsRes w yp - - -boolArgs :: [AExpr] -> SM [S.Expr] -boolArgs = mapM (\ a -> convAExpr2SExpr_Force True a >>= return . fst) -bitsArgs :: [AExpr] -> SM [S.Expr] -bitsArgs = mapM (\ a -> convAExpr2SExpr_Force False a >>= return . fst) - -boolRes :: Monad m => a -> m (a, SType) -boolRes ye = return (ye, SBool) -bitsRes :: Monad m => Integer -> a -> m (a, SType) -bitsRes w ye = return (ye, SBits w) - - -doUnPrim :: (S.Context -> S.Expr -> IO S.Expr) -> [S.Expr] -> SM S.Expr -doUnPrim mkFn [y_arg] = do - ctx <- gets context - liftIO $ mkFn ctx y_arg -doUnPrim _ args = - internalError ("doUnPrim: wrong number of args: " ++ - ppReadable (length args)) - -doBinPrim :: (S.Context -> S.Expr -> S.Expr -> IO S.Expr) -> - [S.Expr] -> SM S.Expr -doBinPrim mkFn [y_arg1, y_arg2] = do - ctx <- gets context - liftIO $ mkFn ctx y_arg1 y_arg2 -doBinPrim _ args = - internalError ("doBinPrim: wrong number of args: " ++ - ppReadable (length args)) - -doBinManyPrim :: (S.Context -> [S.Expr] -> IO S.Expr) -> - [S.Expr] -> SM S.Expr -doBinManyPrim _ args | (length args < 2) = - internalError ("doBinManyPrim: wrong number of args: " ++ - ppReadable (length args)) -doBinManyPrim mkFn ys_args = do - ctx <- gets context - liftIO $ mkFn ctx ys_args - --- Second argument cannot be dynamic -doBinIntPrim :: (S.Context -> S.Expr -> Int -> IO S.Expr) -> - S.Expr -> Int -> SM S.Expr -doBinIntPrim mkFn y_arg1 n_arg2 = do - ctx <- gets context - liftIO $ mkFn ctx y_arg1 n_arg2 - - --- ----- - -extractInt :: AExpr -> Int -extractInt (ASInt _ _ (IntLit _ _ val)) = fromInteger val -extractInt e = internalError ("extractInt: unexpected pattern: " ++ show e) - - --- ----- - -getWidth :: AType -> Integer -getWidth (ATBit w) = w -getWidth t = internalError ("AExpr2STP.getWidth: " ++ ppReadable t) - --- copied from similar function in AOpt -aZeroExtend :: Integer -> AExpr -> AExpr -aZeroExtend w e = - let e_size = getWidth (ae_type e) - pad_size = w - e_size - in case (compare pad_size 0) of - EQ -> e - GT -> APrim dummy_id (ATBit w) PrimConcat - [ASInt defaultAId (ATBit pad_size) (ilDec 0), e] - LT -> internalError ("AExpr2STP.aZeroExtend: " ++ ppReadable (w, e)) - -aSignExtend :: Integer -> AExpr -> AExpr -aSignExtend w e = - let e_size = getWidth (ae_type e) - pad_size = w - e_size - in case (compare pad_size 0) of - EQ -> e - GT -> APrim dummy_id (ATBit w) PrimSignExt [e] - LT -> internalError ("AExpr2STP.aSignExtend: " ++ ppReadable (w, e)) - -sTruncate :: Integer -> (S.Expr, SType) -> SM (S.Expr, SType) -sTruncate w res@(ye, SBits e_sz) | w == e_sz = return res -sTruncate w (ye, SBits e_sz) | e_sz > w = - do ctx <- gets context - ytrunc <- liftIO $ S.mkBVExtract ctx 0 (fromInteger (w-1)) ye - return (ytrunc, SBits w) -sTruncate w (ye, yt) = - internalError ("AExpr2STP.sTruncate: " ++ ppReadable (w, yt)) - - --- ------------------------- diff --git a/src/comp/DisjointTest.hs b/src/comp/DisjointTest.hs index 88d177c79..2b75e6bcb 100644 --- a/src/comp/DisjointTest.hs +++ b/src/comp/DisjointTest.hs @@ -27,9 +27,6 @@ import VModInfo(VModInfo) import AExpr2Util(getMethodOutputPort) --import Debug.Trace(trace) -import qualified AExpr2STP as STP - (SState, initSState, addADefToSState, - checkDisjointRulePair, checkDisjointExpr) import qualified AExpr2Yices as Yices (YState, initYState, addADefToYState, checkDisjointRulePair, checkDisjointExpr) @@ -40,7 +37,6 @@ type RuleDisjointTest = ARuleId -> ARuleId -> Bool -- A single data type for either of the disjoint-testing state data DisjointTestState = DTS_Yices DSupportMap Yices.YState - | DTS_STP DSupportMap STP.SState -- ------------------------- @@ -54,9 +50,6 @@ initDisjointTestState str errh flags ds avis rs = do SAT_Yices -> do yices_state <- Yices.initYState str flags True ds avis rs return (DTS_Yices supportMap yices_state) - SAT_STP -> do - stp_state <- STP.initSState str flags True ds avis rs - return (DTS_STP supportMap stp_state) addADefToDisjointTestState :: DisjointTestState -> [ADef] -> @@ -64,9 +57,6 @@ addADefToDisjointTestState :: DisjointTestState -> [ADef] -> addADefToDisjointTestState (DTS_Yices m yices_state) ds = do yices_state' <- Yices.addADefToYState yices_state ds return (DTS_Yices m yices_state') -addADefToDisjointTestState (DTS_STP m stp_state) ds = do - stp_state' <- STP.addADefToSState stp_state ds - return (DTS_STP m stp_state') -- ------------------------- @@ -75,9 +65,6 @@ checkDisjointExpr :: DisjointTestState -> AExpr -> AExpr -> checkDisjointExpr (DTS_Yices m yices_state) e1 e2 = do (res, yices_state') <- Yices.checkDisjointExpr yices_state e1 e2 return (res, DTS_Yices m yices_state') -checkDisjointExpr (DTS_STP m stp_state) e1 e2 = do - (res, stp_state') <- STP.checkDisjointExpr stp_state e1 e2 - return (res, DTS_STP m stp_state') -- When testing conditions on methods inside one rule (or two rules), -- we also want to consider the predicates of the rules; the conditions @@ -157,9 +144,6 @@ checkDisjointRulePair :: DisjointTestState -> (ARuleId, ARuleId) -> checkDisjointRulePair s@(DTS_Yices m yices_state) p = do (res, yices_state') <- Yices.checkDisjointRulePair yices_state p return (res, DTS_Yices m yices_state') -checkDisjointRulePair s@(DTS_STP m stp_state) p = do - (res, stp_state') <- STP.checkDisjointRulePair stp_state p - return (res, DTS_STP m stp_state') -- ------------------------- @@ -285,7 +269,6 @@ buildSupportMap adefs avis rs = --trace ("XXX support map:" ++ ppReadable res) $ -- ------------------------- getSupportMap :: DisjointTestState -> DSupportMap getSupportMap (DTS_Yices m _) = m -getSupportMap (DTS_STP m _) = m instance PPrint ASupport where diff --git a/src/comp/Flags.hs b/src/comp/Flags.hs index 5ba682b58..c03f23725 100644 --- a/src/comp/Flags.hs +++ b/src/comp/Flags.hs @@ -292,7 +292,6 @@ data ResourceFlag data SATFlag = SAT_Yices - | SAT_STP deriving (Eq, Show) data MsgListFlag = AllMsgs | SomeMsgs [String] diff --git a/src/comp/FlagsDecode.hs b/src/comp/FlagsDecode.hs index 61162eff5..4f284e7dd 100644 --- a/src/comp/FlagsDecode.hs +++ b/src/comp/FlagsDecode.hs @@ -1523,11 +1523,6 @@ externalFlags = [ (Arg "dir" (\f s -> Left (f {cdir = Just s})) (Just (FRTMaybeString cdir)), "output directory for Bluesim intermediate files", Visible)), - ("sat-stp", - (NoArg (\f -> Left $ f { satBackend = SAT_STP }) - (showIfEq satBackend SAT_STP), - "use STP SMT for disjoint testing and SAT", Visible)), - ("sat-yices", (NoArg (\f -> Left $ f { satBackend = SAT_Yices }) (showIfEq satBackend SAT_Yices), diff --git a/src/comp/GenABin.hs b/src/comp/GenABin.hs index de7264716..7cec97232 100644 --- a/src/comp/GenABin.hs +++ b/src/comp/GenABin.hs @@ -524,11 +524,9 @@ instance Bin Verbosity where instance Bin SATFlag where writeBytes SAT_Yices = putI 1 - writeBytes SAT_STP = putI 2 readBytes = do i <- getI case i of 1 -> return SAT_Yices - 2 -> return SAT_STP n -> internalError $ "GenABin.Bin(SATFlag).readBytes: " ++ show n instance Bin MsgListFlag where diff --git a/src/comp/Makefile b/src/comp/Makefile index ac57e3e55..3bf8159ba 100644 --- a/src/comp/Makefile +++ b/src/comp/Makefile @@ -45,11 +45,6 @@ BUILDDIR=$(TOP)/build/comp # Parsec PARSEC_HS = ../Parsec -# STP -STP_HS = ../vendor/stp/include_hs -STP_INC_FLAGS = -I../vendor/stp/include -STP_LIB_FLAGS = -L../vendor/stp/lib -lstp - # Yices YICES_HS = ../vendor/yices/include_hs YICES_INC_FLAGS = -I../vendor/yices/include @@ -164,7 +159,6 @@ GHCRTSFLAGS ?= +RTS -M4G -A128m -RTS GHCINCLUDES = \ -iGHC/posix -iLibs \ -i$(PARSEC_HS) \ - -i$(STP_HS) \ -i$(YICES_HS) \ -i$(HTCL_HS) GHCTMP = '-tmpdir $(TMPDIR)' @@ -188,7 +182,6 @@ GHCFLAGS = \ # To avoid recompiling the shared modules each time we compile a tool, # we provide the -I flags for all tools in every use of GHC. GHCFLAGS += \ - $(STP_INC_FLAGS) \ $(YICES_INC_FLAGS) \ $(HTCL_INC_FLAGS) \ $(TCL_INC_FLAGS) \ @@ -226,7 +219,6 @@ SOURCES_WO_EXTRA_BUILDVERSION = \ Libs/*.hs \ GHC/posix/*.hs \ $(PARSEC_HS)/*.hs \ - $(STP_HS)/*.hs \ $(YICES_HS)/*.hs \ $(HTCL_HS)/*.hs @@ -262,7 +254,6 @@ POSTBUILDCOMMAND = $(BUILDDONE) # (to avoid creating binaries with unnecessary library requirements) # BSC_BUILDLIBS = \ - $(STP_LIB_FLAGS) \ $(YICES_LIB_FLAGS) \ BLUETCL_BUILDLIBS = \ @@ -388,7 +379,7 @@ install-showrules: $(addprefix $(BINDIR)/core/,$(SHOWRULESEXES)) # Other targets tags: *hs */*hs bluewish.hs - $(FIND) . $(PARSEC_HS) $(STP_HS) $(YICES_HS) $(HTCL_HS) \ + $(FIND) . $(PARSEC_HS) $(YICES_HS) $(HTCL_HS) \ -type f -name \*hs | xargs hasktags mv tags tags.tmpfile sort tags.tmpfile > tags diff --git a/src/comp/Pred2STP.hs b/src/comp/Pred2STP.hs deleted file mode 100644 index e209080d1..000000000 --- a/src/comp/Pred2STP.hs +++ /dev/null @@ -1,510 +0,0 @@ -module Pred2STP( - SState, - initSState, - solvePred -) where - -import Control.Monad(when) -import Control.Monad.State(StateT, liftIO, gets, get, put, runStateT) -import qualified Data.Map as M -import qualified STP as S - -import ErrorUtil(internalError) ---import Flags -import PFPrint -import Id -import PreIds -import CType -import Type -import Pred -import Util(itos) - -import Debug.Trace(traceM) -import IOUtil(progArgs) - -traceTest :: Bool -traceTest = "-trace-smt-test" `elem` progArgs - -traceConv :: Bool -traceConv = "-trace-smt-conv" `elem` progArgs - --- ------------------------- - -data SState = - SState { - context :: S.Context, - --flags :: Flags, - - -- source of unique identifiers - unknownId :: Integer, - - -- all BSV types will be represented by one type in STP, - -- so keep a handle to the type - intType :: S.Type, - - -- a map from types to their converted form - -- (this is used both to avoid duplicate conversion - -- and as a list of possible terms for solving) - typeSExprMap :: M.Map Type (S.Expr, [S.Expr]) - } - -type SM = StateT SState IO - --- represent numeric types as 32-bit vectors --- (since that provides a division operator and log/exp via shifting) -intWidth :: (Integral t) => t -intWidth = 32 - --- ------------------------- - -initSState :: IO SState -initSState = do - ctx <- liftIO $ S.mkContext - int_ty <- liftIO $ S.mkBitVectorType ctx intWidth - return (SState { context = ctx, - --flags = flags, - unknownId = 0, - intType = int_ty, - typeSExprMap = M.empty - }) - --- ------------------------- - -{- --- XXX We'll eventually want to test that user-given provisos are satisfiable --- XXX and give a user error if not. We'll also want to test, before reporting --- XXX that additional provisos are needed, that the additional provisos are --- XXX satisfiable. - --- Check if a set of predicates is consistent - -checkPreds :: SState -> [Pred] -> IO ([EMsg], SState) -checkPreds s ps = runStateT (checkPredsM ps) s - -checkPredsM :: [Pred] -> SM [EMsg] -checkPredsM ps = do - ctx <- gets context - - -- push a new context, so we can cleanly retract the work when we're done - liftIO $ S.ctxPush ctx - - -- assert the given provisos - mapM_ assertPred ps - - -- check if there exists a solution - sat <- checkSAT - - -- pop the context - liftIO $ S.ctxPop ctx - - -- if there is no solution, report an error to the user - if (sat /= Just True) - then reportMinUnsatPreds [] ps - else return [] - - -reportMinUnsatPreds :: [Pred] -> [Pred] -> SM [EMsg] -reportMinUnsatPreds qs [] = - -- XXX "satisfy" will need to take a position and plumb it to "reducePred" - return [(noPosition, EGeneric ("unsat preds: " ++ ppReadable qs))] - -reportMinUnsatPreds qs (p:ps) = do - ctx <- gets context - - -- push a new context, so we can cleanly retract the work when we're done - liftIO $ S.ctxPush ctx - - -- assert all the provisos besides "p" - mapM_ assertPred (qs ++ ps) - - -- check if there exists a solution - sat <- checkSAT - - -- pop the context - liftIO $ S.ctxPop ctx - - -- if there is still no solution, then drop "p" else keep it - if (sat /= Just True) - then reportMinUnsatPreds qs ps - else reportMinUnsatPreds (p:qs) ps --} - --- ------------------------- - --- XXX should this take the BVS and DVS? - -solvePred :: SState -> [Pred] -> Pred -> IO (Maybe Pred, SState) -solvePred s ps p = runStateT (solvePredM ps p) s - -solvePredM :: [Pred] -> Pred -> SM (Maybe Pred) -solvePredM ps p = do - ctx <- gets context - - when traceTest $ traceM ("solvePred: " ++ ppReadable p) - - -- check that the pred is one that we handle, and if so then - -- construct p as an inequality (along with its additional assertions) - m_yneq <- genPredInequality p - case m_yneq of - Nothing -> do - -- the pred is not of the form that we can handle - when traceTest $ traceM("solvePred: not handled") - return Nothing - Just (yneq, as) -> do - - -- first make sure that the preds have at least one solution - is_sat <- do - -- push a new context, - -- so we can cleanly retract the work when we're done - liftIO $ S.ctxPush ctx - -- assert the given provisos - mapM_ assertPred (p:ps) - -- check if there exists a solution - sat <- checkSAT - -- pop the context - liftIO $ S.ctxPop ctx - return (sat == Just True) - - -- if there is no solution, return the pred unsatisfied - -- (if an error needs to be reported, it will be reported later) - if (not is_sat) - then do when traceTest $ traceM("solvePred: not satisfiable") - return Nothing - else do - - -- push a new context, - -- so we can cleanly retract the work when we're done - liftIO $ S.ctxPush ctx - -- assert the given provisos - mapM_ assertPred ps - - -- XXX for now, we only resolve provisos where no substitution is learned - - -- assert the inequality and associated assumptions - mapM_ (liftIO . S.assert ctx) (yneq:as) - -- check if there exists a solution - sat <- checkSAT - -- if it is satisfiable, then the equality does not hold - let res = case sat of - Just False -> Just p - _ -> Nothing - -- retract the assertions - liftIO $ S.ctxPop ctx - when traceTest $ - case res of - Nothing -> traceM ("solvePred: unresolved: " ++ ppReadable p) - Just _ -> traceM ("solvePred: resolved: " ++ ppReadable p) - return res - - -genPredInequality :: Pred -> SM (Maybe (S.Expr, [S.Expr])) -genPredInequality p@(IsIn c [t1, t2]) | classId c == idNumEq = do - when traceTest $ traceM("pred: " ++ ppReadable p) - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - ynp <- mkNEq yt1 yt2 - return $ Just (ynp, as1 ++ as2) -genPredInequality p@(IsIn c [t1, t2, t3]) | classId c == idAdd = do - when traceTest $ traceM("pred: " ++ ppReadable p) - (yt3, as3) <- convType2SExpr t3 - (yadd, as12) <- convType2SExpr (TAp (TAp tAdd t1) t2) - ynp <- mkNEq yadd yt3 - return $ Just (ynp, as3 ++ as12) -genPredInequality p@(IsIn c [t1, t2, t3]) | classId c == idMul = do - when traceTest $ traceM("pred: " ++ ppReadable p) - (yt3, as3) <- convType2SExpr t3 - (ymul, as12) <- convType2SExpr (TAp (TAp tMul t1) t2) - ynp <- mkNEq ymul yt3 - return $ Just (ynp, as3 ++ as12) -genPredInequality p@(IsIn c [t1, t2, t3]) | classId c == idMax = do - when traceTest $ traceM("pred: " ++ ppReadable p) - (yt3, as3) <- convType2SExpr t3 - (ymax, as12) <- convType2SExpr (TAp (TAp tMax t1) t2) - ynp <- mkNEq ymax yt3 - return $ Just (ynp, as3 ++ as12) -genPredInequality p@(IsIn c [t1, t2, t3]) | classId c == idMin = do - when traceTest $ traceM("pred: " ++ ppReadable p) - (yt3, as3) <- convType2SExpr t3 - (ymin, as12) <- convType2SExpr (TAp (TAp tMin t1) t2) - ynp <- mkNEq ymin yt3 - return $ Just (ynp, as3 ++ as12) -genPredInequality p@(IsIn c [t1, t2, t3]) | classId c == idDiv = do - when traceTest $ traceM("pred: " ++ ppReadable p) - (yt3, as3) <- convType2SExpr t3 - (ydiv, as12) <- convType2SExpr (TAp (TAp tDiv t1) t2) - ynp <- mkNEq ydiv yt3 - return $ Just (ynp, as3 ++ as12) -genPredInequality p@(IsIn c [t1, t2, t3]) | classId c == idLog = do - when traceTest $ traceM("pred: " ++ ppReadable p) - (yt3, as3) <- convType2SExpr t3 - (ylog, as12) <- convType2SExpr (TAp (TAp tLog t1) t2) - ynp <- mkNEq ylog yt3 - return $ Just (ynp, as3 ++ as12) -genPredInequality p = do - when traceTest $ traceM("pred unknown: " ++ ppReadable p) - return Nothing - --- ------------------------- - -checkSAT :: SM (Maybe Bool) -checkSAT = do - ctx <- gets context - yf <- liftIO $ S.mkFalse ctx - sat_res <- liftIO $ S.query ctx yf - -- if query(False) is Valid, then there is an inconsistency, - -- so the asserted expressions are not satisfiable - case (sat_res) of - S.Invalid -> return $ Just True - S.Valid -> return $ Just False - S.Timeout -> return Nothing - S.Error -> internalError ("STP query error") - --- ------------------------- - --- Use these functions to make sure that info is added to the most recent maps. --- If you have a local copy of the map around, but then call monadic functions, --- the local copy may become stale, and you'll lose info if you write back the --- stale copy. - -addToTypeMap :: Type -> (S.Expr, [S.Expr]) -> SM () -addToTypeMap t res = do - s <- get - let tmap = typeSExprMap s - tmap' = M.insert t res tmap - put (s {typeSExprMap = tmap' }) - --- ------------------------- - -getUnknownName :: SM String -getUnknownName = do - s <- get - let n = unknownId s - -- XXX we need to check for name clash - let str = "__unknown_" ++ itos n - put (s { unknownId = n + 1}) - return str - -mkUnknownVar :: SM S.Expr -mkUnknownVar = do - ctx <- gets context - str <- getUnknownName - ty <- gets intType - liftIO $ S.mkVar ctx str ty - -addUnknownType :: Type -> SM (S.Expr, [S.Expr]) -addUnknownType t = do - when traceConv $ traceM("addUnknownType: " ++ ppString t) - tmap <- gets typeSExprMap - case (M.lookup t tmap) of - Just res -> do when traceConv $ traceM(" reusing.") - return res - Nothing -> do - when traceConv $ traceM(" making new var.") - var <- mkUnknownVar - let res = (var, []) - addToTypeMap t res - return res - --- ------------------------- - -convType2SExpr :: Type -> SM (S.Expr, [S.Expr]) -convType2SExpr t = do - when traceConv $ traceM("converting: " ++ ppReadable t) - tmap <- gets typeSExprMap - case (M.lookup t tmap) of - Just res -> do when traceConv $ traceM(" reusing.") - return res - Nothing -> do - when traceConv $ traceM(" converting new.") - yt <- convType2SExpr' t - addToTypeMap t yt - return yt - -convType2SExpr' :: Type -> SM (S.Expr, [S.Expr]) -convType2SExpr' t@(TVar {}) = do - when traceConv $ traceM("conv TyVar: " ++ ppReadable t) - addUnknownType t -convType2SExpr' t@(TCon (TyNum n _)) = do - when traceConv $ traceM("conv TyNum: " ++ ppReadable n) - ctx <- gets context - res <- liftIO $ S.mkBVConstantFromInteger ctx intWidth n - return (res, []) -convType2SExpr' t@(TAp (TAp tc t1) t2) | (tc == tAdd) = do - when traceConv $ traceM("conv TAdd: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - res <- liftIO $ S.mkBVAdd ctx intWidth yt1 yt2 - -- assert that there is no overflow - ygte1 <- liftIO $ S.mkBVGe ctx res yt1 - return (res, [ygte1] ++ as1 ++ as2) -convType2SExpr' t@(TAp (TAp tc t1) t2) | (tc == tSub) = do - when traceConv $ traceM("conv TSub: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - res <- liftIO $ S.mkBVSub ctx intWidth yt1 yt2 - -- assert that there is no underflow - ygte1 <- liftIO $ S.mkBVGe ctx yt1 res - return (res, [ygte1] ++ as1 ++ as2) -convType2SExpr' t@(TAp (TAp tc t1) t2) | (tc == tMul) = do - when traceConv $ traceM("conv TMul: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - res <- liftIO $ S.mkBVMul ctx intWidth yt1 yt2 - -- assert that there is no overflow: (t2 == 0) || (res >= t1) - yzero <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 0 - yeqz2 <- liftIO $ S.mkEq ctx yt2 yzero - ygte1 <- liftIO $ S.mkBVGe ctx res yt1 - yor <- liftIO $ S.mkOr ctx yeqz2 ygte1 - return (res, [yor] ++ as1 ++ as2) -convType2SExpr' t@(TAp tc t1) | (tc == tExp) = do - when traceConv $ traceM("conv TExp: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - yone <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 1 - res <- liftIO $ S.mkBVShiftLeftExpr ctx intWidth yone yt1 - -- assert that there is no overflow: (t1 == 0) || (res >= t1) - yzero <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 0 - yeqz1 <- liftIO $ S.mkEq ctx yt1 yzero - ygte1 <- liftIO $ S.mkBVGe ctx res yt1 - yor <- liftIO $ S.mkOr ctx yeqz1 ygte1 - return (res, [yor] ++ as1) -convType2SExpr' t@(TAp (TAp tc t1) t2) | (tc == tMax) = do - when traceConv $ traceM("conv TMax: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - y_t1gt <- liftIO $ S.mkBVGt ctx yt1 yt2 - res <- liftIO $ S.mkIte ctx y_t1gt yt1 yt2 - return (res, as1 ++ as2) -convType2SExpr' t@(TAp (TAp tc t1) t2) | (tc == tMin) = do - when traceConv $ traceM("conv TMin: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - y_t1gt <- liftIO $ S.mkBVGt ctx yt1 yt2 - res <- liftIO $ S.mkIte ctx y_t1gt yt2 yt1 - return (res, as1 ++ as2) -convType2SExpr' t@(TAp (TAp tc t1) t2) | (tc == tDiv) = do - when traceConv $ traceM("conv TDiv: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - -- A division operator exists, but TDiv returns the ceiling, not floor. - -- So create a variable "v" ... - var <- mkUnknownVar - -- and assert that: - -- (t2 * v <= t1) - ymul <- liftIO $ S.mkBVMul ctx intWidth yt2 var - yle <- liftIO $ S.mkBVLe ctx ymul yt1 - -- and (t1 < t2 * (v + 1)) - -- XXX consider using (t2 * v) + t2 for better sharing? - yone <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 1 - yt2plus1 <- liftIO $ S.mkBVAdd ctx intWidth yt2 yone - ymul1 <- liftIO $ S.mkBVMul ctx intWidth yt2 yt2plus1 - ylt <- liftIO $ S.mkBVLt ctx yt1 ymul1 - -- assert that t2 is not zero - -- XXX is this necessary? - yzero <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 0 - yneqz2 <- mkNEq yt2 yzero - -- return the variable - return (var, [yle, ylt, yneqz2] ++ as1 ++ as2) -convType2SExpr' t@(TAp tc t1) | (tc == tLog) = do - when traceConv $ traceM("conv TLog: " ++ ppReadable t) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - -- Create a variable "v" ... - var <- mkUnknownVar - -- and assert that: - -- ((1 << v) <= t1) - yone <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 1 - texp <- liftIO $ S.mkBVShiftLeftExpr ctx intWidth yone var - yle <- liftIO $ S.mkBVLe ctx texp yt1 - -- and (t1 < (1 << (v + 1))) - -- but expressed as a multiply for better sharing: - -- (t1 < (2 * (1 << v))) - ytwo <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 2 - yexp1 <- liftIO $ S.mkBVMul ctx intWidth ytwo texp - ylt <- liftIO $ S.mkBVLt ctx yt1 yexp1 - -- assert that t1 is not zero - -- XXX is this necessary? - yzero <- liftIO $ S.mkBVConstantFromInteger ctx intWidth 0 - yneqz1 <- mkNEq yt1 yzero - -- return the variable - return (var, [yle, ylt, yneqz1] ++ as1) -convType2SExpr' t = do - when traceConv $ traceM("conv unknown: " ++ ppReadable t) - addUnknownType t - --- ------------------------- - -assertPred :: Pred -> SM () -assertPred p@(IsIn c [t1, t2]) | classId c == idNumEq = do - when traceTest $ traceM("asserting: " ++ ppReadable p) - ctx <- gets context - (yt1, as1) <- convType2SExpr t1 - (yt2, as2) <- convType2SExpr t2 - yeq <- liftIO $ S.mkEq ctx yt1 yt2 - mapM_ (liftIO . S.assert ctx) $ [yeq] ++ as1 ++ as2 -assertPred p@(IsIn c [t1, t2, t3]) | classId c == idAdd = do - when traceTest $ traceM("asserting: " ++ ppReadable p) - ctx <- gets context - (yt3, as3) <- convType2SExpr t3 - (yadd, as12) <- convType2SExpr (TAp (TAp tAdd t1) t2) - yeq <- liftIO $ S.mkEq ctx yadd yt3 - mapM_ (liftIO . S.assert ctx) $ [yeq] ++ as3 ++ as12 -assertPred p@(IsIn c [t1, t2, t3]) | classId c == idMul = do - when traceTest $ traceM("asserting: " ++ ppReadable p) - ctx <- gets context - (yt3, as3) <- convType2SExpr t3 - (ymul, as12) <- convType2SExpr (TAp (TAp tMul t1) t2) - yeq <- liftIO $ S.mkEq ctx ymul yt3 - mapM_ (liftIO . S.assert ctx) $ [yeq] ++ as3 ++ as12 -assertPred p@(IsIn c [t1, t2, t3]) | classId c == idMax = do - when traceTest $ traceM("asserting: " ++ ppReadable p) - ctx <- gets context - (yt3, as3) <- convType2SExpr t3 - (ymax, as12) <- convType2SExpr (TAp (TAp tMax t1) t2) - yeq <- liftIO $ S.mkEq ctx ymax yt3 - mapM_ (liftIO . S.assert ctx) $ [yeq] ++ as3 ++ as12 -assertPred p@(IsIn c [t1, t2, t3]) | classId c == idMin = do - when traceTest $ traceM("asserting: " ++ ppReadable p) - ctx <- gets context - (yt3, as3) <- convType2SExpr t3 - (ymin, as12) <- convType2SExpr (TAp (TAp tMin t1) t2) - yeq <- liftIO $ S.mkEq ctx ymin yt3 - mapM_ (liftIO . S.assert ctx) $ [yeq] ++ as3 ++ as12 -assertPred p@(IsIn c [t1, t2, t3]) | classId c == idDiv = do - when traceTest $ traceM("asserting: " ++ ppReadable p) - ctx <- gets context - (yt3, as3) <- convType2SExpr t3 - (ydiv, as12) <- convType2SExpr (TAp (TAp tDiv t1) t2) - yeq <- liftIO $ S.mkEq ctx ydiv yt3 - mapM_ (liftIO . S.assert ctx) $ [yeq] ++ as3 ++ as12 -assertPred p@(IsIn c [t1, t2]) | classId c == idLog = do - when traceTest $ traceM("asserting: " ++ ppReadable p) - ctx <- gets context - (yt2, as2) <- convType2SExpr t2 - (ylog, as1) <- convType2SExpr (TAp tLog t1) - yeq <- liftIO $ S.mkEq ctx ylog yt2 - mapM_ (liftIO . S.assert ctx) $ [yeq] ++ as2 ++ as1 -assertPred p = do - when traceTest $ traceM("ignoring pred: " ++ ppReadable p) - return () - --- ------------------------- - -classId :: Class -> Id -classId = typeclassId . name - --- ------------------------- - -mkNEq :: S.Expr -> S.Expr -> SM S.Expr -mkNEq y1 y2 = do - ctx <- gets context - yeq <- liftIO $ S.mkEq ctx y1 y2 - liftIO $ S.mkNot ctx yeq - --- ------------------------- diff --git a/src/comp/SAT.hs b/src/comp/SAT.hs index bb2f019e3..d7775a321 100644 --- a/src/comp/SAT.hs +++ b/src/comp/SAT.hs @@ -16,21 +16,16 @@ import Flags import ASyntax import Position(cmdPosition) -import qualified AExpr2STP as STP - (SState, initSState, checkBiImplication, isConstExpr, - checkEq, checkNotEq) import qualified AExpr2Yices as Yices (YState, initYState, checkBiImplication, isConstExpr, checkEq, checkNotEq) -import STP(checkVersion) import Yices(checkVersion) -- ------------------------- -- A single data type for either of the solver state data SATState = SATS_Yices Yices.YState - | SATS_STP STP.SState -- ------------------------- @@ -41,9 +36,6 @@ initSATState str errh flags doHardFail ds avis = SAT_Yices -> do yices_state <- Yices.initYState str flags doHardFail ds avis [] return (SATS_Yices yices_state) - SAT_STP -> do - stp_state <- STP.initSState str flags doHardFail ds avis [] - return (SATS_STP stp_state) checkSATFlags :: ErrorHandle -> Flags -> IO Flags @@ -54,9 +46,6 @@ checkSATFlags eh f = handler _ = return False in CE.catch (Yices.checkVersion >> return True) handler - hasSTP :: IO Bool - hasSTP = STP.checkVersion - checkFn :: String -> String -> IO Bool -> IO Flags checkFn flag_str lib_str hasFn = do res <- hasFn @@ -68,7 +57,6 @@ checkSATFlags eh f = WSATNotAvailable flag_str lib_str Nothing)] in case (satBackend f) of SAT_Yices -> checkFn "-sat-yices" "libyices.so.2" hasYices - SAT_STP -> checkFn "-sat-stp" "libstp.so" hasSTP -- ------------------------- @@ -76,35 +64,20 @@ checkBiImplication :: SATState -> AExpr -> AExpr -> IO ((Bool, Bool), SATState) checkBiImplication (SATS_Yices yices_state) e1 e2 = do (res, yices_state') <- Yices.checkBiImplication yices_state e1 e2 return (res, SATS_Yices yices_state') -checkBiImplication (SATS_STP stp_state) e1 e2 = do - (res, stp_state') <- STP.checkBiImplication stp_state e1 e2 - return (res, SATS_STP stp_state') - isConstExpr :: SATState -> AExpr -> IO (Maybe Bool, SATState) isConstExpr (SATS_Yices yices_state) e = do (res, yices_state') <- Yices.isConstExpr yices_state e return (res, SATS_Yices yices_state') -isConstExpr (SATS_STP stp_state) e = do - (res, stp_state') <- STP.isConstExpr stp_state e - return (res, SATS_STP stp_state') - checkEq :: SATState -> AExpr -> AExpr -> IO (Maybe Bool, SATState) checkEq (SATS_Yices yices_state) e1 e2 = do (res, yices_state') <- Yices.checkEq yices_state e1 e2 return (res, SATS_Yices yices_state') -checkEq (SATS_STP stp_state) e1 e2 = do - (res, stp_state') <- STP.checkEq stp_state e1 e2 - return (res, SATS_STP stp_state') - checkNotEq :: SATState -> AExpr -> AExpr -> IO (Maybe Bool, SATState) checkNotEq (SATS_Yices yices_state) e1 e2 = do (res, yices_state') <- Yices.checkNotEq yices_state e1 e2 return (res, SATS_Yices yices_state') -checkNotEq (SATS_STP stp_state) e1 e2 = do - (res, stp_state') <- STP.checkNotEq stp_state e1 e2 - return (res, SATS_STP stp_state') -- ------------------------- diff --git a/src/comp/SATPred.hs b/src/comp/SATPred.hs index 62e83dad6..d9fd6bf37 100644 --- a/src/comp/SATPred.hs +++ b/src/comp/SATPred.hs @@ -7,52 +7,29 @@ module SATPred( import Flags import Pred -import qualified Pred2STP as STP - (SState, initSState, solvePred) import qualified Pred2Yices as Yices (YState, initYState, solvePred) -- ------------------------- -- A single data type for any of the solver state --- For now, we always use STP for this data SATPredState = - SATPredS_STP STP.SState - | SATPredS_Yices Yices.YState + SATPredS_Yices Yices.YState -- ------------------------- initSATPredState :: Flags -> IO SATPredState initSATPredState flags = do case (satBackend flags) of - SAT_STP -> do - stp_state <- STP.initSState - return (SATPredS_STP stp_state) SAT_Yices -> do yices_state <- Yices.initYState return (SATPredS_Yices yices_state) -- ------------------------- -{- -checkPreds :: SATPredState -> [Pred] -> IO ([EMsg], SATPredState) -checkPreds (SATPredS_STP stp_state) ps = do - (res, stp_state') <- STP.checkPreds stp_state ps - return (res, SATPredS_STP stp_state') -checkPreds (SATPredS_Yices yices_state) ps = do - (res, yices_state') <- Yices.checkPreds yices_state ps - return (res, SATPredS_Yices yices_state') --} - --- ------------------------- - solvePred :: SATPredState -> [Pred] -> Pred -> IO (Maybe Pred, SATPredState) -solvePred (SATPredS_STP stp_state) ps p = do - (res, stp_state') <- STP.solvePred stp_state ps p - return (res, SATPredS_STP stp_state') solvePred (SATPredS_Yices yices_state) ps p = do (res, yices_state') <- Yices.solvePred yices_state ps p return (res, SATPredS_Yices yices_state') -- ------------------------- - diff --git a/src/vendor/stp/.gitignore b/src/vendor/stp/.gitignore deleted file mode 100644 index d3ab1ac0f..000000000 --- a/src/vendor/stp/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -include -lib -include_hs - -*.o -*.a -*.or - -# Ignore generated libraries -libstp.so -libstp.so.* - -# Makefile depenencies -depend.mk -depend - -# Yex/yacc parser code -src/parser/lexcvc.* -src/parser/lexsmt.* -src/parser/lexsmt2.* -src/parser/parsecvc.* -src/parser/parsesmt.* -src/parser/parsesmt2.* - -# -src/AST/ASTKind.cpp -src/AST/ASTKind.h - diff --git a/src/vendor/stp/HaskellIfc/STP.hs b/src/vendor/stp/HaskellIfc/STP.hs deleted file mode 100644 index 59fa198e1..000000000 --- a/src/vendor/stp/HaskellIfc/STP.hs +++ /dev/null @@ -1,738 +0,0 @@ -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE TypeSynonymInstances #-} -{-# LANGUAGE CPP #-} - -module STP ( - - -- * Core STP types - Context, - Type, - Expr, - Result(..), - - -- Check that the dynamic library is compatible - -- with this FFI (and not a stub) - checkVersion, - - -- * Manipulating contexts - mkContext, - ctxPush, - ctxPop, - deleteExpr, deleteExprs, - - -- * Debug - setPrintVarDecls, - setPrintAsserts, - setPrintQuery, - setClearDecls, - printExpr, - setFlag, - - -- * Making assertions - assert, - - -- * Queries - query, - queryWithTimeout, - isBool, - - -- * STP Types - mkBoolType, - mkBitVectorType, - - -- * STP Expressions - - -- ** Type conversion - mkBoolToBitVector, - - -- ** Variables - mkVar, - - -- ** Constants - mkTrue, mkFalse, - mkBVConstantFromInteger, - - -- ** Logical operators - mkEq, - mkNot, - mkAnd, mkAndMany, - mkOr, mkOrMany, - mkXor, - mkImplies, - mkIff, - mkIte, - - -- ** Bit-vector arithmetic - mkBVAdd, mkBVAddMany, - mkBVSub, mkBVMul, mkBVDiv, mkBVMod, - mkBVSignedDiv, mkBVSignedMod, - mkBVMinus, - - -- ** Bit-vector comparisons - mkBVLt, mkBVLe, - mkBVGt, mkBVGe, - - mkBVSlt, mkBVSle, - mkBVSgt, mkBVSge, - - -- ** Bitwise operations - mkBVAnd, mkBVOr, mkBVXor, - mkBVNot, - - -- ** Bit-vector shifting and signs - mkBVSignExtend, - mkBVShiftLeft, mkBVShiftRight, - mkBVShiftLeftExpr, mkBVShiftRightExpr, mkBVSignedShiftRightExpr, - - - -- ** Bit-vector strings - mkBVConcat, - mkBVExtract, mkBVBoolExtract - - ) where - -import STPFFI - -import Foreign -import Foreign.C.String -import Foreign.C.Types -import qualified Foreign.Concurrent as F - ---import Control.Concurrent.MVar.Strict -import MVarStrict - -import ErrorUtil(internalError) -import System.Posix.Env(getEnvDefault) ---import Util(traceM) - - -cullong_size :: Int -cullong_size = finiteBitSize (0 :: CULLong) - ------------------------------------------------------------------------- --- Types - --- | An STP /context/ --- --- A context is an environment of assertions. --- --- /Notes:/ --- --- * The resource is automatically managed by the Haskell garbage --- collector, and the structure is automatically deleted once it is out --- of scope (no need to call 'vc_Destroy'.) --- --- * Improving on the C API, we maintain a stack depth, to prevent errors --- relating to uneven numbers of 'push' and 'pop' operations. 'pop' on a --- zero depth stack leaves the stack at zero. --- -data Context = Context { sContext :: ForeignPtr SContext - , sDepth :: !(MVar Integer) - } - deriving Eq - --- | STP types --- -newtype Type = Type { unType :: Ptr SType } - deriving (Eq, Ord, Show, Storable) - --- | STP /expressions/ --- -newtype Expr = Expr { unExpr :: Ptr SExpr } - deriving (Eq, Ord, Show, Storable) - --- The return type for queries -data Result - = Invalid - | Valid - | Error - | Timeout - deriving (Eq, Ord, Enum, Bounded, Read, Show) - -toResult :: CInt -> Result -toResult n - | n == 0 = Invalid - | n == 1 = Valid - | n == 2 = Error - | n == 3 = Timeout - | otherwise = internalError("STP.toResult: " ++ show n) - --- Name of environment variable contain flags -flagEnvironment :: String -flagEnvironment = "BSC_STP_FLAGS" - ------------------------------------------------------------------------- - -checkVersion :: IO Bool -checkVersion = do - -- The API doesn't provide version info - -- so all we can do is check for a stub - ptr <- vc_createValidityChecker - return (ptr /= nullPtr) - ------------------------------------------------------------------------- --- Context manipulation - --- | Create a new logical context. --- When the context goes out of scope, it will be automatically deleted. --- -mkContext :: IO Context -mkContext = do - ptr <- vc_createValidityChecker - --traceM("==> vc created: " ++ show ptr) - make_division_total ptr - fp <- F.newForeignPtr ptr (do --traceM("==> vc destryoy: " ++ show ptr) - --vc_Destroy ptr - --traceM("==> destroyed") - return () - ) - n <- newMVar 0 - envFlags <- getEnvDefault flagEnvironment "" - mapM_ (setFlag ptr) envFlags - return $! Context fp n - --- | Create a backtracking point in the given logical context. --- --- The logical context can be viewed as a stack of contexts. The scope --- level is the number of elements on this stack. The stack of contexts --- is simulated using trail (undo) stacks. --- -ctxPush :: Context -> IO () -ctxPush c = modifyMVar_ (sDepth c) $ \n -> - if n < 0 - then error "STP.ctxPush: Corrupted Context. Stack depth < 0" - else do - withForeignPtr (sContext c) $ vc_push - return (n+1) - --- | Backtrack. --- --- Restores the context from the top of the stack, and pops it off the --- stack. Any changes to the logical context (by 'vc_assertFormula' or --- other functions) between the matching 'push' and 'pop' operators are --- flushed, and the context is completely restored to what it was right --- before the 'push'. --- -ctxPop :: Context -> IO () -ctxPop c = modifyMVar_ (sDepth c) $ \n -> case () of - _ | n < 0 -> error "STP.mkPop: Corrupted context. Stack depth < 0" - | n == 0 -> return n - | otherwise -> do - withForeignPtr (sContext c) $ vc_pop - return (n-1) - ------------------------------------------------------------------------- --- Debug - -setPrintVarDecls :: Context -> IO () -setPrintVarDecls c = withForeignPtr (sContext c) vc_printVarDecls - -setPrintAsserts :: Context -> IO () -setPrintAsserts c = withForeignPtr (sContext c) vc_printAsserts - -setPrintQuery :: Context -> IO () -setPrintQuery c = withForeignPtr (sContext c) vc_printQuery - -setClearDecls :: Context -> IO () -setClearDecls c = withForeignPtr (sContext c) vc_clearDecls - -printExpr :: Context -> Expr -> IO () -printExpr c e = do - withForeignPtr (sContext c) $ \cptr -> vc_printExpr cptr (unExpr e) - putChar '\n' - ------------------------------------------------------------------------- --- Assertions - --- | Assert a constraint in the logical context. --- -assert :: Context -> Expr -> IO () -assert c e = withForeignPtr (sContext c) $ \cptr -> - vc_assertFormula cptr (unExpr e) - ------------------------------------------------------------------------- --- Queries - --- | Check if an expression is satisfiable given the logical context. --- --- * @Invalid@ means the expression is unsatisfiable in the context. --- --- * @Valid@ means the expression is satisfiable in the context. --- --- * @Error@ means that an error was encountered. --- --- * @Timeout@ means it was not possible to decide in the given time. --- -query :: Context -> Expr -> IO Result -query c e = toResult <$> - withForeignPtr (sContext c) (\cptr -> vc_query cptr (unExpr e)) - -queryWithTimeout :: Context -> Expr -> Int -> IO Result -queryWithTimeout c e msecs = toResult <$> - withForeignPtr (sContext c) - (\cptr -> vc_query_with_timeout cptr (unExpr e) (fromIntegral msecs)) - --- | Determine whether an expression is True or False ? --- --- Note that this takes no Context! What is this function?! --- -isBool :: Expr -> IO (Maybe Bool) -isBool e = do - res <- vc_isBool (unExpr e) - case res of - 1 -> return $ Just True - 0 -> return $ Just False - -1 -> return $ Nothing - _ -> internalError ("STP.isBool: " ++ show res) - ------------------------------------------------------------------------- --- Types - --- | Return the for booleans. --- -mkBoolType :: Context -> IO Type -mkBoolType c = - withForeignPtr (sContext c) $ \cptr -> - Type <$> vc_boolType cptr - --- | Returns a bitvector type of @n@ size. --- --- Size must be greater than @0@. --- -mkBitVectorType :: Context -> Int -> IO Type -mkBitVectorType _ n | (n < 1) = - internalError ("STP.mkBitVectorType: " ++ show n) -mkBitVectorType c n = - withForeignPtr (sContext c) $ \cptr -> - Type <$> vc_bvType cptr (fromIntegral n) - ------------------------------------------------------------------------- --- Type conversion - -mkBoolToBitVector :: Context -> Expr -> IO Expr -mkBoolToBitVector c e = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_boolToBVExpr cptr (unExpr e) - ------------------------------------------------------------------------- --- Variables - -mkVar :: Context -> String -> Type -> IO Expr -mkVar c str t = - withCString str $ \cstr -> - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_varExpr cptr cstr (unType t) - ------------------------------------------------------------------------- --- Constants - --- | Return an expression representing 'True'. --- -mkTrue :: Context -> IO Expr -mkTrue c = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_trueExpr cptr - --- | Return an expression representing 'False'. --- -mkFalse :: Context -> IO Expr -mkFalse c = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_falseExpr cptr - --- | Create a bit vector constant of size bits and of the given value. --- --- @size@ must be positive --- -mkBVConstantFromInteger :: Context -> Integer -> Integer -> IO Expr -mkBVConstantFromInteger _ width _ | (width < 1) = - internalError ("STP.mkBVConstantFromInteger: " ++ show width) -mkBVConstantFromInteger c width val | fitsInCULLong = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvConstExprFromLL cptr (fromInteger width) (fromInteger val) - where fitsInCULLong = (fromInteger width) <= cullong_size -mkBVConstantFromInteger c width val = - -- XXX is it more efficient to create a concat of Word64 values? - withForeignPtr (sContext c) $ \cptr -> - makeVPtrWith width val $ \vptr -> - Expr <$> vc_bvConstExprFromStr cptr (castPtr vptr) - -makeVPtrWith :: Integer -> Integer -> (CString -> IO b) -> IO b -makeVPtrWith width val f = - let -- We could use "showIntAtBase", but then we should check to - -- make sure the width is correct. - -- This should rarely be needed, so don't worry about efficiency. - mkBit idx = if (testBit val idx) then '1' else '0' - str = map mkBit $ reverse [0 .. fromInteger (width-1)] - in withCString str f - ------------------------------------------------------------------------- --- Logical operations - --- | Return an expression representing: --- --- > a1 == a2 --- -mkEq :: Context -> Expr -> Expr -> IO Expr -mkEq c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_eqExpr cptr (unExpr e1) (unExpr e2) - --- | Return an expression representing: --- --- > not a --- -mkNot :: Context -> Expr -> IO Expr -mkNot c e = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_notExpr cptr (unExpr e) - --- | Return an expression representing the binary /AND/ of the given arguments. --- -mkAnd :: Context -> Expr -> Expr -> IO Expr -mkAnd c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_andExpr cptr (unExpr e1) (unExpr e2) - --- | Return an expression representing the /n/-ary /AND/ of the given arguments. --- --- > and [a1, ..] --- --- Reference: --- -mkAndMany :: Context -> [Expr] -> IO Expr -mkAndMany _ [] = error "STP.mkAndMany: empty list of expressions" -mkAndMany c es = - withArray es $ \aptr -> - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_andExprN cptr (castPtr aptr) (fromIntegral (length es)) - --- | Return an expression representing the binary /OR/ of the given arguments. --- -mkOr :: Context -> Expr -> Expr -> IO Expr -mkOr c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_orExpr cptr (unExpr e1) (unExpr e2) - --- | Return an expression representing the /n/-ary /OR/ of the given arguments. --- --- > or [a1, ..] --- -mkOrMany :: Context -> [Expr] -> IO Expr -mkOrMany _ [] = error "STP.mkOrMany: empty list of expressions" -mkOrMany c es = - withArray es $ \aptr -> - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_orExprN cptr (castPtr aptr) (fromIntegral (length es)) - --- | Return an expression representing the binary /XOR/ of the given arguments. --- -mkXor :: Context -> Expr -> Expr -> IO Expr -mkXor c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_xorExpr cptr (unExpr e1) (unExpr e2) - --- | Return an expression representing: --- --- > e1 implies e2 --- -mkImplies :: Context -> Expr -> Expr -> IO Expr -mkImplies c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_impliesExpr cptr (unExpr e1) (unExpr e2) - --- | Return an expression representing: --- --- > e1 if-and-only-if e2 --- -mkIff :: Context -> Expr -> Expr -> IO Expr -mkIff c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_iffExpr cptr (unExpr e1) (unExpr e2) - --- | Return an expression representing: --- --- > if b then e1 else e2 --- -mkIte :: Context -> Expr -> Expr -> Expr -> IO Expr -mkIte c b e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_iteExpr cptr (unExpr b) (unExpr e1) (unExpr e2) - ------------------------------------------------------------------------- --- Bit-vector arithmetic - --- | Bitvector addition. --- --- @a1@ and @a2@ must be bitvector expressions of same size. --- -mkBVAdd :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVAdd c n e1 e2 = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvPlusExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - --- | Bitvector addition of a list of expressions --- --- The expression list must be non-empty. --- -mkBVAddMany :: Context -> Int -> [Expr] -> IO Expr -mkBVAddMany c n es = - withArray es $ \esptr -> - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvPlusExprN cptr (fromIntegral n) - (castPtr esptr) (fromIntegral (length es)) - --- | Bitvector subtraction. --- --- @a1@ and @a2@ must be bitvector expressions of same size. --- -mkBVSub :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVSub c n e1 e2 = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvMinusExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - --- | Bitvector multiplication. --- --- @a1@ and @a2@ must be bitvector expressions of same size. --- (The result is truncated to that size?) --- -mkBVMul :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVMul c n e1 e2 = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvMultExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - --- | Bitvector division --- --- @a1@ and @a2@ must be bitvector expressions of same size. --- -mkBVDiv :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVDiv c n e1 e2 = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvDivExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - --- | Bitvector mod --- --- @a1@ and @a2@ must be bitvector expressions of same size. --- -mkBVMod :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVMod c n e1 e2 = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvModExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - --- | Bitvector division (signed) --- --- @a1@ and @a2@ must be bitvector expressions of same size. --- -mkBVSignedDiv :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVSignedDiv c n e1 e2 = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_sbvDivExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - --- | Bitvector mod (signed) --- --- @a1@ and @a2@ must be bitvector expressions of same size. --- -mkBVSignedMod :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVSignedMod c n e1 e2 = - withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_sbvModExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - --- | Bitvector uniary minus. --- --- @a1@ must be bitvector expression. The result is @(- a1)@. --- -mkBVMinus :: Context -> Expr -> IO Expr -mkBVMinus c e = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvUMinusExpr cptr (unExpr e) - ------------------------------------------------------------------------- --- Bit-vector comparisons - --- | Unsigned bitvector comparison: --- --- > a1 < a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVLt :: Context -> Expr -> Expr -> IO Expr -mkBVLt c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvLtExpr cptr (unExpr e1) (unExpr e2) - --- | Unsigned bitvector comparison: --- --- > a1 <= a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVLe :: Context -> Expr -> Expr -> IO Expr -mkBVLe c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvLeExpr cptr (unExpr e1) (unExpr e2) - --- | Unsigned bitvector comparison: --- --- > a1 > a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVGt :: Context -> Expr -> Expr -> IO Expr -mkBVGt c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvGtExpr cptr (unExpr e1) (unExpr e2) - --- | Unsigned bitvector comparison: --- --- > a1 >= a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVGe :: Context -> Expr -> Expr -> IO Expr -mkBVGe c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvGeExpr cptr (unExpr e1) (unExpr e2) - --- | Signed bitvector comparison: --- --- > a1 < a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVSlt :: Context -> Expr -> Expr -> IO Expr -mkBVSlt c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_sbvLtExpr cptr (unExpr e1) (unExpr e2) - --- | Signed bitvector comparison: --- --- > a1 <= a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVSle :: Context -> Expr -> Expr -> IO Expr -mkBVSle c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_sbvLeExpr cptr (unExpr e1) (unExpr e2) - --- | Signed bitvector comparison: --- --- > a1 > a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVSgt :: Context -> Expr -> Expr -> IO Expr -mkBVSgt c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_sbvGtExpr cptr (unExpr e1) (unExpr e2) - --- | Signed bitvector comparison: --- --- > a1 >= a2 --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVSge :: Context -> Expr -> Expr -> IO Expr -mkBVSge c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_sbvGeExpr cptr (unExpr e1) (unExpr e2) - ------------------------------------------------------------------------- --- Bit-wise operations - --- | Bitwise @and@. --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVAnd :: Context -> Expr -> Expr -> IO Expr -mkBVAnd c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvAndExpr cptr (unExpr e1) (unExpr e2) - --- | Bitwise @or@. --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVOr :: Context -> Expr -> Expr -> IO Expr -mkBVOr c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvOrExpr cptr (unExpr e1) (unExpr e2) - --- | Bitwise @xor@. --- --- /a1/ and /a2/ must be bitvector expressions of same size. --- -mkBVXor :: Context -> Expr -> Expr -> IO Expr -mkBVXor c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvXorExpr cptr (unExpr e1) (unExpr e2) - --- | Bitwise negation. --- -mkBVNot :: Context -> Expr -> IO Expr -mkBVNot c e = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvNotExpr cptr (unExpr e) - ------------------------------------------------------------------------- --- Bit-vector shifting and signs - --- | Sign extension. --- --- Append /n/ times the most-significant bit of to the left of /a/. --- -mkBVSignExtend :: Context -> Expr -> Int -> IO Expr -mkBVSignExtend c e n = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvSignExtend cptr (unExpr e) (fromIntegral n) - --- | Left shift by n bits, padding with zeros. --- -mkBVShiftLeft :: Context -> Expr -> Int -> IO Expr -mkBVShiftLeft c e n = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvLeftShiftExpr cptr (fromIntegral n) (unExpr e) - - --- | Right shift by n bits, padding with zeros. --- -mkBVShiftRight :: Context -> Expr -> Int -> IO Expr -mkBVShiftRight c e n = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvRightShiftExpr cptr (fromIntegral n) (unExpr e) - --- | Dynamic shift operations -mkBVShiftLeftExpr :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVShiftLeftExpr c n e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvLeftShiftExprExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - -mkBVShiftRightExpr :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVShiftRightExpr c n e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvRightShiftExprExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - -mkBVSignedShiftRightExpr :: Context -> Int -> Expr -> Expr -> IO Expr -mkBVSignedShiftRightExpr c n e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvSignedRightShiftExprExpr cptr (fromIntegral n) (unExpr e1) (unExpr e2) - ------------------------------------------------------------------------- --- Bit vector strings - --- | Bitvector concatenation. --- --- @a1@ and @a2@ must be two bitvector expressions. --- @a1@ is the left part of the result and @a2@ the right part. --- --- Assuming /a1/ and /a2/ have /n1/ and /n2/ bits, respectively, then the --- result is a bitvector concat of size /n1 + n2/. Bit 0 of concat is bit 0 of --- /a2/ and bit n2 of concat is bit 0 of /a1/. --- -mkBVConcat :: Context -> Expr -> Expr -> IO Expr -mkBVConcat c e1 e2 = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvConcatExpr cptr (unExpr e1) (unExpr e2) - --- | Bitvector extraction. --- --- The first @Int@ argument is the initial index, the second is the end index. --- /Note/: this is reversed wrt. the C API. --- --- /a/ must a bitvector expression of size /n/ with @begin < end < n@. --- The result is the subvector slice @a[begin .. end]@. --- -mkBVExtract :: Context -> Int -> Int -> Expr -> IO Expr -mkBVExtract c begin end e = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvExtract cptr (unExpr e) - (fromIntegral end) (fromIntegral begin) - --- | Bitvector extraction to Boolean result --- --- > x[bit_no:bit_no] == 1 --- -mkBVBoolExtract :: Context -> Int -> Expr -> IO Expr -mkBVBoolExtract c idx e = withForeignPtr (sContext c) $ \cptr -> - Expr <$> vc_bvBoolExtract_One cptr (unExpr e) (fromIntegral idx) - ------------------------------------------------------------------------- - -deleteExpr :: Expr -> IO () -deleteExpr = vc_DeleteExpr . unExpr - -deleteExprs :: [Expr] -> IO () -deleteExprs = mapM_ deleteExpr - - -setFlag :: Ptr SContext -> Char -> IO () -setFlag c f = vc_setFlag c (castCharToCChar f) diff --git a/src/vendor/stp/HaskellIfc/STPFFI.hs b/src/vendor/stp/HaskellIfc/STPFFI.hs deleted file mode 100644 index c5908acbb..000000000 --- a/src/vendor/stp/HaskellIfc/STPFFI.hs +++ /dev/null @@ -1,378 +0,0 @@ -{-# LANGUAGE ForeignFunctionInterface #-} -{-# LANGUAGE EmptyDataDecls #-} --- LANGUAGE GeneralizedNewtypeDeriving - -module STPFFI ( - - -- * C types - SContext, - SType, - SExpr, - - -- * Context manipulation - vc_createValidityChecker, - vc_Destroy, - vc_DeleteExpr, - vc_DeleteExprFun, - - vc_push, - vc_pop, - - -- * Debug - vc_printVarDecls, - vc_printAsserts, - vc_printQuery, - vc_clearDecls, - vc_printExpr, - --vc_exprString, - --vc_typeString, - vc_setFlag, - - -- * Assertions - vc_assertFormula, - - -- * Solving - vc_query, - vc_query_with_timeout, - vc_isBool, - - -- * Types - vc_boolType, - vc_bvType, - - -- * Expressions - - -- ** Type conversion - vc_boolToBVExpr, - - -- ** Variables - vc_varExpr, - - -- ** Constants - vc_trueExpr, - vc_falseExpr, - vc_bvConstExprFromDecStr, - vc_bvConstExprFromStr, - --vc_bvConstExprFromInt, - vc_bvConstExprFromLL, - - -- ** Logical operators - vc_eqExpr, - vc_notExpr, - vc_andExpr, - vc_andExprN, - vc_orExpr, - vc_orExprN, - vc_xorExpr, - vc_impliesExpr, - vc_iffExpr, - vc_iteExpr, - - -- ** Bit vector arithmetic - vc_bvPlusExpr, - vc_bvPlusExprN, - vc_bvMinusExpr, - vc_bvMultExpr, - vc_bvDivExpr, - vc_bvModExpr, - vc_sbvDivExpr, - vc_sbvModExpr, - - vc_bvUMinusExpr, - - -- ** Comparisons - vc_bvLtExpr, - vc_bvLeExpr, - vc_bvGtExpr, - vc_bvGeExpr, - - vc_sbvLtExpr, - vc_sbvLeExpr, - vc_sbvGtExpr, - vc_sbvGeExpr, - - -- ** Bitwise operations - vc_bvAndExpr, - vc_bvOrExpr, - vc_bvXorExpr, - vc_bvNotExpr, - - -- ** Shifting and signs - vc_bvSignExtend, - vc_bvLeftShiftExpr, - vc_bvRightShiftExpr, - - vc_bvLeftShiftExprExpr, - vc_bvRightShiftExprExpr, - vc_bvSignedRightShiftExprExpr, - - -- ** Bit vector /string/ operations - vc_bvConcatExpr, - vc_bvExtract, - vc_bvBoolExtract_Zero, - vc_bvBoolExtract_One, - - make_division_total, - - ) where - -import Foreign -import Foreign.C.Types -import Foreign.C.String - ------------------------------------------------------------------------- --- Types - --- | Abstract type representing an STP context. --- -data SContext - --- | Abstract type representing an STP expression. --- -data SExpr - --- | Abstract type representing an STP type. --- -data SType - ------------------------------------------------------------------------- --- Function bindings - --- Contexts - -foreign import ccall unsafe "stp_c_interface.h" - vc_createValidityChecker :: IO (Ptr SContext) - -foreign import ccall unsafe "stp_c_interface.h" - vc_Destroy :: Ptr SContext -> IO () - -foreign import ccall unsafe "stp_c_interface.h" - vc_DeleteExpr :: Ptr SExpr -> IO () - --- Function pointer -foreign import ccall unsafe "stp_c_interface.h &vc_DeleteExpr" - vc_DeleteExprFun :: FunPtr (Ptr SExpr -> IO ()) - -foreign import ccall unsafe "stp_c_interface.h" - vc_push :: Ptr SContext -> IO () - -foreign import ccall unsafe "stp_c_interface.h" - vc_pop :: Ptr SContext -> IO () - --- Debug - -foreign import ccall unsafe "stp_c_interface.h" - vc_printVarDecls :: Ptr SContext -> IO () - -foreign import ccall unsafe "stp_c_interface.h" - vc_printAsserts :: Ptr SContext -> IO () - -foreign import ccall unsafe "stp_c_interface.h" - vc_printQuery :: Ptr SContext -> IO () - -foreign import ccall unsafe "stp_c_interface.h" - vc_clearDecls :: Ptr SContext -> IO () - -foreign import ccall unsafe "stp_c_interface.h" - vc_printExpr :: Ptr SContext -> Ptr SExpr -> IO () - --- Assertions - -foreign import ccall unsafe "stp_c_interface.h" - vc_assertFormula :: Ptr SContext -> Ptr SExpr -> IO () - --- Solving - -foreign import ccall unsafe "stp_c_interface.h" - vc_query :: Ptr SContext -> Ptr SExpr -> IO CInt - -foreign import ccall unsafe "stp_c_interface.h" - vc_query_with_timeout :: Ptr SContext -> Ptr SExpr -> CInt -> IO CInt - -foreign import ccall unsafe "stp_c_interface.h" - vc_isBool :: Ptr SExpr -> IO CInt - --- Types - -foreign import ccall unsafe "stp_c_interface.h" - vc_boolType :: Ptr SContext -> IO (Ptr SType) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvType :: Ptr SContext -> CInt -> IO (Ptr SType) - --- Type conversion - -foreign import ccall unsafe "stp_c_interface.h" - vc_boolToBVExpr :: Ptr SContext -> Ptr SExpr -> IO (Ptr SExpr) - --- Variables - -foreign import ccall unsafe "stp_c_interface.h" - vc_varExpr :: Ptr SContext -> CString -> Ptr SType -> IO (Ptr SExpr) - --- Constants - -foreign import ccall unsafe "stp_c_interface.h" - vc_trueExpr :: Ptr SContext -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_falseExpr :: Ptr SContext -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvConstExprFromDecStr :: Ptr SContext -> CString -> Ptr SType -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvConstExprFromStr :: Ptr SContext -> CString -> IO (Ptr SExpr) - -{- --- This merely casts the value to CULLong, so might as well always call --- vc_bvConstExprFromLL instead. -foreign import ccall unsafe "stp_c_interface.h" - vc_bvConstExprFromInt :: Ptr SContext -> CInt -> CUInt -> IO (Ptr SExpr) --} - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvConstExprFromLL :: Ptr SContext -> CInt -> CULLong -> IO (Ptr SExpr) - --- Logical operations - -foreign import ccall unsafe "stp_c_interface.h" - vc_eqExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_notExpr :: Ptr SContext -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_andExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_andExprN :: Ptr SContext -> Ptr (Ptr SExpr) -> CInt -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_orExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_orExprN :: Ptr SContext -> Ptr (Ptr SExpr) -> CInt -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_xorExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_impliesExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_iffExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_iteExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - --- Bit vector arithmetic - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvPlusExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvPlusExprN :: Ptr SContext -> CInt -> Ptr (Ptr SExpr) -> CInt -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvMinusExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvMultExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvDivExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvModExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_sbvDivExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_sbvModExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvUMinusExpr :: Ptr SContext -> Ptr SExpr -> IO (Ptr SExpr) - --- Comparisons - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvLtExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvLeExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvGtExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvGeExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_sbvLtExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_sbvLeExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_sbvGtExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_sbvGeExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - --- Bitwise Operations - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvAndExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvOrExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvXorExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvNotExpr :: Ptr SContext -> Ptr SExpr -> IO (Ptr SExpr) - --- Shifting and signs - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvSignExtend :: Ptr SContext -> Ptr SExpr -> CInt -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvLeftShiftExpr :: Ptr SContext -> CInt -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvRightShiftExpr :: Ptr SContext -> CInt -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvLeftShiftExprExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvRightShiftExprExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvSignedRightShiftExprExpr :: Ptr SContext -> CInt -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - - --- Bit vector /string/ operations - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvConcatExpr :: Ptr SContext -> Ptr SExpr -> Ptr SExpr -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvExtract :: Ptr SContext -> Ptr SExpr -> CInt -> CInt -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvBoolExtract_Zero :: Ptr SContext -> Ptr SExpr -> CInt -> IO (Ptr SExpr) - -foreign import ccall unsafe "stp_c_interface.h" - vc_bvBoolExtract_One :: Ptr SContext -> Ptr SExpr -> CInt -> IO (Ptr SExpr) - --- configure and misc features -foreign import ccall unsafe "stp_c_interface.h" - make_division_total :: Ptr SContext -> IO () - -foreign import ccall unsafe "stp_c_interface.h" - vc_setFlag :: Ptr SContext -> CChar -> IO () diff --git a/src/vendor/stp/Makefile b/src/vendor/stp/Makefile deleted file mode 100644 index 092995d7f..000000000 --- a/src/vendor/stp/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -TOP=../../.. -include $(TOP)/platform.mk - -PREFIX?=$(TOP)/inst - -.PHONY: all install clean full_clean - -ifeq ($(STP_STUB),) -SRC = src -else -SRC = src_stub -endif - -ifeq ($(OSTYPE), Darwin) -SNAME=libstp.dylib -else -SNAME=libstp.so.1 -endif - -all: install - -install: - $(MAKE) -C $(SRC) install - ln -fsn HaskellIfc include_hs - install -m 755 -d $(PREFIX)/lib/SAT - install -m 644 lib/$(SNAME) $(PREFIX)/lib/SAT - -clean: - $(MAKE) -C $(SRC) clean - -full_clean: - $(MAKE) -C $(SRC) full_clean - rm -f include_hs diff --git a/src/vendor/stp/src/AST/AST.h b/src/vendor/stp/src/AST/AST.h deleted file mode 100644 index 45288527d..000000000 --- a/src/vendor/stp/src/AST/AST.h +++ /dev/null @@ -1,112 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef AST_H -#define AST_H -#include "UsefulDefs.h" -#include "ASTNode.h" -#include "ASTInternal.h" -#include "ASTInterior.h" -#include "ASTSymbol.h" -#include "ASTBVConst.h" - -namespace BEEV -{ - void process_argument(const char ch, STPMgr *bm); - void FatalError(const char * str, const ASTNode& a, int w = 0) __attribute__ ((noreturn)); - void FatalError(const char * str) __attribute__ ((noreturn)); - void SortByExprNum(ASTVec& c); - void SortByArith(ASTVec& c); - bool exprless(const ASTNode n1, const ASTNode n2); - bool arithless(const ASTNode n1, const ASTNode n2); - bool isAtomic(Kind k); - bool isCommutative(const Kind k); - bool containsArrayOps(const ASTNode&n); - bool numberOfReadsLessThan(const ASTNode&n, int v); - - // If (a > b) in the termorder, then return 1 elseif (a < b) in the - // termorder, then return -1 else return 0 - int TermOrder(const ASTNode& a, const ASTNode& b); - - - //FUNCTION TypeCheck: Assumes that the immediate Children of the - //input ASTNode have been typechecked. This function is suitable - //in scenarios like where you are building the ASTNode Tree, and - //you typecheck as you go along. It is not suitable as a general - //typechecker - - // NB: The boolean value is always true! - bool BVTypeCheck(const ASTNode& n); - - long getCurrentTime(); - - ASTVec FlattenKind(Kind k, const ASTVec &children); - - // Checks recursively all the way down. - bool BVTypeCheckRecursive(const ASTNode& n); - - //Takes a BVCONST and returns its constant value - unsigned int GetUnsignedConst(const ASTNode n); - - typedef HASHMAP< - ASTNode, - ASTNode, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeMap; - - typedef HASHMAP< - ASTNode, - int32_t, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeCountMap; - - typedef HASHSET< - ASTNode, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeSet; - - typedef HASHMULTISET< - ASTNode, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeMultiSet; - - typedef HASHMAP< - ASTNode, - ASTVec, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeToVecMap; - - //Needed for defining the MAP below - struct ltint - { - bool operator()(int s1, int s2) const - { - return s1 < s2; - } - }; - - class ClauseList; - - //Datatype for ClauseLists - typedef MAP< - int, - ClauseList *, - ltint> ClauseBuckets; - - typedef MAP< - int, - ASTVec *, - ltint> IntToASTVecMap; - - // Function to dump contents of ASTNodeMap - ostream &operator<<(ostream &os, const ASTNodeMap &nmap); - - void buildListOfSymbols(const ASTNode& n, ASTNodeSet& visited,ASTNodeSet& symbols); -}; // end namespace BEEV -#endif diff --git a/src/vendor/stp/src/AST/ASTBVConst.cpp b/src/vendor/stp/src/AST/ASTBVConst.cpp deleted file mode 100644 index 82ba82f1c..000000000 --- a/src/vendor/stp/src/AST/ASTBVConst.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "AST.h" -#include "../STPManager/STP.h" -namespace BEEV -{ - const ASTVec ASTBVConst::astbv_empty_children; - - /**************************************************************** - * ASTBVConst Member Function definitions * - ****************************************************************/ - - //Constructor - ASTBVConst::ASTBVConst(CBV bv, unsigned int width) : - ASTInternal(BVCONST) - { - _bvconst = CONSTANTBV::BitVector_Clone(bv); - _value_width = width; - cbv_managed_outside =false; - } //End of ASTBVConst constructor - - // Copy constructor. - ASTBVConst::ASTBVConst(const ASTBVConst &sym) : - ASTInternal(sym._kind) - { - _bvconst = CONSTANTBV::BitVector_Clone(sym._bvconst); - _value_width = sym._value_width; - cbv_managed_outside =false; - } //End of copy constructor() - - // Call this when deleting a node that has been stored in the the - // unique table - void ASTBVConst::CleanUp() - { - (ParserBM)->_bvconst_unique_table.erase(this); - delete this; - } //End of Cleanup() - - // Print function for bvconst -- return _bvconst value in bin - // format (c_friendly is for printing hex. numbers that C - // compilers will accept) - void ASTBVConst::nodeprint(ostream& os, bool c_friendly) - { - unsigned char *res; - const char *prefix; - - if((GlobalSTP->bm)->UserFlags.print_binary_flag) { - res = CONSTANTBV::BitVector_to_Bin(_bvconst); - if (c_friendly) - { - prefix = "0b"; - } - else - { - prefix = "0bin"; - } - } - else if (_value_width % 4 == 0) - { - res = CONSTANTBV::BitVector_to_Hex(_bvconst); - if (c_friendly) - { - prefix = "0x"; - } - else - { - prefix = "0hex"; - } - } - else - { - res = CONSTANTBV::BitVector_to_Bin(_bvconst); - if (c_friendly) - { - prefix = "0b"; - } - else - { - prefix = "0bin"; - } - } - if (NULL == res) - { - os << "nodeprint: BVCONST : could not convert to string" << _bvconst; - FatalError(""); - } - os << prefix << res; - CONSTANTBV::BitVector_Dispose(res); - } //End of nodeprint() - - // Return the bvconst. It is a const-value - CBV ASTBVConst::GetBVConst() const - { - return _bvconst; - } //End of GetBVConst() - - /**************************************************************** - * Class ASTBVConstHasher and ASTBVConstEqual Functions * - ****************************************************************/ - - size_t ASTBVConst::ASTBVConstHasher::operator()(const ASTBVConst * bvc) const - { - return CONSTANTBV::BitVector_Hash(bvc->_bvconst); - } //End of ASTBVConstHasher operator - - - bool ASTBVConst::ASTBVConstEqual::operator()(const ASTBVConst * bvc1, - const ASTBVConst * bvc2) const - { - if (bvc1->_value_width != bvc2->_value_width) - { - return false; - } - return (0 == - CONSTANTBV::BitVector_Compare(bvc1->_bvconst, - bvc2->_bvconst)); - } //End of ASTBVConstEqual operator -};//End of namespace - diff --git a/src/vendor/stp/src/AST/ASTBVConst.h b/src/vendor/stp/src/AST/ASTBVConst.h deleted file mode 100644 index 8b4590556..000000000 --- a/src/vendor/stp/src/AST/ASTBVConst.h +++ /dev/null @@ -1,129 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef ASTBVCONST_H -#define ASTBVCONST_H -namespace BEEV -{ - class STPMgr; - void FatalError(const char * str); - - /****************************************************************** - * Class ASTBVConst: * - * * - * Class to represent internals of a bitvector constant * - ******************************************************************/ - class ASTBVConst: public ASTInternal - { - friend class STPMgr; - friend class ASTNode; - friend class ASTNodeHasher; - friend class ASTNodeEqual; - - private: - /**************************************************************** - * Private Data * - ****************************************************************/ - - //CBV is actually an unsigned*. The bitvector constant is - //represented using an external library in extlib-bvconst. - CBV _bvconst; - - // If the CBV is managed outside of this class. Then a defensive copy isn't taken. - bool cbv_managed_outside; - - /**************************************************************** - * Class ASTBVConstHasher: * - * * - * Hasher for ASTBVConst nodes * - ****************************************************************/ - class ASTBVConstHasher - { - public: - size_t operator()(const ASTBVConst * bvc) const; - }; //End of class ASTBVConstHahser - - - - /**************************************************************** - * Class ASTBVConstEqual: * - * * - * Equality for ASTBVConst nodes * - ****************************************************************/ - class ASTBVConstEqual - { - public: - bool operator()(const ASTBVConst * bvc1, - const ASTBVConst * bvc2) const; - }; //End of class ASTBVConstEqual - - /**************************************************************** - * Private Functions (virtual defs and friends) * - ****************************************************************/ - - //Constructor - ASTBVConst(CBV bv, unsigned int width); - - enum CBV_LIFETIME {CBV_MANAGED_OUTSIDE}; - - ASTBVConst(CBV bv, unsigned int width, enum CBV_LIFETIME l ) - : ASTInternal(BVCONST) - { - _bvconst = (bv); - _value_width = width; - cbv_managed_outside =true; - } - - // Copy constructor. - ASTBVConst(const ASTBVConst &sym); - - //friend equality operator - friend bool operator==(const ASTBVConst &bvc1, const ASTBVConst &bvc2) - { - if (bvc1._value_width != bvc2._value_width) - return false; - return (0 == CONSTANTBV::BitVector_Compare(bvc1._bvconst, - bvc2._bvconst)); - } //End of operator== - - // Call this when deleting a node that has been stored in the the - // unique table - virtual void CleanUp(); - - // Print function for bvconst -- return _bvconst value in bin - // format (c_friendly is for printing hex. numbers that C - // compilers will accept) - virtual void nodeprint(ostream& os, bool c_friendly = false); - - const static ASTVec astbv_empty_children; - - public: - - virtual ASTVec const & - GetChildren() const - { - return astbv_empty_children; - } - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - //Destructor. Call the external destructor - virtual ~ASTBVConst() - { - if (!cbv_managed_outside) - CONSTANTBV::BitVector_Destroy(_bvconst); - } //End of destructor - - // Return the bvconst. It is a const-value - CBV GetBVConst() const; - }; //End of ASTBVConst -};//end of namespace -#endif diff --git a/src/vendor/stp/src/AST/ASTInterior.cpp b/src/vendor/stp/src/AST/ASTInterior.cpp deleted file mode 100644 index e1b9db733..000000000 --- a/src/vendor/stp/src/AST/ASTInterior.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "AST.h" -#include "../STPManager/STP.h" -namespace BEEV -{ - /****************************************************************** - * ASTInterior Member Functions * - ******************************************************************/ - - // Call this when deleting a node that has been stored in the - // the unique table - void ASTInterior::CleanUp() - { - (ParserBM)->_interior_unique_table.erase(this); - delete this; - } //End of Cleanup() - - // Returns kinds. "lispprinter" handles printing of parenthesis - // and childnodes. (c_friendly is for printing hex. numbers that C - // compilers will accept) - void ASTInterior::nodeprint(ostream& os, bool c_friendly) - { - os << _kind_names[_kind]; - } //end of nodeprint() - - /****************************************************************** - * ASTInteriorHasher and ASTInteriorEqual Member Functions * - ******************************************************************/ - - //ASTInteriorHasher operator() - size_t - ASTInterior::ASTInteriorHasher:: - operator()(const ASTInterior *int_node_ptr) const - { - size_t hashval = ((size_t) int_node_ptr->GetKind()); - const ASTVec &ch = int_node_ptr->GetChildren(); - ASTVec::const_iterator iend = ch.end(); - for (ASTVec::const_iterator i = ch.begin(); i != iend; i++) - { - hashval += i->Hash(); - hashval += (hashval << 10); - hashval ^= (hashval >> 6); - } - - hashval += (hashval << 3); - hashval ^= (hashval >> 11); - hashval += (hashval << 15); - return hashval; - } //End of ASTInteriorHasher operator() - - //ASTInteriorEqual operator() - bool - ASTInterior::ASTInteriorEqual:: - operator()(const ASTInterior *int_node_ptr1, - const ASTInterior *int_node_ptr2) const - { - return (*int_node_ptr1 == *int_node_ptr2); - } ///End of ASTInteriorEqual operator() - -}; //end of namespace diff --git a/src/vendor/stp/src/AST/ASTInterior.h b/src/vendor/stp/src/AST/ASTInterior.h deleted file mode 100644 index 9c5a49a0e..000000000 --- a/src/vendor/stp/src/AST/ASTInterior.h +++ /dev/null @@ -1,107 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef ASTINTERIOR_H -#define ASTINTERIOR_H - -#include "UsefulDefs.h" -#include "ASTInternalWithChildren.h" -namespace BEEV -{ - class ASTNode; - class STPMgr; - typedef vector ASTVec; - - /****************************************************************** - * Class ASTInterior: * - * * - * Internal representation of an interior ASTNode.Generally, these* - * nodes should have at least one child * - ******************************************************************/ - class ASTInterior: public ASTInternalWithChildren - { - - friend class STPMgr; - friend class ASTNodeHasher; - friend class ASTNodeEqual; - friend BEEV::ASTNode HashingNodeFactory::CreateNode(const Kind kind, const BEEV::ASTVec & back_children); - - private: - /****************************************************************** - * Private Data and Member Functions * - ******************************************************************/ - - /****************************************************************** - * Class ASTInteriorHasher: * - * * - * Hasher for ASTInterior pointer nodes * - ******************************************************************/ - class ASTInteriorHasher - { - public: - size_t operator()(const ASTInterior *int_node_ptr) const; - }; //End of ASTInteriorHasher - - /****************************************************************** - * Class ASTInteriorEqual: * - * * - * Equality for ASTInterior nodes * - ******************************************************************/ - class ASTInteriorEqual - { - public: - bool operator()(const ASTInterior *int_node_ptr1, - const ASTInterior *int_node_ptr2) const; - }; //End of class ASTInteriorEqual - - // Used in Equality class for hash tables - friend bool operator==(const ASTInterior &int_node1, - const ASTInterior &int_node2) - { - return ((int_node1._kind == int_node2._kind) - && (int_node1._children == int_node2._children)); - } //End of operator== - - // Call this when deleting a node that has been stored in the - // the unique table - virtual void CleanUp(); - - // Returns kinds. "lispprinter" handles printing of parenthesis - // and childnodes. (c_friendly is for printing hex. numbers that C - // compilers will accept) - virtual void nodeprint(ostream& os, bool c_friendly = false); - - public: - /****************************************************************** - * Public Member Functions * - ******************************************************************/ - - // Basic constructors - ASTInterior(Kind kind) : ASTInternalWithChildren(kind) - { - } - - ASTInterior(Kind kind, ASTVec &children) : ASTInternalWithChildren(kind, children) - { - } - - //Copy constructor. This copies the contents of the child nodes - //array, along with everything else. Assigning the smart pointer, - //ASTNode, does NOT invoke this. - ASTInterior(const ASTInterior &int_node) : ASTInternalWithChildren(int_node) - { - } - - // Destructor (does nothing, but is declared virtual here. - virtual ~ASTInterior() - { - } - }; //End of ASTNodeInterior -}; //end of namespace BEEV -#endif diff --git a/src/vendor/stp/src/AST/ASTInternal.h b/src/vendor/stp/src/AST/ASTInternal.h deleted file mode 100644 index 9f1abd1b8..000000000 --- a/src/vendor/stp/src/AST/ASTInternal.h +++ /dev/null @@ -1,191 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -#ifndef ASTINTERNAL_H -#define ASTINTERNAL_H - -/******************************************************************** - * This file gives the class description of the ASTInternal class * - ********************************************************************/ -namespace BEEV -{ - /****************************************************************** - * struct enumeration: * - * * - * Templated class that allows you to define the number of bytes * - * (using class T below) for the enumerated type class E. * - ******************************************************************/ - template - struct enumeration - { - typedef T type; - typedef E enum_type; - - enumeration() : e_(E()) - {} - - enumeration(E e) : e_(static_cast(e)) - {} - - operator E() const - { return static_cast(e_); } - - private: - T e_; - }; //end of Enumeration struct - - /****************************************************************** - * Class ASTInternal: * - * * - * Abstract base class for internal node representation. Requires * - * Kind and ChildNodes so same traversal works on all nodes. * - ******************************************************************/ - class ASTInternal - { - friend class ASTNode; - friend class CNFMgr; - - protected: - /**************************************************************** - * Protected Data * - ****************************************************************/ - - mutable uint8_t iteration; - - //reference counting for garbage collection - unsigned int _ref_count; - - // Kind. It's a type tag and the operator. - enumeration _kind; - - //Nodenum is a unique positive integer for the node. The nodenum - //of a node should always be greater than its descendents (which - //is easily achieved by incrementing the number each time a new - //node is created). - unsigned int _node_num; - - /******************************************************************* - * ASTNode is of type BV <==> ((indexwidth=0)&&(valuewidth>0))* - * ASTNode is of type ARRAY <==> ((indexwidth>0)&&(valuewidth>0))* - * ASTNode is of type BOOLEAN <==> ((indexwidth=0)&&(valuewidth=0))* - * * - * Width of the index of an array. Positive for array, 0 otherwise * - *******************************************************************/ - unsigned int _index_width; - - - /******************************************************************* - * ASTNode is of type BV <==> ((indexwidth=0)&&(valuewidth>0))* - * ASTNode is of type ARRAY <==> ((indexwidth>0)&&(valuewidth>0))* - * ASTNode is of type BOOLEAN <==> ((indexwidth=0)&&(valuewidth=0))* - * * - * Number of bits of bitvector. +ve for array/bitvector,0 otherwise* - *******************************************************************/ - unsigned int _value_width; - - /**************************************************************** - * Protected Member Functions * - ****************************************************************/ - - // Copying assign operator. Also copies contents of children. - ASTInternal& operator=(const ASTInternal &int_node); - - // Cleanup function for removing from hash table - virtual void CleanUp() = 0; - - // Destructor (does nothing, but is declared virtual here. - virtual ~ASTInternal() - { - } - - // Abstract virtual print function for internal node. c_friendly - // is for printing hex. numbers that C compilers will accept - virtual void nodeprint(ostream& os, bool c_friendly = false) - { - os << "*"; - } - ; - - // Treat the result as const pleases - virtual Kind GetKind() const - { - return _kind; - } - - // Get the child nodes of this node - virtual ASTVec const &GetChildren() const = 0; - - public: - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - // Constructor (kind only, empty children, int nodenum) - ASTInternal(Kind kind, int nodenum = 0) : - _ref_count(0), _kind(kind), - _node_num(nodenum), - _index_width(0), _value_width(0), iteration(0) - { - } - - // Copy constructor. This copies the contents of the child nodes - // array, along with everything else. Assigning the smart pointer, - // ASTNode, does NOT invoke this; This should only be used for - // temporary hash keys before uniquefication. - // FIXME: I don't think children need to be copied. - ASTInternal(const ASTInternal &int_node, int nodenum = 0) : - _ref_count(0), _kind(int_node._kind), - _node_num(int_node._node_num), - _index_width(int_node._index_width), - _value_width(int_node._value_width), - iteration(0) - { - } - - // Increment Reference Count - void IncRef() - { - ++_ref_count; - } //End of IncRef() - - // Decrement Reference Count - void DecRef() - { - if (--_ref_count == 0) - { - // Delete node from unique table and kill it. - CleanUp(); - } - }//End of DecRef() - - int GetNodeNum() const - { - return _node_num; - } //End of GetNodeNum() - - - virtual bool isSimplified() const - { - return false; - } - - virtual void hasBeenSimplified() const - { - cerr << "astinternal has been"; - } - - - void SetNodeNum(int nn) - { - _node_num = nn; - } //End of SetNodeNum() - - }; //End of Class ASTInternal -}; //end of namespace -#endif diff --git a/src/vendor/stp/src/AST/ASTInternalWithChildren.h b/src/vendor/stp/src/AST/ASTInternalWithChildren.h deleted file mode 100644 index d1e93391c..000000000 --- a/src/vendor/stp/src/AST/ASTInternalWithChildren.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef ASTINTERNALWithChildren_H -#define ASTINTERNALWithChildren_H - -/* - * Leaf objects like Symbols and BVConsts don't need a vector of - * children. On a 64-bit machine, a vector object is 24 bytes. So - * splitting the two objects apart saves 24 bytes for those objects. - */ - -namespace BEEV -{ - class ASTInternalWithChildren : public ASTInternal - { - - protected: - // The vector of children - ASTVec _children; - - /// todo. This should be a bitfield in a superclass if it can fit without increasing the sizeof.. - mutable bool is_simplified; - - public: - - virtual ASTVec const &GetChildren() const - { - return _children; - } - - bool isSimplified() const - { - return is_simplified; - } - - void hasBeenSimplified() const - { - is_simplified =true; - } - - // Constructor (kind and children). - ASTInternalWithChildren(Kind kind, const ASTVec &children, int nodenum = 0) : - ASTInternal(kind,nodenum), _children(children) - { - is_simplified = false; - } - - // Constructor (kind only, empty children, int nodenum) - ASTInternalWithChildren(Kind kind, int nodenum = 0) : - ASTInternal(kind,nodenum) - { - is_simplified = false; - } - }; //End of Class ASTInternalBase -}; //end of namespace -#endif diff --git a/src/vendor/stp/src/AST/ASTKind.kinds b/src/vendor/stp/src/AST/ASTKind.kinds deleted file mode 100644 index c10d916ee..000000000 --- a/src/vendor/stp/src/AST/ASTKind.kinds +++ /dev/null @@ -1,73 +0,0 @@ -#Please refer LICENSE FILE in the home directory for licensing information -# name minkids maxkids category1 category2 -Categories: Term Form - -# Leaf nodes. -UNDEFINED 0 0 -SYMBOL 0 0 Term Form - -# These always produce terms -BVCONST 0 0 Term -BVNEG 1 1 Term -BVCONCAT 2 - Term -BVOR 1 - Term -BVAND 1 - Term -BVXOR 1 - Term -BVNAND 1 - Term -BVNOR 1 - Term -BVXNOR 1 - Term -BVEXTRACT 3 3 Term -BVLEFTSHIFT 3 3 Term -BVRIGHTSHIFT 3 3 Term -BVSRSHIFT 3 3 Term -BVVARSHIFT 3 3 Term -BVPLUS 1 - Term -BVSUB 2 2 Term -BVUMINUS 1 1 Term -BVMULTINVERSE 1 1 Term -BVMULT 1 - Term -BVDIV 2 2 Term -BVMOD 2 2 Term -SBVDIV 2 2 Term -SBVREM 2 2 Term -SBVMOD 2 2 Term -BVSX 1 1 Term -BVZX 1 1 Term -#BOOLVEC 0 - Term - -# Formula OR term, depending on context -ITE 3 3 Term Form - -# These produce formulas. -BVGETBIT 2 2 Form -BVLT 2 2 Form -BVLE 2 2 Form -BVGT 2 2 Form -BVGE 2 2 Form -BVSLT 2 2 Form -BVSLE 2 2 Form -BVSGT 2 2 Form -BVSGE 2 2 Form -EQ 2 2 Form -FALSE 0 0 Form -TRUE 0 0 Form -NOT 1 1 Form -AND 1 - Form -OR 1 - Form -NAND 1 - Form -NOR 1 - Form -XOR 1 - Form -IFF 1 - Form -IMPLIES 2 2 Form -PARAMBOOL 2 2 Form - -# array operations -READ 2 2 Term -WRITE 3 3 Term - -#Types: These kinds are used only in the API. Once processed inside -#the API, they are never used again in the system -ARRAY 0 0 -BITVECTOR 0 0 -BOOLEAN 0 0 - diff --git a/src/vendor/stp/src/AST/ASTNode.cpp b/src/vendor/stp/src/AST/ASTNode.cpp deleted file mode 100644 index 0a268f504..000000000 --- a/src/vendor/stp/src/AST/ASTNode.cpp +++ /dev/null @@ -1,307 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "AST.h" -#include "../STPManager/STP.h" - -/******************************************************************** - * This file gives the class definitions of the ASTNode class * - ********************************************************************/ -namespace BEEV -{ - uint8_t ASTNode::getIteration() const - { - return _int_node_ptr->iteration; - } - - void ASTNode::setIteration(uint8_t v) const - { - _int_node_ptr->iteration = v; - } - - - - // Constructor; - // - // creates a new pointer, increments refcount of pointed-to object. - ASTNode::ASTNode(ASTInternal *in) : - _int_node_ptr(in) - { - if (in) - { - in->IncRef(); - } - } //End of Constructor - - // Copy constructor. Maintain _ref_count - ASTNode::ASTNode(const ASTNode &n) : - _int_node_ptr(n._int_node_ptr) - { - if (n._int_node_ptr) - { - n._int_node_ptr->IncRef(); - } - } //End of Copy Constructor for ASTNode - - // ASTNode accessor function. - Kind ASTNode::GetKind() const - { - //cout << "GetKind: " << _int_node_ptr; - return _int_node_ptr->GetKind(); - } //End of GetKind() - - // Declared here because of same ordering problem as GetKind. - const ASTVec &ASTNode::GetChildren() const - { - return _int_node_ptr->GetChildren(); - } //End of GetChildren() - - // Access node number - int ASTNode::GetNodeNum() const - { - return _int_node_ptr->_node_num; - } //End of GetNodeNum() - - unsigned int ASTNode::GetIndexWidth() const - { - return _int_node_ptr->_index_width; - } //End of GetIndexWidth() - - void ASTNode::SetIndexWidth(unsigned int iw) const - { - _int_node_ptr->_index_width = iw; - } //End of SetIndexWidth() - - unsigned int ASTNode::GetValueWidth() const - { - return _int_node_ptr->_value_width; - } //End of GetValueWidth() - - void ASTNode::SetValueWidth(unsigned int vw) const - { - _int_node_ptr->_value_width = vw; - } //End of SetValueWidth() - - //return the type of the ASTNode: - // - // 0 iff BOOLEAN; 1 iff BITVECTOR; 2 iff ARRAY; 3 iff UNKNOWN; - types ASTNode::GetType() const - { - if ((GetIndexWidth() == 0) && (GetValueWidth() == 0)) //BOOLEAN - return BOOLEAN_TYPE; - if ((GetIndexWidth() == 0) && (GetValueWidth() > 0)) //BITVECTOR - return BITVECTOR_TYPE; - if ((GetIndexWidth() > 0) && (GetValueWidth() > 0)) //ARRAY - return ARRAY_TYPE; - return UNKNOWN_TYPE; - } //End of GetType() - - // Assignment - ASTNode& ASTNode::operator=(const ASTNode& n) - { - if (n._int_node_ptr) - { - n._int_node_ptr->IncRef(); - } - if (_int_node_ptr) - { - _int_node_ptr->DecRef(); - } - _int_node_ptr = n._int_node_ptr; - return *this; - } //End of operator= - - // Destructor - ASTNode::~ASTNode() - { - if (_int_node_ptr) - { - _int_node_ptr->DecRef(); - } - } //End of Destructor() - - STPMgr* ASTNode::GetSTPMgr() const - { - return ParserBM; - } //End of GetSTPMgr() - - // Checks if the node has alreadybeen printed or not - bool ASTNode::IsAlreadyPrinted() const - { - STPMgr * bm = GetSTPMgr(); - return (bm->AlreadyPrintedSet.find(*this) != - bm->AlreadyPrintedSet.end()); - } //End of IsAlreadyPrinted() - - // Mark the node as printed if it has been already printed - void ASTNode::MarkAlreadyPrinted() const - { - STPMgr * bm = GetSTPMgr(); - bm->AlreadyPrintedSet.insert(*this); - } //End of MarkAlreadyPrinted() - - // Print the node - void ASTNode::nodeprint(ostream& os, bool c_friendly) const - { - _int_node_ptr->nodeprint(os, c_friendly); - } //End of nodeprint() - - // Get the name from a symbol (char *). It's an error if kind != - // SYMBOL - const char * ASTNode::GetName() const - { - if (GetKind() != SYMBOL) - FatalError("GetName: Called GetName on a non-symbol: ", *this); - return ((ASTSymbol *) _int_node_ptr)->GetName(); - } //End of GetName() - - // Get the value of bvconst from a bvconst. It's an error if kind - // != BVCONST Treat the result as const (the compiler can't enforce - // it). - CBV ASTNode::GetBVConst() const - { - if (GetKind() != BVCONST) - FatalError("GetBVConst: non bitvector-constant: ", *this); - return ((ASTBVConst *) _int_node_ptr)->GetBVConst(); - } //End of GetBVConst() - - unsigned int ASTNode::GetUnsignedConst() const - { - const ASTNode& n = *this; - assert(BVCONST == n.GetKind()); - - if (sizeof(unsigned int) * 8 < n.GetValueWidth()) - { - // It may only contain a small value in a bit type, - // which fits nicely into an unsigned int. This is - // common for functions like: bvshl(bv1[128], - // bv1[128]) where both operands have the same type. - signed long maxBit = CONSTANTBV::Set_Max(n.GetBVConst()); - if (maxBit >= ((signed long) sizeof(unsigned int)) * 8) - { - n.LispPrint(cerr); //print the node so they can find it. - FatalError("GetUnsignedConst: cannot convert bvconst "\ - "of length greater than 32 to unsigned int"); - } - } - return (unsigned int) *((unsigned int *) n.GetBVConst()); - } //end of GetUnsignedConst - - - - - void ASTNode::NFASTPrint(int l, int max, int prefix) const - { - //**************************************** - // stop - //**************************************** - if (l > max) - { - return; - } - - //**************************************** - // print - //**************************************** - printf("[%10d]", 0); - for (int i = 0; i < prefix; i++) - { - printf(" "); - } - cout << GetKind(); - printf("\n"); - - //**************************************** - // recurse - //**************************************** - - const ASTVec &children = GetChildren(); - ASTVec::const_iterator it = children.begin(); - for (; it != children.end(); it++) - { - it->NFASTPrint(l + 1, max, prefix + 1); - } - } //End of NFASTPrint() - - bool - ASTNode::isSimplfied() const - { - return _int_node_ptr->isSimplified(); - } - - void - ASTNode::hasBeenSimplfied() const - { - _int_node_ptr->hasBeenSimplified(); - } - - - //traverse "*this", and construct "let variables" for terms that - //occur more than once in "*this". - void ASTNode::LetizeNode(void) const - { - Kind kind = this->GetKind(); - - if (kind == SYMBOL || kind == BVCONST || kind == FALSE || kind == TRUE) - return; - - //FIXME: this is ugly. - STPMgr * bm = GetSTPMgr(); - const ASTVec &c = this->GetChildren(); - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - ASTNode ccc = *it; - if (bm->PLPrintNodeSet.find(ccc) == bm->PLPrintNodeSet.end()) - { - //If branch: if *it is not in NodeSet then, - // - //1. add it to NodeSet - // - //2. Letize its childNodes - - bm->PLPrintNodeSet.insert(ccc); - //debugging - //cerr << ccc; - ccc.LetizeNode(); - } - else - { - Kind k = ccc.GetKind(); - if (k == SYMBOL || k == BVCONST || k == FALSE || k == TRUE) - continue; - - //0. Else branch: Node has been seen before - // - //1. Check if the node has a corresponding letvar in the - //1. NodeLetVarMap. - // - //2. if no, then create a new var and add it to the - //2. NodeLetVarMap - if (bm->NodeLetVarMap.find(ccc) == bm->NodeLetVarMap.end()) - { - //Create a new symbol. Get some name. if it conflicts with a - //declared name, too bad. - int sz = bm->NodeLetVarMap.size(); - ostringstream oss; - oss << "let_k_" << sz; - - ASTNode CurrentSymbol = bm->CreateSymbol(oss.str().c_str(),this->GetIndexWidth(),this->GetValueWidth()); - /* If for some reason the variable being created here is - * already declared by the user then the printed output will - * not be a legal input to the system. too bad. I refuse to - * check for this. - */ - bm->NodeLetVarMap[ccc] = CurrentSymbol; - std::pair node_letvar_pair(CurrentSymbol, ccc); - bm->NodeLetVarVec.push_back(node_letvar_pair); - } - } - } - } //end of LetizeNode() -};//end of namespace diff --git a/src/vendor/stp/src/AST/ASTNode.h b/src/vendor/stp/src/AST/ASTNode.h deleted file mode 100644 index eb4fe7ef2..000000000 --- a/src/vendor/stp/src/AST/ASTNode.h +++ /dev/null @@ -1,391 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -#ifndef ASTNODE_H -#define ASTNODE_H -#include "NodeFactory/HashingNodeFactory.h" - -/******************************************************************** - * This file gives the class description of the ASTNode class * - ********************************************************************/ -namespace BEEV -{ - /****************************************************************** - * Class ASTNode: * - * * - * A Kind of Smart pointer to actual ASTInternal datastructure. * - * This class defines the node datastructure for the DAG that * - * captures input formulas to STP. * - ******************************************************************/ - - class ASTNode - { - friend class STPMgr; - friend class CNFMgr; - friend class ASTInterior; - friend class vector; - friend BEEV::ASTNode HashingNodeFactory::CreateNode(const Kind kind, const BEEV::ASTVec & back_children); - friend bool exprless(const ASTNode n1, const ASTNode n2); - friend bool arithless(const ASTNode n1, const ASTNode n2); - - private: - /**************************************************************** - * Private Data * - ****************************************************************/ - - // Ptr to the read data - ASTInternal * _int_node_ptr; - - /**************************************************************** - * Private Member Functions * - ****************************************************************/ - - // Constructor. - ASTNode(ASTInternal *in); - - //Equal iff ASTIntNode pointers are the same. - friend bool operator==(const ASTNode& node1, const ASTNode& node2) - { - return - ((size_t) node1._int_node_ptr) == - ((size_t) node2._int_node_ptr); - } - - friend bool operator!=(const ASTNode& node1, const ASTNode& node2) - { - return !(node1 == node2); - } - - friend bool operator<(const ASTNode& node1, const ASTNode& node2) - { - return - ((size_t) node1._int_node_ptr) < - ((size_t) node2._int_node_ptr); - } - - public: - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - uint8_t getIteration() const; - void setIteration(uint8_t v) const; - - // Default constructor. - ASTNode() :_int_node_ptr(NULL) {}; - - // Copy constructor - ASTNode(const ASTNode &n); - - // Destructor - ~ASTNode(); - - // Print the arguments in lisp format - friend ostream &LispPrintVec(ostream &os, - const ASTVec &v, - int indentation); - - // Print the arguments in lisp format - friend ostream &LispPrintVecSpecial(ostream &os, - const vector &v, - int indentation); - - // Check if it points to a null node - inline bool IsNull() const - { - return _int_node_ptr == NULL; - } - - bool isConstant() const - { - const Kind k = GetKind(); - return (k == BVCONST || k == TRUE || k == FALSE); - } - - bool isSimplfied() const; - - void hasBeenSimplfied() const; - - - bool isITE() const - { - bool result; - - Kind k = GetKind(); - switch (k) - { - case ITE: - { - result = true; - break; - } - default: - { - result = false; - break; - } - } - - return result; - } - - bool isAtom() const - { - bool result; - - const Kind k = GetKind(); - switch (k) - { - case TRUE: - { - result = true; - break; - } - case FALSE: - { - result = true; - break; - } - case SYMBOL: - { - result = true; - break; - } - case BVCONST: - { - result = true; - break; - } - default: - { - result = false; - break; - } - } - - return result; - } //End of isAtom() - - bool isPred() const - { - bool result; - - const Kind k = GetKind(); - switch (k) - { - case BVLT: - { - result = true; - break; - } - case BVLE: - { - result = true; - break; - } - case BVGT: - { - result = true; - break; - } - case BVGE: - { - result = true; - break; - } - case BVSLT: - { - result = true; - break; - } - case BVSLE: - { - result = true; - break; - } - case BVSGT: - { - result = true; - break; - } - case BVSGE: - { - result = true; - break; - } - case EQ: - { - result = true; - break; - } - default: - { - result = false; - break; - } - } - return result; - } //End of isPred() - - - // For lisp DAG printing. Has it been printed already, so we can - // just print the node number? - bool IsAlreadyPrinted() const; - void MarkAlreadyPrinted() const; - - // delegates to the ASTInternal node. - void nodeprint(ostream& os, bool c_friendly = false) const; - - // Assignment (for ref counting) - ASTNode& operator=(const ASTNode& n); - - //Get the STPMgr pointer. FIXME: Currently uses a global - //ptr. BAD!! - STPMgr* GetSTPMgr() const; - - // Access node number - int GetNodeNum() const; - - // Access kind. - Kind GetKind() const; - - // Access Children of this Node - const ASTVec &GetChildren() const; - - // Return the number of child nodes - size_t Degree() const - { - return GetChildren().size(); - } - ; - - // Get indexth childNode. - const ASTNode& operator[](size_t index) const - { - return GetChildren()[index]; - } - ; - - // Get begin() iterator for child nodes - ASTVec::const_iterator begin() const - { - return GetChildren().begin(); - } - ; - - // Get end() iterator for child nodes - ASTVec::const_iterator end() const - { - return GetChildren().end(); - } - ; - - //Get back() element for child nodes - const ASTNode back() const - { - return GetChildren().back(); - } - ; - - // Get the name from a symbol (char *). It's an error if kind != - // SYMBOL. - const char * GetName() const; - - //Get the BVCONST value. - CBV GetBVConst() const; - - unsigned int GetUnsignedConst() const; - - - /******************************************************************* - * ASTNode is of type BV <==> ((indexwidth=0)&&(valuewidth>0))* - * ASTNode is of type ARRAY <==> ((indexwidth>0)&&(valuewidth>0))* - * ASTNode is of type BOOLEAN <==> ((indexwidth=0)&&(valuewidth=0))* - * * - * Both indexwidth and valuewidth should never be less than 0 * - *******************************************************************/ - unsigned int GetIndexWidth() const; - unsigned int GetValueWidth() const; - void SetIndexWidth(unsigned int iw) const; - void SetValueWidth(unsigned int vw) const; - types GetType(void) const; - - // Hash using pointer value of _int_node_ptr. - size_t Hash() const - { - return (size_t) _int_node_ptr; - } - - void NFASTPrint(int l, int max, int prefix) const; - - // Lisp-form printer - ostream& LispPrint(ostream &os, int indentation = 0) const; - ostream &LispPrint_indent(ostream &os, int indentation) const; - - // Presentation Language Printer - ostream& PL_Print(ostream &os, int indentation = 0) const; - - // Construct let variables for shared subterms - void LetizeNode(void) const; - - // Attempt to define something that will work in the gdb - friend void lp(ASTNode &node); - friend void lpvec(const ASTVec &vec); - - // Printing to stream - friend ostream &operator<<(ostream &os, const ASTNode &node) - { - node.LispPrint(os, 0); - return os; - } - ; - - // Check if NODE really has a good ptr - bool IsDefined() const - { - return _int_node_ptr != NULL; - } - - /***************************************************************** - * Class ASTNodeHahser: * - * * - * Hasher class for STL hash_maps and hash_sets that use ASTNodes* - * as keys. Needs to be public so people can define hash tables * - * (and use ASTNodeMap class) * - *****************************************************************/ - class ASTNodeHasher - { - public: - size_t operator()(const ASTNode& n) const - { - return (size_t) n._int_node_ptr; - //return (size_t)n.GetNodeNum(); - } - ; - }; //End of ASTNodeHasher - - /***************************************************************** - * Class ASTNodeEqual: * - * * - * Equality for ASTNode hash_set and hash_map. Returns true iff * - * internal pointers are the same. Needs to be public so people * - * can define hash tables (and use ASTNodeSet class) * - *****************************************************************/ - class ASTNodeEqual - { - public: - bool operator()(const ASTNode& n1, const ASTNode& n2) const - { - return (n1._int_node_ptr == n2._int_node_ptr); - } - }; //End of ASTNodeEqual - - }; //End of Class ASTNode - -}; //end of namespace -#endif diff --git a/src/vendor/stp/src/AST/ASTSymbol.cpp b/src/vendor/stp/src/AST/ASTSymbol.cpp deleted file mode 100644 index 59a1d7aca..000000000 --- a/src/vendor/stp/src/AST/ASTSymbol.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "AST.h" -#include "../STPManager/STP.h" -namespace BEEV -{ - const ASTVec ASTSymbol::empty_children; - - - /**************************************************************** - * ASTSymbol Member Function definitions * - ****************************************************************/ - - // Get the name of the symbol - const char * ASTSymbol::GetName() const - { - return _name; - }//End of GetName() - - // Print function for symbol -- return name. (c_friendly is for - // printing hex. numbers that C compilers will accept) - void ASTSymbol::nodeprint(ostream& os, bool c_friendly) - { - os << _name; - } //end of nodeprint() - - // Call this when deleting a node that has been stored in the the - // unique table - void ASTSymbol::CleanUp() - { - (ParserBM)->_symbol_unique_table.erase(this); - free((char*) this->_name); - delete this; - }//End of cleanup() - - unsigned long long hash(unsigned char *str) - { - unsigned long long hash = 5381; - long long c; - - while ((c = *str++)) - hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ - - //cout << "Hash value computed is: " << hash << endl; - - return (unsigned long long)hash; - } - -};//end of namespace diff --git a/src/vendor/stp/src/AST/ASTSymbol.h b/src/vendor/stp/src/AST/ASTSymbol.h deleted file mode 100644 index 32e3232be..000000000 --- a/src/vendor/stp/src/AST/ASTSymbol.h +++ /dev/null @@ -1,130 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef ASTSYMBOL_H -#define ASTSYMBOL_H - -namespace BEEV -{ - unsigned long long hash(unsigned char *str); - - /****************************************************************** - * Class ASTSymbol: * - * * - * Class to represent internals of Symbol node. * - ******************************************************************/ - class ASTSymbol : public ASTInternal - { - friend class STPMgr; - friend class ASTNode; - friend class ASTNodeHasher; - friend class ASTNodeEqual; - - const static ASTVec empty_children; - - private: - /**************************************************************** - * Private Data * - ****************************************************************/ - - // The name of the symbol - const char * const _name; - - /**************************************************************** - * Class ASTSymbolHasher: * - * * - * Hasher for ASTSymbol nodes * - ****************************************************************/ - class ASTSymbolHasher - { - public: - size_t operator()(const ASTSymbol *sym_ptr) const - { -#ifdef TR1_UNORDERED_MAP - std::hash h; -#else - //hash h; -#endif - //return h(sym_ptr->_name); - //cerr << "ASTSymbol hasher recieved name: " - //<< sym_ptr->_name << endl; - return (size_t)hash((unsigned char*)(sym_ptr->_name)); - }; - }; // End of class ASTSymbolHasher - - /**************************************************************** - * Class ASTSymbolEqual: * - * * - * Equality for ASTSymbol nodes * - ****************************************************************/ - class ASTSymbolEqual - { - public: - bool operator()(const ASTSymbol *sym_ptr1, - const ASTSymbol *sym_ptr2) const - { - return (*sym_ptr1 == *sym_ptr2); - } - }; // End of class ASTSymbolEqual - - // comparator - friend bool operator==(const ASTSymbol &sym1, - const ASTSymbol &sym2) - { - return (strcmp(sym1._name, sym2._name) == 0); - } - - /**************************************************************** - * Private Member Functions * - ****************************************************************/ - - // Get the name of the symbol - const char * GetName() const; - - // Print function for symbol -- return name. (c_friendly is for - // printing hex. numbers that C compilers will accept) - virtual void nodeprint(ostream& os, bool c_friendly = false); - - // Call this when deleting a node that has been stored in the the - // unique table - virtual void CleanUp(); - - public: - - virtual ASTVec const &GetChildren() const - { - return empty_children; - } - - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - - // Constructor. This does NOT copy its argument. - ASTSymbol(const char * const name) : - ASTInternal(SYMBOL), _name(name) - { - } - - // Destructor (does nothing, but is declared virtual here. - virtual ~ASTSymbol() - { - } - - // Copy constructor - ASTSymbol(const ASTSymbol &sym) : - ASTInternal(sym._kind), _name(sym._name) - { - //printf("inside ASTSymbol constructor %s\n", _name); - } - }; //End of ASTSymbol -}; //end of namespace -#endif diff --git a/src/vendor/stp/src/AST/ASTUtil.cpp b/src/vendor/stp/src/AST/ASTUtil.cpp deleted file mode 100644 index c0b4e88dc..000000000 --- a/src/vendor/stp/src/AST/ASTUtil.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "UsefulDefs.h" -#include "../STPManager/STPManager.h" -#include "../main/Globals.h" -namespace BEEV -{ - ostream &operator<<(ostream &os, const Spacer &sp) - { - // Instead of wrapping lines with hundreds of spaces, prints - // a "+" at the beginning of the line for each wrap-around. - // so lines print like: +14+ (XOR ... - int blanks = sp._spaces % 60; - int wraps = sp._spaces / 60; - if (wraps > 0) - { - os << "+" << wraps; - } - for (int i = 0; i < blanks; i++) - os << " "; - return os; - } - - //this function accepts the name of a function (as a char *), and - //records some stats about it. if the input is "print_func_stats", - //the function will then print the stats that it has collected. - void CountersAndStats(const char * functionname, STPMgr * bm) - { - static function_counters s; - if (bm->UserFlags.stats_flag) - { - - if (!strcmp(functionname, "print_func_stats")) - { - cout << endl; - for (function_counters::iterator - it = s.begin(), itend = s.end(); - it != itend; it++) - cout << "Number of times the function: " - << it->first - << ": is called: " - << it->second << endl; - return; - } - s[functionname] += 1; - - } - } -} -;// end of namespace diff --git a/src/vendor/stp/src/AST/ASTmisc.cpp b/src/vendor/stp/src/AST/ASTmisc.cpp deleted file mode 100644 index aecb98c4c..000000000 --- a/src/vendor/stp/src/AST/ASTmisc.cpp +++ /dev/null @@ -1,603 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "AST.h" -#include "../STPManager/STPManager.h" -#include "../STPManager/NodeIterator.h" - -namespace BEEV -{ - - /**************************************************************** - * Universal Helper Functions * - ****************************************************************/ - - void process_argument(const char ch, STPMgr *bm) - { - switch(ch) - { - case 'a' : - bm->UserFlags.optimize_flag = false; - break; - case 'c': - bm->UserFlags.construct_counterexample_flag = true; - break; - case 'd': - bm->UserFlags.construct_counterexample_flag = true; - bm->UserFlags.check_counterexample_flag = true; - break; - - case 'h': - fprintf(stderr,usage,prog); - cout << helpstring; - exit(-1); - break; - case 'm': - bm->UserFlags.smtlib1_parser_flag=true; - bm->UserFlags.division_by_zero_returns_one_flag = true; - if (bm->UserFlags.smtlib2_parser_flag) - FatalError("Can't use both the smtlib and smtlib2 parsers"); - break; - case 'n': - bm->UserFlags.print_output_flag = true; - break; - case 'p': - bm->UserFlags.print_counterexample_flag = true; - break; - case 'q': - bm->UserFlags.print_arrayval_declaredorder_flag = true; - break; - case 'r': - bm->UserFlags.ackermannisation = true; - break; - case 's' : - bm->UserFlags.stats_flag = true; - break; - case 't': - bm->UserFlags.quick_statistics_flag = true; - break; - case 'v' : - bm->UserFlags.print_nodes_flag = true; - break; - case 'w': - bm->UserFlags.wordlevel_solve_flag = false; - break; - case 'x': - bm->UserFlags.xor_flatten_flag = true; - break; - case 'y': - bm->UserFlags.print_binary_flag = true; - break; - case 'z': - bm->UserFlags.print_sat_varorder_flag = true; - break; - default: - fprintf(stderr,usage,prog); - cout << helpstring; - exit(-1); - break; - } - } - - // Sort ASTNodes by expression numbers - bool exprless(const ASTNode n1, const ASTNode n2) - { - return (n1.GetNodeNum() < n2.GetNodeNum()); - } - - // This is for sorting by arithmetic expressions (for - // combining like terms, etc.) - bool arithless(const ASTNode n1, const ASTNode n2) - { - Kind k1 = n1.GetKind(); - Kind k2 = n2.GetKind(); - - if (n1 == n2) - { - // necessary for "strict weak ordering" - return false; - } - else if (BVCONST == k1 && BVCONST != k2) - { - // put consts first - return true; - } - else if (BVCONST != k1 && BVCONST == k2) - { - // put consts first - return false; - } - else if (SYMBOL == k1 && SYMBOL != k2) - { - // put symbols next - return true; - } - else if (SYMBOL != k1 && SYMBOL == k2) - { - // put symbols next - return false; - } - else - { - // otherwise, sort by exprnum (descendents will appear - // before ancestors). - return (n1.GetNodeNum() < n2.GetNodeNum()); - } - } //end of arithless - - - // counts the number of reads. Shortcut when we get to the limit. - void - numberOfReadsLessThan(const ASTNode& n, hash_set & visited, int& soFar, const int limit) - { - if (n.isAtom()) - return; - - if (visited.find(n.GetNodeNum()) != visited.end()) - return; - - if (n.GetKind() == READ) - soFar++; - - if (soFar > limit) - return; - - visited.insert(n.GetNodeNum()); - - for (int i = 0; i < n.Degree(); i++) - numberOfReadsLessThan(n[i], visited, soFar,limit); - } - - // True if the number of reads in "n" is less than "limit" - bool - numberOfReadsLessThan(const ASTNode&n, int limit) - { - hash_set visited; - int reads = 0; - numberOfReadsLessThan(n, visited, reads,limit); - return reads < limit; - } - - - // True if any descendants are arrays. - bool - containsArrayOps(const ASTNode&n) - { - - NodeIterator ni(n, n.GetSTPMgr()->ASTUndefined, *n.GetSTPMgr()); - ASTNode current; - while ((current = ni.next()) != ni.end()) - if (current.GetIndexWidth()>0) - return true; - - return false; - } - - bool isCommutative(const Kind k) { - switch (k) { - case BVOR: - case BVAND: - case BVXOR: - case BVNAND: - case BVNOR: - case BVXNOR: - case BVPLUS: - case BVMULT: - case EQ: - case AND: - case OR: - case NAND: - case NOR: - case XOR: - case IFF: - case BVNEG: - case NOT: - case BVUMINUS: - return true; - default: - return false; - } - - return false; -} - - - void FatalError(const char * str, const ASTNode& a, int w) - { - if (a.GetKind() != UNDEFINED) - { - cerr << "Fatal Error: " << str << endl << a << endl; - cerr << w << endl; - } - else - { - cerr << "Fatal Error: " << str << endl; - cerr << w << endl; - } - if (vc_error_hdlr) - vc_error_hdlr(str); - assert(0); // gdb will stop here giving a stacktrace. - exit(-1); - } - - void FatalError(const char * str) - { - cerr << "Fatal Error: " << str << endl; - if (vc_error_hdlr) - vc_error_hdlr(str); - assert(0); - exit(-1); - - } - - void SortByExprNum(ASTVec& v) - { - sort(v.begin(), v.end(), exprless); - } - - void SortByArith(ASTVec& v) - { - sort(v.begin(), v.end(), arithless); - } - - bool isAtomic(Kind kind) - { - if (TRUE == kind || FALSE == kind || - EQ == kind || - BVLT == kind || BVLE == kind || - BVGT == kind || BVGE == kind || - BVSLT == kind || BVSLE == kind || - BVSGT == kind || BVSGE == kind || - SYMBOL == kind || BVGETBIT == kind) - return true; - return false; - } - - - // If there is a lot of sharing in the graph, this will take a long - // time. it doesn't mark subgraphs as already having been - // typechecked. - bool BVTypeCheckRecursive(const ASTNode& n) - { - const ASTVec& c = n.GetChildren(); - - BVTypeCheck(n); - - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - BVTypeCheckRecursive(*it); - - return true; - } - - void buildListOfSymbols(const ASTNode& n, ASTNodeSet& visited, - ASTNodeSet& symbols) - { - if (visited.find(n) != visited.end()) - return; // already visited. - - visited.insert(n); - - if (n.GetKind() == SYMBOL) - { - symbols.insert(n); - } - - for (unsigned i = 0; i < n.GetChildren().size(); i++) - buildListOfSymbols(n[i], visited, symbols); - } - - - void checkChildrenAreBV(const ASTVec& v, const ASTNode&n) { - for (ASTVec::const_iterator it = v.begin(), itend = v.end(); it != itend; it++) - if (BITVECTOR_TYPE != it->GetType()) { - cerr << "The type is: " << it->GetType() << endl; - FatalError( - "BVTypeCheck:ChildNodes of bitvector-terms must be bitvectors\n", - n); - } -} - - void FlattenKind(const Kind k, const ASTVec &children, ASTVec & flat_children) - { - ASTVec::const_iterator ch_end = children.end(); - for (ASTVec::const_iterator it = children.begin(); it != ch_end; it++) - { - Kind ck = it->GetKind(); - if (k == ck) - { - FlattenKind(k,it->GetChildren(), flat_children); - } - else - { - flat_children.push_back(*it); - } - } - } - - // Flatten (k ... (k ci cj) ...) to (k ... ci cj ...) - ASTVec FlattenKind(Kind k, const ASTVec &children) - { - ASTVec flat_children; - FlattenKind(k,children,flat_children); - return flat_children; - } - - - /* FUNCTION: Typechecker for terms and formulas - * - * TypeChecker: Assumes that the immediate Children of the input - * ASTNode have been typechecked. This function is suitable in - * scenarios like where you are building the ASTNode Tree, and you - * typecheck as you go along. It is not suitable as a general - * typechecker. - * - * If this returns, this ALWAYS returns true. If there is an error it - * will call FatalError() and abort. - */ - bool BVTypeCheck(const ASTNode& n) - { - Kind k = n.GetKind(); - //The children of bitvector terms are in turn bitvectors. - const ASTVec& v = n.GetChildren(); - if (is_Term_kind(k)) - { - switch (k) - { - case BVCONST: - if (BITVECTOR_TYPE != n.GetType()) - FatalError("BVTypeCheck: The term t does not typecheck, where t = \n", n); - break; - case SYMBOL: - return true; - case ITE: - if (n.Degree() != 3) - FatalError("BVTypeCheck: should have exactly 3 args\n", n); - if (BOOLEAN_TYPE != n[0].GetType() || (n[1].GetType() != n[2].GetType())) - FatalError("BVTypeCheck: The term t does not typecheck, where t = \n", n); - if (n[1].GetValueWidth() != n[2].GetValueWidth()) - FatalError("BVTypeCheck: length of THENbranch != length of ELSEbranch in the term t = \n", n); - if (n[1].GetIndexWidth() != n[2].GetIndexWidth()) - FatalError("BVTypeCheck: length of THENbranch != length of ELSEbranch in the term t = \n", n); - break; - case READ: - if (n.GetChildren().size() !=2) - FatalError("2 params to read."); - if (n[0].GetIndexWidth() != n[1].GetValueWidth()) - { - cerr << "Length of indexwidth of array: " << n[0] << " is : " << n[0].GetIndexWidth() << endl; - cerr << "Length of the actual index is: " << n[1] << " is : " << n[1].GetValueWidth() << endl; - FatalError("BVTypeCheck: length of indexwidth of array != length of actual index in the term t = \n", n); - } - if (ARRAY_TYPE != n[0].GetType()) - FatalError("First parameter to read should be an array", n[0]); - if (BITVECTOR_TYPE != n[1].GetType()) - FatalError("Second parameter to read should be a bitvector", n[1]); - break; - case WRITE: - if (n.GetChildren().size() !=3) - FatalError("3 params to write."); - if (n[0].GetIndexWidth() != n[1].GetValueWidth()) - FatalError("BVTypeCheck: length of indexwidth of array != length of actual index in the term t = \n", n); - if (n[0].GetValueWidth() != n[2].GetValueWidth()) - FatalError("BVTypeCheck: valuewidth of array != length of actual value in the term t = \n", n); - if (ARRAY_TYPE != n[0].GetType()) - FatalError("First parameter to read should be an array", n[0]); - if (BITVECTOR_TYPE != n[1].GetType()) - FatalError("Second parameter to read should be a bitvector", n[1]); - if (BITVECTOR_TYPE != n[2].GetType()) - FatalError("Third parameter to read should be a bitvector", n[2]); - - break; - - case BVDIV: - case BVMOD: - case BVSUB: - - case SBVDIV: - case SBVREM: - case SBVMOD: - - case BVLEFTSHIFT: - case BVRIGHTSHIFT: - case BVSRSHIFT: - case BVVARSHIFT: - if (n.Degree() != 2) - FatalError("BVTypeCheck: should have exactly 2 args\n", n); - // run on. - case BVOR: - case BVAND: - case BVXOR: - case BVNOR: - case BVNAND: - case BVXNOR: - - case BVPLUS: - case BVMULT: - { - if (!(v.size() >= 2)) - FatalError("BVTypeCheck:bitwise Booleans and BV arith operators must have at least two arguments\n", n); - unsigned int width = n.GetValueWidth(); - for (ASTVec::const_iterator it = v.begin(), itend = v.end(); it != itend; it++) - { - if (width != it->GetValueWidth()) - { - cerr << "BVTypeCheck:Operands of bitwise-Booleans and BV arith operators must be of equal length\n"; - cerr << n << endl; - cerr << "width of term:" << width << endl; - cerr << "width of offending operand:" << it->GetValueWidth() << endl; - FatalError("BVTypeCheck:Offending operand:\n", *it); - } - if (BITVECTOR_TYPE != it->GetType()) - FatalError("BVTypeCheck: ChildNodes of bitvector-terms must be bitvectors\n", n); - } - break; - } - case BVSX: - case BVZX: - //in BVSX(n[0],len), the length of the BVSX term must be - //greater than the length of n[0] - if (n[0].GetValueWidth() > n.GetValueWidth()) { - FatalError( - "BVTypeCheck: BV[SZ]X(t,bv[sz]x_len) : length of 't' must be <= bv[sz]x_len\n", - n); - } - if ((v.size() != 2)) - FatalError( - "BVTypeCheck:BV[SZ]X must have two arguments. The second is the new width\n", - n); - break; - - case BVCONCAT: - checkChildrenAreBV(v, n); - if (n.Degree() != 2) - FatalError("BVTypeCheck: should have exactly 2 args\n", n); - if (n.GetValueWidth() != n[0].GetValueWidth() - + n[1].GetValueWidth()) - FatalError("BVTypeCheck:BVCONCAT: lengths do not add up\n", n); - break; - case BVUMINUS: - case BVNEG: - checkChildrenAreBV(v, n); - if (n.Degree() != 1) - FatalError("BVTypeCheck: should have exactly 1 args\n", n); - if (n.GetValueWidth() != n[0].GetValueWidth()) - FatalError("BVTypeCheck: should have same value width\n", n); - break; - case BVEXTRACT: - checkChildrenAreBV(v, n); - if (n.Degree() != 3) - FatalError("BVTypeCheck: should have exactly 3 args\n", n); - if (!(BVCONST == n[1].GetKind() && BVCONST == n[2].GetKind())) - FatalError("BVTypeCheck: indices should be BVCONST\n", n); - if (n.GetValueWidth() != n[1].GetUnsignedConst() - - n[2].GetUnsignedConst() + 1) - FatalError("BVTypeCheck: length mismatch\n", n); - if (n[1].GetUnsignedConst() >= n[0].GetValueWidth()) - FatalError( - "BVTypeCheck: Top index of select is greater or equal to the bitwidth.\n", - n); - break; - default: - cerr << _kind_names[k]; - FatalError("No type checking for type"); - break; - } - } - else - { - if (!(is_Form_kind(k) && BOOLEAN_TYPE == n.GetType())) - FatalError("BVTypeCheck: not a formula:", n); - switch (k) - { - case TRUE: - case FALSE: - case SYMBOL: - return true; - case PARAMBOOL: - if(2 != n.Degree()) - FatalError("BVTypeCheck: PARAMBOOL formula can have exactly two childNodes", n); - break; - case EQ: - if (n.Degree() != 2) - FatalError("BVTypeCheck: should have exactly 2 args\n", n); - if (!(n[0].GetValueWidth() == n[1].GetValueWidth() && n[0].GetIndexWidth() == n[1].GetIndexWidth())) - { - cerr << "valuewidth of lhs of EQ: " << n[0].GetValueWidth() << endl; - cerr << "valuewidth of rhs of EQ: " << n[1].GetValueWidth() << endl; - cerr << "indexwidth of lhs of EQ: " << n[0].GetIndexWidth() << endl; - cerr << "indexwidth of rhs of EQ: " << n[1].GetIndexWidth() << endl; - FatalError("BVTypeCheck: terms in atomic formulas must be of equal length", n); - } - break; - case BVLT: - case BVLE: - case BVGT: - case BVGE: - case BVSLT: - case BVSLE: - case BVSGT: - case BVSGE: - if (n.Degree() != 2) - FatalError("BVTypeCheck: should have exactly 2 args\n", n); - if (BITVECTOR_TYPE != n[0].GetType() && BITVECTOR_TYPE != n[1].GetType()) - FatalError("BVTypeCheck: terms in atomic formulas must be bitvectors", n); - if (n[0].GetValueWidth() != n[1].GetValueWidth()) - FatalError("BVTypeCheck: terms in atomic formulas must be of equal length", n); - if (n[0].GetIndexWidth() != n[1].GetIndexWidth()) - FatalError("BVTypeCheck: terms in atomic formulas must be of equal length", n); - break; - case NOT: - if (1 != n.Degree()) - FatalError("BVTypeCheck: NOT formula can have exactly one childNode", n); - break; - case AND: - case OR: - case XOR: - case NAND: - case NOR: - if (2 > n.Degree()) - FatalError("BVTypeCheck: AND/OR/XOR/NAND/NOR: must have atleast 2 ChildNodes", n); - break; - case IFF: - case IMPLIES: - if (2 != n.Degree()) - FatalError("BVTypeCheck:IFF/IMPLIES must have exactly 2 ChildNodes", n); - break; - case ITE: - if (3 != n.Degree()) - FatalError("BVTypeCheck:ITE must have exactly 3 ChildNodes", n); - break; - default: - FatalError("BVTypeCheck: Unrecognized kind: "); - break; - } - } - return true; - } //End of TypeCheck function - - // callback for SIGALRM. - void handle_time_out(int parameter){ - printf("Timed Out.\n"); - - abort(); - // I replaced the exit(0) with an abort(). - // The exit was sometimes hanging, seemingly because of a bug somewhere else (e.g. loader, glibc). - // In strace it output: - - //--- SIGVTALRM (Virtual timer expired) @ 0 (0) --- - //fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 5), ...}) = 0 - //mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fabca622000 - //write(1, "Timed Out.\n", 11Timed Out. - //) = 11 - //futex(0x7fabc9c54e40, FUTEX_WAIT, 2, NULL - - // Then it would just sit there waiting for the mutex (which never came). - //exit(0); - } - - - itimerval timeout; - void setHardTimeout(int sec) - { - signal(SIGVTALRM, handle_time_out); - timeout.it_interval.tv_usec = 0; - timeout.it_interval.tv_sec = 0; - timeout.it_value.tv_usec = 0; - timeout.it_value.tv_sec = sec; - setitimer(ITIMER_VIRTUAL, &timeout, NULL); - } - - long getCurrentTime() - { - timeval t; - gettimeofday(&t, NULL); - return (1000 * t.tv_sec) + (t.tv_usec / 1000); - } - -};//end of namespace diff --git a/src/vendor/stp/src/AST/ArrayTransformer.cpp b/src/vendor/stp/src/AST/ArrayTransformer.cpp deleted file mode 100644 index 0507c7a44..000000000 --- a/src/vendor/stp/src/AST/ArrayTransformer.cpp +++ /dev/null @@ -1,783 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -/* Transform: - * - * Converts signed Div/signed remainder/signed modulus into their - * unsigned counterparts. Removes array selects and stores from - * formula. Arrays are replaced by equivalent bit-vector variables - */ -#include "ArrayTransformer.h" -#include -#include "../simplifier/simplifier.h" -#include -#include -#include -#include - - -namespace BEEV -{ - // NB: This is the only function that should be called - // externally. It sets up the cache that the others use. - ASTNode ArrayTransformer::TransformFormula_TopLevel(const ASTNode& form) - { - runTimes->start(RunTimes::Transforming); - - assert(TransformMap == NULL); - assert(form.GetSTPMgr() == this->bm); - TransformMap = new ASTNodeMap(100); - ASTNode result = TransformFormula(form); - -#if 0 - { - ASTNodeSet visited; - assertTransformPostConditions(result,visited); - } -#endif - - TransformMap->clear(); - delete TransformMap; - TransformMap = NULL; - - if (bm->UserFlags.stats_flag) - printArrayStats(); - - // This establishes equalities between every indexes, and a fresh variable. - if (!bm->UserFlags.ackermannisation) - { - ASTNodeMap replaced; - - ASTVec equalsNodes; - for (ArrayTransformer::ArrType::iterator - iset = arrayToIndexToRead.begin(), - iset_end = arrayToIndexToRead.end(); - iset != iset_end; iset++) - { - const ASTNode& ArrName = iset->first; - map& mapper = iset->second; - - for (map::iterator it =mapper.begin() ; it != mapper.end();it++) - { - const ASTNode& the_index = it->first; - - if (the_index.isConstant() || the_index.GetKind() == SYMBOL) - { - it->second.index_symbol = the_index; - } - else if (replaced.find(the_index) != replaced.end()) // Already associated with a variable. - { - it->second.index_symbol = replaced.find(the_index)->second; - } - else - { - ASTNode newV = bm->CreateFreshVariable(0,the_index.GetValueWidth(), "STP__IndexVariables"); - equalsNodes.push_back(nf->CreateNode(EQ, the_index, newV)); - replaced.insert(make_pair(the_index,newV)); - it->second.index_symbol = newV; - } - assert(it->second.index_symbol.GetValueWidth() == the_index.GetValueWidth()); - } - } - - runTimes->stop(RunTimes::Transforming); - - if (equalsNodes.size() > 0) - return nf->CreateNode(AND, result, equalsNodes); - else - return result; - } - else - { - runTimes->stop(RunTimes::Transforming); - return result; - } - } - - //Translates signed BVDIV,BVMOD and BVREM into unsigned variety - ASTNode ArrayTransformer::TranslateSignedDivModRem(const ASTNode& in, NodeFactory* nf, STPMgr *bm) - { - assert(in.GetChildren().size() ==2); - - const ASTNode& dividend = in[0]; - const ASTNode& divisor = in[1]; - const unsigned len = in.GetValueWidth(); - - ASTNode hi1 = bm->CreateBVConst(32, len - 1); - ASTNode one = bm->CreateOneConst(1); - ASTNode zero = bm->CreateZeroConst(1); - // create the condition for the dividend - ASTNode cond_dividend = - nf->CreateNode(EQ, one, nf->CreateTerm(BVEXTRACT, 1, dividend, hi1, hi1)); - // create the condition for the divisor - ASTNode cond_divisor = - nf->CreateNode(EQ, one, - nf->CreateTerm(BVEXTRACT, 1, divisor, hi1, hi1)); - - if (SBVREM == in.GetKind()) - { - //BVMOD is an expensive operation. So have the fewest bvmods - //possible. Just one. - - //Take absolute value. - ASTNode pos_dividend = - nf->CreateTerm(ITE, len, - cond_dividend, - nf->CreateTerm(BVUMINUS, len, dividend), - dividend); - ASTNode pos_divisor = - nf->CreateTerm(ITE, len, - cond_divisor, - nf->CreateTerm(BVUMINUS, len, divisor), - divisor); - - //create the modulus term - ASTNode modnode = - nf->CreateTerm(BVMOD, len, - pos_dividend, pos_divisor); - - //If the dividend is <0 take the unary minus. - ASTNode n = - nf->CreateTerm(ITE, len, - cond_dividend, - nf->CreateTerm(BVUMINUS, len, modnode), - modnode); - return n; - } - - // This is the modulus of dividing rounding to -infinity. - else if (SBVMOD == in.GetKind()) - { - - /* - (bvsmod s t) abbreviates - (let ((?msb_s ((_ extract |m-1| |m-1|) s)) - (?msb_t ((_ extract |m-1| |m-1|) t))) - (let ((abs_s (ite (= ?msb_s #b0) s (bvneg s))) - (abs_t (ite (= ?msb_t #b0) t (bvneg t)))) - (let ((u (bvurem abs_s abs_t))) - (ite (= u (_ bv0 m)) - u - (ite (and (= ?msb_s #b0) (= ?msb_t #b0)) - u - (ite (and (= ?msb_s #b1) (= ?msb_t #b0)) - (bvadd (bvneg u) t) - (ite (and (= ?msb_s #b0) (= ?msb_t #b1)) - (bvadd u t) - (bvneg u)))))))) - */ - - //Take absolute value. - ASTNode pos_dividend = - nf->CreateTerm(ITE, len, - cond_dividend, - nf->CreateTerm(BVUMINUS, len, dividend), - dividend); - ASTNode pos_divisor = - nf->CreateTerm(ITE, len, - cond_divisor, - nf->CreateTerm(BVUMINUS, len, divisor), - divisor); - - ASTNode urem_node = - nf->CreateTerm(BVMOD, len, - pos_dividend, pos_divisor); - - // If the dividend is <0, then we negate the whole thing. - ASTNode rev_node = - nf->CreateTerm(ITE, len, - cond_dividend, - nf->CreateTerm(BVUMINUS, len, urem_node), - urem_node); - - // if It's XOR <0, and it doesn't perfectly divide, then add t (not its absolute value). - ASTNode xor_node = - nf->CreateNode(XOR, cond_dividend, cond_divisor); - ASTNode neZ = nf->CreateNode(NOT, nf->CreateNode(EQ, rev_node, bm->CreateZeroConst(divisor.GetValueWidth()))); - ASTNode cond = nf->CreateNode(AND,xor_node ,neZ); - ASTNode n = - nf->CreateTerm(ITE, len, - cond, - nf->CreateTerm(BVPLUS, len, rev_node, divisor), - rev_node); - - return n; - } - else if (SBVDIV == in.GetKind()) - { - //now handle the BVDIV case - //if topBit(dividend) is 1 and topBit(divisor) is 0 - // - //then output is -BVDIV(-dividend,divisor) - // - //elseif topBit(dividend) is 0 and topBit(divisor) is 1 - // - //then output is -BVDIV(dividend,-divisor) - // - //elseif topBit(dividend) is 1 and topBit(divisor) is 1 - // - // then output is BVDIV(-dividend,-divisor) - // - //else simply output BVDIV(dividend,divisor) - - //Take absolute value. - ASTNode pos_dividend = - nf->CreateTerm(ITE, len, - cond_dividend, - nf->CreateTerm(BVUMINUS, len, dividend), - dividend); - ASTNode pos_divisor = - nf->CreateTerm(ITE, len, - cond_divisor, - nf->CreateTerm(BVUMINUS, len, divisor), - divisor); - - ASTNode divnode = - nf->CreateTerm(BVDIV, len, pos_dividend, pos_divisor); - - // A little confusing. Only negate the result if they are XOR <0. - ASTNode xor_node = - nf->CreateNode(XOR, cond_dividend, cond_divisor); - ASTNode n = - nf->CreateTerm(ITE, len, - xor_node, - nf->CreateTerm(BVUMINUS, len, divnode), - divnode); - - return n; - } - - FatalError("TranslateSignedDivModRem:"\ - "input must be signed DIV/MOD/REM", in); - return bm->ASTUndefined; - - }//end of TranslateSignedDivModRem() - - // Check that the transformations have occurred. - void ArrayTransformer::assertTransformPostConditions(const ASTNode & term, ASTNodeSet& visited) - { - - // I haven't measure whether this is the quickest way to do it? - pair p = visited.insert(term); - if (!p.second) - return; - - const Kind k = term.GetKind(); - - // Check the array reads / writes have been removed - assert( READ !=k ); - assert( WRITE !=k); - - // There should be no nodes left of type array. - assert(0 == term.GetIndexWidth()); - - const ASTVec& c = term.GetChildren(); - ASTVec::const_iterator it = c.begin(); - const ASTVec::const_iterator itend = c.end(); - for (; it != itend; it++) - { - assertTransformPostConditions(*it,visited); - } - }//End of assertTransformPostConditions() - - /******************************************************** - * TransformFormula() - * - * Get rid of DIV/MODs, ARRAY read/writes, FOR constructs - ********************************************************/ - ASTNode ArrayTransformer::TransformFormula(const ASTNode& simpleForm) - { - assert(TransformMap != NULL); - - const Kind k = simpleForm.GetKind(); - if (!(is_Form_kind(k) && BOOLEAN_TYPE == simpleForm.GetType())) - { - //FIXME: "You have inputted a NON-formula"? - FatalError("TransformFormula:"\ - "You have input a NON-formula", simpleForm); - } - - ASTNodeMap::const_iterator iter; - if ((iter = TransformMap->find(simpleForm)) != TransformMap->end()) - return iter->second; - - ASTNode result; - - switch (k) - { - case TRUE: - case FALSE: - { - result = simpleForm; - break; - } - case NOT: - { - ASTVec c; - c.push_back(TransformFormula(simpleForm[0])); - result = nf->CreateNode(NOT, c); - break; - } - case BVLT: - case BVLE: - case BVGT: - case BVGE: - case BVSLT: - case BVSLE: - case BVSGT: - case BVSGE: - { - ASTVec c; - c.push_back(TransformTerm(simpleForm[0])); - c.push_back(TransformTerm(simpleForm[1])); - result = nf->CreateNode(k, c); - break; - } - case EQ: - { - ASTNode term1 = TransformTerm(simpleForm[0]); - ASTNode term2 = TransformTerm(simpleForm[1]); - if (bm->UserFlags.optimize_flag) - result = simp->CreateSimplifiedEQ(term1, term2); - else - result = nf->CreateNode(EQ,term1, term2); - break; - } - case AND: // These could shortcut. Not sure if the extra effort is justified. - case OR: - case NAND: - case NOR: - case IFF: - case XOR: - case ITE: - case IMPLIES: - { - ASTVec vec; - vec.reserve(simpleForm.Degree()); - - for (ASTVec::const_iterator - it = simpleForm.begin(), - itend = simpleForm.end(); it != itend; it++) - { - vec.push_back(TransformFormula(*it)); - } - - result = nf->CreateNode(k, vec); - break; - } - case PARAMBOOL: - { - //If the parameteric boolean variable is of the form - //VAR(const), then convert it into a Boolean variable of the - //form "VAR(const)". - // - //Else if the paramteric boolean variable is of the form - //VAR(expression), then simply return it - if(BVCONST == simpleForm[1].GetKind()) - { - result = - bm->NewParameterized_BooleanVar(simpleForm[0],simpleForm[1]); - } - else - { - result = simpleForm; - } - break; - } - default: - { - if (k == SYMBOL && BOOLEAN_TYPE == simpleForm.GetType()) - result = simpleForm; - else - { - FatalError("TransformFormula: Illegal kind: ", - ASTUndefined, k); - cerr << "The input is: " << simpleForm << endl; - cerr << "The valuewidth of input is : " - << simpleForm.GetValueWidth() << endl; - } - break; - } - } //end of Switch - - assert(!result.IsNull()); - if (simpleForm.Degree() > 0) - (*TransformMap)[simpleForm] = result; - return result; - } //End of TransformFormula - - - ASTNode ArrayTransformer::TransformTerm(const ASTNode& term) - { - assert(TransformMap != NULL); - - const Kind k = term.GetKind(); - if (!is_Term_kind(k)) - FatalError("TransformTerm: Illegal kind: You have input a nonterm:", - term, k); - ASTNodeMap::const_iterator iter; - if ((iter = TransformMap->find(term)) != TransformMap->end()) - return iter->second; - - ASTNode result; - switch (k) - { - case SYMBOL: - case BVCONST: - { - result = term; - break; - } - case WRITE: - FatalError("TransformTerm: this kind is not supported", term); - break; - case READ: - result = TransformArrayRead(term); - break; - case ITE: - { - ASTNode cond = term[0]; - ASTNode thn = term[1]; - ASTNode els = term[2]; - cond = TransformFormula(cond); - if (ASTTrue == cond) - result = TransformTerm(thn); - else if (ASTFalse == cond) - result = TransformTerm(els); - else - { - thn = TransformTerm(thn); - els = TransformTerm(els); - if (bm->UserFlags.optimize_flag) - result = simp->CreateSimplifiedTermITE(cond, thn, els); - else - result = nf->CreateTerm(ITE, thn.GetValueWidth(), cond, thn, els); - } - assert(result.GetIndexWidth() ==term.GetIndexWidth()); - break; - } - default: - { - const ASTVec& c = term.GetChildren(); - ASTVec::const_iterator it = c.begin(); - ASTVec::const_iterator itend = c.end(); - const unsigned width = term.GetValueWidth(); - const unsigned indexwidth = term.GetIndexWidth(); - ASTVec o; - o.reserve(c.size()); - for (; it != itend; it++) - { - o.push_back(TransformTerm(*it)); - } - - if (c!=o) - { - result = nf->CreateArrayTerm(k,indexwidth, width, o); - } - else - result = term; - } - break; - } - - if (term.Degree() > 0) - (*TransformMap)[term] = result; - if (term.GetValueWidth() != result.GetValueWidth()) - FatalError("TransformTerm: "\ - "result and input terms are of different length", result); - if (term.GetIndexWidth() != result.GetIndexWidth()) - { - cerr << "TransformTerm: input term is : " << term << endl; - FatalError("TransformTerm: "\ - "result & input terms have different index length", result); - } - return result; - } //End of TransformTerm - - /* This function transforms Array Reads, Read over Writes, Read over - * ITEs into flattened form. - * - * Transform1: Suppose there are two array reads in the input - * Read(A,i) and Read(A,j) over the same array. Then Read(A,i) is - * replaced with a symbolic constant, say v1, and Read(A,j) is - * replaced with the following ITE: - * - * ITE(i=j,v1,v2) - * - */ - ASTNode ArrayTransformer::TransformArrayRead(const ASTNode& term) - { - assert(TransformMap != NULL); - - const unsigned int width = term.GetValueWidth(); - - if (READ != term.GetKind()) - return term; - - ASTNodeMap::const_iterator iter; - if ((iter = TransformMap->find(term)) != TransformMap->end()) - return iter->second; - - //'term' is of the form READ(arrName, readIndex) - const ASTNode & arrName = term[0]; - const ASTNode & readIndex = TransformTerm(term[1]); - - ASTNode result; - - switch (arrName.GetKind()) - { - case SYMBOL: - { - /* input is of the form: READ(A, readIndex) - * - * output is of the from: A1, if this is the first READ over A - * - * ITE(previous_readIndex=readIndex,A1,A2) - * - * ..... - */ - - { - ArrType::const_iterator it; - if ((it = arrayToIndexToRead.find(arrName)) != arrayToIndexToRead.end()) - { - map::const_iterator it2; - if ((it2 = it->second.find(readIndex)) != it->second.end()) - { - result = it2->second.ite; - break; - } - } - } - - // Make up a new abstract variable. Build symbolic name - // corresponding to array read. The symbolic name has 2 - // components: stringname, and a count - - ASTNode CurrentSymbol = bm->CreateFreshVariable( - term.GetIndexWidth(), - term.GetValueWidth(), - "array_" + string(arrName.GetName())); - - result = CurrentSymbol; - - if (!bm->UserFlags.ackermannisation) - { - // result is a variable here; it is an ite in the - // else-branch - } - else - { - // Full Array transform if we're not doing read refinement. - - //list of array-read indices corresponding to arrName, seen while - //traversing the AST tree. we need this list to construct the ITEs - const arrTypeMap& new_read_Indices = arrayToIndexToRead[arrName]; - - arrTypeMap::const_iterator it2 = new_read_Indices.begin(); - arrTypeMap::const_iterator it2end = new_read_Indices.end(); - for (; it2 != it2end; it2++) - { - ASTNode cond = simp->CreateSimplifiedEQ(readIndex, it2->first); - if (ASTFalse == cond) - continue; - - if (ASTTrue == cond) - { - result = it2->second.ite; - break; - } - - result = - simp->CreateSimplifiedTermITE(cond, it2->second.ite, result); - } - } - - assert(arrName.GetType() == ARRAY_TYPE); - arrayToIndexToRead[arrName].insert(make_pair(readIndex,ArrayRead (result, CurrentSymbol))); - break; - } //end of READ over a SYMBOL - case WRITE: - { - /* The input to this case is: READ((WRITE A i val) j) - * - * The output of this case is: ITE( (= i j) val (READ A j)) - */ - - /* 1. arrName or term[0] is infact a WRITE(A,i,val) expression - * - * 2. term[1] is the read-index j - * - * 3. arrName[0] is the new arrName i.e. A. A can be either a - SYMBOL or a nested WRITE. no other possibility - * - * 4. arrName[1] is the WRITE index i.e. i - * - * 5. arrName[2] is the WRITE value i.e. val (val can inturn - * be an array read) - */ - - ASTNode writeIndex = TransformTerm(arrName[1]); - ASTNode writeVal = TransformTerm(arrName[2]); - - if (ARRAY_TYPE != arrName[0].GetType()) - FatalError("TransformArray: "\ - "An array write is being attempted on a non-array:", - term); - - //if ((SYMBOL == arrName[0].GetKind() - //|| WRITE == arrName[0].GetKind())) - { - ASTNode cond = - simp->CreateSimplifiedEQ(writeIndex, readIndex); - assert(BVTypeCheck(cond)); - - // If the condition is true, it saves iteratively transforming through - // all the (possibly nested) arrays. - if (ASTTrue == cond) - { - result = writeVal; - } - else - { - ASTNode readTerm = - nf->CreateTerm(READ, width, arrName[0], readIndex); - assert(BVTypeCheck(readTerm)); - - // The simplifying node factory may have produced - // something that's not a READ. - ASTNode readPushedIn = TransformTerm(readTerm); - assert(BVTypeCheck(readPushedIn)); - - result = - simp->CreateSimplifiedTermITE(cond, writeVal, readPushedIn); - } - } - - // Trevor: I've removed this code because I don't see the advantage in working - // inside out. i.e. transforming read(write(ite(p,A,B),i,j),k), into - // read(ite(p,write(A,i,j),write(B,i,j),k). That is bringing up the ite. - // Without this code it will become: ite(i=k, j, read(ite(p,A,B),k)) - - #if 0 - else if (ITE == arrName[0].GetKind()) - { - // pull out the ite from the write // pushes the write - // through. - ASTNode writeTrue = - nf->CreateNode(WRITE, (arrName[0][1]), writeIndex, writeVal); - writeTrue.SetIndexWidth(writeIndex.GetValueWidth()); - writeTrue.SetValueWidth(writeVal.GetValueWidth()); - assert(ARRAY_TYPE == writeTrue.GetType()); - - ASTNode writeFalse = - nf->CreateNode(WRITE, (arrName[0][2]), writeIndex, writeVal); - writeFalse.SetIndexWidth(writeIndex.GetValueWidth()); - writeFalse.SetValueWidth(writeVal.GetValueWidth()); - assert(ARRAY_TYPE == writeFalse.GetType()); - - result = (writeTrue == writeFalse) ? - writeTrue : simp->CreateSimplifiedTermITE(TransformFormula(arrName[0][0]), - writeTrue, writeFalse); - result.SetIndexWidth(writeIndex.GetValueWidth()); - result.SetValueWidth(writeVal.GetValueWidth()); - assert(ARRAY_TYPE == result.GetType()); - - result = - nf->CreateTerm(READ, writeVal.GetValueWidth(), - result, readIndex); - BVTypeCheck(result); - result = TransformArrayRead(result); - } - else - FatalError("TransformArray: Write over bad type."); - #endif - break; - } //end of READ over a WRITE - case ITE: - { - /* READ((ITE cond thn els) j) - * - * is transformed into - * - * (ITE cond (READ thn j) (READ els j)) - */ - - // pull out the ite from the read // pushes the read through. - - //(ITE cond thn els) - - ASTNode cond = arrName[0]; - cond = TransformFormula(cond); - - const ASTNode& thn = arrName[1]; - const ASTNode& els = arrName[2]; - - //(READ thn j) - ASTNode thnRead = nf->CreateTerm(READ, width, thn, readIndex); - assert(BVTypeCheck(thnRead)); - - //(READ els j) - ASTNode elsRead = nf->CreateTerm(READ, width, els, readIndex); - assert(BVTypeCheck(elsRead)); - - /* We try to call TransformTerm only if necessary, because it - * introduces a new symbol for each read. The amount of work we - * need to do later is based on the square of the number of symbols. - */ - if (ASTTrue == cond) - { - result = TransformTerm(thnRead); - } - else if (ASTFalse == cond) - { - result = TransformTerm(elsRead); - } - else - { - thnRead = TransformTerm(thnRead); - elsRead = TransformTerm(elsRead); - - //(ITE cond (READ thn j) (READ els j)) - result = simp->CreateSimplifiedTermITE(cond, thnRead, elsRead); - } - break; - } - default: - FatalError("TransformArray: "\ - "The READ is NOT over SYMBOL/WRITE/ITE", term); - break; - } - - assert(BVTypeCheck(result)); - assert(!result.IsNull()); - (*TransformMap)[term] = result; - return result; - } //end of TransformArray() - - - //Since these arrayreads are being nuked and recorded in the - //substitutionmap, we have to also record the fact that each - //arrayread (e0 is of the form READ(Arr,const) here is represented - //by a BVCONST (e1). This is necessary for later Leibnitz Axiom - //generation - void ArrayTransformer::FillUp_ArrReadIndex_Vec(const ASTNode& e0, - const ASTNode& e1) - { - assert (e0.GetKind() == READ); - assert (e0[0].GetKind() == SYMBOL); - assert (e0[1].GetKind() == BVCONST); - assert (e1.GetKind() == BVCONST); - assert(arrayToIndexToRead[e0[0]].find(e0[1]) ==arrayToIndexToRead[e0[0]].end()); - - arrayToIndexToRead[e0[0]].insert(make_pair(e0[1],ArrayRead (e1, e1))); - } - - -} //end of namespace BEEV diff --git a/src/vendor/stp/src/AST/ArrayTransformer.h b/src/vendor/stp/src/AST/ArrayTransformer.h deleted file mode 100644 index d2bfcfb79..000000000 --- a/src/vendor/stp/src/AST/ArrayTransformer.h +++ /dev/null @@ -1,150 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef TRANSFORM_H -#define TRANSFORM_H - -#include "AST.h" -#include "../STPManager/STPManager.h" -#include "../AST/NodeFactory/SimplifyingNodeFactory.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - class Simplifier; - - class ArrayTransformer : boost::noncopyable - { - public: - - // These map from array and index to ITE and Symbol. - struct ArrayRead - { - ArrayRead(ASTNode _ite, ASTNode _symbol) - { - assert(! _symbol.IsNull()); - assert(_ite.GetValueWidth() == _symbol.GetValueWidth()); - assert ((SYMBOL == _symbol.GetKind() || BVCONST == _symbol.GetKind())); - - ite = _ite; - symbol = _symbol; - } - - ASTNode ite; // if not using refinement this will be the ITE for the read. Otherwise == symbol. - ASTNode symbol; // each read is allocated a distinct fresh variable. - ASTNode index_symbol; // A symbol constrained to equal the index expression. - }; - - // MAP: This maps from arrays to their indexes. - // This map is used by the TransformArray() - // function ,as well as the counter example, and refinement. - // This map is useful in converting array reads into - // nested ITE constructs. Suppose there are two array reads in the - // input Read(A,i) and Read(A,j). Then Read(A,i) is replaced with - // a symbolic constant, say v1, and Read(A,j) is replaced with the - // following ITE: ITE(i=j,v1,v2) - - typedef map arrTypeMap; - typedef map ArrType ; - ArrType arrayToIndexToRead; - - private: - - /**************************************************************** - * Private Typedefs and Data * - ****************************************************************/ - - // Handy defs - ASTNode ASTTrue, ASTFalse, ASTUndefined; - - - // Memo table used by the transformer while it is transforming the - // formulas and terms - ASTNodeMap* TransformMap; - - // Flag for debuggin the transformer - const bool debug_transform; - - // Ptr to an external simplifier - Simplifier * simp; - - // Ptr to STPManager - STPMgr * bm; - - // Ptr to class that records the runtimes for various parts of the - // code - RunTimes * runTimes; - - NodeFactory *nf; - - /**************************************************************** - * Private Member Functions * - ****************************************************************/ - - ASTNode TransformTerm(const ASTNode& inputterm); - void assertTransformPostConditions(const ASTNode & term, ASTNodeSet& visited); - - ASTNode TransformArrayRead(const ASTNode& term); - - ASTNode TransformFormula(const ASTNode& form); - - public: - static ASTNode TranslateSignedDivModRem(const ASTNode& in, NodeFactory*nf, STPMgr *bm); - - //fill the arrayname_readindices vector if e0 is a READ(Arr,index) - //and index is a BVCONST - void FillUp_ArrReadIndex_Vec(const ASTNode& e0, const ASTNode& e1); - - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - // Constructor - ArrayTransformer(STPMgr * bm, Simplifier* s) : - bm(bm), - simp(s), - debug_transform(0), - TransformMap(NULL) - { - nf = bm->defaultNodeFactory; - - runTimes = bm->GetRunTimes(); - ASTTrue = bm->CreateNode(TRUE); - ASTFalse = bm->CreateNode(FALSE); - ASTUndefined = bm->CreateNode(UNDEFINED); - } - - // Takes a formula, transforms it by replacing array reads with - // variables, and returns the transformed formula - ASTNode TransformFormula_TopLevel(const ASTNode& form); - - void ClearAllTables(void) - { - arrayToIndexToRead.clear(); - } - - void printArrayStats() - { - cerr << "Array Sizes:"; - - for (ArrType::const_iterator - iset = arrayToIndexToRead.begin(), - iset_end = arrayToIndexToRead.end(); - iset != iset_end; iset++) - { - cerr << iset->second.size() << " : "; - } - cerr << endl; - } - - }; //end of class Transformer - -};//end of namespace -#endif diff --git a/src/vendor/stp/src/AST/Makefile b/src/vendor/stp/src/AST/Makefile deleted file mode 100644 index 0190736d2..000000000 --- a/src/vendor/stp/src/AST/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -SRCS += $(wildcard NodeFactory/*.cpp) -OBJS = $(SRCS:.cpp=.o) -OBJS += ASTKind.o - - -#Make the ast library for use by other modules -libast.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -# ASTKind.h and ASTKind.cpp are automatically generated -ASTKind.h ASTKind.cpp: ASTKind.kinds genkinds.pl - ./genkinds.pl - -.PHONY: clean -clean: - $(RM) *.o */*.o *~ *.a .#* depend ASTKind.cpp ASTKind.h - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend - diff --git a/src/vendor/stp/src/AST/NodeFactory/HashingNodeFactory.cpp b/src/vendor/stp/src/AST/NodeFactory/HashingNodeFactory.cpp deleted file mode 100644 index 48fe2a01b..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/HashingNodeFactory.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "HashingNodeFactory.h" -#include "../AST.h" -#include "../../STPManager/STP.h" - -using BEEV::Kind; -using BEEV::ASTInterior; -using BEEV::ASTVec; -using BEEV::ASTNode; - - -HashingNodeFactory::~HashingNodeFactory() -{ -} - -// Get structurally hashed version of the node. -BEEV::ASTNode HashingNodeFactory::CreateNode(const Kind kind, const BEEV::ASTVec & back_children) -{ - // We can't create NOT(NOT (..)) nodes because of how the numbering scheme we use works. - // So you can't trust the hashiing node factory even to return nodes of the same kind that - // you ask for. - if (kind == BEEV::NOT && back_children[0].GetKind() == BEEV::NOT) - { - return back_children[0][0]; - } - - ASTVec children(back_children); - // The Bitvector solver seems to expect constants on the RHS, variables on the LHS. - // We leave the order of equals children as we find them. - if (BEEV::isCommutative(kind) && kind != BEEV::AND) - { - SortByArith(children); - } - - ASTInterior *n_ptr = new ASTInterior(kind,children); - ASTNode n(bm.LookupOrCreateInterior(n_ptr)); - return n; -} - -// Create and return an ASTNode for a term -ASTNode HashingNodeFactory::CreateTerm(Kind kind, unsigned int width,const ASTVec &children) -{ - - ASTNode n = CreateNode(kind, children); - n.SetValueWidth(width); - - //by default we assume that the term is a Bitvector. If - //necessary the indexwidth can be changed later - n.SetIndexWidth(0); - return n; -} - - diff --git a/src/vendor/stp/src/AST/NodeFactory/HashingNodeFactory.h b/src/vendor/stp/src/AST/NodeFactory/HashingNodeFactory.h deleted file mode 100644 index 5ef94879b..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/HashingNodeFactory.h +++ /dev/null @@ -1,27 +0,0 @@ -// A Node factory that only does structural hashing. -#ifndef HASHINGNODEFACTORY_H_ -#define HASHINGNODEFACTORY_H_ - -#include "NodeFactory.h" -#include "../ASTKind.h" -namespace BEEV -{ - class STPMgr; -} - -class HashingNodeFactory : public NodeFactory -{ -public: - HashingNodeFactory(BEEV::STPMgr& bm_) - :NodeFactory(bm_) - { - } - - virtual ~HashingNodeFactory(); - BEEV::ASTNode CreateNode(const BEEV::Kind kind, const BEEV::ASTVec & back_children); - BEEV::ASTNode CreateTerm(BEEV::Kind kind, unsigned int width,const BEEV::ASTVec &children); - - virtual std::string getName() {return "hashing";} -}; - -#endif /* HASHINGNODEFACTORY_H_ */ diff --git a/src/vendor/stp/src/AST/NodeFactory/NodeFactory.cpp b/src/vendor/stp/src/AST/NodeFactory/NodeFactory.cpp deleted file mode 100644 index 9930c7a6a..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/NodeFactory.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "../ASTKind.h" -#include "../AST.h" -#include "../../STPManager/STPManager.h" - -NodeFactory::~NodeFactory() -{ -} - -BEEV::ASTNode NodeFactory::CreateTerm(BEEV::Kind kind, unsigned int width, - const BEEV::ASTVec &children) -{ - return CreateTerm(kind, width, children); -} - -ASTNode NodeFactory::CreateTerm(Kind kind, unsigned int width, - const ASTNode& child0, const ASTVec &children) -{ - ASTVec child; - child.reserve(children.size() + 1); - child.push_back(child0); - child.insert(child.end(), children.begin(), children.end()); - return CreateTerm(kind, width, child); -} - -ASTNode NodeFactory::CreateTerm(Kind kind, unsigned int width, - const ASTNode& child0, const ASTNode& child1, const ASTVec &children) -{ - ASTVec child; - child.reserve(children.size() + 2); - child.push_back(child0); - child.push_back(child1); - child.insert(child.end(), children.begin(), children.end()); - return CreateTerm(kind, width, child); -} - -ASTNode NodeFactory::CreateTerm(Kind kind, unsigned int width, - const ASTNode& child0, const ASTNode& child1, const ASTNode& child2, - const ASTVec &children) -{ - ASTVec child; - child.reserve(children.size() + 3); - child.push_back(child0); - child.push_back(child1); - child.push_back(child2); - child.insert(child.end(), children.begin(), children.end()); - return CreateTerm(kind, width, child); -} - -ASTNode NodeFactory::CreateNode(Kind kind, const ASTNode& child0, - const ASTVec & back_children) -{ - ASTVec front_children; - front_children.reserve(1 + back_children.size()); - front_children.push_back(child0); - front_children.insert(front_children.end(), back_children.begin(), - back_children.end()); - return CreateNode(kind, front_children); -} - -ASTNode NodeFactory::CreateNode(Kind kind, const ASTNode& child0, - const ASTNode& child1, const ASTVec & back_children) -{ - ASTVec front_children; - front_children.reserve(2 + back_children.size()); - front_children.push_back(child0); - front_children.push_back(child1); - front_children.insert(front_children.end(), back_children.begin(), - back_children.end()); - return CreateNode(kind, front_children); -} - -ASTNode NodeFactory::CreateNode(Kind kind, const ASTNode& child0, - const ASTNode& child1, const ASTNode& child2, - const ASTVec & back_children) -{ - ASTVec front_children; - front_children.reserve(3 + back_children.size()); - front_children.push_back(child0); - front_children.push_back(child1); - front_children.push_back(child2); - front_children.insert(front_children.end(), back_children.begin(), - back_children.end()); - return CreateNode(kind, front_children); -} - -ASTNode NodeFactory::CreateArrayTerm(Kind kind, unsigned int index, unsigned int width, - const ASTNode& child0, const ASTNode& child1, const ASTNode& child2, - const ASTVec &children) -{ - ASTVec child; - child.reserve(children.size() + 3); - child.push_back(child0); - child.push_back(child1); - child.push_back(child2); - child.insert(child.end(), children.begin(), children.end()); - return CreateArrayTerm(kind, index, width, child); -} - -BEEV::ASTNode NodeFactory::CreateArrayTerm(Kind kind, unsigned int index, - unsigned int width, const BEEV::ASTVec &children) -{ - ASTNode result = CreateTerm(kind, width, children); - result.SetIndexWidth(index); - return result; -} - -BEEV::ASTNode NodeFactory::getTrue() {return bm.ASTTrue;} -BEEV::ASTNode NodeFactory::getFalse(){return bm.ASTFalse;} - - -ASTNode NodeFactory::CreateSymbol(const char * const name, unsigned indexWidth, unsigned valueWidth) -{ - ASTNode n = bm.LookupOrCreateSymbol(name); - n.SetIndexWidth(indexWidth); - n.SetValueWidth(valueWidth); - return n; -} - -ASTNode NodeFactory::CreateConstant(BEEV::CBV cbv, unsigned width) -{ - return bm.CreateBVConst(cbv,width); -} diff --git a/src/vendor/stp/src/AST/NodeFactory/NodeFactory.h b/src/vendor/stp/src/AST/NodeFactory/NodeFactory.h deleted file mode 100644 index 41e2f3ac2..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/NodeFactory.h +++ /dev/null @@ -1,73 +0,0 @@ -// Abstract base class for all the node factories. -#ifndef NODEFACTORY_H -#define NODEFACTORY_H - -#include -#include "../ASTKind.h" -#include "../../boost/noncopyable.hpp" - -namespace BEEV -{ -class ASTNode; -typedef std::vector ASTVec; -extern ASTVec _empty_ASTVec; -class STPMgr; -typedef unsigned int * CBV; -} - -using BEEV::ASTNode; -using BEEV::Kind; -using BEEV::ASTVec; -using BEEV::_empty_ASTVec; - -class NodeFactory : boost::noncopyable -{ -protected: - BEEV::STPMgr& bm; - -public: - NodeFactory(BEEV::STPMgr& bm_) : bm(bm_){} - - virtual ~NodeFactory(); - - virtual BEEV::ASTNode CreateTerm(Kind kind, unsigned int width, - const BEEV::ASTVec &children) =0; - - virtual BEEV::ASTNode CreateArrayTerm(Kind kind, unsigned int index, unsigned int width, - const BEEV::ASTVec &children); - - virtual BEEV::ASTNode CreateNode(Kind kind, - const BEEV::ASTVec& children) =0; - - ASTNode CreateSymbol(const char * const name, unsigned indexWidth, unsigned valueWidth); - - ASTNode CreateTerm(Kind kind, unsigned int width, const ASTNode& child0, - const ASTVec &children = _empty_ASTVec); - ASTNode CreateTerm(Kind kind, unsigned int width, const ASTNode& child0, - const ASTNode& child1, const ASTVec &children = _empty_ASTVec); - ASTNode CreateTerm(Kind kind, unsigned int width, const ASTNode& child0, - const ASTNode& child1, const ASTNode& child2, - const ASTVec &children = _empty_ASTVec); - - ASTNode CreateNode(Kind kind, const ASTNode& child0, - const ASTVec & back_children = _empty_ASTVec); - ASTNode CreateNode(Kind kind, const ASTNode& child0, const ASTNode& child1, - const ASTVec & back_children = _empty_ASTVec); - ASTNode CreateNode(Kind kind, const ASTNode& child0, const ASTNode& child1, - const ASTNode& child2, const ASTVec & back_children = - _empty_ASTVec); - - - ASTNode CreateArrayTerm(Kind kind, unsigned int index, unsigned int width, const ASTNode& child0, - const ASTNode& child1, const ASTNode& child2, - const ASTVec &children = _empty_ASTVec); - - ASTNode getTrue(); - ASTNode getFalse(); - - ASTNode CreateConstant(BEEV::CBV cbv, unsigned width); - - virtual std::string getName()=0; -}; - -#endif diff --git a/src/vendor/stp/src/AST/NodeFactory/SimplifyingNodeFactory.cpp b/src/vendor/stp/src/AST/NodeFactory/SimplifyingNodeFactory.cpp deleted file mode 100644 index 647e64c16..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/SimplifyingNodeFactory.cpp +++ /dev/null @@ -1,1466 +0,0 @@ -/* A node factory that: - * * Sorts children to increases sharing, - * * Performs constant evaluation, - * * performs simplify boolean simplifications, - * * converts less thans to greater thans. - * - * NOTE: CreateNode doesn't necessary return a node with the same Kind as what it was called - * with. For example: (AND TRUE FALSE) will return FALSE. Which isn't an AND node. - * - * The intention is to never create nodes that will later be simplified by single level - * re-write rules. So we will never create the node (NOT(NOT x)). This is and example of - * a multi-level rule that never increases the global number of nodes. - * - * These rules (mostly) don't increase the total number of nodes by more than one. - * - * Sometimes the number of nodes is increased. e.g. creating BVSLT(x,y), will create NOT(BVGT(y,x)). - * i.e. it will create an extra node. - * - * I think we've got all the two input cases that either map to a constant, or to an input value. - * e.g. (a >> a), (a xor a), (a or a), (a and a), (a + 0), (a-0).. - * - */ - -#include "../../AST/AST.h" -#include -#include "SimplifyingNodeFactory.h" -#include "../../simplifier/simplifier.h" -#include "../ArrayTransformer.h" -#include - -using BEEV::Kind; - -using BEEV::SYMBOL; -using BEEV::BVNEG; -using BEEV::BVMOD; -using BEEV::BVUMINUS; -using BEEV::BVMULT; -using BEEV::ITE; -using BEEV::EQ; -using BEEV::BVSRSHIFT; -using BEEV::SBVREM; -using BEEV::SBVMOD; -using BEEV::SBVDIV; -using BEEV::BVCONCAT; -using BEEV::BVEXTRACT; -using BEEV::BVRIGHTSHIFT; -using BEEV::BVPLUS; -using BEEV::BVXOR; -using BEEV::BVDIV; - -static bool debug_simplifyingNodeFactory = false; - -ASTNode -SimplifyingNodeFactory::CreateNode(Kind kind, const ASTVec & children) -{ - - assert(kind != SYMBOL); - // These are created specially. - - // If all the parameters are constant, return the constant value. - // The bitblaster calls CreateNode with a boolean vector. We don't try to simplify those. - if (kind != BEEV::UNDEFINED && kind != BEEV::BOOLEAN && kind != BEEV::BITVECTOR && kind != BEEV::ARRAY) - { - bool allConstant = true; - - for (unsigned i = 0; i < children.size(); i++) - if (!children[i].isConstant()) - { - allConstant = false; - break; - } - - if (allConstant) - { - const ASTNode& hash = hashing.CreateNode(kind, children); - const ASTNode& c = NonMemberBVConstEvaluator(hash); - assert(c.isConstant()); - return c; - } - } - ASTNode result; - - switch (kind) - { - // convert the Less thans to greater thans. - case BEEV::BVLT: - assert(children.size() ==2); - result = NodeFactory::CreateNode(BEEV::BVGT, children[1], children[0]); - break; - - case BEEV::BVLE: - assert(children.size() ==2); - result = NodeFactory::CreateNode(BEEV::BVGE, children[1], children[0]); - break; - - case BEEV::BVSLT: - assert(children.size() ==2); - result = NodeFactory::CreateNode(BEEV::BVSGT, children[1], children[0]); - break; - - case BEEV::BVSLE: - assert(children.size() ==2); - result = NodeFactory::CreateNode(BEEV::BVSGE, children[1], children[0]); - break; - - case BEEV::BVSGT: - assert(children.size() ==2); - if (children[0] == children[1]) - result = ASTFalse; - if (children[1].GetKind() == BEEV::BVCONST) - { - // 011111111 (most positive number.) - unsigned width = children[0].GetValueWidth(); - BEEV::CBV max = CONSTANTBV::BitVector_Create(width, false); - CONSTANTBV::BitVector_Fill(max); - CONSTANTBV::BitVector_Bit_Off(max, width - 1); - ASTNode biggestNumber = bm.CreateBVConst(max, width); - if (children[1] == biggestNumber) - result = ASTFalse; - } - if (children[0].GetKind() == BEEV::BVCONST) - { - unsigned width = children[0].GetValueWidth(); - // 1000000000 (most negative number.) - BEEV::CBV max = CONSTANTBV::BitVector_Create(width, true); - CONSTANTBV::BitVector_Bit_On(max, width - 1); - ASTNode smallestNumber = bm.CreateBVConst(max, width); - if (children[0] == smallestNumber) - result = ASTFalse; - } - - if (children[0].GetKind() == BVCONCAT && children[1].GetKind() == BVCONCAT && children[0][1] == children[1][1]) - result = NodeFactory::CreateNode(BEEV::BVSGT, children[0][0], children[1][0]); - - break; - - case BEEV::BVGT: - assert(children.size() ==2); - if (children[0] == children[1]) - result = ASTFalse; - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = ASTFalse; - if (children[1].isConstant() && CONSTANTBV::BitVector_is_full(children[1].GetBVConst())) - result = ASTFalse; - if (children[0].GetKind() == BVRIGHTSHIFT && children[0][0] == children[1]) - result = ASTFalse; - if (children[0].GetKind() == BVCONCAT && children[1].GetKind() == BVCONCAT && children[0][1] == children[1][1]) - result = NodeFactory::CreateNode(BEEV::BVGT, children[0][0], children[1][0]); - if (children[0].GetKind() == BVCONCAT && children[1].GetKind() == BVCONCAT && children[0][0] == children[1][0]) - result = NodeFactory::CreateNode(BEEV::BVGT, children[0][1], children[1][1]); - if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = NodeFactory::CreateNode(BEEV::NOT, NodeFactory::CreateNode(EQ, children[0], children[1])); - if (children[0].isConstant() && CONSTANTBV::BitVector_is_full(children[0].GetBVConst())) - result = NodeFactory::CreateNode(BEEV::NOT, NodeFactory::CreateNode(EQ, children[0], children[1])); - if (children[0].GetKind() == BEEV::BVAND && children[0].Degree() > 1 - && ((children[0][0] == children[1]) || children[0][1] == children[1])) - result = ASTFalse; - break; - - case BEEV::BVGE: - assert(children.size() ==2); - { - ASTNode a = NodeFactory::CreateNode(BEEV::BVGT, children[1], children[0]); - result = NodeFactory::CreateNode(BEEV::NOT, a); - } - break; - - case BEEV::BVSGE: - assert(children.size() ==2); - { - ASTNode a = NodeFactory::CreateNode(BEEV::BVSGT, children[1], children[0]); - result = NodeFactory::CreateNode(BEEV::NOT, a); - } - break; - - case BEEV::NOT: - result = CreateSimpleNot(children); - break; - case BEEV::AND: - result = CreateSimpleAndOr(1, children); - break; - case BEEV::OR: - result = CreateSimpleAndOr(0, children); - break; - case BEEV::NAND: - result = CreateSimpleNot(CreateSimpleAndOr(1, children)); - break; - case BEEV::NOR: - result = CreateSimpleNot(CreateSimpleAndOr(0, children)); - break; - case BEEV::XOR: - result = CreateSimpleXor(children); - break; - case ITE: - result = CreateSimpleFormITE(children); - break; - case EQ: - result = CreateSimpleEQ(children); - break; - case BEEV::IFF: - { - assert(children.size() ==2); - ASTVec newCh; - newCh.reserve(2); - newCh.push_back(CreateSimpleNot(children[0])); - newCh.push_back(children[1]); - result = CreateSimpleXor(newCh); - break; - } - case BEEV::IMPLIES: - { - assert(children.size() ==2); - if (children[0] == children[1]) - result = bm.ASTTrue; - else - { - ASTVec newCh; - newCh.reserve(2); - newCh.push_back(CreateSimpleNot(children[0])); - newCh.push_back(children[1]); - result = CreateSimpleAndOr(0, newCh); - } - break; - } - - default: - result = hashing.CreateNode(kind, children); - } - - if (result.IsNull()) - result = hashing.CreateNode(kind, children); - - return result; -} - -ASTNode -SimplifyingNodeFactory::CreateSimpleNot(const ASTNode& form) -{ - const Kind k = form.GetKind(); - switch (k) - { - case BEEV::FALSE: - { - return form.GetSTPMgr()->ASTTrue; - } - case BEEV::TRUE: - { - return form.GetSTPMgr()->ASTFalse; - } - case BEEV::NOT: - { - return form[0]; - } // NOT NOT cancellation - default: - { - ASTVec children; - children.push_back(form); - return hashing.CreateNode(BEEV::NOT, children); - } - } -} - -ASTNode -SimplifyingNodeFactory::CreateSimpleNot(const ASTVec& children) -{ - const Kind k = children[0].GetKind(); - switch (k) - { - case BEEV::FALSE: - { - return children[0].GetSTPMgr()->ASTTrue; - } - case BEEV::TRUE: - { - return children[0].GetSTPMgr()->ASTFalse; - } - case BEEV::NOT: - { - return children[0][0]; - } // NOT NOT cancellation - default: - { - return hashing.CreateNode(BEEV::NOT, children); - } - } -} - -ASTNode -SimplifyingNodeFactory::CreateSimpleAndOr(bool IsAnd, const ASTNode& form1, const ASTNode& form2) -{ - ASTVec children; - children.push_back(form1); - children.push_back(form2); - return CreateSimpleAndOr(IsAnd, children); -} - -ASTNode -SimplifyingNodeFactory::CreateSimpleAndOr(bool IsAnd, const ASTVec &children) -{ - const Kind k = IsAnd ? BEEV::AND : BEEV::OR; - - if (k == BEEV::OR && children.size() == 2) - { - const ASTNode& c0 = children[0]; - const ASTNode& c1 = children[1]; - if (c0.GetKind() == BEEV::NOT && c0[0] == c1) - return ASTTrue; - if (c1.GetKind() == BEEV::NOT && c1[0] == c0) - return ASTTrue; - } - if (k == BEEV::AND && children.size() == 2) - { - const ASTNode& c0 = children[0]; - const ASTNode& c1 = children[1]; - if (c0.GetKind() == BEEV::NOT && c0[0] == c1) - return ASTFalse; - if (c1.GetKind() == BEEV::NOT && c1[0] == c0) - return ASTFalse; - } - - const ASTNode& annihilator = (IsAnd ? ASTFalse : ASTTrue); - const ASTNode& identity = (IsAnd ? ASTTrue : ASTFalse); - - ASTNode retval; - ASTVec new_children; - new_children.reserve(children.size()); - - const ASTVec::const_iterator it_end = children.end(); - for (ASTVec::const_iterator it = children.begin(); it != it_end; it++) - { - ASTVec::const_iterator next_it; - - bool nextexists = (it + 1 < it_end); - if (nextexists) - next_it = it + 1; - else - next_it = it_end; - - if (nextexists) - if (next_it->GetKind() == BEEV::NOT && (*next_it)[0] == *it) - return annihilator; - - if (*it == annihilator) - { - return annihilator; - } - else if (*it == identity || (nextexists && (*next_it == *it))) - { - // just drop it - } - else - new_children.push_back(*it); - } - - // If we get here, we saw no annihilators, and children should - // be only the non-True nodes. - - if (0 == new_children.size()) - { - retval = identity; - } - else if (1 == new_children.size()) - { - // there is just one child - retval = new_children[0]; - } - else - { - // 2 or more children. Create a new node. - retval = hashing.CreateNode(IsAnd ? BEEV::AND : BEEV::OR, new_children); - } - return retval; -} - -//Tries to simplify the input to TRUE/FALSE. if it fails, then -//return the constructed equality -ASTNode -SimplifyingNodeFactory::CreateSimpleEQ(const ASTVec& children) -{ - assert(children.size() == 2); - - // SYMBOL = something, if not that, then CONSTANT = - const bool swap = (children[1].GetKind() == BEEV::SYMBOL - || ((children[0].GetKind() != BEEV::SYMBOL) && children[1].GetKind() == BEEV::BVCONST)); - const ASTNode& in1 = swap ? children[1] : children[0]; - const ASTNode& in2 = swap ? children[0] : children[1]; - const Kind k1 = in1.GetKind(); - const Kind k2 = in2.GetKind(); - const int width = in1.GetValueWidth(); - - if (in1 == in2) - //terms are syntactically the same - return in1.GetSTPMgr()->ASTTrue; - - //here the terms are definitely not syntactically equal but may be - //semantically equal. - if (BEEV::BVCONST == k1 && BEEV::BVCONST == k2) - return in1.GetSTPMgr()->ASTFalse; - - if ((k1 == BVNEG && k2 == BVNEG) || (k1 == BVUMINUS && k2 == BVUMINUS)) - return NodeFactory::CreateNode(EQ, in1[0], in2[0]); - - if ((k1 == BVUMINUS && k2 == BEEV::BVCONST) || (k1 == BVNEG && k2 == BEEV::BVCONST)) - return NodeFactory::CreateNode(EQ, in1[0], NodeFactory::CreateTerm(k1, width, in2)); - - if ((k2 == BVUMINUS && k1 == BEEV::BVCONST) || (k2 == BVNEG && k1 == BEEV::BVCONST)) - return NodeFactory::CreateNode(EQ, in2[0], NodeFactory::CreateTerm(k2, width, in1)); - - if ((k1 == BVNEG && in1[0] == in2) || (k2 == BVNEG && in2[0] == in1)) - return in1.GetSTPMgr()->ASTFalse; - - if (k2 == BEEV::BVDIV && k1 == BEEV::BVCONST && (in1 == bm.CreateZeroConst(width))) - return NodeFactory::CreateNode(BEEV::BVGT, in2[1], in2[0]); - - if (k1 == BEEV::BVDIV && k2 == BEEV::BVCONST && (in2 == bm.CreateZeroConst(width))) - return NodeFactory::CreateNode(BEEV::BVGT, in1[1], in1[0]); - - // split the constant to equal each part of the concat. - if (BVCONCAT == k2 && BEEV::BVCONST == k1) - { - int low_b = 0; - int high_b = in2[1].GetValueWidth() - 1; - int low_t = in2[1].GetValueWidth(); - int high_t = width - 1; - - ASTNode c0 = NodeFactory::CreateTerm(BVEXTRACT, in2[1].GetValueWidth(), in1, bm.CreateBVConst(32, high_b), - bm.CreateBVConst(32, low_b)); - ASTNode c1 = NodeFactory::CreateTerm(BVEXTRACT, in2[0].GetValueWidth(), in1, bm.CreateBVConst(32, high_t), - bm.CreateBVConst(32, low_t)); - - ASTNode a = NodeFactory::CreateNode(EQ, in2[1], c0); - ASTNode b = NodeFactory::CreateNode(EQ, in2[0], c1); - return NodeFactory::CreateNode(BEEV::AND, a, b); - } - - // This increases the number of nodes. So disable for now. - if (false && BVCONCAT == k1 && BVCONCAT == k2 && in1[0].GetValueWidth() == in2[0].GetValueWidth()) - { - ASTNode a = NodeFactory::CreateNode(EQ, in1[0], in2[0]); - ASTNode b = NodeFactory::CreateNode(EQ, in1[1], in2[1]); - return NodeFactory::CreateNode(BEEV::AND, a, b); - } - - if (k1 == BEEV::BVCONST && k2 == ITE && in2[1].GetKind() == BEEV::BVCONST && in2[2].GetKind() == BEEV::BVCONST) - { - - ASTNode result = NodeFactory::CreateNode(ITE, in2[0], NodeFactory::CreateNode(EQ, in1, in2[1]), - NodeFactory::CreateNode(EQ, in1, in2[2])); - - return result; - } - - // Don't create a PLUS with the same operand on both sides. - // We don't do big pluses, because 1) this algorithm isn't good enough - // 2) it might split nodes (a lot). - if ((k1 == BVPLUS && in1.Degree() <= 2) || (k2 == BVPLUS && in2.Degree() <= 2)) - { - const ASTVec& c1 = (k1 == BVPLUS) ? in1.GetChildren() : ASTVec(1, in1); - const ASTVec& c2 = (k2 == BVPLUS) ? in2.GetChildren() : ASTVec(1, in2); - - if (c1.size() <= 2 && c2.size() <= 2) - { - int match1 = -1, match2 = -1; - - for (int i = 0; i < c1.size(); i++) - for (int j = 0; j < c2.size(); j++) - { - if (c1[i] == c2[j]) - { - match1 = i; - match2 = j; - } - } - - if (match1 != -1) - { - assert(match2 !=-1); - assert(match1 == 0 || match1 == 1); - assert(match2 == 0 || match2 == 1); - // If it was 1 element before, it's zero now. - ASTNode n1 = c1.size() == 1 ? bm.CreateZeroConst(width) : c1[match1 == 0 ? 1 : 0]; - ASTNode n2 = c2.size() == 1 ? bm.CreateZeroConst(width) : c2[match2 == 0 ? 1 : 0]; - return NodeFactory::CreateNode(EQ, n1, n2); - } - } - } - - if (k2 == BVPLUS && in2.Degree() == 2 && (in2[1] == in1 || in2[0] == in1)) - { - return NodeFactory::CreateNode(EQ, bm.CreateZeroConst(width), in2[1] == in1 ? in2[0] : in2[1]); - } - - if (k1 == BVPLUS && in1.Degree() == 2 && (in1[1] == in2 || in1[0] == in2)) - { - return NodeFactory::CreateNode(EQ, bm.CreateZeroConst(width), in1[1] == in2 ? in1[0] : in1[1]); - } - - if (k1 == BEEV::BVCONST && k2 == BEEV::BVXOR && in2.Degree() == 2 && in2[0].GetKind() == BEEV::BVCONST) - { - return NodeFactory::CreateNode(EQ, NodeFactory::CreateTerm(BEEV::BVXOR, width, in1, in2[0]), in2[1]); - } - - if (k2 == BEEV::BVCONST && k1 == BEEV::BVXOR && in1.Degree() == 2 && in1[0].GetKind() == BEEV::BVCONST) - { - return NodeFactory::CreateNode(EQ, NodeFactory::CreateTerm(BEEV::BVXOR, width, in2, in1[0]), in1[1]); - } - - if (k2 == BEEV::BVXOR && in2.Degree() == 2 && in1 == in2[0]) - { - return NodeFactory::CreateNode(EQ, bm.CreateZeroConst(width), in2[1]); - } - - if (k1 == BEEV::BVXOR && in1.Degree() == 2 && in2 == in1[0]) - { - return NodeFactory::CreateNode(EQ, bm.CreateZeroConst(width), in1[1]); - } - - if (k1 == BEEV::BVCONST && k2 == BEEV::BVSX && (in2[0].GetValueWidth() != width)) - { - // Each of the bits in the extended part, and one into the un-extended part must be the same. - bool foundZero = false, foundOne = false; - const unsigned original_width = in2[0].GetValueWidth(); - const unsigned new_width = in2.GetValueWidth(); - for (int i = original_width - 1; i < new_width; i++) - if (CONSTANTBV::BitVector_bit_test(in1.GetBVConst(), i)) - foundOne = true; - else - foundZero = true; - if (foundZero && foundOne) - return ASTFalse; - ASTNode lhs = NodeFactory::CreateTerm(BVEXTRACT, original_width, in1, bm.CreateBVConst(32, original_width - 1), - bm.CreateZeroConst(32)); - ASTNode rhs = NodeFactory::CreateTerm(BVEXTRACT, original_width, in2, bm.CreateBVConst(32, original_width - 1), - bm.CreateZeroConst(32)); - return NodeFactory::CreateNode(EQ, lhs, rhs); - } - - // Simplifiy (5 = 4/x) to FALSE. - if (bm.UserFlags.division_by_zero_returns_one_flag && k1 == BEEV::BVCONST && k2 == BEEV::BVDIV - && in2[0].GetKind() == BEEV::BVCONST) - { - ASTNode oneV = bm.CreateOneConst(width); - if (CONSTANTBV::BitVector_Lexicompare(in1.GetBVConst(), oneV.GetBVConst()) > 0 && in1 != oneV - && CONSTANTBV::BitVector_Lexicompare(in1.GetBVConst(), in2[0].GetBVConst()) > 0) - { - return ASTFalse; - } - } - - if (k1 == BVNEG && k2 == BVUMINUS && in1[0] == in2[0]) - return ASTFalse; - - if (k1 == BVUMINUS && k2 == BVNEG && in1[0] == in2[0]) - return ASTFalse; - - //last resort is to CreateNode - return hashing.CreateNode(EQ, children); -} - -// Constant children are accumulated in "accumconst". -ASTNode -SimplifyingNodeFactory::CreateSimpleXor(const ASTVec &children) -{ - if (debug_simplifyingNodeFactory) - { - cout << "========" << endl << "CreateSimpXor "; - lpvec(children); - cout << endl; - } - - ASTVec flat_children; // empty vector - flat_children = children; - - // sort so that identical nodes occur in sequential runs, followed by - // their negations. - SortByExprNum(flat_children); - - // This is the C Boolean value of all constant args seen. It is initially - // 0. TRUE children cause it to change value. - bool accumconst = 0; - - ASTVec new_children; - new_children.reserve(children.size()); - - const ASTVec::const_iterator it_end = flat_children.end(); - ASTVec::iterator next_it; - for (ASTVec::iterator it = flat_children.begin(); it != it_end; it++) - { - next_it = it + 1; - bool nextexists = (next_it < it_end); - - if (ASTTrue == *it) - { - accumconst = !accumconst; - } - else if (ASTFalse == *it) - { - // Ignore it - } - else if (nextexists && (*next_it == *it)) - { - // x XOR x = FALSE. Skip current, write "false" into next_it - // so that it gets tossed, too. - *next_it = ASTFalse; - } - else if (nextexists && (next_it->GetKind() == BEEV::NOT) && ((*next_it)[0] == *it)) - { - // x XOR NOT x = TRUE. Skip current, write "true" into next_it - // so that it gets tossed, too. - *next_it = ASTTrue; - } - else if (BEEV::NOT == it->GetKind()) - { - // If child is (NOT alpha), we can flip accumconst and use alpha. - // This is ok because (NOT alpha) == TRUE XOR alpha - accumconst = !accumconst; - // CreateSimpNot just takes child of not. - new_children.push_back(CreateSimpleNot(*it)); - } - else - { - new_children.push_back(*it); - } - } - - ASTNode retval; - - // Children should be non-constant. - if (new_children.size() < 2) - { - if (0 == new_children.size()) - { - // XOR(TRUE, FALSE) -- accumconst will be 1. - if (accumconst) - { - retval = ASTTrue; - } - else - { - retval = ASTFalse; - } - } - else - { - // there is just one child - // XOR(x, TRUE) -- accumconst will be 1. - if (accumconst) - { - retval = CreateSimpleNot(new_children[0]); - } - else - { - retval = new_children[0]; - } - } - } - else - { - // negate first child if accumconst == 1 - if (accumconst) - { - new_children[0] = CreateSimpleNot(new_children[0]); - } - retval = hashing.CreateNode(BEEV::XOR, new_children); - } - - if (debug_simplifyingNodeFactory) - { - cout << "returns " << retval << endl; - } - return retval; -} - -ASTNode -SimplifyingNodeFactory::CreateSimpleFormITE(const ASTVec& children) -{ - const ASTNode& child0 = children[0]; - const ASTNode& child1 = children[1]; - const ASTNode& child2 = children[2]; - - ASTNode retval; - - if (debug_simplifyingNodeFactory) - { - cout << "========" << endl << "CreateSimpleFormITE " << child0 << child1 << child2 << endl; - } - - if (ASTTrue == child0) - { - retval = child1; - } - else if (ASTFalse == child0) - { - retval = child2; - } - else if (child1 == child2) - { - retval = child1; - } - // ITE(x, TRUE, y ) == x OR y - else if (ASTTrue == child1) - { - retval = CreateSimpleAndOr(0, child0, child2); - } - // ITE(x, FALSE, y ) == (!x AND y) - else if (ASTFalse == child1) - { - retval = CreateSimpleAndOr(1, CreateSimpleNot(child0), child2); - } - // ITE(x, y, TRUE ) == (!x OR y) - else if (ASTTrue == child2) - { - retval = CreateSimpleAndOr(0, CreateSimpleNot(child0), child1); - } - // ITE(x, y, FALSE ) == (x AND y) - else if (ASTFalse == child2) - { - retval = CreateSimpleAndOr(1, child0, child1); - } - else if (child0 == child1) - { - retval = CreateSimpleAndOr(0, child0, child2); - } - else if (child0 == child2) - { - retval = CreateSimpleAndOr(1, child0, child1); - } - else - { - retval = hashing.CreateNode(ITE, children); - } - - if (debug_simplifyingNodeFactory) - { - cout << "returns " << retval << endl; - } - - return retval; -} - -// Move reads down through writes until, either we hit a write to an identical (syntactically) index, -// or we hit a write to an index that might be the same. This is intended to simplify things like: -// read(write(write(A,1,2),2,3),4) cheaply. -// The "children" that are passed should be the children of a READ. -ASTNode -SimplifyingNodeFactory::chaseRead(const ASTVec& children, unsigned int width) -{ - assert(children[0].GetKind() == BEEV::WRITE); - const ASTNode& readIndex = children[1]; - ASTNode write = children[0]; - - const bool read_is_const = (BEEV::BVCONST == readIndex.GetKind()); - ASTVec c(2); - - while (write.GetKind() == BEEV::WRITE) - { - const ASTNode& write_index = write[1]; - - if (readIndex == write_index) - { - // The are definately the same. - //cerr << "-"; - return write[2]; - } - else if (read_is_const && BEEV::BVCONST == write_index.GetKind()) - { - // They are definately different. Ignore this. - //cerr << "+"; - } - else - { - // They may be the same. Exit. - // We've finished the cheap tests, now do the expensive one. - // I don't know if the cost of this justifies the benefit. - //cerr << "#"; - c[0] = write_index; - c[1] = readIndex; - ASTNode n = CreateSimpleEQ(c); - if (n == ASTTrue) - { - //cerr << "#"; - return write[2]; - } - else if (n == ASTFalse) - { - //cerr << "!"; - } - else - { - //cerr << "." - //Perhaps they are the same, perhaps not. - break; - } - } - write = write[0]; - } - return hashing.CreateTerm(BEEV::READ, width, write, readIndex); -} - -// This gets called with the arguments swapped as well. So the rules don't need to know about commutivity. -ASTNode -SimplifyingNodeFactory::plusRules(const ASTNode& n0, const ASTNode& n1) -{ - ASTNode result; - const int width = n0.GetValueWidth(); - - if (n0.isConstant() && CONSTANTBV::BitVector_is_empty(n0.GetBVConst())) - result = n1; - else if (width == 1 && n0 == n1) - result = bm.CreateZeroConst(1); - else if (n0 == n1) - result = NodeFactory::CreateTerm(BEEV::BVMULT, width, bm.CreateBVConst(string("2"), 10, width), n0); - else if (n0.GetKind() == BVUMINUS && n1 == n0[0]) - result = bm.CreateZeroConst(width); - else if (n1.GetKind() == BVPLUS && n1[1].GetKind() == BVUMINUS && n0 == n1[1][0] && n1.Degree() == 2) - result = n1[0]; - else if (n1.GetKind() == BVPLUS && n1[0].GetKind() == BVUMINUS && n0 == n1[0][0] && n1.Degree() == 2) - result = n1[1]; - else if (n1.GetKind() == BVUMINUS && n0.GetKind() == BVPLUS && n0.Degree() == 2 && n1[0] == n0[1]) - result = n0[0]; - else if (n1.GetKind() == BVUMINUS && n0.GetKind() == BVPLUS && n0.Degree() == 2 && n1[0] == n0[0]) - result = n0[1]; - else if (n1.GetKind() == BVNEG && n1[0] == n0) - result = bm.CreateMaxConst(width); - else if (n0.GetKind() == BEEV::BVCONST && n1.GetKind() == BVPLUS && n1.Degree() == 2 - && n1[0].GetKind() == BEEV::BVCONST) - { - ASTVec ch; - ch.push_back(n0); - ch.push_back(n1[0]); - ASTNode constant = NonMemberBVConstEvaluator(&bm, BVPLUS, ch, width); - result = NodeFactory::CreateTerm(BVPLUS, width, constant, n1[1]); - } - else if (n1.GetKind() == BVUMINUS && (n0.isConstant() && CONSTANTBV::BitVector_is_full(n0.GetBVConst()))) - { - result = NodeFactory::CreateTerm(BVNEG, width, n1[0]); - } - else if (n1.GetKind() == BVUMINUS && n0.GetKind() == BVUMINUS) - { - ASTNode r = NodeFactory::CreateTerm(BVPLUS, width, n0[0], n1[0]); - result = NodeFactory::CreateTerm(BVUMINUS, width, r); - } - - return result; -} - -ASTNode -SimplifyingNodeFactory::CreateTerm(Kind kind, unsigned int width, const ASTVec &children) -{ - if (!is_Term_kind(kind)) - FatalError("CreateTerm: Illegal kind to CreateTerm:", ASTUndefined, kind); - - assert(kind != BEEV::BVCONST); - // These are created specially. - assert(kind != BEEV::SYMBOL); - // so are these. - - // If all the parameters are constant, return the constant value. - bool allConstant = true; - for (unsigned i = 0; i < children.size(); i++) - if (!children[i].isConstant()) - { - allConstant = false; - break; - } - - assert(bm.hashingNodeFactory == &hashing); - - if (allConstant) - { - const ASTNode& hash = hashing.CreateTerm(kind, width, children); - const ASTNode& c = NonMemberBVConstEvaluator(hash); - assert(c.isConstant()); - return c; - } - - ASTNode result; - - switch (kind) - { - - case ITE: - { - if (children[0] == ASTTrue) - result = children[1]; - else if (children[0] == ASTFalse) - result = children[2]; - else if (children[1] == children[2]) - result = children[1]; - else if (children[2].GetKind() == ITE && (children[2][0] == children[0])) - result = NodeFactory::CreateTerm(ITE, width, children[0], children[1], children[2][2]); - else if (children[1].GetKind() == ITE && (children[1][0] == children[0])) - result = NodeFactory::CreateTerm(ITE, width, children[0], children[1][1], children[2]); - else if (children[0].GetKind() == BEEV::NOT) - result = NodeFactory::CreateTerm(ITE, width, children[0][0], children[2], children[1]); - else if (children[0].GetKind() == EQ && children[0][1] == children[1] && children[0][0].GetKind() == BEEV::BVCONST - && children[0][1].GetKind() != BEEV::BVCONST) - result = NodeFactory::CreateTerm(ITE, width, children[0], children[0][0], children[2]); - else if (children[0].GetKind() == EQ && children[0][0] == children[1] && children[0][1].GetKind() == BEEV::BVCONST - && children[0][0].GetKind() != BEEV::BVCONST) - result = NodeFactory::CreateTerm(ITE, width, children[0], children[0][1], children[2]); - break; - } - - case BEEV::BVMULT: - { - if (children.size() == 2) - { - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = bm.CreateZeroConst(width); - - else if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = bm.CreateZeroConst(width); - - else if (children[1].isConstant() && children[1] == bm.CreateOneConst(width)) - result = children[0]; - - else if (children[0].isConstant() && children[0] == bm.CreateOneConst(width)) - result = children[1]; - - else if (width == 1 && children[0] == children[1]) - result = children[0]; - - else if (children[0].GetKind() == BVUMINUS && children[1].GetKind() == BVUMINUS) - result = NodeFactory::CreateTerm(BEEV::BVMULT, width, children[0][0], children[1][0]); - else if (children[0].GetKind() == BVUMINUS) - { - result = NodeFactory::CreateTerm(BEEV::BVMULT, width, children[0][0], children[1]); - result = NodeFactory::CreateTerm(BVUMINUS, width, result); - } - else if (children[1].GetKind() == BVUMINUS) - { - result = NodeFactory::CreateTerm(BEEV::BVMULT, width, children[1][0], children[0]); - result = NodeFactory::CreateTerm(BVUMINUS, width, result); - } - } - else if (children.size() > 2) - { - //Never create multiplications with arity > 2. - - deque names; - - for (unsigned i = 0; i < children.size(); i++) - names.push_back(children[i]); - - while (names.size() > 1) - { - ASTNode a = names.front(); - names.pop_front(); - - ASTNode b = names.front(); - names.pop_front(); - - ASTNode n = NodeFactory::CreateTerm(BVMULT, a.GetValueWidth(), a, b); - names.push_back(n); - } - result = names.front(); - } - } - break; - - case BEEV::BVLEFTSHIFT: - { - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = bm.CreateZeroConst(width); - else if (children[1].isConstant()) - result = BEEV::Simplifier::convertKnownShiftAmount(kind, children, bm, &hashing); - else if (width == 1 && children[0] == children[1]) - result = bm.CreateZeroConst(1); - else if (children[0].GetKind() == BVUMINUS) - result = NodeFactory::CreateTerm(BVUMINUS, width, - NodeFactory::CreateTerm(BEEV::BVLEFTSHIFT, width, children[0][0], children[1])); - } - break; - - case BVRIGHTSHIFT: - { - if (children[0] == children[1]) - result = bm.CreateZeroConst(width); - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = bm.CreateZeroConst(width); - else if (children[1].isConstant()) - result = BEEV::Simplifier::convertKnownShiftAmount(kind, children, bm, &hashing); - else if (children[0].isConstant() && children[0] == bm.CreateOneConst(width)) - result = NodeFactory::CreateTerm(ITE, width, - NodeFactory::CreateNode(EQ, children[1], bm.CreateZeroConst(width)), children[0], - bm.CreateZeroConst(width)); - else if ( width >= 3 && children[0].GetKind() == BVNEG && children[1] == children[0][0] ) - result = NodeFactory::CreateTerm(BVRIGHTSHIFT,width,bm.CreateMaxConst(width),children[0][0]);//320 -> 170 - else if ( width >= 3 && children[1].GetKind() == BVNEG && children[1][0] == children[0] ) - result = NodeFactory::CreateTerm(BVRIGHTSHIFT,width,bm.CreateMaxConst(width),children[1]);//320 -> 170 - else if ( width >= 3 && children[0].GetKind() == BVUMINUS && children[1].GetKind() == BVNEG && children[1][0] == children[0][0] ) - result = NodeFactory::CreateTerm(BVDIV,width,bm.CreateOneConst(width),children[1]);//402 -> 76 - else if ( width >= 3 && children[0].GetKind() == BVNEG && children[1].GetKind() == BVUMINUS && children[1][0] == children[0][0] ) - result = NodeFactory::CreateTerm(BVUMINUS,width,NodeFactory::CreateTerm(ITE,width,NodeFactory::CreateNode(EQ,bm.CreateZeroConst(width),children[0][0]),bm.CreateOneConst(width),bm.CreateZeroConst(width)));//391 -> 70 - } - break; - - case BEEV::BVSRSHIFT: - { - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = bm.CreateZeroConst(width); - else if (width > 1 && children[0].isConstant() && children[0] == bm.CreateOneConst(width)) - result = NodeFactory::CreateTerm(ITE, width, - NodeFactory::CreateNode(EQ, children[1], bm.CreateZeroConst(width)), children[0], - bm.CreateZeroConst(width)); - else if (children[0].isConstant() && CONSTANTBV::BitVector_is_full(children[0].GetBVConst())) - result = bm.CreateMaxConst(width); - else if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = children[0]; - else if (width == 1 && children[0] == children[1]) - result = children[0]; - else if ((children[0] == children[1]) || (children[0].GetKind() == BVUMINUS && children[0][0] == children[1])) - { - assert(width >1); - ASTNode extract = NodeFactory::CreateTerm(BVEXTRACT, 1, children[0], bm.CreateBVConst(32, width - 1), - bm.CreateBVConst(32, width - 1)); - result = NodeFactory::CreateTerm(BEEV::BVSX, width, extract, bm.CreateBVConst(32, width)); - } - else if (width == 1 && children[1].isConstant() && children[1] == bm.CreateOneConst(1)) - result = children[0]; - else if (children[1].isConstant()) - result = BEEV::Simplifier::convertArithmeticKnownShiftAmount(kind, children, bm, &hashing); - else if (children[1].GetKind() == BVUMINUS && children[0] == children[1][0]) - result = NodeFactory::CreateTerm(BEEV::BVSRSHIFT, width, children[0], children[1][0]); - else if (children[0].isConstant() && !CONSTANTBV::BitVector_bit_test(children[0].GetBVConst(), width - 1)) - result = NodeFactory::CreateTerm(BVRIGHTSHIFT, width, children[0], children[1]); - else if ( width >= 3 && children[0].GetKind() == BVNEG && children[1].GetKind() == BVUMINUS && children[1][0] == children[0][0] ) - result = NodeFactory::CreateTerm(BVSRSHIFT,width,children[0],children[0][0]);//414 -> 361 - - - } - break; - - case BEEV::BVSUB: - if (children.size() == 2) - { - if (children.size() == 2 && children[0] == children[1]) - result = bm.CreateZeroConst(width); - else if (children.size() == 2 && children[1] == bm.CreateZeroConst(width)) - result = children[0]; - else - result = NodeFactory::CreateTerm(BVPLUS, width, children[0], - NodeFactory::CreateTerm(BVUMINUS, width, children[1])); - } - break; - - case BEEV::BVOR: - { - if (children.size() == 2) - { - if (children[0] == children[1]) - result = children[0]; - - if (children[0].isConstant() && CONSTANTBV::BitVector_is_full(children[0].GetBVConst())) - result = bm.CreateMaxConst(width); - - if (children[1].isConstant() && CONSTANTBV::BitVector_is_full(children[1].GetBVConst())) - result = bm.CreateMaxConst(width); - - if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = children[0]; - - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = children[1]; - - if (children[1].GetKind() == BVNEG && children[0] == children[1][0]) - result = bm.CreateMaxConst(width); - if (children[0].GetKind() == BVNEG && children[1] == children[0][0]) - result = bm.CreateMaxConst(width); - } - } - break; - - case BEEV::BVXOR: - if (children.size() == 2) - { - if (children[0] == children[1]) - result = bm.CreateZeroConst(width); - if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = children[0]; - - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = children[1]; - - if (children[1].isConstant() && CONSTANTBV::BitVector_is_full(children[1].GetBVConst())) - result = NodeFactory::CreateTerm(BVNEG, width, children[0]); - - if (children[0].isConstant() && CONSTANTBV::BitVector_is_full(children[0].GetBVConst())) - result = NodeFactory::CreateTerm(BVNEG, width, children[1]); - - if (children[1].GetKind() == BVNEG && children[1][0] == children[0]) - result = bm.CreateMaxConst(width); - - if (children[0].GetKind() == BVNEG && children[0][0] == children[1]) - result = bm.CreateMaxConst(width); - if ( width >= 3 && children.size() ==2 && children[0].GetKind() == BVNEG && children[1].GetKind() == BVNEG ) - result = NodeFactory::CreateTerm(BVXOR,width,children[1][0],children[0][0]);//133 -> 133 - } - break; - - case BEEV::BVAND: - { - - bool oneFound = false; - bool zeroFound = false; - - for (int i = 0; i < children.size(); i++) - { - if (children[i].GetKind() == BEEV::BVCONST) - { - if (CONSTANTBV::BitVector_is_full(children[i].GetBVConst())) - oneFound = true; - else if (CONSTANTBV::BitVector_is_empty(children[i].GetBVConst())) - zeroFound = true; - - } - } - - if (zeroFound) - { - result = bm.CreateZeroConst(width); - } - else if (oneFound) - { - ASTVec new_children; - for (int i = 0; i < children.size(); i++) - { - if (children[i].GetKind() != BEEV::BVCONST || !CONSTANTBV::BitVector_is_full(children[i].GetBVConst())) - new_children.push_back(children[i]); - } - - assert(new_children.size() != 0); - // constant. Should have been handled earlier. - if (new_children.size() == 1) - { - result = new_children[0]; - } - else - result = hashing.CreateTerm(kind, width, new_children); - } - } - - if (children.size() == 2 && children[0] == children[1]) - { - result = children[0]; - } - - // If there is just one run of 1 bits, replace by an extract and a concat. - // i.e. 00011111111000000 & x , will be replaced by an extract of x just where - // there are one bits. This should - if (children.size() == 2 && (children[0].isConstant() || children[1].isConstant())) - { - ASTNode c0 = children[0]; - ASTNode c1 = children[1]; - if (c1.isConstant()) - { - ASTNode t = c0; - c0 = c1; - c1 = t; - } - - int start = -1; - int end = -1; - BEEV::CBV c = c0.GetBVConst(); - bool bad = false; - for (int i = 0; i < width; i++) - { - if (CONSTANTBV::BitVector_bit_test(c, i)) - if (start == -1) - start = i; // first one bit. - else if (end != -1) - bad = true; - - if (!CONSTANTBV::BitVector_bit_test(c, i)) - if (start != -1 && end == -1) - end = i - 1; // end of run. - } - if (start != -1 && end == -1) - end = width - 1; - - if (!bad && start != -1) - { - assert(end != -1); - - result = NodeFactory::CreateTerm(BVEXTRACT, end - start + 1, c1, bm.CreateBVConst(32, end), - bm.CreateBVConst(32, start)); - - if (start > 0) - { - ASTNode z = bm.CreateZeroConst(start); - result = NodeFactory::CreateTerm(BVCONCAT, end + 1, result, z); - } - if (end < width - 1) - { - ASTNode z = bm.CreateZeroConst(width - end - 1); - result = NodeFactory::CreateTerm(BVCONCAT, width, z, result); - } - } - } - - if (children.size() == 2) - { - if (children[1].GetKind() == BVNEG && children[1][0] == children[0]) - result = bm.CreateZeroConst(width); - if (children[0].GetKind() == BVNEG && children[0][0] == children[1]) - result = bm.CreateZeroConst(width); - } - break; - - case BEEV::BVSX: - { - if (width == children[0].GetValueWidth()) - result = children[0]; - break; - } - - case BVNEG: - if (children[0].GetKind() == BVNEG) - result = children[0][0]; - if (children[0].GetKind() == BVPLUS && children[0].Degree() == 2 && children[0][0].GetKind() == BEEV::BVCONST - && children[0][0] == bm.CreateMaxConst(width)) - result = NodeFactory::CreateTerm(BVUMINUS, width, children[0][1]); - if (children[0].GetKind() == BVUMINUS) - result = NodeFactory::CreateTerm(BVPLUS, width, children[0][0], bm.CreateMaxConst(width)); - if (children[0].GetKind() == BVMOD && children[0][0].GetKind() == BVNEG && children[0][1].GetKind() == BVUMINUS - && children[0][1][0] == children[0][0][0]) - result = children[0][0][0]; - - break; - - case BVUMINUS: - if (children[0].GetKind() == BVUMINUS) - result = children[0][0]; - else if (width == 1) - result = children[0]; - else if (children[0].GetKind() == BVPLUS && children[0].Degree() == 2 && children[0][0].GetKind() == BEEV::BVCONST - && children[0][0] == bm.CreateOneConst(width)) - result = NodeFactory::CreateTerm(BVNEG, width, children[0][1]); - else if (children[0].GetKind() == BVNEG) - result = NodeFactory::CreateTerm(BVPLUS, width, children[0][0], bm.CreateOneConst(width)); - else if (children[0].GetKind() == BEEV::BVSX && children[0][0].GetValueWidth() == 1) - result = NodeFactory::CreateTerm(BVCONCAT, width, bm.CreateZeroConst(width - 1), children[0][0]); - else if (children[0].GetKind() == BVMULT && children[0].Degree() == 2 && children[0][0] == bm.CreateMaxConst(width)) - result = children[0][1]; - break; - - case BVEXTRACT: - if (width == children[0].GetValueWidth()) - result = children[0]; - else if (BVEXTRACT == children[0].GetKind()) // reduce an extract over an extract. - { - const unsigned outerLow = children[2].GetUnsignedConst(); - const unsigned outerHigh = children[1].GetUnsignedConst(); - - const unsigned innerLow = children[0][2].GetUnsignedConst(); - const unsigned innerHigh = children[0][1].GetUnsignedConst(); - result = NodeFactory::CreateTerm(BVEXTRACT, width, children[0][0], bm.CreateBVConst(32, outerHigh + innerLow), - bm.CreateBVConst(32, outerLow + innerLow)); - } - else if (BVCONCAT == children[0].GetKind()) - { - // If the extract doesn't cross the concat, then remove the concat. - const ASTNode& a = children[0][0]; - const ASTNode& b = children[0][1]; - - const unsigned low = children[2].GetUnsignedConst(); - const unsigned high = children[1].GetUnsignedConst(); - - if (high < b.GetValueWidth()) // Extract entirely from the lower value (b). - { - result = NodeFactory::CreateTerm(BVEXTRACT, width, b, children[1], children[2]); - } - if (low >= b.GetValueWidth()) // Extract entirely from the upper value (a). - { - ASTNode i = bm.CreateBVConst(32, high - b.GetValueWidth()); - ASTNode j = bm.CreateBVConst(32, low - b.GetValueWidth()); - result = NodeFactory::CreateTerm(BVEXTRACT, width, a, i, j); - } - } - else if (BVUMINUS == children[0].GetKind() && children[1] == bm.CreateZeroConst(children[1].GetValueWidth()) - && children[2] == bm.CreateZeroConst(children[2].GetValueWidth())) - { - result = NodeFactory::CreateTerm(BVEXTRACT, width, children[0][0], children[1], children[2]); - } - break; - - case BVPLUS: - if (children.size() == 2) - { - result = plusRules(children[0], children[1]); - if (result.IsNull()) - result = plusRules(children[1], children[0]); - } - break; - - case SBVMOD: - { - const ASTNode max = bm.CreateMaxConst(width); - - if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = children[0]; - else if (children[0] == children[1]) - result = bm.CreateZeroConst(width); - else if (children[1].isConstant() && children[1] == bm.CreateOneConst(width)) - result = bm.CreateZeroConst(width); - else if (children[1].isConstant() && children[1] == bm.CreateMaxConst(width)) - result = bm.CreateZeroConst(width); - else if (children[0].isConstant() && children[0] == bm.CreateZeroConst(width)) - result = bm.CreateZeroConst(width); - else if (children[0].GetKind() == BVUMINUS && children[0][0] == children[1]) - result = bm.CreateZeroConst(width); - else if (children[1].GetKind() == BVUMINUS && children[1][0] == children[0]) - result = bm.CreateZeroConst(width); -#if 0 - else if ( width >= 4 && children[0].GetKind() == BVNEG && children[1] == children[0][0] ) - result = bm.CreateTerm(SBVMOD,width,max,children[0][0]);//9759 -> 542 | 4842 ms - else if ( width >= 4 && children[1].GetKind() == BVNEG && children[1][0] == children[0] ) - result = bm.CreateTerm(SBVMOD,width,max,children[1]);//9759 -> 542 | 4005 ms - else if ( width >= 4 && children[0].GetKind() == BVNEG && children[1].GetKind() == BVUMINUS && children[1][0] == children[0][0] ) - result = bm.CreateTerm(SBVMOD,width,max,children[1]);//9807 -> 674 | 2962 ms -#endif - } - - break; - - case BEEV::BVDIV: - if (children[1].isConstant() && children[1] == bm.CreateOneConst(width)) - result = children[0]; - if (children[1].isConstant() && CONSTANTBV::BitVector_bit_test(children[1].GetBVConst(), width - 1)) - { - // We are dividing by something that has a one in the MSB. It's either 1 or zero. - result = NodeFactory::CreateTerm(ITE, width, NodeFactory::CreateNode(BEEV::BVGE, children[0], children[1]), - bm.CreateOneConst(width), bm.CreateZeroConst(width)); - } - else if (children[1].isConstant() && children[1] == bm.CreateZeroConst(width) - && bm.UserFlags.division_by_zero_returns_one_flag) - result = bm.CreateOneConst(width); - else if (bm.UserFlags.division_by_zero_returns_one_flag && children[0] == children[1]) - result = bm.CreateOneConst(width); - else if (bm.UserFlags.division_by_zero_returns_one_flag && children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = NodeFactory::CreateTerm(ITE,width, NodeFactory::CreateNode(EQ, children[1], bm.CreateZeroConst(width)) ,bm.CreateOneConst(width),bm.CreateZeroConst(width)); - else if (bm.UserFlags.division_by_zero_returns_one_flag && width >= 2 && children[0].GetKind() == BVNEG && children[1].GetKind() == BVUMINUS && children[1][0] == children[0][0]) - result = NodeFactory::CreateTerm(ITE,width,NodeFactory::CreateNode(EQ,bm.CreateZeroConst(width),children[0][0]),bm.CreateOneConst(width),bm.CreateZeroConst(width)); - - break; - - case SBVDIV: - if (children[1].isConstant() && children[1] == bm.CreateOneConst(width)) - result = children[0]; - else if (children[0] == children[1] && bm.UserFlags.division_by_zero_returns_one_flag) - result = bm.CreateOneConst(width); - else if (children[1].GetKind() == BVUMINUS && children[0] == children[1][0] - && bm.UserFlags.division_by_zero_returns_one_flag) - result = NodeFactory::CreateTerm(SBVDIV, width, children[1], children[0]); - else if (bm.UserFlags.division_by_zero_returns_one_flag && children[0].isConstant() - && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = NodeFactory::CreateTerm(ITE, width, NodeFactory::CreateNode(EQ, children[1], bm.CreateZeroConst(width)), - bm.CreateOneConst(width), bm.CreateZeroConst(width)); - if (children[1].isConstant() && CONSTANTBV::BitVector_is_full(children[1].GetBVConst())) - result = NodeFactory::CreateTerm(BVUMINUS, width, children[0]); - break; - - case SBVREM: - { - const ASTNode one = bm.CreateOneConst(width); - const ASTNode zero = bm.CreateZeroConst(width); - const ASTNode max = bm.CreateMaxConst(width); - - if (children[0] == children[1]) - result = bm.CreateZeroConst(width); - else if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = bm.CreateZeroConst(width); - else if (children[1].isConstant() && CONSTANTBV::BitVector_is_full(children[1].GetBVConst())) - result = bm.CreateZeroConst(width); - else if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = children[0]; - else if (children[1].isConstant() && bm.CreateOneConst(width) == children[1]) - result = bm.CreateZeroConst(width); - else if (children[1].GetKind() == BVUMINUS) - result = NodeFactory::CreateTerm(SBVREM, width, children[0], children[1][0]); - else if (children[0].GetKind() == BVUMINUS && children[0][0] == children[1]) - result = bm.CreateZeroConst(width); -#if 0 - else if ( width >= 4 && children[0].GetKind() == BVNEG && children[1] == children[0][0] ) - result = bm.CreateTerm(BVUMINUS,width,bm.CreateTerm(SBVMOD,width,one,children[0][0]));//9350 -> 624 | 3072 ms - else if ( width >= 4 && children[1].GetKind() == BVNEG && children[1][0] == children[0] ) - result = bm.CreateTerm(BVUMINUS,width,bm.CreateTerm(SBVMOD,width,one,children[1]));//9350 -> 624 | 2402 ms - else if ( width >= 4 && children[0].GetKind() == BVUMINUS && children[1] == max) - result = bm.CreateTerm(BVUMINUS,width,bm.CreateTerm(SBVREM,width,children[0][0],children[1]));//123 -> 83 | 1600 ms -#endif - } - - - break; - - case BVMOD: - { - if (children[0] == children[1]) - result = bm.CreateZeroConst(width); - - if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(children[0].GetBVConst())) - result = bm.CreateZeroConst(width); - - if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(children[1].GetBVConst())) - result = children[0]; - - if (children[0].GetKind() == BVPLUS && children[0].Degree() == 2 && children[0][0] == bm.CreateMaxConst(width) - && children[1] == children[0][1]) - result = children[0]; - - const ASTNode one = bm.CreateOneConst(width); - - if (children[0].GetKind() == BVNEG && children[1].GetKind() == BVUMINUS && children[1][0] == children[0][0]) - result = children[0]; - - if (children[1].isConstant() && children[1] == one) - result = bm.CreateZeroConst(width); - - if (children[0].isConstant() && children[0] == one) - result = NodeFactory::CreateTerm(ITE, width, NodeFactory::CreateNode(EQ, children[1], one), - bm.CreateZeroConst(width), one); -#if 0 - if ( width >= 3 && children[0].GetKind() == BVNEG && children[1] == children[0][0] ) - result = NodeFactory::CreateTerm(BVMOD,width,bm.CreateMaxConst(width),children[0][0]);//3285 -> 3113 - - if ( width >= 3 && children[1].GetKind() == BVNEG && children[1][0] == children[0] ) - result = NodeFactory::CreateTerm(BVMOD,width,bm.CreateMaxConst(width),children[1]);//3285 -> 3113 - - if ( width >= 4 && children[0].GetKind() == BVUMINUS && children[1].GetKind() == BVNEG && children[1][0] == children[0][0] ) - result = NodeFactory::CreateTerm(SBVREM,width,one,children[1]); //8883 -> 206 | 1566 ms -#endif - } - - break; - - case BEEV::WRITE: - if (children[0].GetKind() == BEEV::WRITE && children[1] == children[0][1]) - { - // If the indexes of two writes are the same, then discard the inner write. - result = NodeFactory::CreateArrayTerm(BEEV::WRITE, children[0].GetIndexWidth(), children[0].GetValueWidth(), - children[0][0], children[1], children[2]); - } - else if (children[2].GetKind() == BEEV::READ && children[0] == children[2][0] && children[1] == children[2][1]) - { - // Its writing into the array what's already there. i.e. a[i] = a[i] - result = children[0]; - } - break; - - case BEEV::READ: - if (children[0].GetKind() == BEEV::WRITE) - { - result = chaseRead(children, width); - } - break; - - default: // quieten compiler. - break; - } - - if (result.IsNull()) - result = hashing.CreateTerm(kind, width, children); - - return result; -} diff --git a/src/vendor/stp/src/AST/NodeFactory/SimplifyingNodeFactory.h b/src/vendor/stp/src/AST/NodeFactory/SimplifyingNodeFactory.h deleted file mode 100644 index d1df19bb5..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/SimplifyingNodeFactory.h +++ /dev/null @@ -1,72 +0,0 @@ -/* A node factory that: - * * Sorts children to increases sharing, - * * Performs constant evaluation, - * * performs simplify boolean simplifications, - * * converts less thans to greater thans. - * - * NOTE: CreateNode doesn't necessary return a node with the same Kind as what it was called - * with. For example: (AND TRUE FALSE) will return FALSE. Which isn't an AND node. - * - * The intention is to never create nodes that will later be simplified by single level - * re-write rules. So we will never create the node (NOT(NOT x)). This is and example of - * a multi-level rule that never increases the global number of nodes. - * - * These rules never increase the total number of nodes. They are complimented by - * multi-level re-write rules that consider the global reference count when simplifying. - * - */ - -#ifndef SIMPLIFYINGNODEFACTORY_H -#define SIMPLIFYINGNODEFACTORY_H - -#include "NodeFactory.h" -#include "../../STPManager/STPManager.h" - -using BEEV::ASTNode; -using BEEV::ASTVec; - -class SimplifyingNodeFactory: public NodeFactory -{ - -private: - NodeFactory& hashing; - - const ASTNode& ASTTrue; - const ASTNode& ASTFalse; - const ASTNode& ASTUndefined; - - ASTNode CreateSimpleFormITE(const ASTVec &children); - ASTNode CreateSimpleXor(const ASTVec &children); - ASTNode CreateSimpleAndOr(bool IsAnd, const ASTVec &children); - ASTNode CreateSimpleAndOr(bool IsAnd, const ASTNode& form1, - const ASTNode& form2); - ASTNode CreateSimpleNot(const ASTNode& form); - ASTNode CreateSimpleNot(const ASTVec& children); - - ASTNode CreateSimpleEQ(const ASTVec& children); - - SimplifyingNodeFactory(const SimplifyingNodeFactory& ); - SimplifyingNodeFactory& operator=(const SimplifyingNodeFactory&); - - ASTNode chaseRead(const ASTVec& children, unsigned int width ); - - ASTNode plusRules(const ASTNode& n0, const ASTNode& n1); -public: - - virtual BEEV::ASTNode CreateNode(BEEV::Kind kind, const BEEV::ASTVec & children); - virtual BEEV::ASTNode CreateTerm(BEEV::Kind kind, unsigned int width, const BEEV::ASTVec &children); - - virtual std::string getName() {return "simplifying";} - - SimplifyingNodeFactory(NodeFactory& raw_, BEEV::STPMgr& bm_) - :hashing(raw_), NodeFactory(bm_), ASTTrue(bm_.ASTTrue), ASTFalse(bm_.ASTFalse), ASTUndefined(bm_.ASTUndefined) - { - } - ; - ~SimplifyingNodeFactory() - { - } - -}; - -#endif diff --git a/src/vendor/stp/src/AST/NodeFactory/TypeChecker.cpp b/src/vendor/stp/src/AST/NodeFactory/TypeChecker.cpp deleted file mode 100644 index 2ef2afc33..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/TypeChecker.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "TypeChecker.h" -#include "../AST.h" - -BEEV::ASTNode TypeChecker::CreateTerm(BEEV::Kind kind, unsigned int width, const BEEV::ASTVec &children) -{ - BEEV::ASTNode r = f.CreateTerm(kind,width,children); - BVTypeCheck(r); - return r; -} - -//virtual BEEV::ASTNode CreateNode(BEEV::Kind kind, const BEEV::ASTVec& children); -BEEV::ASTNode TypeChecker::CreateNode(BEEV::Kind kind, const BEEV::ASTVec& children) -{ - BEEV::ASTNode r = f.CreateNode(kind,children); - BVTypeCheck(r); - return r; -} - -BEEV::ASTNode TypeChecker::CreateArrayTerm(Kind kind, unsigned int index, - unsigned int width, const BEEV::ASTVec &children) -{ - ASTNode r = f.CreateTerm(kind, width, children); - r.SetIndexWidth(index); - BVTypeCheck(r); - return r; -} - diff --git a/src/vendor/stp/src/AST/NodeFactory/TypeChecker.h b/src/vendor/stp/src/AST/NodeFactory/TypeChecker.h deleted file mode 100644 index 87a3d27b5..000000000 --- a/src/vendor/stp/src/AST/NodeFactory/TypeChecker.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - A decorator pattern, which calls some base node factory, then type checks each of the results. - */ - -#ifndef TYPECHECKER_H_ -#define TYPECHECKER_H_ - -#include "NodeFactory.h" -#include "../../STPManager/STPManager.h" - -namespace BEEV -{ -class BeevMgr; -} -using BEEV::STPMgr; - -class TypeChecker : public NodeFactory -{ -NodeFactory& f; - -public: - TypeChecker(NodeFactory& f_, STPMgr& bm_) : f(f_), NodeFactory(bm) - {} - - BEEV::ASTNode CreateTerm(BEEV::Kind kind, unsigned int width, const BEEV::ASTVec &children); - BEEV::ASTNode CreateNode(BEEV::Kind kind, const BEEV::ASTVec& children); - BEEV::ASTNode CreateArrayTerm(Kind kind, unsigned int index,unsigned int width, const BEEV::ASTVec &children); - - virtual string getName() {return "type checking";} -}; - -#endif /* TYPECHECKER_H_ */ diff --git a/src/vendor/stp/src/AST/RunTimes.cpp b/src/vendor/stp/src/AST/RunTimes.cpp deleted file mode 100644 index a7adb9c90..000000000 --- a/src/vendor/stp/src/AST/RunTimes.cpp +++ /dev/null @@ -1,120 +0,0 @@ -//Hold the runtime statistics. E.g. how long was spent in simplification. -//The times don't add up to the runtime, because we allow multiple times to -//be counted simultaneously. For example, the current Transform()s call -//Simplify_TopLevel, so inside simplify time will be counted towards both -//Simplify_TopLevel & Transform. - -// This is intended as a low overhead profiling class. So runtimes can -// always be tracked. - -#include -#include -#include -#include -#include -#include "RunTimes.h" -#include "../sat/utils/System.h" - -// BE VERY CAREFUL> Update the Category Names to match. -std::string RunTimes::CategoryNames[] = { "Transforming", "Simplifying", "Parsing", "CNF Conversion", "Bit Blasting", "SAT Solving", "Bitvector Solving","Variable Elimination", "Sending to SAT Solver", "Counter Example Generation","SAT Simplification", "Constant Bit Propagation","Array Read Refinement", "Applying Substitutions", "Removing Unconstrained", "Pure Literals" , "ITE Contexts", "AIG core simplification", "Interval Propagation", "Always True"}; - -namespace BEEV -{ - void FatalError(const char * str); -} - - -long RunTimes::getCurrentTime() -{ - timeval t; - gettimeofday(&t, NULL); - return (1000 * t.tv_sec) + (t.tv_usec / 1000); -} - -void RunTimes::print() -{ - if (0 != category_stack.size()) - { - std::cerr << "size:" << category_stack.size() << std::endl; - std::cerr << "top:" << CategoryNames[category_stack.top().first] << std::endl; - BEEV::FatalError("category stack is not yet empty!!"); - } - - std::ostringstream result; - result << "statistics\n"; - std::map::const_iterator it1 = counts.begin(); - std::map::const_iterator it2 = times.begin(); - - int cummulative_ms = 0; - - while (it1 != counts.end()) - { - int time_ms = 0; - if ((it2 = times.find(it1->first)) != times.end()) - time_ms = it2->second; - - if (time_ms!=0) - { - result << " " << CategoryNames[it1->first] << ": " << it1->second; - result << " [" << time_ms << "ms]"; - result << std::endl; - cummulative_ms += time_ms; - } - it1++; - } - std::cerr << result.str(); - std::cerr << std::fixed; - std::cerr.precision(2); - std::cerr << "Statistics Total: " << ((double)cummulative_ms)/1000 << "s" << std::endl; - std::cerr << "CPU Time Used : " << Minisat::cpuTime() << "s" << std::endl; - std::cerr << "Peak Memory Used: " << Minisat::memUsedPeak() << "MB" << std::endl; - - clear(); - -} - -void RunTimes::addTime(Category c, long milliseconds) -{ - std::map::iterator it; - if ((it = times.find(c)) == times.end()) - { - times[c] = milliseconds; - } - else - { - it->second += milliseconds; - } - -} - -void RunTimes::addCount(Category c) -{ - std::map::iterator it; - if ((it = counts.find(c)) == counts.end()) - { - counts[c] = 1; - } - else - { - it->second++; - } -} - -void RunTimes::stop(Category c) -{ - Element e = category_stack.top(); - category_stack.pop(); - if (e.first != c) - { - std::cerr << e.first; - std::cerr << c; - BEEV::FatalError("Don't match"); - } - addTime(c, getCurrentTime() - e.second); - addCount(c); -} - -void RunTimes::start(Category c) -{ - category_stack.push(std::make_pair(c, getCurrentTime())); -} diff --git a/src/vendor/stp/src/AST/RunTimes.h b/src/vendor/stp/src/AST/RunTimes.h deleted file mode 100644 index f606da663..000000000 --- a/src/vendor/stp/src/AST/RunTimes.h +++ /dev/null @@ -1,106 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef RUNTIMES_H -#define RUNTIMES_H - -#include -#include -#include -#include "../sat/utils/System.h" -#include -#include "../boost/noncopyable.hpp" - -class RunTimes : boost::noncopyable -{ -public: - enum Category - { - Transforming = 0, - SimplifyTopLevel, - Parsing, - CNFConversion, - BitBlasting, - Solving, - BVSolver, - PropagateEqualities, - SendingToSAT, - CounterExampleGeneration, - SATSimplifying, - ConstantBitPropagation, - ArrayReadRefinement, - ApplyingSubstitutions, - RemoveUnconstrained, - PureLiterals, - UseITEContext, - AIGSimplifyCore, - IntervalPropagation, - AlwaysTrue - }; - - static std::string CategoryNames[]; - - typedef std::pair Element; - -private: - RunTimes& operator =(const RunTimes&); - RunTimes(const RunTimes& other); - - std::map counts; - std::map times; - std::stack category_stack; - - // millisecond precision timer. - long getCurrentTime(); - void addTime(Category c, long milliseconds); - - long lastTime; - -public: - - void addCount(Category c); - void start(Category c); - void stop(Category c); - void print(); - - std::string getDifference() - { - std::stringstream s; - long val = getCurrentTime(); - s << (val - lastTime) << "ms" ; - lastTime = val; - s << ":" << std::setiosflags(std::ios::fixed) << std::setprecision(0) << Minisat::memUsed() << "M"; - return s.str(); - } - - void resetDifference() - { - getDifference(); - } - - void difference() - { - std::cout << getDifference()<< std::endl << std::endl; - - } - - RunTimes() - { - lastTime = getCurrentTime(); - } - - void clear() - { - counts.clear(); - times.clear(); - category_stack.empty(); - } -}; - -#endif diff --git a/src/vendor/stp/src/AST/STLport_config.h b/src/vendor/stp/src/AST/STLport_config.h deleted file mode 100644 index 9b7bc14f5..000000000 --- a/src/vendor/stp/src/AST/STLport_config.h +++ /dev/null @@ -1,20 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh, David L. Dill - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -// STLport debug checking, if we use STLport threads flag is to get -// rid of link errors, since iostreams compiles with threads. alloc -// and uninitialized are extra checks Later on, if used with Purify or -// Valgrind, may want to set flags to prevent reporting of false -// leaks. For some reason, _STLP_THREADS works on the command line -// but not here (?) -#define _STLP_THREADS -#define _STLP_DEBUG 1 -#define _STLP_DEBUG_LEVEL _STLP_STANDARD_DBG_LEVEL -#define _STLP_DEBUG_ALLOC 1 -#define _STLP_DEBUG_UNINITIALIZED 1 diff --git a/src/vendor/stp/src/AST/TestAST/asttest.cpp b/src/vendor/stp/src/AST/TestAST/asttest.cpp deleted file mode 100644 index 1e33ca9ed..000000000 --- a/src/vendor/stp/src/AST/TestAST/asttest.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "../AST.h" - -using namespace BEEV; - -int main() -{ - - BeevMgr * bm = new BeevMgr(); - ASTNode s1 = bm->CreateSymbol("foo"); - s1 = bm->CreateSymbol("foo1"); - s1 = bm->CreateSymbol("foo2"); - ASTNode s2 = bm->CreateSymbol("bar"); - cout << "s1" << s1 << endl; - cout << "s2" << s2 << endl; - - ASTNode b1 = bm->CreateBVConst(5, 12); - ASTNode b2 = bm->CreateBVConst(6, 36); - cout << "b1: " << b1 << endl; - cout << "b2: " << b2 << endl; - - ASTNode a1 = bm->CreateNode(EQ, s1, s2); - ASTNode a2 = bm->CreateNode(AND, s1, s2); - a1 = bm->CreateNode(OR, s1, s2); - ASTNode a3 = bm->CreateNode(IMPLIES, a1, a2); - ASTNode a4 = bm->CreateNode(IMPLIES, s1, a2); - cout << "a3" << a3 << endl; - cout << "a4" << a4 << endl; - return 0; -} diff --git a/src/vendor/stp/src/AST/TestAST/bbtest.cpp b/src/vendor/stp/src/AST/TestAST/bbtest.cpp deleted file mode 100644 index 838b3c41a..000000000 --- a/src/vendor/stp/src/AST/TestAST/bbtest.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "../AST.h" - -using namespace BEEV; - -int main() -{ - const int size = 32; - - BeevMgr *bm = new BeevMgr(); - ASTNode s1 = bm->CreateSymbol("x"); - s1.SetValueWidth(size); - cout << "s1" << s1 << endl; - ASTNode s2 = bm->CreateSymbol("y"); - s2.SetValueWidth(size); - cout << "s2" << s2 << endl; - ASTNode s3 = bm->CreateSymbol("z"); - s3.SetValueWidth(size); - cout << "s3" << s3 << endl; - - ASTNode c1 = bm->CreateBVConst(size, 0); - cout << "c1" << c1 << endl; - ASTVec bbc1 = bm->BBTerm(c1); - cout << "bitblasted c1 " << endl; - LispPrintVec(cout, bbc1, 0); - cout << endl; - bm->AlreadyPrintedSet.clear(); - - ASTNode c2 = bm->CreateBVConst(size, 1); - c2.SetValueWidth(size); - cout << "c2" << c2 << endl; - ASTVec bbc2 = bm->BBTerm(c2); - cout << "bitblasted c2 " << endl; - LispPrintVec(cout, bbc2, 0); - cout << endl; - bm->AlreadyPrintedSet.clear(); - - ASTNode c3 = bm->CreateBVConst(size, 0xFFFFFFFF); - c3.SetValueWidth(size); - cout << "c3" << c3 << endl; - ASTVec bbc3 = bm->BBTerm(c3); - cout << "bitblasted c3 " << endl; - LispPrintVec(cout, bbc3, 0); - cout << endl; - bm->AlreadyPrintedSet.clear(); - - ASTNode c4 = bm->CreateBVConst(size, 0xAAAAAAAA); - c4.SetValueWidth(size); - cout << "c4" << c4 << endl; - ASTVec bbc4 = bm->BBTerm(c4); - cout << "bitblasted c4 " << endl; - LispPrintVec(cout, bbc4, 0); - cout << endl; - bm->AlreadyPrintedSet.clear(); - - // ASTNode b1 = bm->CreateBVConst(12); - // ASTNode b2 = bm->CreateBVConst(36); - // cout << "b1: " << b1 << endl; - // cout << "b2: " << b2 << endl; - - ASTNode a1 = bm->CreateNode(BVPLUS, s1, s2); - a1.SetValueWidth(size); - - ASTVec& bba1 = bm->BBTerm(a1); - cout << "bitblasted a1 " << endl; - LispPrintVec(cout, bba1, 0); - cout << endl; - bm->AlreadyPrintedSet.clear(); - - ASTNode a2 = bm->CreateNode(BVPLUS, s1, s2, s3); - a1.SetValueWidth(2); - - ASTVec& bba2 = bm->BBTerm(a2); - cout << "bitblasted a2 " << endl; - LispPrintVec(cout, bba2, 0); - cout << endl; - bm->AlreadyPrintedSet.clear(); - - ASTNode a3 = bm->CreateNode(BVXOR, s1, s2); - a3.SetValueWidth(2); - - ASTVec& bba3 = bm->BBTerm(a3); - cout << "bitblasted a3 " << endl; - LispPrintVec(cout, bba3, 0); - cout << endl; - bm->AlreadyPrintedSet.clear(); - - ASTNode a4 = bm->CreateNode(EQ, s1, s2); - ASTNode bba4 = bm->BBForm(a4); - cout << "bitblasted a4 " << endl << bba4 << endl; - - ASTNode a5 = bm->CreateNode(BVLE, s1, s2); - ASTNode bba5 = bm->BBForm(a5); - cout << "bitblasted a5 " << endl << bba5 << endl; - - return 0; -} diff --git a/src/vendor/stp/src/AST/TestAST/cnftest.cpp b/src/vendor/stp/src/AST/TestAST/cnftest.cpp deleted file mode 100644 index efffde5bb..000000000 --- a/src/vendor/stp/src/AST/TestAST/cnftest.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// -*- c++ -*- - -// Test program for CNF conversion. - -#include "../AST.h" - -using namespace BEEV; - -int main() -{ - const int size = 1; - - BeevMgr *bm = new BeevMgr(); - ASTNode s1 = bm->CreateSymbol("x"); - s1.SetValueWidth(size); - - cout << "s1" << s1 << endl; - ASTNode s2 = bm->CreateSymbol("y"); - s2.SetValueWidth(size); - - cout << "s2" << s2 << endl; - ASTNode s3 = bm->CreateSymbol("z"); - s3.SetValueWidth(size); - - cout << "s3" << s3 << endl; - - ASTNode bbs1 = bm->BBForm(s1); - cout << "bitblasted s1" << endl << bbs1 << endl; - bm->PrintClauseList(cout, bm->ToCNF(bbs1)); - - ASTNode a2 = bm->CreateNode(AND, s1, s2); - ASTNode bba2 = bm->BBForm(a2); - cout << "bitblasted a2" << endl << bba2 << endl; - bm->PrintClauseList(cout, bm->ToCNF(bba2)); - - ASTNode a3 = bm->CreateNode(OR, s1, s2); - ASTNode bba3 = bm->BBForm(a3); - cout << "bitblasted a3" << endl << bba3 << endl; - bm->PrintClauseList(cout, bm->ToCNF(bba3)); - - ASTNode a4 = bm->CreateNode(EQ, s1, s2); - ASTNode bba4 = bm->BBForm(a4); - cout << "bitblasted a4 " << endl << bba4 << endl; - - bm->PrintClauseList(cout, bm->ToCNF(bba4)); - -} diff --git a/src/vendor/stp/src/AST/UsefulDefs.h b/src/vendor/stp/src/AST/UsefulDefs.h deleted file mode 100644 index 7a17bb9fc..000000000 --- a/src/vendor/stp/src/AST/UsefulDefs.h +++ /dev/null @@ -1,124 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -#ifndef USEFULDEFS_H -#define USEFULDEFS_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../main/Globals.h" -#include "ASTKind.h" -#include "../extlib-constbv/constantbv.h" -#include "RunTimes.h" - -#ifdef EXT_HASH_MAP -#include -#include -#elif defined(TR1_UNORDERED_MAP) -#include -#include -#define hash_map std::unordered_map -#define hash_set std::unordered_set -#define hash_multiset std::unordered_multiset -#else -#include -#include -#endif - -#define MAP map -#define HASHMAP hash_map -#define HASHSET hash_set -#define HASHMULTISET hash_multiset -#define INITIAL_TABLE_SIZE 100 - -using namespace std; -namespace BEEV { -#ifdef EXT_HASH_MAP - using namespace __gnu_cxx; -#endif - - /****************************************************************** - * Important classes declared as part of AST datastructures * - * * - ******************************************************************/ - class STPMgr; - class ASTNode; - class ASTInternal; - class ASTInterior; - class ASTSymbol; - class ASTBVConst; - class BVSolver; - - /****************************************************************** - * Useful typedefs: * - * * - * Vector of ASTNodes, used for child nodes among other things. * - * It is good to define hash_map and hash_set in case we want to * - * use libraries other than STL. * - ******************************************************************/ - typedef vector ASTVec; - typedef unsigned int * CBV; - extern ASTVec _empty_ASTVec; - - // Error handling function - extern void (*vc_error_hdlr)(const char* err_msg); - - /****************************************************************** - * Class Spacer: - * - * Spacer class is basically just an int, but the new class allows - * overloading of << with a special definition that prints the int - * as that many spaces. - ******************************************************************/ - class Spacer { - public: - int _spaces; - Spacer(int spaces) - { - _spaces = spaces; - } - friend ostream& operator<<(ostream& os, const Spacer &ind); - }; //End of class spacer - - inline Spacer spaces(int width) { - Spacer sp(width); - return sp; - } - - struct eqstr { - bool operator()(const char* s1, const char* s2) const { - return strcmp(s1, s2) == 0; - } - }; - - // function_counters: Table for storing function count stats. -#ifdef TR1_UNORDERED_MAP - typedef std::unordered_map< - const char*, - int, - std::hash, - eqstr> function_counters; -#else - typedef HASHMAP, - eqstr> function_counters; -#endif -}; //end of namespace - -#endif diff --git a/src/vendor/stp/src/AST/genkinds.pl b/src/vendor/stp/src/AST/genkinds.pl deleted file mode 100755 index 44bcf46d2..000000000 --- a/src/vendor/stp/src/AST/genkinds.pl +++ /dev/null @@ -1,124 +0,0 @@ -#! /usr/bin/env perl - -#AUTHORS: Vijay Ganesh, David L. Dill BEGIN DATE: November, 2005 -#LICENSE: Please view LICENSE file in the home dir of this Program -#given a file containing kind names, one per line produces .h and .cpp -#files for the kinds. - -#globals -@kindnames = (); -$minkids = 0; -$maxkids = 0; -@cat_bits = (); -@category_names = (); -%cat_index = (); - -$now = localtime time; - -sub read_kind_defs { - open(KFILE, "< ASTKind.kinds") || die "Cannot open .kinds file: $!\n"; - @kindlines = ; - close(KFILE) -} - -# create lists of things indexed by kinds. -sub split_fields { - my $kind_cat_bits; - # matches anything with three whitespace-delimited alphanumeric fields, - # followed by rest of line. Automatically ignores lines beginning with '#' and blank lines. - for (@kindlines) { - if (/Categories:\s+(.*)/) { - @category_names = split(/\s+/, $1); - $i = 0; - for (@category_names) { - $cat_index{$_} = $i++; - # print "cat_index{$_} = $i\n"; - } - } - elsif (/^(\w+)\s+(\w+)\s+(\w+|-)\s+(.*)/) { - push(@kindnames, $1); - push(@minkids, $2); - push(@maxkids, $3); - @kind_cats = split(/\s+/, $4); - # build a bit vector of categories. - $kind_cat_bits = 0; - for (@kind_cats) { - $kind_cat_bits |= (1 << int($cat_index{$_})); - } - push(@cat_bits, $kind_cat_bits); - } - } -} - -sub gen_h_file { - open(HFILE, "> ASTKind.h") || die "Cannot open .h file: $!\n"; - - print HFILE - "// -*- c++ -*-\n", - "#ifndef TESTKINDS_H\n", - "#define TESTKINDS_H\n", - "// Generated automatically by genkinds.pl from ASTKind.kinds $now.\n", - "// Do not edit\n", - "#include \n", - "namespace BEEV {\n typedef enum {\n"; - - for (@kindnames) { - print HFILE " $_,\n"; - } - - print HFILE - "} Kind;\n\n", - "extern unsigned char _kind_categories[];\n\n"; - - # For category named "cat", generate functions "bool is_cat_kind(k);" - - - for (@category_names) { - my $catname = $_; - my $kind_cat_bit = (1 << int($cat_index{$catname})); - print HFILE "inline bool is_", $catname, "_kind(Kind k) { return (_kind_categories[k] & $kind_cat_bit); }\n\n" - } - - print HFILE - "extern const char *_kind_names[];\n\n", - "/** Prints symbolic name of kind */\n", - "inline std::ostream& operator<<(std::ostream &os, const Kind &kind) { os << _kind_names[kind]; return os; }\n", - "\n\n", - "}; // end namespace\n", - "\n\n#endif\n"; - - close(HFILE); -} - -# generate the .cpp file - -sub gen_cpp_file { - open(CPPFILE, "> ASTKind.cpp") || die "Cannot open .h file: $!\n"; - - print CPPFILE - "// Generated automatically by genkinds.h from ASTKind.kinds $now.\n", - "// Do not edit\n", - "namespace BEEV {\n", - "const char * _kind_names[] = {\n"; - for (@kindnames) { - print CPPFILE " \"$_\",\n"; - } - print CPPFILE "};\n\n"; - - # category bits - print CPPFILE - "unsigned char _kind_categories[] = {\n"; - for (@cat_bits) { - print CPPFILE " $_,\n"; - } - print CPPFILE - "};\n", - "\n}; // end namespace\n"; - - close(CPPFILE); -} - -&read_kind_defs; -&split_fields; -&gen_h_file; -&gen_cpp_file; diff --git a/src/vendor/stp/src/LICENSE/AUTHORS b/src/vendor/stp/src/LICENSE/AUTHORS deleted file mode 100644 index d0949519b..000000000 --- a/src/vendor/stp/src/LICENSE/AUTHORS +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************** - * PROGRAM NAME: STP (Simple Theorem Prover) - * - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -Primary Author and Project Leader ---------------------------------- -* Vijay Ganesh, - Stanford University, Stanford, CA, USA (Nov, 2005 to 2007), - MIT, Cambridge, MA, USA (Oct, 2007 to present) - - -Other Significant Author ------------------------- -* Trevor Alexander Hansen, - University of Melbourne, Australia (Sep, 2008 - present) - - -Authors who contributed some code ---------------------------------------- -* Michael Katelman, - University of Illinois, Urbana-Champaign, USA (July - Oct, 2008) - -* David L. Dill, - Stanford University, Stanford, CA, USA (Nov - Dec, 2005) - -* Tim King, - Stanford University, Stanford, CA, USA (July - Sep, 2007) - -* Philip Guo, - Stanford University, Stanford, CA, USA (Dec 2008) - -* Mate Soos, - Paris University 6, Paris, France (Nov 2009 - present) - -* Raphael Michel - University of Namur (FUNDP) / CETIC Research Center, Belgium (Nov 2011 - present) diff --git a/src/vendor/stp/src/LICENSE/LICENSE b/src/vendor/stp/src/LICENSE/LICENSE deleted file mode 100644 index 0891de8fb..000000000 --- a/src/vendor/stp/src/LICENSE/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************** - * PROGRAM NAME: STP (Simple Theorem Prover) - * - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - ********************************************************************/ - -The MIT License - -Copyright (c) 2008 Vijay Ganesh - -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. diff --git a/src/vendor/stp/src/LICENSE/LICENSE_COMPONENTS b/src/vendor/stp/src/LICENSE/LICENSE_COMPONENTS deleted file mode 100644 index 6d3ba5559..000000000 --- a/src/vendor/stp/src/LICENSE/LICENSE_COMPONENTS +++ /dev/null @@ -1,174 +0,0 @@ -STP links to copyrighted librarys: - * Minisat Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson. - * Bit::Vector Copyright (c) 1995 - 2004 by Steffen Beyer. - * CVC's SMT-LIB Parser Copyright (C) 2004 by the Board of Trustees of Leland Stanford Junior University and by New York University. - * CryptoMinisat Copyright (c) 2009 Mate Soos - * ocaml-wrapper Copyright BitBlaze, 2007. All rights reserved. - * ABC by Alan Mishchenko - * Boost by various: http://www.boost.org/ - -MINISAT - /**************************************************************************************** - MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - - 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. - **************************************************************************************************/ - -Bit::Vector - /*****************************************************************************/ - /* LICENSE: */ - /*****************************************************************************/ - /* */ - /* This library is free software; you can redistribute it and/or */ - /* modify it under the terms of the GNU Library General Public */ - /* License as published by the Free Software Foundation; either */ - /* version 2 of the License, || (at your option) any later version. */ - /* */ - /* This library is distributed in the hope that it will be useful, */ - /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ - /* MERCHANTABILITY || FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ - /* Library General Public License for more details. */ - /* */ - /* You should have received a copy of the GNU Library General Public */ - /* License along with this library; if not, write to the */ - /* Free Software Foundation, Inc., */ - /* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - /* */ - /* || download a copy from ftp://ftp.gnu.org/pub/gnu/COPYING.LIB-2.0 */ - /* */ - /*****************************************************************************/ - -CVC's SMT-LIB Parser - /******************************************************************** - * - * \file smtlib.y - * - * Author: Sergey Berezin, Clark Barrett - * - * Created: Apr 30 2005 - * - *
- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford - * Junior University and by New York University. - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - * - *
- ********************************************************************/ - -Cryptominisat - CryptoMiniSat -- Copyright (c) 2009 Mate Soos - - 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. - - -ocaml-wrapper - ////////////////////////////////////////////////////////// - // - // Owned and copyright BitBlaze, 2007. All rights reserved. - // - ////////////////////////////////////////////////////////// - - 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. - -ABC - Copyright (c) The Regents of the University of California. All rights reserved. - - Permission is hereby granted, without written agreement and without license or - royalty fees, to use, copy, modify, and distribute this software and its - documentation for any purpose, provided that the above copyright notice and - the following two paragraphs appear in all copies of this software. - - IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR - DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF - THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF - CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, - AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, - SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - - - -Boost - Boost Software License - Version 1.0 - August 17th, 2003 - - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - - 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. diff --git a/src/vendor/stp/src/Makefile b/src/vendor/stp/src/Makefile deleted file mode 100644 index 988253af1..000000000 --- a/src/vendor/stp/src/Makefile +++ /dev/null @@ -1,134 +0,0 @@ -SRCTOP=. -include Makefile.common - -STPDIR=.. -LIB_DIR=$(STPDIR)/lib -INCLUDE_DIR=$(STPDIR)/include - -HEADERS=c_interface/*.h - -# BSD cp does not have the -d flag -ifneq ($(OSTYPE), Linux) -CP = cp -Rf -else -CP = cp -df -endif - -ifeq ($(OSTYPE), Darwin) -LIBRARIES=lib/libstp.dylib -SNAME = libstp.dylib -else -LIBRARIES=lib/libstp.so.1 lib/libstp.so -SNAME = libstp.so.1 -endif - -.PHONY: all -all: $(LIBRARIES) - - -# The CC command for linking static libraries into a library is tricky -# and different for Linux and Mac OS -ifeq ($(OSTYPE), Darwin) -LIBCCARGS = c_interface/c_interface.o \ - extlib-constbv/libconstantbv.a extlib-abc/libabc.a \ - to-sat/libtosat.a \ - STPManager/libstpmgr.a simplifier/libsimplifier.a \ - absrefine_counterexample/libabstractionrefinement.a \ - AST/libast.a \ - printer/libprinter.a \ - sat/libminisat.a \ - cpp_interface/libcppinterface.a \ - parser/libparser.a \ - main/libmain.a -else -LIBCCARGS = -Lto-sat -Wl,--whole-archive -ltosat -Wl,--no-whole-archive \ - c_interface/c_interface.o \ - extlib-constbv/libconstantbv.a extlib-abc/libabc.a \ - STPManager/libstpmgr.a simplifier/libsimplifier.a \ - absrefine_counterexample/libabstractionrefinement.a \ - AST/libast.a \ - printer/libprinter.a \ - sat/libminisat.a \ - cpp_interface/libcppinterface.a \ - parser/libparser.a \ - main/libmain.a -endif - -lib/$(SNAME): c_interface/c_interface.o \ - extlib-constbv/libconstantbv.a extlib-abc/libabc.a \ - to-sat/libtosat.a \ - STPManager/libstpmgr.a simplifier/libsimplifier.a \ - absrefine_counterexample/libabstractionrefinement.a \ - AST/libast.a \ - printer/libprinter.a \ - sat/libminisat.a \ - cpp_interface/libcppinterface.a \ - parser/libparser.a \ - main/libmain.a - mkdir -p $(@D) - $(RM) $@ - @# For some reason, this line doesn't work - @# $(CXX) $(CFLAGS) $(SHAREDFLAG) -o $@ $^ - @# We use --whole-archive to ensure that all symbols in to-sat are used - $(CXX) $(CFLAGS) $(SHAREDFLAG) -Wl,$(SONAMEFLAG),$(SNAME) -o $@ $(LIBCCARGS) - -ifneq ($(OSTYPE), Darwin) -lib/libstp.so: lib/libstp.so.1 - -rm -f $@ - (cd lib; ln -s libstp.so.1 libstp.so) -endif - - -# During the build of AST some classes are built that most of the other -# classes depend upon. So in a parallel make, AST should be made first. -c_interface/c_interface.o \ -STPManager/libstpmgr.a printer/libprinter.a \ -absrefine_counterexample/libabstractionrefinement.a \ -to-sat/libtosat.a simplifier/libsimplifier.a \ -cpp_interface/libcppinterface.a \ -extlib-constbv/libconstantbv.a extlib-abc/libabc.a parser/libparser.a \ -main/libmain.a: AST/libast.a - -sat/libminisat.a: MAKEGOALS=core - -c_interface/c_interface.o \ -AST/libast.a STPManager/libstpmgr.a printer/libprinter.a \ -absrefine_counterexample/libabstractionrefinement.a \ -to-sat/libtosat.a sat/libminisat.a simplifier/libsimplifier.a \ -extlib-constbv/libconstantbv.a extlib-abc/libabc.a \ -cpp_interface/libcppinterface.a \ -parser/libparser.a main/libmain.a: - $(MAKE) -C $(@D) $(MAKEGOALS) - -#### - -.PHONY: install -install: all - mkdir -p $(LIB_DIR) - mkdir -p $(INCLUDE_DIR) - $(CP) $(LIBRARIES) $(LIB_DIR) - $(CP) $(HEADERS) $(INCLUDE_DIR) - mv $(INCLUDE_DIR)/c_interface.h $(INCLUDE_DIR)/stp_c_interface.h - -.PHONY: clean -clean: - rm -rf lib - $(MAKE) clean -C AST - $(MAKE) clean -C STPManager - $(MAKE) clean -C printer - $(MAKE) clean -C extlib-constbv - $(MAKE) clean -C extlib-abc - $(MAKE) clean -C simplifier - $(MAKE) clean -C absrefine_counterexample - $(MAKE) clean -C to-sat - $(MAKE) clean -C sat - $(MAKE) clean -C c_interface - $(MAKE) clean -C cpp_interface - $(MAKE) clean -C parser - $(MAKE) clean -C main - -.PHONY: full_clean -full_clean: clean - $(RM) -R $(LIB_DIR) - $(RM) -R $(INCLUDE_DIR) - diff --git a/src/vendor/stp/src/Makefile.common b/src/vendor/stp/src/Makefile.common deleted file mode 100644 index 7bb6e2f41..000000000 --- a/src/vendor/stp/src/Makefile.common +++ /dev/null @@ -1,101 +0,0 @@ -TOP=$(SRCTOP)/../../../.. -include $(TOP)/platform.mk - -# Optimization -OPTIMIZE = -O3 -DNDEBUG -fomit-frame-pointer -#OPTIMIZE = -O3 -g # Debug - -CFLAGS_BASE += $(OPTIMIZE) -fPIC - -LDFLAGS += $(LDFLAGS_BASE) -CFLAGS += $(CFLAGS_BASE) $(CFLAGS_M32) - - -#Required by minisat2.2 -CFLAGS += -D __STDC_LIMIT_MACROS -D __STDC_FORMAT_MACROS - -#CXXFLAGS = $(CFLAGS) -Wall -Wextra -DEXT_HASH_MAP -Wno-deprecated -#CXXFLAGS = $(CFLAGS) -Wextra -DEXT_HASH_MAP -Wno-deprecated -#CXXFLAGS = $(CFLAGS) -DEXT_HASH_MAP -Wno-deprecated -CXXFLAGS = $(CFLAGS) -Wall -std=c++11 -DTR1_UNORDERED_MAP -Wno-deprecated -#CXXFLAGS = $(CFLAGS) -Wall -#LDFLAGS= -lstdc++ -#LDFLAGS= -lstdc++ -pg -#LDFLAGS= -lstlport_gcc_stldebug -#LDFLAGS= -L/home/vganesh/STLport/lib -lstlport -# quantify $(CXX) $(CFLAGS) $(LDFLAGS) lexPL.o parsePL.o main.o $(LIBS) -o parser - -LEX = flex -YACC = bison -d -y --debug -v - -# Flag for creating a shared library -ifeq ($(OSTYPE), Darwin) -SHAREDFLAG= -dynamiclib -SONAMEFLAG = -install_name -else -SHAREDFLAG= -shared -SONAMEFLAG = -soname -endif - - -# Run gcc to generate dependency rules for object files; use as follows: -# : -# $(call makedepend,,) -# -include -# -# Object files will be rebuilt if any of the following is updated: -# - the source file -# - a dependency (e.g., included header files) -# - the Makefile running this command -# - any file included by the Makefile, including this Makefile.common file, -# but excluding -# -# Note: do not use $^ as , since additional dependencies will be -# added to the dependency list of . -# -ifeq (,$(filter clean configclean distclean,$(MAKECMDGOALS))) -define makedepend - echo "Making dependencies" - $(RM) $(1) - $(foreach foo,$(2), - $(CXX) $(CXXFLAGS) \ - -MM -MG -MP \ - -MQ $(basename $(foo)).o -MQ $(1) \ - $(foo) \ - >> $(1) - ) - echo "$(addsuffix .o,$(basename $(2))) $(1) : $(filter-out $(1),$(MAKEFILE_LIST))" >> $(1) -endef -endif - - -# Concatenate ar archives: -# $(call arcat,destination.a,source1.a source2.a ...) -define arcat - $(call arcat.sh,$(abspath $(1)),$(shell mktemp -d $(CURDIR)/arcat-XXXXXXXXXX),$(abspath $(2))) -endef - -define arcat.sh - set -e; \ - trap "$(RM) -r $(2)" EXIT; \ - cd $(2); \ - $(3:%=$(AR) x %;) \ - $(RM) __.SYMDEF*; \ - $(AR) qcs $(1) * -endef - -# Concatenate ar archives into a shared library .so -# $(call arcat2,destination.so,source1.a source2.a ...) -define arcat2 - $(call arcat2.sh,$(abspath $(1)),$(shell mktemp -d $(CURDIR)/arcat-XXXXXXXXXX),$(abspath $(2))) -endef - -define arcat2.sh - set -e; \ - trap "$(RM) -r $(2)" EXIT; \ - cd $(2); \ - $(3:%=$(AR) x %;) \ - $(RM) __.SYMDEF*; \ - $(CC) $(CFLAGS) $(SHAREDFLAG) -o $(1) * -endef - diff --git a/src/vendor/stp/src/STPManager/DifficultyScore.h b/src/vendor/stp/src/STPManager/DifficultyScore.h deleted file mode 100644 index f3b238c9c..000000000 --- a/src/vendor/stp/src/STPManager/DifficultyScore.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef DIFFICULTYSCORE_H_ -#define DIFFICULTYSCORE_H_ - -#include "../AST/AST.h" -#include "../AST/AST.h" -#include "../AST/ASTKind.h" -#include -#include "../STPManager/NodeIterator.h" -#include "../boost/noncopyable.hpp" - -// estimate how difficult that input is to solve based on some simple rules. - -namespace BEEV -{ - struct DifficultyScore : boost::noncopyable - { - private: - int - eval(const ASTNode& b) - { - const Kind k = b.GetKind(); - - // These scores are approximately the number of AIG nodes created when - // no input values are known. - int score = 0; - if (k == BVMULT) - score = (5 * b.GetValueWidth() * b.GetValueWidth()); - else if (k == BVMOD) - score = (15 * b.GetValueWidth() * b.GetValueWidth()); - else if (isLikeDivision(k)) - score = (20 * b.GetValueWidth() * b.GetValueWidth()); - else if (k == BVCONCAT || k == BVEXTRACT || k == NOT) - { - } // no harder. - else if (k == EQ || k == BVGE || k == BVGT || k == BVSGE || k == BVSGT) - { - // without getting the width of the child it'd always be 2. - score = std::max(b[0].GetValueWidth(), 1u) * (b.Degree()); - } - else if (k == BVSUB) - { - // We convert subtract to a + (-b), we want the difficulty scores to be same. - score = std::max(b[0].GetValueWidth(), 1u) * 3; - } - else - { - score = std::max(b.GetValueWidth(), 1u) * (b.Degree()); - } - return score; - } - - static bool - isLikeDivision(const Kind& k) - { - return k == BVMULT || k == BVDIV || k == BVMOD || k == SBVDIV || k == SBVREM || k == SBVMOD; - } - - // maps from nodeNumber to the previously calculated difficulty score.. - map cache; - - public: - - int - score(const ASTNode& top) - { - if (cache.find(top.GetNodeNum()) != cache.end()) - return cache.find(top.GetNodeNum())->second; - - NonAtomIterator ni(top, top.GetSTPMgr()->ASTUndefined, *top.GetSTPMgr()); - ASTNode current; - int result = 0; - while ((current = ni.next()) != ni.end()) - result += eval(current); - - cache.insert(make_pair(top.GetNodeNum(), result)); - return result; - } - }; -} -; - -#endif /* DIFFICULTYSCORE_H_ */ - diff --git a/src/vendor/stp/src/STPManager/Makefile b/src/vendor/stp/src/STPManager/Makefile deleted file mode 100644 index f213f4876..000000000 --- a/src/vendor/stp/src/STPManager/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -OBJS = $(SRCS:.cpp=.o) - - -libstpmgr.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend diff --git a/src/vendor/stp/src/STPManager/NodeIterator.h b/src/vendor/stp/src/STPManager/NodeIterator.h deleted file mode 100644 index eeb958b56..000000000 --- a/src/vendor/stp/src/STPManager/NodeIterator.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef NODEITERATOR_H_ -#define NODEITERATOR_H_ - -#include -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - // Returns each node once, then returns the sentinal. - // NB if the sentinel is contained in the node that's passed, then it'll be wrong. - class NodeIterator : boost::noncopyable - { - stack toVisit; - - const ASTNode& sentinal; - uint8_t iteration; - - - public: - NodeIterator(const ASTNode &n, const ASTNode &_sentinal, STPMgr& stp) : - sentinal(_sentinal), iteration(stp.getNextIteration()) - { - toVisit.push(n); - } - - ASTNode - next() - { - ASTNode result = sentinal; - - while (true) - { - if (toVisit.empty()) - return sentinal; - - result = toVisit.top(); - toVisit.pop(); - - if (!ok(result)) - continue; // Not OK to investigate. - - if (result.getIteration() != iteration) - break; // not visited, DONE! - } - - if (result == sentinal) - return result; - - result.setIteration(iteration); - - const ASTVec& c = result.GetChildren(); - ASTVec::const_iterator itC = c.begin(); - ASTVec::const_iterator itendC = c.end(); - for (; itC != itendC; itC++) - { - if (itC->getIteration() == iteration) - continue; // already examined. - toVisit.push(*itC); - } - return result; - } - - ASTNode - end() - { - return sentinal; - } - - virtual bool - ok(const ASTNode n) - { - return true; - } - }; - - // Iterator that omits return atoms. - class NonAtomIterator : public NodeIterator - { - virtual bool - ok(const ASTNode& n) - { - return !n.isAtom(); - } - - public: - NonAtomIterator(const ASTNode &n, const ASTNode &uf, STPMgr& stp) : - NodeIterator(n, uf, stp) - { - } - }; -}; -#endif /* NODEITERATOR_H_ */ diff --git a/src/vendor/stp/src/STPManager/STP.cpp b/src/vendor/stp/src/STPManager/STP.cpp deleted file mode 100644 index cde63ae0f..000000000 --- a/src/vendor/stp/src/STPManager/STP.cpp +++ /dev/null @@ -1,720 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "STP.h" -#include "DifficultyScore.h" -#include "../to-sat/AIG/ToSATAIG.h" -#include "../simplifier/constantBitP/ConstantBitPropagation.h" -#include "../simplifier/constantBitP/NodeToFixedBitsMap.h" -#include "../sat/SimplifyingMinisat.h" -#include "../sat/MinisatCore.h" -#include "../sat/CryptoMinisat.h" -#include "../sat/MinisatCore_prop.h" -#include "../sat/core_prop/Solver_prop.h" -#include "../simplifier/RemoveUnconstrained.h" -#include "../simplifier/FindPureLiterals.h" -#include "../simplifier/EstablishIntervals.h" -#include "../simplifier/UseITEContext.h" -#include "../simplifier/AlwaysTrue.h" -#include "../simplifier/AIGSimplifyPropositionalCore.h" -#include - -namespace BEEV { - - const static string cb_message = "After Constant Bit Propagation. "; - const static string bb_message = "After Bitblast simplification. "; - const static string uc_message = "After Removing Unconstrained. "; - const static string int_message = "After Establishing Intervals. "; - const static string pl_message = "After Pure Literals. "; - const static string bitvec_message = "After Bit-vector Solving. "; - const static string size_inc_message= "After Speculative Simplifications. "; - const static string pe_message= "After Propagating Equalities. "; - - - - // The absolute TopLevel function that invokes STP on the input - // formula - SOLVER_RETURN_TYPE STP::TopLevelSTP(const ASTNode& inputasserts, - const ASTNode& query) - { - - // Unfortunatey this is a global variable,which the aux function needs to overwrite sometimes. - bool saved_ack = bm->UserFlags.ackermannisation; - - ASTNode original_input; - - if (query != bm->ASTFalse) - original_input = bm->CreateNode(AND, - inputasserts, - bm->CreateNode(NOT, query)); - else - original_input = inputasserts; - - SATSolver *newS; - if (bm->UserFlags.solver_to_use == UserDefinedFlags::SIMPLIFYING_MINISAT_SOLVER) - newS = new SimplifyingMinisat(bm->soft_timeout_expired); - else if (bm->UserFlags.solver_to_use == UserDefinedFlags::CRYPTOMINISAT_SOLVER) - newS = new CryptoMinisat(); - else if (bm->UserFlags.solver_to_use == UserDefinedFlags::MINISAT_SOLVER) - newS = new MinisatCore(bm->soft_timeout_expired); - else if (bm->UserFlags.solver_to_use == UserDefinedFlags::MINISAT_PROPAGATORS) - newS = new MinisatCore_prop(bm->soft_timeout_expired); - - - - SATSolver& NewSolver = *newS; - - - if(bm->UserFlags.stats_flag) - { - NewSolver.setVerbosity(1); - } - - if(bm->UserFlags.random_seed_flag) - { - NewSolver.setSeed(bm->UserFlags.random_seed); - } - - SOLVER_RETURN_TYPE result; - result = TopLevelSTPAux(NewSolver, - original_input); - - delete newS; - - bm->UserFlags.ackermannisation =saved_ack; - return result; - - } //End of TopLevelSTP() - - ASTNode - STP::callSizeReducing(ASTNode simplified_solved_InputToSAT, BVSolver* bvSolver, PropagateEqualities *pe, const int initial_difficulty_score, int & actualBBSize) - { - while (true) - { - ASTNode last = simplified_solved_InputToSAT; - simplified_solved_InputToSAT = sizeReducing(last, bvSolver,pe); - if (last == simplified_solved_InputToSAT) - break; - } - - actualBBSize=-1; - - // Expensive, so only want to do it once. - if (bm->UserFlags.isSet("bitblast-simplification", "1") && initial_difficulty_score < 250000) - { - BBNodeManagerAIG bbnm; - BitBlaster bb(&bbnm, simp, bm->defaultNodeFactory , &(bm->UserFlags)); - ASTNodeMap fromTo; - ASTNodeMap equivs; - bb.getConsts(simplified_solved_InputToSAT, fromTo,equivs); - - if (equivs.size() > 0) - { - /* These nodes have equivalent AIG representations, so even though they have different - * word level expressions they are identical semantically. So we pick one of the ASTnodes - * and replace the others with it. - * TODO: I replace with the lower id node, sometimes though we replace with much more - * difficult looking ASTNodes. - */ - ASTNodeMap cache; - simplified_solved_InputToSAT = SubstitutionMap::replace(simplified_solved_InputToSAT, equivs, cache,bm->defaultNodeFactory,false,true); - bm->ASTNodeStats(bb_message.c_str(), simplified_solved_InputToSAT); - } - - if (fromTo.size() > 0) - { - ASTNodeMap cache; - simplified_solved_InputToSAT = SubstitutionMap:: replace(simplified_solved_InputToSAT, fromTo, cache,bm->defaultNodeFactory); - bm->ASTNodeStats(bb_message.c_str(), simplified_solved_InputToSAT); - } - actualBBSize = bbnm.totalNumberOfNodes(); - } - return simplified_solved_InputToSAT; - } - - - // These transformations should never increase the size of the DAG. - ASTNode - STP::sizeReducing(ASTNode simplified_solved_InputToSAT, BVSolver* bvSolver, PropagateEqualities *pe) - { - - simplified_solved_InputToSAT = pe->topLevel(simplified_solved_InputToSAT, arrayTransformer); - if (simp->hasUnappliedSubstitutions()) - { - simplified_solved_InputToSAT = simp->applySubstitutionMap(simplified_solved_InputToSAT); - simp->haveAppliedSubstitutionMap(); - bm->ASTNodeStats(pe_message.c_str(), simplified_solved_InputToSAT); - } - - if (bm->UserFlags.isSet("enable-unconstrained", "1")) - { - // Remove unconstrained. - RemoveUnconstrained r1(*bm); - simplified_solved_InputToSAT = r1.topLevel(simplified_solved_InputToSAT, simp); - bm->ASTNodeStats(uc_message.c_str(), simplified_solved_InputToSAT); - } - - if (bm->UserFlags.isSet("use-intervals", "1")) - { - EstablishIntervals intervals(*bm); - simplified_solved_InputToSAT = intervals.topLevel_unsignedIntervals(simplified_solved_InputToSAT); - bm->ASTNodeStats(int_message.c_str(), simplified_solved_InputToSAT); - } - - if (bm->UserFlags.bitConstantProp_flag) - { - bm->GetRunTimes()->start(RunTimes::ConstantBitPropagation); - simplifier::constantBitP::ConstantBitPropagation cb(simp, bm->defaultNodeFactory, simplified_solved_InputToSAT); - simplified_solved_InputToSAT = cb.topLevelBothWays(simplified_solved_InputToSAT, true,false); - - bm->GetRunTimes()->stop(RunTimes::ConstantBitPropagation); - - if (cb.isUnsatisfiable()) - simplified_solved_InputToSAT = bm->ASTFalse; - - if (simp->hasUnappliedSubstitutions()) - { - simplified_solved_InputToSAT = simp->applySubstitutionMap(simplified_solved_InputToSAT); - simp->haveAppliedSubstitutionMap(); - } - - bm->ASTNodeStats(cb_message.c_str(), simplified_solved_InputToSAT); - } - - // Find pure literals. - if (bm->UserFlags.isSet("pure-literals", "1")) - { - FindPureLiterals fpl; - bool changed = fpl.topLevel(simplified_solved_InputToSAT, simp, bm); - if (changed) - { - simplified_solved_InputToSAT = simp->applySubstitutionMap(simplified_solved_InputToSAT); - simp->haveAppliedSubstitutionMap(); - bm->ASTNodeStats(pl_message.c_str() , simplified_solved_InputToSAT); - } - } - - if (bm->UserFlags.isSet("always-true", "0")) - { - AlwaysTrue always (simp,bm,bm->defaultNodeFactory); - simplified_solved_InputToSAT = always.topLevel(simplified_solved_InputToSAT); - bm->ASTNodeStats("After removing always true: ", simplified_solved_InputToSAT); - } - - if (bm->UserFlags.wordlevel_solve_flag && bm->UserFlags.optimize_flag) - { - simplified_solved_InputToSAT = bvSolver->TopLevelBVSolve(simplified_solved_InputToSAT, false); - bm->ASTNodeStats(bitvec_message.c_str(), simplified_solved_InputToSAT); - } - - return simplified_solved_InputToSAT; - } - - //Acceps a query, calls the SAT solver and generates Valid/InValid. - //if returned 0 then input is INVALID if returned 1 then input is - //VALID if returned 2 then UNDECIDED - SOLVER_RETURN_TYPE - STP::TopLevelSTPAux(SATSolver& NewSolver, const ASTNode& original_input) - { - bm->ASTNodeStats("input asserts and query: ", original_input); - - DifficultyScore difficulty; - if (bm->UserFlags.stats_flag) - cerr << "Difficulty Initially:" << difficulty.score(original_input) << endl; - - // A heap object so I can easily control its lifetime. - std::auto_ptr bvSolver(new BVSolver(bm, simp)); - std::auto_ptr pe (new PropagateEqualities(simp,bm->defaultNodeFactory,bm)); - - ASTNode simplified_solved_InputToSAT = original_input; - - // If the number of array reads is small. We rewrite them through. - // The bit-vector simplifications are more thorough than the array simplifications. For example, - // we don't currently do unconstrained elimination on arrays--- but we do for bit-vectors. - // A better way to do this would be to estimate the number of axioms introduced. - // TODO: I chose the number of reads we perform this operation at randomly. - bool removed = false; - if (((bm->UserFlags.ackermannisation && numberOfReadsLessThan(simplified_solved_InputToSAT,50)) || bm->UserFlags.isSet("upfront-ack", "0")) - || numberOfReadsLessThan(simplified_solved_InputToSAT,10) - ) - { - // If the number of axioms that would be added it small. Remove them. - bm->UserFlags.ackermannisation = true; - simplified_solved_InputToSAT = arrayTransformer->TransformFormula_TopLevel(simplified_solved_InputToSAT); - if (bm->UserFlags.stats_flag) - cerr << "Have removed array operations" << endl; - removed = true; - } - - const bool arrayops = containsArrayOps(simplified_solved_InputToSAT); - if (removed) - assert(!arrayops); - - // Run size reducing just once. - simplified_solved_InputToSAT = sizeReducing(simplified_solved_InputToSAT, bvSolver.get(),pe.get()); - - unsigned initial_difficulty_score = difficulty.score(simplified_solved_InputToSAT); - - int bitblasted_difficulty = -1; - - // Fixed point it if it's not too difficult. - // Currently we discards all the state each time sizeReducing is called, - // so it's expensive to call. - if ((!arrayops && initial_difficulty_score < 1000000) || bm->UserFlags.isSet("preserving-fixedpoint", "0")) - simplified_solved_InputToSAT = callSizeReducing(simplified_solved_InputToSAT, bvSolver.get(),pe.get(), initial_difficulty_score, bitblasted_difficulty); - - if ((!arrayops || bm->UserFlags.isSet("array-difficulty-reversion", "1"))) - { - initial_difficulty_score = difficulty.score(simplified_solved_InputToSAT); - } - - if (bitblasted_difficulty != -1 && bm->UserFlags.stats_flag) - cout << "Initial Bitblasted size:" << bitblasted_difficulty << endl; - - - if (bm->UserFlags.stats_flag) - cout << "Difficulty After Size reducing:" << initial_difficulty_score << endl; - - // So we can delete the object and release all the hash-buckets storage. - auto_ptr revert(new Revert_to()); - - if ((!arrayops || bm->UserFlags.isSet("array-difficulty-reversion", "1"))) - { - revert->initialSolverMap.insert(simp->Return_SolverMap()->begin(), simp->Return_SolverMap()->end()); - revert->backup_arrayToIndexToRead.insert(arrayTransformer->arrayToIndexToRead.begin(),arrayTransformer->arrayToIndexToRead.end()); - revert->toRevertTo = simplified_solved_InputToSAT; - } - - ASTNode inputToSAT; - - //round of substitution, solving, and simplification. ensures that - //DAG is minimized as much as possibly, and ideally should - //garuntee that all liketerms in BVPLUSes have been combined. - bm->SimplifyWrites_InPlace_Flag = false; - //bm->Begin_RemoveWrites = false; - //bm->start_abstracting = false; - bm->TermsAlreadySeenMap_Clear(); - do - { - inputToSAT = simplified_solved_InputToSAT; - - if (bm->soft_timeout_expired) - return SOLVER_TIMEOUT; - - if (bm->UserFlags.optimize_flag) - { - simplified_solved_InputToSAT = pe->topLevel(simplified_solved_InputToSAT, arrayTransformer); - - // Imagine: - // The simplifier simplifies (0 + T) to T - // Then bvsolve introduces (0 + T) - // Then CreateSubstitutionMap decides T maps to a constant, but leaving another (0+T). - // When we go to simplify (0 + T) will still be in the simplify cache, so will be mapped to T. - // But it shouldn't be T, it should be a constant. - // Applying the substitution map fixes this case. - // - if (simp->hasUnappliedSubstitutions()) - { - simplified_solved_InputToSAT = simp->applySubstitutionMap(simplified_solved_InputToSAT); - simp->haveAppliedSubstitutionMap(); - } - - bm->ASTNodeStats(pe_message.c_str(), simplified_solved_InputToSAT); - - simplified_solved_InputToSAT = simp->SimplifyFormula_TopLevel(simplified_solved_InputToSAT, false); - - bm->ASTNodeStats(size_inc_message.c_str(), simplified_solved_InputToSAT); - } - - if (bm->UserFlags.wordlevel_solve_flag && bm->UserFlags.optimize_flag) - { - simplified_solved_InputToSAT = bvSolver->TopLevelBVSolve(simplified_solved_InputToSAT); - bm->ASTNodeStats(bitvec_message.c_str(), simplified_solved_InputToSAT); - } - } - while (inputToSAT != simplified_solved_InputToSAT); - - if (bm->UserFlags.bitConstantProp_flag) - { - bm->GetRunTimes()->start(RunTimes::ConstantBitPropagation); - simplifier::constantBitP::ConstantBitPropagation cb(simp, bm->defaultNodeFactory, simplified_solved_InputToSAT); - simplified_solved_InputToSAT = cb.topLevelBothWays(simplified_solved_InputToSAT); - - bm->GetRunTimes()->stop(RunTimes::ConstantBitPropagation); - - if (cb.isUnsatisfiable()) - simplified_solved_InputToSAT = bm->ASTFalse; - - bm->ASTNodeStats(cb_message.c_str(), simplified_solved_InputToSAT); - } - - if (bm->UserFlags.isSet("use-intervals", "1")) - { - EstablishIntervals intervals(*bm); - simplified_solved_InputToSAT = intervals.topLevel_unsignedIntervals(simplified_solved_InputToSAT); - bm->ASTNodeStats(int_message.c_str(), simplified_solved_InputToSAT); - } - - // Find pure literals. - if (bm->UserFlags.isSet("pure-literals", "1")) - { - FindPureLiterals fpl; - bool changed = fpl.topLevel(simplified_solved_InputToSAT, simp, bm); - if (changed) - { - simplified_solved_InputToSAT = simp->applySubstitutionMap(simplified_solved_InputToSAT); - simp->haveAppliedSubstitutionMap(); - bm->ASTNodeStats(pl_message.c_str(), simplified_solved_InputToSAT); - } - } - - if (bm->soft_timeout_expired) - return SOLVER_TIMEOUT; - - // Simplify using Ite context - if (bm->UserFlags.optimize_flag && bm->UserFlags.isSet("ite-context", "0")) - { - UseITEContext iteC(bm); - simplified_solved_InputToSAT = iteC.topLevel(simplified_solved_InputToSAT); - bm->ASTNodeStats("After ITE Context: ", simplified_solved_InputToSAT); - } - - if (bm->UserFlags.isSet("aig-core-simplify", "0")) - { - AIGSimplifyPropositionalCore aigRR(bm); - simplified_solved_InputToSAT = aigRR.topLevel(simplified_solved_InputToSAT); - bm->ASTNodeStats("After AIG Core: ", simplified_solved_InputToSAT); - } - -#if 0 - bm->ASTNodeStats("Before SimplifyWrites_Inplace begins: ", simplified_solved_InputToSAT); - - bm->SimplifyWrites_InPlace_Flag = true; - bm->Begin_RemoveWrites = false; - bm->start_abstracting = false; - bm->TermsAlreadySeenMap_Clear(); - do - { - inputToSAT = simplified_solved_InputToSAT; - - if (bm->UserFlags.optimize_flag) - { - simplified_solved_InputToSAT = pe->topLevel(simplified_solved_InputToSAT, arrayTransformer); - - if (simp->hasUnappliedSubstitutions()) - { - simplified_solved_InputToSAT = simp->applySubstitutionMap(simplified_solved_InputToSAT); - simp->haveAppliedSubstitutionMap(); - } - - bm->ASTNodeStats(pe->message.c_str(), simplified_solved_InputToSAT); - - simplified_solved_InputToSAT = simp->SimplifyFormula_TopLevel(simplified_solved_InputToSAT, false); - bm->ASTNodeStats("after simplification: ", simplified_solved_InputToSAT); - - - if (bm->UserFlags.isSet("always-true", "0")) - { - SimplifyingNodeFactory nf(*(bm->hashingNodeFactory), *bm); - AlwaysTrue always (simp,bm,&nf); - simplified_solved_InputToSAT = always.topLevel(simplified_solved_InputToSAT); - bm->ASTNodeStats("After removing always true: ", simplified_solved_InputToSAT); - } - } - - // The word level solver uses the simplifier to apply the rewrites it makes, - // without optimisations enabled. It will enter infinite loops on some input. - // Instead it could use the apply function of the substitution map, but it - // doesn't yet... - if (bm->UserFlags.wordlevel_solve_flag && bm->UserFlags.optimize_flag) - { - simplified_solved_InputToSAT = bvSolver->TopLevelBVSolve(simplified_solved_InputToSAT); - bm->ASTNodeStats("after solving: ", simplified_solved_InputToSAT); - } - } - while (inputToSAT != simplified_solved_InputToSAT); - - bm->ASTNodeStats("After SimplifyWrites_Inplace: ", simplified_solved_InputToSAT); -#endif - - if (bm->UserFlags.isSet("enable-unconstrained", "1")) - { - // Remove unconstrained. - RemoveUnconstrained r(*bm); - simplified_solved_InputToSAT = r.topLevel(simplified_solved_InputToSAT, simp); - bm->ASTNodeStats(uc_message.c_str(), simplified_solved_InputToSAT); - } - - bm->TermsAlreadySeenMap_Clear(); - - //bm->start_abstracting = false; - bm->SimplifyWrites_InPlace_Flag = false; - //bm->Begin_RemoveWrites = false; - - long final_difficulty_score = difficulty.score(simplified_solved_InputToSAT); - - bool worse= false; - if (final_difficulty_score > 1.1 * initial_difficulty_score) - worse = true; - - // It's of course very wasteful to do this! Later I'll make it reuse the work.. - // We bit-blast again, in order to throw it away, so that we can measure whether - // the number of AIG nodes is smaller. The difficulty score is sometimes completely - // wrong, the sage-app7 are the motivating examples. The other way to improve it would - // be to fix the difficulty scorer! - if (!worse && (bitblasted_difficulty != -1)) - { - BBNodeManagerAIG bbnm; - BitBlaster bb(&bbnm, simp, bm->defaultNodeFactory , &(bm->UserFlags)); - bb.BBForm(simplified_solved_InputToSAT); - int newBB= bbnm.totalNumberOfNodes(); - if (bm->UserFlags.stats_flag) - cerr << "Final BB Size:" << newBB << endl; - - if (bitblasted_difficulty < newBB) - worse = true; - } - - - if (bm->UserFlags.stats_flag) - { - cerr << "Initial Difficulty Score:" << initial_difficulty_score << endl; - cerr << "Final Difficulty Score:" << final_difficulty_score << endl; - } - - bool optimize_enabled = bm->UserFlags.optimize_flag; - if (worse && - (!arrayops || bm->UserFlags.isSet("array-difficulty-reversion", "1")) && - bm->UserFlags.isSet("difficulty-reversion", "1")) - { - // If the simplified problem is harder, than the - // initial problem we revert back to the initial - // problem. - - if (bm->UserFlags.stats_flag) - cerr << "simplification made the problem harder, reverting." << endl; - simplified_solved_InputToSAT = revert->toRevertTo; - - // I do this to clear the substitution/solver map. - // Not sure what would happen if it contained simplifications - // that haven't been applied. - simp->ClearAllTables(); - - simp->Return_SolverMap()->insert(revert->initialSolverMap.begin(), revert->initialSolverMap.end()); - revert->initialSolverMap.clear(); - - // Copy back what we knew about arrays at the start.. - arrayTransformer->arrayToIndexToRead.clear(); - arrayTransformer->arrayToIndexToRead.insert(revert->backup_arrayToIndexToRead.begin(), revert->backup_arrayToIndexToRead.end()); - - // The arrayTransformer calls simplify. We don't want - // it to put back in all the bad simplifications. - bm->UserFlags.optimize_flag = false; - } - revert.reset(NULL); - - simplified_solved_InputToSAT = arrayTransformer->TransformFormula_TopLevel(simplified_solved_InputToSAT); - bm->ASTNodeStats("after transformation: ", simplified_solved_InputToSAT); - bm->TermsAlreadySeenMap_Clear(); - - bm->UserFlags.optimize_flag = optimize_enabled; - - SOLVER_RETURN_TYPE res; - if (!bm->UserFlags.ackermannisation) - { - bm->counterexample_checking_during_refinement = true; - } - - // We are about to solve. Clear out all the memory associated with caches - // that we won't need again. - simp->ClearCaches(); - simp->haveAppliedSubstitutionMap(); - bm->ClearAllTables(); - - // Deleting it clears out all the buckets associated with hashmaps etc. too. - bvSolver.reset(NULL); - pe.reset(NULL); - - - if (bm->UserFlags.stats_flag) - simp->printCacheStatus(); - - const bool maybeRefinement = arrayops && !bm->UserFlags.ackermannisation; - - simplifier::constantBitP::ConstantBitPropagation* cb = NULL; - std::auto_ptr cleaner; - - if (bm->UserFlags.bitConstantProp_flag) - { - bm->GetRunTimes()->start(RunTimes::ConstantBitPropagation); - cb = new simplifier::constantBitP::ConstantBitPropagation(simp, bm->defaultNodeFactory, - simplified_solved_InputToSAT); - cleaner.reset(cb); - bm->GetRunTimes()->stop(RunTimes::ConstantBitPropagation); - - bm->ASTNodeStats(cb_message.c_str(), simplified_solved_InputToSAT); - - if (cb->isUnsatisfiable()) - simplified_solved_InputToSAT = bm->ASTFalse; - } - - ToSATAIG toSATAIG(bm, cb, arrayTransformer); - - ToSATBase* satBase = bm->UserFlags.isSet("traditional-cnf", "0") ? tosat : ((ToSAT*) &toSATAIG) ; - - if (bm->soft_timeout_expired) - return SOLVER_TIMEOUT; - - // If it doesn't contain array operations, use ABC's CNF generation. - res = Ctr_Example->CallSAT_ResultCheck(NewSolver, simplified_solved_InputToSAT, original_input, satBase, - maybeRefinement); - - if (bm->soft_timeout_expired) - { - if (toSATAIG.cbIsDestructed()) - cleaner.release(); - - return SOLVER_TIMEOUT; - } - if (SOLVER_UNDECIDED != res) - { - // If the aig converter knows that it is never going to be called again, - // it deletes the constant bit stuff before calling the SAT solver. - if (toSATAIG.cbIsDestructed()) - cleaner.release(); - - CountersAndStats("print_func_stats", bm); - return res; - } - - assert(arrayops); // should only go to abstraction refinement if there are array ops. - assert(!bm->UserFlags.ackermannisation); // Refinement must be enabled too. - assert (bm->UserFlags.solver_to_use != UserDefinedFlags::MINISAT_PROPAGATORS); // The array solver shouldn't have returned undecided.. - - res = Ctr_Example->SATBased_ArrayReadRefinement(NewSolver, simplified_solved_InputToSAT, original_input, satBase); - if (SOLVER_UNDECIDED != res) - { - if (toSATAIG.cbIsDestructed()) - cleaner.release(); - - CountersAndStats("print_func_stats", bm); - return res; - } - - #if 0 - res = Ctr_Example->SATBased_ArrayWriteRefinement(NewSolver, original_input, satBase); - if (SOLVER_UNDECIDED != res) - { - if (toSATAIG.cbIsDestructed()) - cleaner.release(); - - CountersAndStats("print_func_stats", bm); - return res; - } - - res = Ctr_Example->SATBased_ArrayReadRefinement(NewSolver, simplified_solved_InputToSAT, original_input, satBase); - if (SOLVER_UNDECIDED != res) - { - if (toSATAIG.cbIsDestructed()) - cleaner.release(); - - CountersAndStats("print_func_stats", bm); - return res; - } - #endif - - FatalError("TopLevelSTPAux: reached the end without proper conclusion:" - "either a divide by zero in the input or a bug in STP"); - //bogus return to make the compiler shut up - return SOLVER_ERROR; - - - } //End of TopLevelSTPAux - -#if 0 - - //UserGuided abstraction refinement - SOLVER_RETURN_TYPE - STP:: - UserGuided_AbsRefine(SATSolver& NewSolver, - const ASTNode& original_input) - { - ASTVec v = bm->GetAsserts_WithKey(0); - if(v.empty()) - { - FatalError("UserGuided_AbsRefine: Something is seriously wrong."\ - "The input set is empty"); - } - ASTNode sureAddInput = - (v.size() == 1) ? v[0] : bm->CreateNode(AND, v); - - SOLVER_RETURN_TYPE res = SOLVER_UNDECIDED; - res = TopLevelSTPAux(NewSolver, sureAddInput, original_input); - if(SOLVER_UNDECIDED != res) - { - return res; - } - - //Do refinement here - if(AND != original_input.GetKind()) - { - FatalError("UserGuided_AbsRefine: The input must be an AND"); - } - - ASTVec RefineFormulasVec; - ASTVec RemainingFormulasVec; - ASTNode asttrue = bm->CreateNode(TRUE); - ASTNode astfalse = bm->CreateNode(FALSE); - for(int count=0; count < bm->UserFlags.num_absrefine; count++) - { - RemainingFormulasVec.clear(); - RemainingFormulasVec.push_back(asttrue); - RefineFormulasVec.clear(); - RefineFormulasVec.push_back(asttrue); - ASTVec InputKids = original_input.GetChildren(); - for(ASTVec::iterator it = InputKids.begin(), itend = InputKids.end(); - it!=itend;it++) - { - Ctr_Example->ClearComputeFormulaMap(); - if(astfalse == Ctr_Example->ComputeFormulaUsingModel(*it)) - { - RefineFormulasVec.push_back(*it); - } - else - { - RemainingFormulasVec.push_back(*it); - } - } - ASTNode RefineFormulas = - (RefineFormulasVec.size() == 1) ? - RefineFormulasVec[0] : bm->CreateNode(AND, RefineFormulasVec); - res = TopLevelSTPAux(NewSolver, RefineFormulas, original_input); - if(SOLVER_UNDECIDED != res) - { - return res; - } - } - - ASTNode RemainingFormulas = - (RemainingFormulasVec.size() == 1) ? - RemainingFormulasVec[0] : bm->CreateNode(AND, RemainingFormulasVec); - res = TopLevelSTPAux(NewSolver, RemainingFormulas, original_input); - - if(SOLVER_UNDECIDED != res) - { - return res; - } - - FatalError("TopLevelSTPAux: reached the end without proper conclusion:" - "either a divide by zero in the input or a bug in STP"); - return SOLVER_ERROR; - } //End of UserGuided_AbsRefine() -#endif - -}; //end of namespace diff --git a/src/vendor/stp/src/STPManager/STP.h b/src/vendor/stp/src/STPManager/STP.h deleted file mode 100644 index e6c39672f..000000000 --- a/src/vendor/stp/src/STPManager/STP.h +++ /dev/null @@ -1,145 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef STP_H -#define STP_H - -#include "../AST/AST.h" -#include "../AST/ArrayTransformer.h" -#include "../STPManager/STPManager.h" -#include "../simplifier/bvsolver.h" -#include "../simplifier/simplifier.h" -#include "../to-sat/ASTNode/ToSAT.h" -#include "../parser/LetMgr.h" -#include "../absrefine_counterexample/AbsRefine_CounterExample.h" -#include "../simplifier/PropagateEqualities.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - class STP : boost::noncopyable - { - - - - ASTNode sizeReducing(ASTNode input, BVSolver* bvSolver, PropagateEqualities *pe); - - // A copy of all the state we need to restore to a prior expression. - struct Revert_to - { - ASTNodeMap initialSolverMap; // Map from variables to expressions they were replaced with. - ASTNode toRevertTo; // The original expression. - ArrayTransformer::ArrType backup_arrayToIndexToRead; // array-indices already removed. - }; - - // Accepts query and returns the answer. if query is valid, - // returns VALID, else returns INVALID. Automatically constructs - // counterexample for invalid queries, and prints them upon - // request. - SOLVER_RETURN_TYPE TopLevelSTPAux(SATSolver& NewSolver, - const ASTNode& modified_input - ); - - - public: -ArrayTransformer * arrayTransformer; - - // calls sizeReducing and the bitblasting simplification. - ASTNode callSizeReducing(ASTNode simplified_solved_InputToSAT, BVSolver* bvSolver, PropagateEqualities *pe, const int initial_difficulty_score, int & actualBBSize); - - - /**************************************************************** - * Public Data: - * - * Absolute toplevel class. No need to make data private - ****************************************************************/ - STPMgr * bm; - Simplifier * simp; - ToSATBase * tosat; - AbsRefine_CounterExample * Ctr_Example; - - /**************************************************************** - * Constructor and Destructor * - ****************************************************************/ - - //Constructor - STP(STPMgr* b, - Simplifier* s, - ArrayTransformer * a, - ToSATBase * ts, - AbsRefine_CounterExample * ce) - { - bm = b; - simp = s; - tosat = ts; - arrayTransformer = a; - Ctr_Example = ce; - }// End of constructor - - - //Constructor - STP(STPMgr* b, - Simplifier* s, - BVSolver* bsolv, - ArrayTransformer * a, - ToSATBase * ts, - AbsRefine_CounterExample * ce) - { - bm = b; - simp = s; - tosat = ts; - delete bsolv; // Remove from the constructor later.. - arrayTransformer = a; - Ctr_Example = ce; - }// End of constructor - - ~STP() - { - ClearAllTables(); - delete Ctr_Example; - Ctr_Example = NULL; - delete arrayTransformer; - arrayTransformer = NULL; - delete tosat; - tosat = NULL; - delete simp; - simp = NULL; - //delete bm; - } - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - // The absolute TopLevel function that invokes STP on the input - // formula - SOLVER_RETURN_TYPE TopLevelSTP(const ASTNode& inputasserts, - const ASTNode& query); - -#if 0 - SOLVER_RETURN_TYPE - UserGuided_AbsRefine(SATSolver& SatSolver, - const ASTNode& original_input); -#endif - - void ClearAllTables(void) - { - if (simp != NULL) - simp->ClearAllTables(); - if (arrayTransformer != NULL) - arrayTransformer->ClearAllTables(); - if (tosat != NULL) - tosat->ClearAllTables(); - if (Ctr_Example != NULL) - Ctr_Example->ClearAllTables(); - //bm->ClearAllTables(); - } - }; //End of Class STP -};//end of namespace -#endif diff --git a/src/vendor/stp/src/STPManager/STPManager.cpp b/src/vendor/stp/src/STPManager/STPManager.cpp deleted file mode 100644 index ba6a4cec3..000000000 --- a/src/vendor/stp/src/STPManager/STPManager.cpp +++ /dev/null @@ -1,661 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -// to get the PRIu64 macro from inttypes, this needs to be defined. -#ifndef __STDC_FORMAT_MACROS - #define __STDC_FORMAT_MACROS -#endif -#include -#include -#include "../STPManager/STPManager.h" -#include "../printer/SMTLIBPrinter.h" -#include "NodeIterator.h" - -namespace BEEV -{ - ASTInterior *STPMgr::LookupOrCreateInterior(ASTInterior *n_ptr) - { - ASTInteriorSet::iterator it = _interior_unique_table.find(n_ptr); - if (it == _interior_unique_table.end()) - { - // Make a new ASTInterior node We want (NOT alpha) always to - // have alpha.nodenum + 1. - if (n_ptr->GetKind() == NOT) - { - // The internal node can't be a NOT, because then we'd add - // 1 to the NOT's node number, meaning we'd hit an even number, - // which could duplicate the next newNodeNum(). - assert(n_ptr->GetChildren()[0].GetKind() != NOT); - n_ptr->SetNodeNum(n_ptr->GetChildren()[0].GetNodeNum() + 1); - } - else - { - n_ptr->SetNodeNum(NewNodeNum()); - } - pair p = - _interior_unique_table.insert(n_ptr); - return *(p.first); - } - else - // Delete the temporary node, and return the found node. - delete n_ptr; - return *it; - } - - - - - ASTInterior *STPMgr::CreateInteriorNode(Kind kind, - // children array of this - // node will be modified. - ASTInterior *n_ptr, - const ASTVec & back_children) - { - - // insert back_children at end of front_children - ASTVec &front_children = n_ptr->_children; - front_children.reserve(front_children.size()+ back_children.size()); - - front_children.insert(front_children.end(), - back_children.begin(), - back_children.end()); - - // check for undefined nodes. - ASTVec::const_iterator it_end = front_children.end(); - for (ASTVec::const_iterator it = front_children.begin(); - it != it_end; it++) - { - if (it->IsNull()) - { - FatalError("CreateInteriorNode:"\ - "Undefined childnode in CreateInteriorNode: ", - ASTUndefined); - } - } - - return LookupOrCreateInterior(n_ptr); - } - - ostream &operator<<(ostream &os, const ASTNodeMap &nmap) - { - ASTNodeMap::const_iterator iend = nmap.end(); - for (ASTNodeMap::const_iterator i = nmap.begin(); i != iend; i++) - { - os << "Key: " << i->first << endl; - os << "Value: " << i->second << endl; - } - return os; - } - - //////////////////////////////////////////////////////////////// - // STPMgr member functions to create ASTSymbol and ASTBVConst - //////////////////////////////////////////////////////////////// - ASTNode STPMgr::LookupOrCreateSymbol(const char * const name) - { - ASTSymbol temp_sym(name); - ASTNode n(LookupOrCreateSymbol(temp_sym)); - return n; - } - - // FIXME: _name is now a constant field, and this assigns to it - // because it tries not to copy the string unless it needs to. How - // do I avoid copying children in ASTInterior? Perhaps I don't! - - // Note: There seems to be a limitation of hash_set, in that insert - // returns a const iterator to the value. That prevents us from - // modifying the name (in a hash-preserving way) after the symbol is - // inserted. FIXME: Is there a way to do this with insert? Need a - // function to make a new object in the middle of insert. Read STL - // documentation. - ASTSymbol *STPMgr::LookupOrCreateSymbol(ASTSymbol& s) - { - ASTSymbol *s_ptr = &s; // it's a temporary key. - - //_symbol_unique_table.insert(s_ptr); - //return s_ptr; - // Do an explicit lookup to see if we need to create a copy of the - // string. - ASTSymbolSet::const_iterator it = _symbol_unique_table.find(s_ptr); - if (it == _symbol_unique_table.end()) - { - // Make a new ASTSymbol with duplicated string (can't assign - // _name because it's const). Can cast the iterator to - // non-const -- carefully. - //std::string strname(s_ptr->GetName()); - ASTSymbol * s_ptr1 = new ASTSymbol(strdup(s_ptr->GetName())); - s_ptr1->SetNodeNum(NewNodeNum()); - s_ptr1->_value_width = s_ptr->_value_width; - pair p = - _symbol_unique_table.insert(s_ptr1); - return *p.first; - } - else - { - // return symbol found in table. - return *it; - } - } // End of LookupOrCreateSymbol - - bool STPMgr::LookupSymbol(ASTSymbol& s) - { - ASTSymbol* s_ptr = &s; // it's a temporary key. - - if (_symbol_unique_table.find(s_ptr) == - _symbol_unique_table.end()) - return false; - else - return true; - } - - bool STPMgr::LookupSymbol(const char * const name) - { - ASTSymbol s(name); - ASTSymbol* s_ptr = &s; // it's a temporary key. - - if (_symbol_unique_table.find(s_ptr) == - _symbol_unique_table.end()) - return false; - else - return true; - } - - bool STPMgr::LookupSymbol(const char * const name, ASTNode& output) - { - ASTSymbol temp_sym(name); - ASTSymbolSet::const_iterator it = _symbol_unique_table.find(&temp_sym); - if (it != _symbol_unique_table.end()) - { - output = ASTNode(*it); - return true; - } - return false; - } - - - - - //Create a ASTBVConst node - ASTNode STPMgr::CreateBVConst(unsigned int width, - unsigned long long int bvconst) - { - if (width > (sizeof(unsigned long long int) << 3) || width <= 0) - FatalError("CreateBVConst: "\ - "trying to create bvconst using "\ - "unsigned long long of width: ", - ASTUndefined, width); - - - // We create a single bvconst that gets reused. - if (NULL == CreateBVConstVal) - CreateBVConstVal = CONSTANTBV::BitVector_Create(65, true); - CreateBVConstVal = CONSTANTBV::BitVector_Resize(CreateBVConstVal,width); - CONSTANTBV::BitVector_Empty(CreateBVConstVal); - - unsigned long c_val = (~((unsigned long) 0)) & bvconst; - unsigned int copied = 0; - - // sizeof(unsigned long) returns the number of bytes in unsigned - // long. In order to convert it to bits, we need to shift left by - // 3. Hence, sizeof(unsigned long) << 3 - - //The algo below works as follows: It starts by copying the - //lower-order bits of the input "bvconst" in chunks of size = - //number of bits in unsigned long. The variable "copied" keeps - //track of the number of chunks copied so far - - const int shift_amount = (sizeof(unsigned long) << 3); - while (copied + shift_amount < width) - { - CONSTANTBV::BitVector_Chunk_Store(CreateBVConstVal, shift_amount, copied, c_val); - bvconst = bvconst >> shift_amount; - c_val = (~((unsigned long) 0)) & bvconst; - copied += shift_amount; - } - CONSTANTBV::BitVector_Chunk_Store(CreateBVConstVal, width - copied, copied, c_val); - - ASTBVConst temp_bvconst(CreateBVConstVal, width,ASTBVConst::CBV_MANAGED_OUTSIDE); - return ASTNode(LookupOrCreateBVConst(temp_bvconst)); - - } - - ASTNode STPMgr::charToASTNode(unsigned char* strval, int base , int bit_width) - { - assert ((2 == base || 10 == base || 16 == base)); - assert (bit_width > 0); - - // We create a single bvconst that gets reused. - if (NULL == CreateBVConstVal) - CreateBVConstVal = CONSTANTBV::BitVector_Create(65, true); - CreateBVConstVal = CONSTANTBV::BitVector_Resize(CreateBVConstVal,bit_width); - CONSTANTBV::BitVector_Empty(CreateBVConstVal); - - CONSTANTBV::ErrCode e; - if (2 == base) - { - e = CONSTANTBV::BitVector_from_Bin(CreateBVConstVal, - strval); - } - else if (10 == base) - { - e = CONSTANTBV::BitVector_from_Dec(CreateBVConstVal, - strval); - } - else if (16 == base) - { - e = CONSTANTBV::BitVector_from_Hex(CreateBVConstVal, - strval); - } - else - { - e = CONSTANTBV::ErrCode_Pars; - } - - if (0 != e) - { - cerr << "CreateBVConst: " << BitVector_Error(e); - FatalError("", ASTUndefined); - } - - ASTBVConst temp_bvconst(CreateBVConstVal, bit_width,ASTBVConst::CBV_MANAGED_OUTSIDE); - ASTNode n(LookupOrCreateBVConst(temp_bvconst)); - return n; - } - - ASTNode STPMgr::CreateBVConst(string strval, int base, int bit_width) - { - assert (bit_width > 0); - - return charToASTNode((unsigned char*)strval.c_str(), base , bit_width); - } - - //Create a ASTBVConst node from a char* - ASTNode STPMgr::CreateBVConst(const char* const strval, int base) - { - assert ((2 == base || 10 == base || 16 == base)); - - size_t width = strlen((const char *) strval); - - //FIXME Tim: Earlier versions of the code assume that the length of - //binary strings is 32 bits. - if (10 == base) - width = 32; - if (16 == base) - width = width * 4; - - return charToASTNode((unsigned char*)strval, base , width); - } - - //NB Assumes that it will destroy the bitvector passed to it - ASTNode STPMgr::CreateBVConst(CBV bv, unsigned width) - { - ASTBVConst temp_bvconst(bv, width,ASTBVConst::CBV_MANAGED_OUTSIDE); - ASTNode n(LookupOrCreateBVConst(temp_bvconst)); - CONSTANTBV::BitVector_Destroy(bv); - return n; - } - - ASTNode STPMgr::CreateZeroConst(unsigned width) - { - assert(width > 0); - if (zeroes.size() == 0) - { - zeroes.push_back(ASTNode()); // null - for (int i =1; i < 65;i++) - zeroes.push_back(CreateZeroConst(i)); - } - - if (width < zeroes.size()) - return zeroes[width]; - else - { - CBV z = CONSTANTBV::BitVector_Create(width, true); - return CreateBVConst(z, width); - } - } - - - ASTNode STPMgr::CreateOneConst(unsigned width) - { - assert(width > 0); - if (ones.size() == 0) - { - ones.push_back(ASTNode()); // null - for (int i =1; i < 65;i++) - ones.push_back(CreateOneConst(i)); - } - - if (width < ones.size()) - return ones[width]; - else - { - CBV o = CONSTANTBV::BitVector_Create(width, true); - CONSTANTBV::BitVector_increment(o); - - return CreateBVConst(o, width); - } - } - - ASTNode STPMgr::CreateTwoConst(unsigned width) - { - CBV two = CONSTANTBV::BitVector_Create(width, true); - CONSTANTBV::BitVector_increment(two); - CONSTANTBV::BitVector_increment(two); - - return CreateBVConst(two, width); - } - - ASTNode STPMgr::CreateMaxConst(unsigned width) - { - assert(width > 0); - if (max.size() == 0) - { - max.push_back(ASTNode()); // null - for (int i =1; i < 65;i++) - max.push_back(CreateMaxConst(i)); - } - - if (width < max.size()) - return max[width]; - else - { - CBV max = CONSTANTBV::BitVector_Create(width, false); - CONSTANTBV::BitVector_Fill(max); - - return CreateBVConst(max, width); - } - } - - //To ensure unique BVConst nodes, lookup the node in unique-table - //before creating a new one. - ASTBVConst *STPMgr::LookupOrCreateBVConst(ASTBVConst &s) - { - ASTBVConst *s_ptr = &s; // it's a temporary key. - - // Do an explicit lookup to see if we need to create a copy of the string. - ASTBVConstSet::const_iterator it; - if ((it = _bvconst_unique_table.find(s_ptr)) == _bvconst_unique_table.end()) - { - // Make a new ASTBVConst with duplicated constant. - - ASTBVConst * s_copy = new ASTBVConst(s); - s_copy->SetNodeNum(NewNodeNum()); - - pair p = - _bvconst_unique_table.insert(s_copy); - return *p.first; - } - else - { - // return constant found in table. - return *it; - } - } - - //////////////////////////////////////////////////////////////// - // - // IO manipulators for Lisp format printing of AST. - // - //////////////////////////////////////////////////////////////// - - // FIXME: Additional controls - // * Print node numbers (addresses/nums) - // * Printlength limit - // * Printdepth limit - - /** Print a vector of ASTNodes in lisp format */ - ostream &LispPrintVec(ostream &os, const ASTVec &v, int indentation = 0) - { - // Print the children - ASTVec::const_iterator iend = v.end(); - for (ASTVec::const_iterator i = v.begin(); i != iend; i++) - { - i->LispPrint_indent(os, indentation); - } - return os; - } - - ostream &LispPrintVecSpecial(ostream &os, - const vector &v, - int indentation = 0) - { - // Print the children - vector::const_iterator iend = v.end(); - for (vector::const_iterator i = v.begin(); i != iend; i++) - { - (*i)->LispPrint_indent(os, indentation); - } - return os; - } - - //add an assertion to the current logical context - void STPMgr::AddAssert(const ASTNode& assert) - { - if (!(is_Form_kind(assert.GetKind()) - && BOOLEAN_TYPE == assert.GetType())) - { - FatalError("AddAssert:Trying to assert a non-formula:", assert); - } - - if(_asserts.empty()) - _asserts.push_back(new ASTVec()); - - ASTVec& v = *_asserts.back(); - v.push_back(assert); - } - - void STPMgr::Push(void) - { - _asserts.push_back(new ASTVec()); - } - - void - STPMgr::Pop(void) - { - if (_asserts.empty()) - FatalError("POP on empty."); - - ASTVec * c = _asserts.back(); - c->clear(); - delete c; - _asserts.pop_back(); - } - - void STPMgr::AddQuery(const ASTNode& q) - { - //_current_query = TransformFormula(q); - //cerr << "\nThe current query is: " << q << endl; - _current_query = q; - } - - const ASTNode STPMgr::PopQuery() - { - ASTNode q = _current_query; - _current_query = ASTTrue; - return q; - } - - const ASTNode STPMgr::GetQuery() - { - return _current_query; - } - - // return a vector of the levels. - // before returning any vector with >1 nodes is turned into a conjunct. - const ASTVec STPMgr::getVectorOfAsserts() - { - vector::iterator it = _asserts.begin(); - vector::iterator itend = _asserts.end(); - - ASTVec result; - for(; it != itend; it++) - { - ASTVec& a = (**it); - if (a.size() ==0) - a.push_back(ASTTrue); - else if (a.size() > 1) - { - ASTNode conjunct = defaultNodeFactory->CreateNode(AND,a); - a.resize(0); - a.push_back(conjunct); - } - - result.push_back(a[0]); - } - - return result; - } - - const ASTVec - STPMgr::GetAsserts(void) - { - vector::iterator it = _asserts.begin(); - vector::iterator itend = _asserts.end(); - - ASTVec v; - for (; it != itend; it++) - { - if (!(*it)->empty()) - v.insert(v.end(), (*it)->begin(), (*it)->end()); - } - return v; - } - - //prints statistics for the ASTNode - void STPMgr::ASTNodeStats(const char * c, const ASTNode& a) - { - if (!UserFlags.stats_flag) - return; - - cout << "[" << GetRunTimes()->getDifference() << "]" << c; - if (UserFlags.print_nodes_flag) - cout << a << endl; - - cout << "Node size is: " << NodeSize(a) << endl; - } - - unsigned int STPMgr::NodeSize(const ASTNode& a) - { - unsigned int result = 0; - NodeIterator ni(a, ASTUndefined, *this); - ASTNode current; - while ((current = ni.next()) != ni.end()) - { - result++; - } - return result; - } - - bool STPMgr::VarSeenInTerm(const ASTNode& var, const ASTNode& term) - { - if (READ == term.GetKind() - && WRITE == term[0].GetKind() - /*&& !GetRemoveWritesFlag()*/) - { - return false; - } - - if (READ == term.GetKind() - && WRITE == term[0].GetKind() - /*&& GetRemoveWritesFlag()*/) - { - return true; - } - - ASTNodeMap::iterator it; - if ((it = TermsAlreadySeenMap.find(term)) != TermsAlreadySeenMap.end()) - { - if (it->second == var) - { - return false; - } - } - - if (var == term) - { - return true; - } - - for (ASTVec::const_iterator it = term.begin(), - itend = term.end(); it != itend; it++) - { - if (VarSeenInTerm(var, *it)) - { - return true; - } - else - { - TermsAlreadySeenMap[*it] = var; - } - } - - TermsAlreadySeenMap[term] = var; - return false; - }//End of VarSeenInTerm - - - ASTNode STPMgr::NewParameterized_BooleanVar(const ASTNode& var, - const ASTNode& constant) - { - ostringstream outVar; - ostringstream outNum; - //Get the name of Boolean Var - var.PL_Print(outVar); - constant.PL_Print(outNum); - std::string str(outVar.str()); - str += "("; - str += outNum.str(); - str += ")"; - ASTNode CurrentSymbol = CreateSymbol(str.c_str(),0,0); - return CurrentSymbol; - } // End of NewParameterized_BooleanVar() - - - - //If ASTNode remain with references (somewhere), this will segfault. - STPMgr::~STPMgr() { - ClearAllTables(); - - printer::NodeLetVarMap.clear(); - printer::NodeLetVarVec.clear(); - printer::NodeLetVarMap1.clear(); - - delete runTimes; - runTimes = NULL; - ASTFalse = ASTNode(0); - ASTTrue = ASTNode(0); - ASTUndefined = ASTNode(0); - _current_query = ASTNode(0); - //dummy_node = ASTNode(0); - - zeroes.clear(); - ones.clear(); - max.clear(); - - if (NULL != CreateBVConstVal) - CONSTANTBV::BitVector_Destroy(CreateBVConstVal); - - Introduced_SymbolsSet.clear(); - _symbol_unique_table.clear(); - _bvconst_unique_table.clear(); - - vector::iterator it = _asserts.begin(); - vector::iterator itend = _asserts.end(); - - for (; it != itend; it++) { - ASTVec * j = (*it); - j->clear(); - delete j; - } - _asserts.clear(); - - delete hashingNodeFactory; - - _interior_unique_table.clear(); - } -}; // end namespace beev diff --git a/src/vendor/stp/src/STPManager/STPManager.h b/src/vendor/stp/src/STPManager/STPManager.h deleted file mode 100644 index bf4728245..000000000 --- a/src/vendor/stp/src/STPManager/STPManager.h +++ /dev/null @@ -1,487 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef STPMGR_H -#define STPMGR_H - -#include "UserDefinedFlags.h" -#include "../AST/AST.h" -#include "../AST/NodeFactory/HashingNodeFactory.h" -#include "../sat/SATSolver.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - /***************************************************************** - * Class STPMgr. This holds all "global" variables for the system, - * such as unique tables for the various kinds of nodes. - *****************************************************************/ - - class STPMgr : boost::noncopyable - { - friend class ASTNode; - friend class ASTInterior; - friend class ASTBVConst; - friend class ASTSymbol; - friend BEEV::ASTNode HashingNodeFactory::CreateNode(const Kind kind, const BEEV::ASTVec & back_children); - - private: - /**************************************************************** - * Private Typedefs and Data * - ****************************************************************/ - - // Typedef for unique Interior node table. - typedef HASHSET< - ASTInterior *, - ASTInterior::ASTInteriorHasher, - ASTInterior::ASTInteriorEqual> ASTInteriorSet; - - // Typedef for unique Symbol node (leaf) table. - typedef HASHSET< - ASTSymbol *, - ASTSymbol::ASTSymbolHasher, - ASTSymbol::ASTSymbolEqual> ASTSymbolSet; - - //Typedef for unique BVConst node (leaf) table. - typedef HASHSET< - ASTBVConst *, - ASTBVConst::ASTBVConstHasher, - ASTBVConst::ASTBVConstEqual> ASTBVConstSet; - -#if 0 - typedef HASHMAP< - ASTNode, - ASTNodeSet, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeToSetMap; -#endif - - // Unique node tables that enables common subexpression sharing - ASTInteriorSet _interior_unique_table; - - // Table for variable names, let names etc. - ASTSymbolSet _symbol_unique_table; - - // Table to uniquefy bvconst - ASTBVConstSet _bvconst_unique_table; - - // Global for assigning new node numbers. - int _max_node_num; - - uint8_t last_iteration; - - public: - HashingNodeFactory* hashingNodeFactory; - NodeFactory *defaultNodeFactory; - - //frequently used nodes - ASTNode ASTFalse, ASTTrue, ASTUndefined; - - volatile bool soft_timeout_expired; - - // No nodes should already have the iteration number that is returned from here. - // This never returns zero. - uint8_t getNextIteration() - { - if (last_iteration == 255) - { - resetIteration(); - last_iteration = 0; - } - - uint8_t result = ++last_iteration; - assert(result != 0); - return result; - } - - // Detauls the iteration count back to zero. - void resetIteration() - { - for (ASTInteriorSet::iterator it =_interior_unique_table.begin(); it != _interior_unique_table.end(); it++ ) - {(*it)->iteration = 0;} - - for (ASTSymbolSet ::iterator it =_symbol_unique_table.begin(); it != _symbol_unique_table.end(); it++ ) - {(*it)->iteration = 0;} - - for (ASTBVConstSet:: iterator it =_bvconst_unique_table.begin(); it != _bvconst_unique_table.end(); it++ ) - {(*it)->iteration = 0;} - } - - int getAssertLevel() - { - return _asserts.size(); - } - - private: - - // Stack of Logical Context. each entry in the stack is a logical - // context. A logical context is a vector of assertions. The - // logical context is represented by a ptr to a vector of - // assertions in that logical context. Logical contexts are - // created by PUSH/POP - std::vector _asserts; - - // Memo table that tracks terms already seen - ASTNodeMap TermsAlreadySeenMap; - - // The query for the current logical context. - ASTNode _current_query; - - // Ptr to class that reports on the running time of various parts - // of the code - RunTimes * runTimes; - - /**************************************************************** - * Private Member Functions * - ****************************************************************/ - - // Destructively appends back_child nodes to front_child nodes. - // If back_child nodes is NULL, no appending is done. back_child - // nodes are not modified. Then it returns the hashed copy of the - // node, which is created if necessary. - ASTInterior *CreateInteriorNode(Kind kind, - ASTInterior *new_node, - const ASTVec & back_children = - _empty_ASTVec); - - // Create unique ASTInterior node. - ASTInterior *LookupOrCreateInterior(ASTInterior *n); - - // Create unique ASTSymbol node. - ASTSymbol *LookupOrCreateSymbol(ASTSymbol& s); - - // Called whenever we want to make sure that the Symbol is - // declared during semantic analysis - bool LookupSymbol(ASTSymbol& s); - - // Called by ASTNode constructors to uniqueify ASTBVConst - ASTBVConst *LookupOrCreateBVConst(ASTBVConst& s); - - // Cache of zero/one/max BVConsts of different widths. - ASTVec zeroes; - ASTVec ones; - ASTVec max; - - // Set of new symbols introduced that replace the array read terms - ASTNodeSet Introduced_SymbolsSet; - - CBV CreateBVConstVal; - - public: - - bool LookupSymbol(const char * const name); - bool LookupSymbol(const char * const name, ASTNode& output); - - /**************************************************************** - * Public Flags * - ****************************************************************/ - UserDefinedFlags UserFlags; - - // This flag, when true, indicates that counterexample is being - // checked by the counterexample checker - bool counterexample_checking_during_refinement; - - // This flag indicates as to whether the input has been determined - // to be valid or not by this tool - bool ValidFlag; - - // This flag, when true, indicates that a BVDIV divide by zero - // exception occured. However, the program must not exit with a - // fatalerror. Instead, it should evaluate the whole formula - // (which contains the BVDIV term) to be FALSE. - bool bvdiv_exception_occured; - - // Flags indicates that counterexample will now be checked by the - // counterexample checker, and hence simplifyterm must switch off - // certain optimizations. In particular, array write optimizations - //bool start_abstracting; - //bool Begin_RemoveWrites; - bool SimplifyWrites_InPlace_Flag; - - //count is used in the creation of new variables - unsigned int _symbol_count; - - // The value to append to the filename when saving the CNF. - unsigned int CNFFileNameCounter; - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - // Constructor - STPMgr() : - _symbol_unique_table(), - _bvconst_unique_table(), - _interior_unique_table(), - UserFlags(), - _symbol_count(0), - CNFFileNameCounter(0), - last_iteration(0), - soft_timeout_expired(false) - - { - _max_node_num = 0; - //Begin_RemoveWrites = false; - ValidFlag = false; - bvdiv_exception_occured = false; - counterexample_checking_during_refinement = false; - //start_abstracting = false; - //Begin_RemoveWrites = false; - SimplifyWrites_InPlace_Flag = false; - - // Need to initiate the node factories before any nodes are created. - hashingNodeFactory = new HashingNodeFactory(*this); - defaultNodeFactory= hashingNodeFactory; - - ASTFalse = CreateNode(FALSE); - ASTTrue = CreateNode(TRUE); - ASTUndefined = CreateNode(UNDEFINED); - runTimes = new RunTimes(); - _current_query = ASTUndefined; - CreateBVConstVal = NULL; - } - - RunTimes * GetRunTimes(void) - { - return runTimes; - } - -#if 0 - void SetRemoveWritesFlag(bool in) - { - Begin_RemoveWrites = in; - } - - bool GetRemoveWritesFlag(void) - { - return Begin_RemoveWrites; - } -#endif - - int NewNodeNum() - { - _max_node_num += 2; - return _max_node_num; - } - - unsigned int NodeSize(const ASTNode& a); - - /**************************************************************** - * Simplifying create formula functions * - ****************************************************************/ - - // Simplifying create functions - ASTNode CreateSimpForm(Kind kind, - ASTVec &children); - ASTNode CreateSimpForm(Kind kind, - const ASTNode& child0); - ASTNode CreateSimpForm(Kind kind, - const ASTNode& child0, - const ASTNode& child1); - ASTNode CreateSimpForm(Kind kind, - const ASTNode& child0, - const ASTNode& child1, - const ASTNode& child2); - ASTNode CreateSimpNot (const ASTNode& form); - - ASTNode CreateSimpXor(const ASTNode& form1, - const ASTNode& form2); - ASTNode CreateSimpXor(ASTVec &children); - ASTNode CreateSimpAndOr(bool isAnd, - const ASTNode& form1, - const ASTNode& form2); - ASTNode CreateSimpAndOr(bool IsAnd, - ASTVec &children); - ASTNode CreateSimpFormITE(const ASTNode& child0, - const ASTNode& child1, - const ASTNode& child2); - - /**************************************************************** - * Create Symbol and BVConst functions * - ****************************************************************/ - - // Create and return an ASTNode for a symbol - ASTNode LookupOrCreateSymbol(const char * const name); - - // Create and return an ASTNode for a symbol Width is number of - // bits. - ASTNode CreateOneConst(unsigned int width); - ASTNode CreateTwoConst(unsigned int width); - ASTNode CreateMaxConst(unsigned int width); - ASTNode CreateZeroConst(unsigned int width); - ASTNode CreateBVConst(CBV bv, unsigned width); - ASTNode CreateBVConst(const char *strval, int base); - ASTNode CreateBVConst(string strval, int base, int bit_width); - ASTNode CreateBVConst(unsigned int width, unsigned long long int bvconst); - ASTNode charToASTNode(unsigned char* strval, int base , int bit_width); - - /**************************************************************** - * Create Node functions * - ****************************************************************/ - - inline ASTNode CreateSymbol(const char * const name, unsigned indexWidth, unsigned valueWidth) - { - return defaultNodeFactory->CreateSymbol(name,indexWidth,valueWidth); - } - - - // Create and return an interior ASTNode - inline BEEV::ASTNode CreateNode(BEEV::Kind kind, const BEEV::ASTVec& children = _empty_ASTVec) - { - return defaultNodeFactory->CreateNode(kind,children); - } - - inline ASTNode CreateNode(Kind kind, const ASTNode& child0, const ASTVec & back_children = _empty_ASTVec) - { - return defaultNodeFactory->CreateNode(kind, child0, back_children); - } - - inline ASTNode CreateNode(Kind kind, const ASTNode& child0, const ASTNode& child1, const ASTVec & back_children = _empty_ASTVec) - { - return defaultNodeFactory->CreateNode(kind, child0, child1, back_children); - } - - inline ASTNode CreateNode(Kind kind, const ASTNode& child0, const ASTNode& child1, const ASTNode& child2, const ASTVec & back_children = _empty_ASTVec) - { - return defaultNodeFactory->CreateNode(kind, child0, child1, child2, back_children); - - } - - /**************************************************************** - * Create Term functions * - ****************************************************************/ - - // Create and return an ASTNode for a term - inline BEEV::ASTNode CreateTerm(BEEV::Kind kind, unsigned int width, const BEEV::ASTVec &children =_empty_ASTVec) - { - return defaultNodeFactory->CreateTerm(kind,width,children); - } - - inline BEEV::ASTNode CreateArrayTerm(BEEV::Kind kind, unsigned int indexWidth, unsigned int width, const BEEV::ASTVec &children =_empty_ASTVec) - { - return defaultNodeFactory->CreateArrayTerm(kind,indexWidth, width,children); - } - - inline ASTNode CreateTerm(Kind kind, unsigned int width, - const ASTNode& child0, const ASTVec &children = _empty_ASTVec) { - return defaultNodeFactory->CreateTerm(kind, width, child0, children); - } - - inline ASTNode CreateTerm(Kind kind, unsigned int width, - const ASTNode& child0, const ASTNode& child1, const ASTVec &children = _empty_ASTVec) { - return defaultNodeFactory->CreateTerm(kind,width, child0, child1,children); - } - - inline ASTNode CreateTerm(Kind kind, unsigned int width, - const ASTNode& child0, const ASTNode& child1, const ASTNode& child2, - const ASTVec &children = _empty_ASTVec) { - return defaultNodeFactory->CreateTerm(kind, width, child0, child1, child2); - } - - - /**************************************************************** - * Functions that manage logical context * - ****************************************************************/ - - void Pop(void); - void Push(void); - const ASTNode PopQuery(); - const ASTNode GetQuery(); - const ASTVec GetAsserts(); - const ASTVec getVectorOfAsserts(); - - - //add a query/assertion to the current logical context - void AddQuery(const ASTNode& q); - void AddAssert(const ASTNode& assert); - - /**************************************************************** - * Toplevel printing and stats functions * - ****************************************************************/ - - // For printing purposes - // Not filled in by the smtlib parser. - ASTVec ListOfDeclaredVars; - - // Table for DAG printing. - ASTNodeSet AlreadyPrintedSet; - - //Nodes seen so far - ASTNodeSet PLPrintNodeSet; - - // Map from ASTNodes to LetVars - ASTNodeMap NodeLetVarMap; - - // This is a vector which stores the Node to LetVars pairs. It - // allows for sorted printing, as opposed to NodeLetVarMap - std::vector > NodeLetVarVec; - - // A partial Map from ASTNodes to LetVars. Needed in order to - // correctly print shared subterms inside the LET itself - ASTNodeMap NodeLetVarMap1; - - //prints statistics for the ASTNode. - void ASTNodeStats(const char * c, const ASTNode& a); - - // Print variable to the input stream - void printVarDeclsToStream(ostream &os, ASTNodeSet& symbols); - - // Print assertions to the input stream - void printAssertsToStream(ostream &os, int simplify); - - // Variables are added automatically to the introduced_symbolset. Variables - // in the set aren't printed out as part of the counter example. - ASTNode CreateFreshVariable(int indexWidth, int valueWidth, std::string prefix) - { - char d[32 + prefix.length()]; - sprintf(d, "%s_%d", prefix.c_str(), _symbol_count++); - assert(!LookupSymbol(d)); - - BEEV::ASTNode CurrentSymbol = CreateSymbol(d,indexWidth,valueWidth); - Introduced_SymbolsSet.insert(CurrentSymbol); - return CurrentSymbol; - } - - bool FoundIntroducedSymbolSet(const ASTNode& in) - { - if(Introduced_SymbolsSet.find(in) != Introduced_SymbolsSet.end()) - { - return true; - } - return false; - } // End of IntroduceSymbolSet - - bool VarSeenInTerm(const ASTNode& var, const ASTNode& term); - - ASTNode NewParameterized_BooleanVar(const ASTNode& var, - const ASTNode& constant); - - void TermsAlreadySeenMap_Clear(void) - { - TermsAlreadySeenMap.clear(); - } - - // This is called before SAT solving, so only junk that isn't needed - // after SAT solving should be cleaned out. - void ClearAllTables(void) - { - NodeLetVarMap.clear(); - NodeLetVarMap1.clear(); - PLPrintNodeSet.clear(); - AlreadyPrintedSet.clear(); - TermsAlreadySeenMap.clear(); - NodeLetVarVec.clear(); - ListOfDeclaredVars.clear(); - } //End of ClearAllTables() - - ~STPMgr(); - - };//End of Class STPMgr -};//end of namespace -#endif diff --git a/src/vendor/stp/src/STPManager/UserDefinedFlags.h b/src/vendor/stp/src/STPManager/UserDefinedFlags.h deleted file mode 100644 index 1653bc3ed..000000000 --- a/src/vendor/stp/src/STPManager/UserDefinedFlags.h +++ /dev/null @@ -1,302 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -#ifndef UDEFFLAGS_H -#define UDEFFLAGS_H - -#include -#include -#include -#include -#include -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - using std::string; - - /****************************************************************** - * Struct UserDefFlags: - * - * Some userdefined variables that are set through commandline - * options. - ******************************************************************/ - - struct UserDefinedFlags : boost::noncopyable - { - private: - std::set alreadyOutput; - - public: - //collect statistics on certain functions - bool stats_flag; - - //print DAG nodes - bool print_nodes_flag; - - //run STP in optimized mode - bool optimize_flag; - - //do sat refinement, i.e. underconstrain the problem, and feed to - //SAT. if this works, great. else, add a set of suitable constraints - //to re-constraint the problem correctly, and call SAT again, until - //all constraints have been added. - bool ackermannisation; // eagerly write through the array's function congruence axioms. - - //switch to control write refinements - //bool arraywrite_refinement_flag; - - //check the counterexample against the original input to STP - bool check_counterexample_flag; - - //construct the counterexample in terms of original variable based - //on the counterexample returned by SAT solver - bool construct_counterexample_flag; - bool print_counterexample_flag; - bool print_binary_flag; - - //if this option is true then print the way dawson wants using a - //different printer. do not use this printer. - bool print_arrayval_declaredorder_flag; - - //Flag that determines whether the Boolean SAT solver should - //assign random polarity to the Boolean variables - bool random_seed_flag; - int random_seed; - - //Flag that allows the printing of the DIMACS format of the input - bool print_cnf_flag; - char * cnf_dump_filename; - - //flag to decide whether to print "valid/invalid" or not - bool print_output_flag; - - //print the variable order chosen by the sat solver while it is - //solving. - bool print_sat_varorder_flag; - - //turn on word level bitvector solver - bool wordlevel_solve_flag; - - - bool propagate_equalities; - - - //XOR flattening optimizations. - bool xor_flatten_flag; - - //this flag indicates that the BVSolver() succeeded - bool toplevel_solved_flag; - - //print the input back - bool print_STPinput_back_flag; - bool print_STPinput_back_C_flag; - bool print_STPinput_back_SMTLIB2_flag; - bool print_STPinput_back_SMTLIB1_flag; - bool print_STPinput_back_CVC_flag; - bool print_STPinput_back_dot_flag; - bool print_STPinput_back_GDL_flag; - - // output flags - bool output_CNF_flag; - bool output_bench_flag; - - //Flag to switch on the smtlib parser - bool smtlib1_parser_flag; - bool smtlib2_parser_flag; - - bool division_by_zero_returns_one_flag; - - bool quick_statistics_flag; - - bool tseitin_are_decision_variables_flag; - - // Create a new Tseitin variable for every intermediate value. - bool renameAllInCNF_flag; - - bool bitConstantProp_flag; - - bool cBitP_propagateForDivisionByZero; - - bool exit_after_CNF; - - bool enable_AIG_rewrites_flag; - - bool simplify_during_BB_flag; - - // Available back-end SAT solvers. - enum SATSolvers - { - MINISAT_SOLVER =0, - SIMPLIFYING_MINISAT_SOLVER, - CRYPTOMINISAT_SOLVER, - MINISAT_PROPAGATORS - }; - - enum SATSolvers solver_to_use; - - std::map config_options; - - void set(string n, string v) - { - assert(n.size() > 0); - assert(v.size() > 0); - assert(config_options.find(n) == config_options.end()); - config_options[n] = v; - } - - void disableSimplifications() - { - optimize_flag = false; - bitConstantProp_flag = false; - set("enable-unconstrained","0"); - set("use-intervals","0"); - set("pure-literals","0"); - set("simple-cnf","1"); - set("always_true","0"); - set("bitblast-simplification","0"); - - wordlevel_solve_flag = false; - propagate_equalities = false; - } - - string get(string n) - { - return get(n,""); - } - - // "1" is set. - bool isSet(string n, string def) - { - return (get(n,def) == string("1")); - } - - string get(string n, string def) - { - if (config_options.empty()) - return def; - - string result; - std::map::const_iterator it = config_options.find(n); - if (it == config_options.end()) - result = def; - else - result = it->second; - - if (stats_flag) - if (alreadyOutput.insert(n).second) - std::cout << "--config_"<< n << "=" << result << std::endl; - return result; - } - - //CONSTRUCTOR - UserDefinedFlags() - { - - //collect statistics on certain functions - stats_flag = false; - - //print DAG nodes - print_nodes_flag = false; - - //run STP in optimized mode - optimize_flag = true; - - // Do sat refinement, i.e. underconstraint the problem, and feed to - // SAT. if this works, great. else, add a set of suitable - // constraints to re-constraint the problem correctly, and call SAT again, - // until all constraints have been added. - ackermannisation = false; - - //flag to control write refinement - //arraywrite_refinement_flag = true; - - //check the counterexample against the original input to STP - check_counterexample_flag = true; - - //construct the counterexample in terms of original variable based - //on the counterexample returned by SAT solver - construct_counterexample_flag = true; - print_counterexample_flag = false; - print_binary_flag = false; - - output_CNF_flag = false; - output_bench_flag = false; - - //if this option is true then print the way dawson wants using a - //different printer. do not use this printer. - print_arrayval_declaredorder_flag = false; - - //Flag that determines whether the Boolean SAT solver should - //assign random polarity to the Boolean variables - random_seed_flag = false; - random_seed = 0; - - //flag to decide whether to print "valid/invalid" or not - print_output_flag = false; - - //print the variable order chosen by the sat solver while it is - //solving. - print_sat_varorder_flag = false; - - //turn on word level bitvector solver - wordlevel_solve_flag = true; - - //propagate equalities. - propagate_equalities = true; - - //turn off XOR flattening - xor_flatten_flag = false; - - //Flag to switch on the smtlib parser - smtlib1_parser_flag = false; - smtlib2_parser_flag = false; - - //print the input back - print_STPinput_back_flag = false; - print_STPinput_back_C_flag = false; - print_STPinput_back_SMTLIB2_flag = false; - print_STPinput_back_SMTLIB1_flag = false; - print_STPinput_back_CVC_flag = false; - print_STPinput_back_GDL_flag = false; - print_STPinput_back_dot_flag = false; - - // If enabled. division, mod and remainder by zero will evaluate to - // 1. - division_by_zero_returns_one_flag = false; - - quick_statistics_flag=false; - - tseitin_are_decision_variables_flag=true; - - // use minisat by default. - solver_to_use = MINISAT_PROPAGATORS; - - // The special Cryptominisat2 CNF generation with this flag enabled seems to go into an infinite loop. - // beware of turning this on if you are using cryptominsat2. - renameAllInCNF_flag= false; - - // Should constant bit propagation be enabled? - bitConstantProp_flag = true; - - // given a/b = c, propagates that c<=a even if b may be zero. - cBitP_propagateForDivisionByZero =true; - - exit_after_CNF=false; - - enable_AIG_rewrites_flag = false; - - // If the bit-blaster discovers new constants, should the term simplifier be re-run. - simplify_during_BB_flag=false; - - } //End of constructor for UserDefinedFlags - - }; //End of struct UserDefinedFlags -};//end of namespace - -#endif diff --git a/src/vendor/stp/src/absrefine_counterexample/AbsRefine_CounterExample.h b/src/vendor/stp/src/absrefine_counterexample/AbsRefine_CounterExample.h deleted file mode 100644 index f442c33bc..000000000 --- a/src/vendor/stp/src/absrefine_counterexample/AbsRefine_CounterExample.h +++ /dev/null @@ -1,206 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef CTREXAMPLE_H -#define CTREXAMPLE_H - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../simplifier/simplifier.h" -#include "../AST/ArrayTransformer.h" -#include "../to-sat/ToSATBase.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - class AbsRefine_CounterExample : boost::noncopyable - { - private: - - // Handy defs - ASTNode ASTTrue, ASTFalse, ASTUndefined; - - // Data structure that holds the counterexample - ASTNodeMap CounterExampleMap; - - // This memo map is used by the ComputeFormulaUsingModel() - ASTNodeMap ComputeFormulaMap; - - // Ptr to STPManager - STPMgr * bm; - - // Ptr to Simplifier - Simplifier * simp; - - // Ptr to ArrayTransformer - ArrayTransformer * ArrayTransform; - - // Checks if the counterexample is good. In order for the - // counterexample to be ok, every assert must evaluate to true - // w.r.t couner_example, and the query must evaluate to - // false. Otherwise we know that the counter_example is bogus. - void CheckCounterExample(bool t); - - // Accepts a term and turns it into a constant-term w.r.t - // counter_example - ASTNode TermToConstTermUsingModel(const ASTNode& term, - bool ArrayReadFlag = true); - - ASTNode Expand_ReadOverWrite_UsingModel(const ASTNode& term, - bool ArrayReadFlag = true); - - void CopySolverMap_To_CounterExample(void); - - //Converts a vector of bools to a BVConst - ASTNode BoolVectoBVConst(const vector * w, const unsigned int l); - - //Converts MINISAT counterexample into an AST memotable (i.e. the - //function populates the datastructure CounterExampleMap) - void ConstructCounterExample(SATSolver& newS, ToSATBase::ASTNodeToSATVar& satVarToSymbol); - - // Prints MINISAT assigment one bit at a time, for debugging. - void PrintSATModel(SATSolver& S, ToSATBase::ASTNodeToSATVar& satVarToSymbol); - - - public: - - // Constructor - AbsRefine_CounterExample(STPMgr * b, - Simplifier * s, - ArrayTransformer * at) : - bm(b), simp(s), ArrayTransform(at) - { - ASTTrue = bm->CreateNode(TRUE); - ASTFalse = bm->CreateNode(FALSE); - ASTUndefined = bm->CreateNode(UNDEFINED); - } - - //Prints the counterexample to stdout - void PrintCounterExample(bool t, std::ostream& os = cout); - - void ClearCounterExampleMap(void) - { - CounterExampleMap.clear(); - } - - void ClearComputeFormulaMap(void) - { - ComputeFormulaMap.clear(); - } - - //Prints the counterexample to stdout - void PrintCounterExample_InOrder(bool t); - - //queries the counterexample, and returns the value corresponding - //to e - ASTNode GetCounterExample(bool t, const ASTNode& e); - - //queries the counterexample, and returns a vector of index-value pairs for e - std::vector > GetCounterExampleArray(bool t, const ASTNode& e); - - int CounterExampleSize(void) const - { - return CounterExampleMap.size(); - } - - //FIXME: This is bloody dangerous function. Hack attack to take - //care of requests from users who want to store complete - //counter-examples in their own data structures. - ASTNodeMap GetCompleteCounterExample() - { - return CounterExampleMap; - } - - //Computes the truth value of a formula w.r.t counter_example - ASTNode ComputeFormulaUsingModel(const ASTNode& form); - - - /**************************************************************** - * Array Refinement functions * - ****************************************************************/ - SOLVER_RETURN_TYPE - CallSAT_ResultCheck(SATSolver& SatSolver, - const ASTNode& modified_input, - const ASTNode& original_input, - ToSATBase* tosat, - bool refinement); - - - SOLVER_RETURN_TYPE - SATBased_ArrayReadRefinement(SATSolver& newS, - const ASTNode& modified_input, - const ASTNode& original_input, - ToSATBase* tosat); - -#if 0 - SOLVER_RETURN_TYPE - SATBased_ArrayWriteRefinement(SATSolver& newS, - const ASTNode& orig_input, - ToSATBase *tosat); - - //creates array write axiom only for the input term or formula, if - //necessary. If there are no axioms to produce then it simply - //generates TRUE - ASTNode - Create_ArrayWriteAxioms(const ASTNode& array_readoverwrite_term, - const ASTNode& array_newname); - -#endif - - void ClearAllTables(void) - { - CounterExampleMap.clear(); - ComputeFormulaMap.clear(); - } //End of ClearAllTables() - - ~AbsRefine_CounterExample() - { - ClearAllTables(); - } //End of destructor - - };//End of Class CounterExample - - class CompleteCounterExample : boost::noncopyable - { - ASTNodeMap counterexample; - STPMgr * bv; - public: - CompleteCounterExample(ASTNodeMap a, STPMgr* beev) : - counterexample(a), bv(beev) - { - } - ASTNode GetCounterExample(ASTNode e) - { - if (BOOLEAN_TYPE == e.GetType() && SYMBOL != e.GetKind()) - { - FatalError("You must input a term or propositional variables\n", e); - } - if (counterexample.find(e) != counterexample.end()) - { - return counterexample[e]; - } - else - { - if (SYMBOL == e.GetKind() && BOOLEAN_TYPE == e.GetType()) - { - return bv->CreateNode(BEEV::FALSE); - } - - if (SYMBOL == e.GetKind()) - { - ASTNode z = bv->CreateZeroConst(e.GetValueWidth()); - return z; - } - - return e; - } - } - };//end of Class CompleteCounterExample -};//end of namespace -#endif diff --git a/src/vendor/stp/src/absrefine_counterexample/AbstractionRefinement.cpp b/src/vendor/stp/src/absrefine_counterexample/AbstractionRefinement.cpp deleted file mode 100644 index 3209b6e4f..000000000 --- a/src/vendor/stp/src/absrefine_counterexample/AbstractionRefinement.cpp +++ /dev/null @@ -1,504 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include -#include -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "AbsRefine_CounterExample.h" - -namespace BEEV -{ - /****************************************************************** - * Abstraction Refinement related functions - ******************************************************************/ - - enum Polarity - { - LEFT_ONLY, RIGHT_ONLY, BOTH - }; - - void - getSatVariables(const ASTNode & a, vector & v_a, SATSolver & SatSolver, - ToSATBase::ASTNodeToSATVar & satVar) - { - ToSATBase::ASTNodeToSATVar::iterator it = satVar.find(a); - if (it != satVar.end()) - v_a = it->second; - else if (!a.isConstant()) - { - assert(a.GetKind() == SYMBOL); - // It was ommitted from the initial problem, so assign it freshly. - for (int i = 0; i < a.GetValueWidth(); i++) - { - SATSolver::Var v = SatSolver.newVar(); - // We probably don't want the variable eliminated. - SatSolver.setFrozen(v); - v_a.push_back(v); - } - satVar.insert(make_pair(a, v_a)); - } - } - - - // This function adds the clauses to constrain that "a" and "b" equal a fresh variable - // (which it returns). - // Because it's used to create array axionms (a=b)-> (c=d), it can be - // used to only add one of the two polarities. - Minisat::Var - getEquals(SATSolver& SatSolver, const ASTNode& a, const ASTNode& b, ToSATBase::ASTNodeToSATVar& satVar, - Polarity polary = BOTH) - { - const int width = a.GetValueWidth(); - assert(width == b.GetValueWidth()); - assert(!a.isConstant() || !b.isConstant()); - - vector v_a; - vector v_b; - - getSatVariables(a, v_a, SatSolver, satVar); - getSatVariables(b, v_b, SatSolver, satVar); - - // The only time v_a or v_b will be empty is if "a" resp. "b" is a constant. - - if (v_a.size() == width && v_b.size() == width) - { - SATSolver::vec_literals all; - const int result = SatSolver.newVar(); - - for (int i = 0; i < width; i++) - { - SATSolver::vec_literals s; - - if (polary != RIGHT_ONLY) - { - int nv0 = SatSolver.newVar(); - s.push(SATSolver::mkLit(v_a[i], true)); - s.push(SATSolver::mkLit(v_b[i], true)); - s.push(SATSolver::mkLit(nv0, false)); - SatSolver.addClause(s); - s.clear(); - - s.push(SATSolver::mkLit(v_a[i], false)); - s.push(SATSolver::mkLit(v_b[i], false)); - s.push(SATSolver::mkLit(nv0, false)); - SatSolver.addClause(s); - s.clear(); - - all.push(SATSolver::mkLit(nv0, true)); - } - - if (polary != LEFT_ONLY) - { - s.push(SATSolver::mkLit(v_a[i], true)); - s.push(SATSolver::mkLit(v_b[i], false)); - s.push(SATSolver::mkLit(result, true)); - SatSolver.addClause(s); - s.clear(); - - s.push(SATSolver::mkLit(v_a[i], false)); - s.push(SATSolver::mkLit(v_b[i], true)); - s.push(SATSolver::mkLit(result, true)); - SatSolver.addClause(s); - s.clear(); - } - } - if (all.size() > 0) - { - all.push(SATSolver::mkLit(result, false)); - SatSolver.addClause(all); - } - return result; - } - else if (v_a.size() == 0 ^ v_b.size() == 0) - { - ASTNode constant = a.isConstant() ? a : b; - vector vec = v_a.size() == 0 ? v_b : v_a; - assert(constant.isConstant()); - assert(vec.size() == width); - - SATSolver::vec_literals all; - const int result = SatSolver.newVar(); - all.push(SATSolver::mkLit(result, false)); - - CBV v = constant.GetBVConst(); - for (int i = 0; i < width; i++) - { - if (polary != RIGHT_ONLY) - { - if (CONSTANTBV::BitVector_bit_test(v, i)) - all.push(SATSolver::mkLit(vec[i], true)); - else - all.push(SATSolver::mkLit(vec[i], false)); - } - - if (polary != LEFT_ONLY) - { - SATSolver::vec_literals p; - p.push(SATSolver::mkLit(result, true)); - if (CONSTANTBV::BitVector_bit_test(v, i)) - p.push(SATSolver::mkLit(vec[i], false)); - else - p.push(SATSolver::mkLit(vec[i], true)); - - SatSolver.addClause(p); - } - - } - if (all.size() > 1) - SatSolver.addClause(all); - return result; - } - else - FatalError("Unexpected, both must be constants.."); - } - - - /****************************************************************** - * ARRAY READ ABSTRACTION REFINEMENT - * - * SATBased_ArrayReadRefinement() - * - * What it really does is, for each array, loop over each index i. - * inside that loop, it finds all the true and false axioms with i - * as first index. When it's got them all, it adds the false axioms - * to the formula and re-solves, and returns if the result is - * correct. Otherwise, it goes on to the next index. - * - * If it gets through all the indices without a correct result - * (which I think is impossible), it then solves with all the true - * axioms, too. - * - * This is not the most obvious way to do it, and I don't know how - * it compares with other approaches (e.g., one false axiom at a - * time or all the false axioms each time). - *****************************************************************/ - struct AxiomToBe - { - AxiomToBe(ASTNode i0, ASTNode i1, ASTNode v0, ASTNode v1) - { - index0 = i0; - index1 = i1; - value0 = v0; - value1 = v1; - } - ASTNode index0, index1; - ASTNode value0, value1; - - int - numberOfConstants() const - { - return ((index0.isConstant() ? 1 : 0) + (index1.isConstant() ? 1 : 0) + (index0.isConstant() ? 1 : 0) - + (index1.isConstant() ? 1 : 0)); - } - - }; - - void - applyAxiomToSAT(SATSolver & SatSolver, AxiomToBe& toBe, ToSATBase::ASTNodeToSATVar & satVar) - { - Minisat::Var a = getEquals(SatSolver, toBe.index0, toBe.index1, satVar, LEFT_ONLY); - Minisat::Var b = getEquals(SatSolver, toBe.value0, toBe.value1, satVar, RIGHT_ONLY); - SATSolver::vec_literals satSolverClause; - satSolverClause.push(SATSolver::mkLit(a, true)); - satSolverClause.push(SATSolver::mkLit(b, false)); - SatSolver.addClause(satSolverClause); - } - - void - applyAxiomsToSolver(ToSATBase::ASTNodeToSATVar & satVar, vector & toBe, SATSolver & SatSolver) - { - for (int i = 0; i < toBe.size(); i++) - { - applyAxiomToSAT(SatSolver, toBe[i], satVar); - } - toBe.clear(); - } - - bool - sortBySize(const pair& a, - const pair& b) - { - return a.second.size() < b.second.size(); - } - - bool - sortByIndexConstants(const pair & a, - const pair & b) - { - int aCount = ((a.second.index_symbol.isConstant()) ? 2 : 0) + (a.second.symbol.isConstant() ? 1 : 0); - int bCount = ((b.second.index_symbol.isConstant()) ? 2 : 0) + (b.second.symbol.isConstant() ? 1 : 0); - return aCount > bCount; - } - - bool - sortbyConstants(const AxiomToBe & a, const AxiomToBe & b) - { - return a.numberOfConstants() > b.numberOfConstants(); - } - - SOLVER_RETURN_TYPE - AbsRefine_CounterExample::SATBased_ArrayReadRefinement(SATSolver & SatSolver, const ASTNode & inputAlreadyInSAT, - const ASTNode & original_input, ToSATBase *tosat) - { - vector RemainingAxiomsVec; - vector FalseAxiomsVec; - // NB. Because we stop this timer before entering the SAT solver, the count - // it produces isn't the number of times Array Read Refinement was entered. - bm->GetRunTimes()->start(RunTimes::ArrayReadRefinement); - /// Check the arrays with the least indexes first. - - - vector > arrayToIndex; - arrayToIndex.insert(arrayToIndex.begin(), ArrayTransform->arrayToIndexToRead.begin(), - ArrayTransform->arrayToIndexToRead.end()); - sort(arrayToIndex.begin(), arrayToIndex.end(), sortBySize); - - //In these loops we try to construct Leibnitz axioms and add it to - //the solve(). We add only those axioms that are false in the - //current counterexample. we keep adding the axioms until there - //are no more axioms to add - // - //for each array, fetch its list of indices seen so far - for (vector >::const_iterator iset = arrayToIndex.begin(), - iset_end = arrayToIndex.end(); iset != iset_end; iset++) - { - const ASTNode& ArrName = iset->first; - const map& mapper = iset->second; - - vector listOfIndices; - listOfIndices.reserve(mapper.size()); - - // Make a vector of the read symbols. - ASTVec read_node_symbols; - read_node_symbols.reserve(listOfIndices.size()); - - vector jKind; - jKind.reserve(mapper.size()); - - vector concreteIndexes; - concreteIndexes.reserve(mapper.size()); - - vector concreteValues; - concreteValues.reserve(mapper.size()); - - ASTVec index_symbols; - - vector > indexToRead; - indexToRead.insert(indexToRead.begin(), mapper.begin(), mapper.end()); - sort(indexToRead.begin(), indexToRead.end(), sortByIndexConstants); - - for (vector >::const_iterator it = indexToRead.begin(); it - != indexToRead.end(); it++) - { - const ASTNode& the_index = it->first; - listOfIndices.push_back(the_index); - - ASTNode arrsym = it->second.symbol; - read_node_symbols.push_back(arrsym); - - index_symbols.push_back(it->second.index_symbol); - - assert(read_node_symbols[0].GetValueWidth() == arrsym.GetValueWidth()); - assert(listOfIndices[0].GetValueWidth() == the_index.GetValueWidth()); - - jKind.push_back(the_index.GetKind()); - - concreteIndexes.push_back(TermToConstTermUsingModel(the_index)); - concreteValues.push_back(TermToConstTermUsingModel(arrsym)); - } - - assert(listOfIndices.size() == mapper.size()); - - //loop over the list of indices for the array and create LA, - //and add to inputAlreadyInSAT - for (int i = 0; i < listOfIndices.size(); i++) - { - const ASTNode& index_i = listOfIndices[i]; - const Kind iKind = index_i.GetKind(); - - // Create all distinct pairs of indexes. - for (int j = i + 1; j < listOfIndices.size(); j++) - { - const ASTNode& index_j = listOfIndices[j]; - - // If the index is a constant, and different, then there's no reason to check. - // Sometimes we get the same index stored multiple times in the array. Not sure why... - if (BVCONST == iKind && jKind[j] == BVCONST && index_i != index_j) - continue; - - if (ASTFalse == simp->CreateSimplifiedEQ(index_i, index_j)) - continue; // shortcut. - - AxiomToBe o(index_symbols[i], index_symbols[j], read_node_symbols[i], - read_node_symbols[j]); - - if (concreteIndexes[i] == concreteIndexes[j] && concreteValues[i] != concreteValues[j]) - { - FalseAxiomsVec.push_back(o); - //ToSATBase::ASTNodeToSATVar & satVar = tosat->SATVar_to_SymbolIndexMap(); - //applyAxiomsToSolver(satVar, FalseAxiomsVec, SatSolver); - } - else - RemainingAxiomsVec.push_back(o); - } - if (FalseAxiomsVec.size() > 0) - { - ToSATBase::ASTNodeToSATVar & satVar = tosat->SATVar_to_SymbolIndexMap(); - applyAxiomsToSolver(satVar, FalseAxiomsVec, SatSolver); - - SOLVER_RETURN_TYPE res2; - bm->GetRunTimes()->stop(RunTimes::ArrayReadRefinement); - res2 = CallSAT_ResultCheck(SatSolver, ASTTrue, original_input, tosat, true); - - if (SOLVER_UNDECIDED != res2) - return res2; - bm->GetRunTimes()->start(RunTimes::ArrayReadRefinement); - } - } - } -#if 1 - if (RemainingAxiomsVec.size() > 0) - { - if (bm->UserFlags.stats_flag) - { - cout << "Adding all the remaining " << RemainingAxiomsVec.size() << " read axioms " << endl; - } - ToSATBase::ASTNodeToSATVar & satVar = tosat->SATVar_to_SymbolIndexMap(); - applyAxiomsToSolver(satVar, RemainingAxiomsVec, SatSolver); - - bm->GetRunTimes()->stop(RunTimes::ArrayReadRefinement); - return CallSAT_ResultCheck(SatSolver, ASTTrue, original_input, tosat, true); - } - // For difficult problems, I suspec this is a better way to do it. - // However because it can cause an extra three SAT solver calls, it slows down - // easy problems. -#else - if(RemainingAxiomsVec.size() > 0) - { - // Add the axioms in order of how many constants there are in each. - - ToSATBase::ASTNodeToSATVar & satVar = tosat->SATVar_to_SymbolIndexMap(); - sort(RemainingAxiomsVec.begin(), RemainingAxiomsVec.end(), sortbyConstants); - int current_position = 0; - for(int n_const = 4;n_const >= 0;n_const--) - { - bool added =false; - while(current_position < RemainingAxiomsVec.size() && RemainingAxiomsVec[current_position].numberOfConstants() == n_const) - { - AxiomToBe & toBe = RemainingAxiomsVec[current_position]; - applyAxiomToSAT(SatSolver, toBe,satVar); - current_position++; - added = true; - } - if (!added) - continue; - bm->GetRunTimes()->stop(RunTimes::ArrayReadRefinement); - SOLVER_RETURN_TYPE res2; - res2 = CallSAT_ResultCheck(SatSolver, ASTTrue, original_input, tosat, true); - if(SOLVER_UNDECIDED != res2) - return res2; - - bm->GetRunTimes()->start(RunTimes::ArrayReadRefinement); - } - assert(current_position == RemainingAxiomsVec.size()); - RemainingAxiomsVec.clear(); - assert(SOLVER_UNDECIDED == CallSAT_ResultCheck(SatSolver, ASTTrue, original_input, tosat, true)); - } -#endif - - bm->GetRunTimes()->stop(RunTimes::ArrayReadRefinement); - return SOLVER_UNDECIDED; - } //end of SATBased_ArrayReadRefinement - - -#if 0 - // This isn't currently wired up. - - /****************************************************************** - * ARRAY WRITE ABSTRACTION REFINEMENT - * - * FIXME: Write Detailed Comment - *****************************************************************/ - SOLVER_RETURN_TYPE - AbsRefine_CounterExample:: - SATBased_ArrayWriteRefinement(SATSolver& SatSolver, - const ASTNode& original_input, - ToSATBase *tosat - ) - { - ASTNode writeAxiom; - ASTNodeMap::const_iterator it = simp->ReadOverWriteMap()->begin(); - ASTNodeMap::const_iterator itend = simp->ReadOverWriteMap()->end(); - - ASTVec FalseAxioms, RemainingAxioms; - RemainingAxioms.push_back(ASTTrue); - for (; it != itend; it++) - { - //Guided refinement starts here - ClearComputeFormulaMap(); - writeAxiom = Create_ArrayWriteAxioms(it->first, it->second); - if (ASTFalse == ComputeFormulaUsingModel(writeAxiom)) - { - writeAxiom = ArrayTransform->TransformFormula_TopLevel(writeAxiom); - FalseAxioms.push_back(writeAxiom); - } - else - { - writeAxiom = ArrayTransform->TransformFormula_TopLevel(writeAxiom); - RemainingAxioms.push_back(writeAxiom); - } - } - - SOLVER_RETURN_TYPE res2 = SOLVER_UNDECIDED; - if (FalseAxioms.size() > 0) - { - writeAxiom = (FalseAxioms.size() != 1) ? bm->CreateNode(AND, - FalseAxioms) : FalseAxioms[0]; - bm->ASTNodeStats("adding false writeaxiom to SAT: ", writeAxiom); - res2 = CallSAT_ResultCheck(SatSolver, writeAxiom, original_input, tosat,true); - } - - if (SOLVER_UNDECIDED != res2) - { - return res2; - } - - if (RemainingAxioms.size() > 0) - { - writeAxiom = - (RemainingAxioms.size() != 1) ? - bm->CreateNode(AND, RemainingAxioms) : RemainingAxioms[0]; - bm->ASTNodeStats("adding remaining writeaxiom to SAT: ", writeAxiom); - res2 = CallSAT_ResultCheck(SatSolver, - writeAxiom, - original_input, - tosat, true); - } - return res2; - } //end of SATBased_ArrayWriteRefinement - - //Creates Array Write Axioms - ASTNode - AbsRefine_CounterExample::Create_ArrayWriteAxioms(const ASTNode& term, - const ASTNode& newvar) - { - if (READ != term.GetKind() && WRITE != term[0].GetKind()) - { - FatalError("Create_ArrayWriteAxioms: "\ - "Input must be a READ over a WRITE", term); - } - - ASTNode lhs = newvar; - ASTNode rhs = term; - ASTNode arraywrite_axiom = simp->CreateSimplifiedEQ(lhs, rhs); - return arraywrite_axiom; - }//end of Create_ArrayWriteAxioms() -#endif -};// end of namespace BEEV diff --git a/src/vendor/stp/src/absrefine_counterexample/CounterExample.cpp b/src/vendor/stp/src/absrefine_counterexample/CounterExample.cpp deleted file mode 100644 index 9f59e0f45..000000000 --- a/src/vendor/stp/src/absrefine_counterexample/CounterExample.cpp +++ /dev/null @@ -1,991 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "AbsRefine_CounterExample.h" -#include "../printer/printers.h" -#include "../to-sat/AIG/ToSATAIG.h" - -const bool debug_counterexample = false; - -namespace BEEV -{ - /*FUNCTION: constructs counterexample from MINISAT counterexample - * step1 : iterate through MINISAT counterexample and assemble the - * bits for each AST term. Store it in a map from ASTNode to vector - * of bools (bits). - * - * step2: Iterate over the map from ASTNodes->Vector-of-Bools and - * populate the CounterExampleMap data structure (ASTNode -> BVConst) - */ - void - AbsRefine_CounterExample::ConstructCounterExample(SATSolver& newS, - ToSATBase::ASTNodeToSATVar& satVarToSymbol) - { - if (!newS.okay()) - return; - if (!bm->UserFlags.construct_counterexample_flag) - return; - - assert(CounterExampleMap.size() == 0); - - CopySolverMap_To_CounterExample(); - - for (ToSATBase::ASTNodeToSATVar::const_iterator it = satVarToSymbol.begin(); it - != satVarToSymbol.end(); it++) - { - const ASTNode& symbol = it->first; - const vector& v = it->second; - - const unsigned int symbolWidth = symbol.GetValueWidth(); - assert(symbol.GetKind() == SYMBOL); - vector bitVector_array(symbolWidth,false); - - for (int index = 0; index < v.size(); index++) - { - const unsigned sat_variable_index = v[index]; - - if (sat_variable_index == ~((unsigned) 0)) // not sent to the sat solver. - continue; - - if (newS.modelValue(sat_variable_index) == newS.undef_literal()) - continue; - - //assemble the counterexample here - if (symbol.GetType() == BITVECTOR_TYPE) - { - //Collect the bits of 'symbol' and store in v. Store - //in reverse order. - bitVector_array[(symbolWidth - 1) - index] = (newS.modelValue(sat_variable_index) == newS.true_literal() ); - } - else - { - assert (symbol.GetType() == BOOLEAN_TYPE); - if (newS.modelValue(sat_variable_index) == newS.true_literal()) - CounterExampleMap[symbol] = ASTTrue; - else if (newS.modelValue(sat_variable_index) == newS.false_literal()) - CounterExampleMap[symbol] = ASTFalse; - else - FatalError("never heres."); - - } - } - - if (symbol.GetType() == BITVECTOR_TYPE) - { - CounterExampleMap[symbol] = BoolVectoBVConst(&bitVector_array, symbol.GetValueWidth()); - } - } - - for (ArrayTransformer::ArrType::const_iterator it = ArrayTransform->arrayToIndexToRead.begin(), itend = - ArrayTransform->arrayToIndexToRead.end(); it != itend; it++) - { - const ASTNode& array = it->first; - const map& mapper = it->second; - - for (map::const_iterator it2 = mapper.begin(), it2end = mapper.end(); it2 - != it2end; it2++) - { - const ASTNode& index = it2->first; - const ASTNode& value_ite = it2->second.ite; - - //convert it to a constant array-read and store it in the - //counter-example. First convert the index into a constant. then - //construct the appropriate array-read and store it in the - //counterexample - ASTNode arrayread_index = TermToConstTermUsingModel(index, false); - ASTNode key = bm->CreateTerm(READ, array.GetValueWidth(), array, arrayread_index); - - //Get the ITE corresponding to the array-read and convert it - //to a constant against the model - ASTNode value = TermToConstTermUsingModel(value_ite); - //save the result in the counter_example - if (!simp->CheckSubstitutionMap(key)) - CounterExampleMap[key] = value; - } - } - } //End of ConstructCounterExample - - - // FUNCTION: accepts a non-constant term, and returns the - // corresponding constant term with respect to a model. - // - // term READ(A,i) is treated as follows: - // - //1. If (the boolean variable 'ArrayReadFlag' is true && ArrayRead - //1. has value in counterexample), then return the value of the - //1. arrayread. - // - //2. If (the boolean variable 'ArrayReadFlag' is true && ArrayRead - //2. doesn't have value in counterexample), then return the - //2. arrayread itself (normalized such that arrayread has a constant - //2. index) - // - //3. If (the boolean variable 'ArrayReadFlag' is false) && ArrayRead - //3. has a value in the counterexample then return the value of the - //3. arrayread. - // - //4. If (the boolean variable 'ArrayReadFlag' is false) && ArrayRead - //4. doesn't have a value in the counterexample then return 0 as the - //4. value of the arrayread. - ASTNode - AbsRefine_CounterExample::TermToConstTermUsingModel(const ASTNode& term, - bool ArrayReadFlag) - { - if (term.GetKind() == BVCONST) - return term; - - const Kind k = term.GetKind(); - - assert (is_Term_kind(k)); - assert (k != WRITE); - assert (BOOLEAN_TYPE != term.GetType()); - - ASTNodeMap::const_iterator it1; - if ((it1 = CounterExampleMap.find(term)) != CounterExampleMap.end()) - { - const ASTNode& val = it1->second; - if (BVCONST != val.GetKind()) - { - //CounterExampleMap has two maps rolled into - //one. SubstitutionMap and SolverMap. - // - //recursion is fine here. There are two maps that are checked - //here. One is the substitutionmap. We garuntee that the value - //of a key in the substitutionmap is always a constant. - // - //in the SolverMap we garuntee that "term" does not occur in - //the value part of the map - if (term == val) - { - FatalError("TermToConstTermUsingModel: " - "The input term is stored as-is " - "in the CounterExample: Not ok: ", term); - } - return TermToConstTermUsingModel(val, ArrayReadFlag); - } - else - { - return val; - } - } - - ASTNode output; - switch (k) - { - case BVCONST: - output = term; - break; - case SYMBOL: - { - if (term.GetType() == ARRAY_TYPE) - { - return term; - } - - // Has been simplified out. Can take any value. - output = bm->CreateZeroConst(term.GetValueWidth()); - break; - } - case READ: - { - ASTNode arrName = term[0]; - ASTNode index = term[1]; - if (0 == arrName.GetIndexWidth()) - { - FatalError("TermToConstTermUsingModel: " - "array has 0 index width: ", arrName); - } - - if (WRITE == arrName.GetKind()) //READ over a WRITE - { - ASTNode wrtterm = Expand_ReadOverWrite_UsingModel(term, - ArrayReadFlag); - if (wrtterm == term) - { - FatalError("TermToConstTermUsingModel: " - "Read_Over_Write term must be expanded " - "into an ITE", term); - } - ASTNode rtterm = TermToConstTermUsingModel(wrtterm, ArrayReadFlag); - assert(ArrayReadFlag || (BVCONST == rtterm.GetKind())); - return rtterm; - } - else if (ITE == arrName.GetKind()) //READ over an ITE - { - // The "then" and "else" branch are arrays. - ASTNode indexVal = TermToConstTermUsingModel(index, ArrayReadFlag); - - ASTNode condcompute = ComputeFormulaUsingModel(arrName[0]); // Get the truth value. - unsigned int wid = arrName.GetValueWidth(); - if (ASTTrue == condcompute) - { - const ASTNode & result = TermToConstTermUsingModel( - bm->CreateTerm(READ, wid, arrName[1], indexVal), - ArrayReadFlag); - assert(ArrayReadFlag || (BVCONST == result.GetKind())); - return result; - } - else if (ASTFalse == condcompute) - { - const ASTNode & result = TermToConstTermUsingModel( - bm->CreateTerm(READ, wid, arrName[2], indexVal), - ArrayReadFlag); - assert(ArrayReadFlag || (BVCONST == result.GetKind())); - return result; - } - else - { - FatalError(" TermToConstTermUsingModel: termITE: " - "cannot compute ITE conditional against model: ", term); - } - FatalError("bn23143 Never Here"); - } - - ASTNode modelentry; - if (CounterExampleMap.find(index) != CounterExampleMap.end()) - { - //index has a const value in the CounterExampleMap - //ASTNode indexVal = CounterExampleMap[index]; - ASTNode indexVal = TermToConstTermUsingModel( - CounterExampleMap[index], ArrayReadFlag); - modelentry = bm->CreateTerm(READ, arrName.GetValueWidth(), arrName, - indexVal); - } - else - { - //index does not have a const value in the - //CounterExampleMap. compute it. - ASTNode indexconstval = TermToConstTermUsingModel(index, - ArrayReadFlag); - //update model with value of the index - //CounterExampleMap[index] = indexconstval; - modelentry = bm->CreateTerm(READ, arrName.GetValueWidth(), arrName, - indexconstval); - } - //modelentry is now an arrayread over a constant index - BVTypeCheck(modelentry); - - //if a value exists in the CounterExampleMap then return it - if (CounterExampleMap.find(modelentry) != CounterExampleMap.end()) - { - output = TermToConstTermUsingModel(CounterExampleMap[modelentry], - ArrayReadFlag); - } - else if (ArrayReadFlag) - { - //return the array read over a constantindex - output = modelentry; - } - else - { - // Has been simplified out. Can take any value. - output = bm->CreateMaxConst(modelentry.GetValueWidth()); - } - break; - } - case ITE: - { - ASTNode condcompute = ComputeFormulaUsingModel(term[0]); - if (ASTTrue == condcompute) - { - output = TermToConstTermUsingModel(term[1], ArrayReadFlag); - } - else if (ASTFalse == condcompute) - { - output = TermToConstTermUsingModel(term[2], ArrayReadFlag); - } - else - { - FatalError(" TermToConstTermUsingModel: termITE: cannot " - "compute ITE conditional against model: ", term); - } - break; - } - default: - { - const ASTVec& c = term.GetChildren(); - ASTVec o; - o.reserve(c.size()); - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it - != itend; it++) - { - ASTNode ff = TermToConstTermUsingModel(*it, ArrayReadFlag); - o.push_back(ff); - } - - output = NonMemberBVConstEvaluator(term.GetSTPMgr() , k, o, term.GetValueWidth()); - break; - } - } - - assert(ArrayReadFlag || (BVCONST == output.GetKind())); - - //when this flag is false, we should compute the arrayread to a - //constant. this constant is stored in the counter_example - //datastructure - //if (!ArrayReadFlag) - { - CounterExampleMap[term] = output; - } - - //cerr << "Output to TermToConstTermUsingModel: " << output << endl; - return output; - } //End of TermToConstTermUsingModel - - //Expands read-over-write by evaluating (readIndex=writeIndex) for - //every writeindex until, either it evaluates to TRUE or all - //(readIndex=writeIndex) evaluate to FALSE - ASTNode - AbsRefine_CounterExample::Expand_ReadOverWrite_UsingModel( - const ASTNode& term, bool arrayread_flag) - { - if (READ != term.GetKind() || WRITE != term[0].GetKind()) - { - FatalError("RemovesWrites: Input must be a READ over a WRITE", term); - } - - ASTNode output; - ASTNodeMap::iterator it1; - if ((it1 = CounterExampleMap.find(term)) != CounterExampleMap.end()) - { - const ASTNode& val = it1->second; - if (BVCONST != val.GetKind()) - { - //recursion is fine here. There are two maps that are checked - //here. One is the substitutionmap. We garuntee that the value - //of a key in the substitutionmap is always a constant. - if (term == val) - { - FatalError("TermToConstTermUsingModel: The input term is " - "stored as-is " - "in the CounterExample: Not ok: ", term); - } - return TermToConstTermUsingModel(val, arrayread_flag); - } - else - { - return val; - } - } - - ASTNode newRead = term; - const ASTNode readIndex = TermToConstTermUsingModel(newRead[1], false); - //iteratively expand read-over-write, and evaluate against the - //model at every iteration - ASTNode write = newRead[0]; - do - { - ASTNode writeIndex = TermToConstTermUsingModel(write[1], false); - - if (writeIndex == readIndex) - { - //found the write-value. return it - output = TermToConstTermUsingModel(write[2], false); - CounterExampleMap[term] = output; - return output; - } - - write = write[0]; - } - while (WRITE == write.GetKind()); - - const unsigned int width = term.GetValueWidth(); - newRead = bm->CreateTerm(READ, width, write, readIndex); - output = TermToConstTermUsingModel(newRead, arrayread_flag); - - //memoize - CounterExampleMap[term] = output; - return output; - } //Expand_ReadOverWrite_UsingModel() - - /* FUNCTION: accepts a non-constant formula, and checks if the - * formula is ASTTrue or ASTFalse w.r.t to a model - */ - ASTNode - AbsRefine_CounterExample::ComputeFormulaUsingModel(const ASTNode& form) - { - const Kind k = form.GetKind(); - if (!(is_Form_kind(k) && BOOLEAN_TYPE == form.GetType())) - { - FatalError(" ComputeConstFormUsingModel: " - "The input is a non-formula: ", form); - } - - //cerr << "Input to ComputeFormulaUsingModel:" << form << endl; - ASTNodeMap::const_iterator it1; - if ((it1 = ComputeFormulaMap.find(form)) != ComputeFormulaMap.end()) - { - const ASTNode& res = it1->second; - if (ASTTrue == res || ASTFalse == res) - { - return res; - } - else - { - FatalError("ComputeFormulaUsingModel: " - "The value of a formula must be TRUE or FALSE:", form); - } - } - - ASTNode output = ASTUndefined; - switch (k) - { - case TRUE: - case FALSE: - output = form; - break; - case SYMBOL: - if (BOOLEAN_TYPE != form.GetType()) - FatalError(" ComputeFormulaUsingModel: " - "Non-Boolean variables are not formulas", form); - if (CounterExampleMap.find(form) != CounterExampleMap.end()) - { - ASTNode counterexample_val = CounterExampleMap[form]; - if (!bm->VarSeenInTerm(form, counterexample_val)) - { - output = ComputeFormulaUsingModel(counterexample_val); - } - else - { - output = counterexample_val; - } - } - else - { - // Has been simplified out. Can take any value. - output = ASTFalse; - } - break; - case EQ: - case BVLT: - case BVLE: - case BVGT: - case BVGE: - case BVSLT: - case BVSLE: - case BVSGT: - case BVSGE: - { - ASTVec children; - children.reserve(form.Degree()); - - for (ASTVec::const_iterator it = form.begin(), itend = form.end(); it - != itend; it++) - { - children.push_back(TermToConstTermUsingModel(*it, false)); - } - - output = NonMemberBVConstEvaluator(form.GetSTPMgr() , k, children, form.GetValueWidth()); - - //evaluate formula to false if bvdiv execption occurs while - //counterexample is being checked during refinement. - if (bm->bvdiv_exception_occured - && bm->counterexample_checking_during_refinement) - { - output = ASTFalse; - } - - } - break; - - case NAND: - case NOR: - case NOT: - case AND: - case XOR: - case IFF: - case IMPLIES: - case OR: - { - ASTVec children; - children.reserve(form.Degree()); - - for (ASTVec::const_iterator it = form.begin(), itend = form.end(); it - != itend; it++) - { - children.push_back( ComputeFormulaUsingModel(*it)); - } - - output = NonMemberBVConstEvaluator(form.GetSTPMgr() , k, children, form.GetValueWidth()); - - //evaluate formula to false if bvdiv execption occurs while - //counterexample is being checked during refinement. - if (bm->bvdiv_exception_occured - && bm->counterexample_checking_during_refinement) - { - output = ASTFalse; - } - - } - break; - - case ITE: - { - ASTNode t0 = ComputeFormulaUsingModel(form[0]); - if (ASTTrue == t0) - output = ComputeFormulaUsingModel(form[1]); - else if (ASTFalse == t0) - output = ComputeFormulaUsingModel(form[2]); - else - FatalError("ComputeFormulaUsingModel: ITE: " - "something is wrong with the formula: ", form); - } - break; - case PARAMBOOL: - output = bm->NewParameterized_BooleanVar(form[0],form[1]); - output = ComputeFormulaUsingModel(output); - break; - default: - cerr << _kind_names[k]; - FatalError(" ComputeFormulaUsingModel: " - "the kind has not been implemented", ASTUndefined); - break; - } - - assert(ASTUndefined != output); - assert(output.isConstant()); - ComputeFormulaMap[form] = output; - return output; - } - - void - AbsRefine_CounterExample::CheckCounterExample(bool t) - { - //input is valid, no counterexample to check - if (bm->ValidFlag) - return; - - //t is true if SAT solver generated a counterexample, else it is false - if (!t) - FatalError("CheckCounterExample: " - "No CounterExample to check", ASTUndefined); - const ASTVec c = bm->GetAsserts(); - - if (bm->UserFlags.stats_flag) - printf("checking counterexample\n"); - - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - if (debug_counterexample) - cerr << "checking" << *it; - - if (ASTFalse == ComputeFormulaUsingModel(*it)) - FatalError("CheckCounterExample:counterexample bogus:" - "assert evaluates to FALSE under counterexample: " - "NOT OK", *it); - } - - // The smtlib ones don't have a query defined. - if ((bm->GetQuery() != ASTUndefined) && ASTTrue - == ComputeFormulaUsingModel(bm->GetQuery())) - FatalError("CheckCounterExample:counterexample bogus:" - "query evaluates to TRUE under counterexample: " - "NOT OK", bm->GetQuery()); - } - - /* FUNCTION: queries the CounterExampleMap object with 'expr' and - * returns the corresponding counterexample value. - */ - ASTNode - AbsRefine_CounterExample::GetCounterExample(bool t, const ASTNode& expr) - { - //input is valid, no counterexample to get - if (bm->ValidFlag) - return ASTUndefined; - - if (BOOLEAN_TYPE == expr.GetType()) - { - return ComputeFormulaUsingModel(expr); - } - - if (BVCONST == expr.GetKind()) - { - return expr; - } - - ASTNodeMap::iterator it; - ASTNode output; - if ((it = CounterExampleMap.find(expr)) != CounterExampleMap.end()) - output = TermToConstTermUsingModel(CounterExampleMap[expr], false); - else - output = bm->CreateZeroConst(expr.GetValueWidth()); - return output; - } //End of GetCounterExample - - // FUNCTION: queries the counterexample, and returns the number of array locations for e - std::vector > AbsRefine_CounterExample::GetCounterExampleArray(bool t, const ASTNode& e) - { - std::vector > entries; - - //input is valid, no counterexample to print - if (bm->ValidFlag) - { - return entries; - } - - //t is true if SAT solver generated a counterexample, else it is - //false - if (!t) - { - return entries; - } - - // Take a copy of the counterexample map, 'cause TermToConstTermUsingModel - // changes it. Which breaks the iterator otherwise. - const ASTNodeMap c(CounterExampleMap); - - ASTNodeMap::const_iterator it = c.begin(); - ASTNodeMap::const_iterator itend = c.end(); - for (; it != itend; it++) - { - const ASTNode& f = it->first; - const ASTNode& se = it->second; - - if (ARRAY_TYPE == se.GetType()) - { - FatalError("TermToConstTermUsingModel: " - "entry in counterexample is an arraytype. bogus:", se); - } - - //skip over introduced variables - if (f.GetKind() == SYMBOL && (bm->FoundIntroducedSymbolSet( - f))) - { - continue; - } - if (f.GetKind() == READ && f[0] == e && f[0].GetKind() == SYMBOL && f[1].GetKind() == BVCONST) - { - ASTNode rhs; - if (BITVECTOR_TYPE == se.GetType()) - { - rhs = TermToConstTermUsingModel(se, false); - } - else - { - rhs = ComputeFormulaUsingModel(se); - } - assert(rhs.isConstant()); - entries.push_back(std::make_pair(f[1], rhs)); - } - } - - return entries; - } //End of GetCounterExampleArray - - // FUNCTION: prints a counterexample for INVALID inputs. iterate - // through the CounterExampleMap data structure and print it to - // stdout - void - AbsRefine_CounterExample::PrintCounterExample(bool t, std::ostream& os) - { - //input is valid, no counterexample to print - if (bm->ValidFlag) - { - return; - } - - //if this option is true then print the way dawson wants using a - //different printer. do not use this printer. - if (bm->UserFlags.print_arrayval_declaredorder_flag) - { - return; - } - - //t is true if SAT solver generated a counterexample, else it is - //false - if (!t) - { - cerr << "PrintCounterExample: No CounterExample to print: " << endl; - return; - } - - bm->PLPrintNodeSet.clear(); - bm->NodeLetVarMap.clear(); - bm->NodeLetVarVec.clear(); - bm->NodeLetVarMap1.clear(); - - // Take a copy of the counterexample map, 'cause TermToConstTermUsingModel - // changes it. Which breaks the iterator otherwise. - const ASTNodeMap c(CounterExampleMap); - - //os << "\nCOUNTEREXAMPLE: \n" << endl; - ASTNodeMap::const_iterator it = c.begin(); - ASTNodeMap::const_iterator itend = c.end(); - for (; it != itend; it++) - { - const ASTNode& f = it->first; - const ASTNode& se = it->second; - - if (ARRAY_TYPE == se.GetType()) - { - FatalError("TermToConstTermUsingModel: " - "entry in counterexample is an arraytype. bogus:", se); - } - - //skip over introduced variables - if (f.GetKind() == SYMBOL && (bm->FoundIntroducedSymbolSet( - f))) - { - continue; - } - if (f.GetKind() == SYMBOL || (f.GetKind() == READ && f[0].GetKind() - == SYMBOL && f[1].GetKind() == BVCONST)) - { - os << "ASSERT( "; - printer::PL_Print1(os,f,0,false); - if(BOOLEAN_TYPE == f.GetType()) - { - os << "<=>"; - } - else - { - os << " = "; - } - - ASTNode rhs; - if (BITVECTOR_TYPE == se.GetType()) - { - rhs = TermToConstTermUsingModel(se, false); - } - else - { - rhs = ComputeFormulaUsingModel(se); - } - assert(rhs.isConstant()); - printer::PL_Print1(os, rhs, 0, false); - - os << " );" << endl; - } - } - os.flush(); - //os << "\nEND OF COUNTEREXAMPLE" << endl; - } //End of PrintCounterExample - - - /* iterate through the CounterExampleMap data structure and print it - * to stdout. this function prints only the declared array variables - * IN the ORDER in which they were declared. It also assumes that - * the variables are of the form 'varname_number'. otherwise it will - * not print anything. This function was specifically written for - * Dawson Engler's group (bug finding research group at Stanford) - */ - void - AbsRefine_CounterExample::PrintCounterExample_InOrder(bool t) - { - //global command-line option to print counterexample. we do not - //want both counterexample printers to print at the sametime. - // FIXME: This should always print the counterexample. If you want - // to turn it off, check the switch at the point of call. - if (bm->UserFlags.print_counterexample_flag) - return; - - //input is valid, no counterexample to print - if (bm->ValidFlag) - return; - - //print if the commandline option is '-q'. allows printing the - //counterexample in order. - if (!bm->UserFlags.print_arrayval_declaredorder_flag) - return; - - //t is true if SAT solver generated a counterexample, else it is - //false - if (!t) - { - cerr << "PrintCounterExample: No CounterExample to print: " << endl; - return; - } - - //vector to store the integer values - std::vector out_int; - cout << "% "; - for (ASTVec::iterator it = bm->ListOfDeclaredVars.begin(), itend = - bm->ListOfDeclaredVars.end(); it != itend; it++) - { - if (ARRAY_TYPE == it->GetType()) - { - //get the name of the variable - const char * c = it->GetName(); - std::string ss(c); - if (!(0 == strncmp(ss.c_str(), "ini_", 4))) - continue; - reverse(ss.begin(), ss.end()); - - //cout << "debugging: " << ss; - size_t pos = ss.find('_', 0); - if (!((0 < pos) && (pos < ss.size()))) - continue; - - //get the associated length - std::string sss = ss.substr(0, pos); - reverse(sss.begin(), sss.end()); - int n = atoi(sss.c_str()); - - it->PL_Print(cout, 2); - for (int j = 0; j < n; j++) - { - ASTNode index = bm->CreateBVConst(it->GetIndexWidth(), j); - ASTNode readexpr = bm->CreateTerm(READ, it->GetValueWidth(), - *it, index); - ASTNode val = GetCounterExample(t, readexpr); - //cout << "ASSERT( "; - //cout << " = "; - out_int.push_back(val.GetUnsignedConst()); - //cout << "\n"; - } - } - } - cout << endl; - for (unsigned int jj = 0; jj < out_int.size(); jj++) - cout << out_int[jj] << endl; - cout << endl; - } //End of PrintCounterExample_InOrder - - // Prints Satisfying assignment directly, for debugging. - void - AbsRefine_CounterExample::PrintSATModel(SATSolver& newS, - ToSATBase::ASTNodeToSATVar& m) - { - if (!newS.okay()) - FatalError("PrintSATModel: NO COUNTEREXAMPLE TO PRINT", ASTUndefined); - if (!(bm->UserFlags.stats_flag && bm->UserFlags.print_nodes_flag)) - return; - - cout << "Satisfying assignment: " << endl; - for (ToSATBase::ASTNodeToSATVar::const_iterator it = m.begin(); it != m.end(); it++) - { - ASTNode symbol = it->first; - vector v = it->second; - - for (int i =0 ; i < v.size();i++) - { - if (v[i] == ~((unsigned)0)) // nb. special value. - continue; - - - if (newS.modelValue(v[i]) == newS.true_literal()) - { - it->first.nodeprint(cout); - cout << " {" << i << "}" << endl; - } - else if (newS.modelValue(v[i]) == newS.false_literal()) - { - cout << "NOT "; - it->first.nodeprint(cout); - cout << " {" << i << "}" << endl; - } - } - } - } //end of PrintSATModel() - - //FUNCTION: this function accepts a boolvector and returns a BVConst - ASTNode - AbsRefine_CounterExample::BoolVectoBVConst(const vector * w, - const unsigned int l) - { - assert (l == (unsigned)w->size()); - - CBV cc = CONSTANTBV::BitVector_Create(l,true); - for (unsigned int jj = 0; jj < l; jj++) - { - if ((*w)[jj] == true) - CONSTANTBV::BitVector_Bit_On(cc,l-1-jj); - } - - return bm->CreateBVConst(cc,l); - } //end of BoolVectoBVConst() - - void - AbsRefine_CounterExample::CopySolverMap_To_CounterExample(void) - { - - if (!simp->Return_SolverMap()->empty()) - { - CounterExampleMap.insert(simp->Return_SolverMap()->begin(), - simp->Return_SolverMap()->end()); - } - } - - SOLVER_RETURN_TYPE - AbsRefine_CounterExample::CallSAT_ResultCheck(SATSolver& SatSolver, - const ASTNode& modified_input, const ASTNode& original_input, ToSATBase* tosat, bool refinement) - { - - bool sat = tosat->CallSAT(SatSolver, modified_input, refinement); - - if (bm->soft_timeout_expired) - return SOLVER_TIMEOUT; - - if (!sat) - { - //PrintOutput(true); - return SOLVER_VALID; - } - else if (SatSolver.okay()) - { - bm->GetRunTimes()->start(RunTimes::CounterExampleGeneration); - CounterExampleMap.clear(); - ComputeFormulaMap.clear(); - - ToSAT::ASTNodeToSATVar satVarToSymbol = - tosat->SATVar_to_SymbolIndexMap(); - ConstructCounterExample(SatSolver, satVarToSymbol); - if (bm->UserFlags.stats_flag && bm->UserFlags.print_nodes_flag) - { - ToSAT::ASTNodeToSATVar m = tosat->SATVar_to_SymbolIndexMap(); - PrintSATModel(SatSolver, m); - } - //check if the counterexample is good or not - if (bm->counterexample_checking_during_refinement) - bm->bvdiv_exception_occured = false; - ASTNode orig_result = ComputeFormulaUsingModel(original_input); - if (!(ASTTrue == orig_result || ASTFalse == orig_result)) - FatalError("TopLevelSat: Original input must compute to " - "true or false against model"); - - bm->GetRunTimes()->stop(RunTimes::CounterExampleGeneration); - - // if the counterexample is indeed a good one, then return - // invalid - if (ASTTrue == orig_result) - { - if (bm->UserFlags.check_counterexample_flag) - CheckCounterExample(SatSolver.okay()); - - if (bm->UserFlags.stats_flag - || bm->UserFlags.print_counterexample_flag) - { - PrintCounterExample(SatSolver.okay()); - PrintCounterExample_InOrder(SatSolver.okay()); - } - return SOLVER_INVALID; - } - // counterexample is bogus: flag it - else - { - if (bm->UserFlags.stats_flag && bm->UserFlags.print_nodes_flag) - { - cout << "Supposedly bogus one: \n"; - PrintCounterExample(true); - } - - assert (bm->UserFlags.solver_to_use != UserDefinedFlags::MINISAT_PROPAGATORS); // The array solver shouldn't have returned undecided.. - - return SOLVER_UNDECIDED; - } - } - else - { - //Control should never reach here - //PrintOutput(true); - return SOLVER_ERROR; - } - } //end of CALLSAT_ResultCheck() -} -; diff --git a/src/vendor/stp/src/absrefine_counterexample/Makefile b/src/vendor/stp/src/absrefine_counterexample/Makefile deleted file mode 100644 index 85c38ea6e..000000000 --- a/src/vendor/stp/src/absrefine_counterexample/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -OBJS = $(SRCS:.cpp=.o) - - -libabstractionrefinement.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -clean: - $(RM) *.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend diff --git a/src/vendor/stp/src/boost/config.hpp b/src/vendor/stp/src/boost/config.hpp deleted file mode 100644 index 055a27855..000000000 --- a/src/vendor/stp/src/boost/config.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// Boost config.hpp configuration header file ------------------------------// - -// (C) Copyright John Maddock 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/config for most recent version. - -// Boost config.hpp policy and rationale documentation has been moved to -// http://www.boost.org/libs/config -// -// CAUTION: This file is intended to be completely stable - -// DO NOT MODIFY THIS FILE! -// - -#ifndef BOOST_CONFIG_HPP -#define BOOST_CONFIG_HPP - -// if we don't have a user config, then use the default location: -#if !defined(BOOST_USER_CONFIG) && !defined(BOOST_NO_USER_CONFIG) -# define BOOST_USER_CONFIG -#endif -// include it first: -#ifdef BOOST_USER_CONFIG -# include BOOST_USER_CONFIG -#endif - -// if we don't have a compiler config set, try and find one: -#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) && !defined(BOOST_NO_CONFIG) -# include -#endif -// if we have a compiler config, include it now: -#ifdef BOOST_COMPILER_CONFIG -# include BOOST_COMPILER_CONFIG -#endif - -// if we don't have a std library config set, try and find one: -#if !defined(BOOST_STDLIB_CONFIG) && !defined(BOOST_NO_STDLIB_CONFIG) && !defined(BOOST_NO_CONFIG) -# include -#endif -// if we have a std library config, include it now: -#ifdef BOOST_STDLIB_CONFIG -# include BOOST_STDLIB_CONFIG -#endif - -// if we don't have a platform config set, try and find one: -#if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG) && !defined(BOOST_NO_CONFIG) -# include -#endif -// if we have a platform config, include it now: -#ifdef BOOST_PLATFORM_CONFIG -# include BOOST_PLATFORM_CONFIG -#endif - -// get config suffix code: -#include - -#endif // BOOST_CONFIG_HPP - - - - - - - - - - - diff --git a/src/vendor/stp/src/boost/config/abi/borland_prefix.hpp b/src/vendor/stp/src/boost/config/abi/borland_prefix.hpp deleted file mode 100644 index 49f424949..000000000 --- a/src/vendor/stp/src/boost/config/abi/borland_prefix.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// (C) Copyright John Maddock 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// for C++ Builder the following options effect the ABI: -// -// -b (on or off - effect emum sizes) -// -Vx (on or off - empty members) -// -Ve (on or off - empty base classes) -// -aX (alignment - 5 options). -// -pX (Calling convention - 4 options) -// -VmX (member pointer size and layout - 5 options) -// -VC (on or off, changes name mangling) -// -Vl (on or off, changes struct layout). - -// In addition the following warnings are sufficiently annoying (and -// unfixable) to have them turned off by default: -// -// 8027 - functions containing [for|while] loops are not expanded inline -// 8026 - functions taking class by value arguments are not expanded inline - -#pragma nopushoptwarn -# pragma option push -Vx -Ve -a8 -b -pc -Vmv -VC- -Vl- -w-8027 -w-8026 - - - diff --git a/src/vendor/stp/src/boost/config/abi/borland_suffix.hpp b/src/vendor/stp/src/boost/config/abi/borland_suffix.hpp deleted file mode 100644 index 940535f38..000000000 --- a/src/vendor/stp/src/boost/config/abi/borland_suffix.hpp +++ /dev/null @@ -1,12 +0,0 @@ -// (C) Copyright John Maddock 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -# pragma option pop -#pragma nopushoptwarn - - - - - diff --git a/src/vendor/stp/src/boost/config/abi/msvc_prefix.hpp b/src/vendor/stp/src/boost/config/abi/msvc_prefix.hpp deleted file mode 100644 index 97f06cdc0..000000000 --- a/src/vendor/stp/src/boost/config/abi/msvc_prefix.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// (C) Copyright John Maddock 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// -// Boost binaries are built with the compiler's default ABI settings, -// if the user changes their default alignment in the VS IDE then their -// code will no longer be binary compatible with the bjam built binaries -// unless this header is included to force Boost code into a consistent ABI. -// -// Note that inclusion of this header is only necessary for libraries with -// separate source, header only libraries DO NOT need this as long as all -// translation units are built with the same options. -// -#if defined(_M_X64) -# pragma pack(push,16) -#else -# pragma pack(push,8) -#endif - - diff --git a/src/vendor/stp/src/boost/config/abi/msvc_suffix.hpp b/src/vendor/stp/src/boost/config/abi/msvc_suffix.hpp deleted file mode 100644 index a64d783eb..000000000 --- a/src/vendor/stp/src/boost/config/abi/msvc_suffix.hpp +++ /dev/null @@ -1,8 +0,0 @@ -// (C) Copyright John Maddock 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#pragma pack(pop) - - diff --git a/src/vendor/stp/src/boost/config/abi_prefix.hpp b/src/vendor/stp/src/boost/config/abi_prefix.hpp deleted file mode 100644 index 3b1347492..000000000 --- a/src/vendor/stp/src/boost/config/abi_prefix.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// abi_prefix header -------------------------------------------------------// - -// (c) Copyright John Maddock 2003 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). - -#ifndef BOOST_CONFIG_ABI_PREFIX_HPP -# define BOOST_CONFIG_ABI_PREFIX_HPP -#else -# error double inclusion of header boost/config/abi_prefix.hpp is an error -#endif - -#include - -// this must occur after all other includes and before any code appears: -#ifdef BOOST_HAS_ABI_HEADERS -# include BOOST_ABI_PREFIX -#endif - -#if defined( __BORLANDC__ ) -#pragma nopushoptwarn -#endif - diff --git a/src/vendor/stp/src/boost/config/abi_suffix.hpp b/src/vendor/stp/src/boost/config/abi_suffix.hpp deleted file mode 100644 index 939161662..000000000 --- a/src/vendor/stp/src/boost/config/abi_suffix.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// abi_sufffix header -------------------------------------------------------// - -// (c) Copyright John Maddock 2003 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). - -// This header should be #included AFTER code that was preceded by a #include -// . - -#ifndef BOOST_CONFIG_ABI_PREFIX_HPP -# error Header boost/config/abi_suffix.hpp must only be used after boost/config/abi_prefix.hpp -#else -# undef BOOST_CONFIG_ABI_PREFIX_HPP -#endif - -// the suffix header occurs after all of our code: -#ifdef BOOST_HAS_ABI_HEADERS -# include BOOST_ABI_SUFFIX -#endif - -#if defined( __BORLANDC__ ) -#pragma nopushoptwarn -#endif - - diff --git a/src/vendor/stp/src/boost/config/auto_link.hpp b/src/vendor/stp/src/boost/config/auto_link.hpp deleted file mode 100644 index f2eb583f0..000000000 --- a/src/vendor/stp/src/boost/config/auto_link.hpp +++ /dev/null @@ -1,373 +0,0 @@ -// (C) Copyright John Maddock 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - - /* - * LOCATION: see http://www.boost.org for most recent version. - * FILE auto_link.hpp - * VERSION see - * DESCRIPTION: Automatic library inclusion for Borland/Microsoft compilers. - */ - -/************************************************************************* - -USAGE: -~~~~~~ - -Before including this header you must define one or more of define the following macros: - -BOOST_LIB_NAME: Required: A string containing the basename of the library, - for example boost_regex. -BOOST_LIB_TOOLSET: Optional: the base name of the toolset. -BOOST_DYN_LINK: Optional: when set link to dll rather than static library. -BOOST_LIB_DIAGNOSTIC: Optional: when set the header will print out the name - of the library selected (useful for debugging). -BOOST_AUTO_LINK_NOMANGLE: Specifies that we should link to BOOST_LIB_NAME.lib, - rather than a mangled-name version. - -These macros will be undef'ed at the end of the header, further this header -has no include guards - so be sure to include it only once from your library! - -Algorithm: -~~~~~~~~~~ - -Libraries for Borland and Microsoft compilers are automatically -selected here, the name of the lib is selected according to the following -formula: - -BOOST_LIB_PREFIX - + BOOST_LIB_NAME - + "_" - + BOOST_LIB_TOOLSET - + BOOST_LIB_THREAD_OPT - + BOOST_LIB_RT_OPT - "-" - + BOOST_LIB_VERSION - -These are defined as: - -BOOST_LIB_PREFIX: "lib" for static libraries otherwise "". - -BOOST_LIB_NAME: The base name of the lib ( for example boost_regex). - -BOOST_LIB_TOOLSET: The compiler toolset name (vc6, vc7, bcb5 etc). - -BOOST_LIB_THREAD_OPT: "-mt" for multithread builds, otherwise nothing. - -BOOST_LIB_RT_OPT: A suffix that indicates the runtime library used, - contains one or more of the following letters after - a hiphen: - - s static runtime (dynamic if not present). - d debug build (release if not present). - g debug/diagnostic runtime (release if not present). - p STLPort Build. - -BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. - - -***************************************************************************/ - -#ifdef __cplusplus -# ifndef BOOST_CONFIG_HPP -# include -# endif -#elif defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__EDG_VERSION__) -// -// C language compatability (no, honestly) -// -# define BOOST_MSVC _MSC_VER -# define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) -# define BOOST_DO_STRINGIZE(X) #X -#endif -// -// Only include what follows for known and supported compilers: -// -#if defined(BOOST_MSVC) \ - || defined(__BORLANDC__) \ - || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \ - || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) - -#ifndef BOOST_VERSION_HPP -# include -#endif - -#ifndef BOOST_LIB_NAME -# error "Macro BOOST_LIB_NAME not set (internal error)" -#endif - -// -// error check: -// -#if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG) -# pragma message("Using the /RTC option without specifying a debug runtime will lead to linker errors") -# pragma message("Hint: go to the code generation options and switch to one of the debugging runtimes") -# error "Incompatible build options" -#endif -// -// select toolset if not defined already: -// -#ifndef BOOST_LIB_TOOLSET -// Note: no compilers before 1200 are supported -#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) - -# ifdef UNDER_CE - // vc6: -# define BOOST_LIB_TOOLSET "evc4" -# else - // vc6: -# define BOOST_LIB_TOOLSET "vc6" -# endif - -#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1300) - - // vc7: -# define BOOST_LIB_TOOLSET "vc7" - -#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1310) - - // vc71: -# define BOOST_LIB_TOOLSET "vc71" - -#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1400) - - // vc80: -# define BOOST_LIB_TOOLSET "vc80" - -#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1500) - - // vc90: -# define BOOST_LIB_TOOLSET "vc90" - -#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1600) - - // vc10: -# define BOOST_LIB_TOOLSET "vc100" - -#elif defined(__BORLANDC__) - - // CBuilder 6: -# define BOOST_LIB_TOOLSET "bcb" - -#elif defined(__ICL) - - // Intel C++, no version number: -# define BOOST_LIB_TOOLSET "iw" - -#elif defined(__MWERKS__) && (__MWERKS__ <= 0x31FF ) - - // Metrowerks CodeWarrior 8.x -# define BOOST_LIB_TOOLSET "cw8" - -#elif defined(__MWERKS__) && (__MWERKS__ <= 0x32FF ) - - // Metrowerks CodeWarrior 9.x -# define BOOST_LIB_TOOLSET "cw9" - -#endif -#endif // BOOST_LIB_TOOLSET - -// -// select thread opt: -// -#if defined(_MT) || defined(__MT__) -# define BOOST_LIB_THREAD_OPT "-mt" -#else -# define BOOST_LIB_THREAD_OPT -#endif - -#if defined(_MSC_VER) || defined(__MWERKS__) - -# ifdef _DLL - -# if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS)) - -# if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) -# define BOOST_LIB_RT_OPT "-gdp" -# elif defined(_DEBUG) -# define BOOST_LIB_RT_OPT "-gdp" -# pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") -# error "Build options aren't compatible with pre-built libraries" -# else -# define BOOST_LIB_RT_OPT "-p" -# endif - -# elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) - -# if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) -# define BOOST_LIB_RT_OPT "-gdpn" -# elif defined(_DEBUG) -# define BOOST_LIB_RT_OPT "-gdpn" -# pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") -# error "Build options aren't compatible with pre-built libraries" -# else -# define BOOST_LIB_RT_OPT "-pn" -# endif - -# else - -# if defined(_DEBUG) -# define BOOST_LIB_RT_OPT "-gd" -# else -# define BOOST_LIB_RT_OPT -# endif - -# endif - -# else - -# if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS)) - -# if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) -# define BOOST_LIB_RT_OPT "-sgdp" -# elif defined(_DEBUG) -# define BOOST_LIB_RT_OPT "-sgdp" -# pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") -# error "Build options aren't compatible with pre-built libraries" -# else -# define BOOST_LIB_RT_OPT "-sp" -# endif - -# elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) - -# if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) -# define BOOST_LIB_RT_OPT "-sgdpn" -# elif defined(_DEBUG) -# define BOOST_LIB_RT_OPT "-sgdpn" -# pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") -# error "Build options aren't compatible with pre-built libraries" -# else -# define BOOST_LIB_RT_OPT "-spn" -# endif - -# else - -# if defined(_DEBUG) -# define BOOST_LIB_RT_OPT "-sgd" -# else -# define BOOST_LIB_RT_OPT "-s" -# endif - -# endif - -# endif - -#elif defined(__BORLANDC__) - -// -// figure out whether we want the debug builds or not: -// -#if __BORLANDC__ > 0x561 -#pragma defineonoption BOOST_BORLAND_DEBUG -v -#endif -// -// sanity check: -// -#if defined(__STL_DEBUG) || defined(_STLP_DEBUG) -#error "Pre-built versions of the Boost libraries are not provided in STLPort-debug form" -#endif - -# ifdef _RTLDLL - -# ifdef BOOST_BORLAND_DEBUG -# define BOOST_LIB_RT_OPT "-d" -# else -# define BOOST_LIB_RT_OPT -# endif - -# else - -# ifdef BOOST_BORLAND_DEBUG -# define BOOST_LIB_RT_OPT "-sd" -# else -# define BOOST_LIB_RT_OPT "-s" -# endif - -# endif - -#endif - -// -// select linkage opt: -// -#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK) -# define BOOST_LIB_PREFIX -#elif defined(BOOST_DYN_LINK) -# error "Mixing a dll boost library with a static runtime is a really bad idea..." -#else -# define BOOST_LIB_PREFIX "lib" -#endif - -// -// now include the lib: -// -#if defined(BOOST_LIB_NAME) \ - && defined(BOOST_LIB_PREFIX) \ - && defined(BOOST_LIB_TOOLSET) \ - && defined(BOOST_LIB_THREAD_OPT) \ - && defined(BOOST_LIB_RT_OPT) \ - && defined(BOOST_LIB_VERSION) - -#ifndef BOOST_AUTO_LINK_NOMANGLE -# pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") -# ifdef BOOST_LIB_DIAGNOSTIC -# pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") -# endif -#else -# pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib") -# ifdef BOOST_LIB_DIAGNOSTIC -# pragma message ("Linking to lib file: " BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib") -# endif -#endif - -#else -# error "some required macros where not defined (internal logic error)." -#endif - - -#endif // _MSC_VER || __BORLANDC__ - -// -// finally undef any macros we may have set: -// -#ifdef BOOST_LIB_PREFIX -# undef BOOST_LIB_PREFIX -#endif -#if defined(BOOST_LIB_NAME) -# undef BOOST_LIB_NAME -#endif -// Don't undef this one: it can be set by the user and should be the -// same for all libraries: -//#if defined(BOOST_LIB_TOOLSET) -//# undef BOOST_LIB_TOOLSET -//#endif -#if defined(BOOST_LIB_THREAD_OPT) -# undef BOOST_LIB_THREAD_OPT -#endif -#if defined(BOOST_LIB_RT_OPT) -# undef BOOST_LIB_RT_OPT -#endif -#if defined(BOOST_LIB_LINK_OPT) -# undef BOOST_LIB_LINK_OPT -#endif -#if defined(BOOST_LIB_DEBUG_OPT) -# undef BOOST_LIB_DEBUG_OPT -#endif -#if defined(BOOST_DYN_LINK) -# undef BOOST_DYN_LINK -#endif -#if defined(BOOST_AUTO_LINK_NOMANGLE) -# undef BOOST_AUTO_LINK_NOMANGLE -#endif - - - - - - - - - - - diff --git a/src/vendor/stp/src/boost/config/compiler/borland.hpp b/src/vendor/stp/src/boost/config/compiler/borland.hpp deleted file mode 100644 index 6a7b988d1..000000000 --- a/src/vendor/stp/src/boost/config/compiler/borland.hpp +++ /dev/null @@ -1,267 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Aleksey Gurtovoy 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Borland C++ compiler setup: - -// -// versions check: -// we don't support Borland prior to version 5.4: -#if __BORLANDC__ < 0x540 -# error "Compiler not supported or configured - please reconfigure" -#endif - -// last known compiler version: -#if (__BORLANDC__ > 0x613) -//# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -//# else -//# pragma message( "Unknown compiler version - please run the configure tests and report the results") -//# endif -#elif (__BORLANDC__ == 0x600) -# error "CBuilderX preview compiler is no longer supported" -#endif - -// -// Support macros to help with standard library detection -#if (__BORLANDC__ < 0x560) || defined(_USE_OLD_RW_STL) -# define BOOST_BCB_WITH_ROGUE_WAVE -#elif __BORLANDC__ < 0x570 -# define BOOST_BCB_WITH_STLPORT -#else -# define BOOST_BCB_WITH_DINKUMWARE -#endif - -// -// Version 5.0 and below: -# if __BORLANDC__ <= 0x0550 -// Borland C++Builder 4 and 5: -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# if __BORLANDC__ == 0x0550 -// Borland C++Builder 5, command-line compiler 5.5: -# define BOOST_NO_OPERATORS_IN_NAMESPACE -# endif -# endif - -// Version 5.51 and below: -#if (__BORLANDC__ <= 0x551) -# define BOOST_NO_CV_SPECIALIZATIONS -# define BOOST_NO_CV_VOID_SPECIALIZATIONS -# define BOOST_NO_DEDUCED_TYPENAME -// workaround for missing WCHAR_MAX/WCHAR_MIN: -#include -#include -#ifndef WCHAR_MAX -# define WCHAR_MAX 0xffff -#endif -#ifndef WCHAR_MIN -# define WCHAR_MIN 0 -#endif -#endif - -// Borland C++ Builder 6 and below: -#if (__BORLANDC__ <= 0x564) - -# ifdef NDEBUG - // fix broken so that Boost.test works: -# include -# undef strcmp -# endif - // fix broken errno declaration: -# include -# ifndef errno -# define errno errno -# endif - -#endif - -// -// new bug in 5.61: -#if (__BORLANDC__ >= 0x561) && (__BORLANDC__ <= 0x580) - // this seems to be needed by the command line compiler, but not the IDE: -# define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -#endif - -// Borland C++ Builder 2006 Update 2 and below: -#if (__BORLANDC__ <= 0x582) -# define BOOST_NO_SFINAE -# define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -# define BOOST_NO_TEMPLATE_TEMPLATES - -# define BOOST_NO_PRIVATE_IN_AGGREGATE - -# ifdef _WIN32 -# define BOOST_NO_SWPRINTF -# elif defined(linux) || defined(__linux__) || defined(__linux) - // we should really be able to do without this - // but the wcs* functions aren't imported into std:: -# define BOOST_NO_STDC_NAMESPACE - // _CPPUNWIND doesn't get automatically set for some reason: -# pragma defineonoption BOOST_CPPUNWIND -x -# endif -#endif - -#if (__BORLANDC__ <= 0x613) // Beman has asked Alisdair for more info - // we shouldn't really need this - but too many things choke - // without it, this needs more investigation: -# define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -# define BOOST_NO_IS_ABSTRACT -# define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -# define BOOST_NO_USING_TEMPLATE -# define BOOST_SP_NO_SP_CONVERTIBLE - -// Temporary workaround -#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS -#endif - -// Borland C++ Builder 2008 and below: -# define BOOST_NO_INTEGRAL_INT64_T -# define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -# define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -# define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -# define BOOST_NO_NESTED_FRIENDSHIP -# define BOOST_NO_TYPENAME_WITH_CTOR -#if (__BORLANDC__ < 0x600) -# define BOOST_ILLEGAL_CV_REFERENCES -#endif - -// -// Positive Feature detection -// -// Borland C++ Builder 2008 and below: -#if (__BORLANDC__ >= 0x599) -# pragma defineonoption BOOST_CODEGEAR_0X_SUPPORT -Ax -#endif -// -// C++0x Macros: -// -#if !defined( BOOST_CODEGEAR_0X_SUPPORT ) || (__BORLANDC__ < 0x610) -# define BOOST_NO_CHAR16_T -# define BOOST_NO_CHAR32_T -# define BOOST_NO_DECLTYPE -# define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -# define BOOST_NO_EXTERN_TEMPLATE -# define BOOST_NO_RVALUE_REFERENCES -# define BOOST_NO_SCOPED_ENUMS -# define BOOST_NO_STATIC_ASSERT -#else -# define BOOST_HAS_ALIGNOF -# define BOOST_HAS_CHAR16_T -# define BOOST_HAS_CHAR32_T -# define BOOST_HAS_DECLTYPE -# define BOOST_HAS_EXPLICIT_CONVERSION_OPS -# define BOOST_HAS_REF_QUALIFIER -# define BOOST_HAS_RVALUE_REFS -# define BOOST_HAS_STATIC_ASSERT -#endif - -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS // UTF-8 still not supported -#define BOOST_NO_VARIADIC_TEMPLATES - -#if __BORLANDC__ >= 0x590 -# define BOOST_HAS_TR1_HASH - -# define BOOST_HAS_MACRO_USE_FACET -#endif - -// -// Post 0x561 we have long long and stdint.h: -#if __BORLANDC__ >= 0x561 -# ifndef __NO_LONG_LONG -# define BOOST_HAS_LONG_LONG -# else -# define BOOST_NO_LONG_LONG -# endif - // On non-Win32 platforms let the platform config figure this out: -# ifdef _WIN32 -# define BOOST_HAS_STDINT_H -# endif -#endif - -// Borland C++Builder 6 defaults to using STLPort. If _USE_OLD_RW_STL is -// defined, then we have 0x560 or greater with the Rogue Wave implementation -// which presumably has the std::DBL_MAX bug. -#if defined( BOOST_BCB_WITH_ROGUE_WAVE ) -// is partly broken, some macros define symbols that are really in -// namespace std, so you end up having to use illegal constructs like -// std::DBL_MAX, as a fix we'll just include float.h and have done with: -#include -#endif -// -// __int64: -// -#if (__BORLANDC__ >= 0x530) && !defined(__STRICT_ANSI__) -# define BOOST_HAS_MS_INT64 -#endif -// -// check for exception handling support: -// -#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) -# define BOOST_NO_EXCEPTIONS -#endif -// -// all versions have a : -// -#ifndef __STRICT_ANSI__ -# define BOOST_HAS_DIRENT_H -#endif -// -// all versions support __declspec: -// -#ifndef __STRICT_ANSI__ -# define BOOST_HAS_DECLSPEC -#endif -// -// ABI fixing headers: -// -#if __BORLANDC__ != 0x600 // not implemented for version 6 compiler yet -#ifndef BOOST_ABI_PREFIX -# define BOOST_ABI_PREFIX "boost/config/abi/borland_prefix.hpp" -#endif -#ifndef BOOST_ABI_SUFFIX -# define BOOST_ABI_SUFFIX "boost/config/abi/borland_suffix.hpp" -#endif -#endif -// -// Disable Win32 support in ANSI mode: -// -#if __BORLANDC__ < 0x600 -# pragma defineonoption BOOST_DISABLE_WIN32 -A -#elif defined(__STRICT_ANSI__) -# define BOOST_DISABLE_WIN32 -#endif -// -// MSVC compatibility mode does some nasty things: -// TODO: look up if this doesn't apply to the whole 12xx range -// -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -# define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -# define BOOST_NO_VOID_RETURNS -#endif - -#define BOOST_COMPILER "Borland C++ version " BOOST_STRINGIZE(__BORLANDC__) - - - diff --git a/src/vendor/stp/src/boost/config/compiler/codegear.hpp b/src/vendor/stp/src/boost/config/compiler/codegear.hpp deleted file mode 100644 index 698624ece..000000000 --- a/src/vendor/stp/src/boost/config/compiler/codegear.hpp +++ /dev/null @@ -1,163 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Aleksey Gurtovoy 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// CodeGear C++ compiler setup: - -#if !defined( BOOST_WITH_CODEGEAR_WARNINGS ) -// these warnings occur frequently in optimized template code -# pragma warn -8004 // var assigned value, but never used -# pragma warn -8008 // condition always true/false -# pragma warn -8066 // dead code can never execute -# pragma warn -8104 // static members with ctors not threadsafe -# pragma warn -8105 // reference member in class without ctors -#endif -// -// versions check: -// last known and checked version is 0x620 -#if (__CODEGEARC__ > 0x620) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# else -# pragma message( "Unknown compiler version - please run the configure tests and report the results") -# endif -#endif - -// CodeGear C++ Builder 2009 -#if (__CODEGEARC__ <= 0x613) -# define BOOST_NO_INTEGRAL_INT64_T -# define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -# define BOOST_NO_PRIVATE_IN_AGGREGATE -# define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE - // we shouldn't really need this - but too many things choke - // without it, this needs more investigation: -# define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -# define BOOST_SP_NO_SP_CONVERTIBLE -#endif - -// CodeGear C++ Builder 2010 -#if (__CODEGEARC__ <= 0x620) -# define BOOST_NO_TYPENAME_WITH_CTOR // Cannot use typename keyword when making temporaries of a dependant type -# define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# define BOOST_NO_NESTED_FRIENDSHIP // TC1 gives nested classes access rights as any other member -# define BOOST_NO_USING_TEMPLATE -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -// Temporary hack, until specific MPL preprocessed headers are generated -# define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS - -# ifdef NDEBUG - // fix broken so that Boost.test works: -# include -# undef strcmp -# endif - // fix broken errno declaration: -# include -# ifndef errno -# define errno errno -# endif - -#endif -// -// C++0x macros: -// -#define BOOST_HAS_CHAR16_T -#define BOOST_HAS_CHAR32_T -#define BOOST_HAS_LONG_LONG -// #define BOOST_HAS_ALIGNOF -#define BOOST_HAS_DECLTYPE -#define BOOST_HAS_EXPLICIT_CONVERSION_OPS -// #define BOOST_HAS_RVALUE_REFS -#define BOOST_HAS_SCOPED_ENUM -// #define BOOST_HAS_STATIC_ASSERT -#define BOOST_HAS_STD_TYPE_TRAITS - -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -// -// TR1 macros: -// -#define BOOST_HAS_TR1_HASH -#define BOOST_HAS_TR1_TYPE_TRAITS -#define BOOST_HAS_TR1_UNORDERED_MAP -#define BOOST_HAS_TR1_UNORDERED_SET - -#define BOOST_HAS_MACRO_USE_FACET - -#define BOOST_NO_INITIALIZER_LISTS - -// On non-Win32 platforms let the platform config figure this out: -#ifdef _WIN32 -# define BOOST_HAS_STDINT_H -#endif - -// -// __int64: -// -#if !defined(__STRICT_ANSI__) -# define BOOST_HAS_MS_INT64 -#endif -// -// check for exception handling support: -// -#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) -# define BOOST_NO_EXCEPTIONS -#endif -// -// all versions have a : -// -#if !defined(__STRICT_ANSI__) -# define BOOST_HAS_DIRENT_H -#endif -// -// all versions support __declspec: -// -#if !defined(__STRICT_ANSI__) -# define BOOST_HAS_DECLSPEC -#endif -// -// ABI fixing headers: -// -#ifndef BOOST_ABI_PREFIX -# define BOOST_ABI_PREFIX "boost/config/abi/borland_prefix.hpp" -#endif -#ifndef BOOST_ABI_SUFFIX -# define BOOST_ABI_SUFFIX "boost/config/abi/borland_suffix.hpp" -#endif -// -// Disable Win32 support in ANSI mode: -// -# pragma defineonoption BOOST_DISABLE_WIN32 -A -// -// MSVC compatibility mode does some nasty things: -// TODO: look up if this doesn't apply to the whole 12xx range -// -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -# define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -# define BOOST_NO_VOID_RETURNS -#endif - -#define BOOST_COMPILER "CodeGear C++ version " BOOST_STRINGIZE(__CODEGEARC__) - diff --git a/src/vendor/stp/src/boost/config/compiler/comeau.hpp b/src/vendor/stp/src/boost/config/compiler/comeau.hpp deleted file mode 100644 index 278222dcf..000000000 --- a/src/vendor/stp/src/boost/config/compiler/comeau.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Douglas Gregor 2001. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright Aleksey Gurtovoy 2003. -// (C) Copyright Beman Dawes 2003. -// (C) Copyright Jens Maurer 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Comeau C++ compiler setup: - -#include "boost/config/compiler/common_edg.hpp" - -#if (__COMO_VERSION__ <= 4245) - -# if defined(_MSC_VER) && _MSC_VER <= 1300 -# if _MSC_VER > 100 - // only set this in non-strict mode: -# define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -# endif -# endif - -// Void returns don't work when emulating VC 6 (Peter Dimov) -// TODO: look up if this doesn't apply to the whole 12xx range -# if defined(_MSC_VER) && (_MSC_VER < 1300) -# define BOOST_NO_VOID_RETURNS -# endif - -#endif // version 4245 - -// -// enable __int64 support in VC emulation mode -// -# if defined(_MSC_VER) && (_MSC_VER >= 1200) -# define BOOST_HAS_MS_INT64 -# endif - -#define BOOST_COMPILER "Comeau compiler version " BOOST_STRINGIZE(__COMO_VERSION__) - -// -// versions check: -// we don't know Comeau prior to version 4245: -#if __COMO_VERSION__ < 4245 -# error "Compiler not configured - please reconfigure" -#endif -// -// last known and checked version is 4245: -#if (__COMO_VERSION__ > 4245) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif - - - - diff --git a/src/vendor/stp/src/boost/config/compiler/common_edg.hpp b/src/vendor/stp/src/boost/config/compiler/common_edg.hpp deleted file mode 100644 index 9dc4cef8e..000000000 --- a/src/vendor/stp/src/boost/config/compiler/common_edg.hpp +++ /dev/null @@ -1,97 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2002. -// (C) Copyright Jens Maurer 2001. -// (C) Copyright David Abrahams 2002. -// (C) Copyright Aleksey Gurtovoy 2002. -// (C) Copyright Markus Schoepflin 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// -// Options common to all edg based compilers. -// -// This is included from within the individual compiler mini-configs. - -#ifndef __EDG_VERSION__ -# error This file requires that __EDG_VERSION__ be defined. -#endif - -#if (__EDG_VERSION__ <= 238) -# define BOOST_NO_INTEGRAL_INT64_T -# define BOOST_NO_SFINAE -#endif - -#if (__EDG_VERSION__ <= 240) -# define BOOST_NO_VOID_RETURNS -#endif - -#if (__EDG_VERSION__ <= 241) && !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) -# define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -#endif - -#if (__EDG_VERSION__ <= 244) && !defined(BOOST_NO_TEMPLATE_TEMPLATES) -# define BOOST_NO_TEMPLATE_TEMPLATES -#endif - -#if (__EDG_VERSION__ < 300) && !defined(BOOST_NO_IS_ABSTRACT) -# define BOOST_NO_IS_ABSTRACT -#endif - -#if (__EDG_VERSION__ <= 303) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) -# define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#endif - -// See also kai.hpp which checks a Kai-specific symbol for EH -# if !defined(__KCC) && !defined(__EXCEPTIONS) -# define BOOST_NO_EXCEPTIONS -# endif - -# if !defined(__NO_LONG_LONG) -# define BOOST_HAS_LONG_LONG -# else -# define BOOST_NO_LONG_LONG -# endif - -// -// C++0x features -// -// See above for BOOST_NO_LONG_LONG -// -#if (__EDG_VERSION__ <= 310) || !defined(BOOST_STRICT_CONFIG) -// No support for initializer lists -# define BOOST_NO_INITIALIZER_LISTS -#endif - -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -#ifdef c_plusplus -// EDG has "long long" in non-strict mode -// However, some libraries have insufficient "long long" support -// #define BOOST_HAS_LONG_LONG -#endif - - - diff --git a/src/vendor/stp/src/boost/config/compiler/compaq_cxx.hpp b/src/vendor/stp/src/boost/config/compiler/compaq_cxx.hpp deleted file mode 100644 index b44486c67..000000000 --- a/src/vendor/stp/src/boost/config/compiler/compaq_cxx.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Tru64 C++ compiler setup (now HP): - -#define BOOST_COMPILER "HP Tru64 C++ " BOOST_STRINGIZE(__DECCXX_VER) - -#include "boost/config/compiler/common_edg.hpp" - -// -// versions check: -// Nothing to do here? - - - diff --git a/src/vendor/stp/src/boost/config/compiler/digitalmars.hpp b/src/vendor/stp/src/boost/config/compiler/digitalmars.hpp deleted file mode 100644 index a01b4c28e..000000000 --- a/src/vendor/stp/src/boost/config/compiler/digitalmars.hpp +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (C) Christof Meerwald 2003 -// Copyright (C) Dan Watkins 2003 -// -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Digital Mars C++ compiler setup: -#define BOOST_COMPILER __DMC_VERSION_STRING__ - -#define BOOST_HAS_LONG_LONG -#define BOOST_HAS_PRAGMA_ONCE - -#if (__DMC__ <= 0x833) -#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#define BOOST_NO_TEMPLATE_TEMPLATES -#define BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING -#define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -#define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -#endif -#if (__DMC__ <= 0x840) || !defined(BOOST_STRICT_CONFIG) -#define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -#define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -#define BOOST_NO_OPERATORS_IN_NAMESPACE -#define BOOST_NO_UNREACHABLE_RETURN_DETECTION -#define BOOST_NO_SFINAE -#define BOOST_NO_USING_TEMPLATE -#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#endif - -// -// has macros: -#if (__DMC__ >= 0x840) -#define BOOST_HAS_DIRENT_H -#define BOOST_HAS_STDINT_H -#define BOOST_HAS_WINTHREADS -#endif - -#if (__DMC__ >= 0x847) -#define BOOST_HAS_EXPM1 -#define BOOST_HAS_LOG1P -#endif - -// -// Is this really the best way to detect whether the std lib is in namespace std? -// -#include -#if !defined(__STL_IMPORT_VENDOR_CSTD) && !defined(_STLP_IMPORT_VENDOR_CSTD) -# define BOOST_NO_STDC_NAMESPACE -#endif - - -// check for exception handling support: -#ifndef _CPPUNWIND -# define BOOST_NO_EXCEPTIONS -#endif - -// -// C++0x features -// -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -#if __DMC__ < 0x800 -#error "Compiler not supported or configured - please reconfigure" -#endif -// -// last known and checked version is ...: -#if (__DMC__ > 0x848) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif diff --git a/src/vendor/stp/src/boost/config/compiler/gcc.hpp b/src/vendor/stp/src/boost/config/compiler/gcc.hpp deleted file mode 100644 index fe2c52ea2..000000000 --- a/src/vendor/stp/src/boost/config/compiler/gcc.hpp +++ /dev/null @@ -1,204 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Darin Adler 2001 - 2002. -// (C) Copyright Jens Maurer 2001 - 2002. -// (C) Copyright Beman Dawes 2001 - 2003. -// (C) Copyright Douglas Gregor 2002. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Synge Todo 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// GNU C++ compiler setup: - -#if __GNUC__ < 3 -# if __GNUC_MINOR__ == 91 - // egcs 1.1 won't parse shared_ptr.hpp without this: -# define BOOST_NO_AUTO_PTR -# endif -# if __GNUC_MINOR__ < 95 - // - // Prior to gcc 2.95 member templates only partly - // work - define BOOST_MSVC6_MEMBER_TEMPLATES - // instead since inline member templates mostly work. - // -# define BOOST_NO_MEMBER_TEMPLATES -# if __GNUC_MINOR__ >= 9 -# define BOOST_MSVC6_MEMBER_TEMPLATES -# endif -# endif - -# if __GNUC_MINOR__ < 96 -# define BOOST_NO_SFINAE -# endif - -# if __GNUC_MINOR__ <= 97 -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# define BOOST_NO_OPERATORS_IN_NAMESPACE -# endif - -# define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -# define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -# define BOOST_NO_IS_ABSTRACT -#elif __GNUC__ == 3 -# if defined (__PATHSCALE__) -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -# define BOOST_NO_IS_ABSTRACT -# endif - // - // gcc-3.x problems: - // - // Bug specific to gcc 3.1 and 3.2: - // -# if ((__GNUC_MINOR__ == 1) || (__GNUC_MINOR__ == 2)) -# define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -# endif -# if __GNUC_MINOR__ < 4 -# define BOOST_NO_IS_ABSTRACT -# endif -#endif -#if __GNUC__ < 4 -// -// All problems to gcc-3.x and earlier here: -// -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP -# ifdef __OPEN64__ -# define BOOST_NO_IS_ABSTRACT -# endif -#endif - -#ifndef __EXCEPTIONS -# define BOOST_NO_EXCEPTIONS -#endif - - -// -// Threading support: Turn this on unconditionally here (except for -// those platforms where we can know for sure). It will get turned off again -// later if no threading API is detected. -// -#if !defined(__MINGW32__) && !defined(linux) && !defined(__linux) && !defined(__linux__) -# define BOOST_HAS_THREADS -#endif - -// -// gcc has "long long" -// -#define BOOST_HAS_LONG_LONG - -// -// gcc implements the named return value optimization since version 3.1 -// -#if __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) -#define BOOST_HAS_NRVO -#endif -// -// RTTI and typeinfo detection is possible post gcc-4.3: -// -#if __GNUC__ * 100 + __GNUC_MINOR__ >= 403 -# ifndef __GXX_RTTI -# define BOOST_NO_TYPEID -# define BOOST_NO_RTTI -# endif -#endif - -// C++0x features not implemented in any GCC version -// -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_NULLPTR -#define BOOST_NO_TEMPLATE_ALIASES - -// C++0x features in 4.3.n and later -// -#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__) -// C++0x features are only enabled when -std=c++0x or -std=gnu++0x are -// passed on the command line, which in turn defines -// __GXX_EXPERIMENTAL_CXX0X__. -# define BOOST_HAS_DECLTYPE -# define BOOST_HAS_RVALUE_REFS -# define BOOST_HAS_STATIC_ASSERT -# define BOOST_HAS_VARIADIC_TMPL -#else -# define BOOST_NO_DECLTYPE -# define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -# define BOOST_NO_RVALUE_REFERENCES -# define BOOST_NO_STATIC_ASSERT - -// Variadic templates compiler: -// http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html -# ifdef __VARIADIC_TEMPLATES -# define BOOST_HAS_VARIADIC_TMPL -# else -# define BOOST_NO_VARIADIC_TEMPLATES -# endif -#endif - -// C++0x features in 4.4.n and later -// -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) || !defined(__GXX_EXPERIMENTAL_CXX0X__) -# define BOOST_NO_AUTO_DECLARATIONS -# define BOOST_NO_AUTO_MULTIDECLARATIONS -# define BOOST_NO_CHAR16_T -# define BOOST_NO_CHAR32_T -# define BOOST_NO_DEFAULTED_FUNCTIONS -# define BOOST_NO_DELETED_FUNCTIONS -# define BOOST_NO_INITIALIZER_LISTS -# define BOOST_NO_SCOPED_ENUMS -#endif - -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) -# define BOOST_NO_SFINAE_EXPR -#endif - -// C++0x features in 4.4.1 and later -// -#if (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ < 40401) || !defined(__GXX_EXPERIMENTAL_CXX0X__) -// scoped enums have a serious bug in 4.4.0, so define BOOST_NO_SCOPED_ENUMS before 4.4.1 -// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064 -# define BOOST_NO_SCOPED_ENUMS -#endif - -// C++0x features in 4.5.n and later -// -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__) -# define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -# define BOOST_NO_LAMBDAS -# define BOOST_NO_RAW_LITERALS -# define BOOST_NO_UNICODE_LITERALS -#endif - -// ConceptGCC compiler: -// http://www.generic-programming.org/software/ConceptGCC/ -#ifdef __GXX_CONCEPTS__ -# define BOOST_HAS_CONCEPTS -# define BOOST_COMPILER "ConceptGCC version " __VERSION__ -#else -# define BOOST_NO_CONCEPTS -#endif - -#ifndef BOOST_COMPILER -# define BOOST_COMPILER "GNU C++ version " __VERSION__ -#endif - -// -// versions check: -// we don't know gcc prior to version 2.90: -#if (__GNUC__ == 2) && (__GNUC_MINOR__ < 90) -# error "Compiler not configured - please reconfigure" -#endif -// -// last known and checked version is 4.4 (Pre-release): -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 4)) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# else -// we don't emit warnings here anymore since there are no defect macros defined for -// gcc post 3.4, so any failures are gcc regressions... -//# warning "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif - - diff --git a/src/vendor/stp/src/boost/config/compiler/gcc_xml.hpp b/src/vendor/stp/src/boost/config/compiler/gcc_xml.hpp deleted file mode 100644 index 5dd67c760..000000000 --- a/src/vendor/stp/src/boost/config/compiler/gcc_xml.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// (C) Copyright John Maddock 2006. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// GCC-XML C++ compiler setup: - -# if !defined(__GCCXML_GNUC__) || ((__GCCXML_GNUC__ <= 3) && (__GCCXML_GNUC_MINOR__ <= 3)) -# define BOOST_NO_IS_ABSTRACT -# endif - -// -// Threading support: Turn this on unconditionally here (except for -// those platforms where we can know for sure). It will get turned off again -// later if no threading API is detected. -// -#if !defined(__MINGW32__) && !defined(_MSC_VER) && !defined(linux) && !defined(__linux) && !defined(__linux__) -# define BOOST_HAS_THREADS -#endif - -// -// gcc has "long long" -// -#define BOOST_HAS_LONG_LONG - -#define BOOST_COMPILER "GCC-XML C++ version " __GCCXML__ - - diff --git a/src/vendor/stp/src/boost/config/compiler/greenhills.hpp b/src/vendor/stp/src/boost/config/compiler/greenhills.hpp deleted file mode 100644 index 038b6b2b5..000000000 --- a/src/vendor/stp/src/boost/config/compiler/greenhills.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Greenhills C++ compiler setup: - -#define BOOST_COMPILER "Greenhills C++ version " BOOST_STRINGIZE(__ghs) - -#include "boost/config/compiler/common_edg.hpp" - -// -// versions check: -// we don't support Greenhills prior to version 0: -#if __ghs < 0 -# error "Compiler not supported or configured - please reconfigure" -#endif -// -// last known and checked version is 0: -#if (__ghs > 0) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif - - diff --git a/src/vendor/stp/src/boost/config/compiler/hp_acc.hpp b/src/vendor/stp/src/boost/config/compiler/hp_acc.hpp deleted file mode 100644 index 98e7772af..000000000 --- a/src/vendor/stp/src/boost/config/compiler/hp_acc.hpp +++ /dev/null @@ -1,127 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001 - 2003. -// (C) Copyright Aleksey Gurtovoy 2002. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Toon Knapen 2003. -// (C) Copyright Boris Gubenko 2006 - 2007. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// HP aCC C++ compiler setup: - -#if defined(__EDG__) -#include "boost/config/compiler/common_edg.hpp" -#endif - -#if (__HP_aCC <= 33100) -# define BOOST_NO_INTEGRAL_INT64_T -# define BOOST_NO_OPERATORS_IN_NAMESPACE -# if !defined(_NAMESPACE_STD) -# define BOOST_NO_STD_LOCALE -# define BOOST_NO_STRINGSTREAM -# endif -#endif - -#if (__HP_aCC <= 33300) -// member templates are sufficiently broken that we disable them for now -# define BOOST_NO_MEMBER_TEMPLATES -# define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -# define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -#endif - -#if (__HP_aCC <= 38000) -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#endif - -#if (__HP_aCC > 50000) && (__HP_aCC < 60000) -# define BOOST_NO_UNREACHABLE_RETURN_DETECTION -# define BOOST_NO_TEMPLATE_TEMPLATES -# define BOOST_NO_SWPRINTF -# define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -# define BOOST_NO_IS_ABSTRACT -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -#endif - -// optional features rather than defects: -#if (__HP_aCC >= 33900) -# define BOOST_HAS_LONG_LONG -# define BOOST_HAS_PARTIAL_STD_ALLOCATOR -#endif - -#if (__HP_aCC >= 50000 ) && (__HP_aCC <= 53800 ) || (__HP_aCC < 31300 ) -# define BOOST_NO_MEMBER_TEMPLATE_KEYWORD -#endif - -// This macro should not be defined when compiling in strict ansi -// mode, but, currently, we don't have the ability to determine -// what standard mode we are compiling with. Some future version -// of aCC6 compiler will provide predefined macros reflecting the -// compilation options, including the standard mode. -#if (__HP_aCC >= 60000) || ((__HP_aCC > 38000) && defined(__hpxstd98)) -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#endif - -#define BOOST_COMPILER "HP aCC version " BOOST_STRINGIZE(__HP_aCC) - -// -// versions check: -// we don't support HP aCC prior to version 33000: -#if __HP_aCC < 33000 -# error "Compiler not supported or configured - please reconfigure" -#endif - -// -// Extended checks for supporting aCC on PA-RISC -#if __HP_aCC > 30000 && __HP_aCC < 50000 -# if __HP_aCC < 38000 - // versions prior to version A.03.80 not supported -# error "Compiler version not supported - version A.03.80 or higher is required" -# elif !defined(__hpxstd98) - // must compile using the option +hpxstd98 with version A.03.80 and above -# error "Compiler option '+hpxstd98' is required for proper support" -# endif //PA-RISC -#endif - -// -// C++0x features -// -// See boost\config\suffix.hpp for BOOST_NO_LONG_LONG -// -#if !defined(__EDG__) - -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES -#endif - -// -// last known and checked version for HP-UX/ia64 is 61300 -// last known and checked version for PA-RISC is 38000 -#if ((__HP_aCC > 61300) || ((__HP_aCC > 38000) && defined(__hpxstd98))) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif diff --git a/src/vendor/stp/src/boost/config/compiler/intel.hpp b/src/vendor/stp/src/boost/config/compiler/intel.hpp deleted file mode 100644 index 531242e96..000000000 --- a/src/vendor/stp/src/boost/config/compiler/intel.hpp +++ /dev/null @@ -1,173 +0,0 @@ -// (C) Copyright John Maddock 2001-8. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright Jens Maurer 2001. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Aleksey Gurtovoy 2002 - 2003. -// (C) Copyright Guillaume Melquiond 2002 - 2003. -// (C) Copyright Beman Dawes 2003. -// (C) Copyright Martin Wille 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Intel compiler setup: - -#include "boost/config/compiler/common_edg.hpp" - -#if defined(__INTEL_COMPILER) -# define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER -#elif defined(__ICL) -# define BOOST_INTEL_CXX_VERSION __ICL -#elif defined(__ICC) -# define BOOST_INTEL_CXX_VERSION __ICC -#elif defined(__ECC) -# define BOOST_INTEL_CXX_VERSION __ECC -#endif - -#define BOOST_COMPILER "Intel C++ version " BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION) -#define BOOST_INTEL BOOST_INTEL_CXX_VERSION - -#if defined(_WIN32) || defined(_WIN64) -# define BOOST_INTEL_WIN BOOST_INTEL -#else -# define BOOST_INTEL_LINUX BOOST_INTEL -#endif - -#if (BOOST_INTEL_CXX_VERSION <= 500) && defined(_MSC_VER) -# define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -# define BOOST_NO_TEMPLATE_TEMPLATES -#endif - -#if (BOOST_INTEL_CXX_VERSION <= 600) - -# if defined(_MSC_VER) && (_MSC_VER <= 1300) // added check for <= VC 7 (Peter Dimov) - -// Boost libraries assume strong standard conformance unless otherwise -// indicated by a config macro. As configured by Intel, the EDG front-end -// requires certain compiler options be set to achieve that strong conformance. -// Particularly /Qoption,c,--arg_dep_lookup (reported by Kirk Klobe & Thomas Witt) -// and /Zc:wchar_t,forScope. See boost-root/tools/build/intel-win32-tools.jam for -// details as they apply to particular versions of the compiler. When the -// compiler does not predefine a macro indicating if an option has been set, -// this config file simply assumes the option has been set. -// Thus BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP will not be defined, even if -// the compiler option is not enabled. - -# define BOOST_NO_SWPRINTF -# endif - -// Void returns, 64 bit integrals don't work when emulating VC 6 (Peter Dimov) - -# if defined(_MSC_VER) && (_MSC_VER <= 1200) -# define BOOST_NO_VOID_RETURNS -# define BOOST_NO_INTEGRAL_INT64_T -# endif - -#endif - -#if (BOOST_INTEL_CXX_VERSION <= 710) && defined(_WIN32) -# define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -#endif - -// See http://aspn.activestate.com/ASPN/Mail/Message/boost/1614864 -#if BOOST_INTEL_CXX_VERSION < 600 -# define BOOST_NO_INTRINSIC_WCHAR_T -#else -// We should test the macro _WCHAR_T_DEFINED to check if the compiler -// supports wchar_t natively. *BUT* there is a problem here: the standard -// headers define this macro if they typedef wchar_t. Anyway, we're lucky -// because they define it without a value, while Intel C++ defines it -// to 1. So we can check its value to see if the macro was defined natively -// or not. -// Under UNIX, the situation is exactly the same, but the macro _WCHAR_T -// is used instead. -# if ((_WCHAR_T_DEFINED + 0) == 0) && ((_WCHAR_T + 0) == 0) -# define BOOST_NO_INTRINSIC_WCHAR_T -# endif -#endif - -#if defined(__GNUC__) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) -// -// Figure out when Intel is emulating this gcc bug -// (All Intel versions prior to 9.0.26, and versions -// later than that if they are set up to emulate gcc 3.2 -// or earlier): -// -# if ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 2)) || (BOOST_INTEL < 900) || (__INTEL_COMPILER_BUILD_DATE < 20050912) -# define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -# endif -#endif -#if (defined(__GNUC__) && (__GNUC__ < 4)) || defined(_WIN32) || (BOOST_INTEL_CXX_VERSION <= 1110) -// GCC or VC emulation: -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#endif -// -// Verify that we have actually got BOOST_NO_INTRINSIC_WCHAR_T -// set correctly, if we don't do this now, we will get errors later -// in type_traits code among other things, getting this correct -// for the Intel compiler is actually remarkably fragile and tricky: -// -#if defined(BOOST_NO_INTRINSIC_WCHAR_T) -#include -template< typename T > struct assert_no_intrinsic_wchar_t; -template<> struct assert_no_intrinsic_wchar_t { typedef void type; }; -// if you see an error here then you need to unset BOOST_NO_INTRINSIC_WCHAR_T -// where it is defined above: -typedef assert_no_intrinsic_wchar_t::type assert_no_intrinsic_wchar_t_; -#else -template< typename T > struct assert_intrinsic_wchar_t; -template<> struct assert_intrinsic_wchar_t {}; -// if you see an error here then define BOOST_NO_INTRINSIC_WCHAR_T on the command line: -template<> struct assert_intrinsic_wchar_t {}; -#endif - -#if _MSC_VER+0 >= 1000 -# if _MSC_VER >= 1200 -# define BOOST_HAS_MS_INT64 -# endif -# define BOOST_NO_SWPRINTF -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#elif defined(_WIN32) -# define BOOST_DISABLE_WIN32 -#endif - -// I checked version 6.0 build 020312Z, it implements the NRVO. -// Correct this as you find out which version of the compiler -// implemented the NRVO first. (Daniel Frey) -#if (BOOST_INTEL_CXX_VERSION >= 600) -# define BOOST_HAS_NRVO -#endif - -// -// versions check: -// we don't support Intel prior to version 5.0: -#if BOOST_INTEL_CXX_VERSION < 500 -# error "Compiler not supported or configured - please reconfigure" -#endif - -// Intel on MacOS requires -#if defined(__APPLE__) && defined(__INTEL_COMPILER) -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#endif - -// Intel on Altix Itanium -#if defined(__itanium__) && defined(__INTEL_COMPILER) -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#endif - -// -// last known and checked version: -#if (BOOST_INTEL_CXX_VERSION > 1110) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# elif defined(_MSC_VER) -// -// We don't emit this warning any more, since we have so few -// defect macros set anyway (just the one). -// -//# pragma message("Unknown compiler version - please run the configure tests and report the results") -# endif -#endif - diff --git a/src/vendor/stp/src/boost/config/compiler/kai.hpp b/src/vendor/stp/src/boost/config/compiler/kai.hpp deleted file mode 100644 index ea06f9f4d..000000000 --- a/src/vendor/stp/src/boost/config/compiler/kai.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright David Abrahams 2002. -// (C) Copyright Aleksey Gurtovoy 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Kai C++ compiler setup: - -#include "boost/config/compiler/common_edg.hpp" - -# if (__KCC_VERSION <= 4001) || !defined(BOOST_STRICT_CONFIG) - // at least on Sun, the contents of is not in namespace std -# define BOOST_NO_STDC_NAMESPACE -# endif - -// see also common_edg.hpp which needs a special check for __KCC -# if !defined(_EXCEPTIONS) -# define BOOST_NO_EXCEPTIONS -# endif - -// -// last known and checked version is 4001: -#if (__KCC_VERSION > 4001) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif - - - diff --git a/src/vendor/stp/src/boost/config/compiler/metrowerks.hpp b/src/vendor/stp/src/boost/config/compiler/metrowerks.hpp deleted file mode 100644 index aeba7f805..000000000 --- a/src/vendor/stp/src/boost/config/compiler/metrowerks.hpp +++ /dev/null @@ -1,139 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Darin Adler 2001. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright David Abrahams 2001 - 2002. -// (C) Copyright Beman Dawes 2001 - 2003. -// (C) Copyright Stefan Slapeta 2004. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Metrowerks C++ compiler setup: - -// locale support is disabled when linking with the dynamic runtime -# ifdef _MSL_NO_LOCALE -# define BOOST_NO_STD_LOCALE -# endif - -# if __MWERKS__ <= 0x2301 // 5.3 -# define BOOST_NO_FUNCTION_TEMPLATE_ORDERING -# define BOOST_NO_POINTER_TO_MEMBER_CONST -# define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -# define BOOST_NO_MEMBER_TEMPLATE_KEYWORD -# endif - -# if __MWERKS__ <= 0x2401 // 6.2 -//# define BOOST_NO_FUNCTION_TEMPLATE_ORDERING -# endif - -# if(__MWERKS__ <= 0x2407) // 7.x -# define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -# define BOOST_NO_UNREACHABLE_RETURN_DETECTION -# endif - -# if(__MWERKS__ <= 0x3003) // 8.x -# define BOOST_NO_SFINAE -# endif - -// the "|| !defined(BOOST_STRICT_CONFIG)" part should apply to the last -// tested version *only*: -# if(__MWERKS__ <= 0x3207) || !defined(BOOST_STRICT_CONFIG) // 9.6 -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# define BOOST_NO_IS_ABSTRACT -# endif - -#if !__option(wchar_type) -# define BOOST_NO_INTRINSIC_WCHAR_T -#endif - -#if !__option(exceptions) -# define BOOST_NO_EXCEPTIONS -#endif - -#if (__INTEL__ && _WIN32) || (__POWERPC__ && macintosh) -# if __MWERKS__ == 0x3000 -# define BOOST_COMPILER_VERSION 8.0 -# elif __MWERKS__ == 0x3001 -# define BOOST_COMPILER_VERSION 8.1 -# elif __MWERKS__ == 0x3002 -# define BOOST_COMPILER_VERSION 8.2 -# elif __MWERKS__ == 0x3003 -# define BOOST_COMPILER_VERSION 8.3 -# elif __MWERKS__ == 0x3200 -# define BOOST_COMPILER_VERSION 9.0 -# elif __MWERKS__ == 0x3201 -# define BOOST_COMPILER_VERSION 9.1 -# elif __MWERKS__ == 0x3202 -# define BOOST_COMPILER_VERSION 9.2 -# elif __MWERKS__ == 0x3204 -# define BOOST_COMPILER_VERSION 9.3 -# elif __MWERKS__ == 0x3205 -# define BOOST_COMPILER_VERSION 9.4 -# elif __MWERKS__ == 0x3206 -# define BOOST_COMPILER_VERSION 9.5 -# elif __MWERKS__ == 0x3207 -# define BOOST_COMPILER_VERSION 9.6 -# else -# define BOOST_COMPILER_VERSION __MWERKS__ -# endif -#else -# define BOOST_COMPILER_VERSION __MWERKS__ -#endif - -// -// C++0x features -// -// See boost\config\suffix.hpp for BOOST_NO_LONG_LONG -// -#if __MWERKS__ > 0x3206 && __option(rvalue_refs) -# define BOOST_HAS_RVALUE_REFS -#else -# define BOOST_NO_RVALUE_REFERENCES -#endif -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -#define BOOST_COMPILER "Metrowerks CodeWarrior C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION) - -// -// versions check: -// we don't support Metrowerks prior to version 5.3: -#if __MWERKS__ < 0x2301 -# error "Compiler not supported or configured - please reconfigure" -#endif -// -// last known and checked version: -#if (__MWERKS__ > 0x3205) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif - - - - - - - diff --git a/src/vendor/stp/src/boost/config/compiler/mpw.hpp b/src/vendor/stp/src/boost/config/compiler/mpw.hpp deleted file mode 100644 index 4db14ddef..000000000 --- a/src/vendor/stp/src/boost/config/compiler/mpw.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2002. -// (C) Copyright Aleksey Gurtovoy 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// MPW C++ compilers setup: - -# if defined(__SC__) -# define BOOST_COMPILER "MPW SCpp version " BOOST_STRINGIZE(__SC__) -# elif defined(__MRC__) -# define BOOST_COMPILER "MPW MrCpp version " BOOST_STRINGIZE(__MRC__) -# else -# error "Using MPW compiler configuration by mistake. Please update." -# endif - -// -// MPW 8.90: -// -#if (MPW_CPLUS <= 0x890) || !defined(BOOST_STRICT_CONFIG) -# define BOOST_NO_CV_SPECIALIZATIONS -# define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -# define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -# define BOOST_NO_INCLASS_MEMBER_INITIALIZATION -# define BOOST_NO_INTRINSIC_WCHAR_T -# define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# define BOOST_NO_USING_TEMPLATE - -# define BOOST_NO_CWCHAR -# define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS - -# define BOOST_NO_STD_ALLOCATOR /* actually a bug with const reference overloading */ - -#endif - -// -// C++0x features -// -// See boost\config\suffix.hpp for BOOST_NO_LONG_LONG -// -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -// -// versions check: -// we don't support MPW prior to version 8.9: -#if MPW_CPLUS < 0x890 -# error "Compiler not supported or configured - please reconfigure" -#endif -// -// last known and checked version is 0x890: -#if (MPW_CPLUS > 0x890) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif - - diff --git a/src/vendor/stp/src/boost/config/compiler/nvcc.hpp b/src/vendor/stp/src/boost/config/compiler/nvcc.hpp deleted file mode 100644 index 7d831af83..000000000 --- a/src/vendor/stp/src/boost/config/compiler/nvcc.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// (C) Copyright Eric Jourdanneau, Joel Falcou 2010 -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// NVIDIA CUDA C++ compiler setup - -#ifndef BOOST_COMPILER -# define BOOST_COMPILER "NVIDIA CUDA C++ Compiler" -#endif - -// NVIDIA Specific support -// BOOST_GPU_ENABLED : Flag a function or a method as being enabled on the host and device -#define BOOST_GPU_ENABLED __host__ __device__ - -// Boost support macro for NVCC -// NVCC Basically behaves like some flavor of MSVC6 + some specific quirks -#define BOOST_NO_INCLASS_MEMBER_INITIALIZATION -#define BOOST_MSVC6_MEMBER_TEMPLATES -#define BOOST_HAS_UNISTD_H -#define BOOST_HAS_STDINT_H -#define BOOST_HAS_SIGACTION -#define BOOST_HAS_SCHED_YIELD -#define BOOST_HAS_PTHREADS -#define BOOST_HAS_PTHREAD_YIELD -#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -#define BOOST_HAS_PARTIAL_STD_ALLOCATOR -#define BOOST_HAS_NRVO -#define BOOST_HAS_NL_TYPES_H -#define BOOST_HAS_NANOSLEEP -#define BOOST_HAS_LONG_LONG -#define BOOST_HAS_LOG1P -#define BOOST_HAS_GETTIMEOFDAY -#define BOOST_HAS_EXPM1 -#define BOOST_HAS_DIRENT_H -#define BOOST_HAS_CLOCK_GETTIME -#define BOOST_NO_VARIADIC_TEMPLATES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_STD_UNORDERED -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_NULLPTR -#define BOOST_NO_LAMBDAS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_MS_INT64_NUMERIC_LIMITS -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DECLTYPE -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CHAR16_T -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_0X_HDR_UNORDERED_SET -#define BOOST_NO_0X_HDR_UNORDERED_MAP -#define BOOST_NO_0X_HDR_TYPE_TRAITS -#define BOOST_NO_0X_HDR_TUPLE -#define BOOST_NO_0X_HDR_THREAD -#define BOOST_NO_0X_HDR_SYSTEM_ERROR -#define BOOST_NO_0X_HDR_REGEX -#define BOOST_NO_0X_HDR_RATIO -#define BOOST_NO_0X_HDR_RANDOM -#define BOOST_NO_0X_HDR_MUTEX -#define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -#define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -#define BOOST_NO_0X_HDR_INITIALIZER_LIST -#define BOOST_NO_0X_HDR_FUTURE -#define BOOST_NO_0X_HDR_FORWARD_LIST -#define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -#define BOOST_NO_0X_HDR_CONDITION_VARIABLE -#define BOOST_NO_0X_HDR_CONCEPTS -#define BOOST_NO_0X_HDR_CODECVT -#define BOOST_NO_0X_HDR_CHRONO -#define BOOST_NO_0X_HDR_ARRAY - diff --git a/src/vendor/stp/src/boost/config/compiler/pgi.hpp b/src/vendor/stp/src/boost/config/compiler/pgi.hpp deleted file mode 100644 index 1c7c84b70..000000000 --- a/src/vendor/stp/src/boost/config/compiler/pgi.hpp +++ /dev/null @@ -1,77 +0,0 @@ -// (C) Copyright Noel Belcourt 2007. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// PGI C++ compiler setup: - -#define BOOST_COMPILER_VERSION __PGIC__##__PGIC_MINOR__ -#define BOOST_COMPILER "PGI compiler version " BOOST_STRINGIZE(_COMPILER_VERSION) - -// -// Threading support: -// Turn this on unconditionally here, it will get turned off again later -// if no threading API is detected. -// - -// PGI 10.x doesn't seem to define __PGIC__ - -// versions earlier than 10.x do define __PGIC__ -#if __PGIC__ >= 10 - -// options requested by configure --enable-test -#define BOOST_HAS_PTHREADS -#define BOOST_HAS_NRVO -#define BOOST_HAS_LONG_LONG - -// options --enable-test wants undefined -#undef BOOST_NO_STDC_NAMESPACE -#undef BOOST_NO_EXCEPTION_STD_NAMESPACE -#undef BOOST_DEDUCED_TYPENAME - -#elif __PGIC__ >= 7 - -#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#define BOOST_NO_SWPRINTF -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_AUTO_DECLARATIONS - -#else - -# error "Pgi compiler not configured - please reconfigure" - -#endif -// -// C++0x features -// -// See boost\config\suffix.hpp for BOOST_NO_LONG_LONG -// -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -// -// version check: -// probably nothing to do here? - diff --git a/src/vendor/stp/src/boost/config/compiler/sgi_mipspro.hpp b/src/vendor/stp/src/boost/config/compiler/sgi_mipspro.hpp deleted file mode 100644 index 90688314a..000000000 --- a/src/vendor/stp/src/boost/config/compiler/sgi_mipspro.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// SGI C++ compiler setup: - -#define BOOST_COMPILER "SGI Irix compiler version " BOOST_STRINGIZE(_COMPILER_VERSION) - -#include "boost/config/compiler/common_edg.hpp" - -// -// Threading support: -// Turn this on unconditionally here, it will get turned off again later -// if no threading API is detected. -// -#define BOOST_HAS_THREADS -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP - -#undef BOOST_NO_SWPRINTF -#undef BOOST_DEDUCED_TYPENAME - -// -// version check: -// probably nothing to do here? - - diff --git a/src/vendor/stp/src/boost/config/compiler/sunpro_cc.hpp b/src/vendor/stp/src/boost/config/compiler/sunpro_cc.hpp deleted file mode 100644 index f5184887f..000000000 --- a/src/vendor/stp/src/boost/config/compiler/sunpro_cc.hpp +++ /dev/null @@ -1,130 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Jens Maurer 2001 - 2003. -// (C) Copyright Peter Dimov 2002. -// (C) Copyright Aleksey Gurtovoy 2002 - 2003. -// (C) Copyright David Abrahams 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Sun C++ compiler setup: - -# if __SUNPRO_CC <= 0x500 -# define BOOST_NO_MEMBER_TEMPLATES -# define BOOST_NO_FUNCTION_TEMPLATE_ORDERING -# endif - -# if (__SUNPRO_CC <= 0x520) - // - // Sunpro 5.2 and earler: - // - // although sunpro 5.2 supports the syntax for - // inline initialization it often gets the value - // wrong, especially where the value is computed - // from other constants (J Maddock 6th May 2001) -# define BOOST_NO_INCLASS_MEMBER_INITIALIZATION - - // Although sunpro 5.2 supports the syntax for - // partial specialization, it often seems to - // bind to the wrong specialization. Better - // to disable it until suppport becomes more stable - // (J Maddock 6th May 2001). -# define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# endif - -# if (__SUNPRO_CC <= 0x530) - // Requesting debug info (-g) with Boost.Python results - // in an internal compiler error for "static const" - // initialized in-class. - // >> Assertion: (../links/dbg_cstabs.cc, line 611) - // while processing ../test.cpp at line 0. - // (Jens Maurer according to Gottfried Ganssauge 04 Mar 2002) -# define BOOST_NO_INCLASS_MEMBER_INITIALIZATION - - // SunPro 5.3 has better support for partial specialization, - // but breaks when compiling std::less > - // (Jens Maurer 4 Nov 2001). - - // std::less specialization fixed as reported by George - // Heintzelman; partial specialization re-enabled - // (Peter Dimov 17 Jan 2002) - -//# define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - - // integral constant expressions with 64 bit numbers fail -# define BOOST_NO_INTEGRAL_INT64_T -# endif - -# if (__SUNPRO_CC < 0x570) -# define BOOST_NO_TEMPLATE_TEMPLATES - // see http://lists.boost.org/MailArchives/boost/msg47184.php - // and http://lists.boost.org/MailArchives/boost/msg47220.php -# define BOOST_NO_INCLASS_MEMBER_INITIALIZATION -# define BOOST_NO_SFINAE -# define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -# endif -# if (__SUNPRO_CC <= 0x580) -# define BOOST_NO_IS_ABSTRACT -# endif - -// -// Issues that effect all known versions: -// -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#define BOOST_NO_ADL_BARRIER - -// -// C++0x features -// - -#if(__SUNPRO_CC >= 0x590) -# define BOOST_HAS_LONG_LONG -#else -# define BOOST_NO_LONG_LONG -#endif - -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -// -// Version -// - -#define BOOST_COMPILER "Sun compiler version " BOOST_STRINGIZE(__SUNPRO_CC) - -// -// versions check: -// we don't support sunpro prior to version 4: -#if __SUNPRO_CC < 0x400 -#error "Compiler not supported or configured - please reconfigure" -#endif -// -// last known and checked version is 0x590: -#if (__SUNPRO_CC > 0x590) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif diff --git a/src/vendor/stp/src/boost/config/compiler/vacpp.hpp b/src/vendor/stp/src/boost/config/compiler/vacpp.hpp deleted file mode 100644 index 01956d3a7..000000000 --- a/src/vendor/stp/src/boost/config/compiler/vacpp.hpp +++ /dev/null @@ -1,88 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Toon Knapen 2001 - 2003. -// (C) Copyright Lie-Quan Lee 2001. -// (C) Copyright Markus Schoepflin 2002 - 2003. -// (C) Copyright Beman Dawes 2002 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Visual Age (IBM) C++ compiler setup: - -#if __IBMCPP__ <= 501 -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -#endif - -#if (__IBMCPP__ <= 502) -// Actually the compiler supports inclass member initialization but it -// requires a definition for the class member and it doesn't recognize -// it as an integral constant expression when used as a template argument. -# define BOOST_NO_INCLASS_MEMBER_INITIALIZATION -# define BOOST_NO_INTEGRAL_INT64_T -# define BOOST_NO_MEMBER_TEMPLATE_KEYWORD -#endif - -#if (__IBMCPP__ <= 600) || !defined(BOOST_STRICT_CONFIG) -# define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -# define BOOST_NO_INITIALIZER_LISTS -#endif - -// -// On AIX thread support seems to be indicated by _THREAD_SAFE: -// -#ifdef _THREAD_SAFE -# define BOOST_HAS_THREADS -#endif - -#define BOOST_COMPILER "IBM Visual Age version " BOOST_STRINGIZE(__IBMCPP__) - -// -// versions check: -// we don't support Visual age prior to version 5: -#if __IBMCPP__ < 500 -#error "Compiler not supported or configured - please reconfigure" -#endif -// -// last known and checked version is 600: -#if (__IBMCPP__ > 1010) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# endif -#endif - -// Some versions of the compiler have issues with default arguments on partial specializations -#define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS - -// -// C++0x features -// -// See boost\config\suffix.hpp for BOOST_NO_LONG_LONG -// -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DECLTYPE -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_LAMBDAS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_STATIC_ASSERT -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - - - diff --git a/src/vendor/stp/src/boost/config/compiler/visualc.hpp b/src/vendor/stp/src/boost/config/compiler/visualc.hpp deleted file mode 100644 index f8cc1096f..000000000 --- a/src/vendor/stp/src/boost/config/compiler/visualc.hpp +++ /dev/null @@ -1,258 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Darin Adler 2001 - 2002. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright Aleksey Gurtovoy 2002. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Beman Dawes 2002 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Microsoft Visual C++ compiler setup: - -#define BOOST_MSVC _MSC_VER - -#if _MSC_FULL_VER > 100000000 -# define BOOST_MSVC_FULL_VER _MSC_FULL_VER -#else -# define BOOST_MSVC_FULL_VER (_MSC_FULL_VER * 10) -#endif - -// turn off the warnings before we #include anything -#pragma warning( disable : 4503 ) // warning: decorated name length exceeded - -#if _MSC_VER < 1300 // 1200 == VC++ 6.0, 1200-1202 == eVC++4 -# pragma warning( disable : 4786 ) // ident trunc to '255' chars in debug info -# define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -# define BOOST_NO_VOID_RETURNS -# define BOOST_NO_EXCEPTION_STD_NAMESPACE - -# if BOOST_MSVC == 1202 -# define BOOST_NO_STD_TYPEINFO -# endif - - // disable min/max macro defines on vc6: - // -#endif - -#if (_MSC_VER <= 1300) // 1300 == VC++ 7.0 - -# if !defined(_MSC_EXTENSIONS) && !defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS) // VC7 bug with /Za -# define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -# endif - -# define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -# define BOOST_NO_INCLASS_MEMBER_INITIALIZATION -# define BOOST_NO_PRIVATE_IN_AGGREGATE -# define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -# define BOOST_NO_INTEGRAL_INT64_T -# define BOOST_NO_DEDUCED_TYPENAME -# define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE - -// VC++ 6/7 has member templates but they have numerous problems including -// cases of silent failure, so for safety we define: -# define BOOST_NO_MEMBER_TEMPLATES -// For VC++ experts wishing to attempt workarounds, we define: -# define BOOST_MSVC6_MEMBER_TEMPLATES - -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# define BOOST_NO_CV_VOID_SPECIALIZATIONS -# define BOOST_NO_FUNCTION_TEMPLATE_ORDERING -# define BOOST_NO_USING_TEMPLATE -# define BOOST_NO_SWPRINTF -# define BOOST_NO_TEMPLATE_TEMPLATES -# define BOOST_NO_SFINAE -# define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -# define BOOST_NO_IS_ABSTRACT -# define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -// TODO: what version is meant here? Have there really been any fixes in cl 12.01 (as e.g. shipped with eVC4)? -# if (_MSC_VER > 1200) -# define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -# endif - -#endif - -#if _MSC_VER < 1400 -// although a conforming signature for swprint exists in VC7.1 -// it appears not to actually work: -# define BOOST_NO_SWPRINTF -#endif - -#if defined(UNDER_CE) -// Windows CE does not have a conforming signature for swprintf -# define BOOST_NO_SWPRINTF -#endif - -#if _MSC_VER <= 1400 // 1400 == VC++ 8.0 -# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS -#endif - -#if _MSC_VER <= 1600 // 1600 == VC++ 10.0 -# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#endif - -#if _MSC_VER == 1500 // 1500 == VC++ 9.0 - // A bug in VC9: -# define BOOST_NO_ADL_BARRIER -#endif - -#if _MSC_VER <= 1500 || !defined(BOOST_STRICT_CONFIG) // 1500 == VC++ 9.0 -# define BOOST_NO_INITIALIZER_LISTS -#endif - -#ifndef _NATIVE_WCHAR_T_DEFINED -# define BOOST_NO_INTRINSIC_WCHAR_T -#endif - -#if defined(_WIN32_WCE) || defined(UNDER_CE) -# define BOOST_NO_THREADEX -# define BOOST_NO_GETSYSTEMTIMEASFILETIME -# define BOOST_NO_SWPRINTF -#endif - -// -// check for exception handling support: -#ifndef _CPPUNWIND -# define BOOST_NO_EXCEPTIONS -#endif - -// -// __int64 support: -// -#if (_MSC_VER >= 1200) -# define BOOST_HAS_MS_INT64 -#endif -#if (_MSC_VER >= 1310) && (defined(_MSC_EXTENSIONS) || (_MSC_VER >= 1400)) -# define BOOST_HAS_LONG_LONG -#else -# define BOOST_NO_LONG_LONG -#endif -#if (_MSC_VER >= 1400) && !defined(_DEBUG) -# define BOOST_HAS_NRVO -#endif -// -// disable Win32 API's if compiler extentions are -// turned off: -// -#if !defined(_MSC_EXTENSIONS) && !defined(BOOST_DISABLE_WIN32) -# define BOOST_DISABLE_WIN32 -#endif -#if !defined(_CPPRTTI) && !defined(BOOST_NO_RTTI) -# define BOOST_NO_RTTI -#endif - -// -// all versions support __declspec: -// -#define BOOST_HAS_DECLSPEC - -// -// C++0x features -// -// See above for BOOST_NO_LONG_LONG - -// C++ features supported by VC++ 10 (aka 2010) -// -#if _MSC_VER < 1600 -#define BOOST_NO_AUTO_DECLARATIONS -#define BOOST_NO_AUTO_MULTIDECLARATIONS -#define BOOST_NO_DECLTYPE -#define BOOST_NO_LAMBDAS -#define BOOST_NO_RVALUE_REFERENCES -#define BOOST_NO_STATIC_ASSERT -#endif // _MSC_VER < 1600 - -// C++0x features not supported by any versions -#define BOOST_NO_CHAR16_T -#define BOOST_NO_CHAR32_T -#define BOOST_NO_CONCEPTS -#define BOOST_NO_CONSTEXPR -#define BOOST_NO_DEFAULTED_FUNCTIONS -#define BOOST_NO_DELETED_FUNCTIONS -#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_EXTERN_TEMPLATE -#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_INITIALIZER_LISTS -#define BOOST_NO_NULLPTR -#define BOOST_NO_RAW_LITERALS -#define BOOST_NO_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_TEMPLATE_ALIASES -#define BOOST_NO_UNICODE_LITERALS -#define BOOST_NO_VARIADIC_TEMPLATES - -// -// prefix and suffix headers: -// -#ifndef BOOST_ABI_PREFIX -# define BOOST_ABI_PREFIX "boost/config/abi/msvc_prefix.hpp" -#endif -#ifndef BOOST_ABI_SUFFIX -# define BOOST_ABI_SUFFIX "boost/config/abi/msvc_suffix.hpp" -#endif - -// TODO: -// these things are mostly bogus. 1200 means version 12.0 of the compiler. The -// artificial versions assigned to them only refer to the versions of some IDE -// these compilers have been shipped with, and even that is not all of it. Some -// were shipped with freely downloadable SDKs, others as crosscompilers in eVC. -// IOW, you can't use these 'versions' in any sensible way. Sorry. -# if defined(UNDER_CE) -# if _MSC_VER < 1200 - // Note: these are so far off, they are not really supported -# elif _MSC_VER < 1300 // eVC++ 4 comes with 1200-1202 -# define BOOST_COMPILER_VERSION evc4.0 -# elif _MSC_VER == 1400 -# define BOOST_COMPILER_VERSION evc8 -# elif _MSC_VER == 1500 -# define BOOST_COMPILER_VERSION evc9 -# elif _MSC_VER == 1600 -# define BOOST_COMPILER_VERSION evc10 -# else -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown EVC++ compiler version - please run the configure tests and report the results" -# else -# pragma message("Unknown EVC++ compiler version - please run the configure tests and report the results") -# endif -# endif -# else -# if _MSC_VER < 1200 - // Note: these are so far off, they are not really supported -# define BOOST_COMPILER_VERSION 5.0 -# elif _MSC_VER < 1300 -# define BOOST_COMPILER_VERSION 6.0 -# elif _MSC_VER == 1300 -# define BOOST_COMPILER_VERSION 7.0 -# elif _MSC_VER == 1310 -# define BOOST_COMPILER_VERSION 7.1 -# elif _MSC_VER == 1400 -# define BOOST_COMPILER_VERSION 8.0 -# elif _MSC_VER == 1500 -# define BOOST_COMPILER_VERSION 9.0 -# elif _MSC_VER == 1600 -# define BOOST_COMPILER_VERSION 10.0 -# else -# define BOOST_COMPILER_VERSION _MSC_VER -# endif -# endif - -#define BOOST_COMPILER "Microsoft Visual C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION) - -// -// versions check: -// we don't support Visual C++ prior to version 6: -#if _MSC_VER < 1200 -#error "Compiler not supported or configured - please reconfigure" -#endif -// -// last known and checked version is 1600 (VC10, aka 2010): -#if (_MSC_VER > 1600) -# if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# else -# pragma message("Unknown compiler version - please run the configure tests and report the results") -# endif -#endif diff --git a/src/vendor/stp/src/boost/config/no_tr1/cmath.hpp b/src/vendor/stp/src/boost/config/no_tr1/cmath.hpp deleted file mode 100644 index d8268d842..000000000 --- a/src/vendor/stp/src/boost/config/no_tr1/cmath.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2008. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// The aim of this header is just to include but to do -// so in a way that does not result in recursive inclusion of -// the Boost TR1 components if boost/tr1/tr1/cmath is in the -// include search path. We have to do this to avoid circular -// dependencies: -// - -#ifndef BOOST_CONFIG_CMATH -# define BOOST_CONFIG_CMATH - -# ifndef BOOST_TR1_NO_RECURSION -# define BOOST_TR1_NO_RECURSION -# define BOOST_CONFIG_NO_CMATH_RECURSION -# endif - -# include - -# ifdef BOOST_CONFIG_NO_CMATH_RECURSION -# undef BOOST_TR1_NO_RECURSION -# undef BOOST_CONFIG_NO_CMATH_RECURSION -# endif - -#endif diff --git a/src/vendor/stp/src/boost/config/no_tr1/complex.hpp b/src/vendor/stp/src/boost/config/no_tr1/complex.hpp deleted file mode 100644 index ca200922b..000000000 --- a/src/vendor/stp/src/boost/config/no_tr1/complex.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// The aim of this header is just to include but to do -// so in a way that does not result in recursive inclusion of -// the Boost TR1 components if boost/tr1/tr1/complex is in the -// include search path. We have to do this to avoid circular -// dependencies: -// - -#ifndef BOOST_CONFIG_COMPLEX -# define BOOST_CONFIG_COMPLEX - -# ifndef BOOST_TR1_NO_RECURSION -# define BOOST_TR1_NO_RECURSION -# define BOOST_CONFIG_NO_COMPLEX_RECURSION -# endif - -# include - -# ifdef BOOST_CONFIG_NO_COMPLEX_RECURSION -# undef BOOST_TR1_NO_RECURSION -# undef BOOST_CONFIG_NO_COMPLEX_RECURSION -# endif - -#endif diff --git a/src/vendor/stp/src/boost/config/no_tr1/functional.hpp b/src/vendor/stp/src/boost/config/no_tr1/functional.hpp deleted file mode 100644 index e395efc19..000000000 --- a/src/vendor/stp/src/boost/config/no_tr1/functional.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// The aim of this header is just to include but to do -// so in a way that does not result in recursive inclusion of -// the Boost TR1 components if boost/tr1/tr1/functional is in the -// include search path. We have to do this to avoid circular -// dependencies: -// - -#ifndef BOOST_CONFIG_FUNCTIONAL -# define BOOST_CONFIG_FUNCTIONAL - -# ifndef BOOST_TR1_NO_RECURSION -# define BOOST_TR1_NO_RECURSION -# define BOOST_CONFIG_NO_FUNCTIONAL_RECURSION -# endif - -# include - -# ifdef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION -# undef BOOST_TR1_NO_RECURSION -# undef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION -# endif - -#endif diff --git a/src/vendor/stp/src/boost/config/no_tr1/memory.hpp b/src/vendor/stp/src/boost/config/no_tr1/memory.hpp deleted file mode 100644 index 2b5d20802..000000000 --- a/src/vendor/stp/src/boost/config/no_tr1/memory.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// The aim of this header is just to include but to do -// so in a way that does not result in recursive inclusion of -// the Boost TR1 components if boost/tr1/tr1/memory is in the -// include search path. We have to do this to avoid circular -// dependencies: -// - -#ifndef BOOST_CONFIG_MEMORY -# define BOOST_CONFIG_MEMORY - -# ifndef BOOST_TR1_NO_RECURSION -# define BOOST_TR1_NO_RECURSION -# define BOOST_CONFIG_NO_MEMORY_RECURSION -# endif - -# include - -# ifdef BOOST_CONFIG_NO_MEMORY_RECURSION -# undef BOOST_TR1_NO_RECURSION -# undef BOOST_CONFIG_NO_MEMORY_RECURSION -# endif - -#endif diff --git a/src/vendor/stp/src/boost/config/no_tr1/utility.hpp b/src/vendor/stp/src/boost/config/no_tr1/utility.hpp deleted file mode 100644 index dea8f115b..000000000 --- a/src/vendor/stp/src/boost/config/no_tr1/utility.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// The aim of this header is just to include but to do -// so in a way that does not result in recursive inclusion of -// the Boost TR1 components if boost/tr1/tr1/utility is in the -// include search path. We have to do this to avoid circular -// dependencies: -// - -#ifndef BOOST_CONFIG_UTILITY -# define BOOST_CONFIG_UTILITY - -# ifndef BOOST_TR1_NO_RECURSION -# define BOOST_TR1_NO_RECURSION -# define BOOST_CONFIG_NO_UTILITY_RECURSION -# endif - -# include - -# ifdef BOOST_CONFIG_NO_UTILITY_RECURSION -# undef BOOST_TR1_NO_RECURSION -# undef BOOST_CONFIG_NO_UTILITY_RECURSION -# endif - -#endif diff --git a/src/vendor/stp/src/boost/config/platform/aix.hpp b/src/vendor/stp/src/boost/config/platform/aix.hpp deleted file mode 100644 index 894ef42ce..000000000 --- a/src/vendor/stp/src/boost/config/platform/aix.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// IBM/Aix specific config options: - -#define BOOST_PLATFORM "IBM Aix" - -#define BOOST_HAS_UNISTD_H -#define BOOST_HAS_NL_TYPES_H -#define BOOST_HAS_NANOSLEEP -#define BOOST_HAS_CLOCK_GETTIME - -// This needs support in "boost/cstdint.hpp" exactly like FreeBSD. -// This platform has header named which includes all -// the things needed. -#define BOOST_HAS_STDINT_H - -// Threading API's: -#define BOOST_HAS_PTHREADS -#define BOOST_HAS_PTHREAD_DELAY_NP -#define BOOST_HAS_SCHED_YIELD -//#define BOOST_HAS_PTHREAD_YIELD - -// boilerplate code: -#include - - - - diff --git a/src/vendor/stp/src/boost/config/platform/amigaos.hpp b/src/vendor/stp/src/boost/config/platform/amigaos.hpp deleted file mode 100644 index 34bcf4128..000000000 --- a/src/vendor/stp/src/boost/config/platform/amigaos.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// (C) Copyright John Maddock 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -#define BOOST_PLATFORM "AmigaOS" - -#define BOOST_DISABLE_THREADS -#define BOOST_NO_CWCHAR -#define BOOST_NO_STD_WSTRING -#define BOOST_NO_INTRINSIC_WCHAR_T - - diff --git a/src/vendor/stp/src/boost/config/platform/beos.hpp b/src/vendor/stp/src/boost/config/platform/beos.hpp deleted file mode 100644 index 48c3d8dc5..000000000 --- a/src/vendor/stp/src/boost/config/platform/beos.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// (C) Copyright John Maddock 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// BeOS specific config options: - -#define BOOST_PLATFORM "BeOS" - -#define BOOST_NO_CWCHAR -#define BOOST_NO_CWCTYPE -#define BOOST_HAS_UNISTD_H - -#define BOOST_HAS_BETHREADS - -#ifndef BOOST_DISABLE_THREADS -# define BOOST_HAS_THREADS -#endif - -// boilerplate code: -#include - - - diff --git a/src/vendor/stp/src/boost/config/platform/bsd.hpp b/src/vendor/stp/src/boost/config/platform/bsd.hpp deleted file mode 100644 index f02b0e263..000000000 --- a/src/vendor/stp/src/boost/config/platform/bsd.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Darin Adler 2001. -// (C) Copyright Douglas Gregor 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// generic BSD config options: - -#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) -#error "This platform is not BSD" -#endif - -#ifdef __FreeBSD__ -#define BOOST_PLATFORM "FreeBSD " BOOST_STRINGIZE(__FreeBSD__) -#elif defined(__NetBSD__) -#define BOOST_PLATFORM "NetBSD " BOOST_STRINGIZE(__NetBSD__) -#elif defined(__OpenBSD__) -#define BOOST_PLATFORM "OpenBSD " BOOST_STRINGIZE(__OpenBSD__) -#elif defined(__DragonFly__) -#define BOOST_PLATFORM "DragonFly " BOOST_STRINGIZE(__DragonFly__) -#endif - -// -// is this the correct version check? -// FreeBSD has but does not -// advertise the fact in : -// -#if (defined(__FreeBSD__) && (__FreeBSD__ >= 3)) || defined(__DragonFly__) -# define BOOST_HAS_NL_TYPES_H -#endif - -// -// FreeBSD 3.x has pthreads support, but defines _POSIX_THREADS in -// and not in -// -#if (defined(__FreeBSD__) && (__FreeBSD__ <= 3))\ - || defined(__OpenBSD__) || defined(__DragonFly__) -# define BOOST_HAS_PTHREADS -#endif - -// -// No wide character support in the BSD header files: -// -#if defined(__NetBSD__) -#define __NetBSD_GCC__ (__GNUC__ * 1000000 \ - + __GNUC_MINOR__ * 1000 \ - + __GNUC_PATCHLEVEL__) -// XXX - the following is required until c++config.h -// defines _GLIBCXX_HAVE_SWPRINTF and friends -// or the preprocessor conditionals are removed -// from the cwchar header. -#define _GLIBCXX_HAVE_SWPRINTF 1 -#endif - -#if !((defined(__FreeBSD__) && (__FreeBSD__ >= 5)) \ - || (__NetBSD_GCC__ >= 2095003) || defined(__DragonFly__)) -# define BOOST_NO_CWCHAR -#endif -// -// The BSD has macros only, no functions: -// -#if !defined(__OpenBSD__) || defined(__DragonFly__) -# define BOOST_NO_CTYPE_FUNCTIONS -#endif - -// -// thread API's not auto detected: -// -#define BOOST_HAS_SCHED_YIELD -#define BOOST_HAS_NANOSLEEP -#define BOOST_HAS_GETTIMEOFDAY -#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -#define BOOST_HAS_SIGACTION - -// boilerplate code: -#define BOOST_HAS_UNISTD_H -#include - - - - - - diff --git a/src/vendor/stp/src/boost/config/platform/cygwin.hpp b/src/vendor/stp/src/boost/config/platform/cygwin.hpp deleted file mode 100644 index 41fcaa10c..000000000 --- a/src/vendor/stp/src/boost/config/platform/cygwin.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// cygwin specific config options: - -#define BOOST_PLATFORM "Cygwin" -#define BOOST_NO_CWCTYPE -#define BOOST_NO_CWCHAR -#define BOOST_NO_SWPRINTF -#define BOOST_HAS_DIRENT_H -#define BOOST_HAS_LOG1P -#define BOOST_HAS_EXPM1 - -// -// Threading API: -// See if we have POSIX threads, if we do use them, otherwise -// revert to native Win threads. -#define BOOST_HAS_UNISTD_H -#include -#if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS) -# define BOOST_HAS_PTHREADS -# define BOOST_HAS_SCHED_YIELD -# define BOOST_HAS_GETTIMEOFDAY -# define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# define BOOST_HAS_SIGACTION -#else -# if !defined(BOOST_HAS_WINTHREADS) -# define BOOST_HAS_WINTHREADS -# endif -# define BOOST_HAS_FTIME -#endif - -// -// find out if we have a stdint.h, there should be a better way to do this: -// -#include -#ifdef _STDINT_H -#define BOOST_HAS_STDINT_H -#endif - -// boilerplate code: -#include - - - - - diff --git a/src/vendor/stp/src/boost/config/platform/hpux.hpp b/src/vendor/stp/src/boost/config/platform/hpux.hpp deleted file mode 100644 index 19ce68e59..000000000 --- a/src/vendor/stp/src/boost/config/platform/hpux.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001 - 2003. -// (C) Copyright David Abrahams 2002. -// (C) Copyright Toon Knapen 2003. -// (C) Copyright Boris Gubenko 2006 - 2007. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// hpux specific config options: - -#define BOOST_PLATFORM "HP-UX" - -// In principle, HP-UX has a nice under the name -// However, it has the following problem: -// Use of UINT32_C(0) results in "0u l" for the preprocessed source -// (verifyable with gcc 2.95.3) -#if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__HP_aCC) -# define BOOST_HAS_STDINT_H -#endif - -#if !(defined(__HP_aCC) || !defined(_INCLUDE__STDC_A1_SOURCE)) -# define BOOST_NO_SWPRINTF -#endif -#if defined(__HP_aCC) && !defined(_INCLUDE__STDC_A1_SOURCE) -# define BOOST_NO_CWCTYPE -#endif - -#if defined(__GNUC__) -# if (__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ < 3)) - // GNU C on HP-UX does not support threads (checked up to gcc 3.3) -# define BOOST_DISABLE_THREADS -# elif !defined(BOOST_DISABLE_THREADS) - // threads supported from gcc-3.3 onwards: -# define BOOST_HAS_THREADS -# define BOOST_HAS_PTHREADS -# endif -#elif defined(__HP_aCC) && !defined(BOOST_DISABLE_THREADS) -# define BOOST_HAS_PTHREADS -#endif - -// boilerplate code: -#define BOOST_HAS_UNISTD_H -#include - -// the following are always available: -#ifndef BOOST_HAS_GETTIMEOFDAY -# define BOOST_HAS_GETTIMEOFDAY -#endif -#ifndef BOOST_HAS_SCHED_YIELD -# define BOOST_HAS_SCHED_YIELD -#endif -#ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -#endif -#ifndef BOOST_HAS_NL_TYPES_H -# define BOOST_HAS_NL_TYPES_H -#endif -#ifndef BOOST_HAS_NANOSLEEP -# define BOOST_HAS_NANOSLEEP -#endif -#ifndef BOOST_HAS_GETTIMEOFDAY -# define BOOST_HAS_GETTIMEOFDAY -#endif -#ifndef BOOST_HAS_DIRENT_H -# define BOOST_HAS_DIRENT_H -#endif -#ifndef BOOST_HAS_CLOCK_GETTIME -# define BOOST_HAS_CLOCK_GETTIME -#endif -#ifndef BOOST_HAS_SIGACTION -# define BOOST_HAS_SIGACTION -#endif -#ifndef BOOST_HAS_NRVO -# ifndef __parisc -# define BOOST_HAS_NRVO -# endif -#endif -#ifndef BOOST_HAS_LOG1P -# define BOOST_HAS_LOG1P -#endif -#ifndef BOOST_HAS_EXPM1 -# define BOOST_HAS_EXPM1 -#endif - diff --git a/src/vendor/stp/src/boost/config/platform/irix.hpp b/src/vendor/stp/src/boost/config/platform/irix.hpp deleted file mode 100644 index aeae49c8b..000000000 --- a/src/vendor/stp/src/boost/config/platform/irix.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - - -// See http://www.boost.org for most recent version. - -// SGI Irix specific config options: - -#define BOOST_PLATFORM "SGI Irix" - -#define BOOST_NO_SWPRINTF -// -// these are not auto detected by POSIX feature tests: -// -#define BOOST_HAS_GETTIMEOFDAY -#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE - -#ifdef __GNUC__ - // GNU C on IRIX does not support threads (checked up to gcc 3.3) -# define BOOST_DISABLE_THREADS -#endif - -// boilerplate code: -#define BOOST_HAS_UNISTD_H -#include - - - diff --git a/src/vendor/stp/src/boost/config/platform/linux.hpp b/src/vendor/stp/src/boost/config/platform/linux.hpp deleted file mode 100644 index 51ae13347..000000000 --- a/src/vendor/stp/src/boost/config/platform/linux.hpp +++ /dev/null @@ -1,98 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// linux specific config options: - -#define BOOST_PLATFORM "linux" - -// make sure we have __GLIBC_PREREQ if available at all -#include - -// -// added to glibc 2.1.1 -// We can only test for 2.1 though: -// -#if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))) - // defines int64_t unconditionally, but defines - // int64_t only if __GNUC__. Thus, assume a fully usable - // only when using GCC. -# if defined __GNUC__ -# define BOOST_HAS_STDINT_H -# endif -#endif - -#if defined(__LIBCOMO__) - // - // como on linux doesn't have std:: c functions: - // NOTE: versions of libcomo prior to beta28 have octal version numbering, - // e.g. version 25 is 21 (dec) - // -# if __LIBCOMO_VERSION__ <= 20 -# define BOOST_NO_STDC_NAMESPACE -# endif - -# if __LIBCOMO_VERSION__ <= 21 -# define BOOST_NO_SWPRINTF -# endif - -#endif - -// -// If glibc is past version 2 then we definitely have -// gettimeofday, earlier versions may or may not have it: -// -#if defined(__GLIBC__) && (__GLIBC__ >= 2) -# define BOOST_HAS_GETTIMEOFDAY -#endif - -#ifdef __USE_POSIX199309 -# define BOOST_HAS_NANOSLEEP -#endif - -#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) -// __GLIBC_PREREQ is available since 2.1.2 - - // swprintf is available since glibc 2.2.0 -# if !__GLIBC_PREREQ(2,2) || (!defined(__USE_ISOC99) && !defined(__USE_UNIX98)) -# define BOOST_NO_SWPRINTF -# endif -#else -# define BOOST_NO_SWPRINTF -#endif - -// boilerplate code: -#define BOOST_HAS_UNISTD_H -#include - -#ifndef __GNUC__ -// -// if the compiler is not gcc we still need to be able to parse -// the GNU system headers, some of which (mainly ) -// use GNU specific extensions: -// -# ifndef __extension__ -# define __extension__ -# endif -# ifndef __const__ -# define __const__ const -# endif -# ifndef __volatile__ -# define __volatile__ volatile -# endif -# ifndef __signed__ -# define __signed__ signed -# endif -# ifndef __typeof__ -# define __typeof__ typeof -# endif -# ifndef __inline__ -# define __inline__ inline -# endif -#endif - - diff --git a/src/vendor/stp/src/boost/config/platform/macos.hpp b/src/vendor/stp/src/boost/config/platform/macos.hpp deleted file mode 100644 index 2780ef99e..000000000 --- a/src/vendor/stp/src/boost/config/platform/macos.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Darin Adler 2001 - 2002. -// (C) Copyright Bill Kempf 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Mac OS specific config options: - -#define BOOST_PLATFORM "Mac OS" - -#if __MACH__ && !defined(_MSL_USING_MSL_C) - -// Using the Mac OS X system BSD-style C library. - -# ifndef BOOST_HAS_UNISTD_H -# define BOOST_HAS_UNISTD_H -# endif -// -// Begin by including our boilerplate code for POSIX -// feature detection, this is safe even when using -// the MSL as Metrowerks supply their own -// to replace the platform-native BSD one. G++ users -// should also always be able to do this on MaxOS X. -// -# include -# ifndef BOOST_HAS_STDINT_H -# define BOOST_HAS_STDINT_H -# endif - -// -// BSD runtime has pthreads, sigaction, sched_yield and gettimeofday, -// of these only pthreads are advertised in , so set the -// other options explicitly: -// -# define BOOST_HAS_SCHED_YIELD -# define BOOST_HAS_GETTIMEOFDAY -# define BOOST_HAS_SIGACTION - -# if (__GNUC__ < 3) && !defined( __APPLE_CC__) - -// GCC strange "ignore std" mode works better if you pretend everything -// is in the std namespace, for the most part. - -# define BOOST_NO_STDC_NAMESPACE -# endif - -# if (__GNUC__ == 4) - -// Both gcc and intel require these. -# define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# define BOOST_HAS_NANOSLEEP - -# endif - -#else - -// Using the MSL C library. - -// We will eventually support threads in non-Carbon builds, but we do -// not support this yet. -# if ( defined(TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON ) || ( defined(TARGET_CARBON) && TARGET_CARBON ) - -# if !defined(BOOST_HAS_PTHREADS) -# define BOOST_HAS_MPTASKS -# elif ( __dest_os == __mac_os_x ) -// We are doing a Carbon/Mach-O/MSL build which has pthreads, but only the -// gettimeofday and no posix. -# define BOOST_HAS_GETTIMEOFDAY -# endif - -// The MP task implementation of Boost Threads aims to replace MP-unsafe -// parts of the MSL, so we turn on threads unconditionally. -# define BOOST_HAS_THREADS - -// The remote call manager depends on this. -# define BOOST_BIND_ENABLE_PASCAL - -# endif - -#endif - - - diff --git a/src/vendor/stp/src/boost/config/platform/qnxnto.hpp b/src/vendor/stp/src/boost/config/platform/qnxnto.hpp deleted file mode 100644 index b1377c8d2..000000000 --- a/src/vendor/stp/src/boost/config/platform/qnxnto.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright Jim Douglas 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// QNX specific config options: - -#define BOOST_PLATFORM "QNX" - -#define BOOST_HAS_UNISTD_H -#include - -// QNX claims XOpen version 5 compatibility, but doesn't have an nl_types.h -// or log1p and expm1: -#undef BOOST_HAS_NL_TYPES_H -#undef BOOST_HAS_LOG1P -#undef BOOST_HAS_EXPM1 - -#define BOOST_HAS_PTHREADS -#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE - -#define BOOST_HAS_GETTIMEOFDAY -#define BOOST_HAS_CLOCK_GETTIME -#define BOOST_HAS_NANOSLEEP - - - - - diff --git a/src/vendor/stp/src/boost/config/platform/solaris.hpp b/src/vendor/stp/src/boost/config/platform/solaris.hpp deleted file mode 100644 index 9f9256664..000000000 --- a/src/vendor/stp/src/boost/config/platform/solaris.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// sun specific config options: - -#define BOOST_PLATFORM "Sun Solaris" - -#define BOOST_HAS_GETTIMEOFDAY - -// boilerplate code: -#define BOOST_HAS_UNISTD_H -#include - -// -// pthreads don't actually work with gcc unless _PTHREADS is defined: -// -#if defined(__GNUC__) && defined(_POSIX_THREADS) && !defined(_PTHREADS) -# undef BOOST_HAS_PTHREADS -#endif - - - - diff --git a/src/vendor/stp/src/boost/config/platform/symbian.hpp b/src/vendor/stp/src/boost/config/platform/symbian.hpp deleted file mode 100644 index ad3794312..000000000 --- a/src/vendor/stp/src/boost/config/platform/symbian.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// (C) Copyright Yuriy Krasnoschek 2009. -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// symbian specific config options: - - -#define BOOST_PLATFORM "Symbian" -#define BOOST_SYMBIAN 1 - - -#if defined(__S60_3X__) -// Open C / C++ plugin was introdused in this SDK, earlier versions don't have CRT / STL -# define BOOST_S60_3rd_EDITION_FP2_OR_LATER_SDK -// make sure we have __GLIBC_PREREQ if available at all -# include -// boilerplate code: -# define BOOST_HAS_UNISTD_H -# include -// S60 SDK defines _POSIX_VERSION as POSIX.1 -# ifndef BOOST_HAS_STDINT_H -# define BOOST_HAS_STDINT_H -# endif -# ifndef BOOST_HAS_GETTIMEOFDAY -# define BOOST_HAS_GETTIMEOFDAY -# endif -# ifndef BOOST_HAS_DIRENT_H -# define BOOST_HAS_DIRENT_H -# endif -# ifndef BOOST_HAS_SIGACTION -# define BOOST_HAS_SIGACTION -# endif -# ifndef BOOST_HAS_PTHREADS -# define BOOST_HAS_PTHREADS -# endif -# ifndef BOOST_HAS_NANOSLEEP -# define BOOST_HAS_NANOSLEEP -# endif -# ifndef BOOST_HAS_SCHED_YIELD -# define BOOST_HAS_SCHED_YIELD -# endif -# ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# endif -# ifndef BOOST_HAS_LOG1P -# define BOOST_HAS_LOG1P -# endif -# ifndef BOOST_HAS_EXPM1 -# define BOOST_HAS_EXPM1 -# endif -# ifndef BOOST_POSIX_API -# define BOOST_POSIX_API -# endif -// endianess support -# include -// Symbian SDK provides _BYTE_ORDER instead of __BYTE_ORDER -# ifndef __LITTLE_ENDIAN -# ifdef _LITTLE_ENDIAN -# define __LITTLE_ENDIAN _LITTLE_ENDIAN -# else -# define __LITTLE_ENDIAN 1234 -# endif -# endif -# ifndef __BIG_ENDIAN -# ifdef _BIG_ENDIAN -# define __BIG_ENDIAN _BIG_ENDIAN -# else -# define __BIG_ENDIAN 4321 -# endif -# endif -# ifndef __BYTE_ORDER -# define __BYTE_ORDER __LITTLE_ENDIAN // Symbian is LE -# endif -// Known limitations -# define BOOST_ASIO_DISABLE_SERIAL_PORT -# define BOOST_DATE_TIME_NO_LOCALE -# define BOOST_NO_STD_WSTRING -# define BOOST_EXCEPTION_DISABLE -# define BOOST_NO_EXCEPTIONS - -#else // TODO: More platform support e.g. UIQ -# error "Unsuppoted Symbian SDK" -#endif - -#if defined(__WINSCW__) && !defined(BOOST_DISABLE_WIN32) -# define BOOST_DISABLE_WIN32 // winscw defines WIN32 macro -#endif - - diff --git a/src/vendor/stp/src/boost/config/platform/vxworks.hpp b/src/vendor/stp/src/boost/config/platform/vxworks.hpp deleted file mode 100644 index 6ec5171e3..000000000 --- a/src/vendor/stp/src/boost/config/platform/vxworks.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright Dustin Spicuzza 2009. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// vxWorks specific config options: - -#define BOOST_PLATFORM "vxWorks" - -#define BOOST_NO_CWCHAR -#define BOOST_NO_INTRINSIC_WCHAR_T - -#if defined(__GNUC__) && defined(__STRICT_ANSI__) -#define BOOST_NO_INT64_T -#endif - -#define BOOST_HAS_UNISTD_H - -// these allow posix_features to work, since vxWorks doesn't -// define them itself -#define _POSIX_TIMERS 1 -#define _POSIX_THREADS 1 - -// vxworks doesn't work with asio serial ports -#define BOOST_ASIO_DISABLE_SERIAL_PORT - -// boilerplate code: -#include - diff --git a/src/vendor/stp/src/boost/config/platform/win32.hpp b/src/vendor/stp/src/boost/config/platform/win32.hpp deleted file mode 100644 index 9344818f8..000000000 --- a/src/vendor/stp/src/boost/config/platform/win32.hpp +++ /dev/null @@ -1,58 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Bill Kempf 2001. -// (C) Copyright Aleksey Gurtovoy 2003. -// (C) Copyright Rene Rivera 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Win32 specific config options: - -#define BOOST_PLATFORM "Win32" - -// Get the information about the MinGW runtime, i.e. __MINGW32_*VERSION. -#if defined(__MINGW32__) -# include <_mingw.h> -#endif - -#if defined(__GNUC__) && !defined(BOOST_NO_SWPRINTF) -# define BOOST_NO_SWPRINTF -#endif - -#if !defined(__GNUC__) && !defined(BOOST_HAS_DECLSPEC) -# define BOOST_HAS_DECLSPEC -#endif - -#if defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 2) || ((__MINGW32_MAJOR_VERSION == 2) && (__MINGW32_MINOR_VERSION >= 0))) -# define BOOST_HAS_STDINT_H -# define __STDC_LIMIT_MACROS -# define BOOST_HAS_DIRENT_H -# define BOOST_HAS_UNISTD_H -#endif - -// -// Win32 will normally be using native Win32 threads, -// but there is a pthread library avaliable as an option, -// we used to disable this when BOOST_DISABLE_WIN32 was -// defined but no longer - this should allow some -// files to be compiled in strict mode - while maintaining -// a consistent setting of BOOST_HAS_THREADS across -// all translation units (needed for shared_ptr etc). -// - -#ifdef _WIN32_WCE -# define BOOST_NO_ANSI_APIS -#endif - -#ifndef BOOST_HAS_PTHREADS -# define BOOST_HAS_WINTHREADS -#endif - -#ifndef BOOST_DISABLE_WIN32 -// WEK: Added -#define BOOST_HAS_FTIME -#define BOOST_WINDOWS 1 - -#endif diff --git a/src/vendor/stp/src/boost/config/posix_features.hpp b/src/vendor/stp/src/boost/config/posix_features.hpp deleted file mode 100644 index d12954797..000000000 --- a/src/vendor/stp/src/boost/config/posix_features.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - - -// See http://www.boost.org for most recent version. - -// All POSIX feature tests go in this file, -// Note that we test _POSIX_C_SOURCE and _XOPEN_SOURCE as well -// _POSIX_VERSION and _XOPEN_VERSION: on some systems POSIX API's -// may be present but none-functional unless _POSIX_C_SOURCE and -// _XOPEN_SOURCE have been defined to the right value (it's up -// to the user to do this *before* including any header, although -// in most cases the compiler will do this for you). - -# if defined(BOOST_HAS_UNISTD_H) -# include - - // XOpen has , but is this the correct version check? -# if defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 3) -# define BOOST_HAS_NL_TYPES_H -# endif - - // POSIX version 6 requires -# if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200100) -# define BOOST_HAS_STDINT_H -# endif - - // POSIX version 2 requires -# if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199009L) -# define BOOST_HAS_DIRENT_H -# endif - - // POSIX version 3 requires to have sigaction: -# if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199506L) -# define BOOST_HAS_SIGACTION -# endif - // POSIX defines _POSIX_THREADS > 0 for pthread support, - // however some platforms define _POSIX_THREADS without - // a value, hence the (_POSIX_THREADS+0 >= 0) check. - // Strictly speaking this may catch platforms with a - // non-functioning stub , but such occurrences should - // occur very rarely if at all. -# if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_MPTASKS) -# define BOOST_HAS_PTHREADS -# endif - - // BOOST_HAS_NANOSLEEP: - // This is predicated on _POSIX_TIMERS or _XOPEN_REALTIME: -# if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0)) \ - || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0)) -# define BOOST_HAS_NANOSLEEP -# endif - - // BOOST_HAS_CLOCK_GETTIME: - // This is predicated on _POSIX_TIMERS (also on _XOPEN_REALTIME - // but at least one platform - linux - defines that flag without - // defining clock_gettime): -# if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0)) -# define BOOST_HAS_CLOCK_GETTIME -# endif - - // BOOST_HAS_SCHED_YIELD: - // This is predicated on _POSIX_PRIORITY_SCHEDULING or - // on _POSIX_THREAD_PRIORITY_SCHEDULING or on _XOPEN_REALTIME. -# if defined(_POSIX_PRIORITY_SCHEDULING) && (_POSIX_PRIORITY_SCHEDULING+0 > 0)\ - || (defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING+0 > 0))\ - || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0)) -# define BOOST_HAS_SCHED_YIELD -# endif - - // BOOST_HAS_GETTIMEOFDAY: - // BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE: - // These are predicated on _XOPEN_VERSION, and appears to be first released - // in issue 4, version 2 (_XOPEN_VERSION > 500). - // Likewise for the functions log1p and expm1. -# if defined(_XOPEN_VERSION) && (_XOPEN_VERSION+0 >= 500) -# define BOOST_HAS_GETTIMEOFDAY -# if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE+0 >= 500) -# define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# endif -# ifndef BOOST_HAS_LOG1P -# define BOOST_HAS_LOG1P -# endif -# ifndef BOOST_HAS_EXPM1 -# define BOOST_HAS_EXPM1 -# endif -# endif - -# endif - - - - diff --git a/src/vendor/stp/src/boost/config/requires_threads.hpp b/src/vendor/stp/src/boost/config/requires_threads.hpp deleted file mode 100644 index cfaff2302..000000000 --- a/src/vendor/stp/src/boost/config/requires_threads.hpp +++ /dev/null @@ -1,92 +0,0 @@ -// (C) Copyright John Maddock 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - - -#ifndef BOOST_CONFIG_REQUIRES_THREADS_HPP -#define BOOST_CONFIG_REQUIRES_THREADS_HPP - -#ifndef BOOST_CONFIG_HPP -# include -#endif - -#if defined(BOOST_DISABLE_THREADS) - -// -// special case to handle versions of gcc which don't currently support threads: -// -#if defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC_MINOR__ <= 3) || !defined(BOOST_STRICT_CONFIG)) -// -// this is checked up to gcc 3.3: -// -#if defined(__sgi) || defined(__hpux) -# error "Multi-threaded programs are not supported by gcc on HPUX or Irix (last checked with gcc 3.3)" -#endif - -#endif - -# error "Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS" - -#elif !defined(BOOST_HAS_THREADS) - -# if defined __COMO__ -// Comeau C++ -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -D_MT (Windows) or -D_REENTRANT (Unix)" - -#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) -// Intel -#ifdef _WIN32 -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd" -#else -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -openmp" -#endif - -# elif defined __GNUC__ -// GNU C++: -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)" - -#elif defined __sgi -// SGI MIPSpro C++ -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -D_SGI_MP_SOURCE" - -#elif defined __DECCXX -// Compaq Tru64 Unix cxx -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread" - -#elif defined __BORLANDC__ -// Borland -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -tWM" - -#elif defined __MWERKS__ -// Metrowerks CodeWarrior -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: either -runtime sm, -runtime smd, -runtime dm, or -runtime dmd" - -#elif defined __SUNPRO_CC -// Sun Workshop Compiler C++ -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -mt" - -#elif defined __HP_aCC -// HP aCC -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: -mt" - -#elif defined(__IBMCPP__) -// IBM Visual Age -# error "Compiler threading support is not turned on. Please compile the code with the xlC_r compiler" - -#elif defined _MSC_VER -// Microsoft Visual C++ -// -// Must remain the last #elif since some other vendors (Metrowerks, for -// example) also #define _MSC_VER -# error "Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd" - -#else - -# error "Compiler threading support is not turned on. Please consult your compiler's documentation for the appropriate options to use" - -#endif // compilers - -#endif // BOOST_HAS_THREADS - -#endif // BOOST_CONFIG_REQUIRES_THREADS_HPP diff --git a/src/vendor/stp/src/boost/config/select_compiler_config.hpp b/src/vendor/stp/src/boost/config/select_compiler_config.hpp deleted file mode 100644 index 792963e2d..000000000 --- a/src/vendor/stp/src/boost/config/select_compiler_config.hpp +++ /dev/null @@ -1,124 +0,0 @@ -// Boost compiler configuration selection header file - -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Martin Wille 2003. -// (C) Copyright Guillaume Melquiond 2003. -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/ for most recent version. - - -// one identification macro for each of the -// compilers we support: - -# define BOOST_CXX_GCCXML 0 -# define BOOST_CXX_COMO 0 -# define BOOST_CXX_DMC 0 -# define BOOST_CXX_INTEL 0 -# define BOOST_CXX_GNUC 0 -# define BOOST_CXX_KCC 0 -# define BOOST_CXX_SGI 0 -# define BOOST_CXX_TRU64 0 -# define BOOST_CXX_GHS 0 -# define BOOST_CXX_BORLAND 0 -# define BOOST_CXX_CW 0 -# define BOOST_CXX_SUNPRO 0 -# define BOOST_CXX_HPACC 0 -# define BOOST_CXX_MPW 0 -# define BOOST_CXX_IBMCPP 0 -# define BOOST_CXX_MSVC 0 -# define BOOST_CXX_PGI 0 -# define BOOST_CXX_NVCC 0 - - -// locate which compiler we are using and define -// BOOST_COMPILER_CONFIG as needed: - -#if defined(__GCCXML__) -// GCC-XML emulates other compilers, it has to appear first here! -# define BOOST_COMPILER_CONFIG "boost/config/compiler/gcc_xml.hpp" - -#elif defined __CUDACC__ -// NVIDIA CUDA C++ compiler for GPU -# define BOOST_COMPILER_CONFIG "boost/config/compiler/nvcc.hpp" - -#elif defined __COMO__ -// Comeau C++ -# define BOOST_COMPILER_CONFIG "boost/config/compiler/comeau.hpp" - -#elif defined __DMC__ -// Digital Mars C++ -# define BOOST_COMPILER_CONFIG "boost/config/compiler/digitalmars.hpp" - -#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) -// Intel -# define BOOST_COMPILER_CONFIG "boost/config/compiler/intel.hpp" - -# elif defined __GNUC__ -// GNU C++: -# define BOOST_COMPILER_CONFIG "boost/config/compiler/gcc.hpp" - -#elif defined __KCC -// Kai C++ -# define BOOST_COMPILER_CONFIG "boost/config/compiler/kai.hpp" - -#elif defined __sgi -// SGI MIPSpro C++ -# define BOOST_COMPILER_CONFIG "boost/config/compiler/sgi_mipspro.hpp" - -#elif defined __DECCXX -// Compaq Tru64 Unix cxx -# define BOOST_COMPILER_CONFIG "boost/config/compiler/compaq_cxx.hpp" - -#elif defined __ghs -// Greenhills C++ -# define BOOST_COMPILER_CONFIG "boost/config/compiler/greenhills.hpp" - -#elif defined __CODEGEARC__ -// CodeGear - must be checked for before Borland -# define BOOST_COMPILER_CONFIG "boost/config/compiler/codegear.hpp" - -#elif defined __BORLANDC__ -// Borland -# define BOOST_COMPILER_CONFIG "boost/config/compiler/borland.hpp" - -#elif defined __MWERKS__ -// Metrowerks CodeWarrior -# define BOOST_COMPILER_CONFIG "boost/config/compiler/metrowerks.hpp" - -#elif defined __SUNPRO_CC -// Sun Workshop Compiler C++ -# define BOOST_COMPILER_CONFIG "boost/config/compiler/sunpro_cc.hpp" - -#elif defined __HP_aCC -// HP aCC -# define BOOST_COMPILER_CONFIG "boost/config/compiler/hp_acc.hpp" - -#elif defined(__MRC__) || defined(__SC__) -// MPW MrCpp or SCpp -# define BOOST_COMPILER_CONFIG "boost/config/compiler/mpw.hpp" - -#elif defined(__IBMCPP__) -// IBM Visual Age -# define BOOST_COMPILER_CONFIG "boost/config/compiler/vacpp.hpp" - -#elif defined(__PGI) -// Portland Group Inc. -# define BOOST_COMPILER_CONFIG "boost/config/compiler/pgi.hpp" - -#elif defined _MSC_VER -// Microsoft Visual C++ -// -// Must remain the last #elif since some other vendors (Metrowerks, for -// example) also #define _MSC_VER -# define BOOST_COMPILER_CONFIG "boost/config/compiler/visualc.hpp" - -#elif defined (BOOST_ASSERT_CONFIG) -// this must come last - generate an error if we don't -// recognise the compiler: -# error "Unknown compiler - please configure (http://www.boost.org/libs/config/config.htm#configuring) and report the results to the main boost mailing list (http://www.boost.org/more/mailing_lists.htm#main)" - -#endif diff --git a/src/vendor/stp/src/boost/config/select_platform_config.hpp b/src/vendor/stp/src/boost/config/select_platform_config.hpp deleted file mode 100644 index 8606e12ed..000000000 --- a/src/vendor/stp/src/boost/config/select_platform_config.hpp +++ /dev/null @@ -1,98 +0,0 @@ -// Boost compiler configuration selection header file - -// (C) Copyright John Maddock 2001 - 2002. -// (C) Copyright Jens Maurer 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// locate which platform we are on and define BOOST_PLATFORM_CONFIG as needed. -// Note that we define the headers to include using "header_name" not -// in order to prevent macro expansion within the header -// name (for example "linux" is a macro on linux systems). - -#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__) -// linux, also other platforms (Hurd etc) that use GLIBC, should these really have their own config headers though? -# define BOOST_PLATFORM_CONFIG "boost/config/platform/linux.hpp" - -#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) -// BSD: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/bsd.hpp" - -#elif defined(sun) || defined(__sun) -// solaris: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/solaris.hpp" - -#elif defined(__sgi) -// SGI Irix: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/irix.hpp" - -#elif defined(__hpux) -// hp unix: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/hpux.hpp" - -#elif defined(__CYGWIN__) -// cygwin is not win32: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/cygwin.hpp" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -// win32: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/win32.hpp" - -#elif defined(__BEOS__) -// BeOS -# define BOOST_PLATFORM_CONFIG "boost/config/platform/beos.hpp" - -#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) -// MacOS -# define BOOST_PLATFORM_CONFIG "boost/config/platform/macos.hpp" - -#elif defined(__IBMCPP__) || defined(_AIX) -// IBM -# define BOOST_PLATFORM_CONFIG "boost/config/platform/aix.hpp" - -#elif defined(__amigaos__) -// AmigaOS -# define BOOST_PLATFORM_CONFIG "boost/config/platform/amigaos.hpp" - -#elif defined(__QNXNTO__) -// QNX: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/qnxnto.hpp" - -#elif defined(__VXWORKS__) -// vxWorks: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/vxworks.hpp" - -#elif defined(__SYMBIAN32__) -// Symbian: -# define BOOST_PLATFORM_CONFIG "boost/config/platform/symbian.hpp" - -#else - -# if defined(unix) \ - || defined(__unix) \ - || defined(_XOPEN_SOURCE) \ - || defined(_POSIX_SOURCE) - - // generic unix platform: - -# ifndef BOOST_HAS_UNISTD_H -# define BOOST_HAS_UNISTD_H -# endif - -# include - -# endif - -# if defined (BOOST_ASSERT_CONFIG) - // this must come last - generate an error if we don't - // recognise the platform: -# error "Unknown platform - please configure and report the results to boost.org" -# endif - -#endif - - - diff --git a/src/vendor/stp/src/boost/config/select_stdlib_config.hpp b/src/vendor/stp/src/boost/config/select_stdlib_config.hpp deleted file mode 100644 index 2a1430aef..000000000 --- a/src/vendor/stp/src/boost/config/select_stdlib_config.hpp +++ /dev/null @@ -1,77 +0,0 @@ -// Boost compiler configuration selection header file - -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001 - 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - - -// See http://www.boost.org for most recent version. - -// locate which std lib we are using and define BOOST_STDLIB_CONFIG as needed: - -// First include to determine if some version of STLport is in use as the std lib -// (do not rely on this header being included since users can short-circuit this header -// if they know whose std lib they are using.) -#include - -#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) -// STLPort library; this _must_ come first, otherwise since -// STLport typically sits on top of some other library, we -// can end up detecting that first rather than STLport: -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/stlport.hpp" - -#else - -// If our std lib was not some version of STLport, then include as it is about -// the smallest of the std lib headers that includes real C++ stuff. (Some std libs do not -// include their C++-related macros in so this additional include makes sure -// we get those definitions) -// (again do not rely on this header being included since users can short-circuit this -// header if they know whose std lib they are using.) -#include - -#if defined(__LIBCOMO__) -// Comeau STL: -#define BOOST_STDLIB_CONFIG "boost/config/stdlib/libcomo.hpp" - -#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER) -// Rogue Wave library: -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/roguewave.hpp" - -#elif defined(__GLIBCPP__) || defined(__GLIBCXX__) -// GNU libstdc++ 3 -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/libstdcpp3.hpp" - -#elif defined(__STL_CONFIG_H) -// generic SGI STL -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/sgi.hpp" - -#elif defined(__MSL_CPP__) -// MSL standard lib: -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/msl.hpp" - -#elif defined(__IBMCPP__) -// take the default VACPP std lib -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/vacpp.hpp" - -#elif defined(MSIPL_COMPILE_H) -// Modena C++ standard library -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/modena.hpp" - -#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER) -// Dinkumware Library (this has to appear after any possible replacement libraries): -# define BOOST_STDLIB_CONFIG "boost/config/stdlib/dinkumware.hpp" - -#elif defined (BOOST_ASSERT_CONFIG) -// this must come last - generate an error if we don't -// recognise the library: -# error "Unknown standard library - please configure and report the results to boost.org" - -#endif - -#endif - - - diff --git a/src/vendor/stp/src/boost/config/stdlib/dinkumware.hpp b/src/vendor/stp/src/boost/config/stdlib/dinkumware.hpp deleted file mode 100644 index ab770599a..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/dinkumware.hpp +++ /dev/null @@ -1,138 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright David Abrahams 2002. -// (C) Copyright Guillaume Melquiond 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Dinkumware standard library config: - -#if !defined(_YVALS) && !defined(_CPPLIB_VER) -#include -#if !defined(_YVALS) && !defined(_CPPLIB_VER) -#error This is not the Dinkumware lib! -#endif -#endif - - -#if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 306) - // full dinkumware 3.06 and above - // fully conforming provided the compiler supports it: -# if !(defined(_GLOBAL_USING) && (_GLOBAL_USING+0 > 0)) && !defined(__BORLANDC__) && !defined(_STD) && !(defined(__ICC) && (__ICC >= 700)) // can be defined in yvals.h -# define BOOST_NO_STDC_NAMESPACE -# endif -# if !(defined(_HAS_MEMBER_TEMPLATES_REBIND) && (_HAS_MEMBER_TEMPLATES_REBIND+0 > 0)) && !(defined(_MSC_VER) && (_MSC_VER > 1300)) && defined(BOOST_MSVC) -# define BOOST_NO_STD_ALLOCATOR -# endif -# define BOOST_HAS_PARTIAL_STD_ALLOCATOR -# if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) - // if this lib version is set up for vc6 then there is no std::use_facet: -# define BOOST_NO_STD_USE_FACET -# define BOOST_HAS_TWO_ARG_USE_FACET - // C lib functions aren't in namespace std either: -# define BOOST_NO_STDC_NAMESPACE - // and nor is -# define BOOST_NO_EXCEPTION_STD_NAMESPACE -# endif -// There's no numeric_limits support unless _LONGLONG is defined: -# if !defined(_LONGLONG) && (_CPPLIB_VER <= 310) -# define BOOST_NO_MS_INT64_NUMERIC_LIMITS -# endif -// 3.06 appears to have (non-sgi versions of) & , -// and no at all -#else -# define BOOST_MSVC_STD_ITERATOR 1 -# define BOOST_NO_STD_ITERATOR -# define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -# define BOOST_NO_STD_ALLOCATOR -# define BOOST_NO_STDC_NAMESPACE -# define BOOST_NO_STD_USE_FACET -# define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -# define BOOST_HAS_MACRO_USE_FACET -# ifndef _CPPLIB_VER - // Updated Dinkum library defines this, and provides - // its own min and max definitions, as does MTA version. -# ifndef __MTA__ -# define BOOST_NO_STD_MIN_MAX -# endif -# define BOOST_NO_MS_INT64_NUMERIC_LIMITS -# endif -#endif - -// -// std extension namespace is stdext for vc7.1 and later, -// the same applies to other compilers that sit on top -// of vc7.1 (Intel and Comeau): -// -#if defined(_MSC_VER) && (_MSC_VER >= 1310) && !defined(__BORLANDC__) -# define BOOST_STD_EXTENSION_NAMESPACE stdext -#endif - - -#if (defined(_MSC_VER) && (_MSC_VER <= 1300) && !defined(__BORLANDC__)) || !defined(_CPPLIB_VER) || (_CPPLIB_VER < 306) - // if we're using a dinkum lib that's - // been configured for VC6/7 then there is - // no iterator traits (true even for icl) -# define BOOST_NO_STD_ITERATOR_TRAITS -#endif - -#if defined(__ICL) && (__ICL < 800) && defined(_CPPLIB_VER) && (_CPPLIB_VER <= 310) -// Intel C++ chokes over any non-trivial use of -// this may be an overly restrictive define, but regex fails without it: -# define BOOST_NO_STD_LOCALE -#endif - -// C++0x headers implemented in 520 (as shipped by Microsoft) -// -#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 520 -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET -#endif - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE - -#ifdef _CPPLIB_VER -# define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER -#else -# define BOOST_DINKUMWARE_STDLIB 1 -#endif - -#ifdef _CPPLIB_VER -# define BOOST_STDLIB "Dinkumware standard library version " BOOST_STRINGIZE(_CPPLIB_VER) -#else -# define BOOST_STDLIB "Dinkumware standard library version 1.x" -#endif - - - - - - - - - diff --git a/src/vendor/stp/src/boost/config/stdlib/libcomo.hpp b/src/vendor/stp/src/boost/config/stdlib/libcomo.hpp deleted file mode 100644 index 06731e32e..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/libcomo.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// (C) Copyright John Maddock 2002 - 2003. -// (C) Copyright Jens Maurer 2002 - 2003. -// (C) Copyright Beman Dawes 2002 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Comeau STL: - -#if !defined(__LIBCOMO__) -# include -# if !defined(__LIBCOMO__) -# error "This is not the Comeau STL!" -# endif -#endif - -// -// std::streambuf is non-standard -// NOTE: versions of libcomo prior to beta28 have octal version numbering, -// e.g. version 25 is 21 (dec) -#if __LIBCOMO_VERSION__ <= 22 -# define BOOST_NO_STD_WSTREAMBUF -#endif - -#if (__LIBCOMO_VERSION__ <= 31) && defined(_WIN32) -#define BOOST_NO_SWPRINTF -#endif - -#if __LIBCOMO_VERSION__ >= 31 -# define BOOST_HAS_HASH -# define BOOST_HAS_SLIST -#endif - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET - -// -// Intrinsic type_traits support. -// The SGI STL has it's own __type_traits class, which -// has intrinsic compiler support with SGI's compilers. -// Whatever map SGI style type traits to boost equivalents: -// -#define BOOST_HAS_SGI_TYPE_TRAITS - -#define BOOST_STDLIB "Comeau standard library " BOOST_STRINGIZE(__LIBCOMO_VERSION__) - - diff --git a/src/vendor/stp/src/boost/config/stdlib/libstdcpp3.hpp b/src/vendor/stp/src/boost/config/stdlib/libstdcpp3.hpp deleted file mode 100644 index 6a57319ff..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/libstdcpp3.hpp +++ /dev/null @@ -1,127 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Jens Maurer 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// config for libstdc++ v3 -// not much to go in here: - -#ifdef __GLIBCXX__ -#define BOOST_STDLIB "GNU libstdc++ version " BOOST_STRINGIZE(__GLIBCXX__) -#else -#define BOOST_STDLIB "GNU libstdc++ version " BOOST_STRINGIZE(__GLIBCPP__) -#endif - -#if !defined(_GLIBCPP_USE_WCHAR_T) && !defined(_GLIBCXX_USE_WCHAR_T) -# define BOOST_NO_CWCHAR -# define BOOST_NO_CWCTYPE -# define BOOST_NO_STD_WSTRING -# define BOOST_NO_STD_WSTREAMBUF -#endif - -#if defined(__osf__) && !defined(_REENTRANT) \ - && ( defined(_GLIBCXX_HAVE_GTHR_DEFAULT) || defined(_GLIBCPP_HAVE_GTHR_DEFAULT) ) -// GCC 3 on Tru64 forces the definition of _REENTRANT when any std lib header -// file is included, therefore for consistency we define it here as well. -# define _REENTRANT -#endif - -#ifdef __GLIBCXX__ // gcc 3.4 and greater: -# if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \ - || defined(_GLIBCXX__PTHREADS) - // - // If the std lib has thread support turned on, then turn it on in Boost - // as well. We do this because some gcc-3.4 std lib headers define _REENTANT - // while others do not... - // -# define BOOST_HAS_THREADS -# else -# define BOOST_DISABLE_THREADS -# endif -#elif defined(__GLIBCPP__) \ - && !defined(_GLIBCPP_HAVE_GTHR_DEFAULT) \ - && !defined(_GLIBCPP__PTHREADS) - // disable thread support if the std lib was built single threaded: -# define BOOST_DISABLE_THREADS -#endif - -#if (defined(linux) || defined(__linux) || defined(__linux__)) && defined(__arm__) && defined(_GLIBCPP_HAVE_GTHR_DEFAULT) -// linux on arm apparently doesn't define _REENTRANT -// so just turn on threading support whenever the std lib is thread safe: -# define BOOST_HAS_THREADS -#endif - - -#if !defined(_GLIBCPP_USE_LONG_LONG) \ - && !defined(_GLIBCXX_USE_LONG_LONG)\ - && defined(BOOST_HAS_LONG_LONG) -// May have been set by compiler/*.hpp, but "long long" without library -// support is useless. -# undef BOOST_HAS_LONG_LONG -#endif - -#if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0 -# define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx -# define BOOST_HAS_SLIST -# define BOOST_HAS_HASH -# define BOOST_SLIST_HEADER -# if !defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) -# define BOOST_HASH_SET_HEADER -# define BOOST_HASH_MAP_HEADER -# else -# define BOOST_HASH_SET_HEADER -# define BOOST_HASH_MAP_HEADER -# endif -#endif - -// stdlibc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly -// __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the stdlibc++ -// developers. He also commented: -// -// "I'm not sure how useful __GLIBCXX__ is for your purposes, for instance in -// GCC 4.2.4 it is set to 20080519 but in GCC 4.3.0 it is set to 20080305. -// Although 4.3.0 was released earlier than 4.2.4, it has better C++0x support -// than any release in the 4.2 series." -// -// Another resource for understanding stdlibc++ features is: -// http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#manual.intro.status.standard.200x - -// C++0x headers in GCC 4.3.0 and later -// -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) || !defined(__GXX_EXPERIMENTAL_CXX0X__) -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET -#endif - -// C++0x headers in GCC 4.4.0 and later -// -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) || !defined(__GXX_EXPERIMENTAL_CXX0X__) -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -#endif - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS - -// --- end --- diff --git a/src/vendor/stp/src/boost/config/stdlib/modena.hpp b/src/vendor/stp/src/boost/config/stdlib/modena.hpp deleted file mode 100644 index 7bd50cecb..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/modena.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// (C) Copyright Jens Maurer 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Modena C++ standard library (comes with KAI C++) - -#if !defined(MSIPL_COMPILE_H) -# include -# if !defined(__MSIPL_COMPILE_H) -# error "This is not the Modena C++ library!" -# endif -#endif - -#ifndef MSIPL_NL_TYPES -#define BOOST_NO_STD_MESSAGES -#endif - -#ifndef MSIPL_WCHART -#define BOOST_NO_STD_WSTRING -#endif - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET - -#define BOOST_STDLIB "Modena C++ standard library" - - - - - diff --git a/src/vendor/stp/src/boost/config/stdlib/msl.hpp b/src/vendor/stp/src/boost/config/stdlib/msl.hpp deleted file mode 100644 index 6bcd232a5..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/msl.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Darin Adler 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Metrowerks standard library: - -#ifndef __MSL_CPP__ -# include -# ifndef __MSL_CPP__ -# error This is not the MSL standard library! -# endif -#endif - -#if __MSL_CPP__ >= 0x6000 // Pro 6 -# define BOOST_HAS_HASH -# define BOOST_STD_EXTENSION_NAMESPACE Metrowerks -#endif -#define BOOST_HAS_SLIST - -#if __MSL_CPP__ < 0x6209 -# define BOOST_NO_STD_MESSAGES -#endif - -// check C lib version for -#include - -#if defined(__MSL__) && (__MSL__ >= 0x5000) -# define BOOST_HAS_STDINT_H -# if !defined(__PALMOS_TRAPS__) -# define BOOST_HAS_UNISTD_H -# endif - // boilerplate code: -# include -#endif - -#if defined(_MWMT) || _MSL_THREADSAFE -# define BOOST_HAS_THREADS -#endif - -#ifdef _MSL_NO_EXPLICIT_FUNC_TEMPLATE_ARG -# define BOOST_NO_STD_USE_FACET -# define BOOST_HAS_TWO_ARG_USE_FACET -#endif - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET - -#define BOOST_STDLIB "Metrowerks Standard Library version " BOOST_STRINGIZE(__MSL_CPP__) - - - - - - - - - diff --git a/src/vendor/stp/src/boost/config/stdlib/roguewave.hpp b/src/vendor/stp/src/boost/config/stdlib/roguewave.hpp deleted file mode 100644 index cba2f54a1..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/roguewave.hpp +++ /dev/null @@ -1,179 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001. -// (C) Copyright David Abrahams 2003. -// (C) Copyright Boris Gubenko 2007. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// Rogue Wave std lib: - -#if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER) -# include -# if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER) -# error This is not the Rogue Wave standard library -# endif -#endif -// -// figure out a consistent version number: -// -#ifndef _RWSTD_VER -# define BOOST_RWSTD_VER 0x010000 -#elif _RWSTD_VER < 0x010000 -# define BOOST_RWSTD_VER (_RWSTD_VER << 8) -#else -# define BOOST_RWSTD_VER _RWSTD_VER -#endif - -#ifndef _RWSTD_VER -# define BOOST_STDLIB "Rogue Wave standard library version (Unknown version)" -#elif _RWSTD_VER < 0x04010200 - # define BOOST_STDLIB "Rogue Wave standard library version " BOOST_STRINGIZE(_RWSTD_VER) -#else -# ifdef _RWSTD_VER_STR -# define BOOST_STDLIB "Apache STDCXX standard library version " _RWSTD_VER_STR -# else -# define BOOST_STDLIB "Apache STDCXX standard library version " BOOST_STRINGIZE(_RWSTD_VER) -# endif -#endif - -// -// Prior to version 2.2.0 the primary template for std::numeric_limits -// does not have compile time constants, even though specializations of that -// template do: -// -#if BOOST_RWSTD_VER < 0x020200 -# define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -#endif - -// Sun CC 5.5 patch 113817-07 adds long long specialization, but does not change the -// library version number (http://sunsolve6.sun.com/search/document.do?assetkey=1-21-113817): -#if BOOST_RWSTD_VER <= 0x020101 && (!defined(__SUNPRO_CC) || (__SUNPRO_CC < 0x550)) -# define BOOST_NO_LONG_LONG_NUMERIC_LIMITS -# endif - -// -// Borland version of numeric_limits lacks __int64 specialisation: -// -#ifdef __BORLANDC__ -# define BOOST_NO_MS_INT64_NUMERIC_LIMITS -#endif - -// -// No std::iterator if it can't figure out default template args: -// -#if defined(_RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || defined(RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || (BOOST_RWSTD_VER < 0x020000) -# define BOOST_NO_STD_ITERATOR -#endif - -// -// No iterator traits without partial specialization: -// -#if defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) || defined(RWSTD_NO_CLASS_PARTIAL_SPEC) -# define BOOST_NO_STD_ITERATOR_TRAITS -#endif - -// -// Prior to version 2.0, std::auto_ptr was buggy, and there were no -// new-style iostreams, and no conformant std::allocator: -// -#if (BOOST_RWSTD_VER < 0x020000) -# define BOOST_NO_AUTO_PTR -# define BOOST_NO_STRINGSTREAM -# define BOOST_NO_STD_ALLOCATOR -# define BOOST_NO_STD_LOCALE -#endif - -// -// No template iterator constructors without member template support: -// -#if defined(RWSTD_NO_MEMBER_TEMPLATES) || defined(_RWSTD_NO_MEMBER_TEMPLATES) -# define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -#endif - -// -// RW defines _RWSTD_ALLOCATOR if the allocator is conformant and in use -// (the or _HPACC_ part is a hack - the library seems to define _RWSTD_ALLOCATOR -// on HP aCC systems even though the allocator is in fact broken): -// -#if !defined(_RWSTD_ALLOCATOR) || (defined(__HP_aCC) && __HP_aCC <= 33100) -# define BOOST_NO_STD_ALLOCATOR -#endif - -// -// If we have a std::locale, we still may not have std::use_facet: -// -#if defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE) && !defined(BOOST_NO_STD_LOCALE) -# define BOOST_NO_STD_USE_FACET -# define BOOST_HAS_TWO_ARG_USE_FACET -#endif - -// -// There's no std::distance prior to version 2, or without -// partial specialization support: -// -#if (BOOST_RWSTD_VER < 0x020000) || defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) - #define BOOST_NO_STD_DISTANCE -#endif - -// -// Some versions of the rogue wave library don't have assignable -// OutputIterators: -// -#if BOOST_RWSTD_VER < 0x020100 -# define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -#endif - -// -// Disable BOOST_HAS_LONG_LONG when the library has no support for it. -// -#if !defined(_RWSTD_LONG_LONG) && defined(BOOST_HAS_LONG_LONG) -# undef BOOST_HAS_LONG_LONG -#endif - -// -// check that on HP-UX, the proper RW library is used -// -#if defined(__HP_aCC) && !defined(_HP_NAMESPACE_STD) -# error "Boost requires Standard RW library. Please compile and link with -AA" -#endif - -// -// Define macros specific to RW V2.2 on HP-UX -// -#if defined(__HP_aCC) && (BOOST_RWSTD_VER == 0x02020100) -# ifndef __HP_TC1_MAKE_PAIR -# define __HP_TC1_MAKE_PAIR -# endif -# ifndef _HP_INSTANTIATE_STD2_VL -# define _HP_INSTANTIATE_STD2_VL -# endif -#endif - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET - diff --git a/src/vendor/stp/src/boost/config/stdlib/sgi.hpp b/src/vendor/stp/src/boost/config/stdlib/sgi.hpp deleted file mode 100644 index c505008b7..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/sgi.hpp +++ /dev/null @@ -1,136 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Darin Adler 2001. -// (C) Copyright Jens Maurer 2001 - 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// generic SGI STL: - -#if !defined(__STL_CONFIG_H) -# include -# if !defined(__STL_CONFIG_H) -# error "This is not the SGI STL!" -# endif -#endif - -// -// No std::iterator traits without partial specialisation: -// -#if !defined(__STL_CLASS_PARTIAL_SPECIALIZATION) -# define BOOST_NO_STD_ITERATOR_TRAITS -#endif - -// -// No std::stringstream with gcc < 3 -// -#if defined(__GNUC__) && (__GNUC__ < 3) && \ - ((__GNUC_MINOR__ < 95) || (__GNUC_MINOR__ == 96)) && \ - !defined(__STL_USE_NEW_IOSTREAMS) || \ - defined(__APPLE_CC__) - // Note that we only set this for GNU C++ prior to 2.95 since the - // latest patches for that release do contain a minimal - // If you are running a 2.95 release prior to 2.95.3 then this will need - // setting, but there is no way to detect that automatically (other - // than by running the configure script). - // Also, the unofficial GNU C++ 2.96 included in RedHat 7.1 doesn't - // have . -# define BOOST_NO_STRINGSTREAM -#endif - -// -// Assume no std::locale without own iostreams (this may be an -// incorrect assumption in some cases): -// -#if !defined(__SGI_STL_OWN_IOSTREAMS) && !defined(__STL_USE_NEW_IOSTREAMS) -# define BOOST_NO_STD_LOCALE -#endif - -// -// Original native SGI streams have non-standard std::messages facet: -// -#if defined(__sgi) && (_COMPILER_VERSION <= 650) && !defined(__SGI_STL_OWN_IOSTREAMS) -# define BOOST_NO_STD_LOCALE -#endif - -// -// SGI's new iostreams have missing "const" in messages<>::open -// -#if defined(__sgi) && (_COMPILER_VERSION <= 740) && defined(__STL_USE_NEW_IOSTREAMS) -# define BOOST_NO_STD_MESSAGES -#endif - -// -// No template iterator constructors, or std::allocator -// without member templates: -// -#if !defined(__STL_MEMBER_TEMPLATES) -# define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -# define BOOST_NO_STD_ALLOCATOR -#endif - -// -// We always have SGI style hash_set, hash_map, and slist: -// -#define BOOST_HAS_HASH -#define BOOST_HAS_SLIST - -// -// If this is GNU libstdc++2, then no and no std::wstring: -// -#if (defined(__GNUC__) && (__GNUC__ < 3)) -# include -# if defined(__BASTRING__) -# define BOOST_NO_LIMITS -// Note: will provide compile-time constants -# undef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -# define BOOST_NO_STD_WSTRING -# endif -#endif - -// -// There is no standard iterator unless we have namespace support: -// -#if !defined(__STL_USE_NAMESPACES) -# define BOOST_NO_STD_ITERATOR -#endif - -// -// Intrinsic type_traits support. -// The SGI STL has it's own __type_traits class, which -// has intrinsic compiler support with SGI's compilers. -// Whatever map SGI style type traits to boost equivalents: -// -#define BOOST_HAS_SGI_TYPE_TRAITS - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET - -#define BOOST_STDLIB "SGI standard library" - - - diff --git a/src/vendor/stp/src/boost/config/stdlib/stlport.hpp b/src/vendor/stp/src/boost/config/stdlib/stlport.hpp deleted file mode 100644 index 3dfd529ef..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/stlport.hpp +++ /dev/null @@ -1,236 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2002. -// (C) Copyright Darin Adler 2001. -// (C) Copyright Jens Maurer 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -// STLPort standard library config: - -#if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) -# include -# if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) -# error "This is not STLPort!" -# endif -#endif - -// -// __STL_STATIC_CONST_INIT_BUG implies BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -// for versions prior to 4.1(beta) -// -#if (defined(__STL_STATIC_CONST_INIT_BUG) || defined(_STLP_STATIC_CONST_INIT_BUG)) && (__SGI_STL_PORT <= 0x400) -# define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -#endif - -// -// If STLport thinks that there is no partial specialisation, then there is no -// std::iterator traits: -// -#if !(defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) || defined(__STL_CLASS_PARTIAL_SPECIALIZATION)) -# define BOOST_NO_STD_ITERATOR_TRAITS -#endif - -// -// No new style iostreams on GCC without STLport's iostreams enabled: -// -#if (defined(__GNUC__) && (__GNUC__ < 3)) && !(defined(__SGI_STL_OWN_IOSTREAMS) || defined(_STLP_OWN_IOSTREAMS)) -# define BOOST_NO_STRINGSTREAM -#endif - -// -// No new iostreams implies no std::locale, and no std::stringstream: -// -#if defined(__STL_NO_IOSTREAMS) || defined(__STL_NO_NEW_IOSTREAMS) || defined(_STLP_NO_IOSTREAMS) || defined(_STLP_NO_NEW_IOSTREAMS) -# define BOOST_NO_STD_LOCALE -# define BOOST_NO_STRINGSTREAM -#endif - -// -// If the streams are not native, and we have a "using ::x" compiler bug -// then the io stream facets are not available in namespace std:: -// -#ifdef _STLPORT_VERSION -# if !(_STLPORT_VERSION >= 0x500) && !defined(_STLP_OWN_IOSTREAMS) && defined(_STLP_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__) -# define BOOST_NO_STD_LOCALE -# endif -#else -# if !defined(__SGI_STL_OWN_IOSTREAMS) && defined(__STL_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__) -# define BOOST_NO_STD_LOCALE -# endif -#endif - -#if defined(_STLPORT_VERSION) && ((_STLPORT_VERSION < 0x500) || (_STLPORT_VERSION >= 0x520)) -# define BOOST_NO_STD_UNORDERED -#endif - -#if defined(_STLPORT_VERSION) && (_STLPORT_VERSION >= 0x520) -# define BOOST_HAS_TR1_UNORDERED_SET -# define BOOST_HAS_TR1_UNORDERED_MAP -#endif -// -// Without member template support enabled, their are no template -// iterate constructors, and no std::allocator: -// -#if !(defined(__STL_MEMBER_TEMPLATES) || defined(_STLP_MEMBER_TEMPLATES)) -# define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -# define BOOST_NO_STD_ALLOCATOR -#endif -// -// however we always have at least a partial allocator: -// -#define BOOST_HAS_PARTIAL_STD_ALLOCATOR - -#if !defined(_STLP_MEMBER_TEMPLATE_CLASSES) || defined(_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) -# define BOOST_NO_STD_ALLOCATOR -#endif - -#if defined(_STLP_NO_MEMBER_TEMPLATE_KEYWORD) && defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) -# define BOOST_NO_STD_ALLOCATOR -#endif - -// -// If STLport thinks there is no wchar_t at all, then we have to disable -// the support for the relevant specilazations of std:: templates. -// -#if !defined(_STLP_HAS_WCHAR_T) && !defined(_STLP_WCHAR_T_IS_USHORT) -# ifndef BOOST_NO_STD_WSTRING -# define BOOST_NO_STD_WSTRING -# endif -# ifndef BOOST_NO_STD_WSTREAMBUF -# define BOOST_NO_STD_WSTREAMBUF -# endif -#endif - -// -// We always have SGI style hash_set, hash_map, and slist: -// -#ifndef _STLP_NO_EXTENSIONS -#define BOOST_HAS_HASH -#define BOOST_HAS_SLIST -#endif - -// -// STLport does a good job of importing names into namespace std::, -// but doesn't always get them all, define BOOST_NO_STDC_NAMESPACE, since our -// workaround does not conflict with STLports: -// -// -// Harold Howe says: -// Borland switched to STLport in BCB6. Defining BOOST_NO_STDC_NAMESPACE with -// BCB6 does cause problems. If we detect C++ Builder, then don't define -// BOOST_NO_STDC_NAMESPACE -// -#if !defined(__BORLANDC__) && !defined(__DMC__) -// -// If STLport is using it's own namespace, and the real names are in -// the global namespace, then we duplicate STLport's using declarations -// (by defining BOOST_NO_STDC_NAMESPACE), we do this because STLport doesn't -// necessarily import all the names we need into namespace std:: -// -# if (defined(__STL_IMPORT_VENDOR_CSTD) \ - || defined(__STL_USE_OWN_NAMESPACE) \ - || defined(_STLP_IMPORT_VENDOR_CSTD) \ - || defined(_STLP_USE_OWN_NAMESPACE)) \ - && (defined(__STL_VENDOR_GLOBAL_CSTD) || defined (_STLP_VENDOR_GLOBAL_CSTD)) -# define BOOST_NO_STDC_NAMESPACE -# define BOOST_NO_EXCEPTION_STD_NAMESPACE -# endif -#elif defined(__BORLANDC__) && __BORLANDC__ < 0x560 -// STLport doesn't import std::abs correctly: -#include -namespace std { using ::abs; } -// and strcmp/strcpy don't get imported either ('cos they are macros) -#include -#ifdef strcpy -# undef strcpy -#endif -#ifdef strcmp -# undef strcmp -#endif -#ifdef _STLP_VENDOR_CSTD -namespace std{ using _STLP_VENDOR_CSTD::strcmp; using _STLP_VENDOR_CSTD::strcpy; } -#endif -#endif - -// -// std::use_facet may be non-standard, uses a class instead: -// -#if defined(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) || defined(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS) -# define BOOST_NO_STD_USE_FACET -# define BOOST_HAS_STLP_USE_FACET -#endif - -// -// If STLport thinks there are no wide functions, etc. is not working; but -// only if BOOST_NO_STDC_NAMESPACE is not defined (if it is then we do the import -// into std:: ourselves). -// -#if defined(_STLP_NO_NATIVE_WIDE_FUNCTIONS) && !defined(BOOST_NO_STDC_NAMESPACE) -# define BOOST_NO_CWCHAR -# define BOOST_NO_CWCTYPE -#endif - -// -// If STLport for some reason was configured so that it thinks that wchar_t -// is not an intrinsic type, then we have to disable the support for it as -// well (we would be missing required specializations otherwise). -// -#if !defined( _STLP_HAS_WCHAR_T) || defined(_STLP_WCHAR_T_IS_USHORT) -# undef BOOST_NO_INTRINSIC_WCHAR_T -# define BOOST_NO_INTRINSIC_WCHAR_T -#endif - -// -// Borland ships a version of STLport with C++ Builder 6 that lacks -// hashtables and the like: -// -#if defined(__BORLANDC__) && (__BORLANDC__ == 0x560) -# undef BOOST_HAS_HASH -#endif - -// -// gcc-2.95.3/STLPort does not like the using declarations we use to get ADL with std::min/max -// -#if defined(__GNUC__) && (__GNUC__ < 3) -# include // for std::min and std::max -# define BOOST_USING_STD_MIN() ((void)0) -# define BOOST_USING_STD_MAX() ((void)0) -namespace boost { using std::min; using std::max; } -#endif - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET - -#define BOOST_STDLIB "STLPort standard library version " BOOST_STRINGIZE(__SGI_STL_PORT) - - - - - - - - diff --git a/src/vendor/stp/src/boost/config/stdlib/vacpp.hpp b/src/vendor/stp/src/boost/config/stdlib/vacpp.hpp deleted file mode 100644 index c8d6d5ad6..000000000 --- a/src/vendor/stp/src/boost/config/stdlib/vacpp.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// (C) Copyright John Maddock 2001 - 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for most recent version. - -#if __IBMCPP__ <= 501 -# define BOOST_NO_STD_ALLOCATOR -#endif - -#define BOOST_HAS_MACRO_USE_FACET -#define BOOST_NO_STD_MESSAGES - -// C++0x headers not yet implemented -// -# define BOOST_NO_0X_HDR_ARRAY -# define BOOST_NO_0X_HDR_CHRONO -# define BOOST_NO_0X_HDR_CODECVT -# define BOOST_NO_0X_HDR_CONCEPTS -# define BOOST_NO_0X_HDR_CONDITION_VARIABLE -# define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS -# define BOOST_NO_0X_HDR_FORWARD_LIST -# define BOOST_NO_0X_HDR_FUTURE -# define BOOST_NO_0X_HDR_INITIALIZER_LIST -# define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS -# define BOOST_NO_0X_HDR_MEMORY_CONCEPTS -# define BOOST_NO_0X_HDR_MUTEX -# define BOOST_NO_0X_HDR_RANDOM -# define BOOST_NO_0X_HDR_RATIO -# define BOOST_NO_0X_HDR_REGEX -# define BOOST_NO_0X_HDR_SYSTEM_ERROR -# define BOOST_NO_0X_HDR_THREAD -# define BOOST_NO_0X_HDR_TUPLE -# define BOOST_NO_0X_HDR_TYPE_TRAITS -# define BOOST_NO_STD_UNORDERED // deprecated; see following -# define BOOST_NO_0X_HDR_UNORDERED_MAP -# define BOOST_NO_0X_HDR_UNORDERED_SET - -#define BOOST_STDLIB "Visual Age default standard library" - - - diff --git a/src/vendor/stp/src/boost/config/suffix.hpp b/src/vendor/stp/src/boost/config/suffix.hpp deleted file mode 100644 index 9e4d0788c..000000000 --- a/src/vendor/stp/src/boost/config/suffix.hpp +++ /dev/null @@ -1,606 +0,0 @@ -// Boost config.hpp configuration header file ------------------------------// - -// Copyright (c) 2001-2003 John Maddock -// Copyright (c) 2001 Darin Adler -// Copyright (c) 2001 Peter Dimov -// Copyright (c) 2002 Bill Kempf -// Copyright (c) 2002 Jens Maurer -// Copyright (c) 2002-2003 David Abrahams -// Copyright (c) 2003 Gennaro Prota -// Copyright (c) 2003 Eric Friedman -// Copyright (c) 2010 Eric Jourdanneau, Joel Falcou -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/ for most recent version. - -// Boost config.hpp policy and rationale documentation has been moved to -// http://www.boost.org/libs/config/ -// -// This file is intended to be stable, and relatively unchanging. -// It should contain boilerplate code only - no compiler specific -// code unless it is unavoidable - no changes unless unavoidable. - -#ifndef BOOST_CONFIG_SUFFIX_HPP -#define BOOST_CONFIG_SUFFIX_HPP - -// -// look for long long by looking for the appropriate macros in . -// Note that we use limits.h rather than climits for maximal portability, -// remember that since these just declare a bunch of macros, there should be -// no namespace issues from this. -// -#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG) \ - && !defined(BOOST_MSVC) && !defined(__BORLANDC__) -# include -# if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX)) -# define BOOST_HAS_LONG_LONG -# else -# define BOOST_NO_LONG_LONG -# endif -#endif - -// GCC 3.x will clean up all of those nasty macro definitions that -// BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine -// it under GCC 3.x. -#if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS) -# undef BOOST_NO_CTYPE_FUNCTIONS -#endif - -// -// Assume any extensions are in namespace std:: unless stated otherwise: -// -# ifndef BOOST_STD_EXTENSION_NAMESPACE -# define BOOST_STD_EXTENSION_NAMESPACE std -# endif - -// -// If cv-qualified specializations are not allowed, then neither are cv-void ones: -// -# if defined(BOOST_NO_CV_SPECIALIZATIONS) \ - && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS) -# define BOOST_NO_CV_VOID_SPECIALIZATIONS -# endif - -// -// If there is no numeric_limits template, then it can't have any compile time -// constants either! -// -# if defined(BOOST_NO_LIMITS) \ - && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) -# define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -# define BOOST_NO_MS_INT64_NUMERIC_LIMITS -# define BOOST_NO_LONG_LONG_NUMERIC_LIMITS -# endif - -// -// if there is no long long then there is no specialisation -// for numeric_limits either: -// -#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS) -# define BOOST_NO_LONG_LONG_NUMERIC_LIMITS -#endif - -// -// if there is no __int64 then there is no specialisation -// for numeric_limits<__int64> either: -// -#if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS) -# define BOOST_NO_MS_INT64_NUMERIC_LIMITS -#endif - -// -// if member templates are supported then so is the -// VC6 subset of member templates: -// -# if !defined(BOOST_NO_MEMBER_TEMPLATES) \ - && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) -# define BOOST_MSVC6_MEMBER_TEMPLATES -# endif - -// -// Without partial specialization, can't test for partial specialisation bugs: -// -# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) -# define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -# endif - -// -// Without partial specialization, we can't have array-type partial specialisations: -// -# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -# define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -# endif - -// -// Without partial specialization, std::iterator_traits can't work: -// -# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && !defined(BOOST_NO_STD_ITERATOR_TRAITS) -# define BOOST_NO_STD_ITERATOR_TRAITS -# endif - -// -// Without partial specialization, partial -// specialization with default args won't work either: -// -# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && !defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) -# define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -# endif - -// -// Without member template support, we can't have template constructors -// in the standard library either: -// -# if defined(BOOST_NO_MEMBER_TEMPLATES) \ - && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ - && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) -# define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -# endif - -// -// Without member template support, we can't have a conforming -// std::allocator template either: -// -# if defined(BOOST_NO_MEMBER_TEMPLATES) \ - && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ - && !defined(BOOST_NO_STD_ALLOCATOR) -# define BOOST_NO_STD_ALLOCATOR -# endif - -// -// without ADL support then using declarations will break ADL as well: -// -#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) -# define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#endif - -// -// Without typeid support we have no dynamic RTTI either: -// -#if defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI) -# define BOOST_NO_RTTI -#endif - -// -// If we have a standard allocator, then we have a partial one as well: -// -#if !defined(BOOST_NO_STD_ALLOCATOR) -# define BOOST_HAS_PARTIAL_STD_ALLOCATOR -#endif - -// -// We can't have a working std::use_facet if there is no std::locale: -// -# if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET) -# define BOOST_NO_STD_USE_FACET -# endif - -// -// We can't have a std::messages facet if there is no std::locale: -// -# if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES) -# define BOOST_NO_STD_MESSAGES -# endif - -// -// We can't have a working std::wstreambuf if there is no std::locale: -// -# if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF) -# define BOOST_NO_STD_WSTREAMBUF -# endif - -// -// We can't have a if there is no : -// -# if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE) -# define BOOST_NO_CWCTYPE -# endif - -// -// We can't have a swprintf if there is no : -// -# if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF) -# define BOOST_NO_SWPRINTF -# endif - -// -// If Win32 support is turned off, then we must turn off -// threading support also, unless there is some other -// thread API enabled: -// -#if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \ - && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS) -# define BOOST_DISABLE_THREADS -#endif - -// -// Turn on threading support if the compiler thinks that it's in -// multithreaded mode. We put this here because there are only a -// limited number of macros that identify this (if there's any missing -// from here then add to the appropriate compiler section): -// -#if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \ - || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \ - && !defined(BOOST_HAS_THREADS) -# define BOOST_HAS_THREADS -#endif - -// -// Turn threading support off if BOOST_DISABLE_THREADS is defined: -// -#if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS) -# undef BOOST_HAS_THREADS -#endif - -// -// Turn threading support off if we don't recognise the threading API: -// -#if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\ - && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\ - && !defined(BOOST_HAS_MPTASKS) -# undef BOOST_HAS_THREADS -#endif - -// -// Turn threading detail macros off if we don't (want to) use threading -// -#ifndef BOOST_HAS_THREADS -# undef BOOST_HAS_PTHREADS -# undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# undef BOOST_HAS_PTHREAD_YIELD -# undef BOOST_HAS_PTHREAD_DELAY_NP -# undef BOOST_HAS_WINTHREADS -# undef BOOST_HAS_BETHREADS -# undef BOOST_HAS_MPTASKS -#endif - -// -// If the compiler claims to be C99 conformant, then it had better -// have a : -// -# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) -# define BOOST_HAS_STDINT_H -# ifndef BOOST_HAS_LOG1P -# define BOOST_HAS_LOG1P -# endif -# ifndef BOOST_HAS_EXPM1 -# define BOOST_HAS_EXPM1 -# endif -# endif - -// -// Define BOOST_NO_SLIST and BOOST_NO_HASH if required. -// Note that this is for backwards compatibility only. -// -# if !defined(BOOST_HAS_SLIST) && !defined(BOOST_NO_SLIST) -# define BOOST_NO_SLIST -# endif - -# if !defined(BOOST_HAS_HASH) && !defined(BOOST_NO_HASH) -# define BOOST_NO_HASH -# endif - -// -// Set BOOST_SLIST_HEADER if not set already: -// -#if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER) -# define BOOST_SLIST_HEADER -#endif - -// -// Set BOOST_HASH_SET_HEADER if not set already: -// -#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER) -# define BOOST_HASH_SET_HEADER -#endif - -// -// Set BOOST_HASH_MAP_HEADER if not set already: -// -#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER) -# define BOOST_HASH_MAP_HEADER -#endif - -// -// Set BOOST_NO_INITIALIZER_LISTS if there is no library support. -// - -#if defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS) -# define BOOST_NO_INITIALIZER_LISTS -#endif - -// BOOST_HAS_ABI_HEADERS -// This macro gets set if we have headers that fix the ABI, -// and prevent ODR violations when linking to external libraries: -#if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS) -# define BOOST_HAS_ABI_HEADERS -#endif - -#if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS) -# undef BOOST_HAS_ABI_HEADERS -#endif - -// BOOST_NO_STDC_NAMESPACE workaround --------------------------------------// -// Because std::size_t usage is so common, even in boost headers which do not -// otherwise use the C library, the workaround is included here so -// that ugly workaround code need not appear in many other boost headers. -// NOTE WELL: This is a workaround for non-conforming compilers; -// must still be #included in the usual places so that inclusion -// works as expected with standard conforming compilers. The resulting -// double inclusion of is harmless. - -# ifdef BOOST_NO_STDC_NAMESPACE -# include - namespace std { using ::ptrdiff_t; using ::size_t; } -# endif - -// Workaround for the unfortunate min/max macros defined by some platform headers - -#define BOOST_PREVENT_MACRO_SUBSTITUTION - -#ifndef BOOST_USING_STD_MIN -# define BOOST_USING_STD_MIN() using std::min -#endif - -#ifndef BOOST_USING_STD_MAX -# define BOOST_USING_STD_MAX() using std::max -#endif - -// BOOST_NO_STD_MIN_MAX workaround -----------------------------------------// - -# ifdef BOOST_NO_STD_MIN_MAX - -namespace std { - template - inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { - return __b < __a ? __b : __a; - } - template - inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { - return __a < __b ? __b : __a; - } -} - -# endif - -// BOOST_STATIC_CONSTANT workaround --------------------------------------- // -// On compilers which don't allow in-class initialization of static integral -// constant members, we must use enums as a workaround if we want the constants -// to be available at compile-time. This macro gives us a convenient way to -// declare such constants. - -# ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -# define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment } -# else -# define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment -# endif - -// BOOST_USE_FACET / HAS_FACET workaround ----------------------------------// -// When the standard library does not have a conforming std::use_facet there -// are various workarounds available, but they differ from library to library. -// The same problem occurs with has_facet. -// These macros provide a consistent way to access a locale's facets. -// Usage: -// replace -// std::use_facet(loc); -// with -// BOOST_USE_FACET(Type, loc); -// Note do not add a std:: prefix to the front of BOOST_USE_FACET! -// Use for BOOST_HAS_FACET is analogous. - -#if defined(BOOST_NO_STD_USE_FACET) -# ifdef BOOST_HAS_TWO_ARG_USE_FACET -# define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast(0)) -# define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast(0)) -# elif defined(BOOST_HAS_MACRO_USE_FACET) -# define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type) -# define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type) -# elif defined(BOOST_HAS_STLP_USE_FACET) -# define BOOST_USE_FACET(Type, loc) (*std::_Use_facet(loc)) -# define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) -# endif -#else -# define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc) -# define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) -#endif - -// BOOST_NESTED_TEMPLATE workaround ------------------------------------------// -// Member templates are supported by some compilers even though they can't use -// the A::template member syntax, as a workaround replace: -// -// typedef typename A::template rebind binder; -// -// with: -// -// typedef typename A::BOOST_NESTED_TEMPLATE rebind binder; - -#ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD -# define BOOST_NESTED_TEMPLATE template -#else -# define BOOST_NESTED_TEMPLATE -#endif - -// BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------// -// Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION -// is defined, in which case it evaluates to return x; Use when you have a return -// statement that can never be reached. - -#ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION -# define BOOST_UNREACHABLE_RETURN(x) return x; -#else -# define BOOST_UNREACHABLE_RETURN(x) -#endif - -// BOOST_DEDUCED_TYPENAME workaround ------------------------------------------// -// -// Some compilers don't support the use of `typename' for dependent -// types in deduced contexts, e.g. -// -// template void f(T, typename T::type); -// ^^^^^^^^ -// Replace these declarations with: -// -// template void f(T, BOOST_DEDUCED_TYPENAME T::type); - -#ifndef BOOST_NO_DEDUCED_TYPENAME -# define BOOST_DEDUCED_TYPENAME typename -#else -# define BOOST_DEDUCED_TYPENAME -#endif - -#ifndef BOOST_NO_TYPENAME_WITH_CTOR -# define BOOST_CTOR_TYPENAME typename -#else -# define BOOST_CTOR_TYPENAME -#endif - -// long long workaround ------------------------------------------// -// On gcc (and maybe other compilers?) long long is alway supported -// but it's use may generate either warnings (with -ansi), or errors -// (with -pedantic -ansi) unless it's use is prefixed by __extension__ -// -#if defined(BOOST_HAS_LONG_LONG) -namespace boost{ -# ifdef __GNUC__ - __extension__ typedef long long long_long_type; - __extension__ typedef unsigned long long ulong_long_type; -# else - typedef long long long_long_type; - typedef unsigned long long ulong_long_type; -# endif -} -#endif - -// BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------// -// -// Some compilers have problems with function templates whose template -// parameters don't appear in the function parameter list (basically -// they just link one instantiation of the template in the final -// executable). These macros provide a uniform way to cope with the -// problem with no effects on the calling syntax. - -// Example: -// -// #include -// #include -// #include -// -// template -// void f() { std::cout << n << ' '; } -// -// template -// void g() { std::cout << typeid(T).name() << ' '; } -// -// int main() { -// f<1>(); -// f<2>(); -// -// g(); -// g(); -// } -// -// With VC++ 6.0 the output is: -// -// 2 2 double double -// -// To fix it, write -// -// template -// void f(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, n)) { ... } -// -// template -// void g(BOOST_EXPLICIT_TEMPLATE_TYPE(T)) { ... } -// - - -#if defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS - -# include "boost/type.hpp" -# include "boost/non_type.hpp" - -# define BOOST_EXPLICIT_TEMPLATE_TYPE(t) boost::type* = 0 -# define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) boost::type* -# define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) boost::non_type* = 0 -# define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) boost::non_type* - -# define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) \ - , BOOST_EXPLICIT_TEMPLATE_TYPE(t) -# define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) \ - , BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) -# define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) \ - , BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) -# define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) \ - , BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) - -#else - -// no workaround needed: expand to nothing - -# define BOOST_EXPLICIT_TEMPLATE_TYPE(t) -# define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) -# define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) -# define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) - -# define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) -# define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) -# define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) -# define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) - - -#endif // defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS - - -// ---------------------------------------------------------------------------// - -// -// Helper macro BOOST_STRINGIZE: -// Converts the parameter X to a string after macro replacement -// on X has been performed. -// -#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) -#define BOOST_DO_STRINGIZE(X) #X - -// -// Helper macro BOOST_JOIN: -// The following piece of macro magic joins the two -// arguments together, even when one of the arguments is -// itself a macro (see 16.3.1 in C++ standard). The key -// is that macro expansion of macro arguments does not -// occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN. -// -#define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y ) -#define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y) -#define BOOST_DO_JOIN2( X, Y ) X##Y - -// -// Set some default values for compiler/library/platform names. -// These are for debugging config setup only: -// -# ifndef BOOST_COMPILER -# define BOOST_COMPILER "Unknown ISO C++ Compiler" -# endif -# ifndef BOOST_STDLIB -# define BOOST_STDLIB "Unknown ISO standard library" -# endif -# ifndef BOOST_PLATFORM -# if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \ - || defined(_POSIX_SOURCE) -# define BOOST_PLATFORM "Generic Unix" -# else -# define BOOST_PLATFORM "Unknown" -# endif -# endif - -// -// Set some default values GPU support -// -# ifndef BOOST_GPU_ENABLED -# define BOOST_GPU_ENABLED -# endif -#endif - diff --git a/src/vendor/stp/src/boost/config/user.hpp b/src/vendor/stp/src/boost/config/user.hpp deleted file mode 100644 index 5a4a9d477..000000000 --- a/src/vendor/stp/src/boost/config/user.hpp +++ /dev/null @@ -1,124 +0,0 @@ -// boost/config/user.hpp ---------------------------------------------------// - -// (C) Copyright John Maddock 2001. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Do not check in modified versions of this file, -// This file may be customized by the end user, but not by boost. - -// -// Use this file to define a site and compiler specific -// configuration policy: -// - -// define this to locate a compiler config file: -// #define BOOST_COMPILER_CONFIG - -// define this to locate a stdlib config file: -// #define BOOST_STDLIB_CONFIG - -// define this to locate a platform config file: -// #define BOOST_PLATFORM_CONFIG - -// define this to disable compiler config, -// use if your compiler config has nothing to set: -// #define BOOST_NO_COMPILER_CONFIG - -// define this to disable stdlib config, -// use if your stdlib config has nothing to set: -// #define BOOST_NO_STDLIB_CONFIG - -// define this to disable platform config, -// use if your platform config has nothing to set: -// #define BOOST_NO_PLATFORM_CONFIG - -// define this to disable all config options, -// excluding the user config. Use if your -// setup is fully ISO compliant, and has no -// useful extensions, or for autoconf generated -// setups: -// #define BOOST_NO_CONFIG - -// define this to make the config "optimistic" -// about unknown compiler versions. Normally -// unknown compiler versions are assumed to have -// all the defects of the last known version, however -// setting this flag, causes the config to assume -// that unknown compiler versions are fully conformant -// with the standard: -// #define BOOST_STRICT_CONFIG - -// define this to cause the config to halt compilation -// with an #error if it encounters anything unknown -- -// either an unknown compiler version or an unknown -// compiler/platform/library: -// #define BOOST_ASSERT_CONFIG - - -// define if you want to disable threading support, even -// when available: -// #define BOOST_DISABLE_THREADS - -// define when you want to disable Win32 specific features -// even when available: -// #define BOOST_DISABLE_WIN32 - -// BOOST_DISABLE_ABI_HEADERS: Stops boost headers from including any -// prefix/suffix headers that normally control things like struct -// packing and alignment. -// #define BOOST_DISABLE_ABI_HEADERS - -// BOOST_ABI_PREFIX: A prefix header to include in place of whatever -// boost.config would normally select, any replacement should set up -// struct packing and alignment options as required. -// #define BOOST_ABI_PREFIX my-header-name - -// BOOST_ABI_SUFFIX: A suffix header to include in place of whatever -// boost.config would normally select, any replacement should undo -// the effects of the prefix header. -// #define BOOST_ABI_SUFFIX my-header-name - -// BOOST_ALL_DYN_LINK: Forces all libraries that have separate source, -// to be linked as dll's rather than static libraries on Microsoft Windows -// (this macro is used to turn on __declspec(dllimport) modifiers, so that -// the compiler knows which symbols to look for in a dll rather than in a -// static library). Note that there may be some libraries that can only -// be statically linked (Boost.Test for example) and others which may only -// be dynamically linked (Boost.Threads for example), in these cases this -// macro has no effect. -// #define BOOST_ALL_DYN_LINK - -// BOOST_WHATEVER_DYN_LINK: Forces library "whatever" to be linked as a dll -// rather than a static library on Microsoft Windows: replace the WHATEVER -// part of the macro name with the name of the library that you want to -// dynamically link to, for example use BOOST_DATE_TIME_DYN_LINK or -// BOOST_REGEX_DYN_LINK etc (this macro is used to turn on __declspec(dllimport) -// modifiers, so that the compiler knows which symbols to look for in a dll -// rather than in a static library). -// Note that there may be some libraries that can only be statically linked -// (Boost.Test for example) and others which may only be dynamically linked -// (Boost.Threads for example), in these cases this macro is unsupported. -// #define BOOST_WHATEVER_DYN_LINK - -// BOOST_ALL_NO_LIB: Tells the config system not to automatically select -// which libraries to link against. -// Normally if a compiler supports #pragma lib, then the correct library -// build variant will be automatically selected and linked against, -// simply by the act of including one of that library's headers. -// This macro turns that feature off. -// #define BOOST_ALL_NO_LIB - -// BOOST_WHATEVER_NO_LIB: Tells the config system not to automatically -// select which library to link against for library "whatever", -// replace WHATEVER in the macro name with the name of the library; -// for example BOOST_DATE_TIME_NO_LIB or BOOST_REGEX_NO_LIB. -// Normally if a compiler supports #pragma lib, then the correct library -// build variant will be automatically selected and linked against, simply -// by the act of including one of that library's headers. This macro turns -// that feature off. -// #define BOOST_WHATEVER_NO_LIB - - - diff --git a/src/vendor/stp/src/boost/config/warning_disable.hpp b/src/vendor/stp/src/boost/config/warning_disable.hpp deleted file mode 100644 index 26ff1323c..000000000 --- a/src/vendor/stp/src/boost/config/warning_disable.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright John Maddock 2008 -// Use, modification, and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// This file exists to turn off some overly-pedantic warning emitted -// by certain compilers. You should include this header only in: -// -// * A test case, before any other headers, or, -// * A library source file before any other headers. -// -// IT SHOULD NOT BE INCLUDED BY ANY BOOST HEADER. -// -// YOU SHOULD NOT INCLUDE IT IF YOU CAN REASONABLY FIX THE WARNING. -// -// The only warnings disabled here are those that are: -// -// * Quite unreasonably pedantic. -// * Generally only emitted by a single compiler. -// * Can't easily be fixed: for example if the vendors own std lib -// code emits these warnings! -// -// Note that THIS HEADER MUST NOT INCLUDE ANY OTHER HEADERS: -// not even std library ones! Doing so may turn the warning -// off too late to be of any use. For example the VC++ C4996 -// warning can be omitted from if that header is included -// before or by this one :-( -// - -#ifndef BOOST_CONFIG_WARNING_DISABLE_HPP -#define BOOST_CONFIG_WARNING_DISABLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) - // Error 'function': was declared deprecated - // http://msdn2.microsoft.com/en-us/library/ttcz0bys(VS.80).aspx - // This error is emitted when you use some perfectly conforming - // std lib functions in a perfectly correct way, and also by - // some of Microsoft's own std lib code ! -# pragma warning(disable:4996) -#endif -#if defined(__INTEL_COMPILER) || defined(__ICL) - // As above: gives warning when a "deprecated" - // std library function is encountered. -# pragma warning(disable:1786) -#endif - -#endif // BOOST_CONFIG_WARNING_DISABLE_HPP diff --git a/src/vendor/stp/src/boost/detail/algorithm.hpp b/src/vendor/stp/src/boost/detail/algorithm.hpp deleted file mode 100644 index 3f9297bca..000000000 --- a/src/vendor/stp/src/boost/detail/algorithm.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// (C) Copyright Jeremy Siek 2001. -// Distributed under the Boost Software License, Version 1.0. (See accompany- -// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -/* - * - * Copyright (c) 1994 - * Hewlett-Packard Company - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. Hewlett-Packard Company makes no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - * - * - * Copyright (c) 1996 - * Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. Silicon Graphics makes no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - */ - -#ifndef BOOST_ALGORITHM_HPP -# define BOOST_ALGORITHM_HPP -# include -// Algorithms on sequences -// -// The functions in this file have not yet gone through formal -// review, and are subject to change. This is a work in progress. -// They have been checked into the detail directory because -// there are some graph algorithms that use these functions. - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost { - - template - bool any_if(InputIterator first, InputIterator last, Predicate p) - { - return std::find_if(first, last, p) != last; - } - - template - bool any_if(const Container& c, Predicate p) - { - return any_if(boost::begin(c), boost::end(c), p); - } - - template - bool container_contains(InputIterator first, InputIterator last, T value) - { - return std::find(first, last, value) != last; - } - template - bool container_contains(const Container& c, const T& value) - { - return container_contains(boost::begin(c), boost::end(c), value); - } - -} // namespace boost - -#endif // BOOST_ALGORITHM_HPP diff --git a/src/vendor/stp/src/boost/detail/allocator_utilities.hpp b/src/vendor/stp/src/boost/detail/allocator_utilities.hpp deleted file mode 100644 index 5d6ef48b0..000000000 --- a/src/vendor/stp/src/boost/detail/allocator_utilities.hpp +++ /dev/null @@ -1,212 +0,0 @@ -/* Copyright 2003-2009 Joaquin M Lopez Munoz. - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or copy at - * http://www.boost.org/LICENSE_1_0.txt) - * - * See Boost website at http://www.boost.org/ - */ - -#ifndef BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP -#define BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP - -#include /* keep it first to prevent nasty warns in MSVC */ -#include -#include -#include -#include -#include -#include -#include - -namespace boost{ - -namespace detail{ - -/* Allocator adaption layer. Some stdlibs provide allocators without rebind - * and template ctors. These facilities are simulated with the external - * template class rebind_to and the aid of partial_std_allocator_wrapper. - */ - -namespace allocator{ - -/* partial_std_allocator_wrapper inherits the functionality of a std - * allocator while providing a templatized ctor and other bits missing - * in some stdlib implementation or another. - */ - -template -class partial_std_allocator_wrapper:public std::allocator -{ -public: - /* Oddly enough, STLport does not define std::allocator::value_type - * when configured to work without partial template specialization. - * No harm in supplying the definition here unconditionally. - */ - - typedef Type value_type; - - partial_std_allocator_wrapper(){}; - - template - partial_std_allocator_wrapper(const partial_std_allocator_wrapper&){} - - partial_std_allocator_wrapper(const std::allocator& x): - std::allocator(x) - { - }; - -#if defined(BOOST_DINKUMWARE_STDLIB) - /* Dinkumware guys didn't provide a means to call allocate() without - * supplying a hint, in disagreement with the standard. - */ - - Type* allocate(std::size_t n,const void* hint=0) - { - std::allocator& a=*this; - return a.allocate(n,hint); - } -#endif - -}; - -/* Detects whether a given allocator belongs to a defective stdlib not - * having the required member templates. - * Note that it does not suffice to check the Boost.Config stdlib - * macros, as the user might have passed a custom, compliant allocator. - * The checks also considers partial_std_allocator_wrapper to be - * a standard defective allocator. - */ - -#if defined(BOOST_NO_STD_ALLOCATOR)&&\ - (defined(BOOST_HAS_PARTIAL_STD_ALLOCATOR)||defined(BOOST_DINKUMWARE_STDLIB)) - -template -struct is_partial_std_allocator -{ - BOOST_STATIC_CONSTANT(bool, - value= - (is_same< - std::allocator, - Allocator - >::value)|| - (is_same< - partial_std_allocator_wrapper< - BOOST_DEDUCED_TYPENAME Allocator::value_type>, - Allocator - >::value)); -}; - -#else - -template -struct is_partial_std_allocator -{ - BOOST_STATIC_CONSTANT(bool,value=false); -}; - -#endif - -/* rebind operations for defective std allocators */ - -template -struct partial_std_allocator_rebind_to -{ - typedef partial_std_allocator_wrapper type; -}; - -/* rebind operation in all other cases */ - -#if BOOST_WORKAROUND(BOOST_MSVC,<1300) -/* Workaround for a problem in MSVC with dependent template typedefs - * when doing rebinding of allocators. - * Modeled after (thanks, Aleksey!) - */ - -template -struct rebinder -{ - template struct fake_allocator:Allocator{}; - template<> struct fake_allocator - { - template struct rebind{}; - }; - - template - struct result: - fake_allocator::value>:: - template rebind - { - }; -}; -#else -template -struct rebinder -{ - template - struct result - { - typedef typename Allocator::BOOST_NESTED_TEMPLATE - rebind::other other; - }; -}; -#endif - -template -struct compliant_allocator_rebind_to -{ - typedef typename rebinder:: - BOOST_NESTED_TEMPLATE result::other type; -}; - -/* rebind front-end */ - -template -struct rebind_to: - mpl::eval_if_c< - is_partial_std_allocator::value, - partial_std_allocator_rebind_to, - compliant_allocator_rebind_to - > -{ -}; - -/* allocator-independent versions of construct and destroy */ - -template -void construct(void* p,const Type& t) -{ - new (p) Type(t); -} - -#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500)) -/* MSVC++ issues spurious warnings about unreferencend formal parameters - * in destroy when Type is a class with trivial dtor. - */ - -#pragma warning(push) -#pragma warning(disable:4100) -#endif - -template -void destroy(const Type* p) -{ - -#if BOOST_WORKAROUND(__SUNPRO_CC,BOOST_TESTED_AT(0x590)) - const_cast(p)->~Type(); -#else - p->~Type(); -#endif - -} - -#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500)) -#pragma warning(pop) -#endif - -} /* namespace boost::detail::allocator */ - -} /* namespace boost::detail */ - -} /* namespace boost */ - -#endif diff --git a/src/vendor/stp/src/boost/detail/atomic_count.hpp b/src/vendor/stp/src/boost/detail/atomic_count.hpp deleted file mode 100644 index 5411c7ae9..000000000 --- a/src/vendor/stp/src/boost/detail/atomic_count.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED -#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// -// boost/detail/atomic_count.hpp - thread/SMP safe reference counter -// -// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt - -#include - -#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/binary_search.hpp b/src/vendor/stp/src/boost/detail/binary_search.hpp deleted file mode 100644 index 3dca9b650..000000000 --- a/src/vendor/stp/src/boost/detail/binary_search.hpp +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) 2000 David Abrahams. -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// Copyright (c) 1994 -// Hewlett-Packard Company -// -// Permission to use, copy, modify, distribute and sell this software -// and its documentation for any purpose is hereby granted without fee, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. Hewlett-Packard Company makes no -// representations about the suitability of this software for any -// purpose. It is provided "as is" without express or implied warranty. -// -// Copyright (c) 1996 -// Silicon Graphics Computer Systems, Inc. -// -// Permission to use, copy, modify, distribute and sell this software -// and its documentation for any purpose is hereby granted without fee, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. Silicon Graphics makes no -// representations about the suitability of this software for any -// purpose. It is provided "as is" without express or implied warranty. -// -#ifndef BINARY_SEARCH_DWA_122600_H_ -# define BINARY_SEARCH_DWA_122600_H_ - -# include -# include - -namespace boost { namespace detail { - -template -ForwardIter lower_bound(ForwardIter first, ForwardIter last, - const Tp& val) -{ - typedef detail::iterator_traits traits; - - typename traits::difference_type len = boost::detail::distance(first, last); - typename traits::difference_type half; - ForwardIter middle; - - while (len > 0) { - half = len >> 1; - middle = first; - std::advance(middle, half); - if (*middle < val) { - first = middle; - ++first; - len = len - half - 1; - } - else - len = half; - } - return first; -} - -template -ForwardIter lower_bound(ForwardIter first, ForwardIter last, - const Tp& val, Compare comp) -{ - typedef detail::iterator_traits traits; - - typename traits::difference_type len = boost::detail::distance(first, last); - typename traits::difference_type half; - ForwardIter middle; - - while (len > 0) { - half = len >> 1; - middle = first; - std::advance(middle, half); - if (comp(*middle, val)) { - first = middle; - ++first; - len = len - half - 1; - } - else - len = half; - } - return first; -} - -template -ForwardIter upper_bound(ForwardIter first, ForwardIter last, - const Tp& val) -{ - typedef detail::iterator_traits traits; - - typename traits::difference_type len = boost::detail::distance(first, last); - typename traits::difference_type half; - ForwardIter middle; - - while (len > 0) { - half = len >> 1; - middle = first; - std::advance(middle, half); - if (val < *middle) - len = half; - else { - first = middle; - ++first; - len = len - half - 1; - } - } - return first; -} - -template -ForwardIter upper_bound(ForwardIter first, ForwardIter last, - const Tp& val, Compare comp) -{ - typedef detail::iterator_traits traits; - - typename traits::difference_type len = boost::detail::distance(first, last); - typename traits::difference_type half; - ForwardIter middle; - - while (len > 0) { - half = len >> 1; - middle = first; - std::advance(middle, half); - if (comp(val, *middle)) - len = half; - else { - first = middle; - ++first; - len = len - half - 1; - } - } - return first; -} - -template -std::pair -equal_range(ForwardIter first, ForwardIter last, const Tp& val) -{ - typedef detail::iterator_traits traits; - - typename traits::difference_type len = boost::detail::distance(first, last); - typename traits::difference_type half; - ForwardIter middle, left, right; - - while (len > 0) { - half = len >> 1; - middle = first; - std::advance(middle, half); - if (*middle < val) { - first = middle; - ++first; - len = len - half - 1; - } - else if (val < *middle) - len = half; - else { - left = boost::detail::lower_bound(first, middle, val); - std::advance(first, len); - right = boost::detail::upper_bound(++middle, first, val); - return std::pair(left, right); - } - } - return std::pair(first, first); -} - -template -std::pair -equal_range(ForwardIter first, ForwardIter last, const Tp& val, - Compare comp) -{ - typedef detail::iterator_traits traits; - - typename traits::difference_type len = boost::detail::distance(first, last); - typename traits::difference_type half; - ForwardIter middle, left, right; - - while (len > 0) { - half = len >> 1; - middle = first; - std::advance(middle, half); - if (comp(*middle, val)) { - first = middle; - ++first; - len = len - half - 1; - } - else if (comp(val, *middle)) - len = half; - else { - left = boost::detail::lower_bound(first, middle, val, comp); - std::advance(first, len); - right = boost::detail::upper_bound(++middle, first, val, comp); - return std::pair(left, right); - } - } - return std::pair(first, first); -} - -template -bool binary_search(ForwardIter first, ForwardIter last, - const Tp& val) { - ForwardIter i = boost::detail::lower_bound(first, last, val); - return i != last && !(val < *i); -} - -template -bool binary_search(ForwardIter first, ForwardIter last, - const Tp& val, - Compare comp) { - ForwardIter i = boost::detail::lower_bound(first, last, val, comp); - return i != last && !comp(val, *i); -} - -}} // namespace boost::detail - -#endif // BINARY_SEARCH_DWA_122600_H_ diff --git a/src/vendor/stp/src/boost/detail/call_traits.hpp b/src/vendor/stp/src/boost/detail/call_traits.hpp deleted file mode 100644 index 6ad646ec6..000000000 --- a/src/vendor/stp/src/boost/detail/call_traits.hpp +++ /dev/null @@ -1,164 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/utility for most recent version including documentation. - -// call_traits: defines typedefs for function usage -// (see libs/utility/call_traits.htm) - -/* Release notes: - 23rd July 2000: - Fixed array specialization. (JM) - Added Borland specific fixes for reference types - (issue raised by Steve Cleary). -*/ - -#ifndef BOOST_DETAIL_CALL_TRAITS_HPP -#define BOOST_DETAIL_CALL_TRAITS_HPP - -#ifndef BOOST_CONFIG_HPP -#include -#endif -#include - -#include -#include -#include - -namespace boost{ - -namespace detail{ - -template -struct ct_imp2 -{ - typedef const T& param_type; -}; - -template -struct ct_imp2 -{ - typedef const T param_type; -}; - -template -struct ct_imp -{ - typedef const T& param_type; -}; - -template -struct ct_imp -{ - typedef typename ct_imp2::param_type param_type; -}; - -template -struct ct_imp -{ - typedef const T param_type; -}; - -} - -template -struct call_traits -{ -public: - typedef T value_type; - typedef T& reference; - typedef const T& const_reference; - // - // C++ Builder workaround: we should be able to define a compile time - // constant and pass that as a single template parameter to ct_imp, - // however compiler bugs prevent this - instead pass three bool's to - // ct_imp and add an extra partial specialisation - // of ct_imp to handle the logic. (JM) - typedef typename boost::detail::ct_imp< - T, - ::boost::is_pointer::value, - ::boost::is_arithmetic::value - >::param_type param_type; -}; - -template -struct call_traits -{ - typedef T& value_type; - typedef T& reference; - typedef const T& const_reference; - typedef T& param_type; // hh removed const -}; - -#if BOOST_WORKAROUND( __BORLANDC__, < 0x5A0 ) -// these are illegal specialisations; cv-qualifies applied to -// references have no effect according to [8.3.2p1], -// C++ Builder requires them though as it treats cv-qualified -// references as distinct types... -template -struct call_traits -{ - typedef T& value_type; - typedef T& reference; - typedef const T& const_reference; - typedef T& param_type; // hh removed const -}; -template -struct call_traits -{ - typedef T& value_type; - typedef T& reference; - typedef const T& const_reference; - typedef T& param_type; // hh removed const -}; -template -struct call_traits -{ - typedef T& value_type; - typedef T& reference; - typedef const T& const_reference; - typedef T& param_type; // hh removed const -}; - -template -struct call_traits< T * > -{ - typedef T * value_type; - typedef T * & reference; - typedef T * const & const_reference; - typedef T * const param_type; // hh removed const -}; -#endif -#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -template -struct call_traits -{ -private: - typedef T array_type[N]; -public: - // degrades array to pointer: - typedef const T* value_type; - typedef array_type& reference; - typedef const array_type& const_reference; - typedef const T* const param_type; -}; - -template -struct call_traits -{ -private: - typedef const T array_type[N]; -public: - // degrades array to pointer: - typedef const T* value_type; - typedef array_type& reference; - typedef const array_type& const_reference; - typedef const T* const param_type; -}; -#endif - -} - -#endif // BOOST_DETAIL_CALL_TRAITS_HPP diff --git a/src/vendor/stp/src/boost/detail/catch_exceptions.hpp b/src/vendor/stp/src/boost/detail/catch_exceptions.hpp deleted file mode 100644 index b1a3c76b2..000000000 --- a/src/vendor/stp/src/boost/detail/catch_exceptions.hpp +++ /dev/null @@ -1,146 +0,0 @@ -// boost/catch_exceptions.hpp -----------------------------------------------// - -// Copyright Beman Dawes 1995-2001. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/test for documentation. - -// Revision History -// 13 Jun 01 report_exception() made inline. (John Maddock, Jesse Jones) -// 26 Feb 01 Numerous changes suggested during formal review. (Beman) -// 25 Jan 01 catch_exceptions.hpp code factored out of cpp_main.cpp. -// 22 Jan 01 Remove test_tools dependencies to reduce coupling. -// 5 Nov 00 Initial boost version (Beman Dawes) - -#ifndef BOOST_CATCH_EXCEPTIONS_HPP -#define BOOST_CATCH_EXCEPTIONS_HPP - -// header dependencies are deliberately restricted to the standard library -// to reduce coupling to other boost libraries. -#include // for string -#include // for bad_alloc -#include // for bad_cast, bad_typeid -#include // for exception, bad_exception -#include // for std exception hierarchy -#include // for exit codes -# if __GNUC__ != 2 || __GNUC_MINOR__ > 96 -# include // for ostream -# else -# include // workaround GNU missing ostream header -# endif - -# if defined(__BORLANDC__) && (__BORLANDC__ <= 0x0551) -# define BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT -# endif - -#if defined(MPW_CPLUS) && (MPW_CPLUS <= 0x890) -# define BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT - namespace std { class bad_typeid { }; } -# endif - -namespace boost -{ - - namespace detail - { - // A separate reporting function was requested during formal review. - inline void report_exception( std::ostream & os, - const char * name, const char * info ) - { os << "\n** uncaught exception: " << name << " " << info << std::endl; } - } - - // catch_exceptions ------------------------------------------------------// - - template< class Generator > // Generator is function object returning int - int catch_exceptions( Generator function_object, - std::ostream & out, std::ostream & err ) - { - int result = 0; // quiet compiler warnings - bool exception_thrown = true; // avoid setting result for each excptn type - -#ifndef BOOST_NO_EXCEPTIONS - try - { -#endif - result = function_object(); - exception_thrown = false; -#ifndef BOOST_NO_EXCEPTIONS - } - - // As a result of hard experience with strangely interleaved output - // under some compilers, there is a lot of use of endl in the code below - // where a simple '\n' might appear to do. - - // The rules for catch & arguments are a bit different from function - // arguments (ISO 15.3 paragraphs 18 & 19). Apparently const isn't - // required, but it doesn't hurt and some programmers ask for it. - - catch ( const char * ex ) - { detail::report_exception( out, "", ex ); } - catch ( const std::string & ex ) - { detail::report_exception( out, "", ex.c_str() ); } - - // std:: exceptions - catch ( const std::bad_alloc & ex ) - { detail::report_exception( out, "std::bad_alloc:", ex.what() ); } - -# ifndef BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT - catch ( const std::bad_cast & ex ) - { detail::report_exception( out, "std::bad_cast:", ex.what() ); } - catch ( const std::bad_typeid & ex ) - { detail::report_exception( out, "std::bad_typeid:", ex.what() ); } -# else - catch ( const std::bad_cast & ) - { detail::report_exception( out, "std::bad_cast", "" ); } - catch ( const std::bad_typeid & ) - { detail::report_exception( out, "std::bad_typeid", "" ); } -# endif - - catch ( const std::bad_exception & ex ) - { detail::report_exception( out, "std::bad_exception:", ex.what() ); } - catch ( const std::domain_error & ex ) - { detail::report_exception( out, "std::domain_error:", ex.what() ); } - catch ( const std::invalid_argument & ex ) - { detail::report_exception( out, "std::invalid_argument:", ex.what() ); } - catch ( const std::length_error & ex ) - { detail::report_exception( out, "std::length_error:", ex.what() ); } - catch ( const std::out_of_range & ex ) - { detail::report_exception( out, "std::out_of_range:", ex.what() ); } - catch ( const std::range_error & ex ) - { detail::report_exception( out, "std::range_error:", ex.what() ); } - catch ( const std::overflow_error & ex ) - { detail::report_exception( out, "std::overflow_error:", ex.what() ); } - catch ( const std::underflow_error & ex ) - { detail::report_exception( out, "std::underflow_error:", ex.what() ); } - catch ( const std::logic_error & ex ) - { detail::report_exception( out, "std::logic_error:", ex.what() ); } - catch ( const std::runtime_error & ex ) - { detail::report_exception( out, "std::runtime_error:", ex.what() ); } - catch ( const std::exception & ex ) - { detail::report_exception( out, "std::exception:", ex.what() ); } - - catch ( ... ) - { detail::report_exception( out, "unknown exception", "" ); } -#endif // BOOST_NO_EXCEPTIONS - - if ( exception_thrown ) result = boost::exit_exception_failure; - - if ( result != 0 && result != exit_success ) - { - out << std::endl << "**** returning with error code " - << result << std::endl; - err - << "********** errors detected; see stdout for details ***********" - << std::endl; - } -#if !defined(BOOST_NO_CPP_MAIN_SUCCESS_MESSAGE) - else { out << std::flush << "no errors detected" << std::endl; } -#endif - return result; - } // catch_exceptions - -} // boost - -#endif // BOOST_CATCH_EXCEPTIONS_HPP - diff --git a/src/vendor/stp/src/boost/detail/compressed_pair.hpp b/src/vendor/stp/src/boost/detail/compressed_pair.hpp deleted file mode 100644 index 3f326456c..000000000 --- a/src/vendor/stp/src/boost/detail/compressed_pair.hpp +++ /dev/null @@ -1,443 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/utility for most recent version including documentation. - -// compressed_pair: pair that "compresses" empty members -// (see libs/utility/compressed_pair.htm) -// -// JM changes 25 Jan 2004: -// For the case where T1 == T2 and both are empty, then first() and second() -// should return different objects. -// JM changes 25 Jan 2000: -// Removed default arguments from compressed_pair_switch to get -// C++ Builder 4 to accept them -// rewriten swap to get gcc and C++ builder to compile. -// added partial specialisations for case T1 == T2 to avoid duplicate constructor defs. - -#ifndef BOOST_DETAIL_COMPRESSED_PAIR_HPP -#define BOOST_DETAIL_COMPRESSED_PAIR_HPP - -#include - -#include -#include -#include -#include - -#ifdef BOOST_MSVC -# pragma warning(push) -# pragma warning(disable:4512) -#endif -namespace boost -{ - -template -class compressed_pair; - - -// compressed_pair - -namespace details -{ - // JM altered 26 Jan 2000: - template - struct compressed_pair_switch; - - template - struct compressed_pair_switch - {static const int value = 0;}; - - template - struct compressed_pair_switch - {static const int value = 3;}; - - template - struct compressed_pair_switch - {static const int value = 1;}; - - template - struct compressed_pair_switch - {static const int value = 2;}; - - template - struct compressed_pair_switch - {static const int value = 4;}; - - template - struct compressed_pair_switch - {static const int value = 5;}; - - template class compressed_pair_imp; - -#ifdef __GNUC__ - // workaround for GCC (JM): - using std::swap; -#endif - // - // can't call unqualified swap from within classname::swap - // as Koenig lookup rules will find only the classname::swap - // member function not the global declaration, so use cp_swap - // as a forwarding function (JM): - template - inline void cp_swap(T& t1, T& t2) - { -#ifndef __GNUC__ - using std::swap; -#endif - swap(t1, t2); - } - - // 0 derive from neither - - template - class compressed_pair_imp - { - public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_imp() {} - - compressed_pair_imp(first_param_type x, second_param_type y) - : first_(x), second_(y) {} - - compressed_pair_imp(first_param_type x) - : first_(x) {} - - compressed_pair_imp(second_param_type y) - : second_(y) {} - - first_reference first() {return first_;} - first_const_reference first() const {return first_;} - - second_reference second() {return second_;} - second_const_reference second() const {return second_;} - - void swap(::boost::compressed_pair& y) - { - cp_swap(first_, y.first()); - cp_swap(second_, y.second()); - } - private: - first_type first_; - second_type second_; - }; - - // 1 derive from T1 - - template - class compressed_pair_imp - : protected ::boost::remove_cv::type - { - public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_imp() {} - - compressed_pair_imp(first_param_type x, second_param_type y) - : first_type(x), second_(y) {} - - compressed_pair_imp(first_param_type x) - : first_type(x) {} - - compressed_pair_imp(second_param_type y) - : second_(y) {} - - first_reference first() {return *this;} - first_const_reference first() const {return *this;} - - second_reference second() {return second_;} - second_const_reference second() const {return second_;} - - void swap(::boost::compressed_pair& y) - { - // no need to swap empty base class: - cp_swap(second_, y.second()); - } - private: - second_type second_; - }; - - // 2 derive from T2 - - template - class compressed_pair_imp - : protected ::boost::remove_cv::type - { - public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_imp() {} - - compressed_pair_imp(first_param_type x, second_param_type y) - : second_type(y), first_(x) {} - - compressed_pair_imp(first_param_type x) - : first_(x) {} - - compressed_pair_imp(second_param_type y) - : second_type(y) {} - - first_reference first() {return first_;} - first_const_reference first() const {return first_;} - - second_reference second() {return *this;} - second_const_reference second() const {return *this;} - - void swap(::boost::compressed_pair& y) - { - // no need to swap empty base class: - cp_swap(first_, y.first()); - } - - private: - first_type first_; - }; - - // 3 derive from T1 and T2 - - template - class compressed_pair_imp - : protected ::boost::remove_cv::type, - protected ::boost::remove_cv::type - { - public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_imp() {} - - compressed_pair_imp(first_param_type x, second_param_type y) - : first_type(x), second_type(y) {} - - compressed_pair_imp(first_param_type x) - : first_type(x) {} - - compressed_pair_imp(second_param_type y) - : second_type(y) {} - - first_reference first() {return *this;} - first_const_reference first() const {return *this;} - - second_reference second() {return *this;} - second_const_reference second() const {return *this;} - // - // no need to swap empty bases: - void swap(::boost::compressed_pair&) {} - }; - - // JM - // 4 T1 == T2, T1 and T2 both empty - // Originally this did not store an instance of T2 at all - // but that led to problems beause it meant &x.first() == &x.second() - // which is not true for any other kind of pair, so now we store an instance - // of T2 just in case the user is relying on first() and second() returning - // different objects (albeit both empty). - template - class compressed_pair_imp - : protected ::boost::remove_cv::type - { - public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_imp() {} - - compressed_pair_imp(first_param_type x, second_param_type y) - : first_type(x), m_second(y) {} - - compressed_pair_imp(first_param_type x) - : first_type(x), m_second(x) {} - - first_reference first() {return *this;} - first_const_reference first() const {return *this;} - - second_reference second() {return m_second;} - second_const_reference second() const {return m_second;} - - void swap(::boost::compressed_pair&) {} - private: - T2 m_second; - }; - - // 5 T1 == T2 and are not empty: //JM - - template - class compressed_pair_imp - { - public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_imp() {} - - compressed_pair_imp(first_param_type x, second_param_type y) - : first_(x), second_(y) {} - - compressed_pair_imp(first_param_type x) - : first_(x), second_(x) {} - - first_reference first() {return first_;} - first_const_reference first() const {return first_;} - - second_reference second() {return second_;} - second_const_reference second() const {return second_;} - - void swap(::boost::compressed_pair& y) - { - cp_swap(first_, y.first()); - cp_swap(second_, y.second()); - } - private: - first_type first_; - second_type second_; - }; - -} // details - -template -class compressed_pair - : private ::boost::details::compressed_pair_imp::type, typename remove_cv::type>::value, - ::boost::is_empty::value, - ::boost::is_empty::value>::value> -{ -private: - typedef details::compressed_pair_imp::type, typename remove_cv::type>::value, - ::boost::is_empty::value, - ::boost::is_empty::value>::value> base; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair() : base() {} - compressed_pair(first_param_type x, second_param_type y) : base(x, y) {} - explicit compressed_pair(first_param_type x) : base(x) {} - explicit compressed_pair(second_param_type y) : base(y) {} - - first_reference first() {return base::first();} - first_const_reference first() const {return base::first();} - - second_reference second() {return base::second();} - second_const_reference second() const {return base::second();} - - void swap(compressed_pair& y) { base::swap(y); } -}; - -// JM -// Partial specialisation for case where T1 == T2: -// -template -class compressed_pair - : private details::compressed_pair_imp::type, typename remove_cv::type>::value, - ::boost::is_empty::value, - ::boost::is_empty::value>::value> -{ -private: - typedef details::compressed_pair_imp::type, typename remove_cv::type>::value, - ::boost::is_empty::value, - ::boost::is_empty::value>::value> base; -public: - typedef T first_type; - typedef T second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair() : base() {} - compressed_pair(first_param_type x, second_param_type y) : base(x, y) {} -#if !(defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)) - explicit -#endif - compressed_pair(first_param_type x) : base(x) {} - - first_reference first() {return base::first();} - first_const_reference first() const {return base::first();} - - second_reference second() {return base::second();} - second_const_reference second() const {return base::second();} - - void swap(::boost::compressed_pair& y) { base::swap(y); } -}; - -template -inline -void -swap(compressed_pair& x, compressed_pair& y) -{ - x.swap(y); -} - -} // boost - -#ifdef BOOST_MSVC -# pragma warning(pop) -#endif - -#endif // BOOST_DETAIL_COMPRESSED_PAIR_HPP - diff --git a/src/vendor/stp/src/boost/detail/container_fwd.hpp b/src/vendor/stp/src/boost/detail/container_fwd.hpp deleted file mode 100644 index 67c5a21c8..000000000 --- a/src/vendor/stp/src/boost/detail/container_fwd.hpp +++ /dev/null @@ -1,101 +0,0 @@ - -// Copyright 2005-2008 Daniel James. -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#if !defined(BOOST_DETAIL_CONTAINER_FWD_HPP) -#define BOOST_DETAIL_CONTAINER_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -#include -#include - -#if defined(BOOST_DETAIL_NO_CONTAINER_FWD) \ - || ((defined(__GLIBCPP__) || defined(__GLIBCXX__)) \ - && (defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL))) \ - || BOOST_WORKAROUND(__BORLANDC__, > 0x551) \ - || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x842)) \ - || (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) - -#include -#include -#include -#include -#include -#include -#include -#include - -#else - -#include - -#if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) && \ - defined(__STL_CONFIG_H) - -#define BOOST_CONTAINER_FWD_BAD_BITSET - -#if !defined(__STL_NON_TYPE_TMPL_PARAM_BUG) -#define BOOST_CONTAINER_FWD_BAD_DEQUE -#endif - -#endif - -#if defined(BOOST_CONTAINER_FWD_BAD_DEQUE) -#include -#endif - -#if defined(BOOST_CONTAINER_FWD_BAD_BITSET) -#include -#endif - -#if defined(BOOST_MSVC) -#pragma warning(push) -#pragma warning(disable:4099) // struct/class mismatch in fwd declarations -#endif - -namespace std -{ - template class allocator; - template class basic_string; - -#if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) - template struct string_char_traits; -#else - template struct char_traits; -#endif - - template class complex; -} - -// gcc 3.4 and greater -namespace std -{ -#if !defined(BOOST_CONTAINER_FWD_BAD_DEQUE) - template class deque; -#endif - - template class list; - template class vector; - template class map; - template - class multimap; - template class set; - template class multiset; - -#if !defined(BOOST_CONTAINER_FWD_BAD_BITSET) - template class bitset; -#endif - template struct pair; -} - -#if defined(BOOST_MSVC) -#pragma warning(pop) -#endif - -#endif - -#endif diff --git a/src/vendor/stp/src/boost/detail/dynamic_bitset.hpp b/src/vendor/stp/src/boost/detail/dynamic_bitset.hpp deleted file mode 100644 index 281aa55cd..000000000 --- a/src/vendor/stp/src/boost/detail/dynamic_bitset.hpp +++ /dev/null @@ -1,229 +0,0 @@ -// ----------------------------------------------------------- -// -// Copyright (c) 2001-2002 Chuck Allison and Jeremy Siek -// Copyright (c) 2003-2006, 2008 Gennaro Prota -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// ----------------------------------------------------------- - -#ifndef BOOST_DETAIL_DYNAMIC_BITSET_HPP -#define BOOST_DETAIL_DYNAMIC_BITSET_HPP - -#include -#include "boost/config.hpp" -#include "boost/detail/workaround.hpp" - - -namespace boost { - - namespace detail { - namespace dynamic_bitset_impl { - - // Gives (read-)access to the object representation - // of an object of type T (3.9p4). CANNOT be used - // on a base sub-object - // - template - inline const unsigned char * object_representation (T* p) - { - return static_cast(static_cast(p)); - } - - template - struct shifter - { - static void left_shift(T & v) { - amount >= width ? (v = 0) - : (v >>= BOOST_DYNAMIC_BITSET_WRAP_CONSTANT(amount)); - } - }; - - // ------- count function implementation -------------- - - typedef unsigned char byte_type; - - // These two entities - // - // enum mode { access_by_bytes, access_by_blocks }; - // template struct mode_to_type {}; - // - // were removed, since the regression logs (as of 24 Aug 2008) - // showed that several compilers had troubles with recognizing - // - // const mode m = access_by_bytes - // - // as a constant expression - // - // * So, we'll use bool, instead of enum *. - // - template - struct value_to_type - { - value_to_type() {} - }; - const bool access_by_bytes = true; - const bool access_by_blocks = false; - - - // the table: wrapped in a class template, so - // that it is only instantiated if/when needed - // - template - struct count_table { static const byte_type table[]; }; - - template <> - struct count_table { /* no table */ }; - - - const unsigned int table_width = 8; - template - const byte_type count_table::table[] = - { - // Automatically generated by GPTableGen.exe v.1.0 - // - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 - }; - - - // overload for access by bytes - // - - template - inline std::size_t do_count(Iterator first, std::size_t length, - int /*dummy param*/, - value_to_type* ) - { - std::size_t num = 0; - if (length) - { - const byte_type * p = object_representation(&*first); - length *= sizeof(*first); - - do { - num += count_table<>::table[*p]; - ++p; - --length; - - } while (length); - } - - return num; - } - - - // overload for access by blocks - // - template - inline std::size_t do_count(Iterator first, std::size_t length, ValueType, - value_to_type*) - { - std::size_t num = 0; - while (length){ - - ValueType value = *first; - while (value) { - num += count_table<>::table[value & ((1u<>= table_width; - } - - ++first; - --length; - } - - return num; - } - - // ------------------------------------------------------- - - - // Some library implementations simply return a dummy - // value such as - // - // size_type(-1) / sizeof(T) - // - // from vector<>::max_size. This tries to get more - // meaningful info. - // - template - typename T::size_type vector_max_size_workaround(const T & v) { - - typedef typename T::allocator_type allocator_type; - - const typename allocator_type::size_type alloc_max = - v.get_allocator().max_size(); - const typename T::size_type container_max = v.max_size(); - - return alloc_max < container_max? - alloc_max : - container_max; - } - - // for static_asserts - template - struct allowed_block_type { - enum { value = T(-1) > 0 }; // ensure T has no sign - }; - - template <> - struct allowed_block_type { - enum { value = false }; - }; - - - template - struct is_numeric { - enum { value = false }; - }; - -# define BOOST_dynamic_bitset_is_numeric(x) \ - template<> \ - struct is_numeric< x > { \ - enum { value = true }; \ - } /**/ - - BOOST_dynamic_bitset_is_numeric(bool); - BOOST_dynamic_bitset_is_numeric(char); - -#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) - BOOST_dynamic_bitset_is_numeric(wchar_t); -#endif - - BOOST_dynamic_bitset_is_numeric(signed char); - BOOST_dynamic_bitset_is_numeric(short int); - BOOST_dynamic_bitset_is_numeric(int); - BOOST_dynamic_bitset_is_numeric(long int); - - BOOST_dynamic_bitset_is_numeric(unsigned char); - BOOST_dynamic_bitset_is_numeric(unsigned short); - BOOST_dynamic_bitset_is_numeric(unsigned int); - BOOST_dynamic_bitset_is_numeric(unsigned long); - -#if defined(BOOST_HAS_LONG_LONG) - BOOST_dynamic_bitset_is_numeric(::boost::long_long_type); - BOOST_dynamic_bitset_is_numeric(::boost::ulong_long_type); -#endif - - // intentionally omitted - //BOOST_dynamic_bitset_is_numeric(float); - //BOOST_dynamic_bitset_is_numeric(double); - //BOOST_dynamic_bitset_is_numeric(long double); - -#undef BOOST_dynamic_bitset_is_numeric - - } // dynamic_bitset_impl - } // namespace detail - -} // namespace boost - -#endif // include guard - diff --git a/src/vendor/stp/src/boost/detail/endian.hpp b/src/vendor/stp/src/boost/detail/endian.hpp deleted file mode 100644 index 36ddb7e1e..000000000 --- a/src/vendor/stp/src/boost/detail/endian.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2005 Caleb Epstein -// Copyright 2006 John Maddock -// Distributed under the Boost Software License, Version 1.0. (See accompany- -// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -/* - * Copyright (c) 1997 - * Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. Silicon Graphics makes no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - */ - -/* - * Copyright notice reproduced from , from - * which this code was originally taken. - * - * Modified by Caleb Epstein to use with GNU libc and to - * defined the BOOST_ENDIAN macro. - */ - -#ifndef BOOST_DETAIL_ENDIAN_HPP -#define BOOST_DETAIL_ENDIAN_HPP - -// GNU libc offers the helpful header which defines -// __BYTE_ORDER - -#if defined (__GLIBC__) -# include -# if (__BYTE_ORDER == __LITTLE_ENDIAN) -# define BOOST_LITTLE_ENDIAN -# elif (__BYTE_ORDER == __BIG_ENDIAN) -# define BOOST_BIG_ENDIAN -# elif (__BYTE_ORDER == __PDP_ENDIAN) -# define BOOST_PDP_ENDIAN -# else -# error Unknown machine endianness detected. -# endif -# define BOOST_BYTE_ORDER __BYTE_ORDER -#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) -# define BOOST_BIG_ENDIAN -# define BOOST_BYTE_ORDER 4321 -#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) -# define BOOST_LITTLE_ENDIAN -# define BOOST_BYTE_ORDER 1234 -#elif defined(__sparc) || defined(__sparc__) \ - || defined(_POWER) || defined(__powerpc__) \ - || defined(__ppc__) || defined(__hpux) || defined(__hppa) \ - || defined(_MIPSEB) || defined(_POWER) \ - || defined(__s390__) -# define BOOST_BIG_ENDIAN -# define BOOST_BYTE_ORDER 4321 -#elif defined(__i386__) || defined(__alpha__) \ - || defined(__ia64) || defined(__ia64__) \ - || defined(_M_IX86) || defined(_M_IA64) \ - || defined(_M_ALPHA) || defined(__amd64) \ - || defined(__amd64__) || defined(_M_AMD64) \ - || defined(__x86_64) || defined(__x86_64__) \ - || defined(_M_X64) || defined(__bfin__) - -# define BOOST_LITTLE_ENDIAN -# define BOOST_BYTE_ORDER 1234 -#else -# error The file boost/detail/endian.hpp needs to be set up for your CPU type. -#endif - - -#endif diff --git a/src/vendor/stp/src/boost/detail/has_default_constructor.hpp b/src/vendor/stp/src/boost/detail/has_default_constructor.hpp deleted file mode 100644 index 319b30abc..000000000 --- a/src/vendor/stp/src/boost/detail/has_default_constructor.hpp +++ /dev/null @@ -1,29 +0,0 @@ - -// (C) Copyright Matthias Troyerk 2006. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED -#define BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED - -#include - -namespace boost { namespace detail { - -/// type trait to check for a default constructor -/// -/// The default implementation just checks for a trivial constructor. -/// Using some compiler magic it might be possible to provide a better default - -template -struct has_default_constructor - : public has_trivial_constructor -{}; - -} } // namespace boost::detail - - -#endif // BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/identifier.hpp b/src/vendor/stp/src/boost/detail/identifier.hpp deleted file mode 100644 index 688a664f7..000000000 --- a/src/vendor/stp/src/boost/detail/identifier.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// boost/identifier.hpp ----------------------------------------------------// - -// Copyright Beman Dawes 2006 - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See documentation at http://www.boost.org/libs/utility - -#ifndef BOOST_IDENTIFIER_HPP -#define BOOST_IDENTIFIER_HPP - -#include -#include -#include - -namespace boost -{ - namespace detail - { - // class template identifier ---------------------------------------------// - - // Always used as a base class so that different instantiations result in - // different class types even if instantiated with the same value type T. - - // Expected usage is that T is often an integer type, best passed by - // value. There is no reason why T can't be a possibly larger class such as - // std::string, best passed by const reference. - - // This implementation uses pass by value, based on expected common uses. - - template - class identifier - { - public: - typedef T value_type; - - const value_type value() const { return m_value; } - void assign( value_type v ) { m_value = v; } - - bool operator==( const D & rhs ) const { return m_value == rhs.m_value; } - bool operator!=( const D & rhs ) const { return m_value != rhs.m_value; } - bool operator< ( const D & rhs ) const { return m_value < rhs.m_value; } - bool operator<=( const D & rhs ) const { return m_value <= rhs.m_value; } - bool operator> ( const D & rhs ) const { return m_value > rhs.m_value; } - bool operator>=( const D & rhs ) const { return m_value >= rhs.m_value; } - - typedef void (*unspecified_bool_type)(D); // without the D, unspecified_bool_type - static void unspecified_bool_true(D){} // conversion allows relational operators - // between different identifier types - - operator unspecified_bool_type() const { return m_value == value_type() ? 0 : unspecified_bool_true; } - bool operator!() const { return m_value == value_type(); } - - // constructors are protected so that class can only be used as a base class - protected: - identifier() {} - explicit identifier( value_type v ) : m_value(v) {} - - #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // 1300 == VC++ 7.0 bug workaround - private: - #endif - T m_value; - }; - - //#ifndef BOOST_NO_SFINAE - - // template - // typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, - // Ostream & >::type operator<<( Ostream & os, const Id & id ) - // { - // return os << id.value(); - // } - - // template - // typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, - // Istream & >::type operator>>( Istream & is, Id & id ) - // { - // typename Id::value_type v; - // is >> v; - // id.value( v ); - // return is; - // } - //#endif - - } // namespace detail -} // namespace boost - -#endif // BOOST_IDENTIFIER_HPP diff --git a/src/vendor/stp/src/boost/detail/indirect_traits.hpp b/src/vendor/stp/src/boost/detail/indirect_traits.hpp deleted file mode 100644 index f9c0cd6a0..000000000 --- a/src/vendor/stp/src/boost/detail/indirect_traits.hpp +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright David Abrahams 2002. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -#ifndef INDIRECT_TRAITS_DWA2002131_HPP -# define INDIRECT_TRAITS_DWA2002131_HPP -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -# include -# include - -# include -# include -# include -# include -# include -# include - -# ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# endif - -namespace boost { namespace detail { - -namespace indirect_traits { - -# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -template -struct is_reference_to_const : mpl::false_ -{ -}; - -template -struct is_reference_to_const : mpl::true_ -{ -}; - -# if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround -template -struct is_reference_to_const : mpl::true_ -{ -}; -# endif - -template -struct is_reference_to_function : mpl::false_ -{ -}; - -template -struct is_reference_to_function : is_function -{ -}; - -template -struct is_pointer_to_function : mpl::false_ -{ -}; - -// There's no such thing as a pointer-to-cv-function, so we don't need -// specializations for those -template -struct is_pointer_to_function : is_function -{ -}; - -template -struct is_reference_to_member_function_pointer_impl : mpl::false_ -{ -}; - -template -struct is_reference_to_member_function_pointer_impl - : is_member_function_pointer::type> -{ -}; - - -template -struct is_reference_to_member_function_pointer - : is_reference_to_member_function_pointer_impl -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T)) -}; - -template -struct is_reference_to_function_pointer_aux - : mpl::and_< - is_reference - , is_pointer_to_function< - typename remove_cv< - typename remove_reference::type - >::type - > - > -{ - // There's no such thing as a pointer-to-cv-function, so we don't need specializations for those -}; - -template -struct is_reference_to_function_pointer - : mpl::if_< - is_reference_to_function - , mpl::false_ - , is_reference_to_function_pointer_aux - >::type -{ -}; - -template -struct is_reference_to_non_const - : mpl::and_< - is_reference - , mpl::not_< - is_reference_to_const - > - > -{ -}; - -template -struct is_reference_to_volatile : mpl::false_ -{ -}; - -template -struct is_reference_to_volatile : mpl::true_ -{ -}; - -# if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround -template -struct is_reference_to_volatile : mpl::true_ -{ -}; -# endif - - -template -struct is_reference_to_pointer : mpl::false_ -{ -}; - -template -struct is_reference_to_pointer : mpl::true_ -{ -}; - -template -struct is_reference_to_pointer : mpl::true_ -{ -}; - -template -struct is_reference_to_pointer : mpl::true_ -{ -}; - -template -struct is_reference_to_pointer : mpl::true_ -{ -}; - -template -struct is_reference_to_class - : mpl::and_< - is_reference - , is_class< - typename remove_cv< - typename remove_reference::type - >::type - > - > -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T)) -}; - -template -struct is_pointer_to_class - : mpl::and_< - is_pointer - , is_class< - typename remove_cv< - typename remove_pointer::type - >::type - > - > -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_class,(T)) -}; - -# else - -using namespace boost::detail::is_function_ref_tester_; - -typedef char (&inner_yes_type)[3]; -typedef char (&inner_no_type)[2]; -typedef char (&outer_no_type)[1]; - -template -struct is_const_help -{ - typedef typename mpl::if_< - is_const - , inner_yes_type - , inner_no_type - >::type type; -}; - -template -struct is_volatile_help -{ - typedef typename mpl::if_< - is_volatile - , inner_yes_type - , inner_no_type - >::type type; -}; - -template -struct is_pointer_help -{ - typedef typename mpl::if_< - is_pointer - , inner_yes_type - , inner_no_type - >::type type; -}; - -template -struct is_class_help -{ - typedef typename mpl::if_< - is_class - , inner_yes_type - , inner_no_type - >::type type; -}; - -template -struct is_reference_to_function_aux -{ - static T t; - BOOST_STATIC_CONSTANT( - bool, value = sizeof(detail::is_function_ref_tester(t,0)) == sizeof(::boost::type_traits::yes_type)); - typedef mpl::bool_ type; - }; - -template -struct is_reference_to_function - : mpl::if_, is_reference_to_function_aux, mpl::bool_ >::type -{ -}; - -template -struct is_pointer_to_function_aux -{ - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = sizeof(::boost::type_traits::is_function_ptr_tester(t)) == sizeof(::boost::type_traits::yes_type)); - typedef mpl::bool_ type; -}; - -template -struct is_pointer_to_function - : mpl::if_, is_pointer_to_function_aux, mpl::bool_ >::type -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_function,(T)) -}; - -struct false_helper1 -{ - template - struct apply : mpl::false_ - { - }; -}; - -template -typename is_const_help::type reference_to_const_helper(V&); -outer_no_type -reference_to_const_helper(...); - -struct true_helper1 -{ - template - struct apply - { - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = sizeof(reference_to_const_helper(t)) == sizeof(inner_yes_type)); - typedef mpl::bool_ type; - }; -}; - -template -struct is_reference_to_const_helper1 : true_helper1 -{ -}; - -template <> -struct is_reference_to_const_helper1 : false_helper1 -{ -}; - - -template -struct is_reference_to_const - : is_reference_to_const_helper1::value>::template apply -{ -}; - - -template -struct is_reference_to_non_const_helper1 -{ - template - struct apply - { - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = sizeof(reference_to_const_helper(t)) == sizeof(inner_no_type)); - - typedef mpl::bool_ type; - }; -}; - -template <> -struct is_reference_to_non_const_helper1 : false_helper1 -{ -}; - - -template -struct is_reference_to_non_const - : is_reference_to_non_const_helper1::value>::template apply -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_non_const,(T)) -}; - - -template -typename is_volatile_help::type reference_to_volatile_helper(V&); -outer_no_type -reference_to_volatile_helper(...); - -template -struct is_reference_to_volatile_helper1 -{ - template - struct apply - { - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = sizeof(reference_to_volatile_helper(t)) == sizeof(inner_yes_type)); - typedef mpl::bool_ type; - }; -}; - -template <> -struct is_reference_to_volatile_helper1 : false_helper1 -{ -}; - - -template -struct is_reference_to_volatile - : is_reference_to_volatile_helper1::value>::template apply -{ -}; - -template -typename is_pointer_help::type reference_to_pointer_helper(V&); -outer_no_type reference_to_pointer_helper(...); - -template -struct reference_to_pointer_impl -{ - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = (sizeof((reference_to_pointer_helper)(t)) == sizeof(inner_yes_type)) - ); - - typedef mpl::bool_ type; -}; - -template -struct is_reference_to_pointer - : mpl::eval_if, reference_to_pointer_impl, mpl::false_>::type -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_pointer,(T)) -}; - -template -struct is_reference_to_function_pointer - : mpl::eval_if, is_pointer_to_function_aux, mpl::false_>::type -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_function_pointer,(T)) -}; - - -template -struct is_member_function_pointer_help - : mpl::if_, inner_yes_type, inner_no_type> -{}; - -template -typename is_member_function_pointer_help::type member_function_pointer_helper(V&); -outer_no_type member_function_pointer_helper(...); - -template -struct is_pointer_to_member_function_aux -{ - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = sizeof((member_function_pointer_helper)(t)) == sizeof(inner_yes_type)); - typedef mpl::bool_ type; -}; - -template -struct is_reference_to_member_function_pointer - : mpl::if_< - is_reference - , is_pointer_to_member_function_aux - , mpl::bool_ - >::type -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T)) -}; - -template -typename is_class_help::type reference_to_class_helper(V const volatile&); -outer_no_type reference_to_class_helper(...); - -template -struct is_reference_to_class -{ - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = (is_reference::value - & (sizeof(reference_to_class_helper(t)) == sizeof(inner_yes_type))) - ); - typedef mpl::bool_ type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T)) -}; - -template -typename is_class_help::type pointer_to_class_helper(V const volatile*); -outer_no_type pointer_to_class_helper(...); - -template -struct is_pointer_to_class -{ - static T t; - BOOST_STATIC_CONSTANT( - bool, value - = (is_pointer::value - && sizeof(pointer_to_class_helper(t)) == sizeof(inner_yes_type)) - ); - typedef mpl::bool_ type; -}; -# endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} - -using namespace indirect_traits; - -}} // namespace boost::python::detail - -#endif // INDIRECT_TRAITS_DWA2002131_HPP diff --git a/src/vendor/stp/src/boost/detail/interlocked.hpp b/src/vendor/stp/src/boost/detail/interlocked.hpp deleted file mode 100644 index fccebc3f7..000000000 --- a/src/vendor/stp/src/boost/detail/interlocked.hpp +++ /dev/null @@ -1,142 +0,0 @@ -#ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED -#define BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// -// boost/detail/interlocked.hpp -// -// Copyright 2005 Peter Dimov -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// - -#include - -#if defined( BOOST_USE_WINDOWS_H ) - -# include - -# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer - -#elif defined(_WIN32_WCE) - -// under Windows CE we still have old-style Interlocked* functions - -extern "C" long __cdecl InterlockedIncrement( long* ); -extern "C" long __cdecl InterlockedDecrement( long* ); -extern "C" long __cdecl InterlockedCompareExchange( long*, long, long ); -extern "C" long __cdecl InterlockedExchange( long*, long ); -extern "C" long __cdecl InterlockedExchangeAdd( long*, long ); - -# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long*)(dest),(long)(exchange))) - -#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN ) - -#if defined( __CLRCALL_PURE_OR_CDECL ) - -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedIncrement( long volatile * ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedDecrement( long volatile * ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedCompareExchange( long volatile *, long, long ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchange( long volatile *, long ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( long volatile *, long ); - -#else - -extern "C" long __cdecl _InterlockedIncrement( long volatile * ); -extern "C" long __cdecl _InterlockedDecrement( long volatile * ); -extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long ); -extern "C" long __cdecl _InterlockedExchange( long volatile *, long ); -extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long ); - -#endif - -# pragma intrinsic( _InterlockedIncrement ) -# pragma intrinsic( _InterlockedDecrement ) -# pragma intrinsic( _InterlockedCompareExchange ) -# pragma intrinsic( _InterlockedExchange ) -# pragma intrinsic( _InterlockedExchangeAdd ) - -# if defined(_M_IA64) || defined(_M_AMD64) - -extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* ); -extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* ); - -# pragma intrinsic( _InterlockedCompareExchangePointer ) -# pragma intrinsic( _InterlockedExchangePointer ) - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer - -# else - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) - -# endif - -# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd - -#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ ) - -namespace boost -{ - -namespace detail -{ - -extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * ); -extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * ); -extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long ); -extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long ); -extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long volatile *, long ); - -} // namespace detail - -} // namespace boost - -# define BOOST_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) - -#else - -# error "Interlocked intrinsics not available" - -#endif - -#endif // #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/is_function_ref_tester.hpp b/src/vendor/stp/src/boost/detail/is_function_ref_tester.hpp deleted file mode 100644 index 5f367ea81..000000000 --- a/src/vendor/stp/src/boost/detail/is_function_ref_tester.hpp +++ /dev/null @@ -1,135 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#if !defined(BOOST_PP_IS_ITERATING) - -///// header body - -#ifndef BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED -#define BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED - -#include "boost/type_traits/detail/yes_no_type.hpp" -#include "boost/type_traits/config.hpp" - -#if defined(BOOST_TT_PREPROCESSING_MODE) -# include "boost/preprocessor/iterate.hpp" -# include "boost/preprocessor/enum_params.hpp" -# include "boost/preprocessor/comma_if.hpp" -#endif - -namespace boost { -namespace detail { -namespace is_function_ref_tester_ { - -template -boost::type_traits::no_type BOOST_TT_DECL is_function_ref_tester(T& ...); - -#if !defined(BOOST_TT_PREPROCESSING_MODE) -// preprocessor-generated part, don't edit by hand! - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24), int); - -#else - -#define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, 25, "boost/type_traits/detail/is_function_ref_tester.hpp")) -#include BOOST_PP_ITERATE() - -#endif // BOOST_TT_PREPROCESSING_MODE - -} // namespace detail -} // namespace python -} // namespace boost - -#endif // BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED - -///// iteration - -#else -#define i BOOST_PP_FRAME_ITERATION(1) - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(BOOST_PP_ENUM_PARAMS(i,T)), int); - -#undef i -#endif // BOOST_PP_IS_ITERATING diff --git a/src/vendor/stp/src/boost/detail/is_incrementable.hpp b/src/vendor/stp/src/boost/detail/is_incrementable.hpp deleted file mode 100644 index 1c8fd5785..000000000 --- a/src/vendor/stp/src/boost/detail/is_incrementable.hpp +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright David Abrahams 2004. Use, modification and distribution is -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -#ifndef IS_INCREMENTABLE_DWA200415_HPP -# define IS_INCREMENTABLE_DWA200415_HPP - -# include -# include -# include -# include -# include - -// Must be the last include -# include - -namespace boost { namespace detail { - -// is_incrementable metafunction -// -// Requires: Given x of type T&, if the expression ++x is well-formed -// it must have complete type; otherwise, it must neither be ambiguous -// nor violate access. - -// This namespace ensures that ADL doesn't mess things up. -namespace is_incrementable_ -{ - // a type returned from operator++ when no increment is found in the - // type's own namespace - struct tag {}; - - // any soaks up implicit conversions and makes the following - // operator++ less-preferred than any other such operator that - // might be found via ADL. - struct any { template any(T const&); }; - - // This is a last-resort operator++ for when none other is found -# if BOOST_WORKAROUND(__GNUC__, == 4) && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2 - -} - -namespace is_incrementable_2 -{ - is_incrementable_::tag operator++(is_incrementable_::any const&); - is_incrementable_::tag operator++(is_incrementable_::any const&,int); -} -using namespace is_incrementable_2; - -namespace is_incrementable_ -{ - -# else - - tag operator++(any const&); - tag operator++(any const&,int); - -# endif - -# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \ - || BOOST_WORKAROUND(BOOST_MSVC, <= 1300) -# define BOOST_comma(a,b) (a) -# else - // In case an operator++ is found that returns void, we'll use ++x,0 - tag operator,(tag,int); -# define BOOST_comma(a,b) (a,b) -# endif - -# if defined(BOOST_MSVC) -# pragma warning(push) -# pragma warning(disable:4913) // Warning about operator, -# endif - - // two check overloads help us identify which operator++ was picked - char (& check(tag) )[2]; - - template - char check(T const&); - - - template - struct impl - { - static typename boost::remove_cv::type& x; - - BOOST_STATIC_CONSTANT( - bool - , value = sizeof(is_incrementable_::check(BOOST_comma(++x,0))) == 1 - ); - }; - - template - struct postfix_impl - { - static typename boost::remove_cv::type& x; - - BOOST_STATIC_CONSTANT( - bool - , value = sizeof(is_incrementable_::check(BOOST_comma(x++,0))) == 1 - ); - }; - -# if defined(BOOST_MSVC) -# pragma warning(pop) -# endif - -} - -# undef BOOST_comma - -template -struct is_incrementable -BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl::value) -{ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::impl::value) - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_incrementable,(T)) -}; - -template -struct is_postfix_incrementable -BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl::value) -{ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::postfix_impl::value) - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_postfix_incrementable,(T)) -}; - -} // namespace detail - -BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_incrementable) -BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_postfix_incrementable) - -} // namespace boost - -# include - -#endif // IS_INCREMENTABLE_DWA200415_HPP diff --git a/src/vendor/stp/src/boost/detail/is_xxx.hpp b/src/vendor/stp/src/boost/detail/is_xxx.hpp deleted file mode 100644 index cb64fb32b..000000000 --- a/src/vendor/stp/src/boost/detail/is_xxx.hpp +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright David Abrahams 2005. Distributed under the Boost -// Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -#ifndef BOOST_DETAIL_IS_XXX_DWA20051011_HPP -# define BOOST_DETAIL_IS_XXX_DWA20051011_HPP - -# include -# include -# include - -# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -# include -# include - -# define BOOST_DETAIL_IS_XXX_DEF(name, qualified_name, nargs) \ -template \ -struct is_##name \ -{ \ - typedef char yes; \ - typedef char (&no)[2]; \ - \ - static typename add_reference::type dummy; \ - \ - struct helpers \ - { \ - template < BOOST_PP_ENUM_PARAMS_Z(1, nargs, class U) > \ - static yes test( \ - qualified_name< BOOST_PP_ENUM_PARAMS_Z(1, nargs, U) >&, int \ - ); \ - \ - template \ - static no test(U&, ...); \ - }; \ - \ - BOOST_STATIC_CONSTANT( \ - bool, value \ - = !is_reference::value \ - & (sizeof(helpers::test(dummy, 0)) == sizeof(yes))); \ - \ - typedef mpl::bool_ type; \ -}; - -# else - -# define BOOST_DETAIL_IS_XXX_DEF(name, qualified_name, nargs) \ -template \ -struct is_##name : mpl::false_ \ -{ \ -}; \ - \ -template < BOOST_PP_ENUM_PARAMS_Z(1, nargs, class T) > \ -struct is_##name< \ - qualified_name< BOOST_PP_ENUM_PARAMS_Z(1, nargs, T) > \ -> \ - : mpl::true_ \ -{ \ -}; - -# endif - -#endif // BOOST_DETAIL_IS_XXX_DWA20051011_HPP diff --git a/src/vendor/stp/src/boost/detail/iterator.hpp b/src/vendor/stp/src/boost/detail/iterator.hpp deleted file mode 100644 index 5bb9c6269..000000000 --- a/src/vendor/stp/src/boost/detail/iterator.hpp +++ /dev/null @@ -1,494 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// Boost versions of -// -// std::iterator_traits<>::iterator_category -// std::iterator_traits<>::difference_type -// std::distance() -// -// ...for all compilers and iterators -// -// Additionally, if X is a pointer -// std::iterator_traits::pointer - -// Otherwise, if partial specialization is supported or X is not a pointer -// std::iterator_traits::value_type -// std::iterator_traits::pointer -// std::iterator_traits::reference -// -// See http://www.boost.org for most recent version including documentation. - -// Revision History -// 04 Mar 2001 - More attempted fixes for Intel C++ (David Abrahams) -// 03 Mar 2001 - Put all implementation into namespace -// boost::detail::iterator_traits_. Some progress made on fixes -// for Intel compiler. (David Abrahams) -// 02 Mar 2001 - Changed BOOST_MSVC to BOOST_MSVC_STD_ITERATOR in a few -// places. (Jeremy Siek) -// 19 Feb 2001 - Improved workarounds for stock MSVC6; use yes_type and -// no_type from type_traits.hpp; stopped trying to remove_cv -// before detecting is_pointer, in honor of the new type_traits -// semantics. (David Abrahams) -// 13 Feb 2001 - Make it work with nearly all standard-conforming iterators -// under raw VC6. The one category remaining which will fail is -// that of iterators derived from std::iterator but not -// boost::iterator and which redefine difference_type. -// 11 Feb 2001 - Clean away code which can never be used (David Abrahams) -// 09 Feb 2001 - Always have a definition for each traits member, even if it -// can't be properly deduced. These will be incomplete types in -// some cases (undefined), but it helps suppress MSVC errors -// elsewhere (David Abrahams) -// 07 Feb 2001 - Support for more of the traits members where possible, making -// this useful as a replacement for std::iterator_traits when -// used as a default template parameter. -// 06 Feb 2001 - Removed useless #includes of standard library headers -// (David Abrahams) - -#ifndef ITERATOR_DWA122600_HPP_ -# define ITERATOR_DWA122600_HPP_ - -# include -# include - -// STLPort 4.0 and betas have a bug when debugging is enabled and there is no -// partial specialization: instead of an iterator_category typedef, the standard -// container iterators have _Iterator_category. -// -// Also, whether debugging is enabled or not, there is a broken specialization -// of std::iterator which has no -// typedefs but iterator_category. -# if defined(__SGI_STL_PORT) - -# if (__SGI_STL_PORT <= 0x410) && !defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && defined(__STL_DEBUG) -# define BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF -# endif - -# define BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION - -# endif // STLPort <= 4.1b4 && no partial specialization - -# if !defined(BOOST_NO_STD_ITERATOR_TRAITS) \ - && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && !defined(BOOST_MSVC_STD_ITERATOR) - -namespace boost { namespace detail { - -// Define a new template so it can be specialized -template -struct iterator_traits - : std::iterator_traits -{}; -using std::distance; - -}} // namespace boost::detail - -# else - -# if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && !defined(BOOST_MSVC_STD_ITERATOR) - -// This is the case where everything conforms except BOOST_NO_STD_ITERATOR_TRAITS - -namespace boost { namespace detail { - -// Rogue Wave Standard Library fools itself into thinking partial -// specialization is missing on some platforms (e.g. Sun), so fails to -// supply iterator_traits! -template -struct iterator_traits -{ - typedef typename Iterator::value_type value_type; - typedef typename Iterator::reference reference; - typedef typename Iterator::pointer pointer; - typedef typename Iterator::difference_type difference_type; - typedef typename Iterator::iterator_category iterator_category; -}; - -template -struct iterator_traits -{ - typedef T value_type; - typedef T& reference; - typedef T* pointer; - typedef std::ptrdiff_t difference_type; - typedef std::random_access_iterator_tag iterator_category; -}; - -template -struct iterator_traits -{ - typedef T value_type; - typedef T const& reference; - typedef T const* pointer; - typedef std::ptrdiff_t difference_type; - typedef std::random_access_iterator_tag iterator_category; -}; - -}} // namespace boost::detail - -# else - -# include -# include -# include - -# ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# include -# endif -# ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION -# include -# endif - -# include -# include -# include - -// should be the last #include -# include "boost/type_traits/detail/bool_trait_def.hpp" - -namespace boost { namespace detail { - -BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type) -BOOST_MPL_HAS_XXX_TRAIT_DEF(reference) -BOOST_MPL_HAS_XXX_TRAIT_DEF(pointer) -BOOST_MPL_HAS_XXX_TRAIT_DEF(difference_type) -BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator_category) - -// is_mutable_iterator -- -// -// A metafunction returning true iff T is a mutable iterator type -// with a nested value_type. Will only work portably with iterators -// whose operator* returns a reference, but that seems to be OK for -// the iterators supplied by Dinkumware. Some input iterators may -// compile-time if they arrive here, and if the compiler is strict -// about not taking the address of an rvalue. - -// This one detects ordinary mutable iterators - the result of -// operator* is convertible to the value_type. -template -type_traits::yes_type is_mutable_iterator_helper(T const*, BOOST_DEDUCED_TYPENAME T::value_type*); - -// Since you can't take the address of an rvalue, the guts of -// is_mutable_iterator_impl will fail if we use &*t directly. This -// makes sure we can still work with non-lvalue iterators. -template T* mutable_iterator_lvalue_helper(T& x); -int mutable_iterator_lvalue_helper(...); - - -// This one detects output iterators such as ostream_iterator which -// return references to themselves. -template -type_traits::yes_type is_mutable_iterator_helper(T const*, T const*); - -type_traits::no_type is_mutable_iterator_helper(...); - -template -struct is_mutable_iterator_impl -{ - static T t; - - BOOST_STATIC_CONSTANT( - bool, value = sizeof( - detail::is_mutable_iterator_helper( - (T*)0 - , mutable_iterator_lvalue_helper(*t) // like &*t - )) - == sizeof(type_traits::yes_type) - ); -}; - -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_mutable_iterator,T,::boost::detail::is_mutable_iterator_impl::value) - - -// is_full_iterator_traits -- -// -// A metafunction returning true iff T has all the requisite nested -// types to satisfy the requirements for a fully-conforming -// iterator_traits implementation. -template -struct is_full_iterator_traits_impl -{ - enum { value = - has_value_type::value - & has_reference::value - & has_pointer::value - & has_difference_type::value - & has_iterator_category::value - }; -}; - -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_full_iterator_traits,T,::boost::detail::is_full_iterator_traits_impl::value) - - -# ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF -BOOST_MPL_HAS_XXX_TRAIT_DEF(_Iterator_category) - -// is_stlport_40_debug_iterator -- -// -// A metafunction returning true iff T has all the requisite nested -// types to satisfy the requirements of an STLPort 4.0 debug iterator -// iterator_traits implementation. -template -struct is_stlport_40_debug_iterator_impl -{ - enum { value = - has_value_type::value - & has_reference::value - & has_pointer::value - & has_difference_type::value - & has__Iterator_category::value - }; -}; - -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_stlport_40_debug_iterator,T,::boost::detail::is_stlport_40_debug_iterator_impl::value) - -template -struct stlport_40_debug_iterator_traits -{ - typedef typename T::value_type value_type; - typedef typename T::reference reference; - typedef typename T::pointer pointer; - typedef typename T::difference_type difference_type; - typedef typename T::_Iterator_category iterator_category; -}; -# endif // BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF - -template struct pointer_iterator_traits; - -# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -template -struct pointer_iterator_traits -{ - typedef typename remove_const::type value_type; - typedef T* pointer; - typedef T& reference; - typedef std::random_access_iterator_tag iterator_category; - typedef std::ptrdiff_t difference_type; -}; -# else - -// In case of no template partial specialization, and if T is a -// pointer, iterator_traits::value_type can still be computed. For -// some basic types, remove_pointer is manually defined in -// type_traits/broken_compiler_spec.hpp. For others, do it yourself. - -template class please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee; - -template -struct pointer_value_type - : mpl::if_< - is_same::type> - , please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee

- , typename remove_const< - typename remove_pointer

::type - >::type - > -{ -}; - - -template -struct pointer_reference - : mpl::if_< - is_same::type> - , please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee

- , typename remove_pointer

::type& - > -{ -}; - -template -struct pointer_iterator_traits -{ - typedef T pointer; - typedef std::random_access_iterator_tag iterator_category; - typedef std::ptrdiff_t difference_type; - - typedef typename pointer_value_type::type value_type; - typedef typename pointer_reference::type reference; -}; - -# endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -// We'll sort iterator types into one of these classifications, from which we -// can determine the difference_type, pointer, reference, and value_type -template -struct standard_iterator_traits -{ - typedef typename Iterator::difference_type difference_type; - typedef typename Iterator::value_type value_type; - typedef typename Iterator::pointer pointer; - typedef typename Iterator::reference reference; - typedef typename Iterator::iterator_category iterator_category; -}; - -template -struct msvc_stdlib_mutable_traits - : std::iterator_traits -{ - typedef typename std::iterator_traits::distance_type difference_type; - typedef typename std::iterator_traits::value_type* pointer; - typedef typename std::iterator_traits::value_type& reference; -}; - -template -struct msvc_stdlib_const_traits - : std::iterator_traits -{ - typedef typename std::iterator_traits::distance_type difference_type; - typedef const typename std::iterator_traits::value_type* pointer; - typedef const typename std::iterator_traits::value_type& reference; -}; - -# ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION -template -struct is_bad_output_iterator - : is_base_and_derived< - std::iterator - , Iterator> -{ -}; - -struct bad_output_iterator_traits -{ - typedef void value_type; - typedef void difference_type; - typedef std::output_iterator_tag iterator_category; - typedef void pointer; - typedef void reference; -}; -# endif - -// If we're looking at an MSVC6 (old Dinkumware) ``standard'' -// iterator, this will generate an appropriate traits class. -template -struct msvc_stdlib_iterator_traits - : mpl::if_< - is_mutable_iterator - , msvc_stdlib_mutable_traits - , msvc_stdlib_const_traits - >::type -{}; - -template -struct non_pointer_iterator_traits - : mpl::if_< - // if the iterator contains all the right nested types... - is_full_iterator_traits - // Use a standard iterator_traits implementation - , standard_iterator_traits -# ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF - // Check for STLPort 4.0 broken _Iterator_category type - , mpl::if_< - is_stlport_40_debug_iterator - , stlport_40_debug_iterator_traits -# endif - // Otherwise, assume it's a Dinkum iterator - , msvc_stdlib_iterator_traits -# ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF - >::type -# endif - >::type -{ -}; - -template -struct iterator_traits_aux - : mpl::if_< - is_pointer - , pointer_iterator_traits - , non_pointer_iterator_traits - >::type -{ -}; - -template -struct iterator_traits -{ - // Explicit forwarding from base class needed to keep MSVC6 happy - // under some circumstances. - private: -# ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION - typedef - typename mpl::if_< - is_bad_output_iterator - , bad_output_iterator_traits - , iterator_traits_aux - >::type base; -# else - typedef iterator_traits_aux base; -# endif - public: - typedef typename base::value_type value_type; - typedef typename base::pointer pointer; - typedef typename base::reference reference; - typedef typename base::difference_type difference_type; - typedef typename base::iterator_category iterator_category; -}; - -// This specialization cuts off ETI (Early Template Instantiation) for MSVC. -template <> struct iterator_traits -{ - typedef int value_type; - typedef int pointer; - typedef int reference; - typedef int difference_type; - typedef int iterator_category; -}; - -}} // namespace boost::detail - -# endif // workarounds - -namespace boost { namespace detail { - -namespace iterator_traits_ -{ - template - struct distance_select - { - static Difference execute(Iterator i1, const Iterator i2, ...) - { - Difference result = 0; - while (i1 != i2) - { - ++i1; - ++result; - } - return result; - } - - static Difference execute(Iterator i1, const Iterator i2, std::random_access_iterator_tag*) - { - return i2 - i1; - } - }; -} // namespace boost::detail::iterator_traits_ - -template -inline typename iterator_traits::difference_type -distance(Iterator first, Iterator last) -{ - typedef typename iterator_traits::difference_type diff_t; - typedef typename ::boost::detail::iterator_traits::iterator_category iterator_category; - - return iterator_traits_::distance_select::execute( - first, last, (iterator_category*)0); -} - -}} - -# endif - - -# undef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF -# undef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION - -#endif // ITERATOR_DWA122600_HPP_ diff --git a/src/vendor/stp/src/boost/detail/lcast_precision.hpp b/src/vendor/stp/src/boost/detail/lcast_precision.hpp deleted file mode 100644 index 93abce18c..000000000 --- a/src/vendor/stp/src/boost/detail/lcast_precision.hpp +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright Alexander Nasonov & Paul A. Bristow 2006. - -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt -// or copy at http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED -#define BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED - -#include -#include -#include - -#include -#include - -#ifndef BOOST_NO_IS_ABSTRACT -// Fix for SF:1358600 - lexical_cast & pure virtual functions & VC 8 STL -#include -#include -#endif - -#if defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) || \ - (defined(BOOST_MSVC) && (BOOST_MSVC<1310)) - -#define BOOST_LCAST_NO_COMPILE_TIME_PRECISION -#endif - -#ifdef BOOST_LCAST_NO_COMPILE_TIME_PRECISION -#include -#else -#include -#endif - -namespace boost { namespace detail { - -class lcast_abstract_stub {}; - -#ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION -// Calculate an argument to pass to std::ios_base::precision from -// lexical_cast. See alternative implementation for broken standard -// libraries in lcast_get_precision below. Keep them in sync, please. -template -struct lcast_precision -{ -#ifdef BOOST_NO_IS_ABSTRACT - typedef std::numeric_limits limits; // No fix for SF:1358600. -#else - typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_< - boost::is_abstract - , std::numeric_limits - , std::numeric_limits - >::type limits; -#endif - - BOOST_STATIC_CONSTANT(bool, use_default_precision = - !limits::is_specialized || limits::is_exact - ); - - BOOST_STATIC_CONSTANT(bool, is_specialized_bin = - !use_default_precision && - limits::radix == 2 && limits::digits > 0 - ); - - BOOST_STATIC_CONSTANT(bool, is_specialized_dec = - !use_default_precision && - limits::radix == 10 && limits::digits10 > 0 - ); - - BOOST_STATIC_CONSTANT(std::streamsize, streamsize_max = - boost::integer_traits::const_max - ); - - BOOST_STATIC_CONSTANT(unsigned int, precision_dec = limits::digits10 + 1U); - - BOOST_STATIC_ASSERT(!is_specialized_dec || - precision_dec <= streamsize_max + 0UL - ); - - BOOST_STATIC_CONSTANT(unsigned long, precision_bin = - 2UL + limits::digits * 30103UL / 100000UL - ); - - BOOST_STATIC_ASSERT(!is_specialized_bin || - (limits::digits + 0UL < ULONG_MAX / 30103UL && - precision_bin > limits::digits10 + 0UL && - precision_bin <= streamsize_max + 0UL) - ); - - BOOST_STATIC_CONSTANT(std::streamsize, value = - is_specialized_bin ? precision_bin - : is_specialized_dec ? precision_dec : 6 - ); -}; -#endif - -template -inline std::streamsize lcast_get_precision(T* = 0) -{ -#ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION - return lcast_precision::value; -#else // Follow lcast_precision algorithm at run-time: - -#ifdef BOOST_NO_IS_ABSTRACT - typedef std::numeric_limits limits; // No fix for SF:1358600. -#else - typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_< - boost::is_abstract - , std::numeric_limits - , std::numeric_limits - >::type limits; -#endif - - bool const use_default_precision = - !limits::is_specialized || limits::is_exact; - - if(!use_default_precision) - { // Includes all built-in floating-point types, float, double ... - // and UDT types for which digits (significand bits) is defined (not zero) - - bool const is_specialized_bin = - limits::radix == 2 && limits::digits > 0; - bool const is_specialized_dec = - limits::radix == 10 && limits::digits10 > 0; - std::streamsize const streamsize_max = - (boost::integer_traits::max)(); - - if(is_specialized_bin) - { // Floating-point types with - // limits::digits defined by the specialization. - - unsigned long const digits = limits::digits; - unsigned long const precision = 2UL + digits * 30103UL / 100000UL; - // unsigned long is selected because it is at least 32-bits - // and thus ULONG_MAX / 30103UL is big enough for all types. - BOOST_ASSERT( - digits < ULONG_MAX / 30103UL && - precision > limits::digits10 + 0UL && - precision <= streamsize_max + 0UL - ); - return precision; - } - else if(is_specialized_dec) - { // Decimal Floating-point type, most likely a User Defined Type - // rather than a real floating-point hardware type. - unsigned int const precision = limits::digits10 + 1U; - BOOST_ASSERT(precision <= streamsize_max + 0UL); - return precision; - } - } - - // Integral type (for which precision has no effect) - // or type T for which limits is NOT specialized, - // so assume stream precision remains the default 6 decimal digits. - // Warning: if your User-defined Floating-point type T is NOT specialized, - // then you may lose accuracy by only using 6 decimal digits. - // To avoid this, you need to specialize T with either - // radix == 2 and digits == the number of significand bits, - // OR - // radix = 10 and digits10 == the number of decimal digits. - - return 6; -#endif -} - -template -inline void lcast_set_precision(std::ios_base& stream, T*) -{ - stream.precision(lcast_get_precision()); -} - -template -inline void lcast_set_precision(std::ios_base& stream, Source*, Target*) -{ - std::streamsize const s = lcast_get_precision(static_cast(0)); - std::streamsize const t = lcast_get_precision(static_cast(0)); - stream.precision(s > t ? s : t); -} - -}} - -#endif // BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/detail/lightweight_mutex.hpp b/src/vendor/stp/src/boost/detail/lightweight_mutex.hpp deleted file mode 100644 index b7a7f6dd4..000000000 --- a/src/vendor/stp/src/boost/detail/lightweight_mutex.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED -#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// -// boost/detail/lightweight_mutex.hpp - lightweight mutex -// -// Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd. -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -// - -#include - -#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/lightweight_test.hpp b/src/vendor/stp/src/boost/detail/lightweight_test.hpp deleted file mode 100644 index ffa750d32..000000000 --- a/src/vendor/stp/src/boost/detail/lightweight_test.hpp +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP_INCLUDED -#define BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// -// boost/detail/lightweight_test.hpp - lightweight test library -// -// Copyright (c) 2002, 2009 Peter Dimov -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -// -// BOOST_TEST(expression) -// BOOST_ERROR(message) -// BOOST_TEST_EQ(expr1, expr2) -// -// int boost::report_errors() -// - -#include -#include - -namespace boost -{ - -namespace detail -{ - -inline int & test_errors() -{ - static int x = 0; - return x; -} - -inline void test_failed_impl(char const * expr, char const * file, int line, char const * function) -{ - std::cerr << file << "(" << line << "): test '" << expr << "' failed in function '" << function << "'" << std::endl; - ++test_errors(); -} - -inline void error_impl(char const * msg, char const * file, int line, char const * function) -{ - std::cerr << file << "(" << line << "): " << msg << " in function '" << function << "'" << std::endl; - ++test_errors(); -} - -template inline void test_eq_impl( char const * expr1, char const * expr2, char const * file, int line, char const * function, T const & t, U const & u ) -{ - if( t == u ) - { - } - else - { - std::cerr << file << "(" << line << "): test '" << expr1 << " == " << expr2 - << "' failed in function '" << function << "': " - << "'" << t << "' != '" << u << "'" << std::endl; - ++test_errors(); - } -} - -} // namespace detail - -inline int report_errors() -{ - int errors = detail::test_errors(); - - if( errors == 0 ) - { - std::cerr << "No errors detected." << std::endl; - return 0; - } - else - { - std::cerr << errors << " error" << (errors == 1? "": "s") << " detected." << std::endl; - return 1; - } -} - -} // namespace boost - -#define BOOST_TEST(expr) ((expr)? (void)0: ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION)) -#define BOOST_ERROR(msg) ::boost::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) -#define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) ) - -#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/lightweight_thread.hpp b/src/vendor/stp/src/boost/detail/lightweight_thread.hpp deleted file mode 100644 index 6fe70a613..000000000 --- a/src/vendor/stp/src/boost/detail/lightweight_thread.hpp +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED -#define BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// boost/detail/lightweight_thread.hpp -// -// Copyright (c) 2002 Peter Dimov and Multi Media Ltd. -// Copyright (c) 2008 Peter Dimov -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt - -#include -#include -#include - -// pthread_create, pthread_join - -#if defined( BOOST_HAS_PTHREADS ) - -#include - -#else - -#include -#include - -typedef HANDLE pthread_t; - -int pthread_create( pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg ) -{ - HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 ); - - if( h != 0 ) - { - *thread = h; - return 0; - } - else - { - return EAGAIN; - } -} - -int pthread_join( pthread_t thread, void ** /*value_ptr*/ ) -{ - ::WaitForSingleObject( thread, INFINITE ); - ::CloseHandle( thread ); - return 0; -} - -#endif - -// template int lw_thread_create( pthread_t & pt, F f ); - -namespace boost -{ - -namespace detail -{ - -class lw_abstract_thread -{ -public: - - virtual ~lw_abstract_thread() {} - virtual void run() = 0; -}; - -#if defined( BOOST_HAS_PTHREADS ) - -extern "C" void * lw_thread_routine( void * pv ) -{ - std::auto_ptr pt( static_cast( pv ) ); - - pt->run(); - - return 0; -} - -#else - -unsigned __stdcall lw_thread_routine( void * pv ) -{ - std::auto_ptr pt( static_cast( pv ) ); - - pt->run(); - - return 0; -} - -#endif - -template class lw_thread_impl: public lw_abstract_thread -{ -public: - - explicit lw_thread_impl( F f ): f_( f ) - { - } - - void run() - { - f_(); - } - -private: - - F f_; -}; - -template int lw_thread_create( pthread_t & pt, F f ) -{ - std::auto_ptr p( new lw_thread_impl( f ) ); - - int r = pthread_create( &pt, 0, lw_thread_routine, p.get() ); - - if( r == 0 ) - { - p.release(); - } - - return r; -} - -} // namespace detail -} // namespace boost - -#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/limits.hpp b/src/vendor/stp/src/boost/detail/limits.hpp deleted file mode 100644 index 6f018dfac..000000000 --- a/src/vendor/stp/src/boost/detail/limits.hpp +++ /dev/null @@ -1,449 +0,0 @@ -// Copyright 2001 John Maddock -// Distributed under the Boost Software License, Version 1.0. (See accompany- -// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -/* - * Copyright (c) 1997 - * Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. Silicon Graphics makes no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - */ - -/* NOTE: This is not portable code. Parts of numeric_limits<> are - * inherently machine-dependent, and this file is written for the MIPS - * architecture and the SGI MIPSpro C++ compiler. Parts of it (in - * particular, some of the characteristics of floating-point types) - * are almost certainly incorrect for any other platform. - */ - -/* The above comment is almost certainly out of date. This file works - * on systems other than SGI MIPSpro C++ now. - */ - -/* - * Revision history: - * 21 Sep 2001: - * Only include if BOOST_NO_CWCHAR is defined. (Darin Adler) - * 10 Aug 2001: - * Added MIPS (big endian) to the big endian family. (Jens Maurer) - * 13 Apr 2001: - * Added powerpc to the big endian family. (Jeremy Siek) - * 5 Apr 2001: - * Added sparc (big endian) processor support (John Maddock). - * Initial sub: - * Modified by Jens Maurer for gcc 2.95 on x86. - */ - -#ifndef BOOST_SGI_CPP_LIMITS -#define BOOST_SGI_CPP_LIMITS - -#include -#include -#include -#include - -#ifndef BOOST_NO_CWCHAR -#include // for WCHAR_MIN and WCHAR_MAX -#endif - -namespace std { - -enum float_round_style { - round_indeterminate = -1, - round_toward_zero = 0, - round_to_nearest = 1, - round_toward_infinity = 2, - round_toward_neg_infinity = 3 -}; - -enum float_denorm_style { - denorm_indeterminate = -1, - denorm_absent = 0, - denorm_present = 1 -}; - -// The C++ standard (section 18.2.1) requires that some of the members of -// numeric_limits be static const data members that are given constant- -// initializers within the class declaration. On compilers where the -// BOOST_NO_INCLASS_MEMBER_INITIALIZATION macro is defined, it is impossible to write -// a standard-conforming numeric_limits class. -// -// There are two possible workarounds: either initialize the data -// members outside the class, or change them from data members to -// enums. Neither workaround is satisfactory: the former makes it -// impossible to use the data members in constant-expressions, and the -// latter means they have the wrong type and that it is impossible to -// take their addresses. We choose the former workaround. - -#ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -# define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ - enum { __mem_name = __mem_value } -#else /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */ -# define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ - static const __mem_type __mem_name = __mem_value -#endif /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */ - -// Base class for all specializations of numeric_limits. -template -class _Numeric_limits_base { -public: - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, false); - - static __number min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __number(); } - static __number max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __number(); } - - BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, 0); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, 0); - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact, false); - - BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 0); - - static __number epsilon() throw() { return __number(); } - static __number round_error() throw() { return __number(); } - - BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent, 0); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, 0); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent, 0); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, 0); - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style, - has_denorm, - denorm_absent); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); - - static __number infinity() throw() { return __number(); } - static __number quiet_NaN() throw() { return __number(); } - static __number signaling_NaN() throw() { return __number(); } - static __number denorm_min() throw() { return __number(); } - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, false); - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); - BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style, - round_style, - round_toward_zero); -}; - -// Base class for integers. - -template -class _Integer_limits : public _Numeric_limits_base<_Int> -{ -public: - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); - - static _Int min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __imin; } - static _Int max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __imax; } - - BOOST_STL_DECLARE_LIMITS_MEMBER(int, - digits, - (__idigits < 0) ? (int)(sizeof(_Int) * CHAR_BIT) - - (__imin == 0 ? 0 : 1) - : __idigits); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, (digits * 301) / 1000); - // log 2 = 0.301029995664... - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, __imin != 0); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, true); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact, true); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 2); - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, true); -}; - -#if defined(BOOST_BIG_ENDIAN) - - template - struct float_helper{ - static Number get_word() throw() { - // sizeof(long double) == 16 - const unsigned int _S_word[4] = { Word, 0, 0, 0 }; - return *reinterpret_cast(&_S_word); - } -}; - -#else - - template - struct float_helper{ - static Number get_word() throw() { - // sizeof(long double) == 12, but only 10 bytes significant - const unsigned int _S_word[4] = { 0, 0, 0, Word }; - return *reinterpret_cast( - reinterpret_cast(&_S_word)+16- - (sizeof(Number) == 12 ? 10 : sizeof(Number))); - } -}; - -#endif - -// Base class for floating-point numbers. -template -class _Floating_limits : public _Numeric_limits_base<__number> -{ -public: - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); - - BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, __Digits); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, __Digits10); - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, true); - - BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 2); - - BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent, __MinExp); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent, __MaxExp); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, __MinExp10); - BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, __MaxExp10); - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, true); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, true); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, true); - BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style, - has_denorm, - denorm_indeterminate); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); - - - static __number infinity() throw() { - return float_helper<__number, __InfinityWord>::get_word(); - } - static __number quiet_NaN() throw() { - return float_helper<__number,__QNaNWord>::get_word(); - } - static __number signaling_NaN() throw() { - return float_helper<__number,__SNaNWord>::get_word(); - } - - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, __IsIEC559); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps, false /* was: true */ ); - BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); - - BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, __RoundStyle); -}; - -// Class numeric_limits - -// The unspecialized class. - -template -class numeric_limits : public _Numeric_limits_base {}; - -// Specializations for all built-in integral types. - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -#ifndef BOOST_NO_INTRINSIC_WCHAR_T -template<> -class numeric_limits -#if !defined(WCHAR_MAX) || !defined(WCHAR_MIN) -#if defined(_WIN32) || defined(__CYGWIN__) - : public _Integer_limits -#elif defined(__hppa) -// wchar_t has "unsigned int" as the underlying type - : public _Integer_limits -#else -// assume that wchar_t has "int" as the underlying type - : public _Integer_limits -#endif -#else -// we have WCHAR_MIN and WCHAR_MAX defined, so use it - : public _Integer_limits -#endif -{}; -#endif - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -template<> -class numeric_limits - : public _Integer_limits -{}; - -#ifdef __GNUC__ - -// Some compilers have long long, but don't define the -// LONGLONG_MIN and LONGLONG_MAX macros in limits.h. This -// assumes that long long is 64 bits. -#if !defined(LONGLONG_MAX) && !defined(ULONGLONG_MAX) - -# define ULONGLONG_MAX 0xffffffffffffffffLLU -# define LONGLONG_MAX 0x7fffffffffffffffLL - -#endif - -#if !defined(LONGLONG_MIN) -# define LONGLONG_MIN (-LONGLONG_MAX - 1) -#endif - - -#if !defined(ULONGLONG_MIN) -# define ULONGLONG_MIN 0 -#endif - -#endif /* __GNUC__ */ - -// Specializations for all built-in floating-point type. - -template<> class numeric_limits - : public _Floating_limits -{ -public: - static float min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return FLT_MIN; } - static float denorm_min() throw() { return FLT_MIN; } - static float max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return FLT_MAX; } - static float epsilon() throw() { return FLT_EPSILON; } - static float round_error() throw() { return 0.5f; } // Units: ulps. -}; - -template<> class numeric_limits - : public _Floating_limits -{ -public: - static double min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return DBL_MIN; } - static double denorm_min() throw() { return DBL_MIN; } - static double max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return DBL_MAX; } - static double epsilon() throw() { return DBL_EPSILON; } - static double round_error() throw() { return 0.5; } // Units: ulps. -}; - -template<> class numeric_limits - : public _Floating_limits -{ -public: - static long double min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return LDBL_MIN; } - static long double denorm_min() throw() { return LDBL_MIN; } - static long double max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return LDBL_MAX; } - static long double epsilon() throw() { return LDBL_EPSILON; } - static long double round_error() throw() { return 4; } // Units: ulps. -}; - -} // namespace std - -#endif /* BOOST_SGI_CPP_LIMITS */ - -// Local Variables: -// mode:C++ -// End: - - - diff --git a/src/vendor/stp/src/boost/detail/named_template_params.hpp b/src/vendor/stp/src/boost/detail/named_template_params.hpp deleted file mode 100644 index e7cb07943..000000000 --- a/src/vendor/stp/src/boost/detail/named_template_params.hpp +++ /dev/null @@ -1,177 +0,0 @@ -// (C) Copyright Jeremy Siek 2001. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// Revision History: - -// 04 Oct 2001 David Abrahams -// Changed name of "bind" to "select" to avoid problems with MSVC. - -#ifndef BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP -#define BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP - -#include -#include // for is_reference -#if defined(__BORLANDC__) -#include -#endif - -namespace boost { - namespace detail { - - struct default_argument { }; - - struct dummy_default_gen { - template - struct select { - typedef default_argument type; - }; - }; - - // This class template is a workaround for MSVC. - template struct default_generator { - typedef detail::dummy_default_gen type; - }; - - template struct is_default { - enum { value = false }; - typedef type_traits::no_type type; - }; - template <> struct is_default { - enum { value = true }; - typedef type_traits::yes_type type; - }; - - struct choose_default { - template - struct select { - typedef typename default_generator::type Gen; - typedef typename Gen::template select::type type; - }; - }; - struct choose_arg { - template - struct select { - typedef Arg type; - }; - }; - -#if defined(__BORLANDC__) - template - struct choose_arg_or_default { typedef choose_arg type; }; - template <> - struct choose_arg_or_default { - typedef choose_default type; - }; -#else - template - struct choose_arg_or_default { typedef choose_arg type; }; - template <> - struct choose_arg_or_default { - typedef choose_default type; - }; -#endif - - template - class resolve_default { -#if defined(__BORLANDC__) - typedef typename choose_arg_or_default::type>::type Selector; -#else - // This usually works for Borland, but I'm seeing weird errors in - // iterator_adaptor_test.cpp when using this method. - enum { is_def = is_default::value }; - typedef typename choose_arg_or_default::type Selector; -#endif - public: - typedef typename Selector - ::template select::type type; - }; - - // To differentiate an unnamed parameter from a traits generator - // we use is_convertible. - struct named_template_param_base { }; - - template - struct is_named_param_list { - enum { value = is_convertible::value }; - }; - - struct choose_named_params { - template struct select { typedef Prev type; }; - }; - struct choose_default_arg { - template struct select { - typedef detail::default_argument type; - }; - }; - - template struct choose_default_dispatch_; - template <> struct choose_default_dispatch_ { - typedef choose_named_params type; - }; - template <> struct choose_default_dispatch_ { - typedef choose_default_arg type; - }; - // The use of inheritance here is a Solaris Forte 6 workaround. - template struct choose_default_dispatch - : public choose_default_dispatch_ { }; - - template - struct choose_default_argument { - enum { is_named = is_named_param_list::value }; - typedef typename choose_default_dispatch::type Selector; - typedef typename Selector::template select::type type; - }; - - // This macro assumes that there is a class named default_##TYPE - // defined before the application of the macro. This class should - // have a single member class template named "select" with two - // template parameters: the type of the class being created (e.g., - // the iterator_adaptor type when creating iterator adaptors) and - // a traits class. The select class should have a single typedef - // named "type" that produces the default for TYPE. See - // boost/iterator_adaptors.hpp for an example usage. Also, - // applications of this macro must be placed in namespace - // boost::detail. - -#define BOOST_NAMED_TEMPLATE_PARAM(TYPE) \ - struct get_##TYPE##_from_named { \ - template \ - struct select { \ - typedef typename NamedParams::traits NamedTraits; \ - typedef typename NamedTraits::TYPE TYPE; \ - typedef typename resolve_default::type type; \ - }; \ - }; \ - struct pass_thru_##TYPE { \ - template struct select { \ - typedef typename resolve_default::type type; \ - };\ - }; \ - template \ - struct get_##TYPE##_dispatch { }; \ - template <> struct get_##TYPE##_dispatch<1> { \ - typedef get_##TYPE##_from_named type; \ - }; \ - template <> struct get_##TYPE##_dispatch<0> { \ - typedef pass_thru_##TYPE type; \ - }; \ - template \ - class get_##TYPE { \ - enum { is_named = is_named_param_list::value }; \ - typedef typename get_##TYPE##_dispatch::type Selector; \ - public: \ - typedef typename Selector::template select::type type; \ - }; \ - template <> struct default_generator { \ - typedef default_##TYPE type; \ - } - - - } // namespace detail -} // namespace boost - -#endif // BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP diff --git a/src/vendor/stp/src/boost/detail/no_exceptions_support.hpp b/src/vendor/stp/src/boost/detail/no_exceptions_support.hpp deleted file mode 100644 index d94e35834..000000000 --- a/src/vendor/stp/src/boost/detail/no_exceptions_support.hpp +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef BOOST_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP_ -#define BOOST_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP_ - -#if (defined _MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif - -//---------------------------------------------------------------------- -// (C) Copyright 2004 Pavel Vozenilek. -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt -// or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// -// This file contains helper macros used when exception support may be -// disabled (as indicated by macro BOOST_NO_EXCEPTIONS). -// -// Before picking up these macros you may consider using RAII techniques -// to deal with exceptions - their syntax can be always the same with -// or without exception support enabled. -// - -/* Example of use: - -void foo() { - BOOST_TRY { - ... - } BOOST_CATCH(const std::bad_alloc&) { - ... - BOOST_RETHROW - } BOOST_CATCH(const std::exception& e) { - ... - } - BOOST_CATCH_END -} - -With exception support enabled it will expand into: - -void foo() { - { try { - ... - } catch (const std::bad_alloc&) { - ... - throw; - } catch (const std::exception& e) { - ... - } - } -} - -With exception support disabled it will expand into: - -void foo() { - { if(true) { - ... - } else if (false) { - ... - } else if (false) { - ... - } - } -} -*/ -//---------------------------------------------------------------------- - -#include -#include - -#if !(defined BOOST_NO_EXCEPTIONS) -# define BOOST_TRY { try -# define BOOST_CATCH(x) catch(x) -# define BOOST_RETHROW throw; -# define BOOST_CATCH_END } -#else -# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# define BOOST_TRY { if ("") -# define BOOST_CATCH(x) else if (!"") -# else -# define BOOST_TRY { if (true) -# define BOOST_CATCH(x) else if (false) -# endif -# define BOOST_RETHROW -# define BOOST_CATCH_END } -#endif - - -#endif diff --git a/src/vendor/stp/src/boost/detail/none_t.hpp b/src/vendor/stp/src/boost/detail/none_t.hpp deleted file mode 100644 index 76ba97a02..000000000 --- a/src/vendor/stp/src/boost/detail/none_t.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003, Fernando Luis Cacciola Carballal. -// -// Use, modification, and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/lib/optional for documentation. -// -// You are welcome to contact the author at: -// fernando_cacciola@hotmail.com -// -#ifndef BOOST_DETAIL_NONE_T_17SEP2003_HPP -#define BOOST_DETAIL_NONE_T_17SEP2003_HPP - -namespace boost { - -namespace detail { - -struct none_helper{}; - -typedef int none_helper::*none_t ; - -} // namespace detail - -} // namespace boost - -#endif - diff --git a/src/vendor/stp/src/boost/detail/numeric_traits.hpp b/src/vendor/stp/src/boost/detail/numeric_traits.hpp deleted file mode 100644 index 6325d70cb..000000000 --- a/src/vendor/stp/src/boost/detail/numeric_traits.hpp +++ /dev/null @@ -1,191 +0,0 @@ -// (C) Copyright David Abrahams 2001, Howard Hinnant 2001. -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// Template class numeric_traits -- -// -// Supplies: -// -// typedef difference_type -- a type used to represent the difference -// between any two values of Number. -// -// Support: -// 1. Not all specializations are supplied -// -// 2. Use of specializations that are not supplied will cause a -// compile-time error -// -// 3. Users are free to specialize numeric_traits for any type. -// -// 4. Right now, specializations are only supplied for integer types. -// -// 5. On implementations which do not supply compile-time constants in -// std::numeric_limits<>, only specializations for built-in integer types -// are supplied. -// -// 6. Handling of numbers whose range of representation is at least as -// great as boost::intmax_t can cause some differences to be -// unrepresentable in difference_type: -// -// Number difference_type -// ------ --------------- -// signed Number -// unsigned intmax_t -// -// template typename numeric_traits::difference_type -// numeric_distance(Number x, Number y) -// computes (y - x), attempting to avoid overflows. -// - -// See http://www.boost.org for most recent version including documentation. - -// Revision History -// 11 Feb 2001 - Use BOOST_STATIC_CONSTANT (David Abrahams) -// 11 Feb 2001 - Rolled back ineffective Borland-specific code -// (David Abrahams) -// 10 Feb 2001 - Rolled in supposed Borland fixes from John Maddock, but -// not seeing any improvement yet (David Abrahams) -// 06 Feb 2001 - Factored if_true out into boost/detail/select_type.hpp -// (David Abrahams) -// 23 Jan 2001 - Fixed logic of difference_type selection, which was -// completely wack. In the process, added digit_traits<> -// to compute the number of digits in intmax_t even when -// not supplied by numeric_limits<>. (David Abrahams) -// 21 Jan 2001 - Created (David Abrahams) - -#ifndef BOOST_NUMERIC_TRAITS_HPP_DWA20001901 -# define BOOST_NUMERIC_TRAITS_HPP_DWA20001901 - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace detail { - - // Template class is_signed -- determine whether a numeric type is signed - // Requires that T is constructable from the literals -1 and 0. Compile-time - // error results if that requirement is not met (and thus signedness is not - // likely to have meaning for that type). - template - struct is_signed - { -#if defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) || defined(BOOST_MSVC) && BOOST_MSVC <= 1300 - BOOST_STATIC_CONSTANT(bool, value = (Number(-1) < Number(0))); -#else - BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits::is_signed); -#endif - }; - -# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS - // digit_traits - compute the number of digits in a built-in integer - // type. Needed for implementations on which numeric_limits is not specialized - // for intmax_t (e.g. VC6). - template struct digit_traits_select; - - // numeric_limits is specialized; just select that version of digits - template <> struct digit_traits_select - { - template struct traits - { - BOOST_STATIC_CONSTANT(int, digits = std::numeric_limits::digits); - }; - }; - - // numeric_limits is not specialized; compute digits from sizeof(T) - template <> struct digit_traits_select - { - template struct traits - { - BOOST_STATIC_CONSTANT(int, digits = ( - sizeof(T) * std::numeric_limits::digits - - (is_signed::value ? 1 : 0)) - ); - }; - }; - - // here's the "usable" template - template struct digit_traits - { - typedef digit_traits_select< - ::std::numeric_limits::is_specialized> selector; - typedef typename selector::template traits traits; - BOOST_STATIC_CONSTANT(int, digits = traits::digits); - }; -#endif - - // Template class integer_traits -- traits of various integer types - // This should probably be rolled into boost::integer_traits one day, but I - // need it to work without - template - struct integer_traits - { -# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS - private: - typedef Integer integer_type; - typedef std::numeric_limits x; -# if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 - // for some reason, MSVC asserts when it shouldn't unless we make these - // local definitions - BOOST_STATIC_CONSTANT(bool, is_integer = x::is_integer); - BOOST_STATIC_CONSTANT(bool, is_specialized = x::is_specialized); - - BOOST_STATIC_ASSERT(is_integer); - BOOST_STATIC_ASSERT(is_specialized); -# endif - public: - typedef typename - if_true<(int(x::is_signed) - && (!int(x::is_bounded) - // digits is the number of no-sign bits - || (int(x::digits) + 1 >= digit_traits::digits)))>::template then< - Integer, - - typename if_true<(int(x::digits) + 1 < digit_traits::digits)>::template then< - signed int, - - typename if_true<(int(x::digits) + 1 < digit_traits::digits)>::template then< - signed long, - - // else - intmax_t - >::type>::type>::type difference_type; -#else - BOOST_STATIC_ASSERT(boost::is_integral::value); - - typedef typename - if_true<(sizeof(Integer) >= sizeof(intmax_t))>::template then< - - typename if_true<(is_signed::value)>::template then< - Integer, - intmax_t - >::type, - - typename if_true<(sizeof(Integer) < sizeof(std::ptrdiff_t))>::template then< - std::ptrdiff_t, - intmax_t - >::type - >::type difference_type; -# endif - }; - - // Right now, only supports integers, but should be expanded. - template - struct numeric_traits - { - typedef typename integer_traits::difference_type difference_type; - }; - - template - typename numeric_traits::difference_type numeric_distance(Number x, Number y) - { - typedef typename numeric_traits::difference_type difference_type; - return difference_type(y) - difference_type(x); - } -}} - -#endif // BOOST_NUMERIC_TRAITS_HPP_DWA20001901 diff --git a/src/vendor/stp/src/boost/detail/ob_call_traits.hpp b/src/vendor/stp/src/boost/detail/ob_call_traits.hpp deleted file mode 100644 index eb4df7a30..000000000 --- a/src/vendor/stp/src/boost/detail/ob_call_traits.hpp +++ /dev/null @@ -1,168 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/utility for most recent version including documentation. -// -// Crippled version for crippled compilers: -// see libs/utility/call_traits.htm -// - -/* Release notes: - 01st October 2000: - Fixed call_traits on VC6, using "poor man's partial specialisation", - using ideas taken from "Generative programming" by Krzysztof Czarnecki - & Ulrich Eisenecker. -*/ - -#ifndef BOOST_OB_CALL_TRAITS_HPP -#define BOOST_OB_CALL_TRAITS_HPP - -#ifndef BOOST_CONFIG_HPP -#include -#endif - -#ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP -#include -#endif -#ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP -#include -#endif - -namespace boost{ - -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES -// -// use member templates to emulate -// partial specialisation: -// -namespace detail{ - -template -struct standard_call_traits -{ - typedef T value_type; - typedef T& reference; - typedef const T& const_reference; - typedef const T& param_type; -}; -template -struct simple_call_traits -{ - typedef T value_type; - typedef T& reference; - typedef const T& const_reference; - typedef const T param_type; -}; -template -struct reference_call_traits -{ - typedef T value_type; - typedef T reference; - typedef T const_reference; - typedef T param_type; -}; - -template -struct call_traits_chooser -{ - template - struct rebind - { - typedef standard_call_traits type; - }; -}; - -template <> -struct call_traits_chooser -{ - template - struct rebind - { - typedef simple_call_traits type; - }; -}; - -template <> -struct call_traits_chooser -{ - template - struct rebind - { - typedef reference_call_traits type; - }; -}; - -template -struct call_traits_sizeof_chooser2 -{ - template - struct small_rebind - { - typedef simple_call_traits small_type; - }; -}; - -template<> -struct call_traits_sizeof_chooser2 -{ - template - struct small_rebind - { - typedef standard_call_traits small_type; - }; -}; - -template <> -struct call_traits_chooser -{ - template - struct rebind - { - enum { sizeof_choice = (sizeof(T) <= sizeof(void*)) }; - typedef call_traits_sizeof_chooser2<(sizeof(T) <= sizeof(void*))> chooser; - typedef typename chooser::template small_rebind bound_type; - typedef typename bound_type::small_type type; - }; -}; - -} // namespace detail -template -struct call_traits -{ -private: - typedef detail::call_traits_chooser< - ::boost::is_pointer::value, - ::boost::is_arithmetic::value, - ::boost::is_reference::value - > chooser; - typedef typename chooser::template rebind bound_type; - typedef typename bound_type::type call_traits_type; -public: - typedef typename call_traits_type::value_type value_type; - typedef typename call_traits_type::reference reference; - typedef typename call_traits_type::const_reference const_reference; - typedef typename call_traits_type::param_type param_type; -}; - -#else -// -// sorry call_traits is completely non-functional -// blame your broken compiler: -// - -template -struct call_traits -{ - typedef T value_type; - typedef T& reference; - typedef const T& const_reference; - typedef const T& param_type; -}; - -#endif // member templates - -} - -#endif // BOOST_OB_CALL_TRAITS_HPP diff --git a/src/vendor/stp/src/boost/detail/ob_compressed_pair.hpp b/src/vendor/stp/src/boost/detail/ob_compressed_pair.hpp deleted file mode 100644 index 727acab6d..000000000 --- a/src/vendor/stp/src/boost/detail/ob_compressed_pair.hpp +++ /dev/null @@ -1,510 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/utility for most recent version including documentation. -// see libs/utility/compressed_pair.hpp -// -/* Release notes: - 20 Jan 2001: - Fixed obvious bugs (David Abrahams) - 07 Oct 2000: - Added better single argument constructor support. - 03 Oct 2000: - Added VC6 support (JM). - 23rd July 2000: - Additional comments added. (JM) - Jan 2000: - Original version: this version crippled for use with crippled compilers - - John Maddock Jan 2000. -*/ - - -#ifndef BOOST_OB_COMPRESSED_PAIR_HPP -#define BOOST_OB_COMPRESSED_PAIR_HPP - -#include -#ifndef BOOST_OBJECT_TYPE_TRAITS_HPP -#include -#endif -#ifndef BOOST_SAME_TRAITS_HPP -#include -#endif -#ifndef BOOST_CALL_TRAITS_HPP -#include -#endif - -namespace boost -{ -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES -// -// use member templates to emulate -// partial specialisation. Note that due to -// problems with overload resolution with VC6 -// each of the compressed_pair versions that follow -// have one template single-argument constructor -// in place of two specific constructors: -// - -template -class compressed_pair; - -namespace detail{ - -template -struct best_conversion_traits -{ - typedef char one; - typedef char (&two)[2]; - static A a; - static one test(T1); - static two test(T2); - - enum { value = sizeof(test(a)) }; -}; - -template -struct init_one; - -template <> -struct init_one<1> -{ - template - static void init(const A& a, T1* p1, T2*) - { - *p1 = a; - } -}; - -template <> -struct init_one<2> -{ - template - static void init(const A& a, T1*, T2* p2) - { - *p2 = a; - } -}; - - -// T1 != T2, both non-empty -template -class compressed_pair_0 -{ -private: - T1 _first; - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_0() : _first(), _second() {} - compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {} - template - explicit compressed_pair_0(const A& val) - { - init_one::value>::init(val, &_first, &_second); - } - compressed_pair_0(const ::boost::compressed_pair& x) - : _first(x.first()), _second(x.second()) {} - -#if 0 - compressed_pair_0& operator=(const compressed_pair_0& x) { - cout << "assigning compressed pair 0" << endl; - _first = x._first; - _second = x._second; - cout << "finished assigning compressed pair 0" << endl; - return *this; - } -#endif - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair_0& y) - { - using std::swap; - swap(_first, y._first); - swap(_second, y._second); - } -}; - -// T1 != T2, T2 empty -template -class compressed_pair_1 : T2 -{ -private: - T1 _first; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_1() : T2(), _first() {} - compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {} - - template - explicit compressed_pair_1(const A& val) - { - init_one::value>::init(val, &_first, static_cast(this)); - } - - compressed_pair_1(const ::boost::compressed_pair& x) - : T2(x.second()), _first(x.first()) {} - -#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 - // Total weirdness. If the assignment to _first is moved after - // the call to the inherited operator=, then this breaks graph/test/graph.cpp - // by way of iterator_adaptor. - compressed_pair_1& operator=(const compressed_pair_1& x) { - _first = x._first; - T2::operator=(x); - return *this; - } -#endif - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return *this; } - second_const_reference second() const { return *this; } - - void swap(compressed_pair_1& y) - { - // no need to swap empty base class: - using std::swap; - swap(_first, y._first); - } -}; - -// T1 != T2, T1 empty -template -class compressed_pair_2 : T1 -{ -private: - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_2() : T1(), _second() {} - compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {} - template - explicit compressed_pair_2(const A& val) - { - init_one::value>::init(val, static_cast(this), &_second); - } - compressed_pair_2(const ::boost::compressed_pair& x) - : T1(x.first()), _second(x.second()) {} - -#if 0 - compressed_pair_2& operator=(const compressed_pair_2& x) { - cout << "assigning compressed pair 2" << endl; - T1::operator=(x); - _second = x._second; - cout << "finished assigning compressed pair 2" << endl; - return *this; - } -#endif - first_reference first() { return *this; } - first_const_reference first() const { return *this; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair_2& y) - { - // no need to swap empty base class: - using std::swap; - swap(_second, y._second); - } -}; - -// T1 != T2, both empty -template -class compressed_pair_3 : T1, T2 -{ -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_3() : T1(), T2() {} - compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {} - template - explicit compressed_pair_3(const A& val) - { - init_one::value>::init(val, static_cast(this), static_cast(this)); - } - compressed_pair_3(const ::boost::compressed_pair& x) - : T1(x.first()), T2(x.second()) {} - - first_reference first() { return *this; } - first_const_reference first() const { return *this; } - - second_reference second() { return *this; } - second_const_reference second() const { return *this; } - - void swap(compressed_pair_3& y) - { - // no need to swap empty base classes: - } -}; - -// T1 == T2, and empty -template -class compressed_pair_4 : T1 -{ -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_4() : T1() {} - compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {} - // only one single argument constructor since T1 == T2 - explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {} - compressed_pair_4(const ::boost::compressed_pair& x) - : T1(x.first()), m_second(x.second()) {} - - first_reference first() { return *this; } - first_const_reference first() const { return *this; } - - second_reference second() { return m_second; } - second_const_reference second() const { return m_second; } - - void swap(compressed_pair_4& y) - { - // no need to swap empty base classes: - } -private: - T2 m_second; -}; - -// T1 == T2, not empty -template -class compressed_pair_5 -{ -private: - T1 _first; - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_5() : _first(), _second() {} - compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {} - // only one single argument constructor since T1 == T2 - explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {} - compressed_pair_5(const ::boost::compressed_pair& c) - : _first(c.first()), _second(c.second()) {} - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair_5& y) - { - using std::swap; - swap(_first, y._first); - swap(_second, y._second); - } -}; - -template -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_0 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_1 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_2 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_3 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_4 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_5 type; - }; -}; - -template -struct compressed_pair_traits -{ -private: - typedef compressed_pair_chooser::value, is_empty::value, is_same::value> chooser; - typedef typename chooser::template rebind bound_type; -public: - typedef typename bound_type::type type; -}; - -} // namespace detail - -template -class compressed_pair : public detail::compressed_pair_traits::type -{ -private: - typedef typename detail::compressed_pair_traits::type base_type; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair() : base_type() {} - compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {} - template - explicit compressed_pair(const A& x) : base_type(x){} - - first_reference first() { return base_type::first(); } - first_const_reference first() const { return base_type::first(); } - - second_reference second() { return base_type::second(); } - second_const_reference second() const { return base_type::second(); } -}; - -template -inline void swap(compressed_pair& x, compressed_pair& y) -{ - x.swap(y); -} - -#else -// no partial specialisation, no member templates: - -template -class compressed_pair -{ -private: - T1 _first; - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair() : _first(), _second() {} - compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {} - explicit compressed_pair(first_param_type x) : _first(x), _second() {} - // can't define this in case T1 == T2: - // explicit compressed_pair(second_param_type y) : _first(), _second(y) {} - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair& y) - { - using std::swap; - swap(_first, y._first); - swap(_second, y._second); - } -}; - -template -inline void swap(compressed_pair& x, compressed_pair& y) -{ - x.swap(y); -} - -#endif - -} // boost - -#endif // BOOST_OB_COMPRESSED_PAIR_HPP - - - diff --git a/src/vendor/stp/src/boost/detail/quick_allocator.hpp b/src/vendor/stp/src/boost/detail/quick_allocator.hpp deleted file mode 100644 index d54b3a792..000000000 --- a/src/vendor/stp/src/boost/detail/quick_allocator.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED -#define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// -// detail/quick_allocator.hpp -// -// Copyright (c) 2003 David Abrahams -// Copyright (c) 2003 Peter Dimov -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -// - -#include - -#endif // #ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/reference_content.hpp b/src/vendor/stp/src/boost/detail/reference_content.hpp deleted file mode 100644 index daf56a8b1..000000000 --- a/src/vendor/stp/src/boost/detail/reference_content.hpp +++ /dev/null @@ -1,141 +0,0 @@ -//----------------------------------------------------------------------------- -// boost detail/reference_content.hpp header file -// See http://www.boost.org for updates, documentation, and revision history. -//----------------------------------------------------------------------------- -// -// Copyright (c) 2003 -// Eric Friedman -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_DETAIL_REFERENCE_CONTENT_HPP -#define BOOST_DETAIL_REFERENCE_CONTENT_HPP - -#include "boost/config.hpp" - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -# include "boost/mpl/bool.hpp" -# include "boost/type_traits/has_nothrow_copy.hpp" -#else -# include "boost/mpl/if.hpp" -# include "boost/type_traits/is_reference.hpp" -#endif - -#include "boost/mpl/void.hpp" - -namespace boost { - -namespace detail { - -/////////////////////////////////////////////////////////////////////////////// -// (detail) class template reference_content -// -// Non-Assignable wrapper for references. -// -template -class reference_content -{ -private: // representation - - RefT content_; - -public: // structors - - ~reference_content() - { - } - - reference_content(RefT r) - : content_( r ) - { - } - - reference_content(const reference_content& operand) - : content_( operand.content_ ) - { - } - -private: // non-Assignable - - reference_content& operator=(const reference_content&); - -public: // queries - - RefT get() const - { - return content_; - } - -}; - -/////////////////////////////////////////////////////////////////////////////// -// (detail) metafunction make_reference_content -// -// Wraps with reference_content if specified type is reference. -// - -template struct make_reference_content; - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -template -struct make_reference_content -{ - typedef T type; -}; - -template -struct make_reference_content< T& > -{ - typedef reference_content type; -}; - -#else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -template -struct make_reference_content - : mpl::if_< - is_reference - , reference_content - , T - > -{ -}; - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround - -template <> -struct make_reference_content< mpl::void_ > -{ - template - struct apply - : make_reference_content - { - }; - - typedef mpl::void_ type; -}; - -} // namespace detail - -/////////////////////////////////////////////////////////////////////////////// -// reference_content type traits specializations -// - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -template -struct has_nothrow_copy< - ::boost::detail::reference_content< T& > - > - : mpl::true_ -{ -}; - -#endif // !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -} // namespace boost - -#endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP diff --git a/src/vendor/stp/src/boost/detail/scoped_enum_emulation.hpp b/src/vendor/stp/src/boost/detail/scoped_enum_emulation.hpp deleted file mode 100644 index e695a2085..000000000 --- a/src/vendor/stp/src/boost/detail/scoped_enum_emulation.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// scoped_enum_emulation.hpp ---------------------------------------------------------// - -// Copyright Beman Dawes, 2009 - -// Distributed under the Boost Software License, Version 1.0. -// See http://www.boost.org/LICENSE_1_0.txt - -// Generates C++0x scoped enums if the feature is present, otherwise emulates C++0x -// scoped enums with C++03 namespaces and enums. The Boost.Config BOOST_NO_SCOPED_ENUMS -// macro is used to detect feature support. -// -// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf for a -// description of the scoped enum feature. Note that the committee changed the name -// from strongly typed enum to scoped enum. -// -// Caution: only the syntax is emulated; the semantics are not emulated and -// the syntax emulation doesn't include being able to specify the underlying -// representation type. -// -// The emulation is via struct rather than namespace to allow use within classes. -// Thanks to Andrey Semashev for pointing that out. -// -// Helpful comments and suggestions were also made by Kjell Elster, Phil Endecott, -// Joel Falcou, Mathias Gaunard, Felipe Magno de Almeida, Matt Calabrese, Vincente -// Botet, and Daniel James. -// -// Sample usage: -// -// BOOST_SCOPED_ENUM_START(algae) { green, red, cyan }; BOOST_SCOPED_ENUM_END -// ... -// BOOST_SCOPED_ENUM(algae) sample( algae::red ); -// void foo( BOOST_SCOPED_ENUM(algae) color ); -// ... -// sample = algae::green; -// foo( algae::cyan ); - -#ifndef BOOST_SCOPED_ENUM_EMULATION_HPP -#define BOOST_SCOPED_ENUM_EMULATION_HPP - -#include - -#ifdef BOOST_NO_SCOPED_ENUMS - -# define BOOST_SCOPED_ENUM_START(name) struct name { enum enum_type -# define BOOST_SCOPED_ENUM_END }; -# define BOOST_SCOPED_ENUM(name) name::enum_type - -#else - -# define BOOST_SCOPED_ENUM_START(name) enum class name -# define BOOST_SCOPED_ENUM_END -# define BOOST_SCOPED_ENUM(name) name - -#endif - -#endif // BOOST_SCOPED_ENUM_EMULATION_HPP diff --git a/src/vendor/stp/src/boost/detail/select_type.hpp b/src/vendor/stp/src/boost/detail/select_type.hpp deleted file mode 100644 index c13946f33..000000000 --- a/src/vendor/stp/src/boost/detail/select_type.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright David Abrahams 2001. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for most recent version including documentation. - -// Revision History -// 09 Feb 01 Applied John Maddock's Borland patch Moving -// specialization to unspecialized template (David Abrahams) -// 06 Feb 01 Created (David Abrahams) - -#ifndef SELECT_TYPE_DWA20010206_HPP -# define SELECT_TYPE_DWA20010206_HPP - -namespace boost { namespace detail { - - // Template class if_true -- select among 2 types based on a bool constant expression - // Usage: - // typename if_true<(bool_const_expression)>::template then::type - - // HP aCC cannot deal with missing names for template value parameters - template struct if_true - { - template - struct then { typedef T type; }; - }; - - template <> - struct if_true - { - template - struct then { typedef F type; }; - }; -}} -#endif // SELECT_TYPE_DWA20010206_HPP diff --git a/src/vendor/stp/src/boost/detail/sp_typeinfo.hpp b/src/vendor/stp/src/boost/detail/sp_typeinfo.hpp deleted file mode 100644 index 636fe277b..000000000 --- a/src/vendor/stp/src/boost/detail/sp_typeinfo.hpp +++ /dev/null @@ -1,129 +0,0 @@ -#ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED -#define BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// detail/sp_typeinfo.hpp -// -// Copyright 2007 Peter Dimov -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#include - -#if defined( BOOST_NO_TYPEID ) - -#include -#include - -namespace boost -{ - -namespace detail -{ - -class sp_typeinfo -{ -private: - - sp_typeinfo( sp_typeinfo const& ); - sp_typeinfo& operator=( sp_typeinfo const& ); - - char const * name_; - -public: - - explicit sp_typeinfo( char const * name ): name_( name ) - { - } - - bool operator==( sp_typeinfo const& rhs ) const - { - return this == &rhs; - } - - bool operator!=( sp_typeinfo const& rhs ) const - { - return this != &rhs; - } - - bool before( sp_typeinfo const& rhs ) const - { - return std::less< sp_typeinfo const* >()( this, &rhs ); - } - - char const* name() const - { - return name_; - } -}; - -template struct sp_typeid_ -{ - static sp_typeinfo ti_; - - static char const * name() - { - return BOOST_CURRENT_FUNCTION; - } -}; - -template sp_typeinfo sp_typeid_< T >::ti_( sp_typeid_< T >::name() ); - -template struct sp_typeid_< T & >: sp_typeid_< T > -{ -}; - -template struct sp_typeid_< T const >: sp_typeid_< T > -{ -}; - -template struct sp_typeid_< T volatile >: sp_typeid_< T > -{ -}; - -template struct sp_typeid_< T const volatile >: sp_typeid_< T > -{ -}; - -} // namespace detail - -} // namespace boost - -#define BOOST_SP_TYPEID(T) (boost::detail::sp_typeid_::ti_) - -#else - -#include - -namespace boost -{ - -namespace detail -{ - -#if defined( BOOST_NO_STD_TYPEINFO ) - -typedef ::type_info sp_typeinfo; - -#else - -typedef std::type_info sp_typeinfo; - -#endif - -} // namespace detail - -} // namespace boost - -#define BOOST_SP_TYPEID(T) typeid(T) - -#endif - -#endif // #ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/detail/templated_streams.hpp b/src/vendor/stp/src/boost/detail/templated_streams.hpp deleted file mode 100644 index 1fa6ee353..000000000 --- a/src/vendor/stp/src/boost/detail/templated_streams.hpp +++ /dev/null @@ -1,74 +0,0 @@ -//----------------------------------------------------------------------------- -// boost detail/templated_streams.hpp header file -// See http://www.boost.org for updates, documentation, and revision history. -//----------------------------------------------------------------------------- -// -// Copyright (c) 2003 -// Eric Friedman -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_DETAIL_TEMPLATED_STREAMS_HPP -#define BOOST_DETAIL_TEMPLATED_STREAMS_HPP - -#include "boost/config.hpp" - -/////////////////////////////////////////////////////////////////////////////// -// (detail) BOOST_TEMPLATED_STREAM_* macros -// -// Provides workaround platforms without stream class templates. -// - -#if !defined(BOOST_NO_STD_LOCALE) - -#define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) \ - template < typename E , typename T > - -#define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) \ - template < typename E , typename T , typename A > - -#define BOOST_TEMPLATED_STREAM_ARGS(E,T) \ - typename E , typename T - -#define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) \ - typename E , typename T , typename A - -#define BOOST_TEMPLATED_STREAM_COMMA , - -#define BOOST_TEMPLATED_STREAM_ELEM(E) E -#define BOOST_TEMPLATED_STREAM_TRAITS(T) T -#define BOOST_TEMPLATED_STREAM_ALLOC(A) A - -#define BOOST_TEMPLATED_STREAM(X,E,T) \ - BOOST_JOIN(std::basic_,X)< E , T > - -#define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \ - BOOST_JOIN(std::basic_,X)< E , T , A > - -#else // defined(BOOST_NO_STD_LOCALE) - -#define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) /**/ - -#define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) /**/ - -#define BOOST_TEMPLATED_STREAM_ARGS(E,T) /**/ - -#define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) /**/ - -#define BOOST_TEMPLATED_STREAM_COMMA /**/ - -#define BOOST_TEMPLATED_STREAM_ELEM(E) char -#define BOOST_TEMPLATED_STREAM_TRAITS(T) std::char_traits -#define BOOST_TEMPLATED_STREAM_ALLOC(A) std::allocator - -#define BOOST_TEMPLATED_STREAM(X,E,T) \ - std::X - -#define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \ - std::X - -#endif // BOOST_NO_STD_LOCALE - -#endif // BOOST_DETAIL_TEMPLATED_STREAMS_HPP diff --git a/src/vendor/stp/src/boost/detail/utf8_codecvt_facet.hpp b/src/vendor/stp/src/boost/detail/utf8_codecvt_facet.hpp deleted file mode 100644 index b777ff934..000000000 --- a/src/vendor/stp/src/boost/detail/utf8_codecvt_facet.hpp +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia@osl.iu.edu) -// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu). -// Distributed under the Boost Software License, Version 1.0. (See accompany- -// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_UTF8_CODECVT_FACET_HPP -#define BOOST_UTF8_CODECVT_FACET_HPP - -// MS compatible compilers support #pragma once -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// utf8_codecvt_facet.hpp - -// This header defines class utf8_codecvt_facet, derived fro -// std::codecvt, which can be used to convert utf8 data in -// files into wchar_t strings in the application. -// -// The header is NOT STANDALONE, and is not to be included by the USER. -// There are at least two libraries which want to use this functionality, and -// we want to avoid code duplication. It would be possible to create utf8 -// library, but: -// - this requires review process first -// - in the case, when linking the a library which uses utf8 -// (say 'program_options'), user should also link to the utf8 library. -// This seems inconvenient, and asking a user to link to an unrevieved -// library is strange. -// Until the above points are fixed, a library which wants to use utf8 must: -// - include this header from one of it's headers or sources -// - include the corresponding .cpp file from one of the sources -// - before including either file, the library must define -// - BOOST_UTF8_BEGIN_NAMESPACE to the namespace declaration that must be used -// - BOOST_UTF8_END_NAMESPACE to the code to close the previous namespace -// - declaration. -// - BOOST_UTF8_DECL -- to the code which must be used for all 'exportable' -// symbols. -// -// For example, program_options library might contain: -// #define BOOST_UTF8_BEGIN_NAMESPACE -// namespace boost { namespace program_options { -// #define BOOST_UTF8_END_NAMESPACE }} -// #define BOOST_UTF8_DECL BOOST_PROGRAM_OPTIONS_DECL -// #include "../../detail/utf8/utf8_codecvt.cpp" -// -// Essentially, each library will have its own copy of utf8 code, in -// different namespaces. - -// Note:(Robert Ramey). I have made the following alterations in the original -// code. -// a) Rendered utf8_codecvt with using templates -// b) Move longer functions outside class definition to prevent inlining -// and make code smaller -// c) added on a derived class to permit translation to/from current -// locale to utf8 - -// See http://www.boost.org for updates, documentation, and revision history. - -// archives stored as text - note these ar templated on the basic -// stream templates to accommodate wide (and other?) kind of characters -// -// note the fact that on libraries without wide characters, ostream is -// is not a specialization of basic_ostream which in fact is not defined -// in such cases. So we can't use basic_ostream but rather -// use two template parameters -// -// utf8_codecvt_facet -// This is an implementation of a std::codecvt facet for translating -// from UTF-8 externally to UCS-4. Note that this is not tied to -// any specific types in order to allow customization on platforms -// where wchar_t is not big enough. -// -// NOTES: The current implementation jumps through some unpleasant hoops in -// order to deal with signed character types. As a std::codecvt_base::result, -// it is necessary for the ExternType to be convertible to unsigned char. -// I chose not to tie the extern_type explicitly to char. But if any combination -// of types other than is used, then std::codecvt must be -// specialized on those types for this to work. - -#include -#include // for mbstate_t -#include // for std::size_t - -#include -#include - -#if defined(BOOST_NO_STDC_NAMESPACE) -namespace std { - using ::mbstate_t; - using ::size_t; -} -#endif - -#if !defined(__MSL_CPP__) && !defined(__LIBCOMO__) - #define BOOST_CODECVT_DO_LENGTH_CONST const -#else - #define BOOST_CODECVT_DO_LENGTH_CONST -#endif - -// maximum lenght of a multibyte string -#define MB_LENGTH_MAX 8 - -BOOST_UTF8_BEGIN_NAMESPACE - -struct BOOST_UTF8_DECL utf8_codecvt_facet : - public std::codecvt -{ -public: - explicit utf8_codecvt_facet(std::size_t no_locale_manage=0) - : std::codecvt(no_locale_manage) - {} -protected: - virtual std::codecvt_base::result do_in( - std::mbstate_t& state, - const char * from, - const char * from_end, - const char * & from_next, - wchar_t * to, - wchar_t * to_end, - wchar_t*& to_next - ) const; - - virtual std::codecvt_base::result do_out( - std::mbstate_t & state, const wchar_t * from, - const wchar_t * from_end, const wchar_t* & from_next, - char * to, char * to_end, char * & to_next - ) const; - - bool invalid_continuing_octet(unsigned char octet_1) const { - return (octet_1 < 0x80|| 0xbf< octet_1); - } - - bool invalid_leading_octet(unsigned char octet_1) const { - return (0x7f < octet_1 && octet_1 < 0xc0) || - (octet_1 > 0xfd); - } - - // continuing octets = octets except for the leading octet - static unsigned int get_cont_octet_count(unsigned char lead_octet) { - return get_octet_count(lead_octet) - 1; - } - - static unsigned int get_octet_count(unsigned char lead_octet); - - // How many "continuing octets" will be needed for this word - // == total octets - 1. - int get_cont_octet_out_count(wchar_t word) const ; - - virtual bool do_always_noconv() const throw() { return false; } - - // UTF-8 isn't really stateful since we rewind on partial conversions - virtual std::codecvt_base::result do_unshift( - std::mbstate_t&, - char * from, - char * /*to*/, - char * & next - ) const - { - next = from; - return ok; - } - - virtual int do_encoding() const throw() { - const int variable_byte_external_encoding=0; - return variable_byte_external_encoding; - } - - // How many char objects can I process to get <= max_limit - // wchar_t objects? - virtual int do_length( - BOOST_CODECVT_DO_LENGTH_CONST std::mbstate_t &, - const char * from, - const char * from_end, - std::size_t max_limit -#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) - ) const throw(); -#else - ) const; -#endif - - // Largest possible value do_length(state,from,from_end,1) could return. - virtual int do_max_length() const throw () { - return 6; // largest UTF-8 encoding of a UCS-4 character - } -}; - -BOOST_UTF8_END_NAMESPACE - -#endif // BOOST_UTF8_CODECVT_FACET_HPP diff --git a/src/vendor/stp/src/boost/detail/workaround.hpp b/src/vendor/stp/src/boost/detail/workaround.hpp deleted file mode 100644 index b6b64125c..000000000 --- a/src/vendor/stp/src/boost/detail/workaround.hpp +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright David Abrahams 2002. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -#ifndef WORKAROUND_DWA2002126_HPP -# define WORKAROUND_DWA2002126_HPP - -// Compiler/library version workaround macro -// -// Usage: -// -// #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) -// // workaround for eVC4 and VC6 -// ... // workaround code here -// #endif -// -// When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the -// first argument must be undefined or expand to a numeric -// value. The above expands to: -// -// (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300 -// -// When used for workarounds that apply to the latest known version -// and all earlier versions of a compiler, the following convention -// should be observed: -// -// #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301)) -// -// The version number in this case corresponds to the last version in -// which the workaround was known to have been required. When -// BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro -// BOOST_TESTED_AT(x) expands to "!= 0", which effectively activates -// the workaround for any version of the compiler. When -// BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or -// error will be issued if the compiler version exceeds the argument -// to BOOST_TESTED_AT(). This can be used to locate workarounds which -// may be obsoleted by newer versions. - -# ifndef BOOST_STRICT_CONFIG - -#include - -#ifndef __BORLANDC__ -#define __BORLANDC___WORKAROUND_GUARD 1 -#else -#define __BORLANDC___WORKAROUND_GUARD 0 -#endif -#ifndef __CODEGEARC__ -#define __CODEGEARC___WORKAROUND_GUARD 1 -#else -#define __CODEGEARC___WORKAROUND_GUARD 0 -#endif -#ifndef _MSC_VER -#define _MSC_VER_WORKAROUND_GUARD 1 -#else -#define _MSC_VER_WORKAROUND_GUARD 0 -#endif -#ifndef _MSC_FULL_VER -#define _MSC_FULL_VER_WORKAROUND_GUARD 1 -#else -#define _MSC_FULL_VER_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_MSVC -#define BOOST_MSVC_WORKAROUND_GUARD 1 -#else -#define BOOST_MSVC_WORKAROUND_GUARD 0 -#endif -#ifndef __GNUC__ -#define __GNUC___WORKAROUND_GUARD 1 -#else -#define __GNUC___WORKAROUND_GUARD 0 -#endif -#ifndef __GNUC_MINOR__ -#define __GNUC_MINOR___WORKAROUND_GUARD 1 -#else -#define __GNUC_MINOR___WORKAROUND_GUARD 0 -#endif -#ifndef __GNUC_PATCHLEVEL__ -#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1 -#else -#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0 -#endif -#ifndef __IBMCPP__ -#define __IBMCPP___WORKAROUND_GUARD 1 -#else -#define __IBMCPP___WORKAROUND_GUARD 0 -#endif -#ifndef __SUNPRO_CC -#define __SUNPRO_CC_WORKAROUND_GUARD 1 -#else -#define __SUNPRO_CC_WORKAROUND_GUARD 0 -#endif -#ifndef __DECCXX_VER -#define __DECCXX_VER_WORKAROUND_GUARD 1 -#else -#define __DECCXX_VER_WORKAROUND_GUARD 0 -#endif -#ifndef __MWERKS__ -#define __MWERKS___WORKAROUND_GUARD 1 -#else -#define __MWERKS___WORKAROUND_GUARD 0 -#endif -#ifndef __EDG__ -#define __EDG___WORKAROUND_GUARD 1 -#else -#define __EDG___WORKAROUND_GUARD 0 -#endif -#ifndef __EDG_VERSION__ -#define __EDG_VERSION___WORKAROUND_GUARD 1 -#else -#define __EDG_VERSION___WORKAROUND_GUARD 0 -#endif -#ifndef __HP_aCC -#define __HP_aCC_WORKAROUND_GUARD 1 -#else -#define __HP_aCC_WORKAROUND_GUARD 0 -#endif -#ifndef __hpxstd98 -#define __hpxstd98_WORKAROUND_GUARD 1 -#else -#define __hpxstd98_WORKAROUND_GUARD 0 -#endif -#ifndef _CRAYC -#define _CRAYC_WORKAROUND_GUARD 1 -#else -#define _CRAYC_WORKAROUND_GUARD 0 -#endif -#ifndef __DMC__ -#define __DMC___WORKAROUND_GUARD 1 -#else -#define __DMC___WORKAROUND_GUARD 0 -#endif -#ifndef MPW_CPLUS -#define MPW_CPLUS_WORKAROUND_GUARD 1 -#else -#define MPW_CPLUS_WORKAROUND_GUARD 0 -#endif -#ifndef __COMO__ -#define __COMO___WORKAROUND_GUARD 1 -#else -#define __COMO___WORKAROUND_GUARD 0 -#endif -#ifndef __COMO_VERSION__ -#define __COMO_VERSION___WORKAROUND_GUARD 1 -#else -#define __COMO_VERSION___WORKAROUND_GUARD 0 -#endif -#ifndef __INTEL_COMPILER -#define __INTEL_COMPILER_WORKAROUND_GUARD 1 -#else -#define __INTEL_COMPILER_WORKAROUND_GUARD 0 -#endif -#ifndef __ICL -#define __ICL_WORKAROUND_GUARD 1 -#else -#define __ICL_WORKAROUND_GUARD 0 -#endif -#ifndef _COMPILER_VERSION -#define _COMPILER_VERSION_WORKAROUND_GUARD 1 -#else -#define _COMPILER_VERSION_WORKAROUND_GUARD 0 -#endif - -#ifndef _RWSTD_VER -#define _RWSTD_VER_WORKAROUND_GUARD 1 -#else -#define _RWSTD_VER_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_RWSTD_VER -#define BOOST_RWSTD_VER_WORKAROUND_GUARD 1 -#else -#define BOOST_RWSTD_VER_WORKAROUND_GUARD 0 -#endif -#ifndef __GLIBCPP__ -#define __GLIBCPP___WORKAROUND_GUARD 1 -#else -#define __GLIBCPP___WORKAROUND_GUARD 0 -#endif -#ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC -#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1 -#else -#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0 -#endif -#ifndef __SGI_STL_PORT -#define __SGI_STL_PORT_WORKAROUND_GUARD 1 -#else -#define __SGI_STL_PORT_WORKAROUND_GUARD 0 -#endif -#ifndef _STLPORT_VERSION -#define _STLPORT_VERSION_WORKAROUND_GUARD 1 -#else -#define _STLPORT_VERSION_WORKAROUND_GUARD 0 -#endif -#ifndef __LIBCOMO_VERSION__ -#define __LIBCOMO_VERSION___WORKAROUND_GUARD 1 -#else -#define __LIBCOMO_VERSION___WORKAROUND_GUARD 0 -#endif -#ifndef _CPPLIB_VER -#define _CPPLIB_VER_WORKAROUND_GUARD 1 -#else -#define _CPPLIB_VER_WORKAROUND_GUARD 0 -#endif - -#ifndef BOOST_INTEL_CXX_VERSION -#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1 -#else -#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_INTEL_WIN -#define BOOST_INTEL_WIN_WORKAROUND_GUARD 1 -#else -#define BOOST_INTEL_WIN_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_DINKUMWARE_STDLIB -#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1 -#else -#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_INTEL -#define BOOST_INTEL_WORKAROUND_GUARD 1 -#else -#define BOOST_INTEL_WORKAROUND_GUARD 0 -#endif -// Always define to zero, if it's used it'll be defined my MPL: -#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0 - -# define BOOST_WORKAROUND(symbol, test) \ - ((symbol ## _WORKAROUND_GUARD + 0 == 0) && \ - (symbol != 0) && (1 % (( (symbol test) ) + 1))) -// ^ ^ ^ ^ -// The extra level of parenthesis nesting above, along with the -// BOOST_OPEN_PAREN indirection below, is required to satisfy the -// broken preprocessor in MWCW 8.3 and earlier. -// -// The basic mechanism works as follows: -// (symbol test) + 1 => if (symbol test) then 2 else 1 -// 1 % ((symbol test) + 1) => if (symbol test) then 1 else 0 -// -// The complication with % is for cooperation with BOOST_TESTED_AT(). -// When "test" is BOOST_TESTED_AT(x) and -// BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined, -// -// symbol test => if (symbol <= x) then 1 else -1 -// (symbol test) + 1 => if (symbol <= x) then 2 else 0 -// 1 % ((symbol test) + 1) => if (symbol <= x) then 1 else divide-by-zero -// - -# ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS -# define BOOST_OPEN_PAREN ( -# define BOOST_TESTED_AT(value) > value) ?(-1): BOOST_OPEN_PAREN 1 -# else -# define BOOST_TESTED_AT(value) != ((value)-(value)) -# endif - -# else - -# define BOOST_WORKAROUND(symbol, test) 0 - -# endif - -#endif // WORKAROUND_DWA2002126_HPP diff --git a/src/vendor/stp/src/boost/noncopyable.hpp b/src/vendor/stp/src/boost/noncopyable.hpp deleted file mode 100644 index 7770bdbd3..000000000 --- a/src/vendor/stp/src/boost/noncopyable.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// Boost noncopyable.hpp header file --------------------------------------// - -// (C) Copyright Beman Dawes 1999-2003. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/utility for documentation. - -#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED -#define BOOST_NONCOPYABLE_HPP_INCLUDED - -namespace boost { - -// Private copy constructor and copy assignment ensure classes derived from -// class noncopyable cannot be copied. - -// Contributed by Dave Abrahams - -namespace noncopyable_ // protection from unintended ADL -{ - class noncopyable - { - protected: - noncopyable() {} - ~noncopyable() {} - private: // emphasize the following members are private - noncopyable( const noncopyable& ); - const noncopyable& operator=( const noncopyable& ); - }; -} - -typedef noncopyable_::noncopyable noncopyable; - -} // namespace boost - -#endif // BOOST_NONCOPYABLE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/pool/detail/ct_gcd_lcm.hpp b/src/vendor/stp/src/boost/pool/detail/ct_gcd_lcm.hpp deleted file mode 100644 index a5f255b91..000000000 --- a/src/vendor/stp/src/boost/pool/detail/ct_gcd_lcm.hpp +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOL_CT_GCD_LCM_HPP -#define BOOST_POOL_CT_GCD_LCM_HPP - -#include -#include - -namespace boost { - -namespace details { -namespace pool { - -// Compile-time calculation of greatest common divisor and least common multiple - -// -// ct_gcd is a compile-time algorithm that calculates the greatest common -// divisor of two unsigned integers, using Euclid's algorithm. -// -// assumes: A != 0 && B != 0 -// - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -namespace details { -template -struct ct_gcd_helper; -template -struct ct_gcd_helper -{ - BOOST_STATIC_CONSTANT(unsigned, A_mod_B_ = A % B); - BOOST_STATIC_CONSTANT(unsigned, value = - (::boost::details::pool::details::ct_gcd_helper< - B, static_cast(A_mod_B_), - ::boost::type_traits::ice_eq::value - >::value) ); -}; -template -struct ct_gcd_helper -{ - BOOST_STATIC_CONSTANT(unsigned, value = A); -}; -} // namespace details - -template -struct ct_gcd -{ - BOOST_STATIC_ASSERT(A != 0 && B != 0); - BOOST_STATIC_CONSTANT(unsigned, value = - (::boost::details::pool::details::ct_gcd_helper::value) ); -}; - -#else - -// Thanks to Peter Dimov for providing this workaround! -namespace details { -template struct ct_gcd2 -{ - template - struct helper - { - BOOST_STATIC_CONSTANT(unsigned, value = ct_gcd2::helper::value); - }; - template<> - struct helper<0> - { - BOOST_STATIC_CONSTANT(unsigned, value = A); - }; -}; -} // namespace details - -template struct ct_gcd -{ - BOOST_STATIC_ASSERT(A != 0 && B != 0); - enum { value = details::ct_gcd2::helper::value }; -}; - -#endif - -// -// ct_lcm is a compile-time algorithm that calculates the least common -// multiple of two unsigned integers. -// -// assumes: A != 0 && B != 0 -// -template -struct ct_lcm -{ - BOOST_STATIC_CONSTANT(unsigned, value = - (A / ::boost::details::pool::ct_gcd::value * B) ); -}; - -} // namespace pool -} // namespace details - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/pool/detail/for.m4 b/src/vendor/stp/src/boost/pool/detail/for.m4 deleted file mode 100644 index f926a11d2..000000000 --- a/src/vendor/stp/src/boost/pool/detail/for.m4 +++ /dev/null @@ -1,107 +0,0 @@ -m4_dnl -m4_dnl Copyright (C) 2000 Stephen Cleary -m4_dnl -m4_dnl Distributed under the Boost Software License, Version 1.0. (See accompany- -m4_dnl ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -m4_dnl -m4_dnl See http://www.boost.org for updates, documentation, and revision history. -m4_dnl -m4_dnl -m4_dnl -m4_dnl BOOST_M4_FOR: repeat a given text for a range of values -m4_dnl $1 - variable to hold the current value. -m4_dnl $2 - the starting value. -m4_dnl $3 - the ending value (text is _not_ repeated for this value). -m4_dnl $4 - the text to repeat. -m4_dnl $5 - the delimeter text (optional). -m4_dnl -m4_dnl If the starting value is < ending value: -m4_dnl Will repeat $4, binding $1 to the values in the range [$2, $3). -m4_dnl Else (that is, starting value >= ending value): -m4_dnl Will do nothing -m4_dnl Repeats $5 in-between each occurrence of $4 -m4_dnl -m4_dnl Logic: -m4_dnl Set $1 to $2 and call BOOST_M4_FOR_LIST_HELPER: -m4_dnl If $1 >= $3, do nothing -m4_dnl Else -m4_dnl output $4, -m4_dnl set $1 to itself incremented, -m4_dnl If $1 != $3, output $5, -m4_dnl and use recursion -m4_dnl -m4_define(`BOOST_M4_FOR', - `m4_ifelse(m4_eval($# < 4 || $# > 5), 1, - `m4_errprint(m4___file__:m4___line__: `Boost m4 script: BOOST_M4_FOR: Wrong number of arguments ($#)')', - `m4_pushdef(`$1', `$2')BOOST_M4_FOR_HELPER($@)m4_popdef(`$1')')')m4_dnl -m4_define(`BOOST_M4_FOR_HELPER', - `m4_ifelse(m4_eval($1 >= $3), 1, , - `$4`'m4_define(`$1', m4_incr($1))m4_ifelse(m4_eval($1 != $3), 1, `$5')`'BOOST_M4_FOR_HELPER($@)')')m4_dnl -m4_dnl -m4_dnl Testing/Examples: -m4_dnl -m4_dnl The following line will output: -m4_dnl "repeat.m4:42: Boost m4 script: BOOST_M4_FOR: Wrong number of arguments (3)" -m4_dnl BOOST_M4_FOR(i, 1, 3) -m4_dnl -m4_dnl The following line will output: -m4_dnl "repeat.m4:46: Boost m4 script: BOOST_M4_FOR: Wrong number of arguments (6)" -m4_dnl BOOST_M4_FOR(i, 1, 3, i, ` ', 13) -m4_dnl -m4_dnl The following line will output (nothing): -m4_dnl "" -m4_dnl BOOST_M4_FOR(i, 7, 0, i ) -m4_dnl -m4_dnl The following line will output (nothing): -m4_dnl "" -m4_dnl BOOST_M4_FOR(i, 0, 0, i ) -m4_dnl -m4_dnl The following line will output: -m4_dnl "0 1 2 3 4 5 6 " -m4_dnl BOOST_M4_FOR(i, 0, 7, i ) -m4_dnl -m4_dnl The following line will output: -m4_dnl "-13 -12 -11 " -m4_dnl BOOST_M4_FOR(i, -13, -10, i ) -m4_dnl -m4_dnl The following two lines will output: -m4_dnl "(0, 0) (0, 1) (0, 2) (0, 3) " -m4_dnl "(1, 0) (1, 1) (1, 2) (1, 3) " -m4_dnl "(2, 0) (2, 1) (2, 2) (2, 3) " -m4_dnl "(3, 0) (3, 1) (3, 2) (3, 3) " -m4_dnl "(4, 0) (4, 1) (4, 2) (4, 3) " -m4_dnl "(5, 0) (5, 1) (5, 2) (5, 3) " -m4_dnl "(6, 0) (6, 1) (6, 2) (6, 3) " -m4_dnl "(7, 0) (7, 1) (7, 2) (7, 3) " -m4_dnl "" -m4_dnl BOOST_M4_FOR(i, 0, 8, BOOST_M4_FOR(j, 0, 4, (i, j) ) -m4_dnl ) -m4_dnl -m4_dnl The following line will output (nothing): -m4_dnl "" -m4_dnl BOOST_M4_FOR(i, 7, 0, i, |) -m4_dnl -m4_dnl The following line will output (nothing): -m4_dnl "" -m4_dnl BOOST_M4_FOR(i, 0, 0, i, |) -m4_dnl -m4_dnl The following line will output: -m4_dnl "0|1|2|3|4|5|6" -m4_dnl BOOST_M4_FOR(i, 0, 7, i, |) -m4_dnl -m4_dnl The following line will output: -m4_dnl "-13, -12, -11" -m4_dnl BOOST_M4_FOR(i, -13, -10, i, `, ') -m4_dnl -m4_dnl The following two lines will output: -m4_dnl "[(0, 0), (0, 1), (0, 2), (0, 3)]," -m4_dnl "[(1, 0), (1, 1), (1, 2), (1, 3)]," -m4_dnl "[(2, 0), (2, 1), (2, 2), (2, 3)]," -m4_dnl "[(3, 0), (3, 1), (3, 2), (3, 3)]," -m4_dnl "[(4, 0), (4, 1), (4, 2), (4, 3)]," -m4_dnl "[(5, 0), (5, 1), (5, 2), (5, 3)]," -m4_dnl "[(6, 0), (6, 1), (6, 2), (6, 3)]," -m4_dnl "[(7, 0), (7, 1), (7, 2), (7, 3)]" -m4_dnl BOOST_M4_FOR(i, 0, 8, `[BOOST_M4_FOR(j, 0, 4, (i, j), `, ')]', `, -m4_dnl ') -m4_dnl \ No newline at end of file diff --git a/src/vendor/stp/src/boost/pool/detail/gcd_lcm.hpp b/src/vendor/stp/src/boost/pool/detail/gcd_lcm.hpp deleted file mode 100644 index 4c6495329..000000000 --- a/src/vendor/stp/src/boost/pool/detail/gcd_lcm.hpp +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOL_GCD_LCM_HPP -#define BOOST_POOL_GCD_LCM_HPP - -namespace boost { - -namespace details { -namespace pool { - -// Greatest common divisor and least common multiple - -// -// gcd is an algorithm that calculates the greatest common divisor of two -// integers, using Euclid's algorithm. -// -// Pre: A > 0 && B > 0 -// Recommended: A > B -template -Integer gcd(Integer A, Integer B) -{ - do - { - const Integer tmp(B); - B = A % B; - A = tmp; - } while (B != 0); - - return A; -} - -// -// lcm is an algorithm that calculates the least common multiple of two -// integers. -// -// Pre: A > 0 && B > 0 -// Recommended: A > B -template -Integer lcm(const Integer & A, const Integer & B) -{ - Integer ret = A; - ret /= gcd(A, B); - ret *= B; - return ret; -} - -} // namespace pool -} // namespace details - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/pool/detail/guard.hpp b/src/vendor/stp/src/boost/pool/detail/guard.hpp deleted file mode 100644 index 27f5f73b8..000000000 --- a/src/vendor/stp/src/boost/pool/detail/guard.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOL_GUARD_HPP -#define BOOST_POOL_GUARD_HPP - -// Extremely Light-Weight guard glass - -namespace boost { - -namespace details { -namespace pool { - -template -class guard -{ - private: - Mutex & mtx; - - guard(const guard &); - void operator=(const guard &); - - public: - explicit guard(Mutex & nmtx) - :mtx(nmtx) { mtx.lock(); } - - ~guard() { mtx.unlock(); } -}; - -} // namespace pool -} // namespace details - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/pool/detail/mutex.hpp b/src/vendor/stp/src/boost/pool/detail/mutex.hpp deleted file mode 100644 index 43bc4c2c5..000000000 --- a/src/vendor/stp/src/boost/pool/detail/mutex.hpp +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOL_MUTEX_HPP -#define BOOST_POOL_MUTEX_HPP - -#include // for workarounds - -// Extremely Light-Weight wrapper classes for OS thread synchronization - -// Configuration: for now, we just choose between pthread or Win32 mutexes or none - -#define BOOST_MUTEX_HELPER_NONE 0 -#define BOOST_MUTEX_HELPER_WIN32 1 -#define BOOST_MUTEX_HELPER_PTHREAD 2 - -#if !defined(BOOST_HAS_THREADS) && !defined(BOOST_NO_MT) -# define BOOST_NO_MT -#endif - -#ifdef BOOST_NO_MT - // No multithreading -> make locks into no-ops - #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_NONE -#else - #ifdef BOOST_WINDOWS - #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_WIN32 - #else - #if defined(BOOST_HAS_UNISTD_H) - #include - #endif - #if defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) - #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_PTHREAD - #endif - #endif -#endif - -#ifndef BOOST_MUTEX_HELPER - #error Unable to determine platform mutex type; define BOOST_NO_MT to assume single-threaded -#endif - -#ifndef BOOST_NO_MT -# ifdef BOOST_WINDOWS -# include -# endif -# if defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) -# include -# endif -#endif - -namespace boost { - -namespace details { -namespace pool { - -#ifndef BOOST_NO_MT - -#ifdef BOOST_WINDOWS - -class win32_mutex -{ - private: - ::CRITICAL_SECTION mtx; - - win32_mutex(const win32_mutex &); - void operator=(const win32_mutex &); - - public: - win32_mutex() - { ::InitializeCriticalSection(&mtx); } - - ~win32_mutex() - { ::DeleteCriticalSection(&mtx); } - - void lock() - { ::EnterCriticalSection(&mtx); } - - void unlock() - { ::LeaveCriticalSection(&mtx); } -}; - -#endif // defined(BOOST_WINDOWS) - -#if defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) - -class pthread_mutex -{ - private: - ::pthread_mutex_t mtx; - - pthread_mutex(const pthread_mutex &); - void operator=(const pthread_mutex &); - - public: - pthread_mutex() - { ::pthread_mutex_init(&mtx, 0); } - - ~pthread_mutex() - { ::pthread_mutex_destroy(&mtx); } - - void lock() - { ::pthread_mutex_lock(&mtx); } - - void unlock() - { ::pthread_mutex_unlock(&mtx); } -}; - -#endif // defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS) - -#endif // !defined(BOOST_NO_MT) - -class null_mutex -{ - private: - null_mutex(const null_mutex &); - void operator=(const null_mutex &); - - public: - null_mutex() { } - - static void lock() { } - static void unlock() { } -}; - -#if BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_NONE - typedef null_mutex default_mutex; -#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_WIN32 - typedef win32_mutex default_mutex; -#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_PTHREAD - typedef pthread_mutex default_mutex; -#endif - -} // namespace pool -} // namespace details - -} // namespace boost - -#undef BOOST_MUTEX_HELPER_WIN32 -#undef BOOST_MUTEX_HELPER_PTHREAD -#undef BOOST_MUTEX_HELPER_NONE -#undef BOOST_MUTEX_HELPER - -#endif diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct.bat b/src/vendor/stp/src/boost/pool/detail/pool_construct.bat deleted file mode 100755 index 2ae365f6e..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct.bat +++ /dev/null @@ -1,24 +0,0 @@ -@echo off -rem -rem Copyright (C) 2000, 2001 Stephen Cleary -rem -rem Distributed under the Boost Software License, Version 1.0. (See accompany- -rem ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - - - -rem Check for Windows NT -if %OS%==Windows_NT goto NT - -rem Not NT - run m4 as normal, then exit -m4 -P -E -DNumberOfArguments=%1 pool_construct.m4 > pool_construct.inc -goto end - -rem DJGPP programs (including m4) running on Windows/NT do NOT support long -rem file names (see the DJGPP v2 FAQ, question 8.1) -rem Note that the output doesn't have to be a short name because it's an -rem argument to the command shell, not m4. -:NT -m4 -P -E -DNumberOfArguments=%1 < pool_construct.m4 > pool_construct.inc - -:end \ No newline at end of file diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct.inc b/src/vendor/stp/src/boost/pool/detail/pool_construct.inc deleted file mode 100644 index 4cabcea6c..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct.inc +++ /dev/null @@ -1,853 +0,0 @@ -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -// This file was AUTOMATICALLY GENERATED from "pool_c~1.m4" -// Do NOT include directly! -// Do NOT edit! - -template -element_type * construct(T0 & a0) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const volatile T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const volatile T1 & a1, T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const volatile T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const volatile T1 & a1, volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(T0 & a0, const volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(volatile T0 & a0, const volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const volatile T0 & a0, const volatile T1 & a1, const volatile T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} - diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct.m4 b/src/vendor/stp/src/boost/pool/detail/pool_construct.m4 deleted file mode 100644 index 91671b4ab..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct.m4 +++ /dev/null @@ -1,84 +0,0 @@ -m4_dnl -m4_dnl Copyright (C) 2000 Stephen Cleary -m4_dnl -m4_dnl Distributed under the Boost Software License, Version 1.0. (See accompany- -m4_dnl ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -m4_dnl -m4_dnl See http://www.boost.org for updates, documentation, and revision history. -m4_dnl -m4_dnl -m4_dnl -m4_dnl Avoid the use of any m4_* identifiers in this header file, -m4_dnl as that may cause incompatibility problems with future -m4_dnl versions of m4. -m4_dnl -m4_dnl This is a normal header file, except that lines starting -m4_dnl with `m4_dnl' will be stripped, TBA_FOR -m4_dnl macros will be replaced with repeated text, and text in -m4_dnl single quotes (`...') will have their single quotes -m4_dnl stripped. -m4_dnl -m4_dnl -m4_dnl Check to make sure NumberOfArguments was defined. If it's not defined, -m4_dnl default to 3 -m4_dnl -m4_ifdef(`NumberOfArguments', , `m4_errprint(m4___file__:m4___line__`: NumberOfArguments is not defined; defaulting to 3 -')m4_define(`NumberOfArguments', 3)')m4_dnl -m4_ifelse(NumberOfArguments, , `m4_errprint(m4___file__:m4___line__`: NumberOfArguments is defined to be empty; defaulting to 3 -')m4_define(`NumberOfArguments', 3)')m4_dnl -m4_dnl -m4_dnl Check to make sure NumberOfArguments >= 1. If it's not, then fatal error. -m4_dnl -m4_ifelse(m4_eval(NumberOfArguments < 1), 1, `m4_errprint(m4___file__:m4___line__`: NumberOfArguments ('NumberOfArguments`) is less than 1 -')m4_m4exit(1)')m4_dnl -m4_dnl -m4_dnl Include the BOOST_M4_FOR macro definition -m4_dnl -m4_include(`for.m4')`'m4_dnl -m4_dnl -m4_dnl Begin the generated file. -m4_dnl -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See accompany- -// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -m4_dnl These warnings apply to the file generated from this file. -m4_dnl Of course, you may freely edit this file. -// This file was AUTOMATICALLY GENERATED from "m4___file__" -// Do NOT include directly! -// Do NOT edit! - -m4_dnl -m4_dnl First we define a simple 'cv_qual' macro which takes a number, either -m4_dnl 0, 1, 2, or 3, and determines cv-qualification. -m4_dnl -m4_define(`cv_qual', -`m4_ifelse($1, 0, `', -`m4_ifelse($1, 1, `const ', -`m4_ifelse($1, 2, `volatile ', -`m4_ifelse($1, 3, `const volatile ', -`m4_errprint(m4___file__:m4___line__: `Boost m4 script: cv-determiner: Not 0, 1, 2, or 3 (was '$1`)')' -)')')')')m4_dnl -m4_dnl -m4_dnl Next we go through the actual loop. For each number of arguments from -m4_dnl 1 to NumberOfArguments, we create a template function that takes that -m4_dnl many template arguments, and also generate all cv-qualified permutations -m4_dnl of that function. -m4_dnl -BOOST_M4_FOR(N, 1, NumberOfArguments + 1, -`BOOST_M4_FOR(cv, 0, m4_eval(4 ** N), - `template -element_type * construct(BOOST_M4_FOR(i, 0, N, - `cv_qual(m4_eval((cv >> (i * 2)) % 4))T`'i & a`'i', `, ')) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(BOOST_M4_FOR(i, 0, N, `a`'i', `, ')); } - catch (...) { free(ret); throw; } - return ret; -} -')') diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct.sh b/src/vendor/stp/src/boost/pool/detail/pool_construct.sh deleted file mode 100755 index aa090356e..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# -# Copyright (C) 2000 Stephen Cleary -# -# Distributed under the Boost Software License, Version 1.0. (See accompany- -# ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -# -# See http://www.boost.org for updates, documentation, and revision history. -# - -m4 -P -E -DNumberOfArguments=$1 pool_construct.m4 > pool_construct.inc diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.bat b/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.bat deleted file mode 100755 index 23ac2a3c3..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.bat +++ /dev/null @@ -1,25 +0,0 @@ -@echo off -rem -rem Copyright (C) 2001 Stephen Cleary -rem -rem Distributed under the Boost Software License, Version 1.0. (See accompany- -rem ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -rem -rem See http://www.boost.org for updates, documentation, and revision history. -rem - -rem Check for Windows NT -if %OS%==Windows_NT goto NT - -rem Not NT - run m4 as normal, then exit -m4 -P -E -DNumberOfArguments=%1 pool_construct_simple.m4 > pool_construct_simple.inc -goto end - -rem DJGPP programs (including m4) running on Windows/NT do NOT support long -rem file names (see the DJGPP v2 FAQ, question 8.1) -rem Note that the output doesn't have to be a short name because it's an -rem argument to the command shell, not m4. -:NT -m4 -P -E -DNumberOfArguments=%1 < pool_construct_simple.m4 > pool_construct_simple.inc - -:end \ No newline at end of file diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.inc b/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.inc deleted file mode 100644 index 0760863c6..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.inc +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -// This file was AUTOMATICALLY GENERATED from "stdin" -// Do NOT include directly! -// Do NOT edit! - -template -element_type * construct(const T0 & a0) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const T1 & a1) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1); } - catch (...) { free(ret); throw; } - return ret; -} -template -element_type * construct(const T0 & a0, const T1 & a1, const T2 & a2) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(a0, a1, a2); } - catch (...) { free(ret); throw; } - return ret; -} - diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.m4 b/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.m4 deleted file mode 100644 index 11a27e719..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.m4 +++ /dev/null @@ -1,73 +0,0 @@ -m4_dnl -m4_dnl Copyright (C) 2001 Stephen Cleary -m4_dnl -m4_dnl Distributed under the Boost Software License, Version 1.0. (See accompany- -m4_dnl ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -m4_dnl -m4_dnl See http://www.boost.org for updates, documentation, and revision history. -m4_dnl -m4_dnl -m4_dnl -m4_dnl Avoid the use of any m4_* identifiers in this header file, -m4_dnl as that may cause incompatibility problems with future -m4_dnl versions of m4. -m4_dnl -m4_dnl This is a normal header file, except that lines starting -m4_dnl with `m4_dnl' will be stripped, TBA_FOR -m4_dnl macros will be replaced with repeated text, and text in -m4_dnl single quotes (`...') will have their single quotes -m4_dnl stripped. -m4_dnl -m4_dnl -m4_dnl Check to make sure NumberOfArguments was defined. If it's not defined, -m4_dnl default to 3 -m4_dnl -m4_ifdef(`NumberOfArguments', , `m4_errprint(m4___file__:m4___line__`: NumberOfArguments is not defined; defaulting to 3 -')m4_define(`NumberOfArguments', 3)')m4_dnl -m4_ifelse(NumberOfArguments, , `m4_errprint(m4___file__:m4___line__`: NumberOfArguments is defined to be empty; defaulting to 3 -')m4_define(`NumberOfArguments', 3)')m4_dnl -m4_dnl -m4_dnl Check to make sure NumberOfArguments >= 1. If it's not, then fatal error. -m4_dnl -m4_ifelse(m4_eval(NumberOfArguments < 1), 1, `m4_errprint(m4___file__:m4___line__`: NumberOfArguments ('NumberOfArguments`) is less than 1 -')m4_m4exit(1)')m4_dnl -m4_dnl -m4_dnl Include the BOOST_M4_FOR macro definition -m4_dnl -m4_include(`for.m4')`'m4_dnl -m4_dnl -m4_dnl Begin the generated file. -m4_dnl -// Copyright (C) 2000 Stephen Cleary -// -// This file can be redistributed and/or modified under the terms found -// in "copyright.html" -// This software and its documentation is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any purpose. -// -// See http://www.boost.org for updates, documentation, and revision history. - -m4_dnl These warnings apply to the file generated from this file. -m4_dnl Of course, you may freely edit this file. -// This file was AUTOMATICALLY GENERATED from "m4___file__" -// Do NOT include directly! -// Do NOT edit! - -m4_dnl -m4_dnl Here we go through the actual loop. For each number of arguments from -m4_dnl 1 to NumberOfArguments, we create a template function that takes that -m4_dnl many template arguments. -m4_dnl -BOOST_M4_FOR(N, 1, NumberOfArguments + 1, -`template -element_type * construct(BOOST_M4_FOR(i, 0, N, - `const T`'i & a`'i', `, ')) -{ - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(BOOST_M4_FOR(i, 0, N, `a`'i', `, ')); } - catch (...) { free(ret); throw; } - return ret; -} -') diff --git a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.sh b/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.sh deleted file mode 100755 index 413b5d71b..000000000 --- a/src/vendor/stp/src/boost/pool/detail/pool_construct_simple.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# -# Copyright (C) 2001 Stephen Cleary -# -# Distributed under the Boost Software License, Version 1.0. (See accompany- -# ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -# -# See http://www.boost.org for updates, documentation, and revision history. -# - -m4 -P -E -DNumberOfArguments=$1 pool_construct_simple.m4 > pool_construct_simple.inc diff --git a/src/vendor/stp/src/boost/pool/detail/singleton.hpp b/src/vendor/stp/src/boost/pool/detail/singleton.hpp deleted file mode 100644 index db7ca676b..000000000 --- a/src/vendor/stp/src/boost/pool/detail/singleton.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (C) 2000 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOL_SINGLETON_HPP -#define BOOST_POOL_SINGLETON_HPP - -// The following code might be put into some Boost.Config header in a later revision -#ifdef __BORLANDC__ -# pragma option push -w-inl -#endif - -// -// The following helper classes are placeholders for a generic "singleton" -// class. The classes below support usage of singletons, including use in -// program startup/shutdown code, AS LONG AS there is only one thread -// running before main() begins, and only one thread running after main() -// exits. -// -// This class is also limited in that it can only provide singleton usage for -// classes with default constructors. -// - -// The design of this class is somewhat twisted, but can be followed by the -// calling inheritance. Let us assume that there is some user code that -// calls "singleton_default::instance()". The following (convoluted) -// sequence ensures that the same function will be called before main(): -// instance() contains a call to create_object.do_nothing() -// Thus, object_creator is implicitly instantiated, and create_object -// must exist. -// Since create_object is a static member, its constructor must be -// called before main(). -// The constructor contains a call to instance(), thus ensuring that -// instance() will be called before main(). -// The first time instance() is called (i.e., before main()) is the -// latest point in program execution where the object of type T -// can be created. -// Thus, any call to instance() will auto-magically result in a call to -// instance() before main(), unless already present. -// Furthermore, since the instance() function contains the object, instead -// of the singleton_default class containing a static instance of the -// object, that object is guaranteed to be constructed (at the latest) in -// the first call to instance(). This permits calls to instance() from -// static code, even if that code is called before the file-scope objects -// in this file have been initialized. - -namespace boost { - -namespace details { -namespace pool { - -// T must be: no-throw default constructible and no-throw destructible -template -struct singleton_default -{ - private: - struct object_creator - { - // This constructor does nothing more than ensure that instance() - // is called before main() begins, thus creating the static - // T object before multithreading race issues can come up. - object_creator() { singleton_default::instance(); } - inline void do_nothing() const { } - }; - static object_creator create_object; - - singleton_default(); - - public: - typedef T object_type; - - // If, at any point (in user code), singleton_default::instance() - // is called, then the following function is instantiated. - static object_type & instance() - { - // This is the object that we return a reference to. - // It is guaranteed to be created before main() begins because of - // the next line. - static object_type obj; - - // The following line does nothing else than force the instantiation - // of singleton_default::create_object, whose constructor is - // called before main() begins. - create_object.do_nothing(); - - return obj; - } -}; -template -typename singleton_default::object_creator -singleton_default::create_object; - -} // namespace pool -} // namespace details - -} // namespace boost - -// The following code might be put into some Boost.Config header in a later revision -#ifdef __BORLANDC__ -# pragma option pop -#endif - -#endif diff --git a/src/vendor/stp/src/boost/pool/object_pool.hpp b/src/vendor/stp/src/boost/pool/object_pool.hpp deleted file mode 100644 index 4beaf3515..000000000 --- a/src/vendor/stp/src/boost/pool/object_pool.hpp +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (C) 2000, 2001 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_OBJECT_POOL_HPP -#define BOOST_OBJECT_POOL_HPP - -#include - -// boost::pool -#include - -// The following code will be put into Boost.Config in a later revision -#if defined(BOOST_MSVC) || defined(__KCC) -# define BOOST_NO_TEMPLATE_CV_REF_OVERLOADS -#endif - -// The following code might be put into some Boost.Config header in a later revision -#ifdef __BORLANDC__ -# pragma option push -w-inl -#endif - -// There are a few places in this file where the expression "this->m" is used. -// This expression is used to force instantiation-time name lookup, which I am -// informed is required for strict Standard compliance. It's only necessary -// if "m" is a member of a base class that is dependent on a template -// parameter. -// Thanks to Jens Maurer for pointing this out! - -namespace boost { - -// T must have a non-throwing destructor -template -class object_pool: protected pool -{ - public: - typedef T element_type; - typedef UserAllocator user_allocator; - typedef typename pool::size_type size_type; - typedef typename pool::difference_type difference_type; - - protected: - pool & store() { return *this; } - const pool & store() const { return *this; } - - // for the sake of code readability :) - static void * & nextof(void * const ptr) - { return *(static_cast(ptr)); } - - public: - // This constructor parameter is an extension! - explicit object_pool(const size_type next_size = 32) - :pool(sizeof(T), next_size) { } - - ~object_pool(); - - // Returns 0 if out-of-memory - element_type * malloc() - { return static_cast(store().ordered_malloc()); } - void free(element_type * const chunk) - { store().ordered_free(chunk); } - bool is_from(element_type * const chunk) const - { return store().is_from(chunk); } - - element_type * construct() - { - element_type * const ret = malloc(); - if (ret == 0) - return ret; - try { new (ret) element_type(); } - catch (...) { free(ret); throw; } - return ret; - } - - // Include automatically-generated file for family of template construct() - // functions -#ifndef BOOST_NO_TEMPLATE_CV_REF_OVERLOADS -# include -#else -# include -#endif - - void destroy(element_type * const chunk) - { - chunk->~T(); - free(chunk); - } - - // These functions are extensions! - size_type get_next_size() const { return store().get_next_size(); } - void set_next_size(const size_type x) { store().set_next_size(x); } -}; - -template -object_pool::~object_pool() -{ - // handle trivial case - if (!this->list.valid()) - return; - - details::PODptr iter = this->list; - details::PODptr next = iter; - - // Start 'freed_iter' at beginning of free list - void * freed_iter = this->first; - - const size_type partition_size = this->alloc_size(); - - do - { - // increment next - next = next.next(); - - // delete all contained objects that aren't freed - - // Iterate 'i' through all chunks in the memory block - for (char * i = iter.begin(); i != iter.end(); i += partition_size) - { - // If this chunk is free - if (i == freed_iter) - { - // Increment freed_iter to point to next in free list - freed_iter = nextof(freed_iter); - - // Continue searching chunks in the memory block - continue; - } - - // This chunk is not free (allocated), so call its destructor - static_cast(static_cast(i))->~T(); - // and continue searching chunks in the memory block - } - - // free storage - UserAllocator::free(iter.begin()); - - // increment iter - iter = next; - } while (iter.valid()); - - // Make the block list empty so that the inherited destructor doesn't try to - // free it again. - this->list.invalidate(); -} - -} // namespace boost - -// The following code might be put into some Boost.Config header in a later revision -#ifdef __BORLANDC__ -# pragma option pop -#endif - -#endif diff --git a/src/vendor/stp/src/boost/pool/pool.hpp b/src/vendor/stp/src/boost/pool/pool.hpp deleted file mode 100644 index 139822d32..000000000 --- a/src/vendor/stp/src/boost/pool/pool.hpp +++ /dev/null @@ -1,584 +0,0 @@ -// Copyright (C) 2000, 2001 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOL_HPP -#define BOOST_POOL_HPP - -#include // for workarounds - -// std::less, std::less_equal, std::greater -#include -// new[], delete[], std::nothrow -#include -// std::size_t, std::ptrdiff_t -#include -// std::malloc, std::free -#include -// std::invalid_argument -#include -// std::max -#include - -#include - -// boost::details::pool::ct_lcm -#include -// boost::details::pool::lcm -#include -// boost::simple_segregated_storage -#include - -#ifdef BOOST_NO_STDC_NAMESPACE - namespace std { using ::malloc; using ::free; } -#endif - -// There are a few places in this file where the expression "this->m" is used. -// This expression is used to force instantiation-time name lookup, which I am -// informed is required for strict Standard compliance. It's only necessary -// if "m" is a member of a base class that is dependent on a template -// parameter. -// Thanks to Jens Maurer for pointing this out! - -namespace boost { - -struct default_user_allocator_new_delete -{ - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - static char * malloc(const size_type bytes) - { return new (std::nothrow) char[bytes]; } - static void free(char * const block) - { delete [] block; } -}; - -struct default_user_allocator_malloc_free -{ - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - static char * malloc(const size_type bytes) - { return reinterpret_cast(std::malloc(bytes)); } - static void free(char * const block) - { std::free(block); } -}; - -namespace details { - -// PODptr is a class that pretends to be a "pointer" to different class types -// that don't really exist. It provides member functions to access the "data" -// of the "object" it points to. Since these "class" types are of variable -// size, and contains some information at the *end* of its memory (for -// alignment reasons), PODptr must contain the size of this "class" as well as -// the pointer to this "object". -template -class PODptr -{ - public: - typedef SizeType size_type; - - private: - char * ptr; - size_type sz; - - char * ptr_next_size() const - { return (ptr + sz - sizeof(size_type)); } - char * ptr_next_ptr() const - { - return (ptr_next_size() - - pool::ct_lcm::value); - } - - public: - PODptr(char * const nptr, const size_type nsize) - :ptr(nptr), sz(nsize) { } - PODptr() - :ptr(0), sz(0) { } - - bool valid() const { return (begin() != 0); } - void invalidate() { begin() = 0; } - char * & begin() { return ptr; } - char * begin() const { return ptr; } - char * end() const { return ptr_next_ptr(); } - size_type total_size() const { return sz; } - size_type element_size() const - { - return (sz - sizeof(size_type) - - pool::ct_lcm::value); - } - - size_type & next_size() const - { return *(reinterpret_cast(ptr_next_size())); } - char * & next_ptr() const - { return *(reinterpret_cast(ptr_next_ptr())); } - - PODptr next() const - { return PODptr(next_ptr(), next_size()); } - void next(const PODptr & arg) const - { - next_ptr() = arg.begin(); - next_size() = arg.total_size(); - } -}; - -} // namespace details - -template -class pool: protected simple_segregated_storage< - typename UserAllocator::size_type> -{ - public: - typedef UserAllocator user_allocator; - typedef typename UserAllocator::size_type size_type; - typedef typename UserAllocator::difference_type difference_type; - - private: - BOOST_STATIC_CONSTANT(unsigned, min_alloc_size = - (::boost::details::pool::ct_lcm::value) ); - - // Returns 0 if out-of-memory - // Called if malloc/ordered_malloc needs to resize the free list - void * malloc_need_resize(); - void * ordered_malloc_need_resize(); - - protected: - details::PODptr list; - - simple_segregated_storage & store() { return *this; } - const simple_segregated_storage & store() const { return *this; } - const size_type requested_size; - size_type next_size; - size_type start_size; - - // finds which POD in the list 'chunk' was allocated from - details::PODptr find_POD(void * const chunk) const; - - // is_from() tests a chunk to determine if it belongs in a block - static bool is_from(void * const chunk, char * const i, - const size_type sizeof_i) - { - // We use std::less_equal and std::less to test 'chunk' - // against the array bounds because standard operators - // may return unspecified results. - // This is to ensure portability. The operators < <= > >= are only - // defined for pointers to objects that are 1) in the same array, or - // 2) subobjects of the same object [5.9/2]. - // The functor objects guarantee a total order for any pointer [20.3.3/8] -//WAS: -// return (std::less_equal()(static_cast(i), chunk) -// && std::less()(chunk, -// static_cast(i + sizeof_i))); - std::less_equal lt_eq; - std::less lt; - return (lt_eq(i, chunk) && lt(chunk, i + sizeof_i)); - } - - size_type alloc_size() const - { - const unsigned min_size = min_alloc_size; - return details::pool::lcm(requested_size, min_size); - } - - // for the sake of code readability :) - static void * & nextof(void * const ptr) - { return *(static_cast(ptr)); } - - public: - // The second parameter here is an extension! - // pre: npartition_size != 0 && nnext_size != 0 - explicit pool(const size_type nrequested_size, - const size_type nnext_size = 32) - :list(0, 0), requested_size(nrequested_size), next_size(nnext_size), start_size(nnext_size) - { } - - ~pool() { purge_memory(); } - - // Releases memory blocks that don't have chunks allocated - // pre: lists are ordered - // Returns true if memory was actually deallocated - bool release_memory(); - - // Releases *all* memory blocks, even if chunks are still allocated - // Returns true if memory was actually deallocated - bool purge_memory(); - - // These functions are extensions! - size_type get_next_size() const { return next_size; } - void set_next_size(const size_type nnext_size) { next_size = start_size = nnext_size; } - size_type get_requested_size() const { return requested_size; } - - // Both malloc and ordered_malloc do a quick inlined check first for any - // free chunks. Only if we need to get another memory block do we call - // the non-inlined *_need_resize() functions. - // Returns 0 if out-of-memory - void * malloc() - { - // Look for a non-empty storage - if (!store().empty()) - return store().malloc(); - return malloc_need_resize(); - } - - void * ordered_malloc() - { - // Look for a non-empty storage - if (!store().empty()) - return store().malloc(); - return ordered_malloc_need_resize(); - } - - // Returns 0 if out-of-memory - // Allocate a contiguous section of n chunks - void * ordered_malloc(size_type n); - - // pre: 'chunk' must have been previously - // returned by *this.malloc(). - void free(void * const chunk) - { store().free(chunk); } - - // pre: 'chunk' must have been previously - // returned by *this.malloc(). - void ordered_free(void * const chunk) - { store().ordered_free(chunk); } - - // pre: 'chunk' must have been previously - // returned by *this.malloc(n). - void free(void * const chunks, const size_type n) - { - const size_type partition_size = alloc_size(); - const size_type total_req_size = n * requested_size; - const size_type num_chunks = total_req_size / partition_size + - ((total_req_size % partition_size) ? true : false); - - store().free_n(chunks, num_chunks, partition_size); - } - - // pre: 'chunk' must have been previously - // returned by *this.malloc(n). - void ordered_free(void * const chunks, const size_type n) - { - const size_type partition_size = alloc_size(); - const size_type total_req_size = n * requested_size; - const size_type num_chunks = total_req_size / partition_size + - ((total_req_size % partition_size) ? true : false); - - store().ordered_free_n(chunks, num_chunks, partition_size); - } - - // is_from() tests a chunk to determine if it was allocated from *this - bool is_from(void * const chunk) const - { - return (find_POD(chunk).valid()); - } -}; - -template -bool pool::release_memory() -{ - // This is the return value: it will be set to true when we actually call - // UserAllocator::free(..) - bool ret = false; - - // This is a current & previous iterator pair over the memory block list - details::PODptr ptr = list; - details::PODptr prev; - - // This is a current & previous iterator pair over the free memory chunk list - // Note that "prev_free" in this case does NOT point to the previous memory - // chunk in the free list, but rather the last free memory chunk before the - // current block. - void * free_p = this->first; - void * prev_free_p = 0; - - const size_type partition_size = alloc_size(); - - // Search through all the all the allocated memory blocks - while (ptr.valid()) - { - // At this point: - // ptr points to a valid memory block - // free_p points to either: - // 0 if there are no more free chunks - // the first free chunk in this or some next memory block - // prev_free_p points to either: - // the last free chunk in some previous memory block - // 0 if there is no such free chunk - // prev is either: - // the PODptr whose next() is ptr - // !valid() if there is no such PODptr - - // If there are no more free memory chunks, then every remaining - // block is allocated out to its fullest capacity, and we can't - // release any more memory - if (free_p == 0) - break; - - // We have to check all the chunks. If they are *all* free (i.e., present - // in the free list), then we can free the block. - bool all_chunks_free = true; - - // Iterate 'i' through all chunks in the memory block - // if free starts in the memory block, be careful to keep it there - void * saved_free = free_p; - for (char * i = ptr.begin(); i != ptr.end(); i += partition_size) - { - // If this chunk is not free - if (i != free_p) - { - // We won't be able to free this block - all_chunks_free = false; - - // free_p might have travelled outside ptr - free_p = saved_free; - // Abort searching the chunks; we won't be able to free this - // block because a chunk is not free. - break; - } - - // We do not increment prev_free_p because we are in the same block - free_p = nextof(free_p); - } - - // post: if the memory block has any chunks, free_p points to one of them - // otherwise, our assertions above are still valid - - const details::PODptr next = ptr.next(); - - if (!all_chunks_free) - { - if (is_from(free_p, ptr.begin(), ptr.element_size())) - { - std::less lt; - void * const end = ptr.end(); - do - { - prev_free_p = free_p; - free_p = nextof(free_p); - } while (free_p && lt(free_p, end)); - } - // This invariant is now restored: - // free_p points to the first free chunk in some next memory block, or - // 0 if there is no such chunk. - // prev_free_p points to the last free chunk in this memory block. - - // We are just about to advance ptr. Maintain the invariant: - // prev is the PODptr whose next() is ptr, or !valid() - // if there is no such PODptr - prev = ptr; - } - else - { - // All chunks from this block are free - - // Remove block from list - if (prev.valid()) - prev.next(next); - else - list = next; - - // Remove all entries in the free list from this block - if (prev_free_p != 0) - nextof(prev_free_p) = free_p; - else - this->first = free_p; - - // And release memory - UserAllocator::free(ptr.begin()); - ret = true; - } - - // Increment ptr - ptr = next; - } - - next_size = start_size; - return ret; -} - -template -bool pool::purge_memory() -{ - details::PODptr iter = list; - - if (!iter.valid()) - return false; - - do - { - // hold "next" pointer - const details::PODptr next = iter.next(); - - // delete the storage - UserAllocator::free(iter.begin()); - - // increment iter - iter = next; - } while (iter.valid()); - - list.invalidate(); - this->first = 0; - next_size = start_size; - - return true; -} - -template -void * pool::malloc_need_resize() -{ - // No memory in any of our storages; make a new storage, - const size_type partition_size = alloc_size(); - const size_type POD_size = next_size * partition_size + - details::pool::ct_lcm::value + sizeof(size_type); - char * const ptr = UserAllocator::malloc(POD_size); - if (ptr == 0) - return 0; - const details::PODptr node(ptr, POD_size); - next_size <<= 1; - - // initialize it, - store().add_block(node.begin(), node.element_size(), partition_size); - - // insert it into the list, - node.next(list); - list = node; - - // and return a chunk from it. - return store().malloc(); -} - -template -void * pool::ordered_malloc_need_resize() -{ - // No memory in any of our storages; make a new storage, - const size_type partition_size = alloc_size(); - const size_type POD_size = next_size * partition_size + - details::pool::ct_lcm::value + sizeof(size_type); - char * const ptr = UserAllocator::malloc(POD_size); - if (ptr == 0) - return 0; - const details::PODptr node(ptr, POD_size); - next_size <<= 1; - - // initialize it, - // (we can use "add_block" here because we know that - // the free list is empty, so we don't have to use - // the slower ordered version) - store().add_block(node.begin(), node.element_size(), partition_size); - - // insert it into the list, - // handle border case - if (!list.valid() || std::greater()(list.begin(), node.begin())) - { - node.next(list); - list = node; - } - else - { - details::PODptr prev = list; - - while (true) - { - // if we're about to hit the end or - // if we've found where "node" goes - if (prev.next_ptr() == 0 - || std::greater()(prev.next_ptr(), node.begin())) - break; - - prev = prev.next(); - } - - node.next(prev.next()); - prev.next(node); - } - - // and return a chunk from it. - return store().malloc(); -} - -template -void * pool::ordered_malloc(const size_type n) -{ - const size_type partition_size = alloc_size(); - const size_type total_req_size = n * requested_size; - const size_type num_chunks = total_req_size / partition_size + - ((total_req_size % partition_size) ? true : false); - - void * ret = store().malloc_n(num_chunks, partition_size); - - if (ret != 0) - return ret; - - // Not enougn memory in our storages; make a new storage, - BOOST_USING_STD_MAX(); - next_size = max BOOST_PREVENT_MACRO_SUBSTITUTION(next_size, num_chunks); - const size_type POD_size = next_size * partition_size + - details::pool::ct_lcm::value + sizeof(size_type); - char * const ptr = UserAllocator::malloc(POD_size); - if (ptr == 0) - return 0; - const details::PODptr node(ptr, POD_size); - - // Split up block so we can use what wasn't requested - // (we can use "add_block" here because we know that - // the free list is empty, so we don't have to use - // the slower ordered version) - if (next_size > num_chunks) - store().add_block(node.begin() + num_chunks * partition_size, - node.element_size() - num_chunks * partition_size, partition_size); - - next_size <<= 1; - - // insert it into the list, - // handle border case - if (!list.valid() || std::greater()(list.begin(), node.begin())) - { - node.next(list); - list = node; - } - else - { - details::PODptr prev = list; - - while (true) - { - // if we're about to hit the end or - // if we've found where "node" goes - if (prev.next_ptr() == 0 - || std::greater()(prev.next_ptr(), node.begin())) - break; - - prev = prev.next(); - } - - node.next(prev.next()); - prev.next(node); - } - - // and return it. - return node.begin(); -} - -template -details::PODptr::size_type> -pool::find_POD(void * const chunk) const -{ - // We have to find which storage this chunk is from. - details::PODptr iter = list; - while (iter.valid()) - { - if (is_from(chunk, iter.begin(), iter.element_size())) - return iter; - iter = iter.next(); - } - - return iter; -} - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/pool/pool_alloc.hpp b/src/vendor/stp/src/boost/pool/pool_alloc.hpp deleted file mode 100644 index e5f442c44..000000000 --- a/src/vendor/stp/src/boost/pool/pool_alloc.hpp +++ /dev/null @@ -1,282 +0,0 @@ -// Copyright (C) 2000, 2001 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOL_ALLOC_HPP -#define BOOST_POOL_ALLOC_HPP - -// std::numeric_limits -#include -// new, std::bad_alloc -#include - -#include -#include - -// boost::singleton_pool -#include - -#include - -// The following code will be put into Boost.Config in a later revision -#if defined(_RWSTD_VER) || defined(__SGI_STL_PORT) || \ - BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) - #define BOOST_NO_PROPER_STL_DEALLOCATE -#endif - -namespace boost { - -struct pool_allocator_tag { }; - -template -class pool_allocator -{ - public: - typedef T value_type; - typedef UserAllocator user_allocator; - typedef Mutex mutex; - BOOST_STATIC_CONSTANT(unsigned, next_size = NextSize); - - typedef value_type * pointer; - typedef const value_type * const_pointer; - typedef value_type & reference; - typedef const value_type & const_reference; - typedef typename pool::size_type size_type; - typedef typename pool::difference_type difference_type; - - template - struct rebind - { - typedef pool_allocator other; - }; - - public: - pool_allocator() - { - // Required to ensure construction of singleton_pool IFF an - // instace of this allocator is constructed during global - // initialization. See ticket #2359 for a complete explaination - // ( http://svn.boost.org/trac/boost/ticket/2359 ) - singleton_pool::is_from(0); - } - - // default copy constructor - - // default assignment operator - - // not explicit, mimicking std::allocator [20.4.1] - template - pool_allocator(const pool_allocator &) - { - // Required to ensure construction of singleton_pool IFF an - // instace of this allocator is constructed during global - // initialization. See ticket #2359 for a complete explaination - // ( http://svn.boost.org/trac/boost/ticket/2359 ) - singleton_pool::is_from(0); - } - - // default destructor - - static pointer address(reference r) - { return &r; } - static const_pointer address(const_reference s) - { return &s; } - static size_type max_size() - { return (std::numeric_limits::max)(); } - static void construct(const pointer ptr, const value_type & t) - { new (ptr) T(t); } - static void destroy(const pointer ptr) - { - ptr->~T(); - (void) ptr; // avoid unused variable warning - } - - bool operator==(const pool_allocator &) const - { return true; } - bool operator!=(const pool_allocator &) const - { return false; } - - static pointer allocate(const size_type n) - { - const pointer ret = static_cast( - singleton_pool::ordered_malloc(n) ); - if (ret == 0) - boost::throw_exception(std::bad_alloc()); - return ret; - } - static pointer allocate(const size_type n, const void * const) - { return allocate(n); } - static void deallocate(const pointer ptr, const size_type n) - { -#ifdef BOOST_NO_PROPER_STL_DEALLOCATE - if (ptr == 0 || n == 0) - return; -#endif - singleton_pool::ordered_free(ptr, n); - } -}; - -template< - typename UserAllocator, - typename Mutex, - unsigned NextSize> -class pool_allocator -{ -public: - typedef void* pointer; - typedef const void* const_pointer; - typedef void value_type; - template struct rebind { - typedef pool_allocator other; - }; -}; - -struct fast_pool_allocator_tag { }; - -template -class fast_pool_allocator -{ - public: - typedef T value_type; - typedef UserAllocator user_allocator; - typedef Mutex mutex; - BOOST_STATIC_CONSTANT(unsigned, next_size = NextSize); - - typedef value_type * pointer; - typedef const value_type * const_pointer; - typedef value_type & reference; - typedef const value_type & const_reference; - typedef typename pool::size_type size_type; - typedef typename pool::difference_type difference_type; - - template - struct rebind - { - typedef fast_pool_allocator other; - }; - - public: - fast_pool_allocator() - { - // Required to ensure construction of singleton_pool IFF an - // instace of this allocator is constructed during global - // initialization. See ticket #2359 for a complete explaination - // ( http://svn.boost.org/trac/boost/ticket/2359 ) - singleton_pool::is_from(0); - } - - // default copy constructor - - // default assignment operator - - // not explicit, mimicking std::allocator [20.4.1] - template - fast_pool_allocator( - const fast_pool_allocator &) - { - // Required to ensure construction of singleton_pool IFF an - // instace of this allocator is constructed during global - // initialization. See ticket #2359 for a complete explaination - // ( http://svn.boost.org/trac/boost/ticket/2359 ) - singleton_pool::is_from(0); - } - - // default destructor - - static pointer address(reference r) - { return &r; } - static const_pointer address(const_reference s) - { return &s; } - static size_type max_size() - { return (std::numeric_limits::max)(); } - void construct(const pointer ptr, const value_type & t) - { new (ptr) T(t); } - void destroy(const pointer ptr) - { - ptr->~T(); - (void) ptr; // avoid unused variable warning - } - - bool operator==(const fast_pool_allocator &) const - { return true; } - bool operator!=(const fast_pool_allocator &) const - { return false; } - - static pointer allocate(const size_type n) - { - const pointer ret = (n == 1) ? - static_cast( - singleton_pool::malloc() ) : - static_cast( - singleton_pool::ordered_malloc(n) ); - if (ret == 0) - boost::throw_exception(std::bad_alloc()); - return ret; - } - static pointer allocate(const size_type n, const void * const) - { return allocate(n); } - static pointer allocate() - { - const pointer ret = static_cast( - singleton_pool::malloc() ); - if (ret == 0) - boost::throw_exception(std::bad_alloc()); - return ret; - } - static void deallocate(const pointer ptr, const size_type n) - { -#ifdef BOOST_NO_PROPER_STL_DEALLOCATE - if (ptr == 0 || n == 0) - return; -#endif - if (n == 1) - singleton_pool::free(ptr); - else - singleton_pool::free(ptr, n); - } - static void deallocate(const pointer ptr) - { - singleton_pool::free(ptr); - } -}; - -template< - typename UserAllocator, - typename Mutex, - unsigned NextSize> -class fast_pool_allocator -{ -public: - typedef void* pointer; - typedef const void* const_pointer; - typedef void value_type; - template struct rebind { - typedef fast_pool_allocator other; - }; -}; - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/pool/poolfwd.hpp b/src/vendor/stp/src/boost/pool/poolfwd.hpp deleted file mode 100644 index 89b3dd376..000000000 --- a/src/vendor/stp/src/boost/pool/poolfwd.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2000, 2001 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_POOLFWD_HPP -#define BOOST_POOLFWD_HPP - -#include // for workarounds - -// std::size_t -#include - -// boost::details::pool::default_mutex -#include - -namespace boost { - -// -// Location: -// -template -class simple_segregated_storage; - -// -// Location: -// -struct default_user_allocator_new_delete; -struct default_user_allocator_malloc_free; - -template -class pool; - -// -// Location: -// -template -class object_pool; - -// -// Location: -// -template -struct singleton_pool; - -// -// Location: -// -struct pool_allocator_tag; - -template -class pool_allocator; - -struct fast_pool_allocator_tag; - -template -class fast_pool_allocator; - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/pool/simple_segregated_storage.hpp b/src/vendor/stp/src/boost/pool/simple_segregated_storage.hpp deleted file mode 100644 index 20c16dc5c..000000000 --- a/src/vendor/stp/src/boost/pool/simple_segregated_storage.hpp +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright (C) 2000, 2001 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_SIMPLE_SEGREGATED_STORAGE_HPP -#define BOOST_SIMPLE_SEGREGATED_STORAGE_HPP - -// std::greater -#include - -#include - -namespace boost { - -template -class simple_segregated_storage -{ - public: - typedef SizeType size_type; - - private: - simple_segregated_storage(const simple_segregated_storage &); - void operator=(const simple_segregated_storage &); - - // pre: (n > 0), (start != 0), (nextof(start) != 0) - // post: (start != 0) - static void * try_malloc_n(void * & start, size_type n, - size_type partition_size); - - protected: - void * first; - - // Traverses the free list referred to by "first", - // and returns the iterator previous to where - // "ptr" would go if it was in the free list. - // Returns 0 if "ptr" would go at the beginning - // of the free list (i.e., before "first") - void * find_prev(void * ptr); - - // for the sake of code readability :) - static void * & nextof(void * const ptr) - { return *(static_cast(ptr)); } - - public: - // Post: empty() - simple_segregated_storage() - :first(0) { } - - // pre: npartition_sz >= sizeof(void *) - // npartition_sz = sizeof(void *) * i, for some integer i - // nsz >= npartition_sz - // block is properly aligned for an array of object of - // size npartition_sz and array of void * - // The requirements above guarantee that any pointer to a chunk - // (which is a pointer to an element in an array of npartition_sz) - // may be cast to void **. - static void * segregate(void * block, - size_type nsz, size_type npartition_sz, - void * end = 0); - - // Same preconditions as 'segregate' - // Post: !empty() - void add_block(void * const block, - const size_type nsz, const size_type npartition_sz) - { - // Segregate this block and merge its free list into the - // free list referred to by "first" - first = segregate(block, nsz, npartition_sz, first); - } - - // Same preconditions as 'segregate' - // Post: !empty() - void add_ordered_block(void * const block, - const size_type nsz, const size_type npartition_sz) - { - // This (slower) version of add_block segregates the - // block and merges its free list into our free list - // in the proper order - - // Find where "block" would go in the free list - void * const loc = find_prev(block); - - // Place either at beginning or in middle/end - if (loc == 0) - add_block(block, nsz, npartition_sz); - else - nextof(loc) = segregate(block, nsz, npartition_sz, nextof(loc)); - } - - // default destructor - - bool empty() const { return (first == 0); } - - // pre: !empty() - void * malloc() - { - void * const ret = first; - - // Increment the "first" pointer to point to the next chunk - first = nextof(first); - return ret; - } - - // pre: chunk was previously returned from a malloc() referring to the - // same free list - // post: !empty() - void free(void * const chunk) - { - nextof(chunk) = first; - first = chunk; - } - - // pre: chunk was previously returned from a malloc() referring to the - // same free list - // post: !empty() - void ordered_free(void * const chunk) - { - // This (slower) implementation of 'free' places the memory - // back in the list in its proper order. - - // Find where "chunk" goes in the free list - void * const loc = find_prev(chunk); - - // Place either at beginning or in middle/end - if (loc == 0) - free(chunk); - else - { - nextof(chunk) = nextof(loc); - nextof(loc) = chunk; - } - } - - // Note: if you're allocating/deallocating n a lot, you should - // be using an ordered pool. - void * malloc_n(size_type n, size_type partition_size); - - // pre: chunks was previously allocated from *this with the same - // values for n and partition_size - // post: !empty() - // Note: if you're allocating/deallocating n a lot, you should - // be using an ordered pool. - void free_n(void * const chunks, const size_type n, - const size_type partition_size) - { - add_block(chunks, n * partition_size, partition_size); - } - - // pre: chunks was previously allocated from *this with the same - // values for n and partition_size - // post: !empty() - void ordered_free_n(void * const chunks, const size_type n, - const size_type partition_size) - { - add_ordered_block(chunks, n * partition_size, partition_size); - } -}; - -template -void * simple_segregated_storage::find_prev(void * const ptr) -{ - // Handle border case - if (first == 0 || std::greater()(first, ptr)) - return 0; - - void * iter = first; - while (true) - { - // if we're about to hit the end or - // if we've found where "ptr" goes - if (nextof(iter) == 0 || std::greater()(nextof(iter), ptr)) - return iter; - - iter = nextof(iter); - } -} - -template -void * simple_segregated_storage::segregate( - void * const block, - const size_type sz, - const size_type partition_sz, - void * const end) -{ - // Get pointer to last valid chunk, preventing overflow on size calculations - // The division followed by the multiplication just makes sure that - // old == block + partition_sz * i, for some integer i, even if the - // block size (sz) is not a multiple of the partition size. - char * old = static_cast(block) - + ((sz - partition_sz) / partition_sz) * partition_sz; - - // Set it to point to the end - nextof(old) = end; - - // Handle border case where sz == partition_sz (i.e., we're handling an array - // of 1 element) - if (old == block) - return block; - - // Iterate backwards, building a singly-linked list of pointers - for (char * iter = old - partition_sz; iter != block; - old = iter, iter -= partition_sz) - nextof(iter) = old; - - // Point the first pointer, too - nextof(block) = old; - - return block; -} - -// The following function attempts to find n contiguous chunks -// of size partition_size in the free list, starting at start. -// If it succeds, it returns the last chunk in that contiguous -// sequence, so that the sequence is known by [start, {retval}] -// If it fails, it does do either because it's at the end of the -// free list or hits a non-contiguous chunk. In either case, -// it will return 0, and set start to the last considered -// chunk. You are at the end of the free list if -// nextof(start) == 0. Otherwise, start points to the last -// chunk in the contiguous sequence, and nextof(start) points -// to the first chunk in the next contiguous sequence (assuming -// an ordered free list) -template -void * simple_segregated_storage::try_malloc_n( - void * & start, size_type n, const size_type partition_size) -{ - void * iter = nextof(start); - while (--n != 0) - { - void * next = nextof(iter); - if (next != static_cast(iter) + partition_size) - { - // next == 0 (end-of-list) or non-contiguous chunk found - start = iter; - return 0; - } - iter = next; - } - return iter; -} - -template -void * simple_segregated_storage::malloc_n(const size_type n, - const size_type partition_size) -{ - void * start = &first; - void * iter; - do - { - if (nextof(start) == 0) - return 0; - iter = try_malloc_n(start, n, partition_size); - } while (iter == 0); - void * const ret = nextof(start); - nextof(start) = nextof(iter); - return ret; -} - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/pool/singleton_pool.hpp b/src/vendor/stp/src/boost/pool/singleton_pool.hpp deleted file mode 100644 index 7290992c7..000000000 --- a/src/vendor/stp/src/boost/pool/singleton_pool.hpp +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (C) 2000, 2001 Stephen Cleary -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. - -#ifndef BOOST_SINGLETON_POOL_HPP -#define BOOST_SINGLETON_POOL_HPP - -#include - -// boost::pool -#include -// boost::details::pool::singleton_default -#include -// boost::details::pool::guard -#include - -namespace boost { - -// -// The singleton_pool class allows other pool interfaces for types of the same -// size to share the same pool -// -template -struct singleton_pool -{ - public: - typedef Tag tag; - typedef Mutex mutex; - typedef UserAllocator user_allocator; - typedef typename pool::size_type size_type; - typedef typename pool::difference_type difference_type; - - BOOST_STATIC_CONSTANT(unsigned, requested_size = RequestedSize); - BOOST_STATIC_CONSTANT(unsigned, next_size = NextSize); - - private: - struct pool_type: Mutex - { - pool p; - pool_type():p(RequestedSize, NextSize) { } - }; - - typedef details::pool::singleton_default singleton; - - singleton_pool(); - - public: - static void * malloc() - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - return p.p.malloc(); - } - static void * ordered_malloc() - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - return p.p.ordered_malloc(); - } - static void * ordered_malloc(const size_type n) - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - return p.p.ordered_malloc(n); - } - static bool is_from(void * const ptr) - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - return p.p.is_from(ptr); - } - static void free(void * const ptr) - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - p.p.free(ptr); - } - static void ordered_free(void * const ptr) - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - p.p.ordered_free(ptr); - } - static void free(void * const ptr, const size_type n) - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - p.p.free(ptr, n); - } - static void ordered_free(void * const ptr, const size_type n) - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - p.p.ordered_free(ptr, n); - } - static bool release_memory() - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - return p.p.release_memory(); - } - static bool purge_memory() - { - pool_type & p = singleton::instance(); - details::pool::guard g(p); - return p.p.purge_memory(); - } -}; - -} // namespace boost - -#endif diff --git a/src/vendor/stp/src/boost/static_assert.hpp b/src/vendor/stp/src/boost/static_assert.hpp deleted file mode 100644 index 5bded5ea2..000000000 --- a/src/vendor/stp/src/boost/static_assert.hpp +++ /dev/null @@ -1,132 +0,0 @@ -// (C) Copyright John Maddock 2000. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/static_assert for documentation. - -/* - Revision history: - 02 August 2000 - Initial version. -*/ - -#ifndef BOOST_STATIC_ASSERT_HPP -#define BOOST_STATIC_ASSERT_HPP - -#include -#include - -#ifdef __BORLANDC__ -// -// workaround for buggy integral-constant expression support: -#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS -#endif - -#if defined(__GNUC__) && (__GNUC__ == 3) && ((__GNUC_MINOR__ == 3) || (__GNUC_MINOR__ == 4)) -// gcc 3.3 and 3.4 don't produce good error messages with the default version: -# define BOOST_SA_GCC_WORKAROUND -#endif - -// -// If the compiler issues warnings about old C style casts, -// then enable this: -// -#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))) -# define BOOST_STATIC_ASSERT_BOOL_CAST( x ) ((x) == 0 ? false : true) -#else -# define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x) -#endif - -#ifdef BOOST_HAS_STATIC_ASSERT -# define BOOST_STATIC_ASSERT( B ) static_assert(B, #B) -#else - -namespace boost{ - -// HP aCC cannot deal with missing names for template value parameters -template struct STATIC_ASSERTION_FAILURE; - -template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; - -// HP aCC cannot deal with missing names for template value parameters -template struct static_assert_test{}; - -} - -// -// Implicit instantiation requires that all member declarations be -// instantiated, but that the definitions are *not* instantiated. -// -// It's not particularly clear how this applies to enum's or typedefs; -// both are described as declarations [7.1.3] and [7.2] in the standard, -// however some compilers use "delayed evaluation" of one or more of -// these when implicitly instantiating templates. We use typedef declarations -// by default, but try defining BOOST_USE_ENUM_STATIC_ASSERT if the enum -// version gets better results from your compiler... -// -// Implementation: -// Both of these versions rely on sizeof(incomplete_type) generating an error -// message containing the name of the incomplete type. We use -// "STATIC_ASSERTION_FAILURE" as the type name here to generate -// an eye catching error message. The result of the sizeof expression is either -// used as an enum initialiser, or as a template argument depending which version -// is in use... -// Note that the argument to the assert is explicitly cast to bool using old- -// style casts: too many compilers currently have problems with static_cast -// when used inside integral constant expressions. -// -#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS) - -#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) -// __LINE__ macro broken when -ZI is used see Q199057 -// fortunately MSVC ignores duplicate typedef's. -#define BOOST_STATIC_ASSERT( B ) \ - typedef ::boost::static_assert_test<\ - sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)\ - > boost_static_assert_typedef_ -#elif defined(BOOST_MSVC) -#define BOOST_STATIC_ASSERT( B ) \ - typedef ::boost::static_assert_test<\ - sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\ - BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__) -#elif defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND) -// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error -// instead of warning in case of failure -# define BOOST_STATIC_ASSERT( B ) \ - typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \ - [ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >::value ] -#elif defined(__sgi) -// special version for SGI MIPSpro compiler -#define BOOST_STATIC_ASSERT( B ) \ - BOOST_STATIC_CONSTANT(bool, \ - BOOST_JOIN(boost_static_assert_test_, __LINE__) = ( B )); \ - typedef ::boost::static_assert_test<\ - sizeof(::boost::STATIC_ASSERTION_FAILURE< \ - BOOST_JOIN(boost_static_assert_test_, __LINE__) >)>\ - BOOST_JOIN(boost_static_assert_typedef_, __LINE__) -#elif BOOST_WORKAROUND(__MWERKS__, <= 0x3003) -// special version for CodeWarrior <= 8.x -#define BOOST_STATIC_ASSERT( B ) \ - BOOST_STATIC_CONSTANT(int, \ - BOOST_JOIN(boost_static_assert_test_, __LINE__) = \ - sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >) ) -#else -// generic version -#define BOOST_STATIC_ASSERT( B ) \ - typedef ::boost::static_assert_test<\ - sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\ - BOOST_JOIN(boost_static_assert_typedef_, __LINE__) -#endif - -#else -// alternative enum based implementation: -#define BOOST_STATIC_ASSERT( B ) \ - enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \ - = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) } -#endif -#endif // ndef BOOST_HAS_STATIC_ASSERT - -#endif // BOOST_STATIC_ASSERT_HPP - - diff --git a/src/vendor/stp/src/boost/type_traits/add_const.hpp b/src/vendor/stp/src/boost/type_traits/add_const.hpp deleted file mode 100644 index 29f0bd95b..000000000 --- a/src/vendor/stp/src/boost/type_traits/add_const.hpp +++ /dev/null @@ -1,47 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_ADD_CONST_HPP_INCLUDED -#define BOOST_TT_ADD_CONST_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -// * convert a type T to const type - add_const -// this is not required since the result is always -// the same as "T const", but it does suppress warnings -// from some compilers: - -#if defined(BOOST_MSVC) -// This bogus warning will appear when add_const is applied to a -// const volatile reference because we can't detect const volatile -// references with MSVC6. -# pragma warning(push) -# pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored -#endif - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_const,T,T const) - -#if defined(BOOST_MSVC) -# pragma warning(pop) -#endif - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_const,T&,T&) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_ADD_CONST_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/add_cv.hpp b/src/vendor/stp/src/boost/type_traits/add_cv.hpp deleted file mode 100644 index bfde76a62..000000000 --- a/src/vendor/stp/src/boost/type_traits/add_cv.hpp +++ /dev/null @@ -1,48 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_ADD_CV_HPP_INCLUDED -#define BOOST_TT_ADD_CV_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -// * convert a type T to a const volatile type - add_cv -// this is not required since the result is always -// the same as "T const volatile", but it does suppress warnings -// from some compilers: - -#if defined(BOOST_MSVC) -// This bogus warning will appear when add_volatile is applied to a -// const volatile reference because we can't detect const volatile -// references with MSVC6. -# pragma warning(push) -# pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored -#endif - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_cv,T,T const volatile) - -#if defined(BOOST_MSVC) -# pragma warning(pop) -#endif - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_cv,T&,T&) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_ADD_CV_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/add_pointer.hpp b/src/vendor/stp/src/boost/type_traits/add_pointer.hpp deleted file mode 100644 index 3e0e48189..000000000 --- a/src/vendor/stp/src/boost/type_traits/add_pointer.hpp +++ /dev/null @@ -1,72 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_ADD_POINTER_HPP_INCLUDED -#define BOOST_TT_ADD_POINTER_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -#if defined(__BORLANDC__) && (__BORLANDC__ < 0x5A0) -// -// For some reason this implementation stops Borlands compiler -// from dropping cv-qualifiers, it still fails with references -// to arrays for some reason though (shrug...) (JM 20021104) -// -template -struct add_pointer_impl -{ - typedef T* type; -}; -template -struct add_pointer_impl -{ - typedef T* type; -}; -template -struct add_pointer_impl -{ - typedef T* type; -}; -template -struct add_pointer_impl -{ - typedef T* type; -}; -template -struct add_pointer_impl -{ - typedef T* type; -}; - -#else - -template -struct add_pointer_impl -{ - typedef typename remove_reference::type no_ref_type; - typedef no_ref_type* type; -}; - -#endif - -} // namespace detail - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_pointer,T,typename boost::detail::add_pointer_impl::type) - -} // namespace boost - -#include - -#endif // BOOST_TT_ADD_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/add_reference.hpp b/src/vendor/stp/src/boost/type_traits/add_reference.hpp deleted file mode 100644 index 7dfb4bed8..000000000 --- a/src/vendor/stp/src/boost/type_traits/add_reference.hpp +++ /dev/null @@ -1,89 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_ADD_REFERENCE_HPP_INCLUDED -#define BOOST_TT_ADD_REFERENCE_HPP_INCLUDED - -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && defined(BOOST_MSVC6_MEMBER_TEMPLATES) - -template -struct reference_adder -{ - template struct result_ - { - typedef T& type; - }; -}; - -template <> -struct reference_adder -{ - template struct result_ - { - typedef T type; - }; -}; - -template -struct add_reference_impl -{ - typedef typename reference_adder< - ::boost::is_reference::value - >::template result_ result; - - typedef typename result::type type; -}; - -#else - -template -struct add_reference_impl -{ - typedef T& type; -}; - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1(typename T,add_reference,T&,T&) -#endif - -#endif - -// these full specialisations are always required: -BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void,void) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void const,void const) -BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void volatile,void volatile) -BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void const volatile,void const volatile) -#endif - -} // namespace detail - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_reference,T,typename boost::detail::add_reference_impl::type) - -// agurt, 07/mar/03: workaround Borland's ill-formed sensitivity to an additional -// level of indirection, here -#if BOOST_WORKAROUND(__BORLANDC__, < 0x600) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_reference,T&,T&) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/add_volatile.hpp b/src/vendor/stp/src/boost/type_traits/add_volatile.hpp deleted file mode 100644 index 491f1c2dd..000000000 --- a/src/vendor/stp/src/boost/type_traits/add_volatile.hpp +++ /dev/null @@ -1,47 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_ADD_VOLATILE_HPP_INCLUDED -#define BOOST_TT_ADD_VOLATILE_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -// * convert a type T to volatile type - add_volatile -// this is not required since the result is always -// the same as "T volatile", but it does suppress warnings -// from some compilers: - -#if defined(BOOST_MSVC) -// This bogus warning will appear when add_volatile is applied to a -// const volatile reference because we can't detect const volatile -// references with MSVC6. -# pragma warning(push) -# pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored -#endif - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_volatile,T,T volatile) - -#if defined(BOOST_MSVC) -# pragma warning(pop) -#endif - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_volatile,T&,T&) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_ADD_VOLATILE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/aligned_storage.hpp b/src/vendor/stp/src/boost/type_traits/aligned_storage.hpp deleted file mode 100644 index 5420f2673..000000000 --- a/src/vendor/stp/src/boost/type_traits/aligned_storage.hpp +++ /dev/null @@ -1,13 +0,0 @@ - -// Copyright (C) John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED -# define BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED -# include -#endif // BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/alignment_of.hpp b/src/vendor/stp/src/boost/type_traits/alignment_of.hpp deleted file mode 100644 index 51357ce56..000000000 --- a/src/vendor/stp/src/boost/type_traits/alignment_of.hpp +++ /dev/null @@ -1,128 +0,0 @@ - -// (C) Copyright John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_ALIGNMENT_OF_HPP_INCLUDED -#define BOOST_TT_ALIGNMENT_OF_HPP_INCLUDED - -#include -#include - -#include -// should be the last #include -#include - -#ifdef BOOST_MSVC -# pragma warning(push) -# pragma warning(disable: 4121 4512) // alignment is sensitive to packing -#endif -#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) -#pragma option push -Vx- -Ve- -#endif - -namespace boost { - -template struct alignment_of; - -// get the alignment of some arbitrary type: -namespace detail { - -#ifdef BOOST_MSVC -#pragma warning(push) -#pragma warning(disable:4324) // structure was padded due to __declspec(align()) -#endif -template -struct alignment_of_hack -{ - char c; - T t; - alignment_of_hack(); -}; -#ifdef BOOST_MSVC -#pragma warning(pop) -#endif - -template -struct alignment_logic -{ - BOOST_STATIC_CONSTANT(std::size_t, value = A < S ? A : S); -}; - - -template< typename T > -struct alignment_of_impl -{ -#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1400) - // - // With MSVC both the native __alignof operator - // and our own logic gets things wrong from time to time :-( - // Using a combination of the two seems to make the most of a bad job: - // - BOOST_STATIC_CONSTANT(std::size_t, value = - (::boost::detail::alignment_logic< - sizeof(::boost::detail::alignment_of_hack) - sizeof(T), - __alignof(T) - >::value)); -#elif !defined(BOOST_ALIGNMENT_OF) - BOOST_STATIC_CONSTANT(std::size_t, value = - (::boost::detail::alignment_logic< - sizeof(::boost::detail::alignment_of_hack) - sizeof(T), - sizeof(T) - >::value)); -#else - // - // We put this here, rather than in the definition of - // alignment_of below, because MSVC's __alignof doesn't - // always work in that context for some unexplained reason. - // (See type_with_alignment tests for test cases). - // - BOOST_STATIC_CONSTANT(std::size_t, value = BOOST_ALIGNMENT_OF(T)); -#endif -}; - -} // namespace detail - -BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(alignment_of,T,::boost::detail::alignment_of_impl::value) - -// references have to be treated specially, assume -// that a reference is just a special pointer: -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -template -struct alignment_of - : alignment_of -{ -}; -#endif -#ifdef __BORLANDC__ -// long double gives an incorrect value of 10 (!) -// unless we do this... -struct long_double_wrapper{ long double ld; }; -template<> struct alignment_of - : public alignment_of{}; -#endif - -// void has to be treated specially: -BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void,0) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void const,0) -BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void volatile,0) -BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void const volatile,0) -#endif - -} // namespace boost - -#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) -#pragma option pop -#endif -#ifdef BOOST_MSVC -# pragma warning(pop) -#endif - -#include - -#endif // BOOST_TT_ALIGNMENT_OF_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/alignment_traits.hpp b/src/vendor/stp/src/boost/type_traits/alignment_traits.hpp deleted file mode 100644 index 2ed6934da..000000000 --- a/src/vendor/stp/src/boost/type_traits/alignment_traits.hpp +++ /dev/null @@ -1,15 +0,0 @@ - -// (C) Copyright John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_ALIGNMENT_TRAITS_HPP_INCLUDED -#define BOOST_TT_ALIGNMENT_TRAITS_HPP_INCLUDED - -#include -#include - -#endif // BOOST_TT_ALIGNMENT_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/arithmetic_traits.hpp b/src/vendor/stp/src/boost/type_traits/arithmetic_traits.hpp deleted file mode 100644 index e4670e6b3..000000000 --- a/src/vendor/stp/src/boost/type_traits/arithmetic_traits.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// defines traits classes for arithmetic types: -// is_void, is_integral, is_float, is_arithmetic, is_fundamental. - -#ifndef BOOST_TT_ARITHMETIC_TRAITS_HPP_INCLUDED -#define BOOST_TT_ARITHMETIC_TRAITS_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#endif // BOOST_TT_ARITHMETIC_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/array_traits.hpp b/src/vendor/stp/src/boost/type_traits/array_traits.hpp deleted file mode 100644 index a68ae7317..000000000 --- a/src/vendor/stp/src/boost/type_traits/array_traits.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_ARRAY_TRAITS_HPP_INCLUDED -#define BOOST_TT_ARRAY_TRAITS_HPP_INCLUDED - -#include - -#endif // BOOST_TT_ARRAY_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/broken_compiler_spec.hpp b/src/vendor/stp/src/boost/type_traits/broken_compiler_spec.hpp deleted file mode 100644 index fb51769d9..000000000 --- a/src/vendor/stp/src/boost/type_traits/broken_compiler_spec.hpp +++ /dev/null @@ -1,117 +0,0 @@ - -// Copyright 2001-2003 Aleksey Gurtovoy. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_BROKEN_COMPILER_SPEC_HPP_INCLUDED -#define BOOST_TT_BROKEN_COMPILER_SPEC_HPP_INCLUDED - -#include -#include - -// these are needed regardless of BOOST_TT_NO_BROKEN_COMPILER_SPEC -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -namespace boost { namespace detail { -template< typename T > struct remove_const_impl { typedef T type; }; -template< typename T > struct remove_volatile_impl { typedef T type; }; -template< typename T > struct remove_pointer_impl { typedef T type; }; -template< typename T > struct remove_reference_impl { typedef T type; }; -typedef int invoke_BOOST_TT_BROKEN_COMPILER_SPEC_outside_all_namespaces; -}} -#endif - -// agurt, 27/jun/03: disable the workaround if user defined -// BOOST_TT_NO_BROKEN_COMPILER_SPEC -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - || defined(BOOST_TT_NO_BROKEN_COMPILER_SPEC) - -# define BOOST_TT_BROKEN_COMPILER_SPEC(T) /**/ - -#else - -// same as BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1 macro, except that it -// never gets #undef-ined -# define BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(trait,spec,result) \ -template<> struct trait##_impl \ -{ \ - typedef result type; \ -}; \ -/**/ - -# define BOOST_TT_AUX_REMOVE_CONST_VOLATILE_RANK1_SPEC(T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_const,T const,T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_const,T const volatile,T volatile) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_volatile,T volatile,T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_volatile,T const volatile,T const) \ - /**/ - -# define BOOST_TT_AUX_REMOVE_PTR_REF_RANK_1_SPEC(T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_pointer,T*,T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_pointer,T*const,T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_pointer,T*volatile,T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_pointer,T*const volatile,T) \ - BOOST_TT_AUX_BROKEN_TYPE_TRAIT_SPEC1(remove_reference,T&,T) \ - /**/ - -# define BOOST_TT_AUX_REMOVE_PTR_REF_RANK_2_SPEC(T) \ - BOOST_TT_AUX_REMOVE_PTR_REF_RANK_1_SPEC(T) \ - BOOST_TT_AUX_REMOVE_PTR_REF_RANK_1_SPEC(T const) \ - BOOST_TT_AUX_REMOVE_PTR_REF_RANK_1_SPEC(T volatile) \ - BOOST_TT_AUX_REMOVE_PTR_REF_RANK_1_SPEC(T const volatile) \ - /**/ - -# define BOOST_TT_AUX_REMOVE_ALL_RANK_1_SPEC(T) \ - BOOST_TT_AUX_REMOVE_PTR_REF_RANK_2_SPEC(T) \ - BOOST_TT_AUX_REMOVE_CONST_VOLATILE_RANK1_SPEC(T) \ - /**/ - -# define BOOST_TT_AUX_REMOVE_ALL_RANK_2_SPEC(T) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_1_SPEC(T*) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_1_SPEC(T const*) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_1_SPEC(T volatile*) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_1_SPEC(T const volatile*) \ - /**/ - -# define BOOST_TT_BROKEN_COMPILER_SPEC(T) \ - namespace boost { namespace detail { \ - typedef invoke_BOOST_TT_BROKEN_COMPILER_SPEC_outside_all_namespaces \ - please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_outside_all_namespaces; \ - BOOST_TT_AUX_REMOVE_ALL_RANK_1_SPEC(T) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_2_SPEC(T) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_2_SPEC(T*) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_2_SPEC(T const*) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_2_SPEC(T volatile*) \ - BOOST_TT_AUX_REMOVE_ALL_RANK_2_SPEC(T const volatile*) \ - }} \ - /**/ - -# include - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -BOOST_TT_BROKEN_COMPILER_SPEC(bool) -BOOST_TT_BROKEN_COMPILER_SPEC(char) -#ifndef BOOST_NO_INTRINSIC_WCHAR_T -BOOST_TT_BROKEN_COMPILER_SPEC(wchar_t) -#endif -BOOST_TT_BROKEN_COMPILER_SPEC(signed char) -BOOST_TT_BROKEN_COMPILER_SPEC(unsigned char) -BOOST_TT_BROKEN_COMPILER_SPEC(signed short) -BOOST_TT_BROKEN_COMPILER_SPEC(unsigned short) -BOOST_TT_BROKEN_COMPILER_SPEC(signed int) -BOOST_TT_BROKEN_COMPILER_SPEC(unsigned int) -BOOST_TT_BROKEN_COMPILER_SPEC(signed long) -BOOST_TT_BROKEN_COMPILER_SPEC(unsigned long) -BOOST_TT_BROKEN_COMPILER_SPEC(float) -BOOST_TT_BROKEN_COMPILER_SPEC(double) -//BOOST_TT_BROKEN_COMPILER_SPEC(long double) - -// for backward compatibility -#define BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(T) \ - BOOST_TT_BROKEN_COMPILER_SPEC(T) \ -/**/ - -#endif // BOOST_TT_BROKEN_COMPILER_SPEC_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/composite_traits.hpp b/src/vendor/stp/src/boost/type_traits/composite_traits.hpp deleted file mode 100644 index 985a4c51d..000000000 --- a/src/vendor/stp/src/boost/type_traits/composite_traits.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// defines traits classes for composite types: -// is_array, is_pointer, is_reference, is_member_pointer, is_enum, is_union. -// - -#ifndef BOOST_TT_COMPOSITE_TRAITS_HPP_INCLUDED -#define BOOST_TT_COMPOSITE_TRAITS_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include - -#endif // BOOST_TT_COMPOSITE_TRAITS_HPP_INCLUDED - - - - - diff --git a/src/vendor/stp/src/boost/type_traits/config.hpp b/src/vendor/stp/src/boost/type_traits/config.hpp deleted file mode 100644 index 94f13769a..000000000 --- a/src/vendor/stp/src/boost/type_traits/config.hpp +++ /dev/null @@ -1,76 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_CONFIG_HPP_INCLUDED -#define BOOST_TT_CONFIG_HPP_INCLUDED - -#ifndef BOOST_CONFIG_HPP -#include -#endif - -#include - -// -// whenever we have a conversion function with elipses -// it needs to be declared __cdecl to suppress compiler -// warnings from MS and Borland compilers (this *must* -// appear before we include is_same.hpp below): -#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32)) -# define BOOST_TT_DECL __cdecl -#else -# define BOOST_TT_DECL /**/ -#endif - -# if (BOOST_WORKAROUND(__MWERKS__, < 0x3000) \ - || BOOST_WORKAROUND(BOOST_MSVC, <= 1301) \ - || !defined(__EDG_VERSION__) && BOOST_WORKAROUND(__GNUC__, < 3) \ - || BOOST_WORKAROUND(__IBMCPP__, < 600 ) \ - || BOOST_WORKAROUND(__BORLANDC__, < 0x5A0) \ - || defined(__ghs) \ - || BOOST_WORKAROUND(__HP_aCC, < 60700) \ - || BOOST_WORKAROUND(MPW_CPLUS, BOOST_TESTED_AT(0x890)) \ - || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))) \ - && defined(BOOST_NO_IS_ABSTRACT) - -# define BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION 1 - -#endif - -#ifndef BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION -# define BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION 1 -#endif - -// -// Define BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -// when we can't test for function types with elipsis: -// -#if BOOST_WORKAROUND(__GNUC__, < 3) -# define BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -#endif - -// -// define BOOST_TT_TEST_MS_FUNC_SIGS -// when we want to test __stdcall etc function types with is_function etc -// (Note, does not work with Borland, even though it does support __stdcall etc): -// -#if defined(_MSC_EXTENSIONS) && !defined(__BORLANDC__) -# define BOOST_TT_TEST_MS_FUNC_SIGS -#endif - -// -// define BOOST_TT_NO_CV_FUNC_TEST -// if tests for cv-qualified member functions don't -// work in is_member_function_pointer -// -#if BOOST_WORKAROUND(__MWERKS__, < 0x3000) || BOOST_WORKAROUND(__IBMCPP__, <= 600) -# define BOOST_TT_NO_CV_FUNC_TEST -#endif - -#endif // BOOST_TT_CONFIG_HPP_INCLUDED - - diff --git a/src/vendor/stp/src/boost/type_traits/conversion_traits.hpp b/src/vendor/stp/src/boost/type_traits/conversion_traits.hpp deleted file mode 100644 index c8e5139b3..000000000 --- a/src/vendor/stp/src/boost/type_traits/conversion_traits.hpp +++ /dev/null @@ -1,17 +0,0 @@ - -// Copyright 2000 John Maddock (john@johnmaddock.co.uk) -// Copyright 2000 Jeremy Siek (jsiek@lsc.nd.edu) -// Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) -// -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED -#define BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED - -#include - -#endif // BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/cv_traits.hpp b/src/vendor/stp/src/boost/type_traits/cv_traits.hpp deleted file mode 100644 index 5bd6c4f06..000000000 --- a/src/vendor/stp/src/boost/type_traits/cv_traits.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// defines traits classes for cv-qualified types: -// is_const, is_volatile, remove_const, remove_volatile, remove_cv. - -#ifndef BOOST_TT_CV_TRAITS_HPP_INCLUDED -#define BOOST_TT_CV_TRAITS_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include - -#endif // BOOST_TT_CV_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/decay.hpp b/src/vendor/stp/src/boost/type_traits/decay.hpp deleted file mode 100644 index c23a9b0f1..000000000 --- a/src/vendor/stp/src/boost/type_traits/decay.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// (C) Copyright John Maddock & Thorsten Ottosen 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_DECAY_HPP_INCLUDED -#define BOOST_TT_DECAY_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - - template< class T > - struct decay - { - private: - typedef BOOST_DEDUCED_TYPENAME remove_reference::type Ty; - public: - typedef BOOST_DEDUCED_TYPENAME mpl::eval_if< - is_array, - mpl::identity::type*>, - BOOST_DEDUCED_TYPENAME mpl::eval_if< - is_function, - add_pointer, - mpl::identity - > - >::type type; - }; - -} // namespace boost - - -#endif // BOOST_TT_DECAY_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/bool_trait_def.hpp b/src/vendor/stp/src/boost/type_traits/detail/bool_trait_def.hpp deleted file mode 100644 index 19bb18cec..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/bool_trait_def.hpp +++ /dev/null @@ -1,173 +0,0 @@ - -// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// $Source$ -// $Date: 2006-07-12 07:10:22 -0400 (Wed, 12 Jul 2006) $ -// $Revision: 34511 $ - -#include -#include -#include -#include -#include - -// -// Unfortunately some libraries have started using this header without -// cleaning up afterwards: so we'd better undef the macros just in case -// they've been defined already.... -// -#ifdef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL -#undef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL -#undef BOOST_TT_AUX_BOOL_C_BASE -#undef BOOST_TT_AUX_BOOL_TRAIT_DEF1 -#undef BOOST_TT_AUX_BOOL_TRAIT_DEF2 -#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC1 -#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC2 -#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1 -#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2 -#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1 -#undef BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1 -#endif - -#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x570) -# define BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ - typedef ::boost::integral_constant type; \ - enum { value = type::value }; \ - /**/ -# define BOOST_TT_AUX_BOOL_C_BASE(C) - -#elif defined(BOOST_MSVC) && BOOST_MSVC < 1300 - -# define BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ - typedef ::boost::integral_constant base_; \ - using base_::value; \ - /**/ - -#endif - -#ifndef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL -# define BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) /**/ -#endif - -#ifndef BOOST_TT_AUX_BOOL_C_BASE -# define BOOST_TT_AUX_BOOL_C_BASE(C) : ::boost::integral_constant -#endif - - -#define BOOST_TT_AUX_BOOL_TRAIT_DEF1(trait,T,C) \ -template< typename T > struct trait \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \ -}; \ -\ -BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \ -/**/ - - -#define BOOST_TT_AUX_BOOL_TRAIT_DEF2(trait,T1,T2,C) \ -template< typename T1, typename T2 > struct trait \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ - BOOST_MPL_AUX_LAMBDA_SUPPORT(2,trait,(T1,T2)) \ -}; \ -\ -BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(2,trait) \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp,C) \ -template<> struct trait< sp > \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ - BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(sp)) \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_SPEC2(trait,sp1,sp2,C) \ -template<> struct trait< sp1,sp2 > \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ - BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,trait,(sp1,sp2)) \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(trait,sp,C) \ -template<> struct trait##_impl< sp > \ -{ \ - BOOST_STATIC_CONSTANT(bool, value = (C)); \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,sp1,sp2,C) \ -template<> struct trait##_impl< sp1,sp2 > \ -{ \ - BOOST_STATIC_CONSTANT(bool, value = (C)); \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(param,trait,sp,C) \ -template< param > struct trait< sp > \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(param1,param2,trait,sp,C) \ -template< param1, param2 > struct trait< sp > \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(param,trait,sp1,sp2,C) \ -template< param > struct trait< sp1,sp2 > \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ - BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,trait,(sp1,sp2)) \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(param1,param2,trait,sp1,sp2,C) \ -template< param1, param2 > struct trait< sp1,sp2 > \ - BOOST_TT_AUX_BOOL_C_BASE(C) \ -{ \ - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \ -}; \ -/**/ - -#define BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(param,trait,sp1,sp2,C) \ -template< param > struct trait##_impl< sp1,sp2 > \ -{ \ - BOOST_STATIC_CONSTANT(bool, value = (C)); \ -}; \ -/**/ - -#ifndef BOOST_NO_CV_SPECIALIZATIONS -# define BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(trait,sp,value) \ - BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp,value) \ - BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp const,value) \ - BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp volatile,value) \ - BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp const volatile,value) \ - /**/ -#else -# define BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(trait,sp,value) \ - BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp,value) \ - /**/ -#endif diff --git a/src/vendor/stp/src/boost/type_traits/detail/bool_trait_undef.hpp b/src/vendor/stp/src/boost/type_traits/detail/bool_trait_undef.hpp deleted file mode 100644 index 2259c644f..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/bool_trait_undef.hpp +++ /dev/null @@ -1,27 +0,0 @@ - -// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// $Source$ -// $Date: 2004-09-02 11:41:37 -0400 (Thu, 02 Sep 2004) $ -// $Revision: 24874 $ - -#undef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL -#undef BOOST_TT_AUX_BOOL_C_BASE -#undef BOOST_TT_AUX_BOOL_TRAIT_DEF1 -#undef BOOST_TT_AUX_BOOL_TRAIT_DEF2 -#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC1 -#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC2 -#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1 -#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1 -#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2 -#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1 -#undef BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1 diff --git a/src/vendor/stp/src/boost/type_traits/detail/cv_traits_impl.hpp b/src/vendor/stp/src/boost/type_traits/detail/cv_traits_impl.hpp deleted file mode 100644 index b3fa59505..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/cv_traits_impl.hpp +++ /dev/null @@ -1,97 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED -#define BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED - -#include -#include - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -// implementation helper: - - -#if !(BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 2)) -namespace boost { -namespace detail { -#else -#include -namespace boost { -namespace type_traits { -namespace gcc8503 { -#endif - -template struct cv_traits_imp {}; - -template -struct cv_traits_imp -{ - BOOST_STATIC_CONSTANT(bool, is_const = false); - BOOST_STATIC_CONSTANT(bool, is_volatile = false); - typedef T unqualified_type; -}; - -template -struct cv_traits_imp -{ - BOOST_STATIC_CONSTANT(bool, is_const = true); - BOOST_STATIC_CONSTANT(bool, is_volatile = false); - typedef T unqualified_type; -}; - -template -struct cv_traits_imp -{ - BOOST_STATIC_CONSTANT(bool, is_const = false); - BOOST_STATIC_CONSTANT(bool, is_volatile = true); - typedef T unqualified_type; -}; - -template -struct cv_traits_imp -{ - BOOST_STATIC_CONSTANT(bool, is_const = true); - BOOST_STATIC_CONSTANT(bool, is_volatile = true); - typedef T unqualified_type; -}; - -#if BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 2) -// We have to exclude function pointers -// (see http://gcc.gnu.org/bugzilla/show_bug.cgi?8503) -yes_type mini_funcptr_tester(...); -no_type mini_funcptr_tester(const volatile void*); - -} // namespace gcc8503 -} // namespace type_traits - -namespace detail { - -// Use the implementation above for non function pointers -template -struct cv_traits_imp : ::boost::type_traits::gcc8503::cv_traits_imp { }; - -// Functions are never cv-qualified -template struct cv_traits_imp -{ - BOOST_STATIC_CONSTANT(bool, is_const = false); - BOOST_STATIC_CONSTANT(bool, is_volatile = false); - typedef T unqualified_type; -}; - -#endif - -} // namespace detail -} // namespace boost - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -#endif // BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/false_result.hpp b/src/vendor/stp/src/boost/type_traits/detail/false_result.hpp deleted file mode 100644 index e65e8bc25..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/false_result.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright David Abrahams 2002. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED -#define BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED - -#include - -namespace boost { -namespace type_traits { - -// Utility class which always "returns" false -struct false_result -{ - template struct result_ - { - BOOST_STATIC_CONSTANT(bool, value = false); - }; -}; - -}} // namespace boost::type_traits - -#endif // BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/ice_and.hpp b/src/vendor/stp/src/boost/type_traits/detail/ice_and.hpp deleted file mode 100644 index 8b461b9ff..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/ice_and.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// (C) Copyright John Maddock and Steve Cleary 2000. -// -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_DETAIL_ICE_AND_HPP_INCLUDED -#define BOOST_TT_DETAIL_ICE_AND_HPP_INCLUDED - -#include - -namespace boost { -namespace type_traits { - -template -struct ice_and; - -template -struct ice_and -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template <> -struct ice_and -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_ICE_AND_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/ice_eq.hpp b/src/vendor/stp/src/boost/type_traits/detail/ice_eq.hpp deleted file mode 100644 index ea42a60b6..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/ice_eq.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock and Steve Cleary 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_DETAIL_ICE_EQ_HPP_INCLUDED -#define BOOST_TT_DETAIL_ICE_EQ_HPP_INCLUDED - -#include - -namespace boost { -namespace type_traits { - -template -struct ice_eq -{ - BOOST_STATIC_CONSTANT(bool, value = (b1 == b2)); -}; - -template -struct ice_ne -{ - BOOST_STATIC_CONSTANT(bool, value = (b1 != b2)); -}; - -#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -template bool const ice_eq::value; -template bool const ice_ne::value; -#endif - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_ICE_EQ_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/ice_not.hpp b/src/vendor/stp/src/boost/type_traits/detail/ice_not.hpp deleted file mode 100644 index ee1dca0ec..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/ice_not.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright John Maddock and Steve Cleary 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_DETAIL_ICE_NOT_HPP_INCLUDED -#define BOOST_TT_DETAIL_ICE_NOT_HPP_INCLUDED - -#include - -namespace boost { -namespace type_traits { - -template -struct ice_not -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; - -template <> -struct ice_not -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_ICE_NOT_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/ice_or.hpp b/src/vendor/stp/src/boost/type_traits/detail/ice_or.hpp deleted file mode 100644 index f88d9f6ae..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/ice_or.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock and Steve Cleary 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_DETAIL_ICE_OR_HPP_INCLUDED -#define BOOST_TT_DETAIL_ICE_OR_HPP_INCLUDED - -#include - -namespace boost { -namespace type_traits { - -template -struct ice_or; - -template -struct ice_or -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; - -template <> -struct ice_or -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_ICE_OR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/is_function_ptr_helper.hpp b/src/vendor/stp/src/boost/type_traits/detail/is_function_ptr_helper.hpp deleted file mode 100644 index 605d0bc2e..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/is_function_ptr_helper.hpp +++ /dev/null @@ -1,220 +0,0 @@ - -// Copyright 2000 John Maddock (john@johnmaddock.co.uk) -// Copyright 2002 Aleksey Gurtovoy (agurtovoy@meta-comm.com) -// -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#if !defined(BOOST_PP_IS_ITERATING) - -///// header body - -#ifndef BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED -#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED - -#include - -#if defined(BOOST_TT_PREPROCESSING_MODE) -# include -# include -# include -#endif - -namespace boost { -namespace type_traits { - -template -struct is_function_ptr_helper -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -#if !defined(BOOST_TT_PREPROCESSING_MODE) -// preprocessor-generated part, don't edit by hand! - -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#else - -#undef BOOST_STATIC_CONSTANT -#define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, 25, "boost/type_traits/detail/is_function_ptr_helper.hpp")) -#include BOOST_PP_ITERATE() - -#endif // BOOST_TT_PREPROCESSING_MODE - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED - -///// iteration - -#else -#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1) - -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_function_ptr_helper { BOOST_STATIC_CONSTANT(bool, value = true); }; -@#endif -#undef BOOST_PP_COUNTER -#endif // BOOST_PP_IS_ITERATING diff --git a/src/vendor/stp/src/boost/type_traits/detail/is_function_ptr_tester.hpp b/src/vendor/stp/src/boost/type_traits/detail/is_function_ptr_tester.hpp deleted file mode 100644 index c1a3c6a5f..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/is_function_ptr_tester.hpp +++ /dev/null @@ -1,654 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#if !defined(BOOST_PP_IS_ITERATING) - -///// header body - -#ifndef BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED -#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED - -#include -#include - -#if defined(BOOST_TT_PREPROCESSING_MODE) -# include -# include -# include -#endif - -namespace boost { -namespace type_traits { - -// Note it is acceptible to use ellipsis here, since the argument will -// always be a pointer type of some sort (JM 2005/06/04): -no_type BOOST_TT_DECL is_function_ptr_tester(...); - -#if !defined(BOOST_TT_PREPROCESSING_MODE) -// pre-processed code, don't edit, try GNU cpp with -// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename - -template -yes_type is_function_ptr_tester(R (*)()); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)()); -template -yes_type is_function_ptr_tester(R (__stdcall*)( ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)()); -template -yes_type is_function_ptr_tester(R (__fastcall*)( ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)()); -template -yes_type is_function_ptr_tester(R (__cdecl*)( ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); -#endif -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); -template -yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); -#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); -template -yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); -#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); -template -yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); -#endif -#else - -#define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, 25, "boost/type_traits/detail/is_function_ptr_tester.hpp")) -#include BOOST_PP_ITERATE() - -#endif // BOOST_TT_PREPROCESSING_MODE - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED - -///// iteration - -#else -#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1) -#undef __stdcall -#undef __fastcall -#undef __cdecl - -template -yes_type is_function_ptr_tester(R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); -@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_function_ptr_tester(R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); -@#endif -@#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_function_ptr_tester(R (__stdcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); -template -yes_type is_function_ptr_tester(R (__stdcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); -@#ifndef _MANAGED -template -yes_type is_function_ptr_tester(R (__fastcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); -template -yes_type is_function_ptr_tester(R (__fastcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); -@#endif -template -yes_type is_function_ptr_tester(R (__cdecl*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); -template -yes_type is_function_ptr_tester(R (__cdecl*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); -@#endif - -#undef BOOST_PP_COUNTER -#endif // BOOST_PP_IS_ITERATING diff --git a/src/vendor/stp/src/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp b/src/vendor/stp/src/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp deleted file mode 100644 index 4f75f14d0..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp +++ /dev/null @@ -1,817 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#if !defined(BOOST_PP_IS_ITERATING) - -///// header body - -#ifndef BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED -#define BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED - -#include - -#if defined(BOOST_TT_PREPROCESSING_MODE) -# include -# include -# include -#endif - -namespace boost { -namespace type_traits { - -template -struct is_mem_fun_pointer_impl -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -#if !defined(BOOST_TT_PREPROCESSING_MODE) -// pre-processed code, don't edit, try GNU cpp with -// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif - -#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -#endif -#endif - -#else - -#undef BOOST_STATIC_CONSTANT -#define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, 25, "boost/type_traits/detail/is_mem_fun_pointer_impl.hpp")) -#include BOOST_PP_ITERATE() - -#endif // BOOST_TT_PREPROCESSING_MODE - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED - -///// iteration - -#else -#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1) - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -@#endif - -@#if !defined(BOOST_TT_NO_CV_FUNC_TEST) -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; - -template -struct is_mem_fun_pointer_impl { BOOST_STATIC_CONSTANT(bool, value = true); }; -@#endif -@#endif - -#undef BOOST_PP_COUNTER -#endif // BOOST_PP_IS_ITERATING - diff --git a/src/vendor/stp/src/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp b/src/vendor/stp/src/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp deleted file mode 100644 index e6532d39d..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp +++ /dev/null @@ -1,2759 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#if !defined(BOOST_PP_IS_ITERATING) - -///// header body - -#ifndef BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED -#define BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED - -#include -#include - -#if defined(BOOST_TT_PREPROCESSING_MODE) -# include -# include -# include -#endif - -namespace boost { -namespace type_traits { - -no_type BOOST_TT_DECL is_mem_fun_pointer_tester(...); - -#if !defined(BOOST_TT_PREPROCESSING_MODE) -// pre-processed code, don't edit, try GNU cpp with -// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)()); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)()); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)()); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)()); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile); -#endif -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile); - -#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile); -#endif -#ifdef BOOST_TT_TEST_MS_FUNC_SIGS -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile); - -#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile); -#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile); -#endif - -#else - -#define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, 25, "boost/type_traits/detail/is_mem_fun_pointer_tester.hpp")) -#include BOOST_PP_ITERATE() - -#endif // BOOST_TT_PREPROCESSING_MODE - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED - -///// iteration - -#else -#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1) -#undef __stdcall -#undef __fastcall -#undef __cdecl - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile); - -@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile); -@#endif -@#ifdef BOOST_TT_TEST_MS_FUNC_SIGS // Other calling conventions used by MS compatible compilers: -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile); - -@#ifndef _MANAGED -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile); -@#endif - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile); - -template -yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile); -@#endif - -#undef BOOST_PP_COUNTER -#endif // BOOST_PP_IS_ITERATING diff --git a/src/vendor/stp/src/boost/type_traits/detail/size_t_trait_def.hpp b/src/vendor/stp/src/boost/type_traits/detail/size_t_trait_def.hpp deleted file mode 100644 index 472c6ac16..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/size_t_trait_def.hpp +++ /dev/null @@ -1,58 +0,0 @@ - -// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// $Source$ -// $Date: 2005-08-25 12:27:28 -0400 (Thu, 25 Aug 2005) $ -// $Revision: 30670 $ - -#include -#include -#include -#include - -#include - -#if !defined(BOOST_MSVC) || BOOST_MSVC >= 1300 -# define BOOST_TT_AUX_SIZE_T_BASE(C) ::boost::integral_constant -# define BOOST_TT_AUX_SIZE_T_TRAIT_VALUE_DECL(C) /**/ -#else -# define BOOST_TT_AUX_SIZE_T_BASE(C) ::boost::mpl::size_t -# define BOOST_TT_AUX_SIZE_T_TRAIT_VALUE_DECL(C) \ - typedef ::boost::mpl::size_t base_; \ - using base_::value; \ - /**/ -#endif - - -#define BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(trait,T,C) \ -template< typename T > struct trait \ - : BOOST_TT_AUX_SIZE_T_BASE(C) \ -{ \ - BOOST_TT_AUX_SIZE_T_TRAIT_VALUE_DECL(C) \ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \ -}; \ -\ -BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \ -/**/ - -#define BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(trait,spec,C) \ -template<> struct trait \ - : BOOST_TT_AUX_SIZE_T_BASE(C) \ -{ \ - BOOST_TT_AUX_SIZE_T_TRAIT_VALUE_DECL(C) \ - BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(spec)) \ -}; \ -/**/ - -#define BOOST_TT_AUX_SIZE_T_TRAIT_PARTIAL_SPEC1_1(param,trait,spec,C) \ -template< param > struct trait \ - : BOOST_TT_AUX_SIZE_T_BASE(C) \ -{ \ -}; \ -/**/ diff --git a/src/vendor/stp/src/boost/type_traits/detail/size_t_trait_undef.hpp b/src/vendor/stp/src/boost/type_traits/detail/size_t_trait_undef.hpp deleted file mode 100644 index 06a176dc8..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/size_t_trait_undef.hpp +++ /dev/null @@ -1,16 +0,0 @@ - -// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// $Source$ -// $Date: 2004-09-02 11:41:37 -0400 (Thu, 02 Sep 2004) $ -// $Revision: 24874 $ - -#undef BOOST_TT_AUX_SIZE_T_TRAIT_DEF1 -#undef BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1 -#undef BOOST_TT_AUX_SIZE_T_TRAIT_PARTIAL_SPEC1_1 diff --git a/src/vendor/stp/src/boost/type_traits/detail/template_arity_spec.hpp b/src/vendor/stp/src/boost/type_traits/detail/template_arity_spec.hpp deleted file mode 100644 index fe9b422e8..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/template_arity_spec.hpp +++ /dev/null @@ -1,31 +0,0 @@ - -// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#include -#include -#include -#include -#include - -#if defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \ - && defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION) -# define BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(i, name) \ -namespace mpl { namespace aux { \ -template< BOOST_MPL_PP_PARAMS(i, typename T) > \ -struct template_arity< \ - name< BOOST_MPL_PP_PARAMS(i, T) > \ - > \ - : int_ \ -{ \ -}; \ -}} \ -/**/ -#else -# define BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(i, name) /**/ -#endif diff --git a/src/vendor/stp/src/boost/type_traits/detail/type_trait_def.hpp b/src/vendor/stp/src/boost/type_traits/detail/type_trait_def.hpp deleted file mode 100644 index 644c7ac90..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/type_trait_def.hpp +++ /dev/null @@ -1,61 +0,0 @@ - -// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// $Source$ -// $Date: 2004-09-02 11:41:37 -0400 (Thu, 02 Sep 2004) $ -// $Revision: 24874 $ - -#include -#include - -#define BOOST_TT_AUX_TYPE_TRAIT_DEF1(trait,T,result) \ -template< typename T > struct trait \ -{ \ - typedef result type; \ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \ -}; \ -\ -BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \ -/**/ - -#define BOOST_TT_AUX_TYPE_TRAIT_SPEC1(trait,spec,result) \ -template<> struct trait \ -{ \ - typedef result type; \ - BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(spec)) \ -}; \ -/**/ - -#define BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(trait,spec,result) \ -template<> struct trait##_impl \ -{ \ - typedef result type; \ -}; \ -/**/ - -#define BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(param,trait,spec,result) \ -template< param > struct trait \ -{ \ - typedef result type; \ -}; \ -/**/ - -#define BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(param1,param2,trait,spec,result) \ -template< param1, param2 > struct trait \ -{ \ - typedef result; \ -}; \ -/**/ - -#define BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1(param,trait,spec,result) \ -template< param > struct trait##_impl \ -{ \ - typedef result type; \ -}; \ -/**/ diff --git a/src/vendor/stp/src/boost/type_traits/detail/type_trait_undef.hpp b/src/vendor/stp/src/boost/type_traits/detail/type_trait_undef.hpp deleted file mode 100644 index 9403b9bde..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/type_trait_undef.hpp +++ /dev/null @@ -1,19 +0,0 @@ - -// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// $Source$ -// $Date: 2004-09-02 11:41:37 -0400 (Thu, 02 Sep 2004) $ -// $Revision: 24874 $ - -#undef BOOST_TT_AUX_TYPE_TRAIT_DEF1 -#undef BOOST_TT_AUX_TYPE_TRAIT_SPEC1 -#undef BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1 -#undef BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1 -#undef BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2 -#undef BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1 diff --git a/src/vendor/stp/src/boost/type_traits/detail/wrap.hpp b/src/vendor/stp/src/boost/type_traits/detail/wrap.hpp deleted file mode 100644 index d0a75d06c..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/wrap.hpp +++ /dev/null @@ -1,18 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_DETAIL_WRAP_HPP_INCLUDED -#define BOOST_TT_DETAIL_WRAP_HPP_INCLUDED - -namespace boost { -namespace type_traits { - -template struct wrap {}; - -}} // namespace boost::type_traits - -#endif // BOOST_TT_DETAIL_WRAP_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/detail/yes_no_type.hpp b/src/vendor/stp/src/boost/type_traits/detail/yes_no_type.hpp deleted file mode 100644 index f58373022..000000000 --- a/src/vendor/stp/src/boost/type_traits/detail/yes_no_type.hpp +++ /dev/null @@ -1,26 +0,0 @@ - -// (C) Copyright John Maddock and Steve Cleary 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// macros and helpers for working with integral-constant-expressions. - -#ifndef BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED -#define BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED - -namespace boost { -namespace type_traits { - -typedef char yes_type; -struct no_type -{ - char padding[8]; -}; - -} // namespace type_traits -} // namespace boost - -#endif // BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/extent.hpp b/src/vendor/stp/src/boost/type_traits/extent.hpp deleted file mode 100644 index 27e8a670f..000000000 --- a/src/vendor/stp/src/boost/type_traits/extent.hpp +++ /dev/null @@ -1,145 +0,0 @@ - -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_EXTENT_HPP_INCLUDED -#define BOOST_TT_EXTENT_HPP_INCLUDED - -// should be the last #include -#include - -namespace boost { - -namespace detail{ - -#if defined( __CODEGEARC__ ) - // wrap the impl as main trait provides additional MPL lambda support - template < typename T, std::size_t N > - struct extent_imp { - static const std::size_t value = __array_extent(T, N); - }; - -#else - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = 0); -}; -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = R); -}; - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = R); -}; - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = R); -}; - -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = R); -}; - -#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) && !defined(__MWERKS__) -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp::value)); -}; -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = 0); -}; -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = 0); -}; -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = 0); -}; -template -struct extent_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = 0); -}; -#endif -#endif - -#endif // non-CodeGear implementation -} // ::boost::detail - -template -struct extent - : public ::boost::integral_constant::value> -{ -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - typedef ::boost::integral_constant::value> base_; - using base_::value; -#endif - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,extent,(T)) -}; - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/floating_point_promotion.hpp b/src/vendor/stp/src/boost/type_traits/floating_point_promotion.hpp deleted file mode 100644 index 8b6ae3a32..000000000 --- a/src/vendor/stp/src/boost/type_traits/floating_point_promotion.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2005 Alexander Nasonov. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#ifndef FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED -#define FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED - -#include - -#ifdef BOOST_NO_CV_SPECIALIZATIONS -#include -#include -#include -#include -#include -#include -#endif - -// Should be the last #include -#include - -namespace boost { - -namespace type_traits { namespace detail { - -#ifndef BOOST_NO_CV_SPECIALIZATIONS - -template -struct floating_point_promotion -{ - typedef T type; -}; - -template<> -struct floating_point_promotion -{ - typedef double type; -}; - -template<> -struct floating_point_promotion -{ - typedef double const type; -}; - -template<> -struct floating_point_promotion -{ - typedef double volatile type; -}; - -template<> -struct floating_point_promotion -{ - typedef double const volatile type; -}; - -#else - -template -struct floating_point_promotion - : mpl::at< - mpl::vector< T, double, double const, double volatile, - double const volatile > - , mpl::plus< - is_same - , mpl::multiplies< is_same , mpl::int_<2> > - , mpl::multiplies< is_same , mpl::int_<3> > - , mpl::multiplies< is_same, mpl::int_<4> > - > - > -{ -}; - -#endif - -} } - -BOOST_TT_AUX_TYPE_TRAIT_DEF1( - floating_point_promotion - , T - , BOOST_DEDUCED_TYPENAME - boost::type_traits::detail::floating_point_promotion::type - ) -} - -#include - -#endif // #ifndef FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/function_traits.hpp b/src/vendor/stp/src/boost/type_traits/function_traits.hpp deleted file mode 100644 index bfc3f7e53..000000000 --- a/src/vendor/stp/src/boost/type_traits/function_traits.hpp +++ /dev/null @@ -1,236 +0,0 @@ - -// Copyright 2000 John Maddock (john@johnmaddock.co.uk) -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED -#define BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED - -#include -#include -#include - -namespace boost { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -namespace detail { - -template struct function_traits_helper; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 0); - typedef R result_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 1); - typedef R result_type; - typedef T1 arg1_type; - typedef T1 argument_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 2); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T1 first_argument_type; - typedef T2 second_argument_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 3); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 4); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; - typedef T4 arg4_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 5); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; - typedef T4 arg4_type; - typedef T5 arg5_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 6); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; - typedef T4 arg4_type; - typedef T5 arg5_type; - typedef T6 arg6_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 7); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; - typedef T4 arg4_type; - typedef T5 arg5_type; - typedef T6 arg6_type; - typedef T7 arg7_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 8); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; - typedef T4 arg4_type; - typedef T5 arg5_type; - typedef T6 arg6_type; - typedef T7 arg7_type; - typedef T8 arg8_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 9); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; - typedef T4 arg4_type; - typedef T5 arg5_type; - typedef T6 arg6_type; - typedef T7 arg7_type; - typedef T8 arg8_type; - typedef T9 arg9_type; -}; - -template -struct function_traits_helper -{ - BOOST_STATIC_CONSTANT(unsigned, arity = 10); - typedef R result_type; - typedef T1 arg1_type; - typedef T2 arg2_type; - typedef T3 arg3_type; - typedef T4 arg4_type; - typedef T5 arg5_type; - typedef T6 arg6_type; - typedef T7 arg7_type; - typedef T8 arg8_type; - typedef T9 arg9_type; - typedef T10 arg10_type; -}; - -} // end namespace detail - -template -struct function_traits : - public detail::function_traits_helper::type> -{ -}; - -#else - -namespace detail { - -template -struct type_of_size -{ - char elements[N]; -}; - -template -type_of_size<1> function_arity_helper(R (*f)()); - -template -type_of_size<2> function_arity_helper(R (*f)(T1)); - -template -type_of_size<3> function_arity_helper(R (*f)(T1, T2)); - -template -type_of_size<4> function_arity_helper(R (*f)(T1, T2, T3)); - -template -type_of_size<5> function_arity_helper(R (*f)(T1, T2, T3, T4)); - -template -type_of_size<6> function_arity_helper(R (*f)(T1, T2, T3, T4, T5)); - -template -type_of_size<7> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6)); - -template -type_of_size<8> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7)); - -template -type_of_size<9> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7, T8)); - -template -type_of_size<10> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7, T8, - T9)); - -template -type_of_size<11> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7, T8, - T9, T10)); -} // end namespace detail - -// Won't work with references -template -struct function_traits -{ - BOOST_STATIC_CONSTANT(unsigned, arity = (sizeof(detail::function_arity_helper((Function*)0))-1)); -}; - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -} - -#endif // BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_new_operator.hpp b/src/vendor/stp/src/boost/type_traits/has_new_operator.hpp deleted file mode 100644 index 2c2c32228..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_new_operator.hpp +++ /dev/null @@ -1,140 +0,0 @@ - -// (C) Copyright Runar Undheim, Robert Ramey & John Maddock 2008. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED -#define BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED - -#include // std::nothrow_t -#include // std::size_t -#include -#include -#include - -// should be the last #include -#include - -namespace boost { -namespace detail { - template - struct test; - - template - struct has_new_operator_impl { - template - static type_traits::yes_type check_sig1( - U*, - test< - void *(*)(std::size_t), - &U::operator new - >* = NULL - ); - template - static type_traits::no_type check_sig1(...); - - template - static type_traits::yes_type check_sig2( - U*, - test< - void *(*)(std::size_t, const std::nothrow_t&), - &U::operator new - >* = NULL - ); - template - static type_traits::no_type check_sig2(...); - - template - static type_traits::yes_type check_sig3( - U*, - test< - void *(*)(std::size_t, void*), - &U::operator new - >* = NULL - ); - template - static type_traits::no_type check_sig3(...); - - - template - static type_traits::yes_type check_sig4( - U*, - test< - void *(*)(std::size_t), - &U::operator new[] - >* = NULL - ); - template - static type_traits::no_type check_sig4(...); - - template - static type_traits::yes_type check_sig5( - U*, - test< - void *(*)(std::size_t, const std::nothrow_t&), - &U::operator new[] - >* = NULL - ); - template - static type_traits::no_type check_sig5(...); - - template - static type_traits::yes_type check_sig6( - U*, - test< - void *(*)(std::size_t, void*), - &U::operator new[] - >* = NULL - ); - template - static type_traits::no_type check_sig6(...); - - // GCC2 won't even parse this template if we embed the computation - // of s1 in the computation of value. - #ifdef __GNUC__ - BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(has_new_operator_impl::template check_sig1(0))); - BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(has_new_operator_impl::template check_sig2(0))); - BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(has_new_operator_impl::template check_sig3(0))); - BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(has_new_operator_impl::template check_sig4(0))); - BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(has_new_operator_impl::template check_sig5(0))); - BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(has_new_operator_impl::template check_sig6(0))); - #else - #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) - #pragma warning(push) - #pragma warning(disable:6334) - #endif - - BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(check_sig1(0))); - BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(check_sig2(0))); - BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(check_sig3(0))); - BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(check_sig4(0))); - BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(check_sig5(0))); - BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(check_sig6(0))); - - #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) - #pragma warning(pop) - #endif - #endif - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - (s1 == sizeof(type_traits::yes_type)), - (s2 == sizeof(type_traits::yes_type)), - (s3 == sizeof(type_traits::yes_type)), - (s4 == sizeof(type_traits::yes_type)), - (s5 == sizeof(type_traits::yes_type)), - (s6 == sizeof(type_traits::yes_type)) - >::value) - ); - }; -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_new_operator,T,::boost::detail::has_new_operator_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_nothrow_assign.hpp b/src/vendor/stp/src/boost/type_traits/has_nothrow_assign.hpp deleted file mode 100644 index 3cef7357d..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_nothrow_assign.hpp +++ /dev/null @@ -1,38 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED -#define BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail{ - -template -struct has_nothrow_assign_imp{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::has_trivial_assign::value, - BOOST_HAS_NOTHROW_ASSIGN(T) - >::value)); -}; - -} - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_assign,T,::boost::detail::has_nothrow_assign_imp::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_nothrow_constructor.hpp b/src/vendor/stp/src/boost/type_traits/has_nothrow_constructor.hpp deleted file mode 100644 index e807fd438..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_nothrow_constructor.hpp +++ /dev/null @@ -1,39 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED -#define BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail{ - -template -struct has_nothrow_constructor_imp{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::has_trivial_constructor::value, - BOOST_HAS_NOTHROW_CONSTRUCTOR(T) - >::value)); -}; - -} - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_constructor,T,::boost::detail::has_nothrow_constructor_imp::value) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_default_constructor,T,::boost::detail::has_nothrow_constructor_imp::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_nothrow_copy.hpp b/src/vendor/stp/src/boost/type_traits/has_nothrow_copy.hpp deleted file mode 100644 index c06b4a3d0..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_nothrow_copy.hpp +++ /dev/null @@ -1,39 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED -#define BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail{ - -template -struct has_nothrow_copy_imp{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::has_trivial_copy::value, - BOOST_HAS_NOTHROW_COPY(T) - >::value)); -}; - -} - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_copy,T,::boost::detail::has_nothrow_copy_imp::value) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_copy_constructor,T,::boost::detail::has_nothrow_copy_imp::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_nothrow_destructor.hpp b/src/vendor/stp/src/boost/type_traits/has_nothrow_destructor.hpp deleted file mode 100644 index 4f5882afc..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_nothrow_destructor.hpp +++ /dev/null @@ -1,25 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_NOTHROW_DESTRUCTOR_HPP_INCLUDED -#define BOOST_TT_HAS_NOTHROW_DESTRUCTOR_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_destructor,T,::boost::has_trivial_destructor::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_NOTHROW_DESTRUCTOR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_trivial_assign.hpp b/src/vendor/stp/src/boost/type_traits/has_trivial_assign.hpp deleted file mode 100644 index 4179e8d74..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_trivial_assign.hpp +++ /dev/null @@ -1,50 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED -#define BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct has_trivial_assign_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_or< - ::boost::is_pod::value, - BOOST_HAS_TRIVIAL_ASSIGN(T) - >::value, - ::boost::type_traits::ice_not< ::boost::is_const::value >::value, - ::boost::type_traits::ice_not< ::boost::is_volatile::value >::value - >::value)); -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_assign,T,::boost::detail::has_trivial_assign_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_trivial_constructor.hpp b/src/vendor/stp/src/boost/type_traits/has_trivial_constructor.hpp deleted file mode 100644 index f9ade5d1d..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_trivial_constructor.hpp +++ /dev/null @@ -1,43 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED -#define BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED - -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct has_trivial_ctor_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::is_pod::value, - BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) - >::value)); -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_constructor,T,::boost::detail::has_trivial_ctor_impl::value) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_default_constructor,T,::boost::detail::has_trivial_ctor_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_trivial_copy.hpp b/src/vendor/stp/src/boost/type_traits/has_trivial_copy.hpp deleted file mode 100644 index 8c753615d..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_trivial_copy.hpp +++ /dev/null @@ -1,49 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED -#define BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct has_trivial_copy_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_or< - ::boost::is_pod::value, - BOOST_HAS_TRIVIAL_COPY(T) - >::value, - ::boost::type_traits::ice_not< ::boost::is_volatile::value >::value - >::value)); -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_copy,T,::boost::detail::has_trivial_copy_impl::value) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_copy_constructor,T,::boost::detail::has_trivial_copy_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_trivial_destructor.hpp b/src/vendor/stp/src/boost/type_traits/has_trivial_destructor.hpp deleted file mode 100644 index f2a8ce681..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_trivial_destructor.hpp +++ /dev/null @@ -1,42 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED -#define BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED - -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct has_trivial_dtor_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::is_pod::value, - BOOST_HAS_TRIVIAL_DESTRUCTOR(T) - >::value)); -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_destructor,T,::boost::detail::has_trivial_dtor_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/has_virtual_destructor.hpp b/src/vendor/stp/src/boost/type_traits/has_virtual_destructor.hpp deleted file mode 100644 index 8f99ff420..000000000 --- a/src/vendor/stp/src/boost/type_traits/has_virtual_destructor.hpp +++ /dev/null @@ -1,25 +0,0 @@ - -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_HAS_VIRTUAL_DESTRUCTOR_HPP_INCLUDED -#define BOOST_TT_HAS_VIRTUAL_DESTRUCTOR_HPP_INCLUDED - -#include -// should be the last #include -#include - -namespace boost { - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_virtual_destructor,T,BOOST_HAS_VIRTUAL_DESTRUCTOR(T)) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/ice.hpp b/src/vendor/stp/src/boost/type_traits/ice.hpp deleted file mode 100644 index 134bc4bb7..000000000 --- a/src/vendor/stp/src/boost/type_traits/ice.hpp +++ /dev/null @@ -1,20 +0,0 @@ - -// (C) Copyright John Maddock and Steve Cleary 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// macros and helpers for working with integral-constant-expressions. - -#ifndef BOOST_TT_ICE_HPP_INCLUDED -#define BOOST_TT_ICE_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#endif // BOOST_TT_ICE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/integral_constant.hpp b/src/vendor/stp/src/boost/type_traits/integral_constant.hpp deleted file mode 100644 index 4ed1bb058..000000000 --- a/src/vendor/stp/src/boost/type_traits/integral_constant.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP -#define BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP - -#include -#include -#include - -namespace boost{ - -#if defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS) || defined(__BORLANDC__) -template -#else -template -#endif -struct integral_constant : public mpl::integral_c -{ - typedef integral_constant type; -}; - -template<> struct integral_constant : public mpl::true_ -{ -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) -# pragma warning(push) -# pragma warning(disable:4097) - typedef mpl::true_ base_; - using base_::value; -# pragma warning(pop) -#endif - typedef integral_constant type; -}; -template<> struct integral_constant : public mpl::false_ -{ -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) -# pragma warning(push) -# pragma warning(disable:4097) - typedef mpl::false_ base_; - using base_::value; -# pragma warning(pop) -#endif - typedef integral_constant type; -}; - -typedef integral_constant true_type; -typedef integral_constant false_type; - -} - -#endif diff --git a/src/vendor/stp/src/boost/type_traits/integral_promotion.hpp b/src/vendor/stp/src/boost/type_traits/integral_promotion.hpp deleted file mode 100644 index a85e243b8..000000000 --- a/src/vendor/stp/src/boost/type_traits/integral_promotion.hpp +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2005 Alexander Nasonov. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#ifndef FILE_boost_type_traits_integral_promotion_hpp_INCLUDED -#define FILE_boost_type_traits_integral_promotion_hpp_INCLUDED - -#include - -#include -#include -#include -#include -#include -#include -#include - -// Should be the last #include -#include - -namespace boost { - -namespace type_traits { namespace detail { - -// 4.5/2 -template struct need_promotion : boost::is_enum {}; - -// 4.5/1 -template<> struct need_promotion : true_type {}; -template<> struct need_promotion : true_type {}; -template<> struct need_promotion : true_type {}; -template<> struct need_promotion : true_type {}; -template<> struct need_promotion : true_type {}; - - -// Specializations for non-standard types. -// Type is promoted if it's smaller then int. - -#define BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(T) \ - template<> struct need_promotion \ - : integral_constant {}; - -// Same set of integral types as in boost/type_traits/is_integral.hpp. -// Please, keep in sync. -#if (defined(BOOST_MSVC) && (BOOST_MSVC < 1300)) \ - || (defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 600)) \ - || (defined(__BORLANDC__) && (__BORLANDC__ == 0x600) && (_MSC_VER < 1300)) -// TODO: common macro for this #if. Or better yet, PP SEQ of non-standard types. -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(__int8 ) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int8 ) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(__int16 ) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int16) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(__int32 ) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int32) -#ifdef __BORLANDC__ -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int64) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE( __int64) -#endif -#endif - -#if defined(BOOST_HAS_LONG_LONG) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(boost::ulong_long_type) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(boost::long_long_type ) -#elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int64) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE( __int64) -#endif - -#undef BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE - - -#ifndef BOOST_NO_INTRINSIC_WCHAR_T -// 4.5/2 -template<> struct need_promotion : true_type {}; -#endif - -// 4.5/3 (integral bit-field) is not supported. - -// 4.5/4 -template<> struct need_promotion : true_type {}; - - -// Get promoted type by index and cv qualifiers. - -template struct promote_from_index; - -#define BOOST_TT_AUX_PROMOTE_FROM_INDEX(N,T) \ - template<> struct promote_from_index { typedef T type; }; \ - template<> struct promote_from_index { typedef T volatile type; }; \ - template<> struct promote_from_index { typedef T const type; }; \ - template<> struct promote_from_index { typedef T const volatile type; }; - - -BOOST_TT_AUX_PROMOTE_FROM_INDEX(1, int ) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(2, unsigned int ) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(3, long ) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(4, unsigned long) - - -// WARNING: integral promotions to non-standard types -// long long and __int64 are not defined by the standard. -// Additional specialisations and overloads shouldn't -// introduce ambiguity, though. - -#if defined(BOOST_HAS_LONG_LONG) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(5, boost::long_long_type ) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(6, boost::ulong_long_type) -#elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(7, __int64 ) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(8, unsigned __int64) -#endif - -#undef BOOST_TT_AUX_PROMOTE_FROM_INDEX - - -// Define BOOST_TT_AUX_PROMOTED_INDEX_TESTER: -#if !defined(BOOST_MSVC) - -template -struct sized_type_for_promotion -{ - typedef char (&type)[N]; -}; - -#define BOOST_TT_AUX_PROMOTED_INDEX_TESTER(I,T) \ - sized_type_for_promotion::type promoted_index_tester(T); - -#else - -#define BOOST_TT_AUX_PROMOTED_INDEX_TESTER(I,T) \ - char (&promoted_index_tester(T))[I]; - -#endif - -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(1, int ) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(2, unsigned int ) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(3, long ) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(4, unsigned long) - -#if defined(BOOST_HAS_LONG_LONG) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(5, boost::long_long_type ) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(6, boost::ulong_long_type) -#elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(7, __int64 ) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(8, unsigned __int64) -#endif - -#undef BOOST_TT_AUX_PROMOTED_INDEX_TESTER - - -// Get an index of promoted type for type T. -// Precondition: need_promotion -template -struct promoted_index -{ - static T testee; // undefined - BOOST_STATIC_CONSTANT(int, value = sizeof(promoted_index_tester(+testee)) ); - // Unary plus promotes testee LOOK HERE ---> ^ -}; - -template -struct integral_promotion_impl -{ - typedef BOOST_DEDUCED_TYPENAME promote_from_index< - (boost::type_traits::detail::promoted_index::value) - , (boost::is_const::value) - , (boost::is_volatile::value) - >::type type; -}; - -template -struct integral_promotion - : boost::mpl::eval_if< - need_promotion::type> - , integral_promotion_impl - , boost::mpl::identity - > -{ -}; - -} } - -BOOST_TT_AUX_TYPE_TRAIT_DEF1( - integral_promotion - , T - , BOOST_DEDUCED_TYPENAME - boost::type_traits::detail::integral_promotion::type - ) -} - -#include - -#endif // #ifndef FILE_boost_type_traits_integral_promotion_hpp_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/intrinsics.hpp b/src/vendor/stp/src/boost/type_traits/intrinsics.hpp deleted file mode 100644 index 8f88036e2..000000000 --- a/src/vendor/stp/src/boost/type_traits/intrinsics.hpp +++ /dev/null @@ -1,240 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_INTRINSICS_HPP_INCLUDED -#define BOOST_TT_INTRINSICS_HPP_INCLUDED - -#ifndef BOOST_TT_CONFIG_HPP_INCLUDED -#include -#endif - -// -// Helper macros for builtin compiler support. -// If your compiler has builtin support for any of the following -// traits concepts, then redefine the appropriate macros to pick -// up on the compiler support: -// -// (these should largely ignore cv-qualifiers) -// BOOST_IS_UNION(T) should evaluate to true if T is a union type -// BOOST_IS_POD(T) should evaluate to true if T is a POD type -// BOOST_IS_EMPTY(T) should evaluate to true if T is an empty struct or union -// BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if "T x;" has no effect -// BOOST_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy -// BOOST_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy -// BOOST_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect -// BOOST_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if "T x;" can not throw -// BOOST_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw -// BOOST_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw -// BOOST_HAS_VIRTUAL_DESTRUCTOR(T) should evaluate to true T has a virtual destructor -// -// The following can also be defined: when detected our implementation is greatly simplified. -// Note that unlike the macros above these do not have default definitions, so we can use -// #ifdef MACRONAME to detect when these are available. -// -// BOOST_IS_ABSTRACT(T) true if T is an abstract type -// BOOST_IS_BASE_OF(T,U) true if T is a base class of U -// BOOST_IS_CLASS(T) true if T is a class type -// BOOST_IS_CONVERTIBLE(T,U) true if T is convertible to U -// BOOST_IS_ENUM(T) true is T is an enum -// BOOST_IS_POLYMORPHIC(T) true if T is a polymorphic type -// BOOST_ALIGNMENT_OF(T) should evaluate to the alignment requirements of type T. - -#ifdef BOOST_HAS_SGI_TYPE_TRAITS - // Hook into SGI's __type_traits class, this will pick up user supplied - // specializations as well as SGI - compiler supplied specializations. -# include -# ifdef __NetBSD__ - // There are two different versions of type_traits.h on NetBSD on Spark - // use an implicit include via algorithm instead, to make sure we get - // the same version as the std lib: -# include -# else -# include -# endif -# define BOOST_IS_POD(T) ::boost::is_same< typename ::__type_traits::is_POD_type, ::__true_type>::value -# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ::boost::is_same< typename ::__type_traits::has_trivial_default_constructor, ::__true_type>::value -# define BOOST_HAS_TRIVIAL_COPY(T) ::boost::is_same< typename ::__type_traits::has_trivial_copy_constructor, ::__true_type>::value -# define BOOST_HAS_TRIVIAL_ASSIGN(T) ::boost::is_same< typename ::__type_traits::has_trivial_assignment_operator, ::__true_type>::value -# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) ::boost::is_same< typename ::__type_traits::has_trivial_destructor, ::__true_type>::value - -# ifdef __sgi -# define BOOST_HAS_TYPE_TRAITS_INTRINSICS -# endif -#endif - -#if defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000) - // Metrowerks compiler is acquiring intrinsic type traits support - // post version 8. We hook into the published interface to pick up - // user defined specializations as well as compiler intrinsics as - // and when they become available: -# include -# define BOOST_IS_UNION(T) BOOST_STD_EXTENSION_NAMESPACE::is_union::value -# define BOOST_IS_POD(T) BOOST_STD_EXTENSION_NAMESPACE::is_POD::value -# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_default_ctor::value -# define BOOST_HAS_TRIVIAL_COPY(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_copy_ctor::value -# define BOOST_HAS_TRIVIAL_ASSIGN(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_assignment::value -# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_dtor::value -# define BOOST_HAS_TYPE_TRAITS_INTRINSICS -#endif - -#if defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215) -# include - -# define BOOST_IS_UNION(T) __is_union(T) -# define BOOST_IS_POD(T) (__is_pod(T) && __has_trivial_constructor(T)) -# define BOOST_IS_EMPTY(T) __is_empty(T) -# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T) -# define BOOST_HAS_TRIVIAL_COPY(T) __has_trivial_copy(T) -# define BOOST_HAS_TRIVIAL_ASSIGN(T) __has_trivial_assign(T) -# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T) -# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T) -# define BOOST_HAS_NOTHROW_COPY(T) __has_nothrow_copy(T) -# define BOOST_HAS_NOTHROW_ASSIGN(T) __has_nothrow_assign(T) -# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T) - -# define BOOST_IS_ABSTRACT(T) __is_abstract(T) -# define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same::value) -# define BOOST_IS_CLASS(T) __is_class(T) -// This one doesn't quite always do the right thing: -// # define BOOST_IS_CONVERTIBLE(T,U) __is_convertible_to(T,U) -# define BOOST_IS_ENUM(T) __is_enum(T) -// This one doesn't quite always do the right thing: -// # define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T) -// This one fails if the default alignment has been changed with /Zp: -// # define BOOST_ALIGNMENT_OF(T) __alignof(T) - -# define BOOST_HAS_TYPE_TRAITS_INTRINSICS -#endif - -#if defined(__DMC__) && (__DMC__ >= 0x848) -// For Digital Mars C++, www.digitalmars.com -# define BOOST_IS_UNION(T) (__typeinfo(T) & 0x400) -# define BOOST_IS_POD(T) (__typeinfo(T) & 0x800) -# define BOOST_IS_EMPTY(T) (__typeinfo(T) & 0x1000) -# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__typeinfo(T) & 0x10) -# define BOOST_HAS_TRIVIAL_COPY(T) (__typeinfo(T) & 0x20) -# define BOOST_HAS_TRIVIAL_ASSIGN(T) (__typeinfo(T) & 0x40) -# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__typeinfo(T) & 0x8) -# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__typeinfo(T) & 0x80) -# define BOOST_HAS_NOTHROW_COPY(T) (__typeinfo(T) & 0x100) -# define BOOST_HAS_NOTHROW_ASSIGN(T) (__typeinfo(T) & 0x200) -# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) (__typeinfo(T) & 0x4) -# define BOOST_HAS_TYPE_TRAITS_INTRINSICS -#endif - -#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) -# include -# include -# include - -# define BOOST_IS_UNION(T) __is_union(T) -# define BOOST_IS_POD(T) __is_pod(T) -# define BOOST_IS_EMPTY(T) __is_empty(T) -# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T) -# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference::value) -# define BOOST_HAS_TRIVIAL_ASSIGN(T) __has_trivial_assign(T) -# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T) -# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T) -# define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile::value && !is_reference::value) -# define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile::value) -# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T) - -# define BOOST_IS_ABSTRACT(T) __is_abstract(T) -# define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same::value) -# define BOOST_IS_CLASS(T) __is_class(T) -# define BOOST_IS_ENUM(T) __is_enum(T) -# define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T) -# if (!defined(unix) && !defined(__unix__)) || defined(__LP64__) - // GCC sometimes lies about alignment requirements - // of type double on 32-bit unix platforms, use the - // old implementation instead in that case: -# define BOOST_ALIGNMENT_OF(T) __alignof__(T) -# endif - -# define BOOST_HAS_TYPE_TRAITS_INTRINSICS -#endif - -# if defined(__CODEGEARC__) -# include -# include -# include -# include - -# define BOOST_IS_UNION(T) __is_union(T) -# define BOOST_IS_POD(T) __is_pod(T) -# define BOOST_IS_EMPTY(T) __is_empty(T) -# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__has_trivial_default_constructor(T) || is_void::value) -# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T) && !is_volatile::value && !is_reference::value || is_void::value) -# define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile::value || is_void::value) -# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) || is_void::value) -# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_default_constructor(T) || is_void::value) -# define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy_constructor(T) && !is_volatile::value && !is_reference::value || is_void::value) -# define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile::value || is_void::value) -# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T) - -# define BOOST_IS_ABSTRACT(T) __is_abstract(T) -# define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_void::value && !is_void::value) -# define BOOST_IS_CLASS(T) __is_class(T) -# define BOOST_IS_CONVERTIBLE(T,U) (__is_convertible(T,U) || is_void::value) -# define BOOST_IS_ENUM(T) __is_enum(T) -# define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T) -# define BOOST_ALIGNMENT_OF(T) alignof(T) - -# define BOOST_HAS_TYPE_TRAITS_INTRINSICS -#endif - -#ifndef BOOST_IS_UNION -# define BOOST_IS_UNION(T) false -#endif - -#ifndef BOOST_IS_POD -# define BOOST_IS_POD(T) false -#endif - -#ifndef BOOST_IS_EMPTY -# define BOOST_IS_EMPTY(T) false -#endif - -#ifndef BOOST_HAS_TRIVIAL_CONSTRUCTOR -# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) false -#endif - -#ifndef BOOST_HAS_TRIVIAL_COPY -# define BOOST_HAS_TRIVIAL_COPY(T) false -#endif - -#ifndef BOOST_HAS_TRIVIAL_ASSIGN -# define BOOST_HAS_TRIVIAL_ASSIGN(T) false -#endif - -#ifndef BOOST_HAS_TRIVIAL_DESTRUCTOR -# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) false -#endif - -#ifndef BOOST_HAS_NOTHROW_CONSTRUCTOR -# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) false -#endif - -#ifndef BOOST_HAS_NOTHROW_COPY -# define BOOST_HAS_NOTHROW_COPY(T) false -#endif - -#ifndef BOOST_HAS_NOTHROW_ASSIGN -# define BOOST_HAS_NOTHROW_ASSIGN(T) false -#endif - -#ifndef BOOST_HAS_VIRTUAL_DESTRUCTOR -# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) false -#endif - -#endif // BOOST_TT_INTRINSICS_HPP_INCLUDED - - - - - diff --git a/src/vendor/stp/src/boost/type_traits/is_abstract.hpp b/src/vendor/stp/src/boost/type_traits/is_abstract.hpp deleted file mode 100644 index 09fdf33c4..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_abstract.hpp +++ /dev/null @@ -1,153 +0,0 @@ -#ifndef BOOST_TT_IS_ABSTRACT_CLASS_HPP -#define BOOST_TT_IS_ABSTRACT_CLASS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// is_abstract_class.hpp: -// -// (C) Copyright 2002 Rani Sharoni (rani_sharoni@hotmail.com) and Robert Ramey -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org for updates, documentation, and revision history. -// - -// Compile type discovery whether given type is abstract class or not. -// -// Requires DR 337 to be supported by compiler -// (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_active.html#337). -// -// -// Believed (Jan 2004) to work on: -// - GCC 3.4 -// - VC++ 7.1 -// - compilers with new EDG frontend (Intel C++ 7, Comeau 4.3.2) -// -// Doesn't work on: -// - VC++6, VC++7.0 and less -// - GCC 3.3.X and less -// - Borland C++ 6 and less -// -// -// History: -// - Originally written by Rani Sharoni, see -// http://groups.google.com/groups?selm=df893da6.0207110613.75b2fe90%40posting.google.com -// At this time supported by EDG (Intel C++ 7, Comeau 4.3.2) and VC7.1. -// - Adapted and added into Boost.Serialization library by Robert Ramey -// (starting with submission #10). -// - Jan 2004: GCC 3.4 fixed to suport DR337 (Giovanni Bajo). -// - Jan 2004: modified to be part of Boost.TypeTraits (Pavel Vozenilek). -// - Nov 2004: Christoph Ludwig found that the implementation did not work with -// template types and gcc-3.4 or VC7.1, fix due to Christoph Ludwig -// and John Maddock. -// - Dec 2004: Added new config macro BOOST_NO_IS_ABSTRACT which causes the template -// to degrade gracefully, rather than trash the compiler (John Maddock). -// - -#include -#ifndef BOOST_IS_ABSTRACT -#include -#include -#include -#include -#ifdef BOOST_NO_IS_ABSTRACT -#include -#endif -#endif -// should be the last #include -#include - - -namespace boost { -namespace detail{ - -#ifdef BOOST_IS_ABSTRACT -template -struct is_abstract_imp -{ - BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_ABSTRACT(T)); -}; -#elif !defined(BOOST_NO_IS_ABSTRACT) -template -struct is_abstract_imp2 -{ - // Deduction fails if T is void, function type, - // reference type (14.8.2/2)or an abstract class type - // according to review status issue #337 - // - template - static type_traits::no_type check_sig(U (*)[1]); - template - static type_traits::yes_type check_sig(...); - // - // T must be a complete type, further if T is a template then - // it must be instantiated in order for us to get the right answer: - // - BOOST_STATIC_ASSERT(sizeof(T) != 0); - - // GCC2 won't even parse this template if we embed the computation - // of s1 in the computation of value. -#ifdef __GNUC__ - BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(is_abstract_imp2::template check_sig(0))); -#else -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(push) -#pragma warning(disable:6334) -#endif - BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(check_sig(0))); -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(pop) -#endif -#endif - - BOOST_STATIC_CONSTANT(bool, value = - (s1 == sizeof(type_traits::yes_type))); -}; - -template -struct is_abstract_select -{ - template - struct rebind - { - typedef is_abstract_imp2 type; - }; -}; -template <> -struct is_abstract_select -{ - template - struct rebind - { - typedef false_type type; - }; -}; - -template -struct is_abstract_imp -{ - typedef is_abstract_select< ::boost::is_class::value> selector; - typedef typename selector::template rebind binder; - typedef typename binder::type type; - - BOOST_STATIC_CONSTANT(bool, value = type::value); -}; - -#endif -} - -#ifndef BOOST_NO_IS_ABSTRACT -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_abstract,T,::boost::detail::is_abstract_imp::value) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_abstract,T,::boost::detail::is_polymorphic_imp::value) -#endif - -} // namespace boost - -#include - -#endif //BOOST_TT_IS_ABSTRACT_CLASS_HPP diff --git a/src/vendor/stp/src/boost/type_traits/is_arithmetic.hpp b/src/vendor/stp/src/boost/type_traits/is_arithmetic.hpp deleted file mode 100644 index a1d8c46d5..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_arithmetic.hpp +++ /dev/null @@ -1,51 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED -#define BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED - -#if !defined( __CODEGEARC__ ) -#include -#include -#include -#include -#endif - -// should be the last #include -#include - -namespace boost { - -#if !defined(__CODEGEARC__) -namespace detail { - -template< typename T > -struct is_arithmetic_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::is_integral::value, - ::boost::is_float::value - >::value)); -}; - -} // namespace detail -#endif - -//* is a type T an arithmetic type described in the standard (3.9.1p8) -#if defined(__CODEGEARC__) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_arithmetic,T,__is_arithmetic(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_arithmetic,T,::boost::detail::is_arithmetic_impl::value) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_array.hpp b/src/vendor/stp/src/boost/type_traits/is_array.hpp deleted file mode 100644 index e9e820a3d..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_array.hpp +++ /dev/null @@ -1,91 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -// Some fixes for is_array are based on a newgroup posting by Jonathan Lundquist. - - -#ifndef BOOST_TT_IS_ARRAY_HPP_INCLUDED -#define BOOST_TT_IS_ARRAY_HPP_INCLUDED - -#include - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# include -#endif - -#include - -// should be the last #include -#include - -namespace boost { - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,__is_array(T)) -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,false) -#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T[N],true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const[N],true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T volatile[N],true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const volatile[N],true) -#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T[],true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const[],true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T volatile[],true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const volatile[],true) -#endif -#endif - -#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -namespace detail { - -using ::boost::type_traits::yes_type; -using ::boost::type_traits::no_type; -using ::boost::type_traits::wrap; - -template< typename T > T(* is_array_tester1(wrap) )(wrap); -char BOOST_TT_DECL is_array_tester1(...); - -template< typename T> no_type is_array_tester2(T(*)(wrap)); -yes_type BOOST_TT_DECL is_array_tester2(...); - -template< typename T > -struct is_array_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - sizeof(::boost::detail::is_array_tester2( - ::boost::detail::is_array_tester1( - ::boost::type_traits::wrap() - ) - )) == 1 - ); -}; - -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_array,void,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_array,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_array,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_array,void const volatile,false) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,::boost::detail::is_array_impl::value) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_ARRAY_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_base_and_derived.hpp b/src/vendor/stp/src/boost/type_traits/is_base_and_derived.hpp deleted file mode 100644 index d6a999118..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_base_and_derived.hpp +++ /dev/null @@ -1,254 +0,0 @@ - -// (C) Copyright Rani Sharoni 2003. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED -#define BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED - -#include -#ifndef BOOST_IS_BASE_OF -#include -#include -#include -#include -#include -#include -#endif -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -#ifndef BOOST_IS_BASE_OF -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581)) \ - && !BOOST_WORKAROUND(__SUNPRO_CC , <= 0x540) \ - && !BOOST_WORKAROUND(__EDG_VERSION__, <= 243) \ - && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) - - // The EDG version number is a lower estimate. - // It is not currently known which EDG version - // exactly fixes the problem. - -/************************************************************************* - -This version detects ambiguous base classes and private base classes -correctly, and was devised by Rani Sharoni. - -Explanation by Terje Slettebo and Rani Sharoni. - -Let's take the multiple base class below as an example, and the following -will also show why there's not a problem with private or ambiguous base -class: - -struct B {}; -struct B1 : B {}; -struct B2 : B {}; -struct D : private B1, private B2 {}; - -is_base_and_derived::value; - -First, some terminology: - -SC - Standard conversion -UDC - User-defined conversion - -A user-defined conversion sequence consists of an SC, followed by an UDC, -followed by another SC. Either SC may be the identity conversion. - -When passing the default-constructed Host object to the overloaded check_sig() -functions (initialization 8.5/14/4/3), we have several viable implicit -conversion sequences: - -For "static no_type check_sig(B const volatile *, int)" we have the conversion -sequences: - -C -> C const (SC - Qualification Adjustment) -> B const volatile* (UDC) -C -> D const volatile* (UDC) -> B1 const volatile* / B2 const volatile* -> - B const volatile* (SC - Conversion) - -For "static yes_type check_sig(D const volatile *, T)" we have the conversion -sequence: - -C -> D const volatile* (UDC) - -According to 13.3.3.1/4, in context of user-defined conversion only the -standard conversion sequence is considered when selecting the best viable -function, so it only considers up to the user-defined conversion. For the -first function this means choosing between C -> C const and C -> C, and it -chooses the latter, because it's a proper subset (13.3.3.2/3/2) of the -former. Therefore, we have: - -C -> D const volatile* (UDC) -> B1 const volatile* / B2 const volatile* -> - B const volatile* (SC - Conversion) -C -> D const volatile* (UDC) - -Here, the principle of the "shortest subsequence" applies again, and it -chooses C -> D const volatile*. This shows that it doesn't even need to -consider the multiple paths to B, or accessibility, as that possibility is -eliminated before it could possibly cause ambiguity or access violation. - -If D is not derived from B, it has to choose between C -> C const -> B const -volatile* for the first function, and C -> D const volatile* for the second -function, which are just as good (both requires a UDC, 13.3.3.2), had it not -been for the fact that "static no_type check_sig(B const volatile *, int)" is -not templated, which makes C -> C const -> B const volatile* the best choice -(13.3.3/1/4), resulting in "no". - -Also, if Host::operator B const volatile* hadn't been const, the two -conversion sequences for "static no_type check_sig(B const volatile *, int)", in -the case where D is derived from B, would have been ambiguous. - -See also -http://groups.google.com/groups?selm=df893da6.0301280859.522081f7%40posting. -google.com and links therein. - -*************************************************************************/ - -template -struct bd_helper -{ - // - // This VC7.1 specific workaround stops the compiler from generating - // an internal compiler error when compiling with /vmg (thanks to - // Aleksey Gurtovoy for figuring out the workaround). - // -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1310) - template - static type_traits::yes_type check_sig(D const volatile *, T); - static type_traits::no_type check_sig(B const volatile *, int); -#else - static type_traits::yes_type check_sig(D const volatile *, long); - static type_traits::no_type check_sig(B const volatile * const&, int); -#endif -}; - -template -struct is_base_and_derived_impl2 -{ -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(push) -#pragma warning(disable:6334) -#endif - // - // May silently do the wrong thing with incomplete types - // unless we trap them here: - // - BOOST_STATIC_ASSERT(sizeof(B) != 0); - BOOST_STATIC_ASSERT(sizeof(D) != 0); - - struct Host - { -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1310) - operator B const volatile *() const; -#else - operator B const volatile * const&() const; -#endif - operator D const volatile *(); - }; - - BOOST_STATIC_CONSTANT(bool, value = - sizeof(bd_helper::check_sig(Host(), 0)) == sizeof(type_traits::yes_type)); -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(pop) -#endif -}; - -#else - -// -// broken version: -// -template -struct is_base_and_derived_impl2 -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::is_convertible::value)); -}; - -#define BOOST_BROKEN_IS_BASE_AND_DERIVED - -#endif - -template -struct is_base_and_derived_impl3 -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template -struct is_base_and_derived_select -{ - template - struct rebind - { - typedef is_base_and_derived_impl3 type; - }; -}; - -template <> -struct is_base_and_derived_select -{ - template - struct rebind - { - typedef is_base_and_derived_impl2 type; - }; -}; - -template -struct is_base_and_derived_impl -{ - typedef typename remove_cv::type ncvB; - typedef typename remove_cv::type ncvD; - - typedef is_base_and_derived_select< - ::boost::is_class::value, - ::boost::is_class::value, - ::boost::is_same::value> selector; - typedef typename selector::template rebind binder; - typedef typename binder::type bound_type; - - BOOST_STATIC_CONSTANT(bool, value = bound_type::value); -}; -#else -template -struct is_base_and_derived_impl -{ - typedef typename remove_cv::type ncvB; - typedef typename remove_cv::type ncvD; - - BOOST_STATIC_CONSTANT(bool, value = (BOOST_IS_BASE_OF(B,D) && ! ::boost::is_same::value)); -}; -#endif -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF2( - is_base_and_derived - , Base - , Derived - , (::boost::detail::is_base_and_derived_impl::value) - ) - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base&,Derived,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base,Derived&,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base&,Derived&,false) -#endif - -#if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610)) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename Base,is_base_and_derived,Base,Base,false) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_base_of.hpp b/src/vendor/stp/src/boost/type_traits/is_base_of.hpp deleted file mode 100644 index 0cc7a32fc..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_base_of.hpp +++ /dev/null @@ -1,51 +0,0 @@ - -// (C) Copyright Rani Sharoni 2003-2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_BASE_OF_HPP_INCLUDED -#define BOOST_TT_IS_BASE_OF_HPP_INCLUDED - -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - - namespace detail{ - template - struct is_base_of_imp - { - typedef typename remove_cv::type ncvB; - typedef typename remove_cv::type ncvD; - BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or< - (::boost::detail::is_base_and_derived_impl::value), - (::boost::type_traits::ice_and< ::boost::is_same::value, ::boost::is_class::value>::value)>::value)); - }; - } - -BOOST_TT_AUX_BOOL_TRAIT_DEF2( - is_base_of - , Base - , Derived - , (::boost::detail::is_base_of_imp::value)) - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base,Derived&,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived&,false) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_base_of_tr1.hpp b/src/vendor/stp/src/boost/type_traits/is_base_of_tr1.hpp deleted file mode 100644 index 177e62b0f..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_base_of_tr1.hpp +++ /dev/null @@ -1,50 +0,0 @@ - -// (C) Copyright Rani Sharoni 2003-2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED -#define BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED - -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { namespace tr1{ - - namespace detail{ - template - struct is_base_of_imp - { - typedef typename remove_cv::type ncvB; - typedef typename remove_cv::type ncvD; - BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or< - (::boost::detail::is_base_and_derived_impl::value), - (::boost::is_same::value)>::value)); - }; - } - -BOOST_TT_AUX_BOOL_TRAIT_DEF2( - is_base_of - , Base - , Derived - , (::boost::tr1::detail::is_base_of_imp::value)) - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base,Derived&,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived&,false) -#endif - -} } // namespace boost - -#include - -#endif // BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_class.hpp b/src/vendor/stp/src/boost/type_traits/is_class.hpp deleted file mode 100644 index 1a2cd2015..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_class.hpp +++ /dev/null @@ -1,140 +0,0 @@ -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000-2003. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_IS_CLASS_HPP_INCLUDED -#define BOOST_TT_IS_CLASS_HPP_INCLUDED - -#include -#include -#ifndef BOOST_IS_CLASS -# include -# include -# include - -#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION -# include -#else -# include -# include -# include -# include -# include -#endif - -#endif // BOOST_IS_CLASS - -#ifdef __EDG_VERSION__ -# include -#endif - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -#ifndef BOOST_IS_CLASS -#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION - -// This is actually the conforming implementation which works with -// abstract classes. However, enough compilers have trouble with -// it that most will use the one in -// boost/type_traits/object_traits.hpp. This implementation -// actually works with VC7.0, but other interactions seem to fail -// when we use it. - -// is_class<> metafunction due to Paul Mensonides -// (leavings@attbi.com). For more details: -// http://groups.google.com/groups?hl=en&selm=000001c1cc83%24e154d5e0%247772e50c%40c161550a&rnum=1 -#if defined(__GNUC__) && !defined(__EDG_VERSION__) - -template ::boost::type_traits::yes_type is_class_tester(void(U::*)(void)); -template ::boost::type_traits::no_type is_class_tester(...); - -template -struct is_class_impl -{ - - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - sizeof(is_class_tester(0)) == sizeof(::boost::type_traits::yes_type), - ::boost::type_traits::ice_not< ::boost::is_union::value >::value - >::value) - ); -}; - -#else - -template -struct is_class_impl -{ - template static ::boost::type_traits::yes_type is_class_tester(void(U::*)(void)); - template static ::boost::type_traits::no_type is_class_tester(...); - - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - sizeof(is_class_tester(0)) == sizeof(::boost::type_traits::yes_type), - ::boost::type_traits::ice_not< ::boost::is_union::value >::value - >::value) - ); -}; - -#endif - -#else - -template -struct is_class_impl -{ -# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_not< ::boost::is_union::value >::value, - ::boost::type_traits::ice_not< ::boost::is_scalar::value >::value, - ::boost::type_traits::ice_not< ::boost::is_array::value >::value, - ::boost::type_traits::ice_not< ::boost::is_reference::value>::value, - ::boost::type_traits::ice_not< ::boost::is_void::value >::value, - ::boost::type_traits::ice_not< ::boost::is_function::value >::value - >::value)); -# else - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_not< ::boost::is_union::value >::value, - ::boost::type_traits::ice_not< ::boost::is_scalar::value >::value, - ::boost::type_traits::ice_not< ::boost::is_array::value >::value, - ::boost::type_traits::ice_not< ::boost::is_reference::value>::value, - ::boost::type_traits::ice_not< ::boost::is_void::value >::value - >::value)); -# endif -}; - -# endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION -# else // BOOST_IS_CLASS -template -struct is_class_impl -{ - BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_CLASS(T)); -}; -# endif // BOOST_IS_CLASS - -} // namespace detail - -# ifdef __EDG_VERSION__ -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_class,T, boost::detail::is_class_impl::type>::value) -# else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_class,T,::boost::detail::is_class_impl::value) -# endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_CLASS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_complex.hpp b/src/vendor/stp/src/boost/type_traits/is_complex.hpp deleted file mode 100644 index 9ccc333cb..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_complex.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 2007. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_COMPLEX_HPP -#define BOOST_TT_IS_COMPLEX_HPP - -#include -#include -// should be the last #include -#include - - -namespace boost { -namespace detail{ - -struct is_convertible_from_tester -{ - template - is_convertible_from_tester(const std::complex&); -}; - -} - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_complex,T,(::boost::is_convertible::value)) - -} // namespace boost - -#include - -#endif //BOOST_TT_IS_COMPLEX_HPP diff --git a/src/vendor/stp/src/boost/type_traits/is_compound.hpp b/src/vendor/stp/src/boost/type_traits/is_compound.hpp deleted file mode 100644 index bbaaa42cd..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_compound.hpp +++ /dev/null @@ -1,46 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_COMPOUND_HPP_INCLUDED -#define BOOST_TT_IS_COMPOUND_HPP_INCLUDED - -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -#if !defined( __CODEGEARC__ ) -namespace detail { - -template -struct is_compound_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_not< - ::boost::is_fundamental::value - >::value)); -}; - -} // namespace detail -#endif // !defined( __CODEGEARC__ ) - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_compound,T,__is_compound(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_compound,T,::boost::detail::is_compound_impl::value) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_COMPOUND_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_const.hpp b/src/vendor/stp/src/boost/type_traits/is_const.hpp deleted file mode 100644 index e66d18a31..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_const.hpp +++ /dev/null @@ -1,146 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Howard Hinnant and John Maddock 2000. -// (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -// Fixed is_pointer, is_reference, is_const, is_volatile, is_same, -// is_member_pointer based on the Simulated Partial Specialization work -// of Mat Marcus and Jesse Jones. See http://opensource.adobe.com or -// http://groups.yahoo.com/group/boost/message/5441 -// Some workarounds in here use ideas suggested from "Generic: -// Mappings between Types and Values" -// by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html). - - -#ifndef BOOST_TT_IS_CONST_HPP_INCLUDED -#define BOOST_TT_IS_CONST_HPP_INCLUDED - -#include -#include - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# ifdef __GNUC__ -# include -# endif -# if BOOST_WORKAROUND(BOOST_MSVC, < 1400) -# include -# endif -#else -# include -# include -# include -# include -#endif - -// should be the last #include -#include - -namespace boost { - -#if defined( __CODEGEARC__ ) - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,__is_const(T)) - -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -//* is a type T declared const - is_const -#if BOOST_WORKAROUND(BOOST_MSVC, < 1400) - BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,::boost::detail::cv_traits_imp::type*>::is_const) -#else - BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,::boost::detail::cv_traits_imp::is_const) -#endif -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T&,false) - -#if defined(BOOST_ILLEGAL_CV_REFERENCES) -// these are illegal specialisations; cv-qualifies applied to -// references have no effect according to [8.3.2p1], -// C++ Builder requires them though as it treats cv-qualified -// references as distinct types... -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& const,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& const volatile,false) -#endif - -#if defined(__GNUC__) && (__GNUC__ < 3) -// special case for gcc where illegally cv-qualified reference types can be -// generated in some corner cases: -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T const,!(::boost::is_reference::value)) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T volatile const,!(::boost::is_reference::value)) -#endif - -#else - -namespace detail { - -using ::boost::type_traits::yes_type; -using ::boost::type_traits::no_type; - -yes_type is_const_tester(const volatile void*); -no_type is_const_tester(volatile void *); - -template -struct is_const_helper - : ::boost::type_traits::false_result -{ -}; - -template <> -struct is_const_helper -{ - template struct result_ - { - static T* t; - BOOST_STATIC_CONSTANT(bool, value = ( - sizeof(detail::yes_type) == sizeof(detail::is_const_tester(t)) - )); - }; -}; - -template <> -struct is_const_helper -{ - template struct result_ - { - static T t; - BOOST_STATIC_CONSTANT(bool, value = ( - sizeof(detail::yes_type) == sizeof(detail::is_const_tester(&t)) - )); - }; -}; - -template -struct is_const_impl - : is_const_helper< - is_reference::value - , is_array::value - >::template result_ -{ -}; - -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_const,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_const,void const,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_const,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_const,void const volatile,true) -#endif - -} // namespace detail - -//* is a type T declared const - is_const -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,::boost::detail::is_const_impl::value) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_CONST_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/is_convertible.hpp b/src/vendor/stp/src/boost/type_traits/is_convertible.hpp deleted file mode 100644 index a31a930fa..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_convertible.hpp +++ /dev/null @@ -1,430 +0,0 @@ - -// Copyright 2000 John Maddock (john@johnmaddock.co.uk) -// Copyright 2000 Jeremy Siek (jsiek@lsc.nd.edu) -// Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) -// -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED -#define BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED - -#include -#ifndef BOOST_IS_CONVERTIBLE -#include -#include -#include -#include -#include -#include -#include -#ifndef BOOST_NO_IS_ABSTRACT -#include -#endif - -#if defined(__MWERKS__) -#include -#include -#endif - -#endif // BOOST_IS_CONVERTIBLE - -// should be always the last #include directive -#include - -namespace boost { - -#ifndef BOOST_IS_CONVERTIBLE - -// is one type convertable to another? -// -// there are multiple versions of the is_convertible -// template, almost every compiler seems to require its -// own version. -// -// Thanks to Andrei Alexandrescu for the original version of the -// conversion detection technique! -// - -namespace detail { - -// MS specific version: - -#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) - -// This workaround is necessary to handle when From is void -// which is normally taken care of by the partial specialization -// of the is_convertible typename. -using ::boost::type_traits::yes_type; -using ::boost::type_traits::no_type; - -template< typename From > -struct does_conversion_exist -{ - template< typename To > struct result_ - { - static no_type BOOST_TT_DECL _m_check(...); - static yes_type BOOST_TT_DECL _m_check(To); - static From _m_from; - enum { value = sizeof( _m_check(_m_from) ) == sizeof(yes_type) }; - }; -}; - -template<> -struct does_conversion_exist -{ - template< typename To > struct result_ - { - enum { value = ::boost::is_void::value }; - }; -}; - -template -struct is_convertible_basic_impl - : does_conversion_exist::template result_ -{ -}; - -#elif defined(__BORLANDC__) && (__BORLANDC__ < 0x560) -// -// special version for Borland compilers -// this version breaks when used for some -// UDT conversions: -// -template -struct is_convertible_impl -{ -#pragma option push -w-8074 - // This workaround for Borland breaks the EDG C++ frontend, - // so we only use it for Borland. - template struct checker - { - static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); - static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(T); - }; - - static From _m_from; - static bool const value = sizeof( checker::_m_check(_m_from) ) - == sizeof(::boost::type_traits::yes_type); -#pragma option pop -}; - -#elif defined(__GNUC__) || defined(__BORLANDC__) && (__BORLANDC__ < 0x600) -// special version for gcc compiler + recent Borland versions -// note that this does not pass UDT's through (...) - -struct any_conversion -{ - template any_conversion(const volatile T&); - template any_conversion(T&); -}; - -template struct checker -{ - static boost::type_traits::no_type _m_check(any_conversion ...); - static boost::type_traits::yes_type _m_check(T, int); -}; - -template -struct is_convertible_basic_impl -{ - static From _m_from; - static bool const value = sizeof( detail::checker::_m_check(_m_from, 0) ) - == sizeof(::boost::type_traits::yes_type); -}; - -#elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \ - || defined(__IBMCPP__) || defined(__HP_aCC) -// -// This is *almost* an ideal world implementation as it doesn't rely -// on undefined behaviour by passing UDT's through (...). -// Unfortunately it doesn't quite pass all the tests for most compilers (sigh...) -// Enable this for your compiler if is_convertible_test.cpp will compile it... -// -// Note we do not enable this for VC7.1, because even though it passes all the -// type_traits tests it is known to cause problems when instantiation occurs -// deep within the instantiation tree :-( -// -struct any_conversion -{ - template any_conversion(const volatile T&); - // we need this constructor to catch references to functions - // (which can not be cv-qualified): - template any_conversion(T&); -}; - -template -struct is_convertible_basic_impl -{ - static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); - static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); - static From _m_from; - - BOOST_STATIC_CONSTANT(bool, value = - sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type) - ); -}; - -#elif defined(__DMC__) - -struct any_conversion -{ - template any_conversion(const volatile T&); - // we need this constructor to catch references to functions - // (which can not be cv-qualified): - template any_conversion(T&); -}; - -template -struct is_convertible_basic_impl -{ - // Using '...' doesn't always work on Digital Mars. This version seems to. - template - static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion, float, T); - static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int, int); - static From _m_from; - - // Static constants sometime cause the conversion of _m_from to To to be - // called. This doesn't happen with an enum. - enum { value = - sizeof( _m_check(_m_from, 0, 0) ) == sizeof(::boost::type_traits::yes_type) - }; -}; - -#elif defined(__MWERKS__) -// -// CW works with the technique implemented above for EDG, except when From -// is a function type (or a reference to such a type), in which case -// any_conversion won't be accepted as a valid conversion. We detect this -// exceptional situation and channel it through an alternative algorithm. -// - -template -struct is_convertible_basic_impl_aux; - -struct any_conversion -{ - template any_conversion(const volatile T&); -}; - -template -struct is_convertible_basic_impl_aux -{ - static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); - static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); - static From _m_from; - - BOOST_STATIC_CONSTANT(bool, value = - sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type) - ); -}; - -template -struct is_convertible_basic_impl_aux -{ - static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); - static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To); - static From _m_from; - BOOST_STATIC_CONSTANT(bool, value = - sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type) - ); -}; - -template -struct is_convertible_basic_impl: - is_convertible_basic_impl_aux< - From,To, - ::boost::is_function::type>::value - > -{}; - -#else - -// -// This version seems to work pretty well for a wide spectrum of compilers, -// however it does rely on undefined behaviour by passing UDT's through (...). -// -template -struct is_convertible_basic_impl -{ - static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); - static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To); - static From _m_from; -#ifdef BOOST_MSVC -#pragma warning(push) -#pragma warning(disable:4244) -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(disable:6334) -#endif -#endif - BOOST_STATIC_CONSTANT(bool, value = - sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type) - ); -#ifdef BOOST_MSVC -#pragma warning(pop) -#endif -}; - -#endif // is_convertible_impl - -#if defined(__DMC__) -// As before, a static constant sometimes causes errors on Digital Mars. -template -struct is_convertible_impl -{ - typedef typename add_reference::type ref_type; - enum { value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_or< - ::boost::detail::is_convertible_basic_impl::value, - ::boost::is_void::value - >::value, - ::boost::type_traits::ice_not< - ::boost::is_array::value - >::value - >::value) }; -}; -#elif !defined(__BORLANDC__) || __BORLANDC__ > 0x551 -template -struct is_convertible_impl -{ - typedef typename add_reference::type ref_type; - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_or< - ::boost::detail::is_convertible_basic_impl::value, - ::boost::is_void::value - >::value, - ::boost::type_traits::ice_not< - ::boost::is_array::value - >::value - >::value) - ); -}; -#endif - -template -struct is_convertible_impl_select -{ - template - struct rebind - { - typedef is_convertible_impl type; - }; -}; - -template <> -struct is_convertible_impl_select -{ - template - struct rebind - { - typedef true_type type; - }; -}; - -template <> -struct is_convertible_impl_select -{ - template - struct rebind - { - typedef false_type type; - }; -}; - -template <> -struct is_convertible_impl_select -{ - template - struct rebind - { - typedef false_type type; - }; -}; - -template -struct is_convertible_impl_dispatch_base -{ -#if !BOOST_WORKAROUND(__HP_aCC, < 60700) - typedef is_convertible_impl_select< - ::boost::is_arithmetic::value, - ::boost::is_arithmetic::value, -#ifndef BOOST_NO_IS_ABSTRACT - ::boost::is_abstract::value -#else - false -#endif - > selector; -#else - typedef is_convertible_impl_select selector; -#endif - typedef typename selector::template rebind isc_binder; - typedef typename isc_binder::type type; -}; - -template -struct is_convertible_impl_dispatch - : public is_convertible_impl_dispatch_base::type -{}; - -// -// Now add the full and partial specialisations -// for void types, these are common to all the -// implementation above: -// -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -# define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \ - BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2,value) \ - BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const,value) \ - BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 volatile,value) \ - BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const volatile,value) \ - /**/ - -# define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(trait,spec1,spec2,value) \ - TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \ - TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const,spec2,value) \ - TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 volatile,spec2,value) \ - TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const volatile,spec2,value) \ - /**/ - - TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(is_convertible,void,void,true) - -# undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2 -# undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1 - -#else - BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(is_convertible,void,void,true) -#endif // BOOST_NO_CV_VOID_SPECIALIZATIONS - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void,To,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void,true) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const,To,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void volatile,To,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const volatile,To,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void volatile,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const volatile,true) -#endif -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,(::boost::detail::is_convertible_impl_dispatch::value)) - -#else - -BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,BOOST_IS_CONVERTIBLE(From,To)) - -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_empty.hpp b/src/vendor/stp/src/boost/type_traits/is_empty.hpp deleted file mode 100644 index 45c4e9e1e..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_empty.hpp +++ /dev/null @@ -1,221 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_EMPTY_HPP_INCLUDED -#define BOOST_TT_IS_EMPTY_HPP_INCLUDED - -#include -#include -#include -#include - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# include -# include -#else -# include -# include -# include -# include -# include -# include -# include -#endif - -// should be always the last #include directive -#include - -namespace boost { - -namespace detail { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -#ifdef BOOST_MSVC -#pragma warning(push) -#pragma warning(disable:4624) // destructor could not be generated -#endif - -template -struct empty_helper_t1 : public T -{ - empty_helper_t1(); // hh compiler bug workaround - int i[256]; -private: - // suppress compiler warnings: - empty_helper_t1(const empty_helper_t1&); - empty_helper_t1& operator=(const empty_helper_t1&); -}; - -#ifdef BOOST_MSVC -#pragma warning(pop) -#endif - -struct empty_helper_t2 { int i[256]; }; - -#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) - -template -struct empty_helper -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template -struct empty_helper -{ - BOOST_STATIC_CONSTANT( - bool, value = (sizeof(empty_helper_t1) == sizeof(empty_helper_t2)) - ); -}; - -template -struct is_empty_impl -{ - typedef typename remove_cv::type cvt; - BOOST_STATIC_CONSTANT( - bool, value = ( - ::boost::type_traits::ice_or< - ::boost::detail::empty_helper::value>::value - , BOOST_IS_EMPTY(cvt) - >::value - )); -}; - -#else // __BORLANDC__ - -template -struct empty_helper -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template -struct empty_helper -{ - BOOST_STATIC_CONSTANT(bool, value = ( - sizeof(empty_helper_t1) == sizeof(empty_helper_t2) - )); -}; - -template -struct is_empty_impl -{ - typedef typename remove_cv::type cvt; - typedef typename add_reference::type r_type; - - BOOST_STATIC_CONSTANT( - bool, value = ( - ::boost::type_traits::ice_or< - ::boost::detail::empty_helper< - cvt - , ::boost::is_class::value - , ::boost::is_convertible< r_type,int>::value - >::value - , BOOST_IS_EMPTY(cvt) - >::value)); -}; - -#endif // __BORLANDC__ - -#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES - -template -struct empty_helper_t1 : public T -{ - empty_helper_t1(); - int i[256]; -}; - -struct empty_helper_t2 { int i[256]; }; - -template -struct empty_helper_base -{ - enum { value = (sizeof(empty_helper_t1) == sizeof(empty_helper_t2)) }; -}; - -template -struct empty_helper_nonbase -{ - enum { value = false }; -}; - -template -struct empty_helper_chooser -{ - template struct result_ - { - typedef empty_helper_nonbase type; - }; -}; - -template <> -struct empty_helper_chooser -{ - template struct result_ - { - typedef empty_helper_base type; - }; -}; - -template -struct is_empty_impl -{ - typedef ::boost::detail::empty_helper_chooser< - ::boost::type_traits::ice_and< - ::boost::type_traits::ice_not< ::boost::is_reference::value >::value, - ::boost::type_traits::ice_not< ::boost::is_convertible::value >::value, - ::boost::type_traits::ice_not< ::boost::is_pointer::value >::value, - ::boost::type_traits::ice_not< ::boost::is_member_pointer::value >::value, - ::boost::type_traits::ice_not< ::boost::is_array::value >::value, - ::boost::type_traits::ice_not< ::boost::is_void::value >::value, - ::boost::type_traits::ice_not< - ::boost::is_convertible::value - >::value - >::value > chooser; - - typedef typename chooser::template result_ result; - typedef typename result::type eh_type; - - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or::value)); -}; - -#else - -template struct is_empty_impl -{ - BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_EMPTY(T)); -}; - -#endif // BOOST_MSVC6_MEMBER_TEMPLATES - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -// these help when the compiler has no partial specialization support: -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const volatile,false) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_empty,T,::boost::detail::is_empty_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_EMPTY_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/is_enum.hpp b/src/vendor/stp/src/boost/type_traits/is_enum.hpp deleted file mode 100644 index 86fa66d99..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_enum.hpp +++ /dev/null @@ -1,189 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_IS_ENUM_HPP_INCLUDED -#define BOOST_TT_IS_ENUM_HPP_INCLUDED - -#include -#ifndef BOOST_IS_ENUM -#include -#include -#include -#include -#include -#ifdef __GNUC__ -#include -#endif -#include -#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) -# include -# include -#endif -#endif - -// should be the last #include -#include - -namespace boost { - -#ifndef BOOST_IS_ENUM -#if !(defined(__BORLANDC__) && (__BORLANDC__ <= 0x551)) - -namespace detail { - -#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) - -template -struct is_class_or_union -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::is_class::value - , ::boost::is_union::value - >::value)); -}; - -#else - -template -struct is_class_or_union -{ -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581))// we simply can't detect it this way. - BOOST_STATIC_CONSTANT(bool, value = false); -# else - template static ::boost::type_traits::yes_type is_class_or_union_tester(void(U::*)(void)); - -# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) \ - || BOOST_WORKAROUND(__MWERKS__, <= 0x3000) // no SFINAE - static ::boost::type_traits::no_type is_class_or_union_tester(...); - BOOST_STATIC_CONSTANT( - bool, value = sizeof(is_class_or_union_tester(0)) == sizeof(::boost::type_traits::yes_type)); -# else - template - static ::boost::type_traits::no_type is_class_or_union_tester(...); - BOOST_STATIC_CONSTANT( - bool, value = sizeof(is_class_or_union_tester(0)) == sizeof(::boost::type_traits::yes_type)); -# endif -# endif -}; -#endif - -struct int_convertible -{ - int_convertible(int); -}; - -// Don't evaluate convertibility to int_convertible unless the type -// is non-arithmetic. This suppresses warnings with GCC. -template -struct is_enum_helper -{ - template struct type - { - BOOST_STATIC_CONSTANT(bool, value = false); - }; -}; - -template <> -struct is_enum_helper -{ - template struct type - : ::boost::is_convertible::type,::boost::detail::int_convertible> - { - }; -}; - -template struct is_enum_impl -{ - //typedef ::boost::add_reference ar_t; - //typedef typename ar_t::type r_type; - -#if defined(__GNUC__) - -#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION - - // We MUST check for is_class_or_union on conforming compilers in - // order to correctly deduce that noncopyable types are not enums - // (dwa 2002/04/15)... - BOOST_STATIC_CONSTANT(bool, selector = - (::boost::type_traits::ice_or< - ::boost::is_arithmetic::value - , ::boost::is_reference::value - , ::boost::is_function::value - , is_class_or_union::value - , is_array::value - >::value)); -#else - // ...however, not checking is_class_or_union on non-conforming - // compilers prevents a dependency recursion. - BOOST_STATIC_CONSTANT(bool, selector = - (::boost::type_traits::ice_or< - ::boost::is_arithmetic::value - , ::boost::is_reference::value - , ::boost::is_function::value - , is_array::value - >::value)); -#endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION - -#else // !defined(__GNUC__): - - BOOST_STATIC_CONSTANT(bool, selector = - (::boost::type_traits::ice_or< - ::boost::is_arithmetic::value - , ::boost::is_reference::value - , is_class_or_union::value - , is_array::value - >::value)); - -#endif - -#if BOOST_WORKAROUND(__BORLANDC__, < 0x600) - typedef ::boost::detail::is_enum_helper< - ::boost::detail::is_enum_impl::selector - > se_t; -#else - typedef ::boost::detail::is_enum_helper se_t; -#endif - - typedef typename se_t::template type helper; - BOOST_STATIC_CONSTANT(bool, value = helper::value); -}; - -// these help on compilers with no partial specialization support: -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const volatile,false) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,::boost::detail::is_enum_impl::value) - -#else // __BORLANDC__ -// -// buggy is_convertible prevents working -// implementation of is_enum: -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,false) - -#endif - -#else // BOOST_IS_ENUM - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,BOOST_IS_ENUM(T)) - -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_ENUM_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_float.hpp b/src/vendor/stp/src/boost/type_traits/is_float.hpp deleted file mode 100644 index 25d16f180..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_float.hpp +++ /dev/null @@ -1,27 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED -#define BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED - -// should be the last #include -#include - -namespace boost { - -//* is a type T a floating-point type described in the standard (3.9.1p8) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_float,T,false) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,float,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,double,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,long double,true) - -} // namespace boost - -#include - -#endif // BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_floating_point.hpp b/src/vendor/stp/src/boost/type_traits/is_floating_point.hpp deleted file mode 100644 index 222445305..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_floating_point.hpp +++ /dev/null @@ -1,27 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000-2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED -#define BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED - -// should be the last #include -#include - -namespace boost { - -//* is a type T a floating-point type described in the standard (3.9.1p8) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_floating_point,T,false) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,float,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,double,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,long double,true) - -} // namespace boost - -#include - -#endif // BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_function.hpp b/src/vendor/stp/src/boost/type_traits/is_function.hpp deleted file mode 100644 index 95dba0dab..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_function.hpp +++ /dev/null @@ -1,103 +0,0 @@ - -// Copyright 2000 John Maddock (john@johnmaddock.co.uk) -// Copyright 2002 Aleksey Gurtovoy (agurtovoy@meta-comm.com) -// -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_FUNCTION_HPP_INCLUDED -#define BOOST_TT_IS_FUNCTION_HPP_INCLUDED - -#include -#include -#include - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS) -# include -#else -# include -# include -#endif - -// should be the last #include -#include - -// is a type a function? -// Please note that this implementation is unnecessarily complex: -// we could just use !is_convertible::value, -// except that some compilers erroneously allow conversions from -// function pointers to void*. - -namespace boost { - -#if !defined( __CODEGEARC__ ) - -namespace detail { - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS) -template -struct is_function_chooser - : ::boost::type_traits::false_result -{ -}; - -template <> -struct is_function_chooser -{ - template< typename T > struct result_ - : ::boost::type_traits::is_function_ptr_helper - { - }; -}; - -template -struct is_function_impl - : is_function_chooser< ::boost::is_reference::value > - ::BOOST_NESTED_TEMPLATE result_ -{ -}; - -#else - -template -struct is_function_impl -{ -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(push) -#pragma warning(disable:6334) -#endif - static T* t; - BOOST_STATIC_CONSTANT( - bool, value = sizeof(::boost::type_traits::is_function_ptr_tester(t)) - == sizeof(::boost::type_traits::yes_type) - ); -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(pop) -#endif -}; - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -template -struct is_function_impl : public false_type -{}; -#endif - -#endif - -} // namespace detail - -#endif // !defined( __CODEGEARC__ ) - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,__is_function(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,::boost::detail::is_function_impl::value) -#endif -} // namespace boost - -#include - -#endif // BOOST_TT_IS_FUNCTION_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_fundamental.hpp b/src/vendor/stp/src/boost/type_traits/is_fundamental.hpp deleted file mode 100644 index 6aff7dd19..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_fundamental.hpp +++ /dev/null @@ -1,45 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_FUNDAMENTAL_HPP_INCLUDED -#define BOOST_TT_IS_FUNDAMENTAL_HPP_INCLUDED - -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct is_fundamental_impl - : ::boost::type_traits::ice_or< - ::boost::is_arithmetic::value - , ::boost::is_void::value - > -{ -}; - -} // namespace detail - -//* is a type T a fundamental type described in the standard (3.9.1) -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_fundamental,T,__is_fundamental(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_fundamental,T,::boost::detail::is_fundamental_impl::value) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_FUNDAMENTAL_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_integral.hpp b/src/vendor/stp/src/boost/type_traits/is_integral.hpp deleted file mode 100644 index 99420a991..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_integral.hpp +++ /dev/null @@ -1,78 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_INTEGRAL_HPP_INCLUDED -#define BOOST_TT_IS_INTEGRAL_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -//* is a type T an [cv-qualified-] integral type described in the standard (3.9.1p3) -// as an extention we include long long, as this is likely to be added to the -// standard at a later date -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_integral,T,__is_integral(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_integral,T,false) - -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned char,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned short,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned int,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned long,true) - -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed char,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed short,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed int,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed long,true) - -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,bool,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char,true) - -#ifndef BOOST_NO_INTRINSIC_WCHAR_T -// If the following line fails to compile and you're using the Intel -// compiler, see http://lists.boost.org/MailArchives/boost-users/msg06567.php, -// and define BOOST_NO_INTRINSIC_WCHAR_T on the command line. -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,wchar_t,true) -#endif - -// Same set of integral types as in boost/type_traits/integral_promotion.hpp. -// Please, keep in sync. -- Alexander Nasonov -#if (defined(BOOST_MSVC) && (BOOST_MSVC < 1300)) \ - || (defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 600)) \ - || (defined(__BORLANDC__) && (__BORLANDC__ == 0x600) && (_MSC_VER < 1300)) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int8,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int8,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int16,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int16,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int32,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int32,true) -#ifdef __BORLANDC__ -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true) -#endif -#endif - -# if defined(BOOST_HAS_LONG_LONG) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::ulong_long_type,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::long_long_type,true) -#elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true) -#endif - -#endif // non-CodeGear implementation - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_INTEGRAL_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_member_function_pointer.hpp b/src/vendor/stp/src/boost/type_traits/is_member_function_pointer.hpp deleted file mode 100644 index 81f1eacc9..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_member_function_pointer.hpp +++ /dev/null @@ -1,136 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED -#define BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED - -#include -#include - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS) - // - // Note: we use the "workaround" version for MSVC because it works for - // __stdcall etc function types, where as the partial specialisation - // version does not do so. - // -# include -# include -#else -# include -# include -# include -# include -# include -# include -#endif - -// should be the last #include -#include - -namespace boost { - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_function_pointer,T,__is_member_function_pointer( T )) -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS) - -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_member_function_pointer - , T - , ::boost::type_traits::is_mem_fun_pointer_impl::type>::value - ) - -#else - -namespace detail { - -#ifndef __BORLANDC__ - -template -struct is_mem_fun_pointer_select - : ::boost::type_traits::false_result -{ -}; - -template <> -struct is_mem_fun_pointer_select -{ - template struct result_ - { -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(push) -#pragma warning(disable:6334) -#endif - static T* make_t; - typedef result_ self_type; - - BOOST_STATIC_CONSTANT( - bool, value = ( - 1 == sizeof(::boost::type_traits::is_mem_fun_pointer_tester(self_type::make_t)) - )); -#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) -#pragma warning(pop) -#endif - }; -}; - -template -struct is_member_function_pointer_impl - : is_mem_fun_pointer_select< - ::boost::type_traits::ice_or< - ::boost::is_reference::value - , ::boost::is_array::value - >::value - >::template result_ -{ -}; - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -template -struct is_member_function_pointer_impl : public false_type{}; -#endif - -#else // Borland C++ - -template -struct is_member_function_pointer_impl -{ - static T* m_t; - BOOST_STATIC_CONSTANT( - bool, value = - (1 == sizeof(type_traits::is_mem_fun_pointer_tester(m_t))) ); -}; - -template -struct is_member_function_pointer_impl -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -#endif - -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void const volatile,false) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_function_pointer,T,::boost::detail::is_member_function_pointer_impl::value) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_member_object_pointer.hpp b/src/vendor/stp/src/boost/type_traits/is_member_object_pointer.hpp deleted file mode 100644 index 66b76c90b..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_member_object_pointer.hpp +++ /dev/null @@ -1,46 +0,0 @@ - -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED -#define BOOST_TT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED - -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail{ - -template -struct is_member_object_pointer_impl -{ - BOOST_STATIC_CONSTANT( - bool, value = (::boost::type_traits::ice_and< - ::boost::is_member_pointer::value, - ::boost::type_traits::ice_not< - ::boost::is_member_function_pointer::value - >::value - >::value )); -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_object_pointer,T,::boost::detail::is_member_object_pointer_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_member_pointer.hpp b/src/vendor/stp/src/boost/type_traits/is_member_pointer.hpp deleted file mode 100644 index ba02b89ba..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_member_pointer.hpp +++ /dev/null @@ -1,116 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Howard Hinnant and John Maddock 2000. -// (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -// Fixed is_pointer, is_reference, is_const, is_volatile, is_same, -// is_member_pointer based on the Simulated Partial Specialization work -// of Mat Marcus and Jesse Jones. See http://opensource.adobe.com or -// http://groups.yahoo.com/group/boost/message/5441 -// Some workarounds in here use ideas suggested from "Generic: -// Mappings between Types and Values" -// by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html). - - -#ifndef BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED -#define BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED - -#include -#include - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__BORLANDC__, < 0x600) -# include -#else -# include -# include -# include -# include -# include -# include -#endif - -// should be the last #include -#include - -namespace boost { - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,__is_member_pointer(T)) -#elif BOOST_WORKAROUND(__BORLANDC__, < 0x600) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true) - -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,::boost::is_member_function_pointer::value) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true) - -#if !BOOST_WORKAROUND(__MWERKS__,<=0x3003) && !BOOST_WORKAROUND(__IBMCPP__, <=600) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const,true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*volatile,true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const volatile,true) -#endif - -#else // no partial template specialization - -namespace detail { - -template -::boost::type_traits::yes_type BOOST_TT_DECL is_member_pointer_tester(R T::*const volatile*); -::boost::type_traits::no_type BOOST_TT_DECL is_member_pointer_tester(...); - -template -struct is_member_pointer_select - : ::boost::type_traits::false_result -{ -}; - -template <> -struct is_member_pointer_select -{ - template struct result_ - { - static T* make_t(); - BOOST_STATIC_CONSTANT( - bool, value = - (::boost::type_traits::ice_or< - (1 == sizeof(::boost::type_traits::is_mem_fun_pointer_tester(make_t()))), - (1 == sizeof(is_member_pointer_tester(make_t()))) - >::value) ); - }; -}; - -template -struct is_member_pointer_impl - : is_member_pointer_select< - ::boost::type_traits::ice_or< - ::boost::is_reference::value - , ::boost::is_array::value - >::value - >::template result_ -{ -}; - -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void const volatile,false) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,::boost::detail::is_member_pointer_impl::value) - -#endif // __BORLANDC__ - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_object.hpp b/src/vendor/stp/src/boost/type_traits/is_object.hpp deleted file mode 100644 index 3decbf8d1..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_object.hpp +++ /dev/null @@ -1,53 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_OBJECT_HPP_INCLUDED -#define BOOST_TT_IS_OBJECT_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct is_object_impl -{ -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_not< ::boost::is_reference::value>::value, - ::boost::type_traits::ice_not< ::boost::is_void::value>::value, - ::boost::type_traits::ice_not< ::boost::is_function::value>::value - >::value)); -#else - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::type_traits::ice_not< ::boost::is_reference::value>::value, - ::boost::type_traits::ice_not< ::boost::is_void::value>::value - >::value)); -#endif -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_object,T,::boost::detail::is_object_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_OBJECT_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_pod.hpp b/src/vendor/stp/src/boost/type_traits/is_pod.hpp deleted file mode 100644 index af2c3c4ae..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_pod.hpp +++ /dev/null @@ -1,135 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_POD_HPP_INCLUDED -#define BOOST_TT_IS_POD_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#include - -// should be the last #include -#include - -namespace boost { - -// forward declaration, needed by 'is_pod_array_helper' template below -template< typename T > struct is_POD; - -namespace detail { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -template struct is_pod_impl -{ - BOOST_STATIC_CONSTANT( - bool, value = - (::boost::type_traits::ice_or< - ::boost::is_scalar::value, - ::boost::is_void::value, - BOOST_IS_POD(T) - >::value)); -}; - -#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -template -struct is_pod_impl - : is_pod_impl -{ -}; -#endif - -#else - -template -struct is_pod_helper -{ - template struct result_ - { - BOOST_STATIC_CONSTANT( - bool, value = - (::boost::type_traits::ice_or< - ::boost::is_scalar::value, - ::boost::is_void::value, - BOOST_IS_POD(T) - >::value)); - }; -}; - -template -struct bool_to_yes_no_type -{ - typedef ::boost::type_traits::no_type type; -}; - -template <> -struct bool_to_yes_no_type -{ - typedef ::boost::type_traits::yes_type type; -}; - -template -struct is_pod_array_helper -{ - enum { is_pod = ::boost::is_POD::value }; // MSVC workaround - typedef typename bool_to_yes_no_type::type type; - type instance() const; -}; - -template -is_pod_array_helper is_POD_array(T*); - -template <> -struct is_pod_helper -{ - template struct result_ - { - static T& help(); - BOOST_STATIC_CONSTANT(bool, value = - sizeof(is_POD_array(help()).instance()) == sizeof(::boost::type_traits::yes_type) - ); - }; -}; - - -template struct is_pod_impl -{ - BOOST_STATIC_CONSTANT( - bool, value = ( - ::boost::detail::is_pod_helper< - ::boost::is_array::value - >::template result_::value - ) - ); -}; - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -// the following help compilers without partial specialization support: -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void,true) - -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void const,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void volatile,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void const volatile,true) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_POD,T,::boost::detail::is_pod_impl::value) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pod,T,::boost::detail::is_pod_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_POD_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_pointer.hpp b/src/vendor/stp/src/boost/type_traits/is_pointer.hpp deleted file mode 100644 index f6ecf336f..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_pointer.hpp +++ /dev/null @@ -1,162 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Howard Hinnant and John Maddock 2000. -// (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -// Fixed is_pointer, is_reference, is_const, is_volatile, is_same, -// is_member_pointer based on the Simulated Partial Specialization work -// of Mat Marcus and Jesse Jones. See http://opensource.adobe.com or -// http://groups.yahoo.com/group/boost/message/5441 -// Some workarounds in here use ideas suggested from "Generic: -// Mappings between Types and Values" -// by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html). - - -#ifndef BOOST_TT_IS_POINTER_HPP_INCLUDED -#define BOOST_TT_IS_POINTER_HPP_INCLUDED - -#include -#include -#include -#include -#if !BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# include -# include -# include -# include -#endif - -// should be the last #include -#include - -namespace boost { - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pointer,T,__is_pointer(T)) -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -namespace detail { - -template< typename T > struct is_pointer_helper -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -# define TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC(helper,sp,result) \ -template< typename T > struct helper \ -{ \ - BOOST_STATIC_CONSTANT(bool, value = result); \ -}; \ -/**/ - -TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC(is_pointer_helper,T*,true) - -# undef TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC - -template< typename T > -struct is_pointer_impl -{ -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::detail::is_pointer_helper::value - , ::boost::type_traits::ice_not< - ::boost::is_member_pointer::value - >::value - >::value) - ); -#else - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::detail::is_pointer_helper::type>::value - , ::boost::type_traits::ice_not< - ::boost::is_member_pointer::value - >::value - >::value) - ); -#endif -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pointer,T,::boost::detail::is_pointer_impl::value) - -#if defined(__BORLANDC__) && !defined(__COMO__) && (__BORLANDC__ < 0x600) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T&,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& const,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& const volatile,false) -#endif - -#else // no partial template specialization - -namespace detail { - -struct pointer_helper -{ - pointer_helper(const volatile void*); -}; - -yes_type BOOST_TT_DECL is_pointer_tester(pointer_helper); -no_type BOOST_TT_DECL is_pointer_tester(...); - -template -struct is_pointer_select - : ::boost::type_traits::false_result -{ -}; - -template <> -struct is_pointer_select -{ - template struct result_ - { - static T& make_t(); - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - (1 == sizeof(is_pointer_tester(make_t()))), - (1 == sizeof(type_traits::is_function_ptr_tester(make_t()))) - >::value)); - }; -}; - -template -struct is_pointer_impl - : is_pointer_select< - ::boost::type_traits::ice_or< - ::boost::is_reference::value - , ::boost::is_array::value - >::value - >::template result_ -{ -}; - -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pointer,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pointer,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pointer,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pointer,void const volatile,false) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pointer,T,::boost::detail::is_pointer_impl::value) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_polymorphic.hpp b/src/vendor/stp/src/boost/type_traits/is_polymorphic.hpp deleted file mode 100644 index 8fcc69eb2..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_polymorphic.hpp +++ /dev/null @@ -1,114 +0,0 @@ -// (C) Copyright John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_POLYMORPHIC_HPP -#define BOOST_TT_IS_POLYMORPHIC_HPP - -#include -#ifndef BOOST_IS_POLYMORPHIC -#include -#include -#endif -// should be the last #include -#include -#include - -namespace boost{ - -#ifndef BOOST_IS_POLYMORPHIC - -namespace detail{ - -template -struct is_polymorphic_imp1 -{ -# if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) // CWPro7 should return false always. - typedef char d1, (&d2)[2]; -# else - typedef typename remove_cv::type ncvT; - struct d1 : public ncvT - { - d1(); -# if !defined(__GNUC__) // this raises warnings with some classes, and buys nothing with GCC - ~d1()throw(); -# endif - char padding[256]; - private: - // keep some picky compilers happy: - d1(const d1&); - d1& operator=(const d1&); - }; - struct d2 : public ncvT - { - d2(); - virtual ~d2()throw(); -# if !defined(BOOST_MSVC) && !defined(__ICL) - // for some reason this messes up VC++ when T has virtual bases, - // probably likewise for compilers that use the same ABI: - struct unique{}; - virtual void unique_name_to_boost5487629(unique*); -# endif - char padding[256]; - private: - // keep some picky compilers happy: - d2(const d2&); - d2& operator=(const d2&); - }; -# endif - BOOST_STATIC_CONSTANT(bool, value = (sizeof(d2) == sizeof(d1))); -}; - -template -struct is_polymorphic_imp2 -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template -struct is_polymorphic_selector -{ - template - struct rebind - { - typedef is_polymorphic_imp2 type; - }; -}; - -template <> -struct is_polymorphic_selector -{ - template - struct rebind - { - typedef is_polymorphic_imp1 type; - }; -}; - -template -struct is_polymorphic_imp -{ - typedef is_polymorphic_selector< ::boost::is_class::value> selector; - typedef typename selector::template rebind binder; - typedef typename binder::type imp_type; - BOOST_STATIC_CONSTANT(bool, value = imp_type::value); -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,::boost::detail::is_polymorphic_imp::value) - -#else // BOOST_IS_POLYMORPHIC - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,BOOST_IS_POLYMORPHIC(T)) - -#endif - -} // namespace boost - -#include - -#endif diff --git a/src/vendor/stp/src/boost/type_traits/is_reference.hpp b/src/vendor/stp/src/boost/type_traits/is_reference.hpp deleted file mode 100644 index dcf84db70..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_reference.hpp +++ /dev/null @@ -1,118 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Howard Hinnant and John Maddock 2000. -// (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -// Fixed is_pointer, is_reference, is_const, is_volatile, is_same, -// is_member_pointer based on the Simulated Partial Specialization work -// of Mat Marcus and Jesse Jones. See http://opensource.adobe.com or -// http://groups.yahoo.com/group/boost/message/5441 -// Some workarounds in here use ideas suggested from "Generic: -// Mappings between Types and Values" -// by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html). - - -#ifndef BOOST_TT_IS_REFERENCE_HPP_INCLUDED -#define BOOST_TT_IS_REFERENCE_HPP_INCLUDED - -#include - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# include -#endif - -// should be the last #include -#include - -namespace boost { - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_reference,T,__is_reference(T)) -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_reference,T,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_reference,T&,true) - -#if defined(BOOST_ILLEGAL_CV_REFERENCES) -// these are illegal specialisations; cv-qualifies applied to -// references have no effect according to [8.3.2p1], -// C++ Builder requires them though as it treats cv-qualified -// references as distinct types... -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_reference,T& const,true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_reference,T& volatile,true) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_reference,T& const volatile,true) -#endif - -#if defined(__GNUC__) && (__GNUC__ < 3) -// these allow us to work around illegally cv-qualified reference -// types. -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_reference,T const ,::boost::is_reference::value) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_reference,T volatile ,::boost::is_reference::value) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_reference,T const volatile ,::boost::is_reference::value) -// However, the above specializations confuse gcc 2.96 unless we also -// supply these specializations for array types -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,unsigned long N,is_reference,T[N],false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,unsigned long N,is_reference,const T[N],false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,unsigned long N,is_reference,volatile T[N],false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,unsigned long N,is_reference,const volatile T[N],false) -#endif - -#else - -#ifdef BOOST_MSVC -# pragma warning(push) -# pragma warning(disable: 4181 4097) -#endif - -namespace detail { - -using ::boost::type_traits::yes_type; -using ::boost::type_traits::no_type; -using ::boost::type_traits::wrap; - -template T&(* is_reference_helper1(wrap) )(wrap); -char is_reference_helper1(...); - -template no_type is_reference_helper2(T&(*)(wrap)); -yes_type is_reference_helper2(...); - -template -struct is_reference_impl -{ - BOOST_STATIC_CONSTANT( - bool, value = sizeof( - ::boost::detail::is_reference_helper2( - ::boost::detail::is_reference_helper1(::boost::type_traits::wrap()))) == 1 - ); -}; - -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void const volatile,false) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_reference,T,::boost::detail::is_reference_impl::value) - -#ifdef BOOST_MSVC -# pragma warning(pop) -#endif - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/is_same.hpp b/src/vendor/stp/src/boost/type_traits/is_same.hpp deleted file mode 100644 index e0d1808b4..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_same.hpp +++ /dev/null @@ -1,103 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Howard Hinnant and John Maddock 2000. -// (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -// Fixed is_pointer, is_reference, is_const, is_volatile, is_same, -// is_member_pointer based on the Simulated Partial Specialization work -// of Mat Marcus and Jesse Jones. See http://opensource.adobe.com or -// http://groups.yahoo.com/group/boost/message/5441 -// Some workarounds in here use ideas suggested from "Generic: -// Mappings between Types and Values" -// by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html). - - -#ifndef BOOST_TT_IS_SAME_HPP_INCLUDED -#define BOOST_TT_IS_SAME_HPP_INCLUDED - -#include -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -#include -#include -#include -#endif -// should be the last #include -#include - -namespace boost { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_same,T,U,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename T,is_same,T,T,true) -#if BOOST_WORKAROUND(__BORLANDC__, < 0x600) -// without this, Borland's compiler gives the wrong answer for -// references to arrays: -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename T,is_same,T&,T&,true) -#endif - -#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -namespace detail { - -#ifdef BOOST_MSVC -// the following VC6 specific implementation is *NOT* legal -// C++, but has the advantage that it works for incomplete -// types. - -template< typename T1 > -struct is_same_part_1 -{ - template struct part_2 { enum { value = false }; }; - template<> struct part_2 { enum { value = true }; }; -}; - -template< typename T1, typename T2 > -struct is_same_impl -{ - enum { value = detail::is_same_part_1::template part_2::value }; -}; - -#else // generic "no-partial-specialization" version - -template -::boost::type_traits::yes_type -BOOST_TT_DECL is_same_tester(T*, T*); - -::boost::type_traits::no_type -BOOST_TT_DECL is_same_tester(...); - -template -struct is_same_impl -{ - static T t; - static U u; - - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - (sizeof(type_traits::yes_type) == sizeof(detail::is_same_tester(&t,&u))), - (::boost::is_reference::value == ::boost::is_reference::value), - (sizeof(T) == sizeof(U)) - >::value)); -}; - -#endif // BOOST_MSVC - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_same,T,U,(::boost::detail::is_same_impl::value)) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_SAME_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/is_scalar.hpp b/src/vendor/stp/src/boost/type_traits/is_scalar.hpp deleted file mode 100644 index 4af3def14..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_scalar.hpp +++ /dev/null @@ -1,55 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_SCALAR_HPP_INCLUDED -#define BOOST_TT_IS_SCALAR_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct is_scalar_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_or< - ::boost::is_arithmetic::value, - ::boost::is_enum::value, - ::boost::is_pointer::value, - ::boost::is_member_pointer::value - >::value)); -}; - -// these specializations are only really needed for compilers -// without partial specialization support: -template <> struct is_scalar_impl{ BOOST_STATIC_CONSTANT(bool, value = false ); }; -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -template <> struct is_scalar_impl{ BOOST_STATIC_CONSTANT(bool, value = false ); }; -template <> struct is_scalar_impl{ BOOST_STATIC_CONSTANT(bool, value = false ); }; -template <> struct is_scalar_impl{ BOOST_STATIC_CONSTANT(bool, value = false ); }; -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_scalar,T,::boost::detail::is_scalar_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_SCALAR_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_signed.hpp b/src/vendor/stp/src/boost/type_traits/is_signed.hpp deleted file mode 100644 index bf7bbfdb7..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_signed.hpp +++ /dev/null @@ -1,135 +0,0 @@ - -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_IS_SIGNED_HPP_INCLUDED -#define BOOST_TT_IS_SIGNED_HPP_INCLUDED - -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -#if !defined( __CODEGEARC__ ) - -namespace detail{ - -#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) - -template -struct is_signed_values -{ - typedef typename remove_cv::type no_cv_t; - BOOST_STATIC_CONSTANT(no_cv_t, minus_one = (static_cast(-1))); - BOOST_STATIC_CONSTANT(no_cv_t, zero = (static_cast(0))); -}; - -template -struct is_signed_helper -{ - typedef typename remove_cv::type no_cv_t; - BOOST_STATIC_CONSTANT(bool, value = (!(::boost::detail::is_signed_values::minus_one > boost::detail::is_signed_values::zero))); -}; - -template -struct is_signed_select_helper -{ - template - struct rebind - { - typedef is_signed_helper type; - }; -}; - -template <> -struct is_signed_select_helper -{ - template - struct rebind - { - typedef false_type type; - }; -}; - -template -struct is_signed_imp -{ - typedef is_signed_select_helper< - ::boost::type_traits::ice_or< - ::boost::is_integral::value, - ::boost::is_enum::value>::value - > selector; - typedef typename selector::template rebind binder; - typedef typename binder::type type; -#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) - BOOST_STATIC_CONSTANT(bool, value = is_signed_imp::type::value); -#else - BOOST_STATIC_CONSTANT(bool, value = type::value); -#endif -}; - -#else - -template struct is_signed_imp : public false_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -#ifdef BOOST_HAS_LONG_LONG -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -#endif -#if defined(CHAR_MIN) && (CHAR_MIN != 0) -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -#endif -#if defined(WCHAR_MIN) && (WCHAR_MIN != 0) -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -template <> struct is_signed_imp : public true_type{}; -#endif - -#endif - -} - -#endif // !defined( __CODEGEARC__ ) - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_signed,T,__is_signed(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_signed,T,::boost::detail::is_signed_imp::value) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_stateless.hpp b/src/vendor/stp/src/boost/type_traits/is_stateless.hpp deleted file mode 100644 index d8d40635f..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_stateless.hpp +++ /dev/null @@ -1,48 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_STATELESS_HPP_INCLUDED -#define BOOST_TT_IS_STATELESS_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct is_stateless_impl -{ - BOOST_STATIC_CONSTANT(bool, value = - (::boost::type_traits::ice_and< - ::boost::has_trivial_constructor::value, - ::boost::has_trivial_copy::value, - ::boost::has_trivial_destructor::value, - ::boost::is_class::value, - ::boost::is_empty::value - >::value)); -}; - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_stateless,T,::boost::detail::is_stateless_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_STATELESS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_union.hpp b/src/vendor/stp/src/boost/type_traits/is_union.hpp deleted file mode 100644 index 25bddccfe..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_union.hpp +++ /dev/null @@ -1,49 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_IS_UNION_HPP_INCLUDED -#define BOOST_TT_IS_UNION_HPP_INCLUDED - -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { -#ifndef __GNUC__ -template struct is_union_impl -{ - typedef typename remove_cv::type cvt; - BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_UNION(cvt)); -}; -#else -// -// using remove_cv here generates a whole load of needless -// warnings with gcc, since it doesn't do any good with gcc -// in any case (at least at present), just remove it: -// -template struct is_union_impl -{ - BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_UNION(T)); -}; -#endif -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_union,T,::boost::detail::is_union_impl::value) - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_UNION_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_unsigned.hpp b/src/vendor/stp/src/boost/type_traits/is_unsigned.hpp deleted file mode 100644 index 98baf4e94..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_unsigned.hpp +++ /dev/null @@ -1,130 +0,0 @@ - -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_IS_UNSIGNED_HPP_INCLUDED -#define BOOST_TT_IS_UNSIGNED_HPP_INCLUDED - -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -#if !defined( __CODEGEARC__ ) - -namespace detail{ - -#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) - -template -struct is_unsigned_values -{ - typedef typename remove_cv::type no_cv_t; - BOOST_STATIC_CONSTANT(no_cv_t, minus_one = (static_cast(-1))); - BOOST_STATIC_CONSTANT(no_cv_t, zero = (static_cast(0))); -}; - -template -struct is_ununsigned_helper -{ - BOOST_STATIC_CONSTANT(bool, value = (::boost::detail::is_unsigned_values::minus_one > ::boost::detail::is_unsigned_values::zero)); -}; - -template -struct is_ununsigned_select_helper -{ - template - struct rebind - { - typedef is_ununsigned_helper type; - }; -}; - -template <> -struct is_ununsigned_select_helper -{ - template - struct rebind - { - typedef false_type type; - }; -}; - -template -struct is_unsigned_imp -{ - typedef is_ununsigned_select_helper< - ::boost::type_traits::ice_or< - ::boost::is_integral::value, - ::boost::is_enum::value>::value - > selector; - typedef typename selector::template rebind binder; - typedef typename binder::type type; - BOOST_STATIC_CONSTANT(bool, value = type::value); -}; - -#else - -template struct is_unsigned_imp : public false_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -#ifdef BOOST_HAS_LONG_LONG -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -#endif -#if defined(CHAR_MIN) && (CHAR_MIN == 0) -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -#endif -#if defined(WCHAR_MIN) && (WCHAR_MIN == 0) -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -template <> struct is_unsigned_imp : public true_type{}; -#endif - -#endif - -} - -#endif // !defined( __CODEGEARC__ ) - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_unsigned,T,__is_unsigned(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_unsigned,T,::boost::detail::is_unsigned_imp::value) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_virtual_base_of.hpp b/src/vendor/stp/src/boost/type_traits/is_virtual_base_of.hpp deleted file mode 100644 index 30b34f6cc..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_virtual_base_of.hpp +++ /dev/null @@ -1,104 +0,0 @@ -// (C) Copyright Daniel Frey and Robert Ramey 2009. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED -#define BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED - -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { -namespace detail { - - -#ifdef BOOST_MSVC -#pragma warning( push ) -#pragma warning( disable : 4584 ) -#elif defined __GNUC__ -#pragma GCC system_header -#endif - -template -struct is_virtual_base_of_impl -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template -struct is_virtual_base_of_impl -{ -#ifdef __BORLANDC__ - struct X : public virtual Derived, public virtual Base - { - X(); - X(const X&); - X& operator=(const X&); - ~X()throw(); - }; - struct Y : public virtual Derived - { - Y(); - Y(const Y&); - Y& operator=(const Y&); - ~Y()throw(); - }; -#else - struct X : Derived, virtual Base - { - X(); - X(const X&); - X& operator=(const X&); - ~X()throw(); - }; - struct Y : Derived - { - Y(); - Y(const Y&); - Y& operator=(const Y&); - ~Y()throw(); - }; -#endif - BOOST_STATIC_CONSTANT(bool, value = (sizeof(X)==sizeof(Y))); -}; - -template -struct is_virtual_base_of_impl2 -{ - typedef typename mpl::and_, mpl::not_ > >::type tag_type; - typedef is_virtual_base_of_impl imp; - BOOST_STATIC_CONSTANT(bool, value = imp::value); -}; - -#ifdef BOOST_MSVC -#pragma warning( pop ) -#endif - -} // namespace detail - -BOOST_TT_AUX_BOOL_TRAIT_DEF2( - is_virtual_base_of - , Base - , Derived - , (::boost::detail::is_virtual_base_of_impl2::value) -) - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base,Derived&,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived&,false) -#endif - -} // namespace boost - -#include - -#endif diff --git a/src/vendor/stp/src/boost/type_traits/is_void.hpp b/src/vendor/stp/src/boost/type_traits/is_void.hpp deleted file mode 100644 index 6f6fbff6d..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_void.hpp +++ /dev/null @@ -1,38 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_IS_VOID_HPP_INCLUDED -#define BOOST_TT_IS_VOID_HPP_INCLUDED - -#include - -// should be the last #include -#include - -namespace boost { - -//* is a type T void - is_void -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_void,T,__is_void(T)) -#else -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_void,T,false) -BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void,true) - -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void const,true) -BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void volatile,true) -BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void const volatile,true) -#endif - -#endif // non-CodeGear implementation - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_VOID_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/is_volatile.hpp b/src/vendor/stp/src/boost/type_traits/is_volatile.hpp deleted file mode 100644 index 7ab253a69..000000000 --- a/src/vendor/stp/src/boost/type_traits/is_volatile.hpp +++ /dev/null @@ -1,133 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Howard Hinnant and John Maddock 2000. -// (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001 - -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -// Fixed is_pointer, is_reference, is_const, is_volatile, is_same, -// is_member_pointer based on the Simulated Partial Specialization work -// of Mat Marcus and Jesse Jones. See http://opensource.adobe.com or -// http://groups.yahoo.com/group/boost/message/5441 -// Some workarounds in here use ideas suggested from "Generic: -// Mappings between Types and Values" -// by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html). - - -#ifndef BOOST_TT_IS_VOLATILE_HPP_INCLUDED -#define BOOST_TT_IS_VOLATILE_HPP_INCLUDED - -#include -#include - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include -# if BOOST_WORKAROUND(BOOST_MSVC, < 1400) -# include -# endif -#else -# include -# include -# include -# include -#endif - -// should be the last #include -#include - -namespace boost { - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,__is_volatile(T)) -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -//* is a type T declared volatile - is_volatile -#if BOOST_WORKAROUND(BOOST_MSVC, < 1400) - BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,::boost::detail::cv_traits_imp::type*>::is_volatile) -#else - BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,::boost::detail::cv_traits_imp::is_volatile) -#endif -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T&,false) - -#if defined(BOOST_ILLEGAL_CV_REFERENCES) -// these are illegal specialisations; cv-qualifies applied to -// references have no effect according to [8.3.2p1], -// C++ Builder requires them though as it treats cv-qualified -// references as distinct types... -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& const,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& volatile,false) -BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& const volatile,false) -#endif - -#else - -namespace detail { - -using ::boost::type_traits::yes_type; -using ::boost::type_traits::no_type; - -yes_type is_volatile_tester(void const volatile*); -no_type is_volatile_tester(void const*); - -template -struct is_volatile_helper - : ::boost::type_traits::false_result -{ -}; - -template <> -struct is_volatile_helper -{ - template struct result_ - { - static T* t; - BOOST_STATIC_CONSTANT(bool, value = ( - sizeof(detail::yes_type) == sizeof(detail::is_volatile_tester(t)) - )); - }; -}; - -template <> -struct is_volatile_helper -{ - template struct result_ - { - static T t; - BOOST_STATIC_CONSTANT(bool, value = ( - sizeof(detail::yes_type) == sizeof(detail::is_volatile_tester(&t)) - )); - }; -}; - -template -struct is_volatile_impl - : is_volatile_helper< - is_reference::value - , is_array::value - >::template result_ -{ -}; - -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_volatile,void,false) -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_volatile,void const,false) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_volatile,void volatile,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_volatile,void const volatile,true) -#endif - -} // namespace detail - -//* is a type T declared volatile - is_volatile -BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,::boost::detail::is_volatile_impl::value) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_VOLATILE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/make_signed.hpp b/src/vendor/stp/src/boost/type_traits/make_signed.hpp deleted file mode 100644 index 51cfd95ca..000000000 --- a/src/vendor/stp/src/boost/type_traits/make_signed.hpp +++ /dev/null @@ -1,137 +0,0 @@ - -// (C) Copyright John Maddock 2007. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_MAKE_SIGNED_HPP_INCLUDED -#define BOOST_TT_MAKE_SIGNED_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct make_signed_imp -{ - BOOST_STATIC_ASSERT( - (::boost::type_traits::ice_or< ::boost::is_integral::value, ::boost::is_enum::value>::value)); -#if !BOOST_WORKAROUND(BOOST_MSVC, <=1300) - BOOST_STATIC_ASSERT( - (::boost::type_traits::ice_not< ::boost::is_same< - typename remove_cv::type, bool>::value>::value)); -#endif - - typedef typename remove_cv::type t_no_cv; - typedef typename mpl::if_c< - (::boost::type_traits::ice_and< - ::boost::is_signed::value, - ::boost::is_integral::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value >::value), - T, - typename mpl::if_c< - (::boost::type_traits::ice_and< - ::boost::is_integral::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value> - ::value), - typename mpl::if_< - is_same, - signed char, - typename mpl::if_< - is_same, - signed short, - typename mpl::if_< - is_same, - int, - typename mpl::if_< - is_same, - long, -#if defined(BOOST_HAS_LONG_LONG) - boost::long_long_type -#elif defined(BOOST_HAS_MS_INT64) - __int64 -#else - long -#endif - >::type - >::type - >::type - >::type, - // Not a regular integer type: - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned char), - signed char, - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned short), - signed short, - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned int), - int, - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned long), - long, -#if defined(BOOST_HAS_LONG_LONG) - boost::long_long_type -#elif defined(BOOST_HAS_MS_INT64) - __int64 -#else - long -#endif - >::type - >::type - >::type - >::type - >::type - >::type base_integer_type; - - // Add back any const qualifier: - typedef typename mpl::if_< - is_const, - typename add_const::type, - base_integer_type - >::type const_base_integer_type; - - // Add back any volatile qualifier: - typedef typename mpl::if_< - is_volatile, - typename add_volatile::type, - const_base_integer_type - >::type type; -}; - - -} // namespace detail - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_signed,T,typename boost::detail::make_signed_imp::type) - -} // namespace boost - -#include - -#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/make_unsigned.hpp b/src/vendor/stp/src/boost/type_traits/make_unsigned.hpp deleted file mode 100644 index 54f9f665b..000000000 --- a/src/vendor/stp/src/boost/type_traits/make_unsigned.hpp +++ /dev/null @@ -1,137 +0,0 @@ - -// (C) Copyright John Maddock 2007. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED -#define BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct make_unsigned_imp -{ - BOOST_STATIC_ASSERT( - (::boost::type_traits::ice_or< ::boost::is_integral::value, ::boost::is_enum::value>::value)); -#if !BOOST_WORKAROUND(BOOST_MSVC, <=1300) - BOOST_STATIC_ASSERT( - (::boost::type_traits::ice_not< ::boost::is_same< - typename remove_cv::type, bool>::value>::value)); -#endif - - typedef typename remove_cv::type t_no_cv; - typedef typename mpl::if_c< - (::boost::type_traits::ice_and< - ::boost::is_unsigned::value, - ::boost::is_integral::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value >::value), - T, - typename mpl::if_c< - (::boost::type_traits::ice_and< - ::boost::is_integral::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value, - ::boost::type_traits::ice_not< ::boost::is_same::value>::value> - ::value), - typename mpl::if_< - is_same, - unsigned char, - typename mpl::if_< - is_same, - unsigned short, - typename mpl::if_< - is_same, - unsigned int, - typename mpl::if_< - is_same, - unsigned long, -#if defined(BOOST_HAS_LONG_LONG) - boost::ulong_long_type -#elif defined(BOOST_HAS_MS_INT64) - unsigned __int64 -#else - unsigned long -#endif - >::type - >::type - >::type - >::type, - // Not a regular integer type: - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned char), - unsigned char, - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned short), - unsigned short, - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned int), - unsigned int, - typename mpl::if_c< - sizeof(t_no_cv) == sizeof(unsigned long), - unsigned long, -#if defined(BOOST_HAS_LONG_LONG) - boost::ulong_long_type -#elif defined(BOOST_HAS_MS_INT64) - unsigned __int64 -#else - unsigned long -#endif - >::type - >::type - >::type - >::type - >::type - >::type base_integer_type; - - // Add back any const qualifier: - typedef typename mpl::if_< - is_const, - typename add_const::type, - base_integer_type - >::type const_base_integer_type; - - // Add back any volatile qualifier: - typedef typename mpl::if_< - is_volatile, - typename add_volatile::type, - const_base_integer_type - >::type type; -}; - - -} // namespace detail - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_unsigned,T,typename boost::detail::make_unsigned_imp::type) - -} // namespace boost - -#include - -#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_all_extents.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_all_extents.hpp deleted file mode 100644 index 351713223..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_all_extents.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_ALL_EXTENT_HOLT_2004_0827 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_ALL_EXTENT_HOLT_2004_0827 - -#include -#include - -namespace boost { - template - struct remove_all_extents; - - namespace detail { - template - struct remove_all_extents_impl_typeof { - template - struct inner { - typedef T type; - }; - }; - template<> - struct remove_all_extents_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U[]); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); - typedef typename msvc_extract_type::id2type::type reduced_type; - typedef typename remove_all_extents::type type; - }; - }; - } //namespace detail - - template - struct remove_all_extents { - typedef typename detail::remove_all_extents_impl_typeof< - boost::is_array::value - >::template inner >::type type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_all_extents,T) - }; -} //namespace boost - -#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 - diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_bounds.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_bounds.hpp deleted file mode 100644 index 12a9b0533..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_bounds.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 - -#include -#include - -namespace boost { - namespace detail { - template - struct remove_bounds_impl_typeof { - template - struct inner { - typedef T type; - }; - }; - template<> - struct remove_bounds_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U[]); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - }; - } //namespace detail - - template - struct remove_bounds { - typedef typename detail::remove_bounds_impl_typeof< - boost::is_array::value - >::template inner >::type type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_bounds,T) - }; -} //namespace boost - -#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 - diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_const.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_const.hpp deleted file mode 100644 index 5395e8002..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_const.hpp +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828 - -#include -#include -#include -#include -#include - -namespace boost { - namespace detail { - template - struct remove_const_impl_typeof { - template - struct inner { - typedef T type; - }; - template - struct transform_type { - typedef T type; - }; - }; - template<> //Const - struct remove_const_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U const&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T& type; - }; - }; - template<> //CV - struct remove_const_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U const volatile&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T& type; - }; - }; - template<> //Const Pointer - struct remove_const_impl_typeof { - template - struct inner { - template - static msvc_register_type test(void(*)(U const[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type[]; - }; - }; - template<> //CV Pointer - struct remove_const_impl_typeof { - template - struct inner { - template - static msvc_register_type test(void(*)(U const volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type[]; - }; - }; - template<> //Const Array - struct remove_const_impl_typeof { - template - struct inner { - BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); - - template - static msvc_register_type test(void(*)(U const[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type; - }; - }; - - template<> //CV Array - struct remove_const_impl_typeof { - template - struct inner { - BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); - - template - static msvc_register_type test(void(*)(U const volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type; - }; - }; - - } //namespace detail - - template - struct remove_const { - typedef detail::remove_const_impl_typeof< - boost::is_pointer::value, - boost::is_array::value, - boost::is_const::value, - boost::is_volatile::value - > remove_const_type; - typedef typename - remove_const_type::template inner< - typename remove_const_type::template transform_type::type, - remove_const - >::type - type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_const,T) - }; -}//namespace boost - -#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828 diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_cv.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_cv.hpp deleted file mode 100644 index c7b0379c4..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_cv.hpp +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901 - -#include -#include -#include -#include -#include - -namespace boost { - namespace detail { - template - struct remove_cv_impl_typeof { - template - struct inner { - typedef T type; - }; - template - struct transform_type { - typedef T type; - }; - }; - template<> //Volatile - struct remove_cv_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U volatile&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T& type; - }; - }; - template<> //Const - struct remove_cv_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U const&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T& type; - }; - }; - template<> //CV - struct remove_cv_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U const volatile&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T& type; - }; - }; - template<> //Volatile Pointer - struct remove_cv_impl_typeof { - template - struct inner { - template - static msvc_register_type test(void(*)(U volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type[]; - }; - }; - template<> //Const Pointer - struct remove_cv_impl_typeof { - template - struct inner { - template - static msvc_register_type test(void(*)(U const[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type[]; - }; - }; - template<> //CV Pointer - struct remove_cv_impl_typeof { - template - struct inner { - template - static msvc_register_type test(void(*)(U const volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type[]; - }; - }; - template<> //Volatile Array - struct remove_cv_impl_typeof { - template - struct inner { - BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); - - template - static msvc_register_type test(void(*)(U volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type; - }; - }; - template<> //Const Array - struct remove_cv_impl_typeof { - template - struct inner { - BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); - - template - static msvc_register_type test(void(*)(U const[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type; - }; - }; - - template<> //CV Array - struct remove_cv_impl_typeof { - template - struct inner { - BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); - - template - static msvc_register_type test(void(*)(U const volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type; - }; - }; - - } //namespace detail - - template - struct remove_cv { - typedef detail::remove_cv_impl_typeof< - boost::is_pointer::value, - boost::is_array::value, - boost::is_const::value, - boost::is_volatile::value - > remove_cv_type; - typedef typename - remove_cv_type::template inner< - typename remove_cv_type::template transform_type::type, - remove_cv - >::type - type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_cv,T) - }; -}//namespace boost - -#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901 diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_extent.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_extent.hpp deleted file mode 100644 index f87ec416d..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_extent.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827 - -#include -#include - -namespace boost { - namespace detail { - template - struct remove_extent_impl_typeof { - template - struct inner { - typedef T type; - }; - }; - template<> - struct remove_extent_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U[]); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - }; - } //namespace detail - - template - struct remove_extent { - typedef typename detail::remove_extent_impl_typeof< - boost::is_array::value - >::template inner >::type type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_extent,T) - }; -} //namespace boost - -#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 - diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_pointer.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_pointer.hpp deleted file mode 100644 index 8b9b0d4e1..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_pointer.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_POINTER_HOLT_2004_0827 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_POINTER_HOLT_2004_0827 - -#include -#include - -namespace boost { - namespace detail { - template - struct remove_pointer_impl_typeof { - template - struct inner { - typedef T type; - }; - }; - template<> - struct remove_pointer_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U*); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - }; - } //namespace detail - - template - struct remove_pointer { - typedef typename detail::remove_pointer_impl_typeof< - boost::is_pointer::value - >::template inner >::type type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_pointer,T) - }; -} //namespace boost - -#endif //BOOST_TYPE_TRAITS_REMOVE_POINTER_HOLT_2004_0827 diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_reference.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_reference.hpp deleted file mode 100644 index 367d352ed..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_reference.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 - -#include -#include - -namespace boost { - namespace detail { - template - struct remove_reference_impl_typeof { - template - struct inner { - typedef T type; - }; - }; - template<> - struct remove_reference_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - }; - } //namespace detail - - template - struct remove_reference { - typedef typename detail::remove_reference_impl_typeof< - boost::is_reference::value - >::template inner >::type type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_reference,T) - }; -} //namespace boost - -#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 diff --git a/src/vendor/stp/src/boost/type_traits/msvc/remove_volatile.hpp b/src/vendor/stp/src/boost/type_traits/msvc/remove_volatile.hpp deleted file mode 100644 index 3759f2a37..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/remove_volatile.hpp +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828 -#define BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828 - -#include -#include -#include -#include -#include - -namespace boost { - namespace detail { - template - struct remove_volatile_impl_typeof { - template - struct inner { - typedef T type; - }; - template - struct transform_type { - typedef T type; - }; - }; - template<> //Volatile - struct remove_volatile_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U volatile&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T& type; - }; - }; - template<> //CV - struct remove_volatile_impl_typeof { - template - struct inner { - template - static msvc_register_type test(U const volatile&(*)()); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T& type; - }; - }; - template<> //Volatile Pointer - struct remove_volatile_impl_typeof { - template - struct inner { - template - static msvc_register_type test(void(*)(U volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type[]; - }; - }; - template<> //CV Pointer - struct remove_volatile_impl_typeof { - template - struct inner { - template - static msvc_register_type test(void(*)(U const volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type[]; - }; - }; - template<> //Volatile Array - struct remove_volatile_impl_typeof { - template - struct inner { - BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); - - template - static msvc_register_type test(void(*)(U volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type; - }; - }; - - template<> //CV Array - struct remove_volatile_impl_typeof { - template - struct inner { - BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); - - template - static msvc_register_type test(void(*)(U const volatile[])); - static msvc_register_type test(...); - BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); - typedef typename msvc_extract_type::id2type::type type; - }; - template - struct transform_type { - typedef T type; - }; - }; - - } //namespace detail - - template - struct remove_volatile { - typedef detail::remove_volatile_impl_typeof< - boost::is_pointer::value, - boost::is_array::value, - boost::is_const::value, - boost::is_volatile::value - > remove_volatile_type; - typedef typename - remove_volatile_type::template inner< - typename remove_volatile_type::template transform_type::type, - remove_volatile - >::type - type; - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_volatile,T) - }; -}//namespace boost - -#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828 diff --git a/src/vendor/stp/src/boost/type_traits/msvc/typeof.hpp b/src/vendor/stp/src/boost/type_traits/msvc/typeof.hpp deleted file mode 100644 index ebb0e803f..000000000 --- a/src/vendor/stp/src/boost/type_traits/msvc/typeof.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2004 Peder Holt -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) - -#ifndef BOOST_TYPETRAITS_MSVC_TYPEOF_HPP -#define BOOST_TYPETRAITS_MSVC_TYPEOF_HPP - -#include -#include - -namespace boost { namespace detail { -# if BOOST_WORKAROUND(BOOST_MSVC,==1300) - template - struct msvc_extract_type - { - template - struct id2type_impl; - - typedef id2type_impl id2type; - }; - - template - struct msvc_register_type : msvc_extract_type - { - template<> - struct id2type_impl //VC7.0 specific bugfeature - { - typedef T type; - }; - }; -# else - template - struct msvc_extract_type - { - struct id2type; - }; - - template - struct msvc_register_type : msvc_extract_type - { - typedef msvc_extract_type base_type; - struct base_type::id2type // This uses nice VC6.5 and VC7.1 bugfeature - { - typedef T type; - }; - }; -# endif -}} - -#endif //BOOST_TYPETRAITS_MSVC_TYPEOF_IMPL_HPP diff --git a/src/vendor/stp/src/boost/type_traits/object_traits.hpp b/src/vendor/stp/src/boost/type_traits/object_traits.hpp deleted file mode 100644 index c812a62e2..000000000 --- a/src/vendor/stp/src/boost/type_traits/object_traits.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// defines object traits classes: -// is_object, is_scalar, is_class, is_compound, is_pod, -// has_trivial_constructor, has_trivial_copy, has_trivial_assign, -// has_trivial_destructor, is_empty. -// - -#ifndef BOOST_TT_OBJECT_TRAITS_HPP_INLCUDED -#define BOOST_TT_OBJECT_TRAITS_HPP_INLCUDED - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif // BOOST_TT_OBJECT_TRAITS_HPP_INLCUDED diff --git a/src/vendor/stp/src/boost/type_traits/promote.hpp b/src/vendor/stp/src/boost/type_traits/promote.hpp deleted file mode 100644 index 14efad47e..000000000 --- a/src/vendor/stp/src/boost/type_traits/promote.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2005 Alexander Nasonov. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#ifndef FILE_boost_type_traits_promote_hpp_INCLUDED -#define FILE_boost_type_traits_promote_hpp_INCLUDED - -#include -#include -#include - -// Should be the last #include -#include - -namespace boost { - -namespace detail { - -template -struct promote_impl - : integral_promotion< - BOOST_DEDUCED_TYPENAME floating_point_promotion::type - > -{ -}; - -} - -BOOST_TT_AUX_TYPE_TRAIT_DEF1( - promote - , T - , BOOST_DEDUCED_TYPENAME boost::detail::promote_impl::type - ) -} - -#include - -#endif // #ifndef FILE_boost_type_traits_promote_hpp_INCLUDED - diff --git a/src/vendor/stp/src/boost/type_traits/rank.hpp b/src/vendor/stp/src/boost/type_traits/rank.hpp deleted file mode 100644 index 77df41e84..000000000 --- a/src/vendor/stp/src/boost/type_traits/rank.hpp +++ /dev/null @@ -1,89 +0,0 @@ - -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_RANK_HPP_INCLUDED -#define BOOST_TT_RANK_HPP_INCLUDED - -// should be the last #include -#include - -namespace boost { - -#if !defined( __CODEGEARC__ ) - -namespace detail{ - -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = N); -}; -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; - -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; - -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; - -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; - -#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; -template -struct rank_imp -{ - BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp::value)); -}; -#endif -#endif -} - -#endif // !defined( __CODEGEARC__ ) - -#if defined( __CODEGEARC__ ) -BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(rank,T,__array_rank(T)) -#else -BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(rank,T,(::boost::detail::rank_imp::value)) -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/reference_traits.hpp b/src/vendor/stp/src/boost/type_traits/reference_traits.hpp deleted file mode 100644 index 1607b3d0d..000000000 --- a/src/vendor/stp/src/boost/type_traits/reference_traits.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// (C) Copyright David Abrahams Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000-2002. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_REFERENCE_TRAITS_HPP_INCLUDED -#define BOOST_TT_REFERENCE_TRAITS_HPP_INCLUDED - -#include - -#endif // BOOST_TT_REFERENCE_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_all_extents.hpp b/src/vendor/stp/src/boost/type_traits/remove_all_extents.hpp deleted file mode 100644 index 64876e19a..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_all_extents.hpp +++ /dev/null @@ -1,48 +0,0 @@ - -// (C) Copyright John Maddock 2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_REMOVE_ALL_EXTENTS_HPP_INCLUDED -#define BOOST_TT_REMOVE_ALL_EXTENTS_HPP_INCLUDED - -#include -#include -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -#if !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -namespace boost { - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_all_extents,T,T) - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T[N],typename boost::remove_all_extents::type type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T const[N],typename boost::remove_all_extents::type type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T volatile[N],typename boost::remove_all_extents::type type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T const volatile[N],typename boost::remove_all_extents::type type) -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T[],typename boost::remove_all_extents::type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T const[],typename boost::remove_all_extents::type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T volatile[],typename boost::remove_all_extents::type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T const volatile[],typename boost::remove_all_extents::type) -#endif -#endif - -} // namespace boost - -#endif - -#include - -#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_bounds.hpp b/src/vendor/stp/src/boost/type_traits/remove_bounds.hpp deleted file mode 100644 index ce1297873..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_bounds.hpp +++ /dev/null @@ -1,48 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED -#define BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED - -#include -#include -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -#if !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -namespace boost { - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_bounds,T,T) - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T[N],T type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T const[N],T const type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T volatile[N],T volatile type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T const volatile[N],T const volatile type) -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T[],T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T const[],T const) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T volatile[],T volatile) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T const volatile[],T const volatile) -#endif -#endif - -} // namespace boost - -#endif - -#include - -#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_const.hpp b/src/vendor/stp/src/boost/type_traits/remove_const.hpp deleted file mode 100644 index 7e18d88b1..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_const.hpp +++ /dev/null @@ -1,78 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_REMOVE_CONST_HPP_INCLUDED -#define BOOST_TT_REMOVE_CONST_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -namespace boost { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -namespace detail { - -template -struct remove_const_helper -{ - typedef T type; -}; - -template -struct remove_const_helper -{ - typedef T volatile type; -}; - - -template -struct remove_const_impl -{ - typedef typename remove_const_helper< - typename cv_traits_imp::unqualified_type - , ::boost::is_volatile::value - >::type type; -}; - -} // namespace detail - -// * convert a type T to non-const type - remove_const - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_const,T,typename boost::detail::remove_const_impl::type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_const,T&,T&) -#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const[N],T type[N]) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const volatile[N],T volatile type[N]) -#endif - -#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_const,T,typename boost::detail::remove_const_impl::type) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_REMOVE_CONST_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_cv.hpp b/src/vendor/stp/src/boost/type_traits/remove_cv.hpp deleted file mode 100644 index 09f8ff103..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_cv.hpp +++ /dev/null @@ -1,61 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_REMOVE_CV_HPP_INCLUDED -#define BOOST_TT_REMOVE_CV_HPP_INCLUDED - -#include -#include -#include -#include - -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -namespace boost { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -// convert a type T to a non-cv-qualified type - remove_cv -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_cv,T,typename boost::detail::cv_traits_imp::unqualified_type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_cv,T&,T&) -#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const[N],T type[N]) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T volatile[N],T type[N]) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const volatile[N],T type[N]) -#endif - -#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -namespace detail { -template -struct remove_cv_impl -{ - typedef typename remove_volatile_impl< - typename remove_const_impl::type - >::type type; -}; -} - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_cv,T,typename boost::detail::remove_cv_impl::type) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_REMOVE_CV_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_extent.hpp b/src/vendor/stp/src/boost/type_traits/remove_extent.hpp deleted file mode 100644 index b4c7d4136..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_extent.hpp +++ /dev/null @@ -1,48 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000-2005. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_REMOVE_EXTENT_HPP_INCLUDED -#define BOOST_TT_REMOVE_EXTENT_HPP_INCLUDED - -#include -#include -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -#if !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -namespace boost { - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_extent,T,T) - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T[N],T type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T const[N],T const type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T volatile[N],T volatile type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T const volatile[N],T const volatile type) -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T[],T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T const[],T const) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T volatile[],T volatile) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T const volatile[],T const volatile) -#endif -#endif - -} // namespace boost - -#endif - -#include - -#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_pointer.hpp b/src/vendor/stp/src/boost/type_traits/remove_pointer.hpp deleted file mode 100644 index 53599928c..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_pointer.hpp +++ /dev/null @@ -1,43 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_REMOVE_POINTER_HPP_INCLUDED -#define BOOST_TT_REMOVE_POINTER_HPP_INCLUDED - -#include -#include -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -namespace boost { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T*,T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const,T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* volatile,T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const volatile,T) - -#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,typename boost::detail::remove_pointer_impl::type) - -#endif - -} // namespace boost - -#include - -#endif // BOOST_TT_REMOVE_POINTER_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_reference.hpp b/src/vendor/stp/src/boost/type_traits/remove_reference.hpp deleted file mode 100644 index 8fddc4672..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_reference.hpp +++ /dev/null @@ -1,50 +0,0 @@ - -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED -#define BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED - -#include -#include -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -namespace boost { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_reference,T,T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T&,T) - -#if defined(BOOST_ILLEGAL_CV_REFERENCES) -// these are illegal specialisations; cv-qualifies applied to -// references have no effect according to [8.3.2p1], -// C++ Builder requires them though as it treats cv-qualified -// references as distinct types... -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& const,T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& volatile,T) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& const volatile,T) -#endif - -#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_reference,T,typename boost::detail::remove_reference_impl::type) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/remove_volatile.hpp b/src/vendor/stp/src/boost/type_traits/remove_volatile.hpp deleted file mode 100644 index 723ebe35a..000000000 --- a/src/vendor/stp/src/boost/type_traits/remove_volatile.hpp +++ /dev/null @@ -1,77 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard -// Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - - -#ifndef BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED -#define BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#include - -#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) -#include -#endif - -// should be the last #include -#include - -namespace boost { - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -namespace detail { - -template -struct remove_volatile_helper -{ - typedef T type; -}; - -template -struct remove_volatile_helper -{ - typedef T const type; -}; - -template -struct remove_volatile_impl -{ - typedef typename remove_volatile_helper< - typename cv_traits_imp::unqualified_type - , ::boost::is_const::value - >::type type; -}; - -} // namespace detail - -// * convert a type T to a non-volatile type - remove_volatile - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_volatile,T,typename boost::detail::remove_volatile_impl::type) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_volatile,T&,T&) -#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile,T volatile[N],T type[N]) -BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile,T const volatile[N],T const type[N]) -#endif - -#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) - -BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_volatile,T,typename boost::detail::remove_volatile_impl::type) - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -} // namespace boost - -#include - -#endif // BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/same_traits.hpp b/src/vendor/stp/src/boost/type_traits/same_traits.hpp deleted file mode 100644 index dab7dac78..000000000 --- a/src/vendor/stp/src/boost/type_traits/same_traits.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// defines is_same: - -#ifndef BOOST_TT_SAME_TRAITS_HPP_INCLUDED -#define BOOST_TT_SAME_TRAITS_HPP_INCLUDED - -#include - -#endif // BOOST_TT_SAME_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/transform_traits.hpp b/src/vendor/stp/src/boost/type_traits/transform_traits.hpp deleted file mode 100644 index 7a82f1ca9..000000000 --- a/src/vendor/stp/src/boost/type_traits/transform_traits.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// defines traits classes for transforming one type to another: -// remove_reference, add_reference, remove_bounds, remove_pointer. -// - -#ifndef BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED -#define BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#endif // BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/transform_traits_spec.hpp b/src/vendor/stp/src/boost/type_traits/transform_traits_spec.hpp deleted file mode 100644 index 851af3d39..000000000 --- a/src/vendor/stp/src/boost/type_traits/transform_traits_spec.hpp +++ /dev/null @@ -1,14 +0,0 @@ - -// Copyright 2001 Aleksey Gurtovoy. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_TRANSFORM_TRAITS_SPEC_HPP_INCLUDED -#define BOOST_TT_TRANSFORM_TRAITS_SPEC_HPP_INCLUDED - -#include - -#endif // BOOST_TT_TRANSFORM_TRAITS_SPEC_HPP_INCLUDED diff --git a/src/vendor/stp/src/boost/type_traits/type_with_alignment.hpp b/src/vendor/stp/src/boost/type_traits/type_with_alignment.hpp deleted file mode 100644 index d790ee1ef..000000000 --- a/src/vendor/stp/src/boost/type_traits/type_with_alignment.hpp +++ /dev/null @@ -1,393 +0,0 @@ -// (C) Copyright John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. - -#ifndef BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED -#define BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// should be the last #include -#include - -#include - -#ifdef BOOST_MSVC -# pragma warning(push) -# pragma warning(disable: 4121) // alignment is sensitive to packing -#endif - -namespace boost { - -#ifndef __BORLANDC__ - -namespace detail { - -class alignment_dummy; -typedef void (*function_ptr)(); -typedef int (alignment_dummy::*member_ptr); -typedef int (alignment_dummy::*member_function_ptr)(); - -#ifdef BOOST_HAS_LONG_LONG -#define BOOST_TT_ALIGNMENT_BASE_TYPES BOOST_PP_TUPLE_TO_LIST( \ - 12, ( \ - char, short, int, long, ::boost::long_long_type, float, double, long double \ - , void*, function_ptr, member_ptr, member_function_ptr)) -#else -#define BOOST_TT_ALIGNMENT_BASE_TYPES BOOST_PP_TUPLE_TO_LIST( \ - 11, ( \ - char, short, int, long, float, double, long double \ - , void*, function_ptr, member_ptr, member_function_ptr)) -#endif - -#define BOOST_TT_HAS_ONE_T(D,Data,T) boost::detail::has_one_T< T > - -#define BOOST_TT_ALIGNMENT_STRUCT_TYPES \ - BOOST_PP_LIST_TRANSFORM(BOOST_TT_HAS_ONE_T, \ - X, \ - BOOST_TT_ALIGNMENT_BASE_TYPES) - -#define BOOST_TT_ALIGNMENT_TYPES \ - BOOST_PP_LIST_APPEND(BOOST_TT_ALIGNMENT_BASE_TYPES, \ - BOOST_TT_ALIGNMENT_STRUCT_TYPES) - -// -// lower_alignment_helper -- -// -// This template gets instantiated a lot, so use partial -// specialization when available to reduce the compiler burden. -// -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -template -struct lower_alignment_helper_impl -{ - template - struct apply - { - typedef char type; - enum { value = true }; - }; -}; - -template <> -struct lower_alignment_helper_impl -{ - template - struct apply - : mpl::if_c<(alignment_of::value == target), TestType, char> - { - enum { value = (alignment_of::value == target) }; - }; -}; - -template -struct lower_alignment_helper - : lower_alignment_helper_impl::template apply -{ -}; -#else -template -struct lower_alignment_helper -{ - typedef char type; - enum { value = true }; -}; - -template -struct lower_alignment_helper -{ - enum { value = (alignment_of::value == target) }; - typedef typename mpl::if_c::type type; -}; -#endif - -#define BOOST_TT_CHOOSE_MIN_ALIGNMENT(R,P,I,T) \ - typename lower_alignment_helper< \ - BOOST_PP_CAT(found,I),target,T \ - >::type BOOST_PP_CAT(t,I); \ - enum { \ - BOOST_PP_CAT(found,BOOST_PP_INC(I)) \ - = lower_alignment_helper::value \ - }; - -#define BOOST_TT_CHOOSE_T(R,P,I,T) T BOOST_PP_CAT(t,I); - -template -struct has_one_T -{ - T data; -}; - -template -union lower_alignment -{ - enum { found0 = false }; - - BOOST_PP_LIST_FOR_EACH_I( - BOOST_TT_CHOOSE_MIN_ALIGNMENT - , ignored - , BOOST_TT_ALIGNMENT_TYPES - ) -}; - -union max_align -{ - BOOST_PP_LIST_FOR_EACH_I( - BOOST_TT_CHOOSE_T - , ignored - , BOOST_TT_ALIGNMENT_TYPES - ) -}; - -#undef BOOST_TT_ALIGNMENT_BASE_TYPES -#undef BOOST_TT_HAS_ONE_T -#undef BOOST_TT_ALIGNMENT_STRUCT_TYPES -#undef BOOST_TT_ALIGNMENT_TYPES -#undef BOOST_TT_CHOOSE_MIN_ALIGNMENT -#undef BOOST_TT_CHOOSE_T - -template -struct is_aligned -{ - BOOST_STATIC_CONSTANT(bool, - value = (TAlign >= Align) & (TAlign % Align == 0) - ); -}; - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::max_align,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::lower_alignment<1> ,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::lower_alignment<2> ,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::lower_alignment<4> ,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::lower_alignment<8> ,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::lower_alignment<10> ,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::lower_alignment<16> ,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::detail::lower_alignment<32> ,true) -#endif - -} // namespace detail - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -template -struct is_pod< ::boost::detail::lower_alignment > -{ - BOOST_STATIC_CONSTANT(std::size_t, value = true); -}; -#endif - -// This alignment method originally due to Brian Parker, implemented by David -// Abrahams, and then ported here by Doug Gregor. -namespace detail{ - -template -class type_with_alignment_imp -{ - typedef ::boost::detail::lower_alignment t1; - typedef typename mpl::if_c< - ::boost::detail::is_aligned< ::boost::alignment_of::value,Align >::value - , t1 - , ::boost::detail::max_align - >::type align_t; - - BOOST_STATIC_CONSTANT(std::size_t, found = alignment_of::value); - - BOOST_STATIC_ASSERT(found >= Align); - BOOST_STATIC_ASSERT(found % Align == 0); - - public: - typedef align_t type; -}; - -} - -template -class type_with_alignment - : public ::boost::detail::type_with_alignment_imp -{ -}; - -#if defined(__GNUC__) -namespace align { -struct __attribute__((__aligned__(2))) a2 {}; -struct __attribute__((__aligned__(4))) a4 {}; -struct __attribute__((__aligned__(8))) a8 {}; -struct __attribute__((__aligned__(16))) a16 {}; -struct __attribute__((__aligned__(32))) a32 {}; -} - -template<> class type_with_alignment<1> { public: typedef char type; }; -template<> class type_with_alignment<2> { public: typedef align::a2 type; }; -template<> class type_with_alignment<4> { public: typedef align::a4 type; }; -template<> class type_with_alignment<8> { public: typedef align::a8 type; }; -template<> class type_with_alignment<16> { public: typedef align::a16 type; }; -template<> class type_with_alignment<32> { public: typedef align::a32 type; }; - -namespace detail { -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a2,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a4,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a8,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a16,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a32,true) -} -#endif -#if (defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))) && _MSC_VER >= 1300 -// -// MSVC supports types which have alignments greater than the normal -// maximum: these are used for example in the types __m64 and __m128 -// to provide types with alignment requirements which match the SSE -// registers. Therefore we extend type_with_alignment<> to support -// such types, however, we have to be careful to use a builtin type -// whenever possible otherwise we break previously working code: -// see http://article.gmane.org/gmane.comp.lib.boost.devel/173011 -// for an example and test case. Thus types like a8 below will -// be used *only* if the existing implementation can't provide a type -// with suitable alignment. This does mean however, that type_with_alignment<> -// may return a type which cannot be passed through a function call -// by value (and neither can any type containing such a type like -// Boost.Optional). However, this only happens when we have no choice -// in the matter because no other "ordinary" type is available. -// -namespace align { -struct __declspec(align(8)) a8 { - char m[8]; - typedef a8 type; -}; -struct __declspec(align(16)) a16 { - char m[16]; - typedef a16 type; -}; -struct __declspec(align(32)) a32 { - char m[32]; - typedef a32 type; -}; -struct __declspec(align(64)) a64 -{ - char m[64]; - typedef a64 type; -}; -struct __declspec(align(128)) a128 { - char m[128]; - typedef a128 type; -}; -} - -template<> class type_with_alignment<8> -{ - typedef mpl::if_c< - ::boost::alignment_of::value < 8, - align::a8, - detail::type_with_alignment_imp<8> >::type t1; -public: - typedef t1::type type; -}; -template<> class type_with_alignment<16> -{ - typedef mpl::if_c< - ::boost::alignment_of::value < 16, - align::a16, - detail::type_with_alignment_imp<16> >::type t1; -public: - typedef t1::type type; -}; -template<> class type_with_alignment<32> -{ - typedef mpl::if_c< - ::boost::alignment_of::value < 32, - align::a32, - detail::type_with_alignment_imp<32> >::type t1; -public: - typedef t1::type type; -}; -template<> class type_with_alignment<64> { - typedef mpl::if_c< - ::boost::alignment_of::value < 64, - align::a64, - detail::type_with_alignment_imp<64> >::type t1; -public: - typedef t1::type type; -}; -template<> class type_with_alignment<128> { - typedef mpl::if_c< - ::boost::alignment_of::value < 128, - align::a128, - detail::type_with_alignment_imp<128> >::type t1; -public: - typedef t1::type type; -}; - -namespace detail { -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a8,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a16,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a32,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a64,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a128,true) -} -#endif - -#else - -// -// Borland specific version, we have this for two reasons: -// 1) The version above doesn't always compile (with the new test cases for example) -// 2) Because of Borlands #pragma option we can create types with alignments that are -// greater that the largest aligned builtin type. - -namespace align{ -#pragma option push -a16 -struct a2{ short s; }; -struct a4{ int s; }; -struct a8{ double s; }; -struct a16{ long double s; }; -#pragma option pop -} - -namespace detail { - -typedef ::boost::align::a16 max_align; - -//#if ! BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610)) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a2,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a4,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a8,true) -BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a16,true) -//#endif -} - -template struct type_with_alignment -{ - // We should never get to here, but if we do use the maximally - // aligned type: - // BOOST_STATIC_ASSERT(0); - typedef align::a16 type; -}; -template <> struct type_with_alignment<1>{ typedef char type; }; -template <> struct type_with_alignment<2>{ typedef align::a2 type; }; -template <> struct type_with_alignment<4>{ typedef align::a4 type; }; -template <> struct type_with_alignment<8>{ typedef align::a8 type; }; -template <> struct type_with_alignment<16>{ typedef align::a16 type; }; - -#endif - -} // namespace boost - -#ifdef BOOST_MSVC -# pragma warning(pop) -#endif - -#include - -#endif // BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED - - diff --git a/src/vendor/stp/src/c_interface/Makefile b/src/vendor/stp/src/c_interface/Makefile deleted file mode 100644 index f8d12f2a8..000000000 --- a/src/vendor/stp/src/c_interface/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -OBJS = $(SRCS:.cpp=.o) - - -libcinterface.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend - diff --git a/src/vendor/stp/src/c_interface/c_interface.cpp b/src/vendor/stp/src/c_interface/c_interface.cpp deleted file mode 100644 index ab83d3b86..000000000 --- a/src/vendor/stp/src/c_interface/c_interface.cpp +++ /dev/null @@ -1,1883 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- -#include "c_interface.h" - -#include -#include -#include "fdstream.h" -#include "../printer/printers.h" -#include "../cpp_interface/cpp_interface.h" -#include "../extlib-abc/cnf_short.h" - -//These typedefs lower the effort of using the keyboard to type (too -//many overloaded meanings of the word type) -typedef BEEV::ASTNode node; -typedef BEEV::ASTNode* nodestar; -typedef BEEV::STPMgr* bmstar; -typedef BEEV::STP* stpstar; -typedef BEEV::Simplifier* simpstar; -typedef BEEV::BVSolver* bvsolverstar; -typedef BEEV::AbsRefine_CounterExample * ctrexamplestar; -typedef BEEV::ASTVec nodelist; -typedef BEEV::CompleteCounterExample* CompleteCEStar; -BEEV::ASTVec *decls = NULL; -SimplifyingNodeFactory *simpNF = NULL; -//vector created_exprs; - -// persist holds a copy of ASTNodes so that the reference count of -// objects we have pointers to doesn't hit zero. -vector persist; -bool cinterface_exprdelete_on_flag = true; - -// GLOBAL FUNCTION: parser -extern int cvcparse(void*); -extern int smtparse(void*); - -void vc_setFlags(VC vc, char c, int param_value) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - process_argument(c, b); -} - -void vc_setFlag(VC vc, char c) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - process_argument(c, b); -} - -void vc_setInterfaceFlags(VC vc, enum ifaceflag_t f, int param_value) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - switch (f) { - case EXPRDELETE: - cinterface_exprdelete_on_flag = param_value != 0; - break; - case MS: - b->UserFlags.solver_to_use = BEEV::UserDefinedFlags::MINISAT_SOLVER; - break; - case SMS: - b->UserFlags.solver_to_use = BEEV::UserDefinedFlags::SIMPLIFYING_MINISAT_SOLVER; - break; - case CMS2: - b->UserFlags.solver_to_use = BEEV::UserDefinedFlags::CRYPTOMINISAT_SOLVER; - break; - case MSP: - b->UserFlags.solver_to_use = BEEV::UserDefinedFlags::MINISAT_PROPAGATORS; - break; - default: - BEEV::FatalError("C_interface: vc_setInterfaceFlags: Unrecognized flag\n"); - break; - } -} - -void make_division_total(VC vc) -{ - bmstar b = (bmstar)(((stpstar)vc)->bm); - b->UserFlags.division_by_zero_returns_one_flag = true; -} - -//Create a validity Checker. This is the global STPMgr -VC vc_createValidityChecker(void) { - CONSTANTBV::ErrCode c = CONSTANTBV::BitVector_Boot(); - if(0 != c) { - cout << CONSTANTBV::BitVector_Error(c) << endl; - return 0; - } - - BEEV::STPMgr * bm = new BEEV::STPMgr(); - BEEV::Simplifier * simp = new BEEV::Simplifier(bm); - BEEV::BVSolver* bvsolver = new BEEV::BVSolver(bm, simp); - BEEV::ToSAT * tosat = new BEEV::ToSAT(bm); - BEEV::ArrayTransformer * arrayTransformer = - new BEEV::ArrayTransformer(bm, simp); - BEEV::AbsRefine_CounterExample * Ctr_Example = - new BEEV::AbsRefine_CounterExample(bm, - simp, - arrayTransformer - ); - - BEEV::ParserBM = bm; - stpstar stp = - new BEEV::STP(bm, simp, - bvsolver, arrayTransformer, - tosat, Ctr_Example); - - simpNF = new SimplifyingNodeFactory(*(bm->hashingNodeFactory), *bm); - bm->defaultNodeFactory = simpNF; - - BEEV::GlobalSTP = stp; - decls = new BEEV::ASTVec(); - //created_exprs.clear(); - vc_setFlags(stp,'d'); - return (VC)stp; -} - -// Expr I/O -void vc_printExpr(VC vc, Expr e) { - //do not print in lisp mode - //bmstar b = (bmstar)vc; - BEEV::ASTNode q = (*(nodestar)e); - // b->Begin_RemoveWrites = true; - // BEEV::ASTNode q = b->SimplifyFormula_TopLevel(*((nodestar)e),false); - // b->Begin_RemoveWrites = false; - q.PL_Print(cout); -} - -char * vc_printSMTLIB(VC vc, Expr e) -{ - stringstream ss; - printer::SMTLIB1_PrintBack(ss,*((nodestar)e)); - string s = ss.str(); - char *copy = strdup(s.c_str()); - return copy; - -} - -// prints Expr 'e' to stdout as C code -void vc_printExprCCode(VC vc, Expr e) { - BEEV::ASTNode q = (*(nodestar)e); - bmstar b = (bmstar)(((stpstar)vc)->bm); - - // print variable declarations - BEEV::ASTVec declsFromParser = (nodelist)b->ListOfDeclaredVars; - - for(BEEV::ASTVec::iterator it=declsFromParser.begin(), - itend=declsFromParser.end(); it!=itend;it++) { - if(BEEV::BITVECTOR_TYPE == it->GetType()) { - const char* name = it->GetName(); - unsigned int bitWidth = it->GetValueWidth(); - assert(bitWidth % 8 == 0); - unsigned int byteWidth = bitWidth / 8; - cout << "unsigned char " - << name - << "[" << byteWidth << "];" << endl; - } - else { - // vc_printExprCCode: unsupported decl. type - assert(0); - } - } - - cout << endl; - - // print constraints and assert - printer::C_Print(cout,q); -} - - -void vc_printExprFile(VC vc, Expr e, int fd) { - fdostream os(fd); - ((nodestar)e)->PL_Print(os); - //os.flush(); -} - -static void vc_printVarDeclsToStream(VC vc, ostream &os) { - for(BEEV::ASTVec::iterator i = decls->begin(), - iend=decls->end();i!=iend;i++) { - node a = *i; - switch(a.GetType()) { - case BEEV::BITVECTOR_TYPE: - a.PL_Print(os); - os << " : BITVECTOR(" - << a.GetValueWidth() - << ");" << endl; - break; - case BEEV::ARRAY_TYPE: - a.PL_Print(os); - os << " : ARRAY " - << "BITVECTOR(" - << a.GetIndexWidth() - << ") OF "; - os << "BITVECTOR(" - << a.GetValueWidth() - << ");" - << endl; - break; - case BEEV::BOOLEAN_TYPE: - a.PL_Print(os); - os << " : BOOLEAN;" << endl; - break; - default: - BEEV::FatalError("vc_printDeclsToStream: Unsupported type",a); - break; - } - } -} - -void vc_printVarDecls(VC vc) { - vc_printVarDeclsToStream(vc, cout); -} - -void vc_clearDecls(VC vc) { - decls->clear(); -} - -static void vc_printAssertsToStream(VC vc, ostream &os, int simplify_print) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - BEEV::ASTVec v = b->GetAsserts(); - BEEV::Simplifier * simp = new BEEV::Simplifier(b); - for(BEEV::ASTVec::iterator i=v.begin(),iend=v.end();i!=iend;i++) { - //b->Begin_RemoveWrites = true; - BEEV::ASTNode q = - (simplify_print == 1) ? - simp->SimplifyFormula_TopLevel(*i,false) : *i; - q = - (simplify_print == 1) ? - simp->SimplifyFormula_TopLevel(q,false) : q; - //b->Begin_RemoveWrites = false; - os << "ASSERT( "; - q.PL_Print(os); - os << ");" << endl; - } -} - -void vc_printAsserts(VC vc, int simplify_print) { - vc_printAssertsToStream(vc, cout, simplify_print); -} - -void vc_printQueryStateToBuffer(VC vc, Expr e, - char **buf, - unsigned long *len, int simplify_print){ - assert(vc); - assert(e); - assert(buf); - assert(len); - bmstar b = (bmstar)(((stpstar)vc)->bm); - BEEV::Simplifier * simp = new BEEV::Simplifier(b); - - // formate the state of the query - stringstream os; - vc_printVarDeclsToStream(vc, os); - os << "%----------------------------------------------------" << endl; - vc_printAssertsToStream(vc, os, simplify_print); - os << "%----------------------------------------------------" << endl; - os << "QUERY( "; - //b->Begin_RemoveWrites = true; - BEEV::ASTNode q = - (simplify_print == 1) ? - simp->SimplifyFormula_TopLevel(*((nodestar)e),false) : - *(nodestar)e; - //b->Begin_RemoveWrites = false; - q.PL_Print(os); - os << " );" << endl; - - // convert to a c buffer - string s = os.str(); - const char *cstr = s.c_str(); - unsigned long size = s.size() + 1; // number of chars + terminating null - *buf = (char *)malloc(size); - if (!(*buf)) { - fprintf(stderr, "malloc(%lu) failed.", size); - assert(*buf); - } - *len = size; - memcpy(*buf, cstr, size); -} - -void vc_printCounterExampleToBuffer(VC vc, char **buf, unsigned long *len) { - assert(vc); - assert(buf); - assert(len); - bmstar b = (bmstar)(((stpstar)vc)->bm); - ctrexamplestar ce = (ctrexamplestar)(((stpstar)vc)->Ctr_Example); - - // formate the state of the query - std::ostringstream os; - bool currentPrint = b->UserFlags.print_counterexample_flag; - b->UserFlags.print_counterexample_flag = true; - os << "COUNTEREXAMPLE BEGIN: \n"; - ce->PrintCounterExample(true,os); - os << "COUNTEREXAMPLE END: \n"; - b->UserFlags.print_counterexample_flag = currentPrint; - - // convert to a c buffer - string s = os.str(); - const char *cstr = s.c_str(); - unsigned long size = s.size() + 1; // number of chars + terminating null - *buf = (char *)malloc(size); - if (!(*buf)) { - fprintf(stderr, "malloc(%lu) failed.", size); - assert(*buf); - } - *len = size; - memcpy(*buf, cstr, size); -} - -void vc_printExprToBuffer(VC vc, Expr e, char **buf, unsigned long * len) { - stringstream os; - //bmstar b = (bmstar)(((stpstar)vc)->bm); - BEEV::ASTNode q = *((nodestar)e); - // b->Begin_RemoveWrites = true; - // BEEV::ASTNode q = b->SimplifyFormula_TopLevel(*((nodestar)e),false); - // b->Begin_RemoveWrites = false; - q.PL_Print(os); - //((nodestar)e)->PL_Print(os); - string s = os.str(); - const char * cstr = s.c_str(); - unsigned long size = s.size() + 1; // number of chars + terminating null - *buf = (char *)malloc(size); - *len = size; - memcpy(*buf, cstr, size); -} - -void vc_printQuery(VC vc){ - ostream& os = std::cout; - bmstar b = (bmstar)(((stpstar)vc)->bm); - os << "QUERY("; - //b->Begin_RemoveWrites = true; - //BEEV::ASTNode q = b->SimplifyFormula_TopLevel(b->GetQuery(),false); - BEEV::ASTNode q = b->GetQuery(); - //b->Begin_RemoveWrites = false; - q.PL_Print(os); - // b->GetQuery().PL_Print(os); - os << ");" << endl; -} - -nodestar persistNode(node n) -{ - nodestar np = new node(n); - if (cinterface_exprdelete_on_flag) - persist.push_back(np); - return np; -} - - -///////////////////////////////////////////////////////////////////////////// -// Array-related methods // -///////////////////////////////////////////////////////////////////////////// -//! Create an array type -Type vc_arrayType(VC vc, Type typeIndex, Type typeData) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar ti = (nodestar)typeIndex; - nodestar td = (nodestar)typeData; - - if(!(ti->GetKind() == BEEV::BITVECTOR - && (*ti)[0].GetKind() == BEEV::BVCONST)) - { - BEEV::FatalError("Tyring to build array whose"\ - "indextype i is not a BITVECTOR, where i = ",*ti); - } - if(!(td->GetKind() == BEEV::BITVECTOR - && (*td)[0].GetKind() == BEEV::BVCONST)) - { - BEEV::FatalError("Trying to build an array whose"\ - "valuetype v is not a BITVECTOR. where a = ",*td); - } - node output = b->CreateNode(BEEV::ARRAY,(*ti)[0],(*td)[0]); - - return persistNode(output); -} - -//! Create an expression for the value of array at the given index -Expr vc_readExpr(VC vc, Expr array, Expr index) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)array; - nodestar i = (nodestar)index; - - assert(BVTypeCheck(*a)); - assert(BVTypeCheck(*i)); - node o = b->CreateTerm(BEEV::READ,a->GetValueWidth(),*a,*i); - assert(BVTypeCheck(o)); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -// //! Array update; equivalent to "array WITH [index] := newValue" -Expr vc_writeExpr(VC vc, Expr array, Expr index, Expr newValue) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)array; - nodestar i = (nodestar)index; - nodestar n = (nodestar)newValue; - - assert(BVTypeCheck(*a)); - assert(BVTypeCheck(*i)); - assert(BVTypeCheck(*n)); - node o = b->CreateTerm(BEEV::WRITE,a->GetValueWidth(),*a,*i,*n); - o.SetIndexWidth(a->GetIndexWidth()); - assert(BVTypeCheck(o)); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -///////////////////////////////////////////////////////////////////////////// -// Context-related methods // -///////////////////////////////////////////////////////////////////////////// -//! Assert a new formula in the current context. -/*! The formula must have Boolean type. */ -void vc_assertFormula(VC vc, Expr e) { - nodestar a = (nodestar)e; - bmstar b = (bmstar)(((stpstar)vc)->bm); - - if(!BEEV::is_Form_kind(a->GetKind())) - BEEV::FatalError("Trying to assert a NON formula: ",*a); - - assert(BVTypeCheck(*a)); - b->AddAssert(*a); -} - -void soft_time_out(int ignored) -{ - BEEV::ParserBM->soft_timeout_expired = true; -} - -//! Check validity of e in the current context. e must be a FORMULA -// -//if returned 0 then input is INVALID. -// -//if returned 1 then input is VALID -// -//if returned 2 then ERROR -// -//! Check validity of e in the current context. -/*! If the result is true, then the resulting context is the same as - * the starting context. If the result is false, then the resulting - * context is a context in which e is false. e must have Boolean - * type. */ -int vc_query(VC vc, Expr e) -{ - return vc_query_with_timeout(vc,e,-1); -} - -int vc_query_with_timeout(VC vc, Expr e, int timeout_ms) { - nodestar a = (nodestar)e; - stpstar stp = ((stpstar)vc); - bmstar b = (bmstar)(stp->bm); - - assert(!BEEV::ParserBM->soft_timeout_expired); - if (timeout_ms != -1) - { - itimerval timeout; - signal(SIGVTALRM, soft_time_out); - timeout.it_interval.tv_usec = 0; - timeout.it_interval.tv_sec = 0; - timeout.it_value.tv_usec = 1000 * (timeout_ms % 1000); - timeout.it_value.tv_sec = timeout_ms / 1000; - setitimer(ITIMER_VIRTUAL, &timeout, NULL); - } - - if(!BEEV::is_Form_kind(a->GetKind())) - { - BEEV::FatalError("CInterface: Trying to QUERY a NON formula: ",*a); - } - //a->LispPrint(cout, 0); - //printf("##################################################\n"); - assert(BVTypeCheck(*a)); - b->AddQuery(*a); - - const BEEV::ASTVec v = b->GetAsserts(); - node o; - int output; - if(!v.empty()) - { - if(v.size()==1) - { - output = stp->TopLevelSTP(v[0],*a); - } - else - { - output = stp->TopLevelSTP(b->CreateNode(BEEV::AND,v),*a); - } - } - else - { - output = stp->TopLevelSTP(b->CreateNode(BEEV::TRUE),*a); - } - - if (timeout_ms !=-1) - { - // Reset the timer. - setitimer(ITIMER_VIRTUAL, NULL, NULL); - BEEV::ParserBM->soft_timeout_expired = false; - } - - return output; -} //end of vc_query - -// int vc_absRefineQuery(VC vc, Expr e) { -// nodestar a = (nodestar)e; -// bmstar b = (bmstar)(((stpstar)vc)->bm); - -// if(!BEEV::is_Form_kind(a->GetKind())) -// BEEV::FatalError("CInterface: Trying to QUERY a NON formula: ",*a); - -// //a->LispPrint(cout, 0); -// //printf("##################################################\n"); -// BVTypeCheck(*a); -// b->AddQuery(*a); - -// const BEEV::ASTVec v = b->GetAsserts(); -// node o; -// if(!v.empty()) { -// if(v.size()==1) -// return b->TopLevelSTP(v[0],*a); -// else -// return b->TopLevelSTP(b->CreateNode(BEEV::AND,v),*a); -// } -// else -// return b->TopLevelSTP(b->CreateNode(BEEV::TRUE),*a); -// } - -void vc_push(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - ((stpstar)vc)->ClearAllTables(); - b->Push(); -} - -void vc_pop(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - b->Pop(); -} - -void vc_printCounterExample(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - ctrexamplestar ce = (ctrexamplestar)(((stpstar)vc)->Ctr_Example); - - bool currentPrint = b->UserFlags.print_counterexample_flag; - b->UserFlags.print_counterexample_flag = true; - cout << "COUNTEREXAMPLE BEGIN: \n"; - ce->PrintCounterExample(true); - cout << "COUNTEREXAMPLE END: \n"; - b->UserFlags.print_counterexample_flag = currentPrint; -} - -// //! Return the counterexample after a failed query. -// /*! This method should only be called after a query which returns -// * false. It will try to return the simplest possible set of -// * assertions which are sufficient to make the queried expression -// * false. The caller is responsible for freeing the array when -// * finished with it. -// */ - -Expr vc_getCounterExample(VC vc, Expr e) { - nodestar a = (nodestar)e; - bmstar b = (bmstar)(((stpstar)vc)->bm); - ctrexamplestar ce = (ctrexamplestar)(((stpstar)vc)->Ctr_Example); - - bool t = false; - if(ce->CounterExampleSize()) - t = true; - nodestar output = new node(ce->GetCounterExample(t, *a)); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -void vc_getCounterExampleArray(VC vc, Expr e, Expr **indices, Expr **values, int *size) { - nodestar a = (nodestar)e; - bmstar b = (bmstar)(((stpstar)vc)->bm); - ctrexamplestar ce = (ctrexamplestar)(((stpstar)vc)->Ctr_Example); - - bool t = false; - if(ce->CounterExampleSize()) - t = true; - - std::vector > entries = ce->GetCounterExampleArray(t, *a); - *size = entries.size(); - if (*size != 0) { - *indices = (Expr *) malloc(*size * sizeof(Expr*)); - *values = (Expr *) malloc(*size * sizeof(Expr*)); - for (int i = 0; i < *size; ++i) { - (*indices)[i] = new node(entries[i].first); - (*values)[i] = new node(entries[i].second); - } - } -} - -int vc_counterexample_size(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - ctrexamplestar ce = (ctrexamplestar)(((stpstar)vc)->Ctr_Example); - - return ce->CounterExampleSize(); -} - -WholeCounterExample vc_getWholeCounterExample(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - ctrexamplestar ce = (ctrexamplestar)(((stpstar)vc)->Ctr_Example); - - CompleteCEStar c = - new BEEV::CompleteCounterExample(ce->GetCompleteCounterExample(), - b); - return c; -} - -Expr vc_getTermFromCounterExample(VC vc, Expr e, WholeCounterExample cc) { - //bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar n = (nodestar)e; - CompleteCEStar c = (CompleteCEStar)cc; - - nodestar output = new node(c->GetCounterExample(*n)); - return output; -} - -void vc_deleteWholeCounterExample(WholeCounterExample cc) { - CompleteCEStar c = (CompleteCEStar)cc; - - delete c; -} - -int vc_getBVLength(VC vc, Expr ex) { - nodestar e = (nodestar)ex; - - if(BEEV::BITVECTOR_TYPE != e->GetType()) - { - BEEV::FatalError("c_interface: vc_GetBVLength: " \ - "Input expression must be a bit-vector"); - } - return e->GetValueWidth(); -} // end of vc_getBVLength - -///////////////////////////////////////////////////////////////////////////// -// Expr Creation methods // -///////////////////////////////////////////////////////////////////////////// -//! Create a variable with a given name and type -/*! The type cannot be a function type. */ -Expr vc_varExpr1(VC vc, const char* name, - int indexwidth, int valuewidth) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - - node o = b->CreateSymbol(name,indexwidth,valuewidth); - - nodestar output = new node(o); - ////if(cinterface_exprdelete_on) created_exprs.push_back(output); - assert(BVTypeCheck(*output)); - - //store the decls in a vector for printing purposes - decls->push_back(o); - return output; -} - -Expr vc_varExpr(VC vc, const char * name, Type type) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)type; - - unsigned indexWidth; - unsigned valueWidth; - - switch(a->GetKind()) { - case BEEV::BITVECTOR: - indexWidth = 0; - valueWidth = (*a)[0].GetUnsignedConst(); - break; - case BEEV::ARRAY: - indexWidth = (*a)[0].GetUnsignedConst(); - valueWidth = (*a)[1].GetUnsignedConst(); - break; - case BEEV::BOOLEAN: - indexWidth = 0; - valueWidth = 0; - break; - default: - BEEV::FatalError("CInterface: vc_varExpr: Unsupported type",*a); - break; - - } - node o = b->CreateSymbol(name,indexWidth,valueWidth); - - nodestar output = new node(o); - ////if(cinterface_exprdelete_on) created_exprs.push_back(output); - assert(BVTypeCheck(*output)); - - //store the decls in a vector for printing purposes - decls->push_back(o); - return output; -} - -//! Create an equality expression. The two children must have the -//same type. -Expr vc_eqExpr(VC vc, Expr ccc0, Expr ccc1) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - - nodestar a = (nodestar)ccc0; - nodestar aa = (nodestar)ccc1; - assert(BVTypeCheck(*a)); - assert(BVTypeCheck(*aa)); - node o = b->CreateNode(BEEV::EQ,*a,*aa); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_boolType(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - - node o = b->CreateNode(BEEV::BOOLEAN); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -///////////////////////////////////////////////////////////////////////////// -// BOOLEAN EXPR Creation methods // -///////////////////////////////////////////////////////////////////////////// -// The following functions create Boolean expressions. The children -// provided as arguments must be of type Boolean. -Expr vc_trueExpr(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - node c = b->CreateNode(BEEV::TRUE); - - nodestar d = new node(c); - //if(cinterface_exprdelete_on) created_exprs.push_back(d); - return d; -} - -Expr vc_falseExpr(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - node c = b->CreateNode(BEEV::FALSE); - - nodestar d = new node(c); - //if(cinterface_exprdelete_on) created_exprs.push_back(d); - return d; -} - -Expr vc_notExpr(VC vc, Expr ccc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - - node o = b->CreateNode(BEEV::NOT,*a); - assert(BVTypeCheck(o)); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_andExpr(VC vc, Expr left, Expr right) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar l = (nodestar)left; - nodestar r = (nodestar)right; - - node o = b->CreateNode(BEEV::AND,*l,*r); - assert(BVTypeCheck(o)); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_orExpr(VC vc, Expr left, Expr right) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar l = (nodestar)left; - nodestar r = (nodestar)right; - - node o = b->CreateNode(BEEV::OR,*l,*r); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_xorExpr(VC vc, Expr left, Expr right) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar l = (nodestar)left; - nodestar r = (nodestar)right; - - node o = b->CreateNode(BEEV::XOR,*l,*r); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - - -Expr vc_andExprN(VC vc, Expr* cc, int n) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar * c = (nodestar *)cc; - nodelist d; - - for(int i =0; i < n; i++) - d.push_back(*c[i]); - - node o = b->CreateNode(BEEV::AND,d); - assert(BVTypeCheck(o)); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - - -Expr vc_orExprN(VC vc, Expr* cc, int n) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar * c = (nodestar *)cc; - nodelist d; - - for(int i =0; i < n; i++) - d.push_back(*c[i]); - - node o = b->CreateNode(BEEV::OR,d); - assert(BVTypeCheck(o)); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvPlusExprN(VC vc, int n_bits, Expr* cc, int n) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar * c = (nodestar *)cc; - nodelist d; - - for(int i =0; i < n; i++) - d.push_back(*c[i]); - - node o = b->CreateTerm(BEEV::BVPLUS, n_bits, d); - assert(BVTypeCheck(o)); - - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - - -Expr vc_iteExpr(VC vc, Expr cond, Expr thenpart, Expr elsepart){ - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar c = (nodestar)cond; - nodestar t = (nodestar)thenpart; - nodestar e = (nodestar)elsepart; - - assert(BVTypeCheck(*c)); - assert(BVTypeCheck(*t)); - assert(BVTypeCheck(*e)); - node o; - //if the user asks for a formula then produce a formula, else - //prodcue a term - if(BEEV::BOOLEAN_TYPE == t->GetType()) - o = b->CreateNode(BEEV::ITE,*c,*t,*e); - else { - o = b->CreateTerm(BEEV::ITE,t->GetValueWidth(),*c,*t,*e); - o.SetIndexWidth(t->GetIndexWidth()); - } - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_impliesExpr(VC vc, Expr antecedent, Expr consequent){ - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar c = (nodestar)antecedent; - nodestar t = (nodestar)consequent; - - assert(BVTypeCheck(*c)); - assert(BVTypeCheck(*t)); - node o; - - o = b->CreateNode(BEEV::IMPLIES,*c,*t); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_iffExpr(VC vc, Expr e0, Expr e1){ - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar c = (nodestar)e0; - nodestar t = (nodestar)e1; - - assert(BVTypeCheck(*c)); - assert(BVTypeCheck(*t)); - node o; - - o = b->CreateNode(BEEV::IFF,*c,*t); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_boolToBVExpr(VC vc, Expr form) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar c = (nodestar)form; - - assert(BVTypeCheck(*c)); - if(!is_Form_kind(c->GetKind())) - { - BEEV::FatalError("CInterface: vc_BoolToBVExpr: "\ - "You have input a NON formula:",*c); - } - - node o; - node one = b->CreateOneConst(1); - node zero = b->CreateZeroConst(1); - o = b->CreateTerm(BEEV::ITE,1,*c,one,zero); - - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_paramBoolExpr(VC vc, Expr boolvar, Expr parameter){ - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar c = (nodestar)boolvar; - nodestar t = (nodestar)parameter; - - assert(BVTypeCheck(*c)); - assert(BVTypeCheck(*t)); - node o; - - o = b->CreateNode(BEEV::PARAMBOOL,*c,*t); - //BVTypeCheck(o); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - - -///////////////////////////////////////////////////////////////////////////// -// BITVECTOR EXPR Creation methods // -///////////////////////////////////////////////////////////////////////////// -Type vc_bvType(VC vc, int num_bits) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - - if(!(0 < num_bits)) - { - BEEV::FatalError("CInterface: number of bits in a bvtype"\ - " must be a positive integer:", - b->CreateNode(BEEV::UNDEFINED)); - } - - node e = b->CreateBVConst(32, num_bits); - node output = (b->CreateNode(BEEV::BITVECTOR,e)); - return persistNode(output); -} - -Type vc_bv32Type(VC vc) { - return vc_bvType(vc,32); -} - -Expr vc_bvConstExprFromDecStr(VC vc, - int width, - const char* decimalInput ) -{ - bmstar b = (bmstar)(((stpstar)vc)->bm); - string str(decimalInput); - node n = b->CreateBVConst(str, 10, width); - assert(BVTypeCheck(n)); - nodestar output = new node(n); - return output; -} - - -Expr vc_bvConstExprFromStr(VC vc, const char* binary_repr) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - - node n = b->CreateBVConst(binary_repr,2); - assert(BVTypeCheck(n)); - nodestar output = new node(n); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvConstExprFromInt(VC vc, - int n_bits, - unsigned int value) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - - unsigned long long int v = (unsigned long long int)value; - unsigned long long int max_n_bits = 0xFFFFFFFFFFFFFFFFULL >> 64-n_bits; - //printf("%ull", max_n_bits); - if(v > max_n_bits) { - printf("CInterface: vc_bvConstExprFromInt: "\ - "Cannot construct a constant %llu >= %llu,\n", v, max_n_bits); - BEEV::FatalError("FatalError"); - } - node n = b->CreateBVConst(n_bits, v); - assert(BVTypeCheck(n)); - return persistNode(n); -} - -Expr vc_bvConstExprFromLL(VC vc, - int n_bits, - unsigned long long value) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - - node n = b->CreateBVConst(n_bits, value); - assert(BVTypeCheck(n)); - nodestar output = new node(n); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvConcatExpr(VC vc, Expr left, Expr right) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar l = (nodestar)left; - nodestar r = (nodestar)right; - - assert(BVTypeCheck(*l)); - assert(BVTypeCheck(*r)); - node o = - b->CreateTerm(BEEV::BVCONCAT, - l->GetValueWidth()+ r->GetValueWidth(),*l,*r); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr createBinaryTerm(VC vc, int n_bits, Kind k, Expr left, Expr right){ - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar l = (nodestar)left; - nodestar r = (nodestar)right; - - assert(BVTypeCheck(*l)); - assert(BVTypeCheck(*r)); - node o = b->CreateTerm(k,n_bits, *l, *r); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - - -Expr vc_bvPlusExpr(VC vc, int n_bits, Expr left, Expr right){ - return createBinaryTerm(vc, n_bits, BEEV::BVPLUS, left, right); -} - -Expr vc_bv32PlusExpr(VC vc, Expr left, Expr right) { - return vc_bvPlusExpr(vc, 32, left, right); -} - -Expr vc_bvMinusExpr(VC vc, int n_bits, Expr left, Expr right) { - return createBinaryTerm(vc, n_bits, BEEV::BVSUB, left, right); -} - -Expr vc_bv32MinusExpr(VC vc, Expr left, Expr right) { - return vc_bvMinusExpr(vc, 32, left, right); -} - -Expr vc_bvMultExpr(VC vc, int n_bits, Expr left, Expr right) { - return createBinaryTerm(vc, n_bits, BEEV::BVMULT, left, right); -} - -Expr vc_bvDivExpr(VC vc, int n_bits, Expr left, Expr right) { - return createBinaryTerm(vc, n_bits, BEEV::BVDIV, left, right); -} - -Expr vc_bvModExpr(VC vc, int n_bits, Expr left, Expr right) { - return createBinaryTerm(vc, n_bits, BEEV::BVMOD, left, right); -} - -Expr vc_sbvDivExpr(VC vc, int n_bits, Expr left, Expr right) { - return createBinaryTerm(vc, n_bits, BEEV::SBVDIV, left, right); -} - -Expr vc_sbvModExpr(VC vc, int n_bits, Expr left, Expr right) { - return createBinaryTerm(vc, n_bits, BEEV::SBVREM, left, right); -} - -Expr vc_sbvRemExpr(VC vc, int n_bits, Expr left, Expr right) { - return createBinaryTerm(vc, n_bits, BEEV::SBVMOD, left, right); -} - - -Expr vc_bv32MultExpr(VC vc, Expr left, Expr right) { - return vc_bvMultExpr(vc, 32, left, right); -} - -Expr createBinaryNode(VC vc, Kind k, Expr left, Expr right) -{ - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar l = (nodestar)left; - nodestar r = (nodestar)right; - assert(BVTypeCheck(*l)); - assert(BVTypeCheck(*r)); - node o = b->CreateNode(k, *l, *r); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) - // created_exprs.push_back(output); - return output; -} - -// unsigned comparators -Expr vc_bvLtExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVLT,left,right); -} -Expr vc_bvLeExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVLE,left,right); -} -Expr vc_bvGtExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVGT,left,right); -} -Expr vc_bvGeExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVGE,left,right); -} -// signed comparators -Expr vc_sbvLtExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVSLT,left,right); -} -Expr vc_sbvLeExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVSLE,left,right); -} -Expr vc_sbvGtExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVSGT,left,right); -} -Expr vc_sbvGeExpr(VC vc, Expr left, Expr right) { - return createBinaryNode(vc,BEEV::BVSGE,left,right); -} - -Expr vc_bvLeftShiftExprExpr(VC vc, int n_bits, Expr left, Expr right) -{ - return createBinaryTerm(vc, n_bits,BEEV::BVLEFTSHIFT,left,right); -} - -Expr vc_bvRightShiftExprExpr(VC vc, int n_bits,Expr left, Expr right) -{ - return createBinaryTerm(vc, n_bits,BEEV::BVRIGHTSHIFT,left,right); -} - -Expr vc_bvSignedRightShiftExprExpr(VC vc,int n_bits, Expr left, Expr right) -{ - return createBinaryTerm(vc, n_bits,BEEV::BVSRSHIFT,left,right); -} - - -Expr vc_bvUMinusExpr(VC vc, Expr ccc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - assert(BVTypeCheck(*a)); - - node o = b->CreateTerm(BEEV::BVUMINUS, a->GetValueWidth(), *a); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -// Expr createBinaryTerm(VC vc, int n_bits, Kind k, Expr left, Expr right){ - -// bitwise operations: these are terms not formulas -Expr vc_bvAndExpr(VC vc, Expr left, Expr right) { - return createBinaryTerm(vc, (*((nodestar)left)).GetValueWidth(), BEEV::BVAND, left, right); -} - -Expr vc_bvOrExpr(VC vc, Expr left, Expr right) { - return createBinaryTerm(vc, (*((nodestar)left)).GetValueWidth(), BEEV::BVOR, left, right); -} - -Expr vc_bvXorExpr(VC vc, Expr left, Expr right) { - return createBinaryTerm(vc, (*((nodestar)left)).GetValueWidth(), BEEV::BVXOR, left, right); -} - -Expr vc_bvNotExpr(VC vc, Expr ccc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - - assert(BVTypeCheck(*a)); - node o = b->CreateTerm(BEEV::BVNEG, a->GetValueWidth(), *a); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvLeftShiftExpr(VC vc, int sh_amt, Expr ccc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - assert(BVTypeCheck(*a)); - - //convert leftshift to bvconcat - if(0 != sh_amt) { - node len = b->CreateBVConst(sh_amt, 0); - node o = - b->CreateTerm(BEEV::BVCONCAT, - a->GetValueWidth() + sh_amt, *a, len); - assert(BVTypeCheck(o)); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; - } - else - return a; -} - -Expr vc_bvRightShiftExpr(VC vc, int sh_amt, Expr ccc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - assert(BVTypeCheck(*a)); - - unsigned int w = a->GetValueWidth(); - //the amount by which you are rightshifting - //is less-than/equal-to the length of input - //bitvector - if(0 < (unsigned)sh_amt && (unsigned)sh_amt < w) { - node len = b->CreateBVConst(sh_amt, 0); - node hi = b->CreateBVConst(32,w-1); - node low = b->CreateBVConst(32,sh_amt); - node extract = b->CreateTerm(BEEV::BVEXTRACT,w-sh_amt,*a,hi,low); - - node n = b->CreateTerm(BEEV::BVCONCAT, w,len, extract); - BVTypeCheck(n); - nodestar output = new node(n); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; - } - else if ((unsigned) sh_amt==w) - { - nodestar output = new node(b->CreateBVConst(w, 0)); - return output; - } - else if(sh_amt == 0) - return a; - else { - if(0== w) - { - BEEV::FatalError("CInterface: vc_bvRightShiftExpr: "\ - "cannot have a bitvector of length 0:",*a); - } - nodestar output = new node(b->CreateBVConst(w,0)); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; - } -} - -/* Same as vc_bvLeftShift only that the answer in 32 bits long */ -Expr vc_bv32LeftShiftExpr(VC vc, int sh_amt, Expr child) { - return vc_bvExtract(vc, vc_bvLeftShiftExpr(vc, sh_amt, child), 31, 0); -} - -/* Same as vc_bvRightShift only that the answer in 32 bits long */ -Expr vc_bv32RightShiftExpr(VC vc, int sh_amt, Expr child) { - return vc_bvExtract(vc, vc_bvRightShiftExpr(vc, sh_amt, child), 31, 0); -} - -Expr vc_bvVar32LeftShiftExpr(VC vc, Expr sh_amt, Expr child) { - Expr ifpart; - Expr thenpart; - Expr elsepart = vc_trueExpr(vc); - Expr ite = vc_trueExpr(vc); - int child_width = vc_getBVLength(vc, child); - int shift_width = vc_getBVLength(vc, sh_amt); - - assert(child_width>0); - - for(int count=32; count >= 0; count--) - { - if(count != 32) - { - ifpart = vc_eqExpr(vc, sh_amt, - vc_bvConstExprFromInt(vc, shift_width, count)); - thenpart = vc_bvExtract(vc, - vc_bvLeftShiftExpr(vc, count, child), - child_width-1, 0); - - ite = vc_iteExpr(vc,ifpart,thenpart,elsepart); - elsepart = ite; - } - else - { - elsepart = vc_bvConstExprFromInt(vc,child_width, 0); - } - } - return ite; -} - -Expr vc_bvVar32DivByPowOfTwoExpr(VC vc, Expr child, Expr rhs) { - Expr ifpart; - Expr thenpart; - Expr elsepart = vc_trueExpr(vc); - Expr ite = vc_trueExpr(vc); - - for(int count=32; count >= 0; count--) - { - if(count != 32) - { - ifpart = vc_eqExpr(vc, rhs, - vc_bvConstExprFromInt(vc, 32, 1 << count)); - thenpart = vc_bvRightShiftExpr(vc, count, child); - ite = vc_iteExpr(vc,ifpart,thenpart,elsepart); - elsepart = ite; - } - else - { - elsepart = vc_bvConstExprFromInt(vc,32, 0); - } - } - return ite; -} - -Expr vc_bvVar32RightShiftExpr(VC vc, Expr sh_amt, Expr child) { - Expr ifpart; - Expr thenpart; - Expr elsepart = vc_trueExpr(vc); - Expr ite = vc_trueExpr(vc); - - int child_width = vc_getBVLength(vc, child); - int shift_width = vc_getBVLength(vc, sh_amt); - - assert(child_width>0); - - for(int count=32; count >= 0; count--) - { - if(count != 32) - { - ifpart = vc_eqExpr(vc, sh_amt, - vc_bvConstExprFromInt(vc, shift_width, count)); - thenpart = vc_bvRightShiftExpr(vc, count, child); - ite = vc_iteExpr(vc,ifpart,thenpart,elsepart); - elsepart = ite; - } - else - { - elsepart = vc_bvConstExprFromInt(vc,child_width, 0); - } - } - return ite; -} - -Expr vc_bvExtract(VC vc, Expr ccc, int hi_num, int low_num) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - BVTypeCheck(*a); - - node hi = b->CreateBVConst(32,hi_num); - node low = b->CreateBVConst(32,low_num); - node o = b->CreateTerm(BEEV::BVEXTRACT,hi_num-low_num+1,*a,hi,low); - BVTypeCheck(o); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvBoolExtract(VC vc, Expr ccc, int bit_num) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - BVTypeCheck(*a); - - node bit = b->CreateBVConst(32,bit_num); - //node o = b->CreateNode(BEEV::BVGETBIT,*a,bit); - node zero = b->CreateBVConst(1,0); - node oo = b->CreateTerm(BEEV::BVEXTRACT,1,*a,bit,bit); - node o = b->CreateNode(BEEV::EQ,oo,zero); - BVTypeCheck(o); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvBoolExtract_Zero(VC vc, Expr ccc, int bit_num) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - BVTypeCheck(*a); - - node bit = b->CreateBVConst(32,bit_num); - //node o = b->CreateNode(BEEV::BVGETBIT,*a,bit); - node zero = b->CreateBVConst(1,0); - node oo = b->CreateTerm(BEEV::BVEXTRACT,1,*a,bit,bit); - node o = b->CreateNode(BEEV::EQ,oo,zero); - BVTypeCheck(o); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvBoolExtract_One(VC vc, Expr ccc, int bit_num) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - BVTypeCheck(*a); - - node bit = b->CreateBVConst(32,bit_num); - //node o = b->CreateNode(BEEV::BVGETBIT,*a,bit); - node one = b->CreateBVConst(1,1); - node oo = b->CreateTerm(BEEV::BVEXTRACT,1,*a,bit,bit); - node o = b->CreateNode(BEEV::EQ,oo,one); - BVTypeCheck(o); - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -Expr vc_bvSignExtend(VC vc, Expr ccc, int nbits) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)ccc; - - //width of the expr which is being sign extended. nbits is the - //resulting length of the signextended expr - BVTypeCheck(*a); - - unsigned exprlen = a->GetValueWidth(); - unsigned outputlen = nbits; - node n; - if(exprlen >= outputlen) { - //extract - node hi = b->CreateBVConst(32,outputlen-1); - node low = b->CreateBVConst(32,0); - n = b->CreateTerm(BEEV::BVEXTRACT,nbits,*a,hi,low); - BVTypeCheck(n); - } - else { - //sign extend - BEEV::ASTNode width = b->CreateBVConst(32,nbits); - n = b->CreateTerm(BEEV::BVSX,nbits,*a, width); - } - - BVTypeCheck(n); - nodestar output = new node(n); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; -} - -//! Return an int from a constant bitvector expression -int getBVInt(Expr e) { - //bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)e; - - if(BEEV::BVCONST != a->GetKind()) - { - BEEV::FatalError("CInterface: getBVInt: Attempting to "\ - "extract int value from a NON-constant BITVECTOR: ", - *a); - } - return (int)a->GetUnsignedConst(); -} - -//! Return an unsigned int from a constant bitvector expression -unsigned int getBVUnsigned(Expr e) { - //bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)e; - - if(BEEV::BVCONST != a->GetKind()) - { - BEEV::FatalError("getBVUnsigned: Attempting to extract int "\ - "value from a NON-constant BITVECTOR: ", - *a); - } - return (unsigned int)a->GetUnsignedConst(); -} - -//! Return an unsigned long long int from a constant bitvector expression -unsigned long long int getBVUnsignedLongLong(Expr e) { - //bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)e; - - if(BEEV::BVCONST != a->GetKind()) - BEEV::FatalError("getBVUnsigned: Attempting to extract int value"\ - "from a NON-constant BITVECTOR: ",*a); - unsigned* bv = a->GetBVConst(); - - char * str_bv = (char *)CONSTANTBV::BitVector_to_Bin(bv); - unsigned long long int tmp = strtoull(str_bv,NULL,2); - CONSTANTBV::BitVector_Dispose((unsigned char *)str_bv); - return tmp; -} - - -Expr vc_simplify(VC vc, Expr e) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar a = (nodestar)e; - simpstar simp = (simpstar)(((stpstar)vc)->simp); - - if(BEEV::BOOLEAN_TYPE == a->GetType()) - { - nodestar round1 = - new node(simp->SimplifyFormula_TopLevel(*a,false)); - //b->Begin_RemoveWrites = true; - nodestar output = - new node(simp->SimplifyFormula_TopLevel(*round1,false)); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - //b->Begin_RemoveWrites = false; - delete round1; - return output; - } - else - { - nodestar round1 = new node(simp->SimplifyTerm(*a)); - //b->Begin_RemoveWrites = true; - nodestar output = new node(simp->SimplifyTerm(*round1)); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - //b->Begin_RemoveWrites = false; - delete round1; - return output; - } -} - -/* C pointer support: C interface to support C memory arrays in CVCL */ -Expr vc_bvCreateMemoryArray(VC vc, const char * arrayName) { - Type bv8 = vc_bvType(vc,8); - Type bv32 = vc_bvType(vc,32); - - Type malloced_mem0 = vc_arrayType(vc,bv32,bv8); - return vc_varExpr(vc, arrayName, malloced_mem0); -} - -Expr vc_bvReadMemoryArray(VC vc, - Expr array, - Expr byteIndex, int numOfBytes) { - if(!(numOfBytes > 0)) - BEEV::FatalError("numOfBytes must be greater than 0"); - - if(numOfBytes == 1) - return vc_readExpr(vc,array,byteIndex); - else - { - int count = 1; - Expr a = vc_readExpr(vc,array,byteIndex); - while(--numOfBytes > 0) - { - Expr b = vc_readExpr(vc,array, - /*vc_simplify(vc, */ - vc_bvPlusExpr(vc, 32, - byteIndex, - vc_bvConstExprFromInt(vc,32, - count))); - a = vc_bvConcatExpr(vc,b,a); - count++; - } - return a; - } -} - -Expr vc_bvWriteToMemoryArray(VC vc, - Expr array, Expr byteIndex, - Expr element, int numOfBytes) { - if(!(numOfBytes > 0)) - BEEV::FatalError("numOfBytes must be greater than 0"); - - int newBitsPerElem = numOfBytes*8; - if(numOfBytes == 1) - return vc_writeExpr(vc, array, byteIndex, element); - else { - int count = 1; - int hi = newBitsPerElem - 1; - int low = newBitsPerElem - 8; - int low_elem = 0; - int hi_elem = low_elem + 7; - Expr c = vc_bvExtract(vc, element, hi_elem, low_elem); - Expr newarray = vc_writeExpr(vc, array, byteIndex, c); - while(--numOfBytes > 0) { - hi = low-1; - low = low-8; - - low_elem = low_elem + 8; - hi_elem = low_elem + 7; - - c = vc_bvExtract(vc, element, hi_elem, low_elem); - newarray = - vc_writeExpr(vc, newarray, - vc_bvPlusExpr(vc, 32, - byteIndex, - vc_bvConstExprFromInt(vc,32,count)), - c); - count++; - } - return newarray; - } -} - -Expr vc_bv32ConstExprFromInt(VC vc, unsigned int value){ - return vc_bvConstExprFromInt(vc, 32, value); -} - - -#if 0 -static char *val_to_binary_str(unsigned nbits, unsigned long long val) { - char s[65]; - - assert(nbits < sizeof s); - strcpy(s, ""); - while(nbits-- > 0) { - if((val >> nbits) & 1) - strcat(s, "1"); - else - strcat(s, "0"); - } - return strdup(s); -} -#endif - -Expr vc_parseExpr(VC vc, const char* infile) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - extern FILE *cvcin, *smtin; - const char * prog = "stp"; - - cvcin = fopen(infile,"r"); - if(cvcin == NULL) { - fprintf(stderr,"%s: Error: cannot open %s\n",prog,infile); - BEEV::FatalError(""); - } - - //BEEV::GlobalSTP = (stpstar)vc; - CONSTANTBV::ErrCode c = CONSTANTBV::BitVector_Boot(); - if(0 != c) { - cout << CONSTANTBV::BitVector_Error(c) << endl; - return 0; - } - - BEEV::Cpp_interface pi(*b, b->defaultNodeFactory); - BEEV::parserInterface = π - - - BEEV::ASTVec * AssertsQuery = new BEEV::ASTVec; - if (b->UserFlags.smtlib1_parser_flag) - { - smtin = cvcin; - cvcin = NULL; - smtparse((void*)AssertsQuery); - } - else - { - cvcparse((void*)AssertsQuery); - } - - BEEV::ASTNode asserts = (*(BEEV::ASTVec*)AssertsQuery)[0]; - BEEV::ASTNode query = (*(BEEV::ASTVec*)AssertsQuery)[1]; - - - node oo = b->CreateNode(BEEV::NOT,query); - node o = b->CreateNode(BEEV::AND,asserts,oo); - nodestar output = new node(o); - delete AssertsQuery; - return output; -} //end of vc_parseExpr() - -char* exprString(Expr e){ - stringstream ss; - ((nodestar)e)->PL_Print(ss,0); - string s = ss.str(); - char *copy = strdup(s.c_str()); - return copy; -} - -char* typeString(Type t){ - stringstream ss; - ((nodestar)t)->PL_Print(ss,0); - - string s = ss.str(); - char *copy = strdup(s.c_str()); - return copy; -} - -Expr getChild(Expr e, int i){ - nodestar a = (nodestar)e; - - BEEV::ASTVec c = a->GetChildren(); - if(0 <= i && (unsigned)i < c.size()) - { - BEEV::ASTNode o = c[i]; - nodestar output = new node(o); - //if(cinterface_exprdelete_on) created_exprs.push_back(output); - return output; - } - else - { - BEEV::FatalError("getChild: Error accessing childNode " \ - "in expression: ",*a); - } - return a; -} - -void vc_registerErrorHandler(void (*error_hdlr)(const char* err_msg)) { - BEEV::vc_error_hdlr = error_hdlr; -} - - -int vc_getHashQueryStateToBuffer(VC vc, Expr query) { - assert(vc); - assert(query); - bmstar b = (bmstar)(((stpstar)vc)->bm); - nodestar qry = (nodestar)query; - BEEV::ASTVec v = b->GetAsserts(); - BEEV::ASTNode out = b->CreateNode(BEEV::AND,b->CreateNode(BEEV::NOT,*qry),v); - return out.Hash(); -} - -Type vc_getType(VC vc, Expr ex) { - nodestar e = (nodestar)ex; - - switch(e->GetType()) { - case BEEV::BOOLEAN_TYPE: - return vc_boolType(vc); - break; - case BEEV::BITVECTOR_TYPE: - return vc_bvType(vc,e->GetValueWidth()); - break; - case BEEV::ARRAY_TYPE: { - Type typeindex = vc_bvType(vc,e->GetIndexWidth()); - Type typedata = vc_bvType(vc,e->GetValueWidth()); - return vc_arrayType(vc,typeindex,typedata); - break; - } - default: - BEEV::FatalError("c_interface: vc_GetType: "\ - "expression with bad typing: "\ - "please check your expression construction"); - return vc_boolType(vc); - break; - } -}// end of vc_gettype() - -//!if e is TRUE then return 1; if e is FALSE then return 0; otherwise -//return -1 -int vc_isBool(Expr e) { - nodestar input = (nodestar)e; - if(BEEV::TRUE == input->GetKind()) { - return 1; - } - - if(BEEV::FALSE == input->GetKind()) { - return 0; - } - - return -1; -} - -void vc_Destroy(VC vc) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - // for(std::vector::iterator it=created_exprs.begin(), - // itend=created_exprs.end();it!=itend;it++) { - // BEEV::ASTNode * aaa = *it; - // delete aaa; - // } - - if (cinterface_exprdelete_on_flag) { - for (vector::iterator it = persist.begin(); it!= persist.end();it++) - delete *it; - persist.clear(); - } - - Cnf_ClearMemory(); - - delete decls; - delete (stpstar)vc; - BEEV::GlobalSTP = NULL; - delete BEEV::ParserBM; - BEEV::ParserBM = NULL; - delete simpNF; -} - -void vc_DeleteExpr(Expr e) { - nodestar input = (nodestar)e; - //bmstar b = (bmstar)(((stpstar)vc)->bm); - delete input; -} - -exprkind_t getExprKind(Expr e) { - nodestar input = (nodestar)e; - return (exprkind_t)(input->GetKind()); -} - -int getDegree (Expr e) { - nodestar input = (nodestar)e; - return input->Degree(); -} - -int getBVLength(Expr ex) { - nodestar e = (nodestar)ex; - - if(BEEV::BITVECTOR_TYPE != e->GetType()) - { - BEEV::FatalError("c_interface: vc_GetBVLength: "\ - "Input expression must be a bit-vector"); - } - - return e->GetValueWidth(); -} - -type_t getType (Expr ex) { - nodestar e = (nodestar)ex; - return (type_t)(e->GetType()); -} - -int getVWidth (Expr ex) { - nodestar e = (nodestar)ex; - return e->GetValueWidth(); -} - -int getIWidth (Expr ex) { - nodestar e = (nodestar)ex; - return e->GetIndexWidth(); -} - -void vc_printCounterExampleFile(VC vc, int fd) { - fdostream os(fd); - bmstar b = (bmstar)(((stpstar)vc)->bm); - ctrexamplestar ce = (ctrexamplestar)(((stpstar)vc)->Ctr_Example); - - bool currentPrint = b->UserFlags.print_counterexample_flag; - b->UserFlags.print_counterexample_flag = true; - os << "COUNTEREXAMPLE BEGIN: \n"; - ce->PrintCounterExample(true, os); - os << "COUNTEREXAMPLE END: \n"; - b->UserFlags.print_counterexample_flag = currentPrint; -} - -const char* exprName(Expr e){ - return ((nodestar)e)->GetName(); -} - -int getExprID (Expr ex) { - BEEV::ASTNode q = (*(nodestar)ex); - return q.GetNodeNum(); -} - -////////////////////////////////////////////////////////////////////////// -// extended version - - -#if 0 -/#ifndef YY_TYPEDEF_YY_BUFFER_STATE -struct yy_buffer_state; -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; - - -extern YY_BUFFER_STATE cvc_scan_string (const char *yy_str ); -extern void cvc_delete_buffer (YY_BUFFER_STATE b ); -extern YY_BUFFER_STATE smt_scan_string (const char *yy_str ); -extern void smt_delete_buffer (YY_BUFFER_STATE b ); -extern void cvc_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -extern void smt_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -#endif - -int smt_scan_string(const char *yy_str); - -int vc_parseMemExpr(VC vc, const char* s, Expr* oquery, Expr* oasserts ) { - bmstar b = (bmstar)(((stpstar)vc)->bm); - -#if 0 - BEEV::GlobalSTP = (stpstar)vc; - CONSTANTBV::ErrCode c = CONSTANTBV::BitVector_Boot(); - if(0 != c) { - cout << CONSTANTBV::BitVector_Error(c) << endl; - return 0; - } -#endif - - BEEV::Cpp_interface pi(*b, b->defaultNodeFactory); - BEEV::parserInterface = π - - BEEV::ASTVec AssertsQuery; - if (b->UserFlags.smtlib1_parser_flag) - { - //YY_BUFFER_STATE bstat = smt_scan_string(s); - //smt_switch_to_buffer(bstat); - smt_scan_string(s); - smtparse((void*)&AssertsQuery); - //smt_delete_buffer(bstat); - } - else - { - //YY_BUFFER_STATE bstat = cvc_scan_string(s); - //cvc_switch_to_buffer(bstat); - smt_scan_string(s); - cvcparse((void*)&AssertsQuery); - //cvc_delete_buffer(bstat); - } - - if ( oquery ) { - *(nodestar*) oquery = new node(AssertsQuery[1]); - } - if ( oasserts ) { - *(nodestar*) oasserts = new node(AssertsQuery[0]); - } - return 1; -} //end of vc_parseMemExpr() - diff --git a/src/vendor/stp/src/c_interface/c_interface.h b/src/vendor/stp/src/c_interface/c_interface.h deleted file mode 100644 index c1b42f64a..000000000 --- a/src/vendor/stp/src/c_interface/c_interface.h +++ /dev/null @@ -1,483 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - ********************************************************************/ -// -*- c++ -*- - -#ifndef _cvcl__include__c_interface_h_ -#define _cvcl__include__c_interface_h_ - -#ifdef __cplusplus -#define _CVCL_DEFAULT_ARG(v) =v -#else -#define _CVCL_DEFAULT_ARG(v) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#ifdef STP_STRONG_TYPING -#else - //This gives absolutely no pointer typing at compile-time. Most C - //users prefer this over stronger typing. User is the king. A - //stronger typed interface is in the works. - typedef void* VC; - typedef void* Expr; - typedef void* Type; - typedef void* WholeCounterExample; -#endif - - // o : optimizations - // c : check counterexample - // p : print counterexample - // h : help - // s : stats - // v : print nodes - - // The "num_absrefine" argument isn't used at all. It's left for compatibility with existing code. - void vc_setFlags(VC vc, char c, int num_absrefine _CVCL_DEFAULT_ARG(0)); - void vc_setFlag(VC vc, char c); - - //! Interface-only flags. - enum ifaceflag_t { - /*! EXPRDELETE: boolean, default true. For objects created by - vc_arrayType, vc_bvType, vc_bv32Type, vc_bvConstExprFromInt, if - this flag is set both at the time the objects are created and at - the time that vc_Destroy is called, vc_Destroy will automatically - delete them. */ - EXPRDELETE, - MS, - SMS, - CMS2, - MSP - - }; - void vc_setInterfaceFlags(VC vc, enum ifaceflag_t f, int param_value); - - // defines division by zero to equal 1, x%0 to equal x. - // avoids division by zero errors. - void make_division_total(VC vc); - - //! Flags can be NULL - VC vc_createValidityChecker(void); - - // Basic types - Type vc_boolType(VC vc); - - //! Create an array type - Type vc_arrayType(VC vc, Type typeIndex, Type typeData); - - ///////////////////////////////////////////////////////////////////////////// - // Expr manipulation methods // - ///////////////////////////////////////////////////////////////////////////// - - //! Create a variable with a given name and type - /*! The type cannot be a function type. The var name can contain - only variables, numerals and underscore. If you use any other - symbol, you will get a segfault. */ - Expr vc_varExpr(VC vc, const char * name, Type type); - - //The var name can contain only variables, numerals and - //underscore. If you use any other symbol, you will get a segfault. - Expr vc_varExpr1(VC vc, const char* name, - int indexwidth, int valuewidth); - - //! Get the expression and type associated with a name. - /*! If there is no such Expr, a NULL Expr is returned. */ - //Expr vc_lookupVar(VC vc, char* name, Type* type); - - //! Get the type of the Expr. - Type vc_getType(VC vc, Expr e); - - int vc_getBVLength(VC vc, Expr e); - - //! Create an equality expression. The two children must have the same type. - Expr vc_eqExpr(VC vc, Expr child0, Expr child1); - - // Boolean expressions - - // The following functions create Boolean expressions. The children - // provided as arguments must be of type Boolean (except for the - // function vc_iteExpr(). In the case of vc_iteExpr() the - // conditional must always be Boolean, but the ifthenpart - // (resp. elsepart) can be bit-vector or Boolean type. But, the - // ifthenpart and elsepart must be both of the same type) - Expr vc_trueExpr(VC vc); - Expr vc_falseExpr(VC vc); - Expr vc_notExpr(VC vc, Expr child); - Expr vc_andExpr(VC vc, Expr left, Expr right); - Expr vc_andExprN(VC vc, Expr* children, int numOfChildNodes); - Expr vc_orExpr(VC vc, Expr left, Expr right); - Expr vc_xorExpr(VC vc, Expr left, Expr right); - Expr vc_orExprN(VC vc, Expr* children, int numOfChildNodes); - Expr vc_impliesExpr(VC vc, Expr hyp, Expr conc); - Expr vc_iffExpr(VC vc, Expr left, Expr right); - //The output type of vc_iteExpr can be Boolean (formula-level ite) - //or bit-vector (word-level ite) - Expr vc_iteExpr(VC vc, Expr conditional, Expr ifthenpart, Expr elsepart); - - //Boolean to single bit BV Expression - Expr vc_boolToBVExpr(VC vc, Expr form); - - //Parameterized Boolean Expression (PARAMBOOL, Boolean_Var, parameter) - Expr vc_paramBoolExpr(VC vc, Expr var, Expr param); - - // Arrays - - //! Create an expression for the value of array at the given index - Expr vc_readExpr(VC vc, Expr array, Expr index); - - //! Array update; equivalent to "array WITH [index] := newValue" - Expr vc_writeExpr(VC vc, Expr array, Expr index, Expr newValue); - - // Expr I/O: Parses directly from file in the c_interface. pretty cool!! - Expr vc_parseExpr(VC vc, const char* s); - - //! Prints 'e' to stdout. - void vc_printExpr(VC vc, Expr e); - - //! Prints 'e' to stdout as C code - void vc_printExprCCode(VC vc, Expr e); - - //! print in smtlib format - char * vc_printSMTLIB(VC vc, Expr e); - - //! Prints 'e' into an open file descriptor 'fd' - void vc_printExprFile(VC vc, Expr e, int fd); - - //! Prints state of 'vc' into malloc'd buffer '*buf' and stores the - // length into '*len'. It is the responsibility of the caller to - // free the buffer. - //void vc_printStateToBuffer(VC vc, char **buf, unsigned long *len); - - //! Prints 'e' to malloc'd buffer '*buf'. Sets '*len' to the length of - // the buffer. It is the responsibility of the caller to free the buffer. - void vc_printExprToBuffer(VC vc, Expr e, char **buf, unsigned long * len); - - //! Prints counterexample to stdout. - void vc_printCounterExample(VC vc); - - //! Prints variable declarations to stdout. - void vc_printVarDecls(VC vc); - - //! Clear the internal list of variables to declare maintained for - // vc_printVarDecls. Do this after you've printed them, or if you - // never want to print them, to prevent a memory leak. - void vc_clearDecls(VC vc); - - //! Prints asserts to stdout. The flag simplify_print must be set to - //"1" if you wish simplification to occur dring printing. It must be - //set to "0" otherwise - void vc_printAsserts(VC vc, int simplify_print _CVCL_DEFAULT_ARG(0)); - - //! Prints the state of the query to malloc'd buffer '*buf' and - //stores ! the length of the buffer to '*len'. It is the - //responsibility of the caller to free the buffer. The flag - //simplify_print must be set to "1" if you wish simplification to - //occur dring printing. It must be set to "0" otherwise - void vc_printQueryStateToBuffer(VC vc, Expr e, - char **buf, unsigned long *len, int simplify_print); - - //! Similar to vc_printQueryStateToBuffer() - void vc_printCounterExampleToBuffer(VC vc, char **buf,unsigned long *len); - - //! Prints query to stdout. - void vc_printQuery(VC vc); - - ///////////////////////////////////////////////////////////////////////////// - // Context-related methods // - ///////////////////////////////////////////////////////////////////////////// - - //! Assert a new formula in the current context. - /*! The formula must have Boolean type. */ - void vc_assertFormula(VC vc, Expr e); - - //! Simplify e with respect to the current context - Expr vc_simplify(VC vc, Expr e); - - //! Check validity of e in the current context. e must be a FORMULA - //returns 0 -> the input is INVALID - //returns 1 -> the input is VALID - //returns 2 -> then ERROR - //returns 3 -> then TIMEOUT - - // NB. The timeout is a soft timeout, use the -g flag for a hard timeout that - // will abort automatically. The soft timeout is checked sometimes in the code, - // and if the time has passed, then "timeout" will be returned. It's only checked - // sometimes though, so the actual timeout may be larger. Cryptominisat doesn't check - // the timeout yet.. - - // The C-language doesn't allow default arguments, so to get it compiling, I've split - // it into two functions. - int vc_query_with_timeout(VC vc, Expr e, int timeout_ms); - int vc_query(VC vc, Expr e); - - - //! Return the counterexample after a failed query. - Expr vc_getCounterExample(VC vc, Expr e); - - //! Return an array from a counterexample after a failed query. - void vc_getCounterExampleArray(VC vc, Expr e, Expr **indices, Expr **values, int *size); - - //! get size of counterexample, i.e. the number of variables/array - //locations in the counterexample. - int vc_counterexample_size(VC vc); - - //! Checkpoint the current context and increase the scope level - void vc_push(VC vc); - - //! Restore the current context to its state at the last checkpoint - void vc_pop(VC vc); - - //! Return an int from a constant bitvector expression - int getBVInt(Expr e); - //! Return an unsigned int from a constant bitvector expression - unsigned int getBVUnsigned(Expr e); - //! Return an unsigned long long int from a constant bitvector expressions - unsigned long long int getBVUnsignedLongLong(Expr e); - - /**************************/ - /* BIT VECTOR OPERATIONS */ - /**************************/ - Type vc_bvType(VC vc, int no_bits); - Type vc_bv32Type(VC vc); - - Expr vc_bvConstExprFromDecStr(VC vc, int width, const char* decimalInput ); - Expr vc_bvConstExprFromStr(VC vc, const char* binary_repr); - Expr vc_bvConstExprFromInt(VC vc, int n_bits, unsigned int value); - Expr vc_bvConstExprFromLL(VC vc, int n_bits, unsigned long long value); - Expr vc_bv32ConstExprFromInt(VC vc, unsigned int value); - - Expr vc_bvConcatExpr(VC vc, Expr left, Expr right); - Expr vc_bvPlusExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bvPlusExprN(VC vc, int n_bits, Expr* children, int numOfChildNodes); - Expr vc_bv32PlusExpr(VC vc, Expr left, Expr right); - Expr vc_bvMinusExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bv32MinusExpr(VC vc, Expr left, Expr right); - Expr vc_bvMultExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bv32MultExpr(VC vc, Expr left, Expr right); - // left divided by right i.e. left/right - Expr vc_bvDivExpr(VC vc, int n_bits, Expr left, Expr right); - // left modulo right i.e. left%right - Expr vc_bvModExpr(VC vc, int n_bits, Expr left, Expr right); - // signed left divided by right i.e. left/right - Expr vc_sbvDivExpr(VC vc, int n_bits, Expr left, Expr right); - // signed left modulo right i.e. left%right - Expr vc_sbvModExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_sbvRemExpr(VC vc, int n_bits, Expr left, Expr right); - - Expr vc_bvLtExpr(VC vc, Expr left, Expr right); - Expr vc_bvLeExpr(VC vc, Expr left, Expr right); - Expr vc_bvGtExpr(VC vc, Expr left, Expr right); - Expr vc_bvGeExpr(VC vc, Expr left, Expr right); - - Expr vc_sbvLtExpr(VC vc, Expr left, Expr right); - Expr vc_sbvLeExpr(VC vc, Expr left, Expr right); - Expr vc_sbvGtExpr(VC vc, Expr left, Expr right); - Expr vc_sbvGeExpr(VC vc, Expr left, Expr right); - - Expr vc_bvUMinusExpr(VC vc, Expr child); - - // bitwise operations: these are terms not formulas - Expr vc_bvAndExpr(VC vc, Expr left, Expr right); - Expr vc_bvOrExpr(VC vc, Expr left, Expr right); - Expr vc_bvXorExpr(VC vc, Expr left, Expr right); - Expr vc_bvNotExpr(VC vc, Expr child); - - // Shift an expression by another expression. This is newstyle. - Expr vc_bvLeftShiftExprExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bvRightShiftExprExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bvSignedRightShiftExprExpr(VC vc, int n_bits, Expr left, Expr right); - - // These shifts are old-style. Kept for compatability---oldstyle. - Expr vc_bvLeftShiftExpr(VC vc, int sh_amt, Expr child); - Expr vc_bvRightShiftExpr(VC vc, int sh_amt, Expr child); - /* Same as vc_bvLeftShift only that the answer in 32 bits long */ - Expr vc_bv32LeftShiftExpr(VC vc, int sh_amt, Expr child); - /* Same as vc_bvRightShift only that the answer in 32 bits long */ - Expr vc_bv32RightShiftExpr(VC vc, int sh_amt, Expr child); - Expr vc_bvVar32LeftShiftExpr(VC vc, Expr sh_amt, Expr child); - Expr vc_bvVar32RightShiftExpr(VC vc, Expr sh_amt, Expr child); - Expr vc_bvVar32DivByPowOfTwoExpr(VC vc, Expr child, Expr rhs); - - Expr vc_bvExtract(VC vc, Expr child, int high_bit_no, int low_bit_no); - - //accepts a bitvector and position, and returns a boolean - //corresponding to that position. More precisely, it return the - //equation (x[bit_no:bit_no] == 0) - Expr vc_bvBoolExtract(VC vc, Expr x, int bit_no); - Expr vc_bvBoolExtract_Zero(VC vc, Expr x, int bit_no); - - //accepts a bitvector and position, and returns a boolean - //corresponding to that position. More precisely, it return the - //equation (x[bit_no:bit_no] == 1) - Expr vc_bvBoolExtract_One(VC vc, Expr x, int bit_no); - Expr vc_bvSignExtend(VC vc, Expr child, int nbits); - - /*C pointer support: C interface to support C memory arrays in CVCL */ - Expr vc_bvCreateMemoryArray(VC vc, const char * arrayName); - Expr vc_bvReadMemoryArray(VC vc, - Expr array, Expr byteIndex, int numOfBytes); - Expr vc_bvWriteToMemoryArray(VC vc, - Expr array, Expr byteIndex, - Expr element, int numOfBytes); - Expr vc_bv32ConstExprFromInt(VC vc, unsigned int value); - - // return a string representation of the Expr e. The caller is responsible - // for deallocating the string with free() - char* exprString(Expr e); - - // return a string representation of the Type t. The caller is responsible - // for deallocating the string with free() - char* typeString(Type t); - - Expr getChild(Expr e, int i); - - //1.if input expr is TRUE then the function returns 1; - // - //2.if input expr is FALSE then function returns 0; - // - //3.otherwise the function returns -1 - int vc_isBool(Expr e); - - /* Register the given error handler to be called for each fatal error.*/ - void vc_registerErrorHandler(void (*error_hdlr)(const char* err_msg)); - - int vc_getHashQueryStateToBuffer(VC vc, Expr query); - - //destroys the STP instance, and removes all the created expressions - void vc_Destroy(VC vc); - - //deletes the expression e - void vc_DeleteExpr(Expr e); - - //Get the whole counterexample from the current context - WholeCounterExample vc_getWholeCounterExample(VC vc); - - //Get the value of a term expression from the CounterExample - Expr vc_getTermFromCounterExample(VC vc, Expr e, WholeCounterExample c); - - - // Free the return value of vc_getWholeCounterExample - void vc_deleteWholeCounterExample(WholeCounterExample cc); - - //Kinds of Expr - enum exprkind_t{ - UNDEFINED, - SYMBOL, - BVCONST, - BVNEG, - BVCONCAT, - BVOR, - BVAND, - BVXOR, - BVNAND, - BVNOR, - BVXNOR, - BVEXTRACT, - BVLEFTSHIFT, - BVRIGHTSHIFT, - BVSRSHIFT, - BVVARSHIFT, - BVPLUS, - BVSUB, - BVUMINUS, - BVMULTINVERSE, - BVMULT, - BVDIV, - BVMOD, - SBVDIV, - SBVREM, - SBVMOD, - BVSX, - BVZX, - ITE, - BVGETBIT, - BVLT, - BVLE, - BVGT, - BVGE, - BVSLT, - BVSLE, - BVSGT, - BVSGE, - EQ, - FALSE, - TRUE, - NOT, - AND, - OR, - NAND, - NOR, - XOR, - IFF, - IMPLIES, - PARAMBOOL, - READ, - WRITE, - ARRAY, - BITVECTOR, - BOOLEAN - } ; - - // type of expression - enum type_t { - BOOLEAN_TYPE = 0, - BITVECTOR_TYPE, - ARRAY_TYPE, - UNKNOWN_TYPE - }; - - // get the kind of the expression - enum exprkind_t getExprKind (Expr e); - - // get the number of children nodes - int getDegree (Expr e); - - // get the bv length - int getBVLength(Expr e); - - // get expression type - enum type_t getType (Expr e); - - // get value bit width - int getVWidth (Expr e); - - // get index bit width - int getIWidth (Expr e); - - // Prints counterexample to an open file descriptor 'fd' - void vc_printCounterExampleFile(VC vc, int fd); - - // get name of expression. must be a variable. - const char* exprName(Expr e); - - // get the node ID of an Expr. - int getExprID (Expr ex); - - // parse the expr from memory string! - int vc_parseMemExpr(VC vc, const char* s, Expr* oquery, Expr* oasserts ); -#ifdef __cplusplus -} -#endif - -#undef _CVCL_DEFAULT_ARG - -#endif - - diff --git a/src/vendor/stp/src/c_interface/fdstream.h b/src/vendor/stp/src/c_interface/fdstream.h deleted file mode 100644 index 0c7bfdfff..000000000 --- a/src/vendor/stp/src/c_interface/fdstream.h +++ /dev/null @@ -1,186 +0,0 @@ -/*! @brief The following code declares classes to read from and write to - * file descriptore or file handles. - * - * See - * http://www.josuttis.com/cppcode - * for details and the latest version. - * - * - open: - * - integrating BUFSIZ on some systems? - * - optimized reading of multiple characters - * - stream for reading AND writing - * - i18n - * - * (C) Copyright Nicolai M. Josuttis 2001. - * Permission to copy, use, modify, sell and distribute this software - * is granted provided this copyright notice appears in all copies. - * This software is provided "as is" without express or implied - * warranty, and with no claim as to its suitability for any purpose. - * - * Version: Jul 28, 2002 - * History: - * Jul 28, 2002: bugfix memcpy() => memmove() - * fdinbuf::underflow(): cast for return statements - * Aug 05, 2001: first public version - */ -#ifndef BOOST_FDSTREAM_HPP -#define BOOST_FDSTREAM_HPP - -#include -#include -#include - - -// for EOF: -#include -// for memmove(): -#include - - -// low-level read and write functions -#ifdef _MSC_VER -# include -#else -# include -//extern "C" { -// int write (int fd, const char* buf, int num); -// int read (int fd, char* buf, int num); -//} -#endif - - -// BEGIN namespace BOOST -namespace std { - - - /************************************************************ - * fdostream - * - a stream that writes on a file descriptor - ************************************************************/ - - - class fdoutbuf : public std::streambuf { - protected: - int fd; // file descriptor - public: - // constructor - fdoutbuf (int _fd) : fd(_fd) { - } - protected: - // write one character - virtual int_type overflow (int_type c) { - if (c != EOF) { - char z = c; - if (write (fd, &z, 1) != 1) { - return EOF; - } - } - return c; - } - // write multiple characters - virtual - std::streamsize xsputn (const char* s, - std::streamsize num) { - return write(fd,s,num); - } - }; - - class fdostream : public std::ostream { - protected: - fdoutbuf buf; - public: - fdostream (int fd) : std::ostream(0), buf(fd) { - rdbuf(&buf); - } - }; - - - /************************************************************ - * fdistream - * - a stream that reads on a file descriptor - ************************************************************/ - - class fdinbuf : public std::streambuf { - protected: - int fd; // file descriptor - protected: - /* data buffer: - * - at most, pbSize characters in putback area plus - * - at most, bufSize characters in ordinary read buffer - */ - static const int pbSize = 4; // size of putback area - static const int bufSize = 1024; // size of the data buffer - char buffer[bufSize+pbSize]; // data buffer - - public: - /* constructor - * - initialize file descriptor - * - initialize empty data buffer - * - no putback area - * => force underflow() - */ - fdinbuf (int _fd) : fd(_fd) { - setg (buffer+pbSize, // beginning of putback area - buffer+pbSize, // read position - buffer+pbSize); // end position - } - - protected: - // insert new characters into the buffer - virtual int_type underflow () { -#ifndef _MSC_VER - using std::memmove; -#endif - - // is read position before end of buffer? - if (gptr() < egptr()) { - return traits_type::to_int_type(*gptr()); - } - - /* process size of putback area - * - use number of characters read - * - but at most size of putback area - */ - int numPutback; - numPutback = gptr() - eback(); - if (numPutback > pbSize) { - numPutback = pbSize; - } - - /* copy up to pbSize characters previously read into - * the putback area - */ - memmove (buffer+(pbSize-numPutback), gptr()-numPutback, - numPutback); - - // read at most bufSize new characters - int num; - num = read (fd, buffer+pbSize, bufSize); - if (num <= 0) { - // ERROR or EOF - return EOF; - } - - // reset buffer pointers - setg (buffer+(pbSize-numPutback), // beginning of putback area - buffer+pbSize, // read position - buffer+pbSize+num); // end of buffer - - // return next character - return traits_type::to_int_type(*gptr()); - } - }; - - class fdistream : public std::istream { - protected: - fdinbuf buf; - public: - fdistream (int fd) : std::istream(0), buf(fd) { - rdbuf(&buf); - } - }; - - -} // END namespace boost - -#endif /*BOOST_FDSTREAM_HPP*/ diff --git a/src/vendor/stp/src/cpp_interface/Makefile b/src/vendor/stp/src/cpp_interface/Makefile deleted file mode 100644 index a6216e90f..000000000 --- a/src/vendor/stp/src/cpp_interface/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -OBJS = $(SRCS:.cpp=.o) - - -libcppinterface.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend - diff --git a/src/vendor/stp/src/cpp_interface/cpp_interface.cpp b/src/vendor/stp/src/cpp_interface/cpp_interface.cpp deleted file mode 100644 index c96a8b203..000000000 --- a/src/vendor/stp/src/cpp_interface/cpp_interface.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "cpp_interface.h" - -namespace BEEV -{ - // Does some simple caching of prior results. - void - Cpp_interface::checkSat(const ASTVec & assertionsSMT2) - { - if (ignoreCheckSatRequest) - return; - - bm.GetRunTimes()->stop(RunTimes::Parsing); - - checkInvariant(); - assert(assertionsSMT2.size() == cache.size()); - - Entry& last_run = cache.back(); - if ((last_run.node_number != assertionsSMT2.back().GetNodeNum()) && (last_run.result == SOLVER_SATISFIABLE)) - { - // extra asserts might have been added to it, - // flipping from sat to unsat. But never from unsat to sat. - last_run.result = SOLVER_UNDECIDED; - } - - // We might have run this query before, or it might already be shown to be unsat. If it was sat, - // we've stored the result (but not the model), so we can shortcut and return what we know. - if (!((last_run.result == SOLVER_SATISFIABLE) || last_run.result == SOLVER_UNSATISFIABLE)) - { - resetSolver(); - - ASTNode query; - - if (assertionsSMT2.size() > 1) - query = nf->CreateNode(AND, assertionsSMT2); - else if (assertionsSMT2.size() == 1) - query = assertionsSMT2[0]; - else - query = bm.ASTTrue; - - SOLVER_RETURN_TYPE last_result = GlobalSTP->TopLevelSTP(query, bm.ASTFalse); - - // Store away the answer. Might be timeout, or error though.. - last_run = Entry(last_result); - last_run.node_number = assertionsSMT2.back().GetNodeNum(); - - // It's satisfiable, so everything beneath it is satisfiable too. - if (last_result == SOLVER_SATISFIABLE) - { - for (int i = 0; i < cache.size(); i++) - { - assert(cache[i].result != SOLVER_UNSATISFIABLE); - cache[i].result = SOLVER_SATISFIABLE; - } - } - } - - if (bm.UserFlags.quick_statistics_flag) - { - bm.GetRunTimes()->print(); - } - - (GlobalSTP->tosat)->PrintOutput(last_run.result); - bm.GetRunTimes()->start(RunTimes::Parsing); - } -} -; diff --git a/src/vendor/stp/src/cpp_interface/cpp_interface.h b/src/vendor/stp/src/cpp_interface/cpp_interface.h deleted file mode 100644 index b3a891b89..000000000 --- a/src/vendor/stp/src/cpp_interface/cpp_interface.h +++ /dev/null @@ -1,339 +0,0 @@ -#ifndef CPP_INTERFACE_H_ -#define CPP_INTERFACE_H_ - -#include "../AST/AST.h" -#include "../AST/NodeFactory/NodeFactory.h" -#include -#include "../parser/LetMgr.h" -#include "../STPManager/STPManager.h" -#include "../STPManager/STP.h" -//#include "../boost/pool/object_pool.hpp" - -namespace BEEV -{ - using BEEV::STPMgr; - -// There's no BVTypeCheck() function. Use a typechecking node factory instead. - - class Cpp_interface - { - STPMgr& bm; - //boost::object_pool node_pool; - bool alreadyWarned; - bool print_success; - bool ignoreCheckSatRequest; - - // Used to cache prior queries. - struct Entry - { - explicit - Entry(SOLVER_RETURN_TYPE result_) - { - result = result_; - node_number = -1; - } - - SOLVER_RETURN_TYPE result; - int node_number; // a weak pointer. - - void - print() - { - if (result == SOLVER_UNSATISFIABLE) - cerr << "u"; - else if (result == SOLVER_SATISFIABLE) - cerr << "s"; - else if (result == SOLVER_UNDECIDED) - cerr << "?"; - } - }; - vector cache; - vector > symbols; - - void checkInvariant() - { - assert(bm.getAssertLevel() == cache.size()); - assert(bm.getAssertLevel() == symbols.size()); - } - - public: - LETMgr letMgr; - NodeFactory* nf; - - Cpp_interface(STPMgr &bm_, NodeFactory* factory) : - bm(bm_), nf(factory), letMgr(bm.ASTUndefined) - { - assert(nf != NULL); - alreadyWarned = false; - - cache.push_back(Entry(SOLVER_UNDECIDED)); - symbols.push_back(ASTVec()); - - if (bm.getVectorOfAsserts().size() ==0) - bm.Push(); - - print_success = false; - ignoreCheckSatRequest=false; - } - - void - startup() - { - CONSTANTBV::ErrCode c = CONSTANTBV::BitVector_Boot(); - if(0 != c) { - cout << CONSTANTBV::BitVector_Error(c) << endl; - FatalError("Bad startup"); - } - } - - const ASTVec - GetAsserts(void) - { - return bm.GetAsserts(); - } - - const ASTVec - getAssertVector(void) - { - return bm.getVectorOfAsserts(); - } - - UserDefinedFlags& - getUserFlags() - { - return bm.UserFlags; - } - - void - AddAssert(const ASTNode& assert) - { - bm.AddAssert(assert); - } - - void - AddQuery(const ASTNode& q) - { - bm.AddQuery(q); - } - - //NODES// - ASTNode - CreateNode(BEEV::Kind kind, const BEEV::ASTVec& children = _empty_ASTVec) - { - return nf->CreateNode(kind, children); - } - - ASTNode - CreateNode(BEEV::Kind kind, const BEEV::ASTNode n0, const BEEV::ASTNode n1) - { - if (n0.GetIndexWidth() > 0 && !alreadyWarned) - { - cerr << "Warning: Parsing a term that uses array extensionality. STP doesn't handle array extensionality." - << endl; - alreadyWarned = true; - } - return nf->CreateNode(kind, n0, n1); - } - - // These belong in the node factory.. - - //TERMS// - ASTNode - CreateZeroConst(unsigned int width) - { - return bm.CreateZeroConst(width); - } - - ASTNode - CreateOneConst(unsigned int width) - { - return bm.CreateOneConst(width); - } - - ASTNode - CreateBVConst(string& strval, int base, int bit_width) - { - return bm.CreateBVConst(strval, base, bit_width); - } - - ASTNode - CreateBVConst(const char* const strval, int base) - { - return bm.CreateBVConst(strval, base); - } - - ASTNode - CreateBVConst(unsigned int width, unsigned long long int bvconst) - { - return bm.CreateBVConst(width, bvconst); - } - - ASTNode - LookupOrCreateSymbol(const char * const name) - { - return bm.LookupOrCreateSymbol(name); - } - - ASTNode - LookupOrCreateSymbol(string name) - { - return bm.LookupOrCreateSymbol(name.c_str()); - } - - bool - LookupSymbol(const char * const name, ASTNode& output) - { - return bm.LookupSymbol(name, output); - } - - bool - isSymbolAlreadyDeclared(char* name) - { - return bm.LookupSymbol(name); - } - - void - setPrintSuccess(bool ps) - { - print_success = ps; - } - - bool - isSymbolAlreadyDeclared(string name) - { - return bm.LookupSymbol(name.c_str()); - } - - // Create the node, then "new" it. - ASTNode * - newNode(const Kind k, const ASTNode& n0, const ASTNode& n1) - { - return newNode(CreateNode(k, n0, n1)); - } - - // Create the node, then "new" it. - ASTNode * - newNode(const Kind k, const int width, const ASTNode& n0, const ASTNode& n1) - { - return newNode(nf->CreateTerm(k, width, n0, n1)); - } - - // On testcase20 it took about 4.2 seconds to parse using the standard allocator and the pool allocator. - ASTNode * - newNode(const ASTNode& copyIn) - { - return new ASTNode(copyIn); - //return node_pool.construct(copyIn); - } - - void - deleteNode(ASTNode *n) - { - delete n; - //node_pool.destroy(n); - } - - void - addSymbol(ASTNode &s) - { - symbols.back().push_back(s); - letMgr._parser_symbol_table.insert(s); - } - - void - success() - { - if (print_success) - { - cout << "success" << endl; - flush(cout); - } - } - - // Resets the tables used by STP, but keeps all the nodes that have been created. - void - resetSolver() - { - bm.ClearAllTables(); - GlobalSTP->ClearAllTables(); - } - - // We can't pop off the zeroeth level. - void popToFirstLevel() - { - while (symbols.size() > 1) - pop(); - - // I don't understand why this is required. - while(bm.getAssertLevel() > 0) - bm.Pop(); - } - - void - pop() - { - if (symbols.size() == 0) - FatalError("Popping from an empty stack."); - if (symbols.size() == 1) - FatalError("Can't pop away the default base element."); - - bm.Pop(); - - // These tables might hold references to symbols that have been - // removed. - resetSolver(); - - cache.erase(cache.end() - 1); - ASTVec & current = symbols.back(); - for (int i = 0; i < current.size(); i++) - letMgr._parser_symbol_table.erase(current[i]); - symbols.erase(symbols.end() - 1); - checkInvariant(); - } - - void - push() - { - // If the prior one is unsatisiable then the new one will be too. - if (cache.size() > 1 && cache.back().result == SOLVER_UNSATISFIABLE) - cache.push_back(Entry(SOLVER_UNSATISFIABLE)); - else - cache.push_back(Entry(SOLVER_UNDECIDED)); - - bm.Push(); - symbols.push_back(ASTVec()); - - checkInvariant(); - } - - // Useful when printing back, so that you can parse, but ignore the request. - void - ignoreCheckSat() - { - ignoreCheckSatRequest= true; - } - - void - printStatus() - { - for (int i = 0; i < cache.size(); i++) - { - cache[i].print(); - } - cerr << endl; - } - - void - checkSat(const ASTVec & assertionsSMT2); - - void - cleanUp() - { - letMgr.cleanupParserSymbolTable(); - cache.clear(); - symbols.clear(); - } - }; -} - -#endif diff --git a/src/vendor/stp/src/extlib-abc/Makefile b/src/vendor/stp/src/extlib-abc/Makefile deleted file mode 100644 index 1b36406e6..000000000 --- a/src/vendor/stp/src/extlib-abc/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard aig/*/*.c) -OBJS = $(SRCS:.c=.o) -CFLAGS += -I. - - -libabc.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) $(OBJS) *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend diff --git a/src/vendor/stp/src/extlib-abc/aig.h b/src/vendor/stp/src/extlib-abc/aig.h deleted file mode 100644 index e1c871e64..000000000 --- a/src/vendor/stp/src/extlib-abc/aig.h +++ /dev/null @@ -1,553 +0,0 @@ -/**CFile**************************************************************** - - FileName [aig.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [External declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aig.h,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __AIG_H__ -#define __AIG_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -#include "vec.h" - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Aig_Man_t_ Aig_Man_t; -typedef struct Aig_Obj_t_ Aig_Obj_t; -typedef struct Aig_MmFixed_t_ Aig_MmFixed_t; -typedef struct Aig_MmFlex_t_ Aig_MmFlex_t; -typedef struct Aig_MmStep_t_ Aig_MmStep_t; -typedef struct Aig_TMan_t_ Aig_TMan_t; - -// object types -typedef enum { - AIG_OBJ_NONE, // 0: non-existent object - AIG_OBJ_CONST1, // 1: constant 1 - AIG_OBJ_PI, // 2: primary input - AIG_OBJ_PO, // 3: primary output - AIG_OBJ_BUF, // 4: buffer node - AIG_OBJ_AND, // 5: AND node - AIG_OBJ_EXOR, // 6: EXOR node - AIG_OBJ_LATCH, // 7: latch - AIG_OBJ_VOID // 8: unused object -} Aig_Type_t; - -// the AIG node -struct Aig_Obj_t_ // 8 words -{ - Aig_Obj_t * pNext; // strashing table - Aig_Obj_t * pFanin0; // fanin - Aig_Obj_t * pFanin1; // fanin - unsigned int Type : 3; // object type - unsigned int fPhase : 1; // value under 000...0 pattern - unsigned int fMarkA : 1; // multipurpose mask - unsigned int fMarkB : 1; // multipurpose mask - unsigned int nRefs : 26; // reference count - unsigned Level : 24; // the level of this node - unsigned nCuts : 8; // the number of cuts - int TravId; // unique ID of last traversal involving the node - int Id; // unique ID of the node - union { // temporary store for user's data - void * pData; - int iData; - float dData; - }; -}; - -// the AIG manager -struct Aig_Man_t_ -{ - char * pName; // the design name - // AIG nodes - Vec_Ptr_t * vPis; // the array of PIs - Vec_Ptr_t * vPos; // the array of POs - Vec_Ptr_t * vObjs; // the array of all nodes (optional) - Vec_Ptr_t * vBufs; // the array of buffers - Aig_Obj_t * pConst1; // the constant 1 node - Aig_Obj_t Ghost; // the ghost node - int nRegs; // the number of registers (registers are last POs) - int nAsserts; // the number of asserts among POs (asserts are first POs) - // AIG node counters - int nObjs[AIG_OBJ_VOID];// the number of objects by type - int nCreated; // the number of created objects - int nDeleted; // the number of deleted objects - // structural hash table - Aig_Obj_t ** pTable; // structural hash table - int nTableSize; // structural hash table size - // representation of fanouts - int * pFanData; // the database to store fanout information - int nFansAlloc; // the size of fanout representation - Vec_Vec_t * vLevels; // used to update timing information - int nBufReplaces; // the number of times replacement led to a buffer - int nBufFixes; // the number of times buffers were propagated - int nBufMax; // the maximum number of buffers during computation - // topological order - unsigned * pOrderData; - int nOrderAlloc; - int iPrev; - int iNext; - int nAndTotal; - int nAndPrev; - // representatives - Aig_Obj_t ** pEquivs; // linked list of equivalent nodes (when choices are used) - Aig_Obj_t ** pReprs; // representatives of each node - int nReprsAlloc; // the number of allocated representatives - // various data members - Aig_MmFixed_t * pMemObjs; // memory manager for objects - Vec_Int_t * vLevelR; // the reverse level of the nodes - int nLevelMax; // maximum number of levels - void * pData; // the temporary data - int nTravIds; // the current traversal ID - int fCatchExor; // enables EXOR nodes - int fAddStrash; // performs additional strashing - Aig_Obj_t ** pObjCopies; // mapping of AIG nodes into FRAIG nodes - void (*pImpFunc) (void*, void*); // implication checking precedure - void * pImpData; // implication checking data - Aig_TMan_t * pManTime; // the timing manager - Vec_Ptr_t * vMapped; - Vec_Int_t * vFlopNums; - // timing statistics - int time1; - int time2; -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -#define AIG_MIN(a,b) (((a) < (b))? (a) : (b)) -#define AIG_MAX(a,b) (((a) > (b))? (a) : (b)) -#define AIG_ABS(a) (((a) >= 0)? (a) :-(a)) -#define AIG_INFINITY (100000000) - -#ifndef PRT -#define PRT(a,t) printf("%s = ", (a)); printf("%6.2f sec\n", (float)(t)/(float)(CLOCKS_PER_SEC)) -#endif - -static inline int Aig_Base2Log( unsigned n ) { int r; assert( n >= 0 ); if ( n < 2 ) return n; for ( r = 0, n--; n; n >>= 1, r++ ); return r; } -static inline int Aig_Base10Log( unsigned n ) { int r; assert( n >= 0 ); if ( n < 2 ) return n; for ( r = 0, n--; n; n /= 10, r++ ); return r; } -static inline char * Aig_UtilStrsav( char * s ) { return s ? strcpy(ALLOC(char, strlen(s)+1), s) : NULL; } -static inline int Aig_BitWordNum( int nBits ) { return (nBits>>5) + ((nBits&31) > 0); } -static inline int Aig_TruthWordNum( int nVars ) { return nVars <= 5 ? 1 : (1 << (nVars - 5)); } -static inline int Aig_InfoHasBit( unsigned * p, int i ) { return (p[(i)>>5] & (1<<((i) & 31))) > 0; } -static inline void Aig_InfoSetBit( unsigned * p, int i ) { p[(i)>>5] |= (1<<((i) & 31)); } -static inline void Aig_InfoXorBit( unsigned * p, int i ) { p[(i)>>5] ^= (1<<((i) & 31)); } -static inline unsigned Aig_InfoMask( int nVar ) { return (~(unsigned)0) >> (32-nVar); } -static inline unsigned Aig_ObjCutSign( unsigned ObjId ) { return (1 << (ObjId & 31)); } -static inline int Aig_WordCountOnes( unsigned uWord ) -{ - uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555); - uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333); - uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F); - uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF); - return (uWord & 0x0000FFFF) + (uWord>>16); -} - -static inline Aig_Obj_t * Aig_Regular( Aig_Obj_t * p ) { return (Aig_Obj_t *)((unsigned long)(p) & ~01); } -static inline Aig_Obj_t * Aig_Not( Aig_Obj_t * p ) { return (Aig_Obj_t *)((unsigned long)(p) ^ 01); } -static inline Aig_Obj_t * Aig_NotCond( Aig_Obj_t * p, int c ) { return (Aig_Obj_t *)((unsigned long)(p) ^ (c)); } -static inline int Aig_IsComplement( Aig_Obj_t * p ) { return (int )(((unsigned long)p) & 01); } - -static inline int Aig_ManPiNum( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_PI]; } -static inline int Aig_ManPoNum( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_PO]; } -static inline int Aig_ManBufNum( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_BUF]; } -static inline int Aig_ManAndNum( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_AND]; } -static inline int Aig_ManExorNum( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_EXOR]; } -static inline int Aig_ManLatchNum( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_LATCH]; } -static inline int Aig_ManNodeNum( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_AND]+p->nObjs[AIG_OBJ_EXOR]; } -static inline int Aig_ManGetCost( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_AND]+3*p->nObjs[AIG_OBJ_EXOR]; } -static inline int Aig_ManObjNum( Aig_Man_t * p ) { return p->nCreated - p->nDeleted; } -static inline int Aig_ManObjNumMax( Aig_Man_t * p ) { return Vec_PtrSize(p->vObjs); } -static inline int Aig_ManRegNum( Aig_Man_t * p ) { return p->nRegs; } - -static inline Aig_Obj_t * Aig_ManConst0( Aig_Man_t * p ) { return Aig_Not(p->pConst1); } -static inline Aig_Obj_t * Aig_ManConst1( Aig_Man_t * p ) { return p->pConst1; } -static inline Aig_Obj_t * Aig_ManGhost( Aig_Man_t * p ) { return &p->Ghost; } -static inline Aig_Obj_t * Aig_ManPi( Aig_Man_t * p, int i ) { return (Aig_Obj_t *)Vec_PtrEntry(p->vPis, i); } -static inline Aig_Obj_t * Aig_ManPo( Aig_Man_t * p, int i ) { return (Aig_Obj_t *)Vec_PtrEntry(p->vPos, i); } -static inline Aig_Obj_t * Aig_ManLo( Aig_Man_t * p, int i ) { return (Aig_Obj_t *)Vec_PtrEntry(p->vPis, Aig_ManPiNum(p)-Aig_ManRegNum(p)+i); } -static inline Aig_Obj_t * Aig_ManLi( Aig_Man_t * p, int i ) { return (Aig_Obj_t *)Vec_PtrEntry(p->vPos, Aig_ManPoNum(p)-Aig_ManRegNum(p)+i); } -static inline Aig_Obj_t * Aig_ManObj( Aig_Man_t * p, int i ) { return p->vObjs ? (Aig_Obj_t *)Vec_PtrEntry(p->vObjs, i) : NULL; } - -static inline Aig_Type_t Aig_ObjType( Aig_Obj_t * pObj ) { return (Aig_Type_t)pObj->Type; } -static inline int Aig_ObjIsNone( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_NONE; } -static inline int Aig_ObjIsConst1( Aig_Obj_t * pObj ) { assert(!Aig_IsComplement(pObj)); return pObj->Type == AIG_OBJ_CONST1; } -static inline int Aig_ObjIsPi( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_PI; } -static inline int Aig_ObjIsPo( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_PO; } -static inline int Aig_ObjIsBuf( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_BUF; } -static inline int Aig_ObjIsAnd( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_AND; } -static inline int Aig_ObjIsExor( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_EXOR; } -static inline int Aig_ObjIsLatch( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_LATCH; } -static inline int Aig_ObjIsNode( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_AND || pObj->Type == AIG_OBJ_EXOR; } -static inline int Aig_ObjIsTerm( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_PI || pObj->Type == AIG_OBJ_PO || pObj->Type == AIG_OBJ_CONST1; } -static inline int Aig_ObjIsHash( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_AND || pObj->Type == AIG_OBJ_EXOR || pObj->Type == AIG_OBJ_LATCH; } -static inline int Aig_ObjIsChoice( Aig_Man_t * p, Aig_Obj_t * pObj ) { return p->pEquivs && p->pEquivs[pObj->Id] && pObj->nRefs > 0; } - -static inline int Aig_ObjIsMarkA( Aig_Obj_t * pObj ) { return pObj->fMarkA; } -static inline void Aig_ObjSetMarkA( Aig_Obj_t * pObj ) { pObj->fMarkA = 1; } -static inline void Aig_ObjClearMarkA( Aig_Obj_t * pObj ) { pObj->fMarkA = 0; } - -static inline void Aig_ObjSetTravId( Aig_Obj_t * pObj, int TravId ) { pObj->TravId = TravId; } -static inline void Aig_ObjSetTravIdCurrent( Aig_Man_t * p, Aig_Obj_t * pObj ) { pObj->TravId = p->nTravIds; } -static inline void Aig_ObjSetTravIdPrevious( Aig_Man_t * p, Aig_Obj_t * pObj ) { pObj->TravId = p->nTravIds - 1; } -static inline int Aig_ObjIsTravIdCurrent( Aig_Man_t * p, Aig_Obj_t * pObj ) { return (int)(pObj->TravId == p->nTravIds); } -static inline int Aig_ObjIsTravIdPrevious( Aig_Man_t * p, Aig_Obj_t * pObj ) { return (int)(pObj->TravId == p->nTravIds - 1); } - -static inline int Aig_ObjPhase( Aig_Obj_t * pObj ) { return pObj->fPhase; } -static inline int Aig_ObjPhaseReal( Aig_Obj_t * pObj ) { return pObj? Aig_Regular(pObj)->fPhase ^ Aig_IsComplement(pObj) : 1; } -static inline int Aig_ObjRefs( Aig_Obj_t * pObj ) { return pObj->nRefs; } -static inline void Aig_ObjRef( Aig_Obj_t * pObj ) { pObj->nRefs++; } -static inline void Aig_ObjDeref( Aig_Obj_t * pObj ) { assert( pObj->nRefs > 0 ); pObj->nRefs--; } -static inline void Aig_ObjClearRef( Aig_Obj_t * pObj ) { pObj->nRefs = 0; } -static inline int Aig_ObjFaninId0( Aig_Obj_t * pObj ) { return pObj->pFanin0? Aig_Regular(pObj->pFanin0)->Id : -1; } -static inline int Aig_ObjFaninId1( Aig_Obj_t * pObj ) { return pObj->pFanin1? Aig_Regular(pObj->pFanin1)->Id : -1; } -static inline int Aig_ObjFaninC0( Aig_Obj_t * pObj ) { return Aig_IsComplement(pObj->pFanin0); } -static inline int Aig_ObjFaninC1( Aig_Obj_t * pObj ) { return Aig_IsComplement(pObj->pFanin1); } -static inline Aig_Obj_t * Aig_ObjFanin0( Aig_Obj_t * pObj ) { return Aig_Regular(pObj->pFanin0); } -static inline Aig_Obj_t * Aig_ObjFanin1( Aig_Obj_t * pObj ) { return Aig_Regular(pObj->pFanin1); } -static inline Aig_Obj_t * Aig_ObjChild0( Aig_Obj_t * pObj ) { return pObj->pFanin0; } -static inline Aig_Obj_t * Aig_ObjChild1( Aig_Obj_t * pObj ) { return pObj->pFanin1; } -static inline Aig_Obj_t * Aig_ObjChild0Copy( Aig_Obj_t * pObj ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin0(pObj)? Aig_NotCond((Aig_Obj_t *)Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj)) : NULL; } -static inline Aig_Obj_t * Aig_ObjChild1Copy( Aig_Obj_t * pObj ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin1(pObj)? Aig_NotCond((Aig_Obj_t *)Aig_ObjFanin1(pObj)->pData, Aig_ObjFaninC1(pObj)) : NULL; } -static inline int Aig_ObjLevel( Aig_Obj_t * pObj ) { return pObj->Level; } -static inline int Aig_ObjLevelNew( Aig_Obj_t * pObj ) { return Aig_ObjFanin1(pObj)? 1 + Aig_ObjIsExor(pObj) + AIG_MAX(Aig_ObjFanin0(pObj)->Level, Aig_ObjFanin1(pObj)->Level) : Aig_ObjFanin0(pObj)->Level; } -static inline void Aig_ObjClean( Aig_Obj_t * pObj ) { memset( pObj, 0, sizeof(Aig_Obj_t) ); } -static inline Aig_Obj_t * Aig_ObjFanout0( Aig_Man_t * p, Aig_Obj_t * pObj ) { assert(p->pFanData && pObj->Id < p->nFansAlloc); return Aig_ManObj(p, p->pFanData[5*pObj->Id] >> 1); } -static inline Aig_Obj_t * Aig_ObjEquiv( Aig_Man_t * p, Aig_Obj_t * pObj ) { return p->pEquivs? p->pEquivs[pObj->Id] : NULL; } -static inline int Aig_ObjWhatFanin( Aig_Obj_t * pObj, Aig_Obj_t * pFanin ) -{ - if ( Aig_ObjFanin0(pObj) == pFanin ) return 0; - if ( Aig_ObjFanin1(pObj) == pFanin ) return 1; - assert(0); return -1; -} -static inline int Aig_ObjFanoutC( Aig_Obj_t * pObj, Aig_Obj_t * pFanout ) -{ - if ( Aig_ObjFanin0(pFanout) == pObj ) return Aig_ObjFaninC0(pObj); - if ( Aig_ObjFanin1(pFanout) == pObj ) return Aig_ObjFaninC1(pObj); - assert(0); return -1; -} - -// create the ghost of the new node -static inline Aig_Obj_t * Aig_ObjCreateGhost( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1, Aig_Type_t Type ) -{ - Aig_Obj_t * pGhost; - assert( Type != AIG_OBJ_AND || !Aig_ObjIsConst1(Aig_Regular(p0)) ); - assert( p1 == NULL || !Aig_ObjIsConst1(Aig_Regular(p1)) ); - assert( Type == AIG_OBJ_PI || Aig_Regular(p0) != Aig_Regular(p1) ); - pGhost = Aig_ManGhost(p); - pGhost->Type = Type; - if ( p1 == NULL || Aig_Regular(p0)->Id < Aig_Regular(p1)->Id ) - { - pGhost->pFanin0 = p0; - pGhost->pFanin1 = p1; - } - else - { - pGhost->pFanin0 = p1; - pGhost->pFanin1 = p0; - } - return pGhost; -} - -// internal memory manager -static inline Aig_Obj_t * Aig_ManFetchMemory( Aig_Man_t * p ) -{ - extern char * Aig_MmFixedEntryFetch( Aig_MmFixed_t * p ); - Aig_Obj_t * pTemp; - pTemp = (Aig_Obj_t *)Aig_MmFixedEntryFetch( p->pMemObjs ); - memset( pTemp, 0, sizeof(Aig_Obj_t) ); - Vec_PtrPush( p->vObjs, pTemp ); - pTemp->Id = p->nCreated++; - return pTemp; -} -static inline void Aig_ManRecycleMemory( Aig_Man_t * p, Aig_Obj_t * pEntry ) -{ - extern void Aig_MmFixedEntryRecycle( Aig_MmFixed_t * p, char * pEntry ); - assert( pEntry->nRefs == 0 ); - pEntry->Type = AIG_OBJ_NONE; // distinquishes a dead node from a live node - Aig_MmFixedEntryRecycle( p->pMemObjs, (char *)pEntry ); - p->nDeleted++; -} - - -//////////////////////////////////////////////////////////////////////// -/// ITERATORS /// -//////////////////////////////////////////////////////////////////////// - -// iterator over the primary inputs -#define Aig_ManForEachPi( p, pObj, i ) \ - Vec_PtrForEachEntry( p->vPis, pObj, i ) -// iterator over the primary outputs -#define Aig_ManForEachPo( p, pObj, i ) \ - Vec_PtrForEachEntry( p->vPos, pObj, i ) -// iterator over the assertions -#define Aig_ManForEachAssert( p, pObj, i ) \ - Vec_PtrForEachEntryStart( p->vPos, pObj, i, Aig_ManPoNum(p)-p->nAsserts ) -// iterator over all objects, including those currently not used -#define Aig_ManForEachObj( p, pObj, i ) \ - Vec_PtrForEachEntry( p->vObjs, pObj, i ) if ( (pObj) == NULL ) {} else -// iterator over all nodes -#define Aig_ManForEachNode( p, pObj, i ) \ - Vec_PtrForEachEntry( p->vObjs, pObj, i ) if ( (pObj) == NULL || !Aig_ObjIsNode(pObj) ) {} else -// iterator over the nodes whose IDs are stored in the array -#define Aig_ManForEachNodeVec( p, vIds, pObj, i ) \ - for ( i = 0; i < Vec_IntSize(vIds) && ((pObj) = Aig_ManObj(p, Vec_IntEntry(vIds,i))); i++ ) -// iterator over the nodes in the topological order -#define Aig_ManForEachNodeInOrder( p, pObj ) \ - for ( assert(p->pOrderData), p->iPrev = 0, p->iNext = p->pOrderData[1]; \ - p->iNext && (((pObj) = Aig_ManObj(p, p->iNext)), 1); \ - p->iNext = p->pOrderData[2*p->iPrev+1] ) - -// these two procedures are only here for the use inside the iterator -static inline int Aig_ObjFanout0Int( Aig_Man_t * p, int ObjId ) { assert(ObjId < p->nFansAlloc); return p->pFanData[5*ObjId]; } -static inline int Aig_ObjFanoutNext( Aig_Man_t * p, int iFan ) { assert(iFan/2 < p->nFansAlloc); return p->pFanData[5*(iFan >> 1) + 3 + (iFan & 1)]; } -// iterator over the fanouts -#define Aig_ObjForEachFanout( p, pObj, pFanout, iFan, i ) \ - for ( assert(p->pFanData), i = 0; (i < (int)(pObj)->nRefs) && \ - (((iFan) = i? Aig_ObjFanoutNext(p, iFan) : Aig_ObjFanout0Int(p, pObj->Id)), 1) && \ - (((pFanout) = Aig_ManObj(p, iFan>>1)), 1); i++ ) - - -//////////////////////////////////////////////////////////////////////// -/// SEQUENTIAL ITERATORS /// -//////////////////////////////////////////////////////////////////////// - -// iterator over the primary inputs -#define Aig_ManForEachPiSeq( p, pObj, i ) \ - Vec_PtrForEachEntryStop( p->vPis, pObj, i, Aig_ManPiNum(p)-Aig_ManRegNum(p) ) -// iterator over the latch outputs -#define Aig_ManForEachLoSeq( p, pObj, i ) \ - Vec_PtrForEachEntryStart( p->vPis, pObj, i, Aig_ManPiNum(p)-Aig_ManRegNum(p) ) -// iterator over the primary outputs -#define Aig_ManForEachPoSeq( p, pObj, i ) \ - Vec_PtrForEachEntryStop( p->vPos, pObj, i, Aig_ManPoNum(p)-Aig_ManRegNum(p) ) -// iterator over the latch inputs -#define Aig_ManForEachLiSeq( p, pObj, i ) \ - Vec_PtrForEachEntryStart( p->vPos, pObj, i, Aig_ManPoNum(p)-Aig_ManRegNum(p) ) -// iterator over the latch input and outputs -#define Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, k ) \ - for ( k = 0; (k < Aig_ManRegNum(p)) && (((pObjLi) = Aig_ManLi(p, k)), 1) \ - && (((pObjLo)=Aig_ManLo(p, k)), 1); k++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -/*=== aigCheck.c ========================================================*/ -extern int Aig_ManCheck( Aig_Man_t * p ); -extern void Aig_ManCheckMarkA( Aig_Man_t * p ); -extern void Aig_ManCheckPhase( Aig_Man_t * p ); -/*=== aigDfs.c ==========================================================*/ -extern Vec_Ptr_t * Aig_ManDfs( Aig_Man_t * p ); -extern Vec_Ptr_t * Aig_ManDfsNodes( Aig_Man_t * p, Aig_Obj_t ** ppNodes, int nNodes ); -extern Vec_Ptr_t * Aig_ManDfsChoices( Aig_Man_t * p ); -extern Vec_Ptr_t * Aig_ManDfsReverse( Aig_Man_t * p ); -extern int Aig_ManLevelNum( Aig_Man_t * p ); -extern int Aig_ManCountLevels( Aig_Man_t * p ); -extern int Aig_DagSize( Aig_Obj_t * pObj ); -extern int Aig_SupportSize( Aig_Man_t * p, Aig_Obj_t * pObj ); -extern void Aig_ConeUnmark_rec( Aig_Obj_t * pObj ); -extern Aig_Obj_t * Aig_Transfer( Aig_Man_t * pSour, Aig_Man_t * pDest, Aig_Obj_t * pObj, int nVars ); -extern Aig_Obj_t * Aig_Compose( Aig_Man_t * p, Aig_Obj_t * pRoot, Aig_Obj_t * pFunc, int iVar ); -extern void Aig_ObjCollectCut( Aig_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vNodes ); -extern int Aig_ObjCollectSuper( Aig_Obj_t * pObj, Vec_Ptr_t * vSuper ); -/*=== aigFanout.c ==========================================================*/ -extern void Aig_ObjAddFanout( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFanout ); -extern void Aig_ObjRemoveFanout( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFanout ); -extern void Aig_ManFanoutStart( Aig_Man_t * p ); -extern void Aig_ManFanoutStop( Aig_Man_t * p ); -/*=== aigMan.c ==========================================================*/ -extern Aig_Man_t * Aig_ManStart( int nNodesMax ); -extern Aig_Man_t * Aig_ManStartFrom( Aig_Man_t * p ); -extern Aig_Obj_t * Aig_ManDup_rec( Aig_Man_t * pNew, Aig_Man_t * p, Aig_Obj_t * pObj ); -extern Aig_Man_t * Aig_ManDup( Aig_Man_t * p, int fOrdered ); -extern Aig_Man_t * Aig_ManExtractMiter( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 ); -extern void Aig_ManStop( Aig_Man_t * p ); -extern int Aig_ManCleanup( Aig_Man_t * p ); -extern void Aig_ManPrintStats( Aig_Man_t * p ); -/*=== aigMem.c ==========================================================*/ -extern void Aig_ManStartMemory( Aig_Man_t * p ); -extern void Aig_ManStopMemory( Aig_Man_t * p ); -/*=== aigMffc.c ==========================================================*/ -extern int Aig_NodeRef_rec( Aig_Obj_t * pNode, unsigned LevelMin ); -extern int Aig_NodeDeref_rec( Aig_Obj_t * pNode, unsigned LevelMin ); -extern int Aig_NodeMffsSupp( Aig_Man_t * p, Aig_Obj_t * pNode, int LevelMin, Vec_Ptr_t * vSupp ); -extern int Aig_NodeMffsLabel( Aig_Man_t * p, Aig_Obj_t * pNode ); -extern int Aig_NodeMffsLabelCut( Aig_Man_t * p, Aig_Obj_t * pNode, Vec_Ptr_t * vLeaves ); -extern int Aig_NodeMffsExtendCut( Aig_Man_t * p, Aig_Obj_t * pNode, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vResult ); -/*=== aigObj.c ==========================================================*/ -extern Aig_Obj_t * Aig_ObjCreatePi( Aig_Man_t * p ); -extern Aig_Obj_t * Aig_ObjCreatePo( Aig_Man_t * p, Aig_Obj_t * pDriver ); -extern Aig_Obj_t * Aig_ObjCreate( Aig_Man_t * p, Aig_Obj_t * pGhost ); -extern void Aig_ObjConnect( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFan0, Aig_Obj_t * pFan1 ); -extern void Aig_ObjDisconnect( Aig_Man_t * p, Aig_Obj_t * pObj ); -extern void Aig_ObjDelete( Aig_Man_t * p, Aig_Obj_t * pObj ); -extern void Aig_ObjDelete_rec( Aig_Man_t * p, Aig_Obj_t * pObj, int fFreeTop ); -extern void Aig_ObjPatchFanin0( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFaninNew ); -extern void Aig_ObjReplace( Aig_Man_t * p, Aig_Obj_t * pObjOld, Aig_Obj_t * pObjNew, int fNodesOnly, int fUpdateLevel ); -/*=== aigOper.c =========================================================*/ -extern Aig_Obj_t * Aig_IthVar( Aig_Man_t * p, int i ); -extern Aig_Obj_t * Aig_Oper( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1, Aig_Type_t Type ); -extern Aig_Obj_t * Aig_And( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1 ); -extern Aig_Obj_t * Aig_Latch( Aig_Man_t * p, Aig_Obj_t * pObj, int fInitOne ); -extern Aig_Obj_t * Aig_Or( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1 ); -extern Aig_Obj_t * Aig_Exor( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1 ); -extern Aig_Obj_t * Aig_Mux( Aig_Man_t * p, Aig_Obj_t * pC, Aig_Obj_t * p1, Aig_Obj_t * p0 ); -extern Aig_Obj_t * Aig_Maj( Aig_Man_t * p, Aig_Obj_t * pA, Aig_Obj_t * pB, Aig_Obj_t * pC ); -extern Aig_Obj_t * Aig_Miter( Aig_Man_t * p, Vec_Ptr_t * vPairs ); -extern Aig_Obj_t * Aig_MiterTwo( Aig_Man_t * p, Vec_Ptr_t * vNodes1, Vec_Ptr_t * vNodes2 ); -extern Aig_Obj_t * Aig_CreateAnd( Aig_Man_t * p, int nVars ); -extern Aig_Obj_t * Aig_CreateOr( Aig_Man_t * p, int nVars ); -extern Aig_Obj_t * Aig_CreateExor( Aig_Man_t * p, int nVars ); -/*=== aigOrder.c =========================================================*/ -extern void Aig_ManOrderStart( Aig_Man_t * p ); -extern void Aig_ManOrderStop( Aig_Man_t * p ); -extern void Aig_ObjOrderInsert( Aig_Man_t * p, int ObjId ); -extern void Aig_ObjOrderRemove( Aig_Man_t * p, int ObjId ); -extern void Aig_ObjOrderAdvance( Aig_Man_t * p ); -/*=== aigPart.c =========================================================*/ -extern Vec_Ptr_t * Aig_ManSupports( Aig_Man_t * pMan ); -extern Vec_Ptr_t * Aig_ManPartitionSmart( Aig_Man_t * p, int nPartSizeLimit, int fVerbose, Vec_Ptr_t ** pvPartSupps ); -extern Vec_Ptr_t * Aig_ManPartitionNaive( Aig_Man_t * p, int nPartSize ); -extern Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize ); -/*=== aigRepr.c =========================================================*/ -extern void Aig_ManReprStart( Aig_Man_t * p, int nIdMax ); -extern void Aig_ManReprStop( Aig_Man_t * p ); -extern void Aig_ObjCreateRepr( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 ); -extern void Aig_ManTransferRepr( Aig_Man_t * pNew, Aig_Man_t * p ); -extern Aig_Man_t * Aig_ManDupRepr( Aig_Man_t * p, int fOrdered ); -extern Aig_Man_t * Aig_ManRehash( Aig_Man_t * p ); -extern void Aig_ManMarkValidChoices( Aig_Man_t * p ); -/*=== aigRet.c ========================================================*/ -extern Aig_Man_t * Rtm_ManRetime( Aig_Man_t * p, int fForward, int nStepsMax, int fVerbose ); -/*=== aigScl.c ==========================================================*/ -extern Aig_Man_t * Aig_ManRemap( Aig_Man_t * p, Vec_Ptr_t * vMap ); -extern int Aig_ManSeqCleanup( Aig_Man_t * p ); -extern int Aig_ManCountMergeRegs( Aig_Man_t * p ); -extern Aig_Man_t * Aig_ManReduceLaches( Aig_Man_t * p, int fVerbose ); -/*=== aigSeq.c ========================================================*/ -extern int Aig_ManSeqStrash( Aig_Man_t * p, int nLatches, int * pInits ); -/*=== aigShow.c ========================================================*/ -extern void Aig_ManShow( Aig_Man_t * pMan, int fHaig, Vec_Ptr_t * vBold ); -/*=== aigTable.c ========================================================*/ -extern Aig_Obj_t * Aig_TableLookup( Aig_Man_t * p, Aig_Obj_t * pGhost ); -extern Aig_Obj_t * Aig_TableLookupTwo( Aig_Man_t * p, Aig_Obj_t * pFanin0, Aig_Obj_t * pFanin1 ); -extern void Aig_TableInsert( Aig_Man_t * p, Aig_Obj_t * pObj ); -extern void Aig_TableDelete( Aig_Man_t * p, Aig_Obj_t * pObj ); -extern int Aig_TableCountEntries( Aig_Man_t * p ); -extern void Aig_TableProfile( Aig_Man_t * p ); -/*=== aigTiming.c ========================================================*/ -extern void Aig_ObjClearReverseLevel( Aig_Man_t * p, Aig_Obj_t * pObj ); -extern int Aig_ObjRequiredLevel( Aig_Man_t * p, Aig_Obj_t * pObj ); -extern void Aig_ManStartReverseLevels( Aig_Man_t * p, int nMaxLevelIncrease ); -extern void Aig_ManStopReverseLevels( Aig_Man_t * p ); -extern void Aig_ManUpdateLevel( Aig_Man_t * p, Aig_Obj_t * pObjNew ); -extern void Aig_ManUpdateReverseLevel( Aig_Man_t * p, Aig_Obj_t * pObjNew ); -extern void Aig_ManVerifyLevel( Aig_Man_t * p ); -extern void Aig_ManVerifyReverseLevel( Aig_Man_t * p ); -/*=== aigTruth.c ========================================================*/ -extern unsigned * Aig_ManCutTruth( Aig_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vNodes, Vec_Ptr_t * vTruthElem, Vec_Ptr_t * vTruthStore ); -/*=== aigTsim.c ========================================================*/ -extern Aig_Man_t * Aig_ManConstReduce( Aig_Man_t * p, int fVerbose ); -/*=== aigUtil.c =========================================================*/ -extern unsigned Aig_PrimeCudd( unsigned p ); -extern void Aig_ManIncrementTravId( Aig_Man_t * p ); -extern int Aig_ManLevels( Aig_Man_t * p ); -extern void Aig_ManResetRefs( Aig_Man_t * p ); -extern void Aig_ManCleanMarkA( Aig_Man_t * p ); -extern void Aig_ManCleanMarkB( Aig_Man_t * p ); -extern void Aig_ManCleanData( Aig_Man_t * p ); -extern void Aig_ObjCleanData_rec( Aig_Obj_t * pObj ); -extern void Aig_ObjCollectMulti( Aig_Obj_t * pFunc, Vec_Ptr_t * vSuper ); -extern int Aig_ObjIsMuxType( Aig_Obj_t * pObj ); -extern int Aig_ObjRecognizeExor( Aig_Obj_t * pObj, Aig_Obj_t ** ppFan0, Aig_Obj_t ** ppFan1 ); -extern Aig_Obj_t * Aig_ObjRecognizeMux( Aig_Obj_t * pObj, Aig_Obj_t ** ppObjT, Aig_Obj_t ** ppObjE ); -extern Aig_Obj_t * Aig_ObjReal_rec( Aig_Obj_t * pObj ); -extern void Aig_ObjPrintEqn( FILE * pFile, Aig_Obj_t * pObj, Vec_Vec_t * vLevels, int Level ); -extern void Aig_ObjPrintVerilog( FILE * pFile, Aig_Obj_t * pObj, Vec_Vec_t * vLevels, int Level ); -extern void Aig_ObjPrintVerbose( Aig_Obj_t * pObj, int fHaig ); -extern void Aig_ManPrintVerbose( Aig_Man_t * p, int fHaig ); -extern void Aig_ManDump( Aig_Man_t * p ); -extern void Aig_ManDumpBlif( Aig_Man_t * p, char * pFileName ); -extern void Aig_ManDumpVerilog( Aig_Man_t * p, char * pFileName ); -/*=== aigWin.c =========================================================*/ -extern void Aig_ManFindCut( Aig_Obj_t * pRoot, Vec_Ptr_t * vFront, Vec_Ptr_t * vVisited, int nSizeLimit, int nFanoutLimit ); - -/*=== aigMem.c ===========================================================*/ -// fixed-size-block memory manager -extern Aig_MmFixed_t * Aig_MmFixedStart( int nEntrySize, int nEntriesMax ); -extern void Aig_MmFixedStop( Aig_MmFixed_t * p, int fVerbose ); -extern char * Aig_MmFixedEntryFetch( Aig_MmFixed_t * p ); -extern void Aig_MmFixedEntryRecycle( Aig_MmFixed_t * p, char * pEntry ); -extern void Aig_MmFixedRestart( Aig_MmFixed_t * p ); -extern int Aig_MmFixedReadMemUsage( Aig_MmFixed_t * p ); -extern int Aig_MmFixedReadMaxEntriesUsed( Aig_MmFixed_t * p ); -// flexible-size-block memory manager -extern Aig_MmFlex_t * Aig_MmFlexStart(); -extern void Aig_MmFlexStop( Aig_MmFlex_t * p, int fVerbose ); -extern char * Aig_MmFlexEntryFetch( Aig_MmFlex_t * p, int nBytes ); -extern void Aig_MmFlexRestart( Aig_MmFlex_t * p ); -extern int Aig_MmFlexReadMemUsage( Aig_MmFlex_t * p ); -// hierarchical memory manager -extern Aig_MmStep_t * Aig_MmStepStart( int nSteps ); -extern void Aig_MmStepStop( Aig_MmStep_t * p, int fVerbose ); -extern char * Aig_MmStepEntryFetch( Aig_MmStep_t * p, int nBytes ); -extern void Aig_MmStepEntryRecycle( Aig_MmStep_t * p, char * pEntry, int nBytes ); -extern int Aig_MmStepReadMemUsage( Aig_MmStep_t * p ); - -/*=== aigTime.c ===========================================================*/ -extern Aig_TMan_t * Aig_TManStart( int nPis, int nPos ); -extern void Aig_TManStop( Aig_TMan_t * p ); -extern void Aig_TManCreateBox( Aig_TMan_t * p, int * pPis, int nPis, int * pPos, int nPos, float * pPiTimes, float * pPoTimes ); -extern void Aig_TManSetPiDelay( Aig_TMan_t * p, int iPi, float Delay ); -extern void Aig_TManSetPoDelay( Aig_TMan_t * p, int iPo, float Delay ); -extern void Aig_TManSetPiArrival( Aig_TMan_t * p, int iPi, float Delay ); -extern void Aig_TManSetPoRequired( Aig_TMan_t * p, int iPo, float Delay ); -extern void Aig_TManIncrementTravId( Aig_TMan_t * p ); -extern float Aig_TManGetPiArrival( Aig_TMan_t * p, int iPi ); -extern float Aig_TManGetPoRequired( Aig_TMan_t * p, int iPo ); - - -#ifdef __cplusplus -} -#endif - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigCheck.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigCheck.c deleted file mode 100644 index f58aad936..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigCheck.c +++ /dev/null @@ -1,163 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigCheck.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [AIG checking procedures.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigCheck.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Checks the consistency of the AIG manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManCheck( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj, * pObj2; - int i; - // check primary inputs - Aig_ManForEachPi( p, pObj, i ) - { - if ( Aig_ObjFanin0(pObj) || Aig_ObjFanin1(pObj) ) - { - printf( "Aig_ManCheck: The PI node \"%p\" has fanins.\n", pObj ); - return 0; - } - } - // check primary outputs - Aig_ManForEachPo( p, pObj, i ) - { - if ( !Aig_ObjFanin0(pObj) ) - { - printf( "Aig_ManCheck: The PO node \"%p\" has NULL fanin.\n", pObj ); - return 0; - } - if ( Aig_ObjFanin1(pObj) ) - { - printf( "Aig_ManCheck: The PO node \"%p\" has second fanin.\n", pObj ); - return 0; - } - } - // check internal nodes - Aig_ManForEachObj( p, pObj, i ) - { - if ( !Aig_ObjIsNode(pObj) ) - continue; - if ( !Aig_ObjFanin0(pObj) || !Aig_ObjFanin1(pObj) ) - { - printf( "Aig_ManCheck: The AIG has internal node \"%p\" with a NULL fanin.\n", pObj ); - return 0; - } - if ( Aig_ObjFanin0(pObj)->Id >= Aig_ObjFanin1(pObj)->Id ) - { - printf( "Aig_ManCheck: The AIG has node \"%p\" with a wrong ordering of fanins.\n", pObj ); - return 0; - } - pObj2 = Aig_TableLookup( p, pObj ); - if ( pObj2 != pObj ) - { - printf( "Aig_ManCheck: Node \"%p\" is not in the structural hashing table.\n", pObj ); - return 0; - } - } - // count the total number of nodes - if ( Aig_ManObjNum(p) != 1 + Aig_ManPiNum(p) + Aig_ManPoNum(p) + - Aig_ManBufNum(p) + Aig_ManAndNum(p) + Aig_ManExorNum(p) + Aig_ManLatchNum(p) ) - { - printf( "Aig_ManCheck: The number of created nodes is wrong.\n" ); - printf( "C1 = %d. Pi = %d. Po = %d. Buf = %d. And = %d. Xor = %d. Lat = %d. Total = %d.\n", - 1, Aig_ManPiNum(p), Aig_ManPoNum(p), Aig_ManBufNum(p), Aig_ManAndNum(p), Aig_ManExorNum(p), Aig_ManLatchNum(p), - 1 + Aig_ManPiNum(p) + Aig_ManPoNum(p) + Aig_ManBufNum(p) + Aig_ManAndNum(p) + Aig_ManExorNum(p) + Aig_ManLatchNum(p) ); - printf( "Created = %d. Deleted = %d. Existing = %d.\n", - p->nCreated, p->nDeleted, p->nCreated - p->nDeleted ); - return 0; - } - // count the number of nodes in the table - if ( Aig_TableCountEntries(p) != Aig_ManAndNum(p) + Aig_ManExorNum(p) + Aig_ManLatchNum(p) ) - { - printf( "Aig_ManCheck: The number of nodes in the structural hashing table is wrong.\n" ); - printf( "Entries = %d. And = %d. Xor = %d. Lat = %d. Total = %d.\n", - Aig_TableCountEntries(p), Aig_ManAndNum(p), Aig_ManExorNum(p), Aig_ManLatchNum(p), - Aig_ManAndNum(p) + Aig_ManExorNum(p) + Aig_ManLatchNum(p) ); - - return 0; - } -// if ( !Aig_ManIsAcyclic(p) ) -// return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Checks if the markA is reset.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManCheckMarkA( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManForEachObj( p, pObj, i ) - assert( pObj->fMarkA == 0 ); -} - -/**Function************************************************************* - - Synopsis [Checks the consistency of phase assignment.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManCheckPhase( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManForEachObj( p, pObj, i ) - if ( Aig_ObjIsPi(pObj) ) - assert( (int)pObj->fPhase == 0 ); - else - assert( (int)pObj->fPhase == (Aig_ObjPhaseReal(Aig_ObjChild0(pObj)) & Aig_ObjPhaseReal(Aig_ObjChild1(pObj))) ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigDfs.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigDfs.c deleted file mode 100644 index 452e1d0b2..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigDfs.c +++ /dev/null @@ -1,700 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigDfs.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [DFS traversal procedures.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigDfs.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDfs_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vNodes ) -{ - if ( pObj == NULL ) - return; - assert( !Aig_IsComplement(pObj) ); - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - return; - assert( Aig_ObjIsNode(pObj) || Aig_ObjIsBuf(pObj) ); - Aig_ManDfs_rec( p, Aig_ObjFanin0(pObj), vNodes ); - Aig_ManDfs_rec( p, Aig_ObjFanin1(pObj), vNodes ); - assert( !Aig_ObjIsTravIdCurrent(p, pObj) ); // loop detection - Aig_ObjSetTravIdCurrent(p, pObj); - Vec_PtrPush( vNodes, pObj ); -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManDfs( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i; - Aig_ManIncrementTravId( p ); - // mark constant and PIs - Aig_ObjSetTravIdCurrent( p, Aig_ManConst1(p) ); - Aig_ManForEachPi( p, pObj, i ) - Aig_ObjSetTravIdCurrent( p, pObj ); - // if there are latches, mark them - if ( Aig_ManLatchNum(p) > 0 ) - Aig_ManForEachObj( p, pObj, i ) - if ( Aig_ObjIsLatch(pObj) ) - Aig_ObjSetTravIdCurrent( p, pObj ); - // go through the nodes - vNodes = Vec_PtrAlloc( Aig_ManNodeNum(p) ); - Aig_ManForEachObj( p, pObj, i ) - if ( Aig_ObjIsNode(pObj) || Aig_ObjIsBuf(pObj) ) - Aig_ManDfs_rec( p, pObj, vNodes ); - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManDfsNodes( Aig_Man_t * p, Aig_Obj_t ** ppNodes, int nNodes ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i; - assert( Aig_ManLatchNum(p) == 0 ); - Aig_ManIncrementTravId( p ); - // mark constant and PIs - Aig_ObjSetTravIdCurrent( p, Aig_ManConst1(p) ); - Aig_ManForEachPi( p, pObj, i ) - Aig_ObjSetTravIdCurrent( p, pObj ); - // go through the nodes - vNodes = Vec_PtrAlloc( Aig_ManNodeNum(p) ); - for ( i = 0; i < nNodes; i++ ) - Aig_ManDfs_rec( p, ppNodes[i], vNodes ); - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDfsChoices_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vNodes ) -{ - if ( pObj == NULL ) - return; - assert( !Aig_IsComplement(pObj) ); - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - return; - assert( Aig_ObjIsNode(pObj) ); - Aig_ManDfsChoices_rec( p, Aig_ObjFanin0(pObj), vNodes ); - Aig_ManDfsChoices_rec( p, Aig_ObjFanin1(pObj), vNodes ); - Aig_ManDfsChoices_rec( p, p->pEquivs[pObj->Id], vNodes ); - assert( !Aig_ObjIsTravIdCurrent(p, pObj) ); // loop detection - Aig_ObjSetTravIdCurrent(p, pObj); - Vec_PtrPush( vNodes, pObj ); -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManDfsChoices( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i; - assert( p->pEquivs != NULL ); - Aig_ManIncrementTravId( p ); - // mark constant and PIs - Aig_ObjSetTravIdCurrent( p, Aig_ManConst1(p) ); - Aig_ManForEachPi( p, pObj, i ) - Aig_ObjSetTravIdCurrent( p, pObj ); - // go through the nodes - vNodes = Vec_PtrAlloc( Aig_ManNodeNum(p) ); - Aig_ManForEachPo( p, pObj, i ) - Aig_ManDfsChoices_rec( p, Aig_ObjFanin0(pObj), vNodes ); - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the reverse DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDfsReverse_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vNodes ) -{ - Aig_Obj_t * pFanout; - int iFanout = -1, i; - assert( !Aig_IsComplement(pObj) ); - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - return; - assert( Aig_ObjIsNode(pObj) || Aig_ObjIsBuf(pObj) ); - Aig_ObjForEachFanout( p, pObj, pFanout, iFanout, i ) - Aig_ManDfsReverse_rec( p, pFanout, vNodes ); - assert( !Aig_ObjIsTravIdCurrent(p, pObj) ); // loop detection - Aig_ObjSetTravIdCurrent(p, pObj); - Vec_PtrPush( vNodes, pObj ); -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the reverse DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManDfsReverse( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i; - Aig_ManIncrementTravId( p ); - // mark POs - Aig_ManForEachPo( p, pObj, i ) - Aig_ObjSetTravIdCurrent( p, pObj ); - // if there are latches, mark them - if ( Aig_ManLatchNum(p) > 0 ) - Aig_ManForEachObj( p, pObj, i ) - if ( Aig_ObjIsLatch(pObj) ) - Aig_ObjSetTravIdCurrent( p, pObj ); - // go through the nodes - vNodes = Vec_PtrAlloc( Aig_ManNodeNum(p) ); - Aig_ManForEachObj( p, pObj, i ) - if ( Aig_ObjIsNode(pObj) || Aig_ObjIsBuf(pObj) ) - Aig_ManDfsReverse_rec( p, pObj, vNodes ); - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Computes the max number of levels in the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManLevelNum( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i, LevelsMax; - LevelsMax = 0; - Aig_ManForEachPo( p, pObj, i ) - LevelsMax = AIG_MAX( LevelsMax, (int)Aig_ObjFanin0(pObj)->Level ); - return LevelsMax; -} - -/**Function************************************************************* - - Synopsis [Computes the max number of levels in the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManCountLevels( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i, LevelsMax, Level0, Level1; - // initialize the levels - Aig_ManConst1(p)->iData = 0; - Aig_ManForEachPi( p, pObj, i ) - pObj->iData = 0; - // compute levels in a DFS order - vNodes = Aig_ManDfs( p ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - Level0 = Aig_ObjFanin0(pObj)->iData; - Level1 = Aig_ObjFanin1(pObj)->iData; - pObj->iData = 1 + Aig_ObjIsExor(pObj) + AIG_MAX(Level0, Level1); - } - Vec_PtrFree( vNodes ); - // get levels of the POs - LevelsMax = 0; - Aig_ManForEachPo( p, pObj, i ) - LevelsMax = AIG_MAX( LevelsMax, Aig_ObjFanin0(pObj)->iData ); - return LevelsMax; -} - -/**Function************************************************************* - - Synopsis [Counts the number of AIG nodes rooted at this cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ConeMark_rec( Aig_Obj_t * pObj ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( !Aig_ObjIsNode(pObj) || Aig_ObjIsMarkA(pObj) ) - return; - Aig_ConeMark_rec( Aig_ObjFanin0(pObj) ); - Aig_ConeMark_rec( Aig_ObjFanin1(pObj) ); - assert( !Aig_ObjIsMarkA(pObj) ); // loop detection - Aig_ObjSetMarkA( pObj ); -} - -/**Function************************************************************* - - Synopsis [Counts the number of AIG nodes rooted at this cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ConeCleanAndMark_rec( Aig_Obj_t * pObj ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( !Aig_ObjIsNode(pObj) || Aig_ObjIsMarkA(pObj) ) - return; - Aig_ConeCleanAndMark_rec( Aig_ObjFanin0(pObj) ); - Aig_ConeCleanAndMark_rec( Aig_ObjFanin1(pObj) ); - assert( !Aig_ObjIsMarkA(pObj) ); // loop detection - Aig_ObjSetMarkA( pObj ); - pObj->pData = NULL; -} - -/**Function************************************************************* - - Synopsis [Counts the number of AIG nodes rooted at this cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ConeCountAndMark_rec( Aig_Obj_t * pObj ) -{ - int Counter; - assert( !Aig_IsComplement(pObj) ); - if ( !Aig_ObjIsNode(pObj) || Aig_ObjIsMarkA(pObj) ) - return 0; - Counter = 1 + Aig_ConeCountAndMark_rec( Aig_ObjFanin0(pObj) ) + - Aig_ConeCountAndMark_rec( Aig_ObjFanin1(pObj) ); - assert( !Aig_ObjIsMarkA(pObj) ); // loop detection - Aig_ObjSetMarkA( pObj ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Counts the number of AIG nodes rooted at this cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ConeUnmark_rec( Aig_Obj_t * pObj ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( !Aig_ObjIsNode(pObj) || !Aig_ObjIsMarkA(pObj) ) - return; - Aig_ConeUnmark_rec( Aig_ObjFanin0(pObj) ); - Aig_ConeUnmark_rec( Aig_ObjFanin1(pObj) ); - assert( Aig_ObjIsMarkA(pObj) ); // loop detection - Aig_ObjClearMarkA( pObj ); -} - -/**Function************************************************************* - - Synopsis [Counts the number of AIG nodes rooted at this cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_DagSize( Aig_Obj_t * pObj ) -{ - int Counter; - Counter = Aig_ConeCountAndMark_rec( Aig_Regular(pObj) ); - Aig_ConeUnmark_rec( Aig_Regular(pObj) ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Counts the support size of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_SupportSize_rec( Aig_Man_t * p, Aig_Obj_t * pObj, int * pCounter ) -{ - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - return; - Aig_ObjSetTravIdCurrent(p, pObj); - if ( Aig_ObjIsPi(pObj) ) - { - (*pCounter)++; - return; - } - assert( Aig_ObjIsNode(pObj) || Aig_ObjIsBuf(pObj) ); - Aig_SupportSize_rec( p, Aig_ObjFanin0(pObj), pCounter ); - if ( Aig_ObjFanin1(pObj) ) - Aig_SupportSize_rec( p, Aig_ObjFanin1(pObj), pCounter ); -} - -/**Function************************************************************* - - Synopsis [Counts the support size of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_SupportSize( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - int Counter = 0; - assert( !Aig_IsComplement(pObj) ); - assert( !Aig_ObjIsPo(pObj) ); - Aig_ManIncrementTravId( p ); - Aig_SupportSize_rec( p, pObj, &Counter ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Transfers the AIG from one manager into another.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_Transfer_rec( Aig_Man_t * pDest, Aig_Obj_t * pObj ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( !Aig_ObjIsNode(pObj) || Aig_ObjIsMarkA(pObj) ) - return; - Aig_Transfer_rec( pDest, Aig_ObjFanin0(pObj) ); - Aig_Transfer_rec( pDest, Aig_ObjFanin1(pObj) ); - pObj->pData = Aig_And( pDest, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); - assert( !Aig_ObjIsMarkA(pObj) ); // loop detection - Aig_ObjSetMarkA( pObj ); -} - -/**Function************************************************************* - - Synopsis [Transfers the AIG from one manager into another.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Transfer( Aig_Man_t * pSour, Aig_Man_t * pDest, Aig_Obj_t * pRoot, int nVars ) -{ - Aig_Obj_t * pObj; - int i; - // solve simple cases - if ( pSour == pDest ) - return pRoot; - if ( Aig_ObjIsConst1( Aig_Regular(pRoot) ) ) - return Aig_NotCond( Aig_ManConst1(pDest), Aig_IsComplement(pRoot) ); - // set the PI mapping - Aig_ManForEachPi( pSour, pObj, i ) - { - if ( i == nVars ) - break; - pObj->pData = Aig_IthVar(pDest, i); - } - // transfer and set markings - Aig_Transfer_rec( pDest, Aig_Regular(pRoot) ); - // clear the markings - Aig_ConeUnmark_rec( Aig_Regular(pRoot) ); - return Aig_NotCond( Aig_Regular(pRoot)->pData, Aig_IsComplement(pRoot) ); -} - -/**Function************************************************************* - - Synopsis [Composes the AIG (pRoot) with the function (pFunc) using PI var (iVar).] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_Compose_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFunc, Aig_Obj_t * pVar ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( Aig_ObjIsMarkA(pObj) ) - return; - if ( Aig_ObjIsConst1(pObj) || Aig_ObjIsPi(pObj) ) - { - pObj->pData = pObj == pVar ? pFunc : pObj; - return; - } - Aig_Compose_rec( p, Aig_ObjFanin0(pObj), pFunc, pVar ); - Aig_Compose_rec( p, Aig_ObjFanin1(pObj), pFunc, pVar ); - pObj->pData = Aig_And( p, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); - assert( !Aig_ObjIsMarkA(pObj) ); // loop detection - Aig_ObjSetMarkA( pObj ); -} - -/**Function************************************************************* - - Synopsis [Composes the AIG (pRoot) with the function (pFunc) using PI var (iVar).] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Compose( Aig_Man_t * p, Aig_Obj_t * pRoot, Aig_Obj_t * pFunc, int iVar ) -{ - // quit if the PI variable is not defined - if ( iVar >= Aig_ManPiNum(p) ) - { - printf( "Aig_Compose(): The PI variable %d is not defined.\n", iVar ); - return NULL; - } - // recursively perform composition - Aig_Compose_rec( p, Aig_Regular(pRoot), pFunc, Aig_ManPi(p, iVar) ); - // clear the markings - Aig_ConeUnmark_rec( Aig_Regular(pRoot) ); - return Aig_NotCond( Aig_Regular(pRoot)->pData, Aig_IsComplement(pRoot) ); -} - -/**Function************************************************************* - - Synopsis [Computes the internal nodes of the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjCollectCut_rec( Aig_Obj_t * pNode, Vec_Ptr_t * vNodes ) -{ -// Aig_Obj_t * pFan0 = Aig_ObjFanin0(pNode); -// Aig_Obj_t * pFan1 = Aig_ObjFanin1(pNode); - if ( pNode->fMarkA ) - return; - pNode->fMarkA = 1; - assert( Aig_ObjIsNode(pNode) ); - Aig_ObjCollectCut_rec( Aig_ObjFanin0(pNode), vNodes ); - Aig_ObjCollectCut_rec( Aig_ObjFanin1(pNode), vNodes ); - Vec_PtrPush( vNodes, pNode ); -//printf( "added %d ", pNode->Id ); -} - -/**Function************************************************************* - - Synopsis [Computes the internal nodes of the cut.] - - Description [Does not include the leaves of the cut.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjCollectCut( Aig_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vNodes ) -{ - Aig_Obj_t * pObj; - int i; - // collect and mark the leaves - Vec_PtrClear( vNodes ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - { - assert( pObj->fMarkA == 0 ); - pObj->fMarkA = 1; -// printf( "%d " , pObj->Id ); - } -//printf( "\n" ); - // collect and mark the nodes - Aig_ObjCollectCut_rec( pRoot, vNodes ); - // clean the nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->fMarkA = 0; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->fMarkA = 0; -} - - -/**Function************************************************************* - - Synopsis [Collects the nodes of the supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjCollectSuper_rec( Aig_Obj_t * pRoot, Aig_Obj_t * pObj, Vec_Ptr_t * vSuper ) -{ - int RetValue1, RetValue2, i; - // check if the node is visited - if ( Aig_Regular(pObj)->fMarkA ) - { - // check if the node occurs in the same polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == pObj ) - return 1; - // check if the node is present in the opposite polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == Aig_Not(pObj) ) - return -1; - assert( 0 ); - return 0; - } - // if the new node is complemented or a PI, another gate begins - if ( pObj != pRoot && (Aig_IsComplement(pObj) || Aig_ObjType(pObj) != Aig_ObjType(pRoot) || Aig_ObjRefs(pObj) > 1) ) - { - Vec_PtrPush( vSuper, pObj ); - Aig_Regular(pObj)->fMarkA = 1; - return 0; - } - assert( !Aig_IsComplement(pObj) ); - assert( Aig_ObjIsNode(pObj) ); - // go through the branches - RetValue1 = Aig_ObjCollectSuper_rec( pRoot, Aig_ObjReal_rec( Aig_ObjChild0(pObj) ), vSuper ); - RetValue2 = Aig_ObjCollectSuper_rec( pRoot, Aig_ObjReal_rec( Aig_ObjChild1(pObj) ), vSuper ); - if ( RetValue1 == -1 || RetValue2 == -1 ) - return -1; - // return 1 if at least one branch has a duplicate - return RetValue1 || RetValue2; -} - -/**Function************************************************************* - - Synopsis [Collects the nodes of the supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjCollectSuper( Aig_Obj_t * pObj, Vec_Ptr_t * vSuper ) -{ - int RetValue, i; - assert( !Aig_IsComplement(pObj) ); - assert( Aig_ObjIsNode(pObj) ); - // collect the nodes in the implication supergate - Vec_PtrClear( vSuper ); - RetValue = Aig_ObjCollectSuper_rec( pObj, pObj, vSuper ); - assert( Vec_PtrSize(vSuper) > 1 ); - // unmark the visited nodes - Vec_PtrForEachEntry( vSuper, pObj, i ) - Aig_Regular(pObj)->fMarkA = 0; - // if we found the node and its complement in the same implication supergate, - // return empty set of nodes (meaning that we should use constant-0 node) - if ( RetValue == -1 ) - vSuper->nSize = 0; - return RetValue; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigFanout.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigFanout.c deleted file mode 100644 index 37479f6a4..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigFanout.c +++ /dev/null @@ -1,189 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigFanout.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Fanout manipulation.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigFanout.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -// 0: first iFan -// 1: prev iFan0 -// 2: prev iFan1 -// 3: next iFan0 -// 4: next iFan1 - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static inline int Aig_FanoutCreate( int FanId, int Num ) { assert( Num < 2 ); return (FanId << 1) | Num; } -static inline int * Aig_FanoutObj( int * pData, int ObjId ) { return pData + 5*ObjId; } -static inline int * Aig_FanoutPrev( int * pData, int iFan ) { return pData + 5*(iFan >> 1) + 1 + (iFan & 1); } -static inline int * Aig_FanoutNext( int * pData, int iFan ) { return pData + 5*(iFan >> 1) + 3 + (iFan & 1); } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Create fanout for all objects in the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManFanoutStart( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - assert( Aig_ManBufNum(p) == 0 ); - // allocate fanout datastructure - assert( p->pFanData == NULL ); - p->nFansAlloc = 2 * Aig_ManObjNumMax(p); - if ( p->nFansAlloc < (1<<12) ) - p->nFansAlloc = (1<<12); - p->pFanData = ALLOC( int, 5 * p->nFansAlloc ); - memset( p->pFanData, 0, sizeof(int) * 5 * p->nFansAlloc ); - // add fanouts for all objects - Aig_ManForEachObj( p, pObj, i ) - { - if ( Aig_ObjChild0(pObj) ) - Aig_ObjAddFanout( p, Aig_ObjFanin0(pObj), pObj ); - if ( Aig_ObjChild1(pObj) ) - Aig_ObjAddFanout( p, Aig_ObjFanin1(pObj), pObj ); - } -} - -/**Function************************************************************* - - Synopsis [Deletes fanout for all objects in the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManFanoutStop( Aig_Man_t * p ) -{ - assert( p->pFanData != NULL ); - FREE( p->pFanData ); - p->nFansAlloc = 0; -} - -/**Function************************************************************* - - Synopsis [Adds fanout (pFanout) of node (pObj).] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjAddFanout( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFanout ) -{ - int iFan, * pFirst, * pPrevC, * pNextC, * pPrev, * pNext; - assert( p->pFanData ); - assert( !Aig_IsComplement(pObj) && !Aig_IsComplement(pFanout) ); - assert( pFanout->Id > 0 ); - if ( pObj->Id >= p->nFansAlloc || pFanout->Id >= p->nFansAlloc ) - { - int nFansAlloc = 2 * AIG_MAX( pObj->Id, pFanout->Id ); - p->pFanData = REALLOC( int, p->pFanData, 5 * nFansAlloc ); - memset( p->pFanData + 5 * p->nFansAlloc, 0, sizeof(int) * 5 * (nFansAlloc - p->nFansAlloc) ); - p->nFansAlloc = nFansAlloc; - } - assert( pObj->Id < p->nFansAlloc && pFanout->Id < p->nFansAlloc ); - iFan = Aig_FanoutCreate( pFanout->Id, Aig_ObjWhatFanin(pFanout, pObj) ); - pPrevC = Aig_FanoutPrev( p->pFanData, iFan ); - pNextC = Aig_FanoutNext( p->pFanData, iFan ); - pFirst = Aig_FanoutObj( p->pFanData, pObj->Id ); - if ( *pFirst == 0 ) - { - *pFirst = iFan; - *pPrevC = iFan; - *pNextC = iFan; - } - else - { - pPrev = Aig_FanoutPrev( p->pFanData, *pFirst ); - pNext = Aig_FanoutNext( p->pFanData, *pPrev ); - assert( *pNext == *pFirst ); - *pPrevC = *pPrev; - *pNextC = *pFirst; - *pPrev = iFan; - *pNext = iFan; - } -} - -/**Function************************************************************* - - Synopsis [Removes fanout (pFanout) of node (pObj).] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjRemoveFanout( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFanout ) -{ - int iFan, * pFirst, * pPrevC, * pNextC, * pPrev, * pNext; - assert( p->pFanData && pObj->Id < p->nFansAlloc && pFanout->Id < p->nFansAlloc ); - assert( !Aig_IsComplement(pObj) && !Aig_IsComplement(pFanout) ); - assert( pFanout->Id > 0 ); - iFan = Aig_FanoutCreate( pFanout->Id, Aig_ObjWhatFanin(pFanout, pObj) ); - pPrevC = Aig_FanoutPrev( p->pFanData, iFan ); - pNextC = Aig_FanoutNext( p->pFanData, iFan ); - pPrev = Aig_FanoutPrev( p->pFanData, *pNextC ); - pNext = Aig_FanoutNext( p->pFanData, *pPrevC ); - assert( *pPrev == iFan ); - assert( *pNext == iFan ); - pFirst = Aig_FanoutObj( p->pFanData, pObj->Id ); - assert( *pFirst > 0 ); - if ( *pFirst == iFan ) - { - if ( *pNextC == iFan ) - { - *pFirst = 0; - *pPrev = 0; - *pNext = 0; - *pPrevC = 0; - *pNextC = 0; - return; - } - *pFirst = *pNextC; - } - *pPrev = *pPrevC; - *pNext = *pNextC; - *pPrevC = 0; - *pNextC = 0; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigMan.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigMan.c deleted file mode 100644 index eddeca8e3..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigMan.c +++ /dev/null @@ -1,325 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigMan.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [AIG manager.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigMan.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Starts the AIG manager.] - - Description [The argument of this procedure is a soft limit on the - the number of nodes, or 0 if the limit is unknown.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManStart( int nNodesMax ) -{ - Aig_Man_t * p; - if ( nNodesMax <= 0 ) - nNodesMax = 10007; - // start the manager - p = ALLOC( Aig_Man_t, 1 ); - memset( p, 0, sizeof(Aig_Man_t) ); - // perform initializations - p->nTravIds = 1; - p->fCatchExor = 0; - // allocate arrays for nodes - p->vPis = Vec_PtrAlloc( 100 ); - p->vPos = Vec_PtrAlloc( 100 ); - p->vObjs = Vec_PtrAlloc( 1000 ); - p->vBufs = Vec_PtrAlloc( 100 ); - // prepare the internal memory manager - p->pMemObjs = Aig_MmFixedStart( sizeof(Aig_Obj_t), nNodesMax ); - // create the constant node - p->pConst1 = Aig_ManFetchMemory( p ); - p->pConst1->Type = AIG_OBJ_CONST1; - p->pConst1->fPhase = 1; - p->nObjs[AIG_OBJ_CONST1]++; - // start the table - p->nTableSize = Aig_PrimeCudd( nNodesMax ); - p->pTable = ALLOC( Aig_Obj_t *, p->nTableSize ); - memset( p->pTable, 0, sizeof(Aig_Obj_t *) * p->nTableSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Duplicates the AIG manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManStartFrom( Aig_Man_t * p ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj; - int i; - // create the new manager - pNew = Aig_ManStart( Aig_ManObjNumMax(p) ); - pNew->pName = Aig_UtilStrsav( p->pName ); - // create the PIs - Aig_ManConst1(p)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( p, pObj, i ) - pObj->pData = Aig_ObjCreatePi(pNew); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Duplicates the AIG manager recursively.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ManDup_rec( Aig_Man_t * pNew, Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - if ( pObj->pData ) - return pObj->pData; - Aig_ManDup_rec( pNew, p, Aig_ObjFanin0(pObj) ); - if ( Aig_ObjIsBuf(pObj) ) - return pObj->pData = Aig_ObjChild0Copy(pObj); - Aig_ManDup_rec( pNew, p, Aig_ObjFanin1(pObj) ); - return pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); -} - -/**Function************************************************************* - - Synopsis [Duplicates the AIG manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManDup( Aig_Man_t * p, int fOrdered ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj; - int i; - // create the new manager - pNew = Aig_ManStart( Aig_ManObjNumMax(p) ); - pNew->pName = Aig_UtilStrsav( p->pName ); - pNew->nRegs = p->nRegs; - pNew->nAsserts = p->nAsserts; - if ( p->vFlopNums ) - pNew->vFlopNums = Vec_IntDup( p->vFlopNums ); - // create the PIs - Aig_ManCleanData( p ); - Aig_ManConst1(p)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( p, pObj, i ) - pObj->pData = Aig_ObjCreatePi(pNew); - // duplicate internal nodes - if ( fOrdered ) - { - Aig_ManForEachObj( p, pObj, i ) - if ( Aig_ObjIsBuf(pObj) ) - pObj->pData = Aig_ObjChild0Copy(pObj); - else if ( Aig_ObjIsNode(pObj) ) - pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); - } - else - { - Aig_ManForEachObj( p, pObj, i ) - if ( !Aig_ObjIsPo(pObj) ) - { - Aig_ManDup_rec( pNew, p, pObj ); - assert( pObj->Level == ((Aig_Obj_t*)pObj->pData)->Level ); - } - } - // add the POs - Aig_ManForEachPo( p, pObj, i ) - Aig_ObjCreatePo( pNew, Aig_ObjChild0Copy(pObj) ); - assert( Aig_ManBufNum(p) != 0 || Aig_ManNodeNum(p) == Aig_ManNodeNum(pNew) ); - // check the resulting network - if ( !Aig_ManCheck(pNew) ) - printf( "Aig_ManDup(): The check has failed.\n" ); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Extracts the miter composed of XOR of the two nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManExtractMiter( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj; - int i; - // create the new manager - pNew = Aig_ManStart( Aig_ManObjNumMax(p) ); - pNew->pName = Aig_UtilStrsav( p->pName ); - // create the PIs - Aig_ManCleanData( p ); - Aig_ManConst1(p)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( p, pObj, i ) - pObj->pData = Aig_ObjCreatePi(pNew); - // dump the nodes - Aig_ManDup_rec( pNew, p, pNode1 ); - Aig_ManDup_rec( pNew, p, pNode2 ); - // construct the EXOR - pObj = Aig_Exor( pNew, pNode1->pData, pNode2->pData ); - pObj = Aig_NotCond( pObj, Aig_Regular(pObj)->fPhase ^ Aig_IsComplement(pObj) ); - // add the PO - Aig_ObjCreatePo( pNew, pObj ); - // check the resulting network - if ( !Aig_ManCheck(pNew) ) - printf( "Aig_ManDup(): The check has failed.\n" ); - return pNew; -} - - -/**Function************************************************************* - - Synopsis [Stops the AIG manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManStop( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - if ( p->vMapped ) - Vec_PtrFree( p->vMapped ); - // print time - if ( p->time1 ) { PRT( "time1", p->time1 ); } - if ( p->time2 ) { PRT( "time2", p->time2 ); } - // delete timing - if ( p->pManTime ) - Aig_TManStop( p->pManTime ); - // delete fanout - if ( p->pFanData ) - Aig_ManFanoutStop( p ); - // make sure the nodes have clean marks - Aig_ManForEachObj( p, pObj, i ) - assert( !pObj->fMarkA && !pObj->fMarkB ); -// Aig_TableProfile( p ); - Aig_MmFixedStop( p->pMemObjs, 0 ); - if ( p->vPis ) Vec_PtrFree( p->vPis ); - if ( p->vPos ) Vec_PtrFree( p->vPos ); - if ( p->vObjs ) Vec_PtrFree( p->vObjs ); - if ( p->vBufs ) Vec_PtrFree( p->vBufs ); - if ( p->vLevelR ) Vec_IntFree( p->vLevelR ); - if ( p->vLevels ) Vec_VecFree( p->vLevels ); - if ( p->vFlopNums) Vec_IntFree( p->vFlopNums ); - FREE( p->pName ); - FREE( p->pObjCopies ); - FREE( p->pReprs ); - FREE( p->pEquivs ); - free( p->pTable ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Returns the number of dangling nodes removed.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManCleanup( Aig_Man_t * p ) -{ - Vec_Ptr_t * vObjs; - Aig_Obj_t * pNode; - int i, nNodesOld; - nNodesOld = Aig_ManNodeNum(p); - // collect roots of dangling nodes - vObjs = Vec_PtrAlloc( 100 ); - Aig_ManForEachObj( p, pNode, i ) - if ( Aig_ObjIsNode(pNode) && Aig_ObjRefs(pNode) == 0 ) - Vec_PtrPush( vObjs, pNode ); - // recursively remove dangling nodes - Vec_PtrForEachEntry( vObjs, pNode, i ) - Aig_ObjDelete_rec( p, pNode, 1 ); - Vec_PtrFree( vObjs ); - return nNodesOld - Aig_ManNodeNum(p); -} - -/**Function************************************************************* - - Synopsis [Stops the AIG manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManPrintStats( Aig_Man_t * p ) -{ - printf( "PI/PO/Lat = %5d/%5d/%5d ", Aig_ManPiNum(p), Aig_ManPoNum(p), Aig_ManLatchNum(p) ); - printf( "A = %7d. ", Aig_ManAndNum(p) ); - if ( Aig_ManExorNum(p) ) - printf( "X = %5d. ", Aig_ManExorNum(p) ); -// if ( Aig_ManBufNum(p) ) - printf( "B = %5d. ", Aig_ManBufNum(p) ); -// printf( "Cre = %6d. ", p->nCreated ); -// printf( "Del = %6d. ", p->nDeleted ); -// printf( "Lev = %3d. ", Aig_ManCountLevels(p) ); - printf( "Max = %7d. ", Aig_ManObjNumMax(p) ); - printf( "Lev = %3d. ", Aig_ManLevels(p) ); - if ( Aig_ManRegNum(p) ) - printf( "Lat = %5d. ", Aig_ManRegNum(p) ); - printf( "\n" ); - fflush( stdout ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigMem.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigMem.c deleted file mode 100644 index 34d30c4bf..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigMem.c +++ /dev/null @@ -1,598 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigMem.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Memory managers.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigMem.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -struct Aig_MmFixed_t_ -{ - // information about individual entries - int nEntrySize; // the size of one entry - int nEntriesAlloc; // the total number of entries allocated - int nEntriesUsed; // the number of entries in use - int nEntriesMax; // the max number of entries in use - char * pEntriesFree; // the linked list of free entries - - // this is where the memory is stored - int nChunkSize; // the size of one chunk - int nChunksAlloc; // the maximum number of memory chunks - int nChunks; // the current number of memory chunks - char ** pChunks; // the allocated memory - - // statistics - int nMemoryUsed; // memory used in the allocated entries - int nMemoryAlloc; // memory allocated -}; - -struct Aig_MmFlex_t_ -{ - // information about individual entries - int nEntriesUsed; // the number of entries allocated - char * pCurrent; // the current pointer to free memory - char * pEnd; // the first entry outside the free memory - - // this is where the memory is stored - int nChunkSize; // the size of one chunk - int nChunksAlloc; // the maximum number of memory chunks - int nChunks; // the current number of memory chunks - char ** pChunks; // the allocated memory - - // statistics - int nMemoryUsed; // memory used in the allocated entries - int nMemoryAlloc; // memory allocated -}; - -struct Aig_MmStep_t_ -{ - int nMems; // the number of fixed memory managers employed - Aig_MmFixed_t ** pMems; // memory managers: 2^1 words, 2^2 words, etc - int nMapSize; // the size of the memory array - Aig_MmFixed_t ** pMap; // maps the number of bytes into its memory manager -}; - -#define ALLOC(type, num) ((type *) malloc(sizeof(type) * (num))) -#define FREE(obj) ((obj) ? (free((char *) (obj)), (obj) = 0) : 0) -#define REALLOC(type, obj, num) \ - ((obj) ? ((type *) realloc((char *)(obj), sizeof(type) * (num))) : \ - ((type *) malloc(sizeof(type) * (num)))) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates memory pieces of fixed size.] - - Description [The size of the chunk is computed as the minimum of - 1024 entries and 64K. Can only work with entry size at least 4 byte long.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_MmFixed_t * Aig_MmFixedStart( int nEntrySize, int nEntriesMax ) -{ - Aig_MmFixed_t * p; - - p = ALLOC( Aig_MmFixed_t, 1 ); - memset( p, 0, sizeof(Aig_MmFixed_t) ); - - p->nEntrySize = nEntrySize; - p->nEntriesAlloc = 0; - p->nEntriesUsed = 0; - p->pEntriesFree = NULL; - - p->nChunkSize = nEntriesMax / 8; - if ( p->nChunkSize < 8 ) - p->nChunkSize = 8; - - p->nChunksAlloc = 64; - p->nChunks = 0; - p->pChunks = ALLOC( char *, p->nChunksAlloc ); - - p->nMemoryUsed = 0; - p->nMemoryAlloc = 0; - return p; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_MmFixedStop( Aig_MmFixed_t * p, int fVerbose ) -{ - int i; - if ( p == NULL ) - return; - if ( fVerbose ) - { - printf( "Fixed memory manager: Entry = %5d. Chunk = %5d. Chunks used = %5d.\n", - p->nEntrySize, p->nChunkSize, p->nChunks ); - printf( " Entries used = %8d. Entries peak = %8d. Memory used = %8d. Memory alloc = %8d.\n", - p->nEntriesUsed, p->nEntriesMax, p->nEntrySize * p->nEntriesUsed, p->nMemoryAlloc ); - } - for ( i = 0; i < p->nChunks; i++ ) - free( p->pChunks[i] ); - free( p->pChunks ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char * Aig_MmFixedEntryFetch( Aig_MmFixed_t * p ) -{ - char * pTemp; - int i; - - // check if there are still free entries - if ( p->nEntriesUsed == p->nEntriesAlloc ) - { // need to allocate more entries - assert( p->pEntriesFree == NULL ); - if ( p->nChunks == p->nChunksAlloc ) - { - p->nChunksAlloc *= 2; - p->pChunks = REALLOC( char *, p->pChunks, p->nChunksAlloc ); - } - p->pEntriesFree = ALLOC( char, p->nEntrySize * p->nChunkSize ); - p->nMemoryAlloc += p->nEntrySize * p->nChunkSize; - // transform these entries into a linked list - pTemp = p->pEntriesFree; - for ( i = 1; i < p->nChunkSize; i++ ) - { - *((char **)pTemp) = pTemp + p->nEntrySize; - pTemp += p->nEntrySize; - } - // set the last link - *((char **)pTemp) = NULL; - // add the chunk to the chunk storage - p->pChunks[ p->nChunks++ ] = p->pEntriesFree; - // add to the number of entries allocated - p->nEntriesAlloc += p->nChunkSize; - } - // incrememt the counter of used entries - p->nEntriesUsed++; - if ( p->nEntriesMax < p->nEntriesUsed ) - p->nEntriesMax = p->nEntriesUsed; - // return the first entry in the free entry list - pTemp = p->pEntriesFree; - p->pEntriesFree = *((char **)pTemp); - return pTemp; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_MmFixedEntryRecycle( Aig_MmFixed_t * p, char * pEntry ) -{ - // decrement the counter of used entries - p->nEntriesUsed--; - // add the entry to the linked list of free entries - *((char **)pEntry) = p->pEntriesFree; - p->pEntriesFree = pEntry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [Relocates all the memory except the first chunk.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_MmFixedRestart( Aig_MmFixed_t * p ) -{ - int i; - char * pTemp; - if ( p->nChunks == 0 ) - return; - // deallocate all chunks except the first one - for ( i = 1; i < p->nChunks; i++ ) - free( p->pChunks[i] ); - p->nChunks = 1; - // transform these entries into a linked list - pTemp = p->pChunks[0]; - for ( i = 1; i < p->nChunkSize; i++ ) - { - *((char **)pTemp) = pTemp + p->nEntrySize; - pTemp += p->nEntrySize; - } - // set the last link - *((char **)pTemp) = NULL; - // set the free entry list - p->pEntriesFree = p->pChunks[0]; - // set the correct statistics - p->nMemoryAlloc = p->nEntrySize * p->nChunkSize; - p->nMemoryUsed = 0; - p->nEntriesAlloc = p->nChunkSize; - p->nEntriesUsed = 0; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_MmFixedReadMemUsage( Aig_MmFixed_t * p ) -{ - return p->nMemoryAlloc; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_MmFixedReadMaxEntriesUsed( Aig_MmFixed_t * p ) -{ - return p->nEntriesMax; -} - - - -/**Function************************************************************* - - Synopsis [Allocates entries of flexible size.] - - Description [Can only work with entry size at least 4 byte long.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_MmFlex_t * Aig_MmFlexStart() -{ - Aig_MmFlex_t * p; - - p = ALLOC( Aig_MmFlex_t, 1 ); - memset( p, 0, sizeof(Aig_MmFlex_t) ); - - p->nEntriesUsed = 0; - p->pCurrent = NULL; - p->pEnd = NULL; - - p->nChunkSize = (1 << 18); - p->nChunksAlloc = 64; - p->nChunks = 0; - p->pChunks = ALLOC( char *, p->nChunksAlloc ); - - p->nMemoryUsed = 0; - p->nMemoryAlloc = 0; - return p; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_MmFlexStop( Aig_MmFlex_t * p, int fVerbose ) -{ - int i; - if ( p == NULL ) - return; - if ( fVerbose ) - { - printf( "Flexible memory manager: Chunk size = %d. Chunks used = %d.\n", - p->nChunkSize, p->nChunks ); - printf( " Entries used = %d. Memory used = %d. Memory alloc = %d.\n", - p->nEntriesUsed, p->nMemoryUsed, p->nMemoryAlloc ); - } - for ( i = 0; i < p->nChunks; i++ ) - free( p->pChunks[i] ); - free( p->pChunks ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char * Aig_MmFlexEntryFetch( Aig_MmFlex_t * p, int nBytes ) -{ - char * pTemp; - // check if there are still free entries - if ( p->pCurrent == NULL || p->pCurrent + nBytes > p->pEnd ) - { // need to allocate more entries - if ( p->nChunks == p->nChunksAlloc ) - { - p->nChunksAlloc *= 2; - p->pChunks = REALLOC( char *, p->pChunks, p->nChunksAlloc ); - } - if ( nBytes > p->nChunkSize ) - { - // resize the chunk size if more memory is requested than it can give - // (ideally, this should never happen) - p->nChunkSize = 2 * nBytes; - } - p->pCurrent = ALLOC( char, p->nChunkSize ); - p->pEnd = p->pCurrent + p->nChunkSize; - p->nMemoryAlloc += p->nChunkSize; - // add the chunk to the chunk storage - p->pChunks[ p->nChunks++ ] = p->pCurrent; - } - assert( p->pCurrent + nBytes <= p->pEnd ); - // increment the counter of used entries - p->nEntriesUsed++; - // keep track of the memory used - p->nMemoryUsed += nBytes; - // return the next entry - pTemp = p->pCurrent; - p->pCurrent += nBytes; - return pTemp; -} - -/**Function************************************************************* - - Synopsis [] - - Description [Relocates all the memory except the first chunk.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_MmFlexRestart( Aig_MmFlex_t * p ) -{ - int i; - if ( p->nChunks == 0 ) - return; - // deallocate all chunks except the first one - for ( i = 1; i < p->nChunks; i++ ) - free( p->pChunks[i] ); - p->nChunks = 1; - p->nMemoryAlloc = p->nChunkSize; - // transform these entries into a linked list - p->pCurrent = p->pChunks[0]; - p->pEnd = p->pCurrent + p->nChunkSize; - p->nEntriesUsed = 0; - p->nMemoryUsed = 0; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_MmFlexReadMemUsage( Aig_MmFlex_t * p ) -{ - return p->nMemoryUsed; -} - - - - - -/**Function************************************************************* - - Synopsis [Starts the hierarchical memory manager.] - - Description [This manager can allocate entries of any size. - Iternally they are mapped into the entries with the number of bytes - equal to the power of 2. The smallest entry size is 8 bytes. The - next one is 16 bytes etc. So, if the user requests 6 bytes, he gets - 8 byte entry. If we asks for 25 bytes, he gets 32 byte entry etc. - The input parameters "nSteps" says how many fixed memory managers - are employed internally. Calling this procedure with nSteps equal - to 10 results in 10 hierarchically arranged internal memory managers, - which can allocate up to 4096 (1Kb) entries. Requests for larger - entries are handed over to malloc() and then free()ed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_MmStep_t * Aig_MmStepStart( int nSteps ) -{ - Aig_MmStep_t * p; - int i, k; - p = ALLOC( Aig_MmStep_t, 1 ); - memset( p, 0, sizeof(Aig_MmStep_t) ); - p->nMems = nSteps; - // start the fixed memory managers - p->pMems = ALLOC( Aig_MmFixed_t *, p->nMems ); - for ( i = 0; i < p->nMems; i++ ) - p->pMems[i] = Aig_MmFixedStart( (8<nMapSize = (4<nMems); - p->pMap = ALLOC( Aig_MmFixed_t *, p->nMapSize+1 ); - p->pMap[0] = NULL; - for ( k = 1; k <= 4; k++ ) - p->pMap[k] = p->pMems[0]; - for ( i = 0; i < p->nMems; i++ ) - for ( k = (4<pMap[k] = p->pMems[i]; -//for ( i = 1; i < 100; i ++ ) -//printf( "%10d: size = %10d\n", i, p->pMap[i]->nEntrySize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the memory manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_MmStepStop( Aig_MmStep_t * p, int fVerbose ) -{ - int i; - for ( i = 0; i < p->nMems; i++ ) - Aig_MmFixedStop( p->pMems[i], fVerbose ); -// if ( p->pLargeChunks ) -// { -// for ( i = 0; i < p->nLargeChunks; i++ ) -// free( p->pLargeChunks[i] ); -// free( p->pLargeChunks ); -// } - free( p->pMems ); - free( p->pMap ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Creates the entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char * Aig_MmStepEntryFetch( Aig_MmStep_t * p, int nBytes ) -{ - if ( nBytes == 0 ) - return NULL; - if ( nBytes > p->nMapSize ) - { -// printf( "Allocating %d bytes.\n", nBytes ); -/* - if ( p->nLargeChunks == p->nLargeChunksAlloc ) - { - if ( p->nLargeChunksAlloc == 0 ) - p->nLargeChunksAlloc = 5; - p->nLargeChunksAlloc *= 2; - p->pLargeChunks = REALLOC( char *, p->pLargeChunks, p->nLargeChunksAlloc ); - } - p->pLargeChunks[ p->nLargeChunks++ ] = ALLOC( char, nBytes ); - return p->pLargeChunks[ p->nLargeChunks - 1 ]; -*/ - return ALLOC( char, nBytes ); - } - return Aig_MmFixedEntryFetch( p->pMap[nBytes] ); -} - - -/**Function************************************************************* - - Synopsis [Recycles the entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_MmStepEntryRecycle( Aig_MmStep_t * p, char * pEntry, int nBytes ) -{ - if ( nBytes == 0 ) - return; - if ( nBytes > p->nMapSize ) - { - free( pEntry ); - return; - } - Aig_MmFixedEntryRecycle( p->pMap[nBytes], pEntry ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_MmStepReadMemUsage( Aig_MmStep_t * p ) -{ - int i, nMemTotal = 0; - for ( i = 0; i < p->nMems; i++ ) - nMemTotal += p->pMems[i]->nMemoryAlloc; - return nMemTotal; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigMffc.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigMffc.c deleted file mode 100644 index daeed2810..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigMffc.c +++ /dev/null @@ -1,297 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigMffc.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Computation of MFFCs.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigMffc.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Dereferences the node's MFFC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeDeref_rec( Aig_Obj_t * pNode, unsigned LevelMin ) -{ - Aig_Obj_t * pFanin; - int Counter = 0; - if ( Aig_ObjIsPi(pNode) ) - return 0; - // consider the first fanin - pFanin = Aig_ObjFanin0(pNode); - assert( pFanin->nRefs > 0 ); - if ( --pFanin->nRefs == 0 && (!LevelMin || pFanin->Level > LevelMin) ) - Counter += Aig_NodeDeref_rec( pFanin, LevelMin ); - // skip the buffer - if ( Aig_ObjIsBuf(pNode) ) - return Counter; - assert( Aig_ObjIsNode(pNode) ); - // consider the second fanin - pFanin = Aig_ObjFanin1(pNode); - assert( pFanin->nRefs > 0 ); - if ( --pFanin->nRefs == 0 && (!LevelMin || pFanin->Level > LevelMin) ) - Counter += Aig_NodeDeref_rec( pFanin, LevelMin ); - return Counter + 1; -} - -/**Function************************************************************* - - Synopsis [References the node's MFFC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeRef_rec( Aig_Obj_t * pNode, unsigned LevelMin ) -{ - Aig_Obj_t * pFanin; - int Counter = 0; - if ( Aig_ObjIsPi(pNode) ) - return 0; - // consider the first fanin - pFanin = Aig_ObjFanin0(pNode); - if ( pFanin->nRefs++ == 0 && (!LevelMin || pFanin->Level > LevelMin) ) - Counter += Aig_NodeRef_rec( pFanin, LevelMin ); - // skip the buffer - if ( Aig_ObjIsBuf(pNode) ) - return Counter; - assert( Aig_ObjIsNode(pNode) ); - // consider the second fanin - pFanin = Aig_ObjFanin1(pNode); - if ( pFanin->nRefs++ == 0 && (!LevelMin || pFanin->Level > LevelMin) ) - Counter += Aig_NodeRef_rec( pFanin, LevelMin ); - return Counter + 1; -} - -/**Function************************************************************* - - Synopsis [References the node's MFFC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeRefLabel_rec( Aig_Man_t * p, Aig_Obj_t * pNode, unsigned LevelMin ) -{ - Aig_Obj_t * pFanin; - int Counter = 0; - if ( Aig_ObjIsPi(pNode) ) - return 0; - Aig_ObjSetTravIdCurrent( p, pNode ); - // consider the first fanin - pFanin = Aig_ObjFanin0(pNode); - if ( pFanin->nRefs++ == 0 && (!LevelMin || pFanin->Level > LevelMin) ) - Counter += Aig_NodeRefLabel_rec( p, pFanin, LevelMin ); - if ( Aig_ObjIsBuf(pNode) ) - return Counter; - assert( Aig_ObjIsNode(pNode) ); - // consider the second fanin - pFanin = Aig_ObjFanin1(pNode); - if ( pFanin->nRefs++ == 0 && (!LevelMin || pFanin->Level > LevelMin) ) - Counter += Aig_NodeRefLabel_rec( p, pFanin, LevelMin ); - return Counter + 1; -} - -/**Function************************************************************* - - Synopsis [Collects the internal and boundary nodes in the derefed MFFC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_NodeMffsSupp_rec( Aig_Man_t * p, Aig_Obj_t * pNode, unsigned LevelMin, Vec_Ptr_t * vSupp, int fTopmost, Aig_Obj_t * pObjSkip ) -{ - // skip visited nodes - if ( Aig_ObjIsTravIdCurrent(p, pNode) ) - return; - Aig_ObjSetTravIdCurrent(p, pNode); - // add to the new support nodes - if ( !fTopmost && pNode != pObjSkip && (Aig_ObjIsPi(pNode) || pNode->nRefs > 0 || pNode->Level <= LevelMin) ) - { - if ( vSupp ) Vec_PtrPush( vSupp, pNode ); - return; - } - assert( Aig_ObjIsNode(pNode) ); - // recur on the children - Aig_NodeMffsSupp_rec( p, Aig_ObjFanin0(pNode), LevelMin, vSupp, 0, pObjSkip ); - Aig_NodeMffsSupp_rec( p, Aig_ObjFanin1(pNode), LevelMin, vSupp, 0, pObjSkip ); -} - -/**Function************************************************************* - - Synopsis [Collects the support of depth-limited MFFC.] - - Description [Returns the number of internal nodes in the MFFC.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeMffsSupp( Aig_Man_t * p, Aig_Obj_t * pNode, int LevelMin, Vec_Ptr_t * vSupp ) -{ - int ConeSize1, ConeSize2; - assert( !Aig_IsComplement(pNode) ); - assert( Aig_ObjIsNode(pNode) ); - if ( vSupp ) Vec_PtrClear( vSupp ); - Aig_ManIncrementTravId( p ); - ConeSize1 = Aig_NodeDeref_rec( pNode, LevelMin ); - Aig_NodeMffsSupp_rec( p, pNode, LevelMin, vSupp, 1, NULL ); - ConeSize2 = Aig_NodeRef_rec( pNode, LevelMin ); - assert( ConeSize1 == ConeSize2 ); - assert( ConeSize1 > 0 ); - return ConeSize1; -} - -/**Function************************************************************* - - Synopsis [Labels the nodes in the MFFC.] - - Description [Returns the number of internal nodes in the MFFC.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeMffsLabel( Aig_Man_t * p, Aig_Obj_t * pNode ) -{ - int ConeSize1, ConeSize2; - assert( !Aig_IsComplement(pNode) ); - assert( Aig_ObjIsNode(pNode) ); - Aig_ManIncrementTravId( p ); - ConeSize1 = Aig_NodeDeref_rec( pNode, 0 ); - ConeSize2 = Aig_NodeRefLabel_rec( p, pNode, 0 ); - assert( ConeSize1 == ConeSize2 ); - assert( ConeSize1 > 0 ); - return ConeSize1; -} - -/**Function************************************************************* - - Synopsis [Labels the nodes in the MFFC.] - - Description [Returns the number of internal nodes in the MFFC.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeMffsLabelCut( Aig_Man_t * p, Aig_Obj_t * pNode, Vec_Ptr_t * vLeaves ) -{ - Aig_Obj_t * pObj; - int i, ConeSize1, ConeSize2; - assert( !Aig_IsComplement(pNode) ); - assert( Aig_ObjIsNode(pNode) ); - Aig_ManIncrementTravId( p ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->nRefs++; - ConeSize1 = Aig_NodeDeref_rec( pNode, 0 ); - ConeSize2 = Aig_NodeRefLabel_rec( p, pNode, 0 ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->nRefs--; - assert( ConeSize1 == ConeSize2 ); - assert( ConeSize1 > 0 ); - return ConeSize1; -} - -/**Function************************************************************* - - Synopsis [Expands the cut by adding the most closely related node.] - - Description [Returns 1 if the cut exists.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeMffsExtendCut( Aig_Man_t * p, Aig_Obj_t * pNode, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vResult ) -{ - Aig_Obj_t * pObj, * pLeafBest; - int i, LevelMax, ConeSize1, ConeSize2, ConeCur1, ConeCur2, ConeBest; - // dereference the current cut - LevelMax = 0; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - LevelMax = AIG_MAX( LevelMax, (int)pObj->Level ); - if ( LevelMax == 0 ) - return 0; - // dereference the cut - ConeSize1 = Aig_NodeDeref_rec( pNode, 0 ); - // try expanding each node in the boundary - ConeBest = AIG_INFINITY; - pLeafBest = NULL; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - { - if ( (int)pObj->Level != LevelMax ) - continue; - ConeCur1 = Aig_NodeDeref_rec( pObj, 0 ); - if ( ConeBest > ConeCur1 ) - { - ConeBest = ConeCur1; - pLeafBest = pObj; - } - ConeCur2 = Aig_NodeRef_rec( pObj, 0 ); - assert( ConeCur1 == ConeCur2 ); - } - assert( pLeafBest != NULL ); - assert( Aig_ObjIsNode(pLeafBest) ); - // deref the best leaf - ConeCur1 = Aig_NodeDeref_rec( pLeafBest, 0 ); - // collect the cut nodes - Vec_PtrClear( vResult ); - Aig_ManIncrementTravId( p ); - Aig_NodeMffsSupp_rec( p, pNode, 0, vResult, 1, pLeafBest ); - // ref the nodes - ConeCur2 = Aig_NodeRef_rec( pLeafBest, 0 ); - assert( ConeCur1 == ConeCur2 ); - // ref the original node - ConeSize2 = Aig_NodeRef_rec( pNode, 0 ); - assert( ConeSize1 == ConeSize2 ); - return 1; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigObj.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigObj.c deleted file mode 100644 index ae8b23855..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigObj.c +++ /dev/null @@ -1,416 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigObj.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Adding/removing objects.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigObj.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Creates primary input.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ObjCreatePi( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - pObj = Aig_ManFetchMemory( p ); - pObj->Type = AIG_OBJ_PI; - Vec_PtrPush( p->vPis, pObj ); - p->nObjs[AIG_OBJ_PI]++; - return pObj; -} - -/**Function************************************************************* - - Synopsis [Creates primary output with the given driver.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ObjCreatePo( Aig_Man_t * p, Aig_Obj_t * pDriver ) -{ - Aig_Obj_t * pObj; - pObj = Aig_ManFetchMemory( p ); - pObj->Type = AIG_OBJ_PO; - Vec_PtrPush( p->vPos, pObj ); - Aig_ObjConnect( p, pObj, pDriver, NULL ); - p->nObjs[AIG_OBJ_PO]++; - return pObj; -} - - -/**Function************************************************************* - - Synopsis [Create the new node assuming it does not exist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ObjCreate( Aig_Man_t * p, Aig_Obj_t * pGhost ) -{ - Aig_Obj_t * pObj; - assert( !Aig_IsComplement(pGhost) ); - assert( Aig_ObjIsHash(pGhost) ); - assert( pGhost == &p->Ghost ); - // get memory for the new object - pObj = Aig_ManFetchMemory( p ); - pObj->Type = pGhost->Type; - // add connections - Aig_ObjConnect( p, pObj, pGhost->pFanin0, pGhost->pFanin1 ); - // update node counters of the manager - p->nObjs[Aig_ObjType(pObj)]++; - assert( pObj->pData == NULL ); - return pObj; -} - -/**Function************************************************************* - - Synopsis [Connect the object to the fanin.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjConnect( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFan0, Aig_Obj_t * pFan1 ) -{ - assert( !Aig_IsComplement(pObj) ); - assert( !Aig_ObjIsPi(pObj) ); - // add the first fanin - pObj->pFanin0 = pFan0; - pObj->pFanin1 = pFan1; - // increment references of the fanins and add their fanouts - if ( pFan0 != NULL ) - { - assert( Aig_ObjFanin0(pObj)->Type > 0 ); - Aig_ObjRef( Aig_ObjFanin0(pObj) ); - if ( p->pFanData ) - Aig_ObjAddFanout( p, Aig_ObjFanin0(pObj), pObj ); - } - if ( pFan1 != NULL ) - { - assert( Aig_ObjFanin1(pObj)->Type > 0 ); - Aig_ObjRef( Aig_ObjFanin1(pObj) ); - if ( p->pFanData ) - Aig_ObjAddFanout( p, Aig_ObjFanin1(pObj), pObj ); - } - // set level and phase - pObj->Level = Aig_ObjLevelNew( pObj ); - pObj->fPhase = Aig_ObjPhaseReal(pFan0) & Aig_ObjPhaseReal(pFan1); - // add the node to the structural hash table - if ( Aig_ObjIsHash(pObj) ) - Aig_TableInsert( p, pObj ); - // add the node to the dynamically updated topological order -// if ( p->pOrderData && Aig_ObjIsNode(pObj) ) -// Aig_ObjOrderInsert( p, pObj->Id ); -} - -/**Function************************************************************* - - Synopsis [Disconnects the object from the fanins.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjDisconnect( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - assert( !Aig_IsComplement(pObj) ); - // remove connections - if ( pObj->pFanin0 != NULL ) - { - if ( p->pFanData ) - Aig_ObjRemoveFanout( p, Aig_ObjFanin0(pObj), pObj ); - Aig_ObjDeref(Aig_ObjFanin0(pObj)); - } - if ( pObj->pFanin1 != NULL ) - { - if ( p->pFanData ) - Aig_ObjRemoveFanout( p, Aig_ObjFanin1(pObj), pObj ); - Aig_ObjDeref(Aig_ObjFanin1(pObj)); - } - // remove the node from the structural hash table - if ( Aig_ObjIsHash(pObj) ) - Aig_TableDelete( p, pObj ); - // add the first fanin - pObj->pFanin0 = NULL; - pObj->pFanin1 = NULL; - // remove the node from the dynamically updated topological order -// if ( p->pOrderData && Aig_ObjIsNode(pObj) ) -// Aig_ObjOrderRemove( p, pObj->Id ); -} - -/**Function************************************************************* - - Synopsis [Deletes the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjDelete( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - assert( !Aig_IsComplement(pObj) ); - assert( !Aig_ObjIsTerm(pObj) ); - assert( Aig_ObjRefs(pObj) == 0 ); - if ( p->pFanData && Aig_ObjIsBuf(pObj) ) - Vec_PtrRemove( p->vBufs, pObj ); - p->nObjs[pObj->Type]--; - Vec_PtrWriteEntry( p->vObjs, pObj->Id, NULL ); - Aig_ManRecycleMemory( p, pObj ); -} - -/**Function************************************************************* - - Synopsis [Deletes the MFFC of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjDelete_rec( Aig_Man_t * p, Aig_Obj_t * pObj, int fFreeTop ) -{ - Aig_Obj_t * pFanin0, * pFanin1; - assert( !Aig_IsComplement(pObj) ); - if ( Aig_ObjIsConst1(pObj) || Aig_ObjIsPi(pObj) ) - return; - assert( !Aig_ObjIsPo(pObj) ); - pFanin0 = Aig_ObjFanin0(pObj); - pFanin1 = Aig_ObjFanin1(pObj); - Aig_ObjDisconnect( p, pObj ); - if ( fFreeTop ) - Aig_ObjDelete( p, pObj ); - if ( pFanin0 && !Aig_ObjIsNone(pFanin0) && Aig_ObjRefs(pFanin0) == 0 ) - Aig_ObjDelete_rec( p, pFanin0, 1 ); - if ( pFanin1 && !Aig_ObjIsNone(pFanin1) && Aig_ObjRefs(pFanin1) == 0 ) - Aig_ObjDelete_rec( p, pFanin1, 1 ); -} - -/**Function************************************************************* - - Synopsis [Replaces the first fanin of the node by the new fanin.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjPatchFanin0( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFaninNew ) -{ - Aig_Obj_t * pFaninOld; - assert( !Aig_IsComplement(pObj) ); - assert( Aig_ObjIsPo(pObj) ); - pFaninOld = Aig_ObjFanin0(pObj); - // decrement ref and remove fanout - if ( p->pFanData ) - Aig_ObjRemoveFanout( p, pFaninOld, pObj ); - Aig_ObjDeref( pFaninOld ); - // update the fanin - pObj->pFanin0 = pFaninNew; - // increment ref and add fanout - if ( p->pFanData ) - Aig_ObjAddFanout( p, Aig_ObjFanin0(pObj), pObj ); - Aig_ObjRef( Aig_ObjFanin0(pObj) ); - // get rid of old fanin - if ( !Aig_ObjIsPi(pFaninOld) && !Aig_ObjIsConst1(pFaninOld) && Aig_ObjRefs(pFaninOld) == 0 ) - Aig_ObjDelete_rec( p, pFaninOld, 1 ); -} - -/**Function************************************************************* - - Synopsis [Replaces node with a buffer fanin by a node without them.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_NodeFixBufferFanins( Aig_Man_t * p, Aig_Obj_t * pObj, int fNodesOnly, int fUpdateLevel ) -{ - Aig_Obj_t * pFanReal0, * pFanReal1, * pResult; - p->nBufFixes++; - if ( Aig_ObjIsPo(pObj) ) - { - assert( Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) ); - pFanReal0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - assert( Aig_ObjPhaseReal(Aig_ObjChild0(pObj)) == Aig_ObjPhaseReal(pFanReal0) ); - Aig_ObjPatchFanin0( p, pObj, pFanReal0 ); - return; - } - assert( Aig_ObjIsNode(pObj) ); - assert( Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) || Aig_ObjIsBuf(Aig_ObjFanin1(pObj)) ); - // get the real fanins - pFanReal0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - pFanReal1 = Aig_ObjReal_rec( Aig_ObjChild1(pObj) ); - // get the new node - if ( Aig_ObjIsNode(pObj) ) - pResult = Aig_Oper( p, pFanReal0, pFanReal1, Aig_ObjType(pObj) ); -// else if ( Aig_ObjIsLatch(pObj) ) -// pResult = Aig_Latch( p, pFanReal0, Aig_ObjInit(pObj) ); - else - assert( 0 ); - // replace the node with buffer by the node without buffer - Aig_ObjReplace( p, pObj, pResult, fNodesOnly, fUpdateLevel ); -} - -/**Function************************************************************* - - Synopsis [Returns the number of dangling nodes removed.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManPropagateBuffers( Aig_Man_t * p, int fNodesOnly, int fUpdateLevel ) -{ - Aig_Obj_t * pObj; - int nSteps; - assert( p->pFanData ); - for ( nSteps = 0; Vec_PtrSize(p->vBufs) > 0; nSteps++ ) - { - // get the node with a buffer fanin - for ( pObj = Vec_PtrEntryLast(p->vBufs); Aig_ObjIsBuf(pObj); pObj = Aig_ObjFanout0(p, pObj) ); - // replace this node by a node without buffer - Aig_NodeFixBufferFanins( p, pObj, fNodesOnly, fUpdateLevel ); - // stop if a cycle occured - if ( nSteps > 1000000 ) - { - printf( "Error: A cycle is encountered while propagating buffers.\n" ); - break; - } - } - return nSteps; -} - -/**Function************************************************************* - - Synopsis [Replaces one object by another.] - - Description [The new object (pObjNew) should be used instead of the old - object (pObjOld). If the new object is complemented or used, the buffer - is added and the new object remains in the manager; otherwise, the new - object is deleted.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjReplace( Aig_Man_t * p, Aig_Obj_t * pObjOld, Aig_Obj_t * pObjNew, int fNodesOnly, int fUpdateLevel ) -{ - Aig_Obj_t * pObjNewR = Aig_Regular(pObjNew); - // the object to be replaced cannot be complemented - assert( !Aig_IsComplement(pObjOld) ); - // the object to be replaced cannot be a terminal - assert( !Aig_ObjIsPi(pObjOld) && !Aig_ObjIsPo(pObjOld) ); - // the object to be used cannot be a buffer or a PO - assert( !Aig_ObjIsBuf(pObjNewR) && !Aig_ObjIsPo(pObjNewR) ); - // the object cannot be the same - assert( pObjOld != pObjNewR ); - // make sure object is not pointing to itself - assert( pObjOld != Aig_ObjFanin0(pObjNewR) ); - assert( pObjOld != Aig_ObjFanin1(pObjNewR) ); - // recursively delete the old node - but leave the object there - pObjNewR->nRefs++; - Aig_ObjDelete_rec( p, pObjOld, 0 ); - pObjNewR->nRefs--; - // if the new object is complemented or already used, create a buffer - p->nObjs[pObjOld->Type]--; - if ( Aig_IsComplement(pObjNew) || Aig_ObjRefs(pObjNew) > 0 || (fNodesOnly && !Aig_ObjIsNode(pObjNew)) ) - { - pObjOld->Type = AIG_OBJ_BUF; - Aig_ObjConnect( p, pObjOld, pObjNew, NULL ); - p->nBufReplaces++; - } - else - { - Aig_Obj_t * pFanin0 = pObjNew->pFanin0; - Aig_Obj_t * pFanin1 = pObjNew->pFanin1; - int LevelOld = pObjOld->Level; - pObjOld->Type = pObjNew->Type; - Aig_ObjDisconnect( p, pObjNew ); - Aig_ObjConnect( p, pObjOld, pFanin0, pFanin1 ); - // delete the new object - Aig_ObjDelete( p, pObjNew ); - // update levels - if ( p->pFanData ) - { - pObjOld->Level = LevelOld; - Aig_ManUpdateLevel( p, pObjOld ); - } - if ( fUpdateLevel ) - { - Aig_ObjClearReverseLevel( p, pObjOld ); - Aig_ManUpdateReverseLevel( p, pObjOld ); - } - } - p->nObjs[pObjOld->Type]++; - // store buffers if fanout is allocated - if ( p->pFanData && Aig_ObjIsBuf(pObjOld) ) - { - Vec_PtrPush( p->vBufs, pObjOld ); - p->nBufMax = AIG_MAX( p->nBufMax, Vec_PtrSize(p->vBufs) ); - Aig_ManPropagateBuffers( p, fNodesOnly, fUpdateLevel ); - } -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigOper.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigOper.c deleted file mode 100644 index 8419b0148..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigOper.c +++ /dev/null @@ -1,532 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigOper.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [AIG operations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigOper.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -// procedure to detect an EXOR gate -static inline int Aig_ObjIsExorType( Aig_Obj_t * p0, Aig_Obj_t * p1, Aig_Obj_t ** ppFan0, Aig_Obj_t ** ppFan1 ) -{ - if ( !Aig_IsComplement(p0) || !Aig_IsComplement(p1) ) - return 0; - p0 = Aig_Regular(p0); - p1 = Aig_Regular(p1); - if ( !Aig_ObjIsAnd(p0) || !Aig_ObjIsAnd(p1) ) - return 0; - if ( Aig_ObjFanin0(p0) != Aig_ObjFanin0(p1) || Aig_ObjFanin1(p0) != Aig_ObjFanin1(p1) ) - return 0; - if ( Aig_ObjFaninC0(p0) == Aig_ObjFaninC0(p1) || Aig_ObjFaninC1(p0) == Aig_ObjFaninC1(p1) ) - return 0; - *ppFan0 = Aig_ObjChild0(p0); - *ppFan1 = Aig_ObjChild1(p0); - return 1; -} - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Returns i-th elementary variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_IthVar( Aig_Man_t * p, int i ) -{ - int v; - for ( v = Aig_ManPiNum(p); v <= i; v++ ) - Aig_ObjCreatePi( p ); - assert( i < Vec_PtrSize(p->vPis) ); - return Aig_ManPi( p, i ); -} - -/**Function************************************************************* - - Synopsis [Perform one operation.] - - Description [The argument nodes can be complemented.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Oper( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1, Aig_Type_t Type ) -{ - if ( Type == AIG_OBJ_AND ) - return Aig_And( p, p0, p1 ); - if ( Type == AIG_OBJ_EXOR ) - return Aig_Exor( p, p0, p1 ); - assert( 0 ); - return NULL; -} - -/**Function************************************************************* - - Synopsis [Creates the canonical form of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_CanonPair_rec( Aig_Man_t * p, Aig_Obj_t * pGhost ) -{ - Aig_Obj_t * pResult, * pLat0, * pLat1; - int fCompl0, fCompl1; - Aig_Type_t Type; - assert( Aig_ObjIsNode(pGhost) ); - // consider the case when the pair is canonical - if ( !Aig_ObjIsLatch(Aig_ObjFanin0(pGhost)) || !Aig_ObjIsLatch(Aig_ObjFanin1(pGhost)) ) - { - if ( (pResult = Aig_TableLookup( p, pGhost )) ) - return pResult; - return Aig_ObjCreate( p, pGhost ); - } - /// remember the latches - pLat0 = Aig_ObjFanin0(pGhost); - pLat1 = Aig_ObjFanin1(pGhost); - // remember type and compls - Type = Aig_ObjType(pGhost); - fCompl0 = Aig_ObjFaninC0(pGhost); - fCompl1 = Aig_ObjFaninC1(pGhost); - // call recursively - pResult = Aig_Oper( p, Aig_NotCond(Aig_ObjChild0(pLat0), fCompl0), Aig_NotCond(Aig_ObjChild0(pLat1), fCompl1), Type ); - // build latch on top of this - return Aig_Latch( p, pResult, (Type == AIG_OBJ_AND)? fCompl0 & fCompl1 : fCompl0 ^ fCompl1 ); -} - -/**Function************************************************************* - - Synopsis [Performs canonicization step.] - - Description [The argument nodes can be complemented.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_And( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1 ) -{ - Aig_Obj_t * pGhost, * pResult; -// Aig_Obj_t * pFan0, * pFan1; - // check trivial cases - if ( p0 == p1 ) - return p0; - if ( p0 == Aig_Not(p1) ) - return Aig_Not(p->pConst1); - if ( Aig_Regular(p0) == p->pConst1 ) - return p0 == p->pConst1 ? p1 : Aig_Not(p->pConst1); - if ( Aig_Regular(p1) == p->pConst1 ) - return p1 == p->pConst1 ? p0 : Aig_Not(p->pConst1); - // check not so trivial cases - if ( p->fAddStrash && (Aig_ObjIsNode(Aig_Regular(p0)) || Aig_ObjIsNode(Aig_Regular(p1))) ) - { // http://fmv.jku.at/papers/BrummayerBiere-MEMICS06.pdf - Aig_Obj_t * pFanA, * pFanB, * pFanC, * pFanD; - pFanA = Aig_ObjChild0(Aig_Regular(p0)); - pFanB = Aig_ObjChild1(Aig_Regular(p0)); - pFanC = Aig_ObjChild0(Aig_Regular(p1)); - pFanD = Aig_ObjChild1(Aig_Regular(p1)); - if ( Aig_IsComplement(p0) ) - { - if ( pFanA == Aig_Not(p1) || pFanB == Aig_Not(p1) ) - return p1; - if ( pFanB == p1 ) - return Aig_And( p, Aig_Not(pFanA), pFanB ); - if ( pFanA == p1 ) - return Aig_And( p, Aig_Not(pFanB), pFanA ); - } - else - { - if ( pFanA == Aig_Not(p1) || pFanB == Aig_Not(p1) ) - return Aig_Not(p->pConst1); - if ( pFanA == p1 || pFanB == p1 ) - return p0; - } - if ( Aig_IsComplement(p1) ) - { - if ( pFanC == Aig_Not(p0) || pFanD == Aig_Not(p0) ) - return p0; - if ( pFanD == p0 ) - return Aig_And( p, Aig_Not(pFanC), pFanD ); - if ( pFanC == p0 ) - return Aig_And( p, Aig_Not(pFanD), pFanC ); - } - else - { - if ( pFanC == Aig_Not(p0) || pFanD == Aig_Not(p0) ) - return Aig_Not(p->pConst1); - if ( pFanC == p0 || pFanD == p0 ) - return p1; - } - if ( !Aig_IsComplement(p0) && !Aig_IsComplement(p1) ) - { - if ( pFanA == Aig_Not(pFanC) || pFanA == Aig_Not(pFanD) || pFanB == Aig_Not(pFanC) || pFanB == Aig_Not(pFanD) ) - return Aig_Not(p->pConst1); - if ( pFanA == pFanC || pFanB == pFanC ) - return Aig_And( p, p0, pFanD ); - if ( pFanB == pFanC || pFanB == pFanD ) - return Aig_And( p, pFanA, p1 ); - if ( pFanA == pFanD || pFanB == pFanD ) - return Aig_And( p, p0, pFanC ); - if ( pFanA == pFanC || pFanA == pFanD ) - return Aig_And( p, pFanB, p1 ); - } - else if ( Aig_IsComplement(p0) && !Aig_IsComplement(p1) ) - { - if ( pFanA == Aig_Not(pFanC) || pFanA == Aig_Not(pFanD) || pFanB == Aig_Not(pFanC) || pFanB == Aig_Not(pFanD) ) - return p1; - if ( pFanB == pFanC || pFanB == pFanD ) - return Aig_And( p, Aig_Not(pFanA), p1 ); - if ( pFanA == pFanC || pFanA == pFanD ) - return Aig_And( p, Aig_Not(pFanB), p1 ); - } - else if ( !Aig_IsComplement(p0) && Aig_IsComplement(p1) ) - { - if ( pFanC == Aig_Not(pFanA) || pFanC == Aig_Not(pFanB) || pFanD == Aig_Not(pFanA) || pFanD == Aig_Not(pFanB) ) - return p0; - if ( pFanD == pFanA || pFanD == pFanB ) - return Aig_And( p, Aig_Not(pFanC), p0 ); - if ( pFanC == pFanA || pFanC == pFanB ) - return Aig_And( p, Aig_Not(pFanD), p0 ); - } - else // if ( Aig_IsComplement(p0) && Aig_IsComplement(p1) ) - { - if ( pFanA == pFanD && pFanB == Aig_Not(pFanC) ) - return Aig_Not(pFanA); - if ( pFanB == pFanC && pFanA == Aig_Not(pFanD) ) - return Aig_Not(pFanB); - if ( pFanA == pFanC && pFanB == Aig_Not(pFanD) ) - return Aig_Not(pFanA); - if ( pFanB == pFanD && pFanA == Aig_Not(pFanC) ) - return Aig_Not(pFanB); - } - } - // check if it can be an EXOR gate -// if ( Aig_ObjIsExorType( p0, p1, &pFan0, &pFan1 ) ) -// return Aig_Exor( p, pFan0, pFan1 ); - pGhost = Aig_ObjCreateGhost( p, p0, p1, AIG_OBJ_AND ); - pResult = Aig_CanonPair_rec( p, pGhost ); - return pResult; -} - -/**Function************************************************************* - - Synopsis [Creates the canonical form of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Latch( Aig_Man_t * p, Aig_Obj_t * pObj, int fInitOne ) -{ - Aig_Obj_t * pGhost, * pResult; - pGhost = Aig_ObjCreateGhost( p, Aig_NotCond(pObj, fInitOne), NULL, AIG_OBJ_LATCH ); - pResult = Aig_TableLookup( p, pGhost ); - if ( pResult == NULL ) - pResult = Aig_ObjCreate( p, pGhost ); - return Aig_NotCond( pResult, fInitOne ); -} - -/**Function************************************************************* - - Synopsis [Performs canonicization step.] - - Description [The argument nodes can be complemented.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Exor( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1 ) -{ -/* - Aig_Obj_t * pGhost, * pResult; - // check trivial cases - if ( p0 == p1 ) - return Aig_Not(p->pConst1); - if ( p0 == Aig_Not(p1) ) - return p->pConst1; - if ( Aig_Regular(p0) == p->pConst1 ) - return Aig_NotCond( p1, p0 == p->pConst1 ); - if ( Aig_Regular(p1) == p->pConst1 ) - return Aig_NotCond( p0, p1 == p->pConst1 ); - // check the table - pGhost = Aig_ObjCreateGhost( p, p0, p1, AIG_OBJ_EXOR ); - if ( pResult = Aig_TableLookup( p, pGhost ) ) - return pResult; - return Aig_ObjCreate( p, pGhost ); -*/ - return Aig_Or( p, Aig_And(p, p0, Aig_Not(p1)), Aig_And(p, Aig_Not(p0), p1) ); -} - -/**Function************************************************************* - - Synopsis [Implements Boolean OR.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Or( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1 ) -{ - return Aig_Not( Aig_And( p, Aig_Not(p0), Aig_Not(p1) ) ); -} - -/**Function************************************************************* - - Synopsis [Implements ITE operation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Mux( Aig_Man_t * p, Aig_Obj_t * pC, Aig_Obj_t * p1, Aig_Obj_t * p0 ) -{ -/* - Aig_Obj_t * pTempA1, * pTempA2, * pTempB1, * pTempB2, * pTemp; - int Count0, Count1; - // consider trivial cases - if ( p0 == Aig_Not(p1) ) - return Aig_Exor( p, pC, p0 ); - // other cases can be added - // implement the first MUX (F = C * x1 + C' * x0) - - // check for constants here!!! - - pTempA1 = Aig_TableLookup( p, Aig_ObjCreateGhost(p, pC, p1, AIG_OBJ_AND) ); - pTempA2 = Aig_TableLookup( p, Aig_ObjCreateGhost(p, Aig_Not(pC), p0, AIG_OBJ_AND) ); - if ( pTempA1 && pTempA2 ) - { - pTemp = Aig_TableLookup( p, Aig_ObjCreateGhost(p, Aig_Not(pTempA1), Aig_Not(pTempA2), AIG_OBJ_AND) ); - if ( pTemp ) return Aig_Not(pTemp); - } - Count0 = (pTempA1 != NULL) + (pTempA2 != NULL); - // implement the second MUX (F' = C * x1' + C' * x0') - pTempB1 = Aig_TableLookup( p, Aig_ObjCreateGhost(p, pC, Aig_Not(p1), AIG_OBJ_AND) ); - pTempB2 = Aig_TableLookup( p, Aig_ObjCreateGhost(p, Aig_Not(pC), Aig_Not(p0), AIG_OBJ_AND) ); - if ( pTempB1 && pTempB2 ) - { - pTemp = Aig_TableLookup( p, Aig_ObjCreateGhost(p, Aig_Not(pTempB1), Aig_Not(pTempB2), AIG_OBJ_AND) ); - if ( pTemp ) return pTemp; - } - Count1 = (pTempB1 != NULL) + (pTempB2 != NULL); - // compare and decide which one to implement - if ( Count0 >= Count1 ) - { - pTempA1 = pTempA1? pTempA1 : Aig_And(p, pC, p1); - pTempA2 = pTempA2? pTempA2 : Aig_And(p, Aig_Not(pC), p0); - return Aig_Or( p, pTempA1, pTempA2 ); - } - pTempB1 = pTempB1? pTempB1 : Aig_And(p, pC, Aig_Not(p1)); - pTempB2 = pTempB2? pTempB2 : Aig_And(p, Aig_Not(pC), Aig_Not(p0)); - return Aig_Not( Aig_Or( p, pTempB1, pTempB2 ) ); -*/ - return Aig_Or( p, Aig_And(p, pC, p1), Aig_And(p, Aig_Not(pC), p0) ); -} - -/**Function************************************************************* - - Synopsis [Implements ITE operation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Maj( Aig_Man_t * p, Aig_Obj_t * pA, Aig_Obj_t * pB, Aig_Obj_t * pC ) -{ - return Aig_Or( p, Aig_Or(p, Aig_And(p, pA, pB), Aig_And(p, pA, pC)), Aig_And(p, pB, pC) ); -} - -/**Function************************************************************* - - Synopsis [Constructs the well-balanced tree of gates.] - - Description [Disregards levels and possible logic sharing.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Multi_rec( Aig_Man_t * p, Aig_Obj_t ** ppObjs, int nObjs, Aig_Type_t Type ) -{ - Aig_Obj_t * pObj1, * pObj2; - if ( nObjs == 1 ) - return ppObjs[0]; - pObj1 = Aig_Multi_rec( p, ppObjs, nObjs/2, Type ); - pObj2 = Aig_Multi_rec( p, ppObjs + nObjs/2, nObjs - nObjs/2, Type ); - return Aig_Oper( p, pObj1, pObj2, Type ); -} - -/**Function************************************************************* - - Synopsis [Old code.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Multi( Aig_Man_t * p, Aig_Obj_t ** pArgs, int nArgs, Aig_Type_t Type ) -{ - assert( Type == AIG_OBJ_AND || Type == AIG_OBJ_EXOR ); - assert( nArgs > 0 ); - return Aig_Multi_rec( p, pArgs, nArgs, Type ); -} - -/**Function************************************************************* - - Synopsis [Implements the miter.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_Miter( Aig_Man_t * p, Vec_Ptr_t * vPairs ) -{ - int i; - assert( vPairs->nSize > 0 ); - assert( vPairs->nSize % 2 == 0 ); - for ( i = 0; i < vPairs->nSize; i += 2 ) - vPairs->pArray[i/2] = Aig_Not( Aig_Exor( p, vPairs->pArray[i], vPairs->pArray[i+1] ) ); - vPairs->nSize = vPairs->nSize/2; - return Aig_Not( Aig_Multi_rec( p, (Aig_Obj_t **)vPairs->pArray, vPairs->nSize, AIG_OBJ_AND ) ); -} - -/**Function************************************************************* - - Synopsis [Implements the miter.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_MiterTwo( Aig_Man_t * p, Vec_Ptr_t * vNodes1, Vec_Ptr_t * vNodes2 ) -{ - int i; - assert( vNodes1->nSize > 0 && vNodes1->nSize > 0 ); - assert( vNodes1->nSize == vNodes2->nSize ); - for ( i = 0; i < vNodes1->nSize; i++ ) - vNodes1->pArray[i] = Aig_Not( Aig_Exor( p, vNodes1->pArray[i], vNodes2->pArray[i] ) ); - return Aig_Not( Aig_Multi_rec( p, (Aig_Obj_t **)vNodes1->pArray, vNodes1->nSize, AIG_OBJ_AND ) ); -} - -/**Function************************************************************* - - Synopsis [Creates AND function with nVars inputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_CreateAnd( Aig_Man_t * p, int nVars ) -{ - Aig_Obj_t * pFunc; - int i; - pFunc = Aig_ManConst1( p ); - for ( i = 0; i < nVars; i++ ) - pFunc = Aig_And( p, pFunc, Aig_IthVar(p, i) ); - return pFunc; -} - -/**Function************************************************************* - - Synopsis [Creates AND function with nVars inputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_CreateOr( Aig_Man_t * p, int nVars ) -{ - Aig_Obj_t * pFunc; - int i; - pFunc = Aig_ManConst0( p ); - for ( i = 0; i < nVars; i++ ) - pFunc = Aig_Or( p, pFunc, Aig_IthVar(p, i) ); - return pFunc; -} - -/**Function************************************************************* - - Synopsis [Creates AND function with nVars inputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_CreateExor( Aig_Man_t * p, int nVars ) -{ - Aig_Obj_t * pFunc; - int i; - pFunc = Aig_ManConst0( p ); - for ( i = 0; i < nVars; i++ ) - pFunc = Aig_Exor( p, pFunc, Aig_IthVar(p, i) ); - return pFunc; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigOrder.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigOrder.c deleted file mode 100644 index b7fe762f5..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigOrder.c +++ /dev/null @@ -1,171 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigOrder.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Dynamically updated topological order.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigOrder.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Initializes the order datastructure.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManOrderStart( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - assert( Aig_ManBufNum(p) == 0 ); - // allocate order datastructure - assert( p->pOrderData == NULL ); - p->nOrderAlloc = 2 * Aig_ManObjNumMax(p); - if ( p->nOrderAlloc < (1<<12) ) - p->nOrderAlloc = (1<<12); - p->pOrderData = ALLOC( unsigned, 2 * p->nOrderAlloc ); - memset( p->pOrderData, 0xFF, sizeof(unsigned) * 2 * p->nOrderAlloc ); - // add the constant node - p->pOrderData[0] = p->pOrderData[1] = 0; - p->iPrev = p->iNext = 0; - // add the internal nodes - Aig_ManForEachNode( p, pObj, i ) - Aig_ObjOrderInsert( p, pObj->Id ); -} - -/**Function************************************************************* - - Synopsis [Deletes the order datastructure.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManOrderStop( Aig_Man_t * p ) -{ - assert( p->pOrderData ); - FREE( p->pOrderData ); - p->nOrderAlloc = 0; - p->iPrev = p->iNext = 0; -} - -/**Function************************************************************* - - Synopsis [Inserts an entry before iNext.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjOrderInsert( Aig_Man_t * p, int ObjId ) -{ - int iPrev; - assert( ObjId != 0 ); - assert( Aig_ObjIsNode( Aig_ManObj(p, ObjId) ) ); - if ( ObjId >= p->nOrderAlloc ) - { - int nOrderAlloc = 2 * ObjId; - p->pOrderData = REALLOC( unsigned, p->pOrderData, 2 * nOrderAlloc ); - memset( p->pOrderData + 2 * p->nOrderAlloc, 0xFF, sizeof(unsigned) * 2 * (nOrderAlloc - p->nOrderAlloc) ); - p->nOrderAlloc = nOrderAlloc; - } - assert( p->pOrderData[2*ObjId] == 0xFFFFFFFF ); // prev - assert( p->pOrderData[2*ObjId+1] == 0xFFFFFFFF ); // next - iPrev = p->pOrderData[2*p->iNext]; - assert( p->pOrderData[2*iPrev+1] == (unsigned)p->iNext ); - p->pOrderData[2*ObjId] = iPrev; - p->pOrderData[2*iPrev+1] = ObjId; - p->pOrderData[2*p->iNext] = ObjId; - p->pOrderData[2*ObjId+1] = p->iNext; - p->nAndTotal++; -} - -/**Function************************************************************* - - Synopsis [Removes the entry.] - - Description [If iPrev is removed, it slides backward. - If iNext is removed, it slides forward.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjOrderRemove( Aig_Man_t * p, int ObjId ) -{ - int iPrev, iNext; - assert( ObjId != 0 ); - assert( Aig_ObjIsNode( Aig_ManObj(p, ObjId) ) ); - iPrev = p->pOrderData[2*ObjId]; - iNext = p->pOrderData[2*ObjId+1]; - p->pOrderData[2*ObjId] = 0xFFFFFFFF; - p->pOrderData[2*ObjId+1] = 0xFFFFFFFF; - p->pOrderData[2*iNext] = iPrev; - p->pOrderData[2*iPrev+1] = iNext; - if ( p->iPrev == ObjId ) - { - p->nAndPrev--; - p->iPrev = iPrev; - } - if ( p->iNext == ObjId ) - p->iNext = iNext; - p->nAndTotal--; -} - -/**Function************************************************************* - - Synopsis [Advances the order forward.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjOrderAdvance( Aig_Man_t * p ) -{ - assert( p->pOrderData ); - assert( p->pOrderData[2*p->iPrev+1] == (unsigned)p->iNext ); - p->iPrev = p->iNext; - p->nAndPrev++; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigPart.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigPart.c deleted file mode 100644 index a4cc11635..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigPart.c +++ /dev/null @@ -1,990 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigPart.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [AIG partitioning package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigPart.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Part_Man_t_ Part_Man_t; -struct Part_Man_t_ -{ - int nChunkSize; // the size of one chunk of memory (~1 Mb) - int nStepSize; // the step size in saving memory (~64 bytes) - char * pFreeBuf; // the pointer to free memory - int nFreeSize; // the size of remaining free memory - Vec_Ptr_t * vMemory; // the memory allocated - Vec_Ptr_t * vFree; // the vector of free pieces of memory -}; - -typedef struct Part_One_t_ Part_One_t; -struct Part_One_t_ -{ - int nRefs; // the number of references - int nOuts; // the number of outputs - int nOutsAlloc; // the array size - int pOuts[0]; // the array of outputs -}; - -static inline int Part_SizeType( int nSize, int nStepSize ) { return nSize / nStepSize + ((nSize % nStepSize) > 0); } -static inline char * Part_OneNext( char * pPart ) { return *((char **)pPart); } -static inline void Part_OneSetNext( char * pPart, char * pNext ) { *((char **)pPart) = pNext; } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Start the memory manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Part_Man_t * Part_ManStart( int nChunkSize, int nStepSize ) -{ - Part_Man_t * p; - p = ALLOC( Part_Man_t, 1 ); - memset( p, 0, sizeof(Part_Man_t) ); - p->nChunkSize = nChunkSize; - p->nStepSize = nStepSize; - p->vMemory = Vec_PtrAlloc( 1000 ); - p->vFree = Vec_PtrAlloc( 1000 ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the memory manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Part_ManStop( Part_Man_t * p ) -{ - void * pMemory; - int i; - Vec_PtrForEachEntry( p->vMemory, pMemory, i ) - free( pMemory ); - Vec_PtrFree( p->vMemory ); - Vec_PtrFree( p->vFree ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Fetches the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char * Part_ManFetch( Part_Man_t * p, int nSize ) -{ - int Type, nSizeReal; - char * pMemory; - assert( nSize > 0 ); - Type = Part_SizeType( nSize, p->nStepSize ); - Vec_PtrFillExtra( p->vFree, Type + 1, NULL ); - if ( (pMemory = Vec_PtrEntry( p->vFree, Type )) ) - { - Vec_PtrWriteEntry( p->vFree, Type, Part_OneNext(pMemory) ); - return pMemory; - } - nSizeReal = p->nStepSize * Type; - if ( p->nFreeSize < nSizeReal ) - { - p->pFreeBuf = ALLOC( char, p->nChunkSize ); - p->nFreeSize = p->nChunkSize; - Vec_PtrPush( p->vMemory, p->pFreeBuf ); - } - assert( p->nFreeSize >= nSizeReal ); - pMemory = p->pFreeBuf; - p->pFreeBuf += nSizeReal; - p->nFreeSize -= nSizeReal; - return pMemory; -} - -/**Function************************************************************* - - Synopsis [Recycles the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Part_ManRecycle( Part_Man_t * p, char * pMemory, int nSize ) -{ - int Type; - Type = Part_SizeType( nSize, p->nStepSize ); - Vec_PtrFillExtra( p->vFree, Type + 1, NULL ); - Part_OneSetNext( pMemory, Vec_PtrEntry(p->vFree, Type) ); - Vec_PtrWriteEntry( p->vFree, Type, pMemory ); -} - -/**Function************************************************************* - - Synopsis [Fetches the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Part_One_t * Part_ManFetchEntry( Part_Man_t * p, int nWords, int nRefs ) -{ - Part_One_t * pPart; - pPart = (Part_One_t *)Part_ManFetch( p, sizeof(Part_One_t) + sizeof(int) * nWords ); - pPart->nRefs = nRefs; - pPart->nOuts = 0; - pPart->nOutsAlloc = nWords; - return pPart; -} - -/**Function************************************************************* - - Synopsis [Recycles the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Part_ManRecycleEntry( Part_Man_t * p, Part_One_t * pEntry ) -{ - assert( pEntry->nOuts <= pEntry->nOutsAlloc ); - assert( pEntry->nOuts >= pEntry->nOutsAlloc/2 ); - Part_ManRecycle( p, (char *)pEntry, sizeof(Part_One_t) + sizeof(int) * pEntry->nOutsAlloc ); -} - -/**Function************************************************************* - - Synopsis [Merges two entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Part_One_t * Part_ManMergeEntry( Part_Man_t * pMan, Part_One_t * p1, Part_One_t * p2, int nRefs ) -{ - Part_One_t * p = Part_ManFetchEntry( pMan, p1->nOuts + p2->nOuts, nRefs ); - int * pBeg1 = p1->pOuts; - int * pBeg2 = p2->pOuts; - int * pBeg = p->pOuts; - int * pEnd1 = p1->pOuts + p1->nOuts; - int * pEnd2 = p2->pOuts + p2->nOuts; - while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 ) - { - if ( *pBeg1 == *pBeg2 ) - *pBeg++ = *pBeg1++, pBeg2++; - else if ( *pBeg1 < *pBeg2 ) - *pBeg++ = *pBeg1++; - else - *pBeg++ = *pBeg2++; - } - while ( pBeg1 < pEnd1 ) - *pBeg++ = *pBeg1++; - while ( pBeg2 < pEnd2 ) - *pBeg++ = *pBeg2++; - p->nOuts = pBeg - p->pOuts; - assert( p->nOuts <= p->nOutsAlloc ); - assert( p->nOuts >= p1->nOuts ); - assert( p->nOuts >= p2->nOuts ); - return p; -} - -/**Function************************************************************* - - Synopsis [Tranfers the entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Part_ManTransferEntry( Part_One_t * p ) -{ - Vec_Int_t * vSupp; - int i; - vSupp = Vec_IntAlloc( p->nOuts ); - for ( i = 0; i < p->nOuts; i++ ) - Vec_IntPush( vSupp, p->pOuts[i] ); - return vSupp; -} - -/**Function************************************************************* - - Synopsis [Computes supports of the POs in the multi-output AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManSupports( Aig_Man_t * pMan ) -{ - Vec_Ptr_t * vSupports; - Vec_Int_t * vSupp; - Part_Man_t * p; - Part_One_t * pPart0, * pPart1; - Aig_Obj_t * pObj; - int i; - // set the number of PIs/POs - Aig_ManForEachPi( pMan, pObj, i ) - pObj->pNext = (Aig_Obj_t *)(long)i; - Aig_ManForEachPo( pMan, pObj, i ) - pObj->pNext = (Aig_Obj_t *)(long)i; - // start the support computation manager - p = Part_ManStart( 1 << 20, 1 << 6 ); - // consider objects in the topological order - vSupports = Vec_PtrAlloc( Aig_ManPoNum(pMan) ); - Aig_ManCleanData(pMan); - Aig_ManForEachObj( pMan, pObj, i ) - { - if ( Aig_ObjIsNode(pObj) ) - { - pPart0 = Aig_ObjFanin0(pObj)->pData; - pPart1 = Aig_ObjFanin1(pObj)->pData; - pObj->pData = Part_ManMergeEntry( p, pPart0, pPart1, pObj->nRefs ); - assert( pPart0->nRefs > 0 ); - if ( --pPart0->nRefs == 0 ) - Part_ManRecycleEntry( p, pPart0 ); - assert( pPart1->nRefs > 0 ); - if ( --pPart1->nRefs == 0 ) - Part_ManRecycleEntry( p, pPart1 ); - continue; - } - if ( Aig_ObjIsPo(pObj) ) - { - pPart0 = Aig_ObjFanin0(pObj)->pData; - vSupp = Part_ManTransferEntry(pPart0); - Vec_IntPush( vSupp, (int)(long)pObj->pNext ); - Vec_PtrPush( vSupports, vSupp ); - assert( pPart0->nRefs > 0 ); - if ( --pPart0->nRefs == 0 ) - Part_ManRecycleEntry( p, pPart0 ); - continue; - } - if ( Aig_ObjIsPi(pObj) ) - { - if ( pObj->nRefs ) - { - pPart0 = Part_ManFetchEntry( p, 1, pObj->nRefs ); - pPart0->pOuts[ pPart0->nOuts++ ] = (int)(long)pObj->pNext; - pObj->pData = pPart0; - } - continue; - } - if ( Aig_ObjIsConst1(pObj) ) - { - if ( pObj->nRefs ) - pObj->pData = Part_ManFetchEntry( p, 0, pObj->nRefs ); - continue; - } - assert( 0 ); - } -//printf( "Memory usage = %d Mb.\n", Vec_PtrSize(p->vMemory) * p->nChunkSize / (1<<20) ); - Part_ManStop( p ); - // sort supports by size - Vec_VecSort( (Vec_Vec_t *)vSupports, 1 ); - // clear the number of PIs/POs - Aig_ManForEachPi( pMan, pObj, i ) - pObj->pNext = NULL; - Aig_ManForEachPo( pMan, pObj, i ) - pObj->pNext = NULL; -/* - Aig_ManForEachPo( pMan, pObj, i ) - printf( "%d ", Vec_IntSize( (Vec_Int_t *)Vec_VecEntry(vSupports, i) ) ); - printf( "\n" ); -*/ - return vSupports; -} - -/**Function************************************************************* - - Synopsis [Start char-bases support representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Aig_ManSuppCharStart( Vec_Int_t * vOne, int nPis ) -{ - unsigned * pBuffer; - int i, Entry; - int nWords = Aig_BitWordNum(nPis); - pBuffer = ALLOC( unsigned, nWords ); - memset( pBuffer, 0, sizeof(unsigned) * nWords ); - Vec_IntForEachEntry( vOne, Entry, i ) - { - assert( Entry < nPis ); - Aig_InfoSetBit( pBuffer, Entry ); - } - return pBuffer; -} - -/**Function************************************************************* - - Synopsis [Add to char-bases support representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManSuppCharAdd( unsigned * pBuffer, Vec_Int_t * vOne, int nPis ) -{ - int i, Entry; - Vec_IntForEachEntry( vOne, Entry, i ) - { - assert( Entry < nPis ); - Aig_InfoSetBit( pBuffer, Entry ); - } -} - -/**Function************************************************************* - - Synopsis [Find the common variables using char-bases support representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManSuppCharCommon( unsigned * pBuffer, Vec_Int_t * vOne ) -{ - int i, Entry, nCommon = 0; - Vec_IntForEachEntry( vOne, Entry, i ) - nCommon += Aig_InfoHasBit(pBuffer, Entry); - return nCommon; -} - -/**Function************************************************************* - - Synopsis [Find the best partition.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManPartitionSmartFindPart( Vec_Ptr_t * vPartSuppsAll, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsBit, int nSuppSizeLimit, Vec_Int_t * vOne ) -{ - Vec_Int_t * vPartSupp;//, * vPart; - int Attract, Repulse, Value, ValueBest; - int i, nCommon, iBest; - iBest = -1; - ValueBest = 0; - Vec_PtrForEachEntry( vPartSuppsAll, vPartSupp, i ) - { -// vPart = Vec_PtrEntry( vPartsAll, i ); -// if ( nSuppSizeLimit > 0 && Vec_IntSize(vPart) >= nSuppSizeLimit ) -// continue; -// nCommon = Vec_IntTwoCountCommon( vPartSupp, vOne ); - nCommon = Aig_ManSuppCharCommon( Vec_PtrEntry(vPartSuppsBit, i), vOne ); - if ( nCommon == 0 ) - continue; - if ( nCommon == Vec_IntSize(vOne) ) - return i; - // skip partitions whose size exceeds the limit - if ( nSuppSizeLimit > 0 && Vec_IntSize(vPartSupp) >= 2 * nSuppSizeLimit ) - continue; - Attract = 1000 * nCommon / Vec_IntSize(vOne); - if ( Vec_IntSize(vPartSupp) < 100 ) - Repulse = 1; - else - Repulse = 1+Aig_Base2Log(Vec_IntSize(vPartSupp)-100); - Value = Attract/Repulse; - if ( ValueBest < Value ) - { - ValueBest = Value; - iBest = i; - } - } - if ( ValueBest < 75 ) - return -1; - return iBest; -} - -/**Function************************************************************* - - Synopsis [Perform the smart partitioning.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManPartitionPrint( Aig_Man_t * p, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll ) -{ - Vec_Int_t * vOne; - int i, nOutputs, Counter; - - Counter = 0; - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - { - nOutputs = Vec_IntSize(Vec_PtrEntry(vPartsAll, i)); - printf( "%d=(%d,%d) ", i, Vec_IntSize(vOne), nOutputs ); - Counter += nOutputs; - if ( i == Vec_PtrSize(vPartsAll) - 1 ) - break; - } - assert( Counter == Aig_ManPoNum(p) ); -// printf( "\nTotal = %d. Outputs = %d.\n", Counter, Aig_ManPoNum(p) ); -} - -/**Function************************************************************* - - Synopsis [Perform the smart partitioning.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManPartitionCompact( Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll, int nSuppSizeLimit ) -{ - Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp; - int i, iPart; - - if ( nSuppSizeLimit == 0 ) - nSuppSizeLimit = 200; - - // pack smaller partitions into larger blocks - iPart = 0; - vPart = vPartSupp = NULL; - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - { - if ( Vec_IntSize(vOne) < nSuppSizeLimit ) - { - if ( vPartSupp == NULL ) - { - assert( vPart == NULL ); - vPartSupp = Vec_IntDup(vOne); - vPart = Vec_PtrEntry(vPartsAll, i); - } - else - { - vPartSupp = Vec_IntTwoMerge( vTemp = vPartSupp, vOne ); - Vec_IntFree( vTemp ); - vPart = Vec_IntTwoMerge( vTemp = vPart, Vec_PtrEntry(vPartsAll, i) ); - Vec_IntFree( vTemp ); - Vec_IntFree( Vec_PtrEntry(vPartsAll, i) ); - } - if ( Vec_IntSize(vPartSupp) < nSuppSizeLimit ) - continue; - } - else - vPart = Vec_PtrEntry(vPartsAll, i); - // add the partition - Vec_PtrWriteEntry( vPartsAll, iPart, vPart ); - vPart = NULL; - if ( vPartSupp ) - { - Vec_IntFree( Vec_PtrEntry(vPartSuppsAll, iPart) ); - Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp ); - vPartSupp = NULL; - } - iPart++; - } - // add the last one - if ( vPart ) - { - Vec_PtrWriteEntry( vPartsAll, iPart, vPart ); - vPart = NULL; - - assert( vPartSupp != NULL ); - Vec_IntFree( Vec_PtrEntry(vPartSuppsAll, iPart) ); - Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp ); - vPartSupp = NULL; - iPart++; - } - Vec_PtrShrink( vPartsAll, iPart ); - Vec_PtrShrink( vPartsAll, iPart ); -} - -/**Function************************************************************* - - Synopsis [Perform the smart partitioning.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManPartitionSmart( Aig_Man_t * p, int nSuppSizeLimit, int fVerbose, Vec_Ptr_t ** pvPartSupps ) -{ - Vec_Ptr_t * vPartSuppsBit; - Vec_Ptr_t * vSupports, * vPartsAll, * vPartsAll2, * vPartSuppsAll;//, * vPartPtr; - Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp; - int i, iPart, iOut, clk; - - // compute the supports for all outputs -clk = clock(); - vSupports = Aig_ManSupports( p ); -if ( fVerbose ) -{ -PRT( "Supps", clock() - clk ); -} - // start char-based support representation - vPartSuppsBit = Vec_PtrAlloc( 1000 ); - - // create partitions -clk = clock(); - vPartsAll = Vec_PtrAlloc( 256 ); - vPartSuppsAll = Vec_PtrAlloc( 256 ); - Vec_PtrForEachEntry( vSupports, vOne, i ) - { - // get the output number - iOut = Vec_IntPop(vOne); - // find closely matching part - iPart = Aig_ManPartitionSmartFindPart( vPartSuppsAll, vPartsAll, vPartSuppsBit, nSuppSizeLimit, vOne ); - if ( iPart == -1 ) - { - // create new partition - vPart = Vec_IntAlloc( 32 ); - Vec_IntPush( vPart, iOut ); - // create new partition support - vPartSupp = Vec_IntDup( vOne ); - // add this partition and its support - Vec_PtrPush( vPartsAll, vPart ); - Vec_PtrPush( vPartSuppsAll, vPartSupp ); - - Vec_PtrPush( vPartSuppsBit, Aig_ManSuppCharStart(vOne, Aig_ManPiNum(p)) ); - } - else - { - // add output to this partition - vPart = Vec_PtrEntry( vPartsAll, iPart ); - Vec_IntPush( vPart, iOut ); - // merge supports - vPartSupp = Vec_PtrEntry( vPartSuppsAll, iPart ); - vPartSupp = Vec_IntTwoMerge( vTemp = vPartSupp, vOne ); - Vec_IntFree( vTemp ); - // reinsert new support - Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp ); - - Aig_ManSuppCharAdd( Vec_PtrEntry(vPartSuppsBit, iPart), vOne, Aig_ManPiNum(p) ); - } - } - - // stop char-based support representation - Vec_PtrForEachEntry( vPartSuppsBit, vTemp, i ) - free( vTemp ); - Vec_PtrFree( vPartSuppsBit ); - -//printf( "\n" ); -if ( fVerbose ) -{ -PRT( "Parts", clock() - clk ); -} - -clk = clock(); - // reorder partitions in the decreasing order of support sizes - // remember partition number in each partition support - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - Vec_IntPush( vOne, i ); - // sort the supports in the decreasing order - Vec_VecSort( (Vec_Vec_t *)vPartSuppsAll, 1 ); - // reproduce partitions - vPartsAll2 = Vec_PtrAlloc( 256 ); - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - Vec_PtrPush( vPartsAll2, Vec_PtrEntry(vPartsAll, Vec_IntPop(vOne)) ); - Vec_PtrFree( vPartsAll ); - vPartsAll = vPartsAll2; - - // compact small partitions -// Aig_ManPartitionPrint( p, vPartsAll, vPartSuppsAll ); - Aig_ManPartitionCompact( vPartsAll, vPartSuppsAll, nSuppSizeLimit ); - if ( fVerbose ) -// Aig_ManPartitionPrint( p, vPartsAll, vPartSuppsAll ); - printf( "Created %d partitions.\n", Vec_PtrSize(vPartsAll) ); - -if ( fVerbose ) -{ -//PRT( "Comps", clock() - clk ); -} - - // cleanup - Vec_VecFree( (Vec_Vec_t *)vSupports ); - if ( pvPartSupps == NULL ) - Vec_VecFree( (Vec_Vec_t *)vPartSuppsAll ); - else - *pvPartSupps = vPartSuppsAll; -/* - // converts from intergers to nodes - Vec_PtrForEachEntry( vPartsAll, vPart, iPart ) - { - vPartPtr = Vec_PtrAlloc( Vec_IntSize(vPart) ); - Vec_IntForEachEntry( vPart, iOut, i ) - Vec_PtrPush( vPartPtr, Aig_ManPo(p, iOut) ); - Vec_IntFree( vPart ); - Vec_PtrWriteEntry( vPartsAll, iPart, vPartPtr ); - } -*/ - return vPartsAll; -} - -/**Function************************************************************* - - Synopsis [Perform the naive partitioning.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManPartitionNaive( Aig_Man_t * p, int nPartSize ) -{ - Vec_Ptr_t * vParts; - Aig_Obj_t * pObj; - int nParts, i; - nParts = (Aig_ManPoNum(p) / nPartSize) + ((Aig_ManPoNum(p) % nPartSize) > 0); - vParts = (Vec_Ptr_t *)Vec_VecStart( nParts ); - Aig_ManForEachPo( p, pObj, i ) - Vec_IntPush( Vec_PtrEntry(vParts, i / nPartSize), i ); - return vParts; -} - - - -/**Function************************************************************* - - Synopsis [Adds internal nodes in the topological order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ManDupPart_rec( Aig_Man_t * pNew, Aig_Man_t * pOld, Aig_Obj_t * pObj, Vec_Int_t * vSuppMap ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( Aig_ObjIsTravIdCurrent(pOld, pObj) ) - return pObj->pData; - Aig_ObjSetTravIdCurrent(pOld, pObj); - if ( Aig_ObjIsPi(pObj) ) - { - assert( Vec_IntSize(vSuppMap) == Aig_ManPiNum(pNew) ); - Vec_IntPush( vSuppMap, (int)(long)pObj->pNext ); - return pObj->pData = Aig_ObjCreatePi(pNew); - } - assert( Aig_ObjIsNode(pObj) ); - Aig_ManDupPart_rec( pNew, pOld, Aig_ObjFanin0(pObj), vSuppMap ); - Aig_ManDupPart_rec( pNew, pOld, Aig_ObjFanin1(pObj), vSuppMap ); - return pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); -} - -/**Function************************************************************* - - Synopsis [Adds internal nodes in the topological order.] - - Description [Returns the array of new outputs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManDupPart( Aig_Man_t * pNew, Aig_Man_t * pOld, Vec_Int_t * vPart, Vec_Int_t * vSuppMap, int fInverse ) -{ - Vec_Ptr_t * vOutsTotal; - Aig_Obj_t * pObj; - int Entry, i; - // create the PIs - Aig_ManIncrementTravId( pOld ); - Aig_ManConst1(pOld)->pData = Aig_ManConst1(pNew); - Aig_ObjSetTravIdCurrent( pOld, Aig_ManConst1(pOld) ); - if ( !fInverse ) - { - Vec_IntForEachEntry( vSuppMap, Entry, i ) - { - pObj = Aig_ManPi( pOld, Entry ); - pObj->pData = Aig_ManPi( pNew, i ); - Aig_ObjSetTravIdCurrent( pOld, pObj ); - } - } - else - { - Vec_IntForEachEntry( vSuppMap, Entry, i ) - { - pObj = Aig_ManPi( pOld, i ); - pObj->pData = Aig_ManPi( pNew, Entry ); - Aig_ObjSetTravIdCurrent( pOld, pObj ); - } - vSuppMap = NULL; // should not be useful - } - // create the internal nodes - vOutsTotal = Vec_PtrAlloc( Vec_IntSize(vPart) ); - if ( !fInverse ) - { - Vec_IntForEachEntry( vPart, Entry, i ) - { - pObj = Aig_ManPo( pOld, Entry ); - Aig_ManDupPart_rec( pNew, pOld, Aig_ObjFanin0(pObj), vSuppMap ); - Vec_PtrPush( vOutsTotal, Aig_ObjChild0Copy(pObj) ); - } - } - else - { - Aig_ManForEachObj( pOld, pObj, i ) - { - if ( Aig_ObjIsPo(pObj) ) - { - Aig_ManDupPart_rec( pNew, pOld, Aig_ObjFanin0(pObj), vSuppMap ); - Vec_PtrPush( vOutsTotal, Aig_ObjChild0Copy(pObj) ); - } - else if ( Aig_ObjIsNode(pObj) && pObj->nRefs == 0 ) - Aig_ManDupPart_rec( pNew, pOld, pObj, vSuppMap ); - - } - } - return vOutsTotal; -} - -/**Function************************************************************* - - Synopsis [Create partitioned miter of the two AIGs.] - - Description [Assumes that each output in the second AIG cannot have - more supp vars than the same output in the first AIG.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManMiterPartitioned( Aig_Man_t * p1, Aig_Man_t * p2, int nPartSize ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pMiter; - Vec_Ptr_t * vMiters, * vNodes1, * vNodes2; - Vec_Ptr_t * vParts, * vPartSupps; - Vec_Int_t * vPart, * vPartSupp; - int i, k; - // partition the first manager - vParts = Aig_ManPartitionSmart( p1, nPartSize, 0, &vPartSupps ); - // derive miters - vMiters = Vec_PtrAlloc( Vec_PtrSize(vParts) ); - for ( i = 0; i < Vec_PtrSize(vParts); i++ ) - { - // get partitions and their support - vPart = Vec_PtrEntry( vParts, i ); - vPartSupp = Vec_PtrEntry( vPartSupps, i ); - // create the new miter - pNew = Aig_ManStart( 1000 ); -// pNew->pName = Extra_UtilStrsav( p1->pName ); - // create the PIs - for ( k = 0; k < Vec_IntSize(vPartSupp); k++ ) - Aig_ObjCreatePi( pNew ); - // copy the components - vNodes1 = Aig_ManDupPart( pNew, p1, vPart, vPartSupp, 0 ); - vNodes2 = Aig_ManDupPart( pNew, p2, vPart, vPartSupp, 0 ); - // create the miter - pMiter = Aig_MiterTwo( pNew, vNodes1, vNodes2 ); - Vec_PtrFree( vNodes1 ); - Vec_PtrFree( vNodes2 ); - // create the output - Aig_ObjCreatePo( pNew, pMiter ); - // clean up - Aig_ManCleanup( pNew ); - Vec_PtrPush( vMiters, pNew ); - } - Vec_VecFree( (Vec_Vec_t *)vParts ); - Vec_VecFree( (Vec_Vec_t *)vPartSupps ); - return vMiters; -} - -/**Function************************************************************* - - Synopsis [Performs partitioned choice computation.] - - Description [Assumes that each output in the second AIG cannot have - more supp vars than the same output in the first AIG.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize ) -{ - extern int Cmd_CommandExecute( void * pAbc, char * sCommand ); - extern void * Abc_FrameGetGlobalFrame(); - extern Aig_Man_t * Fra_FraigChoice( Aig_Man_t * pManAig, int nConfMax ); - - Vec_Ptr_t * vOutsTotal, * vOuts; - Aig_Man_t * pAigTotal, * pAigPart, * pAig; - Vec_Int_t * vPart, * vPartSupp; - Vec_Ptr_t * vParts; - Aig_Obj_t * pObj; - void ** ppData; - int i, k, m; - - // partition the first AIG in the array - assert( Vec_PtrSize(vAigs) > 1 ); - pAig = Vec_PtrEntry( vAigs, 0 ); - vParts = Aig_ManPartitionSmart( pAig, nPartSize, 0, NULL ); - - // start the total fraiged AIG - pAigTotal = Aig_ManStartFrom( pAig ); - Aig_ManReprStart( pAigTotal, Vec_PtrSize(vAigs) * Aig_ManObjNumMax(pAig) + 10000 ); - vOutsTotal = Vec_PtrStart( Aig_ManPoNum(pAig) ); - - // set the PI numbers - Vec_PtrForEachEntry( vAigs, pAig, i ) - Aig_ManForEachPi( pAig, pObj, k ) - pObj->pNext = (Aig_Obj_t *)(long)k; - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" ); - - // create the total fraiged AIG - vPartSupp = Vec_IntAlloc( 100 ); // maps part PI num into total PI num - Vec_PtrForEachEntry( vParts, vPart, i ) - { - // derive the partition AIG - pAigPart = Aig_ManStart( 5000 ); -// pAigPart->pName = Extra_UtilStrsav( pAigPart->pName ); - Vec_IntClear( vPartSupp ); - Vec_PtrForEachEntry( vAigs, pAig, k ) - { - vOuts = Aig_ManDupPart( pAigPart, pAig, vPart, vPartSupp, 0 ); - if ( k == 0 ) - { - Vec_PtrForEachEntry( vOuts, pObj, m ) - Aig_ObjCreatePo( pAigPart, pObj ); - } - Vec_PtrFree( vOuts ); - } - // derive the total AIG from the partitioned AIG - vOuts = Aig_ManDupPart( pAigTotal, pAigPart, vPart, vPartSupp, 1 ); - // add to the outputs - Vec_PtrForEachEntry( vOuts, pObj, k ) - { - assert( Vec_PtrEntry( vOutsTotal, Vec_IntEntry(vPart,k) ) == NULL ); - Vec_PtrWriteEntry( vOutsTotal, Vec_IntEntry(vPart,k), pObj ); - } - Vec_PtrFree( vOuts ); - // store contents of pData pointers - ppData = ALLOC( void *, Aig_ManObjNumMax(pAigPart) ); - Aig_ManForEachObj( pAigPart, pObj, k ) - ppData[k] = pObj->pData; - // report the process - printf( "Part %4d (out of %4d) PI = %5d. PO = %5d. And = %6d. Lev = %4d.\r", - i+1, Vec_PtrSize(vParts), Aig_ManPiNum(pAigPart), Aig_ManPoNum(pAigPart), - Aig_ManNodeNum(pAigPart), Aig_ManLevelNum(pAigPart) ); - // compute equivalence classes (to be stored in pNew->pReprs) - pAig = Fra_FraigChoice( pAigPart, 1000 ); - Aig_ManStop( pAig ); - // reset the pData pointers - Aig_ManForEachObj( pAigPart, pObj, k ) - pObj->pData = ppData[k]; - free( ppData ); - // transfer representatives to the total AIG - if ( pAigPart->pReprs ) - Aig_ManTransferRepr( pAigTotal, pAigPart ); - Aig_ManStop( pAigPart ); - } - printf( " \r" ); - Vec_VecFree( (Vec_Vec_t *)vParts ); - Vec_IntFree( vPartSupp ); - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" ); - - // clear the PI numbers - Vec_PtrForEachEntry( vAigs, pAig, i ) - Aig_ManForEachPi( pAig, pObj, k ) - pObj->pNext = NULL; -/* - // collect the missing outputs (outputs whose driver is not a node) - pAig = Vec_PtrEntry( vAigs, 0 ); - Aig_ManConst1(pAig)->pData = Aig_ManConst1(pAigTotal); - Aig_ManForEachPi( pAig, pObj, i ) - pAig->pData = Aig_ManPi( pAigTotal, i ); - Aig_ManForEachPo( pAig, pObj, i ) - if ( !Aig_ObjIsNode(Aig_ObjFanin0(pObj)) ) - { - assert( Vec_PtrEntry( vOutsTotal, i ) == NULL ); - Vec_PtrWriteEntry( vOutsTotal, i, Aig_ObjChild0Copy(pObj) ); - } -*/ - // add the outputs in the same order - Vec_PtrForEachEntry( vOutsTotal, pObj, i ) - Aig_ObjCreatePo( pAigTotal, pObj ); - Vec_PtrFree( vOutsTotal ); - - // derive the result of choicing - pAig = Aig_ManRehash( pAigTotal ); - // create the equivalent nodes lists - Aig_ManMarkValidChoices( pAig ); - return pAig; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigRepr.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigRepr.c deleted file mode 100644 index 5e4c3245e..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigRepr.c +++ /dev/null @@ -1,457 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigRepr.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Handing node representatives.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigRepr.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Starts the array of representatives.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManReprStart( Aig_Man_t * p, int nIdMax ) -{ - assert( Aig_ManBufNum(p) == 0 ); - assert( p->pReprs == NULL ); - p->nReprsAlloc = nIdMax; - p->pReprs = ALLOC( Aig_Obj_t *, p->nReprsAlloc ); - memset( p->pReprs, 0, sizeof(Aig_Obj_t *) * p->nReprsAlloc ); -} - -/**Function************************************************************* - - Synopsis [Stop the array of representatives.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManReprStop( Aig_Man_t * p ) -{ - assert( p->pReprs != NULL ); - FREE( p->pReprs ); - p->nReprsAlloc = 0; -} - -/**Function************************************************************* - - Synopsis [Set the representative.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjCreateRepr( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 ) -{ - assert( p->pReprs != NULL ); - assert( !Aig_IsComplement(pNode1) ); - assert( !Aig_IsComplement(pNode2) ); - assert( pNode1->Id < p->nReprsAlloc ); - assert( pNode2->Id < p->nReprsAlloc ); - assert( pNode1->Id < pNode2->Id ); - p->pReprs[pNode2->Id] = pNode1; -} - -/**Function************************************************************* - - Synopsis [Set the representative.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Aig_ObjSetRepr( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 ) -{ - assert( p->pReprs != NULL ); - assert( !Aig_IsComplement(pNode1) ); - assert( !Aig_IsComplement(pNode2) ); - assert( pNode1->Id < p->nReprsAlloc ); - assert( pNode2->Id < p->nReprsAlloc ); - if ( pNode1 == pNode2 ) - return; - if ( pNode1->Id < pNode2->Id ) - p->pReprs[pNode2->Id] = pNode1; - else - p->pReprs[pNode1->Id] = pNode2; -} - -/**Function************************************************************* - - Synopsis [Find representative.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Aig_Obj_t * Aig_ObjFindRepr( Aig_Man_t * p, Aig_Obj_t * pNode ) -{ - assert( p->pReprs != NULL ); - assert( !Aig_IsComplement(pNode) ); - assert( pNode->Id < p->nReprsAlloc ); -// assert( !p->pReprs[pNode->Id] || p->pReprs[pNode->Id]->Id < pNode->Id ); - return p->pReprs[pNode->Id]; -} - -/**Function************************************************************* - - Synopsis [Clears the representative.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Aig_ObjClearRepr( Aig_Man_t * p, Aig_Obj_t * pNode ) -{ - assert( p->pReprs != NULL ); - assert( !Aig_IsComplement(pNode) ); - assert( pNode->Id < p->nReprsAlloc ); - p->pReprs[pNode->Id] = NULL; -} - -/**Function************************************************************* - - Synopsis [Find representative transitively.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Aig_Obj_t * Aig_ObjFindReprTransitive( Aig_Man_t * p, Aig_Obj_t * pNode ) -{ - Aig_Obj_t * pNext, * pRepr; - if ( (pRepr = Aig_ObjFindRepr(p, pNode)) ) - while ( (pNext = Aig_ObjFindRepr(p, pRepr)) ) - pRepr = pNext; - return pRepr; -} - -/**Function************************************************************* - - Synopsis [Returns representatives of fanin in approapriate polarity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Aig_Obj_t * Aig_ObjRepr( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_Obj_t * pRepr; - if ( (pRepr = Aig_ObjFindRepr(p, pObj)) ) - return Aig_NotCond( pRepr->pData, pObj->fPhase ^ pRepr->fPhase ); - return pObj->pData; -} -static inline Aig_Obj_t * Aig_ObjChild0Repr( Aig_Man_t * p, Aig_Obj_t * pObj ) { return Aig_NotCond( Aig_ObjRepr(p, Aig_ObjFanin0(pObj)), Aig_ObjFaninC0(pObj) ); } -static inline Aig_Obj_t * Aig_ObjChild1Repr( Aig_Man_t * p, Aig_Obj_t * pObj ) { return Aig_NotCond( Aig_ObjRepr(p, Aig_ObjFanin1(pObj)), Aig_ObjFaninC1(pObj) ); } - -/**Function************************************************************* - - Synopsis [Duplicates AIG while substituting representatives.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManTransferRepr( Aig_Man_t * pNew, Aig_Man_t * pOld ) -{ - Aig_Obj_t * pObj, * pRepr; - int k; - assert( pNew->pReprs != NULL ); - // extend storage to fix pNew - if ( pNew->nReprsAlloc < Aig_ManObjNumMax(pNew) ) - { - int nReprsAllocNew = 2 * Aig_ManObjNumMax(pNew); - pNew->pReprs = REALLOC( Aig_Obj_t *, pNew->pReprs, nReprsAllocNew ); - memset( pNew->pReprs + pNew->nReprsAlloc, 0, sizeof(Aig_Obj_t *) * (nReprsAllocNew-pNew->nReprsAlloc) ); - pNew->nReprsAlloc = nReprsAllocNew; - } - // go through the nodes which have representatives - Aig_ManForEachObj( pOld, pObj, k ) - if ( (pRepr = Aig_ObjFindRepr(pOld, pObj)) ) - Aig_ObjSetRepr( pNew, Aig_Regular(pRepr->pData), Aig_Regular(pObj->pData) ); -} - -/**Function************************************************************* - - Synopsis [Duplicates the AIG manager recursively.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ManDupRepr_rec( Aig_Man_t * pNew, Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_Obj_t * pRepr; - if ( pObj->pData ) - return pObj->pData; - if ( (pRepr = Aig_ObjFindRepr(p, pObj)) ) - { - Aig_ManDupRepr_rec( pNew, p, pRepr ); - return pObj->pData = Aig_NotCond( pRepr->pData, pRepr->fPhase ^ pObj->fPhase ); - } - Aig_ManDupRepr_rec( pNew, p, Aig_ObjFanin0(pObj) ); - Aig_ManDupRepr_rec( pNew, p, Aig_ObjFanin1(pObj) ); - return pObj->pData = Aig_And( pNew, Aig_ObjChild0Repr(p, pObj), Aig_ObjChild1Repr(p, pObj) ); -} - -/**Function************************************************************* - - Synopsis [Duplicates AIG while substituting representatives.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManDupRepr( Aig_Man_t * p, int fOrdered ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj; - int i; - // start the HOP package - pNew = Aig_ManStart( Aig_ManObjNumMax(p) ); - pNew->pName = Aig_UtilStrsav( p->pName ); - pNew->nRegs = p->nRegs; - if ( p->vFlopNums ) - pNew->vFlopNums = Vec_IntDup( p->vFlopNums ); - // map the const and primary inputs - Aig_ManCleanData( p ); - Aig_ManConst1(p)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( p, pObj, i ) - pObj->pData = Aig_ObjCreatePi(pNew); - // map the internal nodes - if ( fOrdered ) - { - Aig_ManForEachNode( p, pObj, i ) - pObj->pData = Aig_And( pNew, Aig_ObjChild0Repr(p, pObj), Aig_ObjChild1Repr(p, pObj) ); - } - else - { - Aig_ManForEachPo( p, pObj, i ) - Aig_ManDupRepr_rec( pNew, p, Aig_ObjFanin0(pObj) ); - } - // transfer the POs - Aig_ManForEachPo( p, pObj, i ) - Aig_ObjCreatePo( pNew, Aig_ObjChild0Repr(p, pObj) ); - // check the new manager - if ( !Aig_ManCheck(pNew) ) - printf( "Aig_ManDupRepr: Check has failed.\n" ); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Transfer representatives and return the number of critical fanouts.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManRemapRepr( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj, * pRepr; - int i, nFanouts = 0; - Aig_ManForEachNode( p, pObj, i ) - { - pRepr = Aig_ObjFindReprTransitive( p, pObj ); - if ( pRepr == NULL ) - continue; - assert( pRepr->Id < pObj->Id ); - Aig_ObjSetRepr( p, pObj, pRepr ); - nFanouts += (pObj->nRefs > 0); - } - return nFanouts; -} - -/**Function************************************************************* - - Synopsis [Returns 1 if pOld is in the TFI of pNew.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjCheckTfi_rec( Aig_Man_t * p, Aig_Obj_t * pNode, Aig_Obj_t * pOld ) -{ - // check the trivial cases - if ( pNode == NULL ) - return 0; -// if ( pNode->Id < pOld->Id ) // cannot use because of choices of pNode -// return 0; - if ( pNode == pOld ) - return 1; - // skip the visited node - if ( Aig_ObjIsTravIdCurrent( p, pNode ) ) - return 0; - Aig_ObjSetTravIdCurrent( p, pNode ); - // check the children - if ( Aig_ObjCheckTfi_rec( p, Aig_ObjFanin0(pNode), pOld ) ) - return 1; - if ( Aig_ObjCheckTfi_rec( p, Aig_ObjFanin1(pNode), pOld ) ) - return 1; - // check equivalent nodes - return Aig_ObjCheckTfi_rec( p, p->pEquivs[pNode->Id], pOld ); -} - -/**Function************************************************************* - - Synopsis [Returns 1 if pOld is in the TFI of pNew.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjCheckTfi( Aig_Man_t * p, Aig_Obj_t * pNew, Aig_Obj_t * pOld ) -{ - assert( !Aig_IsComplement(pNew) ); - assert( !Aig_IsComplement(pOld) ); - Aig_ManIncrementTravId( p ); - return Aig_ObjCheckTfi_rec( p, pNew, pOld ); -} - -/**Function************************************************************* - - Synopsis [Iteratively rehashes the AIG.] - - Description [The input AIG is assumed to have representatives assigned.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManRehash( Aig_Man_t * p ) -{ - Aig_Man_t * pTemp; - int i, nFanouts; - assert( p->pReprs != NULL ); - for ( i = 0; (nFanouts = Aig_ManRemapRepr( p )); i++ ) - { -// printf( "Iter = %3d. Fanouts = %6d. Nodes = %7d.\n", i+1, nFanouts, Aig_ManNodeNum(p) ); - p = Aig_ManDupRepr( pTemp = p, 1 ); - Aig_ManReprStart( p, Aig_ManObjNumMax(p) ); - Aig_ManTransferRepr( p, pTemp ); - Aig_ManStop( pTemp ); - } - return p; -} - -/**Function************************************************************* - - Synopsis [Marks the nodes that are Creates choices.] - - Description [The input AIG is assumed to have representatives assigned.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManMarkValidChoices( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj, * pRepr; - int i; - assert( p->pReprs != NULL ); - // create equivalent nodes in the manager - assert( p->pEquivs == NULL ); - p->pEquivs = ALLOC( Aig_Obj_t *, Aig_ManObjNumMax(p) ); - memset( p->pEquivs, 0, sizeof(Aig_Obj_t *) * Aig_ManObjNumMax(p) ); - // make the choice nodes - Aig_ManForEachNode( p, pObj, i ) - { - pRepr = Aig_ObjFindRepr( p, pObj ); - if ( pRepr == NULL ) - continue; - assert( pObj->nRefs == 0 ); - // skip constant and PI classes - if ( !Aig_ObjIsNode(pRepr) ) - { - Aig_ObjClearRepr( p, pObj ); - continue; - } - // skip choices with combinatinal loops - if ( Aig_ObjCheckTfi( p, pObj, pRepr ) ) - { - Aig_ObjClearRepr( p, pObj ); - continue; - } -//printf( "Node %d is represented by node %d.\n", pObj->Id, pRepr->Id ); - // add choice to the choice node - p->pEquivs[pObj->Id] = p->pEquivs[pRepr->Id]; - p->pEquivs[pRepr->Id] = pObj; - } -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigRet.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigRet.c deleted file mode 100644 index 79b0b9bae..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigRet.c +++ /dev/null @@ -1,969 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigRet.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Retiming of AIGs.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigRet.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -// init values -typedef enum { - RTM_VAL_NONE, // 0: non-existent value - RTM_VAL_ZERO, // 1: initial value 0 - RTM_VAL_ONE, // 2: initial value 1 - RTM_VAL_VOID // 3: unused value -} Rtm_Init_t; - -typedef struct Rtm_Man_t_ Rtm_Man_t; -struct Rtm_Man_t_ -{ - // network representation - Vec_Ptr_t * vObjs; // retiming objects - Vec_Ptr_t * vPis; // PIs only - Vec_Ptr_t * vPos; // POs only - Aig_MmFlex_t * pMem; // the memory manager - // autonomous components after cutting off - // storage for overflow latches - unsigned * pExtra; - int nExtraCur; - int nExtraAlloc; -}; - -typedef struct Rtm_Edg_t_ Rtm_Edg_t; -struct Rtm_Edg_t_ -{ - unsigned long nLats : 12; // the number of latches - unsigned long LData : 20; // the latches themselves -}; - -typedef struct Rtm_Obj_t_ Rtm_Obj_t; -struct Rtm_Obj_t_ -{ - void * pCopy; // the copy of this object - unsigned long Type : 3; // object type - unsigned long fMark : 1; // multipurpose mark - unsigned long fAuto : 1; // this object belongs to an autonomous component - unsigned long fCompl0 : 1; // complemented attribute of the first edge - unsigned long fCompl1 : 1; // complemented attribute of the second edge - unsigned long nFanins : 8; // the number of fanins - unsigned Num : 17; // the retiming number of this node - int Id; // ID of this object - int Temp; // temporary usage - int nFanouts; // the number of fanouts - void * pFanio[0]; // fanins and their edges (followed by fanouts and pointers to their edges) -}; - -static inline Rtm_Obj_t * Rtm_ObjFanin( Rtm_Obj_t * pObj, int i ) { return (Rtm_Obj_t *)pObj->pFanio[2*i]; } -static inline Rtm_Obj_t * Rtm_ObjFanout( Rtm_Obj_t * pObj, int i ) { return (Rtm_Obj_t *)pObj->pFanio[2*(pObj->nFanins+i)]; } -static inline Rtm_Edg_t * Rtm_ObjEdge( Rtm_Obj_t * pObj, int i ) { return (Rtm_Edg_t *)(pObj->pFanio + 2*i + 1); } -static inline Rtm_Edg_t * Rtm_ObjFanoutEdge( Rtm_Obj_t * pObj, int i ) { return (Rtm_Edg_t *)pObj->pFanio[2*(pObj->nFanins+i) + 1]; } - -static inline Rtm_Init_t Rtm_InitNot( Rtm_Init_t Val ) { if ( Val == RTM_VAL_ZERO ) return RTM_VAL_ONE; if ( Val == RTM_VAL_ONE ) return RTM_VAL_ZERO; assert( 0 ); return -1; } -static inline Rtm_Init_t Rtm_InitNotCond( Rtm_Init_t Val, int c ) { return c ? Rtm_InitNot(Val) : Val; } -static inline Rtm_Init_t Rtm_InitAnd(Rtm_Init_t ValA, Rtm_Init_t ValB ) { if ( ValA == RTM_VAL_ONE && ValB == RTM_VAL_ONE ) return RTM_VAL_ONE; if ( ValA == RTM_VAL_ZERO || ValB == RTM_VAL_ZERO ) return RTM_VAL_ZERO; assert( 0 ); return -1; } - -static inline int Rtm_InitWordsNum( int nLats ) { return (nLats >> 4) + ((nLats & 15) > 0); } -static inline int Rtm_InitGetTwo( unsigned * p, int i ) { return (p[i>>4] >> ((i & 15)<<1)) & 3; } -static inline void Rtm_InitSetTwo( unsigned * p, int i, int val ) { p[i>>4] |= (val << ((i & 15)<<1)); } -static inline void Rtm_InitXorTwo( unsigned * p, int i, int val ) { p[i>>4] ^= (val << ((i & 15)<<1)); } - -static inline Rtm_Init_t Rtm_ObjGetFirst1( Rtm_Edg_t * pEdge ) { return pEdge->LData & 3; } -static inline Rtm_Init_t Rtm_ObjGetLast1( Rtm_Edg_t * pEdge ) { return (pEdge->LData >> ((pEdge->nLats-1)<<1)) & 3; } -static inline Rtm_Init_t Rtm_ObjGetOne1( Rtm_Edg_t * pEdge, int i ) { assert( i < (int)pEdge->nLats ); return (pEdge->LData >> (i << 1)) & 3; } -static inline Rtm_Init_t Rtm_ObjRemFirst1( Rtm_Edg_t * pEdge ) { int Val = pEdge->LData & 3; pEdge->LData >>= 2; assert(pEdge->nLats > 0); pEdge->nLats--; return Val; } -static inline Rtm_Init_t Rtm_ObjRemLast1( Rtm_Edg_t * pEdge ) { int Val = (pEdge->LData >> ((pEdge->nLats-1)<<1)) & 3; pEdge->LData ^= Val << ((pEdge->nLats-1)<<1); assert(pEdge->nLats > 0); pEdge->nLats--; return Val; } -static inline void Rtm_ObjAddFirst1( Rtm_Edg_t * pEdge, Rtm_Init_t Val ) { assert( Val > 0 && Val < 4 ); pEdge->LData = (pEdge->LData << 2) | Val; pEdge->nLats++; } -static inline void Rtm_ObjAddLast1( Rtm_Edg_t * pEdge, Rtm_Init_t Val ) { assert( Val > 0 && Val < 4 ); pEdge->LData |= Val << (pEdge->nLats<<1); pEdge->nLats++; } - -static inline Rtm_Init_t Rtm_ObjGetFirst2( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) { return Rtm_InitGetTwo( p->pExtra + pEdge->LData, 0 ); } -static inline Rtm_Init_t Rtm_ObjGetLast2( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) { return Rtm_InitGetTwo( p->pExtra + pEdge->LData, pEdge->nLats - 1 ); } -static inline Rtm_Init_t Rtm_ObjGetOne2( Rtm_Man_t * p, Rtm_Edg_t * pEdge, int i ) { return Rtm_InitGetTwo( p->pExtra + pEdge->LData, i ); } -static Rtm_Init_t Rtm_ObjRemFirst2( Rtm_Man_t * p, Rtm_Edg_t * pEdge ); -static inline Rtm_Init_t Rtm_ObjRemLast2( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) { Rtm_Init_t Val = Rtm_ObjGetLast2( p, pEdge ); Rtm_InitXorTwo( p->pExtra + pEdge->LData, pEdge->nLats - 1, Val ); pEdge->nLats--; return Val; } -static void Rtm_ObjAddFirst2( Rtm_Man_t * p, Rtm_Edg_t * pEdge, Rtm_Init_t Val ); -static inline void Rtm_ObjAddLast2( Rtm_Man_t * p, Rtm_Edg_t * pEdge, Rtm_Init_t Val ) { Rtm_InitSetTwo( p->pExtra + pEdge->LData, pEdge->nLats, Val ); pEdge->nLats++; } - -static void Rtm_ObjTransferToSmall( Rtm_Man_t * p, Rtm_Edg_t * pEdge ); -static void Rtm_ObjTransferToBig( Rtm_Man_t * p, Rtm_Edg_t * pEdge ); -static void Rtm_ObjTransferToBigger( Rtm_Man_t * p, Rtm_Edg_t * pEdge ); - -static inline Rtm_Init_t Rtm_ObjGetFirst( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) { return pEdge->nLats > 10? Rtm_ObjGetFirst2(p, pEdge) : Rtm_ObjGetFirst1(pEdge); } -static inline Rtm_Init_t Rtm_ObjGetLast( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) { return pEdge->nLats > 10? Rtm_ObjGetLast2(p, pEdge) : Rtm_ObjGetLast1(pEdge); } -static inline Rtm_Init_t Rtm_ObjGetOne( Rtm_Man_t * p, Rtm_Edg_t * pEdge, int i ) { return pEdge->nLats > 10? Rtm_ObjGetOne2(p, pEdge, i) : Rtm_ObjGetOne1(pEdge, i); } -static Rtm_Init_t Rtm_ObjRemFirst( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) { Rtm_Init_t Res = pEdge->nLats > 10 ? Rtm_ObjRemFirst2(p, pEdge) : Rtm_ObjRemFirst1(pEdge); if ( pEdge->nLats == 10 ) Rtm_ObjTransferToSmall(p, pEdge); return Res; } -static Rtm_Init_t Rtm_ObjRemLast( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) { Rtm_Init_t Res = pEdge->nLats > 10 ? Rtm_ObjRemLast2(p, pEdge) : Rtm_ObjRemLast1(pEdge); if ( pEdge->nLats == 10 ) Rtm_ObjTransferToSmall(p, pEdge); return Res; } -static void Rtm_ObjAddFirst( Rtm_Man_t * p, Rtm_Edg_t * pEdge, Rtm_Init_t Val ) { if ( pEdge->nLats == 10 ) Rtm_ObjTransferToBig(p, pEdge); else if ( (pEdge->nLats & 15) == 15 ) Rtm_ObjTransferToBigger(p, pEdge); if ( pEdge->nLats >= 10 ) Rtm_ObjAddFirst2(p, pEdge, Val); else Rtm_ObjAddFirst1(pEdge, Val); } -static void Rtm_ObjAddLast( Rtm_Man_t * p, Rtm_Edg_t * pEdge, Rtm_Init_t Val ) { if ( pEdge->nLats == 10 ) Rtm_ObjTransferToBig(p, pEdge); else if ( (pEdge->nLats & 15) == 15 ) Rtm_ObjTransferToBigger(p, pEdge); if ( pEdge->nLats >= 10 ) Rtm_ObjAddLast2(p, pEdge, Val); else Rtm_ObjAddLast1(pEdge, Val); } - - -// iterator over the primary inputs -#define Rtm_ManForEachPi( p, pObj, i ) \ - Vec_PtrForEachEntry( p->vPis, pObj, i ) -// iterator over the primary outputs -#define Rtm_ManForEachPo( p, pObj, i ) \ - Vec_PtrForEachEntry( p->vPos, pObj, i ) -// iterator over all objects, including those currently not used -#define Rtm_ManForEachObj( p, pObj, i ) \ - Vec_PtrForEachEntry( p->vObjs, pObj, i ) -// iterate through the fanins -#define Rtm_ObjForEachFanin( pObj, pFanin, i ) \ - for ( i = 0; i < (int)(pObj)->nFanins && ((pFanin = Rtm_ObjFanin(pObj, i)), 1); i++ ) -// iterate through the fanouts -#define Rtm_ObjForEachFanout( pObj, pFanout, i ) \ - for ( i = 0; i < (int)(pObj)->nFanouts && ((pFanout = Rtm_ObjFanout(pObj, i)), 1); i++ ) -// iterate through the fanin edges -#define Rtm_ObjForEachFaninEdge( pObj, pEdge, i ) \ - for ( i = 0; i < (int)(pObj)->nFanins && ((pEdge = Rtm_ObjEdge(pObj, i)), 1); i++ ) -// iterate through the fanout edges -#define Rtm_ObjForEachFanoutEdge( pObj, pEdge, i ) \ - for ( i = 0; i < (int)(pObj)->nFanouts && ((pEdge = Rtm_ObjFanoutEdge(pObj, i)), 1); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Transfers from big to small storage.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjTransferToSmall( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) -{ - assert( pEdge->nLats == 10 ); - pEdge->LData = p->pExtra[pEdge->LData]; -} - -/**Function************************************************************* - - Synopsis [Transfers from small to big storage.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjTransferToBig( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) -{ - assert( pEdge->nLats == 10 ); - if ( p->nExtraCur + 1 > p->nExtraAlloc ) - { - int nExtraAllocNew = AIG_MAX( 2 * p->nExtraAlloc, 1024 ); - p->pExtra = REALLOC( unsigned, p->pExtra, nExtraAllocNew ); - p->nExtraAlloc = nExtraAllocNew; - } - p->pExtra[p->nExtraCur] = pEdge->LData; - pEdge->LData = p->nExtraCur++; -} - -/**Function************************************************************* - - Synopsis [Transfers to bigger storage.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjTransferToBigger( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) -{ - int nWords; - assert( (pEdge->nLats & 15) == 15 ); - nWords = (pEdge->nLats + 1) >> 4; - if ( p->nExtraCur + nWords + 1 > p->nExtraAlloc ) - { - int nExtraAllocNew = AIG_MAX( 2 * p->nExtraAlloc, 1024 ); - p->pExtra = REALLOC( unsigned, p->pExtra, nExtraAllocNew ); - p->nExtraAlloc = nExtraAllocNew; - } - memcpy( p->pExtra + p->nExtraCur, p->pExtra + pEdge->LData, sizeof(unsigned) * nWords ); - p->pExtra[p->nExtraCur + nWords] = 0; - pEdge->LData = p->nExtraCur; - p->nExtraCur += nWords + 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Rtm_Init_t Rtm_ObjRemFirst2( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) -{ - Rtm_Init_t Val = 0, Temp; - unsigned * pB = p->pExtra + pEdge->LData, * pE = pB + Rtm_InitWordsNum( pEdge->nLats-- ) - 1; - while ( pE >= pB ) - { - Temp = *pE & 3; - *pE = (*pE >> 2) | (Val << 30); - Val = Temp; - pE--; - } - assert( Val != 0 ); - return Val; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjAddFirst2( Rtm_Man_t * p, Rtm_Edg_t * pEdge, Rtm_Init_t Val ) -{ - unsigned * pB = p->pExtra + pEdge->LData, * pE = pB + Rtm_InitWordsNum( ++pEdge->nLats ); - Rtm_Init_t Temp; - assert( Val != 0 ); - while ( pB < pE ) - { - Temp = *pB >> 30; - *pB = (*pB << 2) | Val; - Val = Temp; - pB++; - } -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_PrintEdge( Rtm_Man_t * p, Rtm_Edg_t * pEdge ) -{ -// unsigned LData = pEdge->LData; - printf( "%d : ", pEdge->nLats ); -/* - if ( pEdge->nLats > 10 ) - Extra_PrintBinary( stdout, p->pExtra + pEdge->LData, 2*(pEdge->nLats+1) ); - else - Extra_PrintBinary( stdout, &LData, 2*(pEdge->nLats+1) ); -*/ - printf( "\n" ); -} - - -/**Function************************************************************* - - Synopsis [Allocates the retiming manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Rtm_Man_t * Rtm_ManAlloc( Aig_Man_t * p ) -{ - Rtm_Man_t * pRtm; - // start the manager - pRtm = ALLOC( Rtm_Man_t, 1 ); - memset( pRtm, 0, sizeof(Rtm_Man_t) ); - // perform initializations - pRtm->vObjs = Vec_PtrAlloc( Aig_ManObjNum(p) ); - pRtm->vPis = Vec_PtrAlloc( Aig_ManPiNum(p) ); - pRtm->vPos = Vec_PtrAlloc( Aig_ManPoNum(p) ); - pRtm->pMem = Aig_MmFlexStart(); - return pRtm; -} - -/**Function************************************************************* - - Synopsis [Allocates the retiming manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ManFree( Rtm_Man_t * p ) -{ - Vec_PtrFree( p->vObjs ); - Vec_PtrFree( p->vPis ); - Vec_PtrFree( p->vPos ); - Aig_MmFlexStop( p->pMem, 0 ); - FREE( p->pExtra ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Counts the maximum number of latches on an edge.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Rtm_ManLatchMax( Rtm_Man_t * p ) -{ - Rtm_Obj_t * pObj; - Rtm_Edg_t * pEdge; - int nLatchMax = 0, i, k;//, c, Val; - Rtm_ManForEachObj( p, pObj, i ) - Rtm_ObjForEachFaninEdge( pObj, pEdge, k ) - { -/* - for ( c = 0; c < (int)pEdge->nLats; c++ ) - { - Val = Rtm_ObjGetOne( p, pEdge, c ); - assert( Val == 1 || Val == 2 ); - } -*/ - nLatchMax = AIG_MAX( nLatchMax, (int)pEdge->nLats ); - } - return nLatchMax; -} - -/**Function************************************************************* - - Synopsis [Allocates the retiming object.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Rtm_Obj_t * Rtm_ObjAlloc( Rtm_Man_t * pRtm, int nFanins, int nFanouts ) -{ - Rtm_Obj_t * pObj; - int Size = sizeof(Rtm_Obj_t) + sizeof(Rtm_Obj_t *) * (nFanins + nFanouts) * 2; - pObj = (Rtm_Obj_t *)Aig_MmFlexEntryFetch( pRtm->pMem, Size ); - memset( pObj, 0, sizeof(Rtm_Obj_t) ); - pObj->Type = (int)(nFanins == 1 && nFanouts == 0); // mark PO - pObj->Num = nFanins; // temporary - pObj->Temp = nFanouts; - pObj->Id = Vec_PtrSize(pRtm->vObjs); - Vec_PtrPush( pRtm->vObjs, pObj ); - return pObj; -} - -/**Function************************************************************* - - Synopsis [Allocates the retiming object.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjAddFanin( Rtm_Obj_t * pObj, Rtm_Obj_t * pFanin, int fCompl ) -{ - pObj->pFanio[ 2*pObj->nFanins ] = pFanin; - pObj->pFanio[ 2*pObj->nFanins + 1 ] = NULL; - pFanin->pFanio[ 2*(pFanin->Num + pFanin->nFanouts) ] = pObj; - pFanin->pFanio[ 2*(pFanin->Num + pFanin->nFanouts) + 1 ] = pObj->pFanio + 2*pObj->nFanins + 1; - if ( pObj->nFanins == 0 ) - pObj->fCompl0 = fCompl; - else if ( pObj->nFanins == 1 ) - pObj->fCompl1 = fCompl; - else - assert( 0 ); - pObj->nFanins++; - pFanin->nFanouts++; - assert( pObj->nFanins <= pObj->Num ); - assert( pFanin->nFanouts <= pFanin->Temp ); -} - -/**Function************************************************************* - - Synopsis [Check the possibility of forward retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Rtm_ObjCheckRetimeFwd( Rtm_Obj_t * pObj ) -{ - Rtm_Edg_t * pEdge; - int i; - Rtm_ObjForEachFaninEdge( pObj, pEdge, i ) - if ( pEdge->nLats == 0 ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Check the possibility of forward retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Rtm_ObjCheckRetimeBwd( Rtm_Obj_t * pObj ) -{ - Rtm_Edg_t * pEdge; - int i; - Rtm_ObjForEachFanoutEdge( pObj, pEdge, i ) - if ( pEdge->nLats == 0 ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Check the possibility of forward retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Rtm_ObjGetDegreeFwd( Rtm_Obj_t * pObj ) -{ - Rtm_Obj_t * pFanin; - int i, Degree = 0; - Rtm_ObjForEachFanin( pObj, pFanin, i ) - Degree = AIG_MAX( Degree, (int)pFanin->Num ); - return Degree + 1; -} - -/**Function************************************************************* - - Synopsis [Check the possibility of forward retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Rtm_ObjGetDegreeBwd( Rtm_Obj_t * pObj ) -{ - Rtm_Obj_t * pFanout; - int i, Degree = 0; - Rtm_ObjForEachFanout( pObj, pFanout, i ) - Degree = AIG_MAX( Degree, (int)pFanout->Num ); - return Degree + 1; -} - -/**Function************************************************************* - - Synopsis [Performs forward retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjRetimeFwd( Rtm_Man_t * pRtm, Rtm_Obj_t * pObj ) -{ - Rtm_Init_t ValTotal, ValCur; - Rtm_Edg_t * pEdge; - int i; - assert( Rtm_ObjCheckRetimeFwd(pObj) ); - // extract values and compute the result - ValTotal = RTM_VAL_ONE; - Rtm_ObjForEachFaninEdge( pObj, pEdge, i ) - { - ValCur = Rtm_ObjRemFirst( pRtm, pEdge ); - ValCur = Rtm_InitNotCond( ValCur, i? pObj->fCompl1 : pObj->fCompl0 ); - ValTotal = Rtm_InitAnd( ValTotal, ValCur ); - } - // insert the result in the fanout values - Rtm_ObjForEachFanoutEdge( pObj, pEdge, i ) - Rtm_ObjAddLast( pRtm, pEdge, ValTotal ); -} - -/**Function************************************************************* - - Synopsis [Performs forward retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjRetimeBwd( Rtm_Man_t * pRtm, Rtm_Obj_t * pObj ) -{ - Rtm_Edg_t * pEdge; - int i; - assert( Rtm_ObjCheckRetimeBwd(pObj) ); - // extract values and compute the result - Rtm_ObjForEachFanoutEdge( pObj, pEdge, i ) - Rtm_ObjRemLast( pRtm, pEdge ); - // insert the result in the fanout values - Rtm_ObjForEachFaninEdge( pObj, pEdge, i ) - Rtm_ObjAddFirst( pRtm, pEdge, RTM_VAL_VOID ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjMarkAutoFwd_rec( Rtm_Obj_t * pObj ) -{ - Rtm_Obj_t * pFanout; - int i; - if ( pObj->fAuto ) - return; - pObj->fAuto = 1; - Rtm_ObjForEachFanout( pObj, pFanout, i ) - Rtm_ObjMarkAutoFwd_rec( pFanout ); -} - -/**Function************************************************************* - - Synopsis [Marks the nodes unreachable from the PIs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Rtm_ManMarkAutoFwd( Rtm_Man_t * pRtm ) -{ - Rtm_Obj_t * pObjRtm; - int i, Counter = 0; - // mark nodes reachable from the PIs - pObjRtm = Vec_PtrEntry( pRtm->vObjs, 0 ); - Rtm_ObjMarkAutoFwd_rec( pObjRtm ); - Rtm_ManForEachPi( pRtm, pObjRtm, i ) - Rtm_ObjMarkAutoFwd_rec( pObjRtm ); - // count the number of autonomous nodes - Rtm_ManForEachObj( pRtm, pObjRtm, i ) - { - pObjRtm->fAuto = !pObjRtm->fAuto; - Counter += pObjRtm->fAuto; - } - // mark the fanins of the autonomous nodes - return Counter; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Rtm_ObjMarkAutoBwd_rec( Rtm_Obj_t * pObj ) -{ - Rtm_Obj_t * pFanin; - int i; - if ( pObj->fAuto ) - return; - pObj->fAuto = 1; - Rtm_ObjForEachFanin( pObj, pFanin, i ) - Rtm_ObjMarkAutoBwd_rec( pFanin ); -} - -/**Function************************************************************* - - Synopsis [Marks the nodes unreachable from the POs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Rtm_ManMarkAutoBwd( Rtm_Man_t * pRtm ) -{ - Rtm_Obj_t * pObjRtm; - int i, Counter = 0; - // mark nodes reachable from the PIs - pObjRtm = Vec_PtrEntry( pRtm->vObjs, 0 ); - pObjRtm->fAuto = 1; - Rtm_ManForEachPi( pRtm, pObjRtm, i ) - pObjRtm->fAuto = 1; - Rtm_ManForEachPo( pRtm, pObjRtm, i ) - Rtm_ObjMarkAutoBwd_rec( pObjRtm ); - // count the number of autonomous nodes - Rtm_ManForEachObj( pRtm, pObjRtm, i ) - { - pObjRtm->fAuto = !pObjRtm->fAuto; - Counter += pObjRtm->fAuto; - } - // mark the fanins of the autonomous nodes - return Counter; -} - -/**Function************************************************************* - - Synopsis [Derive retiming manager from the given AIG manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Rtm_Man_t * Rtm_ManFromAig( Aig_Man_t * p ) -{ - Rtm_Man_t * pRtm; - Aig_Obj_t * pObj, * pObjLi, * pObjLo; - int i; - assert( Aig_ManRegNum(p) > 0 ); - assert( Aig_ManBufNum(p) == 0 ); - // allocate the manager - pRtm = Rtm_ManAlloc( p ); - // allocate objects - pObj = Aig_ManConst1(p); - pObj->pData = Rtm_ObjAlloc( pRtm, 0, pObj->nRefs ); - Aig_ManForEachPiSeq( p, pObj, i ) - { - pObj->pData = Rtm_ObjAlloc( pRtm, 0, pObj->nRefs ); - Vec_PtrPush( pRtm->vPis, pObj->pData ); - } - Aig_ManForEachPoSeq( p, pObj, i ) - { - pObj->pData = Rtm_ObjAlloc( pRtm, 1, 0 ); - Vec_PtrPush( pRtm->vPos, pObj->pData ); - } - Aig_ManForEachLoSeq( p, pObj, i ) - pObj->pData = Rtm_ObjAlloc( pRtm, 1, pObj->nRefs ); - Aig_ManForEachLiSeq( p, pObj, i ) - pObj->pData = Rtm_ObjAlloc( pRtm, 1, 1 ); - Aig_ManForEachNode( p, pObj, i ) - pObj->pData = Rtm_ObjAlloc( pRtm, 2, pObj->nRefs ); - // connect objects - Aig_ManForEachPoSeq( p, pObj, i ) - Rtm_ObjAddFanin( pObj->pData, Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) ); - Aig_ManForEachLiSeq( p, pObj, i ) - Rtm_ObjAddFanin( pObj->pData, Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) ); - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - Rtm_ObjAddFanin( pObjLo->pData, pObjLi->pData, 0 ); - Aig_ManForEachNode( p, pObj, i ) - { - Rtm_ObjAddFanin( pObj->pData, Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) ); - Rtm_ObjAddFanin( pObj->pData, Aig_ObjFanin1(pObj)->pData, Aig_ObjFaninC1(pObj) ); - } - return pRtm; -} - -/**Function************************************************************* - - Synopsis [Derive AIG manager after retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Rtm_ManToAig_rec( Aig_Man_t * pNew, Rtm_Man_t * pRtm, Rtm_Obj_t * pObjRtm, int * pLatches ) -{ - Rtm_Edg_t * pEdge; - Aig_Obj_t * pRes, * pFanin; - int k, Val; - if ( pObjRtm->pCopy ) - return pObjRtm->pCopy; - // get the inputs - pRes = Aig_ManConst1( pNew ); - Rtm_ObjForEachFaninEdge( pObjRtm, pEdge, k ) - { - if ( pEdge->nLats == 0 ) - pFanin = Rtm_ManToAig_rec( pNew, pRtm, Rtm_ObjFanin(pObjRtm, k), pLatches ); - else - { - Val = Rtm_ObjGetFirst( pRtm, pEdge ); - pFanin = Aig_ManPi( pNew, pLatches[2*pObjRtm->Id + k] + pEdge->nLats - 1 ); - pFanin = Aig_NotCond( pFanin, Val == RTM_VAL_ONE ); - } - pFanin = Aig_NotCond( pFanin, k ? pObjRtm->fCompl1 : pObjRtm->fCompl0 ); - pRes = Aig_And( pNew, pRes, pFanin ); - } - return pObjRtm->pCopy = pRes; -} - -/**Function************************************************************* - - Synopsis [Derive AIG manager after retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Rtm_ManToAig( Rtm_Man_t * pRtm ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObjNew; - Rtm_Obj_t * pObjRtm; - Rtm_Edg_t * pEdge; - int i, k, m, Val, nLatches, * pLatches; - // count latches and mark the first latch on each edge - pLatches = ALLOC( int, 2 * Vec_PtrSize(pRtm->vObjs) ); - nLatches = 0; - Rtm_ManForEachObj( pRtm, pObjRtm, i ) - Rtm_ObjForEachFaninEdge( pObjRtm, pEdge, k ) - { - pLatches[2*pObjRtm->Id + k] = Vec_PtrSize(pRtm->vPis) + nLatches; - nLatches += pEdge->nLats; - } - // create the new manager - pNew = Aig_ManStart( Vec_PtrSize(pRtm->vObjs) + nLatches ); - // create PIs/POs and latches - pObjRtm = Vec_PtrEntry( pRtm->vObjs, 0 ); - pObjRtm->pCopy = Aig_ManConst1(pNew); - Rtm_ManForEachPi( pRtm, pObjRtm, i ) - pObjRtm->pCopy = Aig_ObjCreatePi(pNew); - for ( i = 0; i < nLatches; i++ ) - Aig_ObjCreatePi(pNew); - // create internal nodes - Rtm_ManForEachObj( pRtm, pObjRtm, i ) - Rtm_ManToAig_rec( pNew, pRtm, pObjRtm, pLatches ); - // create POs - Rtm_ManForEachPo( pRtm, pObjRtm, i ) - Aig_ObjCreatePo( pNew, pObjRtm->pCopy ); - // connect latches - Rtm_ManForEachObj( pRtm, pObjRtm, i ) - Rtm_ObjForEachFaninEdge( pObjRtm, pEdge, k ) - { - if ( pEdge->nLats == 0 ) - continue; - pObjNew = Rtm_ObjFanin( pObjRtm, k )->pCopy; - for ( m = 0; m < (int)pEdge->nLats; m++ ) - { - Val = Rtm_ObjGetOne( pRtm, pEdge, pEdge->nLats - 1 - m ); - assert( Val == RTM_VAL_ZERO || Val == RTM_VAL_ONE || Val == RTM_VAL_VOID ); - pObjNew = Aig_NotCond( pObjNew, Val == RTM_VAL_ONE ); - Aig_ObjCreatePo( pNew, pObjNew ); - pObjNew = Aig_ManPi( pNew, pLatches[2*pObjRtm->Id + k] + m ); - pObjNew = Aig_NotCond( pObjNew, Val == RTM_VAL_ONE ); - } -// assert( Aig_Regular(pObjNew)->nRefs > 0 ); - } - free( pLatches ); - pNew->nRegs = nLatches; - // remove useless nodes - Aig_ManCleanup( pNew ); - if ( !Aig_ManCheck( pNew ) ) - printf( "Rtm_ManToAig: The network check has failed.\n" ); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Performs forward retiming with the given limit on depth.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Rtm_ManRetime( Aig_Man_t * p, int fForward, int nStepsMax, int fVerbose ) -{ - Vec_Ptr_t * vQueue; - Aig_Man_t * pNew; - Rtm_Man_t * pRtm; - Rtm_Obj_t * pObj, * pNext; - Aig_Obj_t * pObjAig; - int i, k, nAutos, Degree, DegreeMax = 0; - int clk; - - // create the retiming manager -clk = clock(); - pRtm = Rtm_ManFromAig( p ); - // set registers - Aig_ManForEachLoSeq( p, pObjAig, i ) - Rtm_ObjAddFirst( pRtm, Rtm_ObjEdge(pObjAig->pData, 0), fForward? RTM_VAL_ZERO : RTM_VAL_VOID ); - // detect and mark the autonomous components - if ( fForward ) - nAutos = Rtm_ManMarkAutoFwd( pRtm ); - else - nAutos = Rtm_ManMarkAutoBwd( pRtm ); - if ( fVerbose ) - { - printf( "Detected %d autonomous objects. ", nAutos ); - PRT( "Time", clock() - clk ); - } - - // set the current retiming number - Rtm_ManForEachObj( pRtm, pObj, i ) - { - assert( pObj->nFanins == pObj->Num ); - assert( pObj->nFanouts == pObj->Temp ); - pObj->Num = 0; - } - -clk = clock(); - // put the LOs on the queue - vQueue = Vec_PtrAlloc( 1000 ); - if ( fForward ) - { - Aig_ManForEachLoSeq( p, pObjAig, i ) - { - pObj = pObjAig->pData; - if ( pObj->fAuto ) - continue; - pObj->fMark = 1; - Vec_PtrPush( vQueue, pObj ); - } - } - else - { - Aig_ManForEachLiSeq( p, pObjAig, i ) - { - pObj = pObjAig->pData; - if ( pObj->fAuto ) - continue; - pObj->fMark = 1; - Vec_PtrPush( vQueue, pObj ); - } - } - // perform retiming - DegreeMax = 0; - Vec_PtrForEachEntry( vQueue, pObj, i ) - { - pObj->fMark = 0; - // retime the node - if ( fForward ) - { - Rtm_ObjRetimeFwd( pRtm, pObj ); - // check if its fanouts should be retimed - Rtm_ObjForEachFanout( pObj, pNext, k ) - { - if ( pNext->fMark ) // skip aleady scheduled - continue; - if ( pNext->Type ) // skip POs - continue; - if ( !Rtm_ObjCheckRetimeFwd( pNext ) ) // skip non-retimable - continue; - Degree = Rtm_ObjGetDegreeFwd( pNext ); - DegreeMax = AIG_MAX( DegreeMax, Degree ); - if ( Degree > nStepsMax ) // skip nodes with high degree - continue; - pNext->fMark = 1; - pNext->Num = Degree; - Vec_PtrPush( vQueue, pNext ); - } - } - else - { - Rtm_ObjRetimeBwd( pRtm, pObj ); - // check if its fanouts should be retimed - Rtm_ObjForEachFanin( pObj, pNext, k ) - { - if ( pNext->fMark ) // skip aleady scheduled - continue; - if ( pNext->nFanins == 0 ) // skip PIs - continue; - if ( !Rtm_ObjCheckRetimeBwd( pNext ) ) // skip non-retimable - continue; - Degree = Rtm_ObjGetDegreeBwd( pNext ); - DegreeMax = AIG_MAX( DegreeMax, Degree ); - if ( Degree > nStepsMax ) // skip nodes with high degree - continue; - pNext->fMark = 1; - pNext->Num = Degree; - Vec_PtrPush( vQueue, pNext ); - } - } - } - - if ( fVerbose ) - { - printf( "Performed %d %s latch moves of max depth %d and max latch count %d.\n", - Vec_PtrSize(vQueue), fForward? "fwd":"bwd", DegreeMax, Rtm_ManLatchMax(pRtm) ); - printf( "Memory usage = %d. ", pRtm->nExtraCur ); - PRT( "Time", clock() - clk ); - } - Vec_PtrFree( vQueue ); - - // get the new manager - pNew = Rtm_ManToAig( pRtm ); - pNew->pName = Aig_UtilStrsav( p->pName ); - Rtm_ManFree( pRtm ); - // group the registers -clk = clock(); - pNew = Aig_ManReduceLaches( pNew, fVerbose ); - if ( fVerbose ) - { - PRT( "Register sharing time", clock() - clk ); - } - return pNew; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigScl.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigScl.c deleted file mode 100644 index 0cf8f6024..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigScl.c +++ /dev/null @@ -1,399 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigScl.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Sequential cleanup.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigScl.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Remaps the manager.] - - Description [Map in the array specifies for each CI nodes the node that - should be used after remapping.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManRemap( Aig_Man_t * p, Vec_Ptr_t * vMap ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj, * pObjMapped; - int i; - // create the new manager - pNew = Aig_ManStart( Aig_ManObjNumMax(p) ); - pNew->pName = Aig_UtilStrsav( p->pName ); - pNew->nRegs = p->nRegs; - pNew->nAsserts = p->nAsserts; - if ( p->vFlopNums ) - pNew->vFlopNums = Vec_IntDup( p->vFlopNums ); - // create the PIs - Aig_ManCleanData( p ); - Aig_ManConst1(p)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( p, pObj, i ) - pObj->pData = Aig_ObjCreatePi(pNew); - // implement the mapping - Aig_ManForEachPi( p, pObj, i ) - { - pObjMapped = Vec_PtrEntry( vMap, i ); - pObj->pData = Aig_NotCond( Aig_Regular(pObjMapped)->pData, Aig_IsComplement(pObjMapped) ); - } - // duplicate internal nodes - Aig_ManForEachObj( p, pObj, i ) - if ( Aig_ObjIsBuf(pObj) ) - pObj->pData = Aig_ObjChild0Copy(pObj); - else if ( Aig_ObjIsNode(pObj) ) - pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); - // add the POs - Aig_ManForEachPo( p, pObj, i ) - Aig_ObjCreatePo( pNew, Aig_ObjChild0Copy(pObj) ); - assert( Aig_ManNodeNum(p) >= Aig_ManNodeNum(pNew) ); - // check the resulting network - if ( !Aig_ManCheck(pNew) ) - printf( "Aig_ManDup(): The check has failed.\n" ); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Returns the number of dangling nodes removed.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManSeqCleanup_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vNodes ) -{ - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - return; - Aig_ObjSetTravIdCurrent(p, pObj); - // collect latch input corresponding to unmarked PI (latch output) - if ( Aig_ObjIsPi(pObj) ) - { - Vec_PtrPush( vNodes, pObj->pNext ); - return; - } - if ( Aig_ObjIsPo(pObj) ) - { - Aig_ManSeqCleanup_rec( p, Aig_ObjFanin0(pObj), vNodes ); - return; - } - assert( Aig_ObjIsNode(pObj) ); - Aig_ManSeqCleanup_rec( p, Aig_ObjFanin0(pObj), vNodes ); - Aig_ManSeqCleanup_rec( p, Aig_ObjFanin1(pObj), vNodes ); -} - -/**Function************************************************************* - - Synopsis [Returns the number of dangling nodes removed.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManSeqCleanup( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes, * vCis, * vCos; - Aig_Obj_t * pObj, * pObjLi, * pObjLo; - int i, nTruePis, nTruePos; - assert( Aig_ManBufNum(p) == 0 ); - - // mark the PIs - Aig_ManIncrementTravId( p ); - Aig_ObjSetTravIdCurrent( p, Aig_ManConst1(p) ); - Aig_ManForEachPiSeq( p, pObj, i ) - Aig_ObjSetTravIdCurrent( p, pObj ); - - // prepare to collect nodes reachable from POs - vNodes = Vec_PtrAlloc( 100 ); - Aig_ManForEachPoSeq( p, pObj, i ) - Vec_PtrPush( vNodes, pObj ); - - // remember latch inputs in latch outputs - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - pObjLo->pNext = pObjLi; - // mark the nodes reachable from these nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - Aig_ManSeqCleanup_rec( p, pObj, vNodes ); - assert( Vec_PtrSize(vNodes) <= Aig_ManPoNum(p) ); - // clean latch output pointers - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - pObjLo->pNext = NULL; - - // if some latches are removed, update PIs/POs - if ( Vec_PtrSize(vNodes) < Aig_ManPoNum(p) ) - { - if ( p->vFlopNums ) - { - int nTruePos = Aig_ManPoNum(p)-Aig_ManRegNum(p); - // remember numbers of flops in the flops - Aig_ManForEachLiSeq( p, pObj, i ) - pObj->pNext = (Aig_Obj_t *)(long)Vec_IntEntry( p->vFlopNums, i - nTruePos ); - // reset the flop numbers - Vec_PtrForEachEntryStart( vNodes, pObj, i, nTruePos ) - Vec_IntWriteEntry( p->vFlopNums, i - nTruePos, (int)(long)pObj->pNext ); - Vec_IntShrink( p->vFlopNums, Vec_PtrSize(vNodes) - nTruePos ); - // clean the next pointer - Aig_ManForEachLiSeq( p, pObj, i ) - pObj->pNext = NULL; - } - // collect new CIs/COs - vCis = Vec_PtrAlloc( Aig_ManPiNum(p) ); - Aig_ManForEachPi( p, pObj, i ) - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - Vec_PtrPush( vCis, pObj ); - else - { - Vec_PtrWriteEntry( p->vObjs, pObj->Id, NULL ); -// Aig_ManRecycleMemory( p, pObj ); - } - vCos = Vec_PtrAlloc( Aig_ManPoNum(p) ); - Aig_ManForEachPo( p, pObj, i ) - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - Vec_PtrPush( vCos, pObj ); - else - { - Aig_ObjDisconnect( p, pObj ); - Vec_PtrWriteEntry( p->vObjs, pObj->Id, NULL ); -// Aig_ManRecycleMemory( p, pObj ); - } - // remember the number of true PIs/POs - nTruePis = Aig_ManPiNum(p) - Aig_ManRegNum(p); - nTruePos = Aig_ManPoNum(p) - Aig_ManRegNum(p); - // set the new number of registers - p->nRegs -= Aig_ManPoNum(p) - Vec_PtrSize(vNodes); - // create new PIs/POs - assert( Vec_PtrSize(vCis) == nTruePis + p->nRegs ); - assert( Vec_PtrSize(vCos) == nTruePos + p->nRegs ); - Vec_PtrFree( p->vPis ); p->vPis = vCis; - Vec_PtrFree( p->vPos ); p->vPos = vCos; - p->nObjs[AIG_OBJ_PI] = Vec_PtrSize( p->vPis ); - p->nObjs[AIG_OBJ_PO] = Vec_PtrSize( p->vPos ); - - } - Vec_PtrFree( vNodes ); - // remove dangling nodes - return Aig_ManCleanup( p ); -} - -/**Function************************************************************* - - Synopsis [Returns the number of dangling nodes removed.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManCountMergeRegs( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj, * pFanin; - int i, Counter = 0, Const0 = 0, Const1 = 0; - Aig_ManIncrementTravId( p ); - Aig_ManForEachLiSeq( p, pObj, i ) - { - pFanin = Aig_ObjFanin0(pObj); - if ( Aig_ObjIsConst1(pFanin) ) - { - if ( Aig_ObjFaninC0(pObj) ) - Const0++; - else - Const1++; - } - if ( Aig_ObjIsTravIdCurrent(p, pFanin) ) - continue; - Aig_ObjSetTravIdCurrent(p, pFanin); - Counter++; - } - printf( "Regs = %d. Fanins = %d. Const0 = %d. Const1 = %d.\n", - Aig_ManRegNum(p), Counter, Const0, Const1 ); - return 0; -} - - -/**Function************************************************************* - - Synopsis [Checks how many latches can be reduced.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManReduceLachesCount( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj, * pFanin; - int i, Counter = 0, Diffs = 0; - assert( Aig_ManRegNum(p) > 0 ); - Aig_ManForEachObj( p, pObj, i ) - assert( !pObj->fMarkA && !pObj->fMarkB ); - Aig_ManForEachLiSeq( p, pObj, i ) - { - pFanin = Aig_ObjFanin0(pObj); - if ( Aig_ObjFaninC0(pObj) ) - { - if ( pFanin->fMarkB ) - Counter++; - else - pFanin->fMarkB = 1; - } - else - { - if ( pFanin->fMarkA ) - Counter++; - else - pFanin->fMarkA = 1; - } - } - // count fanins that have both attributes - Aig_ManForEachLiSeq( p, pObj, i ) - { - pFanin = Aig_ObjFanin0(pObj); - Diffs += pFanin->fMarkA && pFanin->fMarkB; - pFanin->fMarkA = pFanin->fMarkB = 0; - } -// printf( "Diffs = %d.\n", Diffs ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Reduces the latches.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManReduceLachesOnce( Aig_Man_t * p ) -{ - Vec_Ptr_t * vMap; - Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pFanin; - int * pMapping, i; - // start mapping by adding the true PIs - vMap = Vec_PtrAlloc( Aig_ManPiNum(p) ); - Aig_ManForEachPiSeq( p, pObj, i ) - Vec_PtrPush( vMap, pObj ); - // create mapping of fanin nodes into the corresponding latch outputs - pMapping = ALLOC( int, 2 * Aig_ManObjNumMax(p) ); - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - { - pFanin = Aig_ObjFanin0(pObjLi); - if ( Aig_ObjFaninC0(pObjLi) ) - { - if ( pFanin->fMarkB ) - { - Vec_PtrPush( vMap, Aig_ManLo(p, pMapping[2*pFanin->Id + 1]) ); - } - else - { - pFanin->fMarkB = 1; - pMapping[2*pFanin->Id + 1] = i; - Vec_PtrPush( vMap, pObjLo ); - } - } - else - { - if ( pFanin->fMarkA ) - { - Vec_PtrPush( vMap, Aig_ManLo(p, pMapping[2*pFanin->Id]) ); - } - else - { - pFanin->fMarkA = 1; - pMapping[2*pFanin->Id] = i; - Vec_PtrPush( vMap, pObjLo ); - } - } - } - free( pMapping ); - Aig_ManForEachLiSeq( p, pObj, i ) - { - pFanin = Aig_ObjFanin0(pObj); - pFanin->fMarkA = pFanin->fMarkB = 0; - } - return vMap; -} - -/**Function************************************************************* - - Synopsis [Reduces the latches.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManReduceLaches( Aig_Man_t * p, int fVerbose ) -{ - Aig_Man_t * pTemp; - Vec_Ptr_t * vMap; - int nSaved, nCur; - for ( nSaved = 0; (nCur = Aig_ManReduceLachesCount(p)); nSaved += nCur ) - { - if ( fVerbose ) - { - printf( "Saved = %5d. ", nCur ); - printf( "RBeg = %5d. NBeg = %6d. ", Aig_ManRegNum(p), Aig_ManNodeNum(p) ); - } - vMap = Aig_ManReduceLachesOnce( p ); - p = Aig_ManRemap( pTemp = p, vMap ); - Aig_ManStop( pTemp ); - Vec_PtrFree( vMap ); - Aig_ManSeqCleanup( p ); - if ( fVerbose ) - { - printf( "REnd = %5d. NEnd = %6d. ", Aig_ManRegNum(p), Aig_ManNodeNum(p) ); - printf( "\n" ); - } - if ( p->nRegs == 0 ) - break; - } - return p; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigSeq.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigSeq.c deleted file mode 100644 index 7f4e2d438..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigSeq.c +++ /dev/null @@ -1,502 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigSeq.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Sequential strashing.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigSeq.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Converts combinational AIG manager into a sequential one.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManSeqStrashConvert( Aig_Man_t * p, int nLatches, int * pInits ) -{ - Aig_Obj_t * pObjLi, * pObjLo, * pLatch; - int i; - assert( Vec_PtrSize( p->vBufs ) == 0 ); - // collect the POs to be converted into latches - for ( i = 0; i < nLatches; i++ ) - { - // get the corresponding PI/PO pair - pObjLi = Aig_ManPo( p, Aig_ManPoNum(p) - nLatches + i ); - pObjLo = Aig_ManPi( p, Aig_ManPiNum(p) - nLatches + i ); - // create latch - pLatch = Aig_Latch( p, Aig_ObjChild0(pObjLi), pInits? pInits[i] : 0 ); - // recycle the old PO object - Aig_ObjDisconnect( p, pObjLi ); - Vec_PtrWriteEntry( p->vObjs, pObjLi->Id, NULL ); - Aig_ManRecycleMemory( p, pObjLi ); - // convert the corresponding PI to be a buffer and connect it to the latch - pObjLo->Type = AIG_OBJ_BUF; - Aig_ObjConnect( p, pObjLo, pLatch, NULL ); - // save the buffer -// Vec_PtrPush( p->vBufs, pObjLo ); - } - // shrink the arrays - Vec_PtrShrink( p->vPis, Aig_ManPiNum(p) - nLatches ); - Vec_PtrShrink( p->vPos, Aig_ManPoNum(p) - nLatches ); - // update the counters of different objects - p->nObjs[AIG_OBJ_PI] -= nLatches; - p->nObjs[AIG_OBJ_PO] -= nLatches; - p->nObjs[AIG_OBJ_BUF] += nLatches; -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDfsSeq_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vNodes ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( pObj == NULL ) - return; - if ( Aig_ObjIsTravIdCurrent( p, pObj ) ) - return; - Aig_ObjSetTravIdCurrent( p, pObj ); - if ( Aig_ObjIsPi(pObj) || Aig_ObjIsConst1(pObj) ) - return; - Aig_ManDfsSeq_rec( p, Aig_ObjFanin0(pObj), vNodes ); - Aig_ManDfsSeq_rec( p, Aig_ObjFanin1(pObj), vNodes ); -// if ( (Aig_ObjFanin0(pObj) == NULL || Aig_ObjIsBuf(Aig_ObjFanin0(pObj))) && -// (Aig_ObjFanin1(pObj) == NULL || Aig_ObjIsBuf(Aig_ObjFanin1(pObj))) ) - Vec_PtrPush( vNodes, pObj ); -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManDfsSeq( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i; - Aig_ManIncrementTravId( p ); - vNodes = Vec_PtrAlloc( Aig_ManNodeNum(p) ); - Aig_ManForEachPo( p, pObj, i ) - Aig_ManDfsSeq_rec( p, Aig_ObjFanin0(pObj), vNodes ); - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes in the DFS order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDfsUnreach_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vNodes ) -{ - assert( !Aig_IsComplement(pObj) ); - if ( pObj == NULL ) - return; - if ( Aig_ObjIsTravIdPrevious(p, pObj) || Aig_ObjIsTravIdCurrent(p, pObj) ) - return; - Aig_ObjSetTravIdPrevious( p, pObj ); // assume unknown - Aig_ManDfsUnreach_rec( p, Aig_ObjFanin0(pObj), vNodes ); - Aig_ManDfsUnreach_rec( p, Aig_ObjFanin1(pObj), vNodes ); - if ( Aig_ObjIsTravIdPrevious(p, Aig_ObjFanin0(pObj)) && - (Aig_ObjFanin1(pObj) == NULL || Aig_ObjIsTravIdPrevious(p, Aig_ObjFanin1(pObj))) ) - Vec_PtrPush( vNodes, pObj ); - else - Aig_ObjSetTravIdCurrent( p, pObj ); -} - -/**Function************************************************************* - - Synopsis [Collects internal nodes unreachable from PIs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManDfsUnreach( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj, * pFanin; - int i, k;//, RetValue; - // collect unreachable nodes - Aig_ManIncrementTravId( p ); - Aig_ManIncrementTravId( p ); - // mark the constant and PIs - Aig_ObjSetTravIdPrevious( p, Aig_ManConst1(p) ); - Aig_ManForEachPi( p, pObj, i ) - Aig_ObjSetTravIdCurrent( p, pObj ); - // curr marks visited nodes reachable from PIs - // prev marks visited nodes unreachable or unknown - - // collect the unreachable nodes - vNodes = Vec_PtrAlloc( 32 ); - Aig_ManForEachPo( p, pObj, i ) - Aig_ManDfsUnreach_rec( p, Aig_ObjFanin0(pObj), vNodes ); - - // refine resulting nodes - do - { - k = 0; - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - assert( Aig_ObjIsTravIdPrevious(p, pObj) ); - if ( Aig_ObjIsLatch(pObj) || Aig_ObjIsBuf(pObj) ) - { - pFanin = Aig_ObjFanin0(pObj); - assert( Aig_ObjIsTravIdPrevious(p, pFanin) || Aig_ObjIsTravIdCurrent(p, pFanin) ); - if ( Aig_ObjIsTravIdCurrent(p, pFanin) ) - { - Aig_ObjSetTravIdCurrent( p, pObj ); - continue; - } - } - else // AND gate - { - assert( Aig_ObjIsNode(pObj) ); - pFanin = Aig_ObjFanin0(pObj); - assert( Aig_ObjIsTravIdPrevious(p, pFanin) || Aig_ObjIsTravIdCurrent(p, pFanin) ); - if ( Aig_ObjIsTravIdCurrent(p, pFanin) ) - { - Aig_ObjSetTravIdCurrent( p, pObj ); - continue; - } - pFanin = Aig_ObjFanin1(pObj); - assert( Aig_ObjIsTravIdPrevious(p, pFanin) || Aig_ObjIsTravIdCurrent(p, pFanin) ); - if ( Aig_ObjIsTravIdCurrent(p, pFanin) ) - { - Aig_ObjSetTravIdCurrent( p, pObj ); - continue; - } - } - // write it back - Vec_PtrWriteEntry( vNodes, k++, pObj ); - } - Vec_PtrShrink( vNodes, k ); - } - while ( k < i ); - -// if ( Vec_PtrSize(vNodes) > 0 ) -// printf( "Found %d unreachable.\n", Vec_PtrSize(vNodes) ); - return vNodes; - -/* - // the resulting array contains all unreachable nodes except const 1 - if ( Vec_PtrSize(vNodes) == 0 ) - { - Vec_PtrFree( vNodes ); - return 0; - } - RetValue = Vec_PtrSize(vNodes); - - // mark these nodes - Aig_ManIncrementTravId( p ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - Aig_ObjSetTravIdCurrent( p, pObj ); - Vec_PtrFree( vNodes ); - return RetValue; -*/ -} - - -/**Function************************************************************* - - Synopsis [Removes nodes that do not fanout into POs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManRemoveUnmarked( Aig_Man_t * p ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i, RetValue; - // collect unmarked nodes - vNodes = Vec_PtrAlloc( 100 ); - Aig_ManForEachObj( p, pObj, i ) - { - if ( Aig_ObjIsTerm(pObj) ) - continue; - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - continue; -//Aig_ObjPrintVerbose( pObj, 0 ); - Aig_ObjDisconnect( p, pObj ); - Vec_PtrPush( vNodes, pObj ); - } - if ( Vec_PtrSize(vNodes) == 0 ) - { - Vec_PtrFree( vNodes ); - return 0; - } - // remove the dangling objects - RetValue = Vec_PtrSize(vNodes); - Vec_PtrForEachEntry( vNodes, pObj, i ) - Aig_ObjDelete( p, pObj ); -// printf( "Removed %d dangling.\n", Vec_PtrSize(vNodes) ); - Vec_PtrFree( vNodes ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Rehashes the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManSeqRehashOne( Aig_Man_t * p, Vec_Ptr_t * vNodes, Vec_Ptr_t * vUnreach ) -{ - Aig_Obj_t * pObj, * pObjNew, * pFanin0, * pFanin1; - int i, RetValue = 0, Counter = 0;//, Counter2 = 0; - - // mark the unreachable nodes - Aig_ManIncrementTravId( p ); - Vec_PtrForEachEntry( vUnreach, pObj, i ) - Aig_ObjSetTravIdCurrent(p, pObj); -/* - // count the number of unreachable object connections - // that is the number of unreachable objects connected to main objects - Aig_ManForEachObj( p, pObj, i ) - { - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - continue; - - pFanin0 = Aig_ObjFanin0(pObj); - if ( pFanin0 == NULL ) - continue; - if ( Aig_ObjIsTravIdCurrent(p, pFanin0) ) - pFanin0->fMarkA = 1; - - pFanin1 = Aig_ObjFanin1(pObj); - if ( pFanin1 == NULL ) - continue; - if ( Aig_ObjIsTravIdCurrent(p, pFanin1) ) - pFanin1->fMarkA = 1; - } - - // count the objects - Aig_ManForEachObj( p, pObj, i ) - Counter2 += pObj->fMarkA, pObj->fMarkA = 0; - printf( "Connections = %d.\n", Counter2 ); -*/ - - // go through the nodes while skipping unreachable - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - // skip nodes unreachable from the PIs - if ( Aig_ObjIsTravIdCurrent(p, pObj) ) - continue; - // process the node - if ( Aig_ObjIsPo(pObj) ) - { - if ( !Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) ) - continue; - pFanin0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - Aig_ObjPatchFanin0( p, pObj, pFanin0 ); - continue; - } - if ( Aig_ObjIsLatch(pObj) ) - { - if ( !Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) ) - continue; - pObjNew = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - pObjNew = Aig_Latch( p, pObjNew, 0 ); - Aig_ObjReplace( p, pObj, pObjNew, 1, 0 ); - RetValue = 1; - Counter++; - continue; - } - if ( Aig_ObjIsNode(pObj) ) - { - if ( !Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) && !Aig_ObjIsBuf(Aig_ObjFanin1(pObj)) ) - continue; - pFanin0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - pFanin1 = Aig_ObjReal_rec( Aig_ObjChild1(pObj) ); - pObjNew = Aig_And( p, pFanin0, pFanin1 ); - Aig_ObjReplace( p, pObj, pObjNew, 1, 0 ); - RetValue = 1; - Counter++; - continue; - } - } -// printf( "Rehashings = %d.\n", Counter++ ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [If AIG contains buffers, this procedure removes them.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManRemoveBuffers( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj, * pObjNew, * pFanin0, * pFanin1; - int i; - if ( Aig_ManBufNum(p) == 0 ) - return; - Aig_ManForEachObj( p, pObj, i ) - { - if ( Aig_ObjIsPo(pObj) ) - { - if ( !Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) ) - continue; - pFanin0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - Aig_ObjPatchFanin0( p, pObj, pFanin0 ); - } - else if ( Aig_ObjIsLatch(pObj) ) - { - if ( !Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) ) - continue; - pFanin0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - pObjNew = Aig_Latch( p, pFanin0, 0 ); - Aig_ObjReplace( p, pObj, pObjNew, 0, 0 ); - } - else if ( Aig_ObjIsAnd(pObj) ) - { - if ( !Aig_ObjIsBuf(Aig_ObjFanin0(pObj)) && !Aig_ObjIsBuf(Aig_ObjFanin1(pObj)) ) - continue; - pFanin0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - pFanin1 = Aig_ObjReal_rec( Aig_ObjChild1(pObj) ); - pObjNew = Aig_And( p, pFanin0, pFanin1 ); - Aig_ObjReplace( p, pObj, pObjNew, 0, 0 ); - } - } - assert( Aig_ManBufNum(p) == 0 ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManSeqStrash( Aig_Man_t * p, int nLatches, int * pInits ) -{ - Vec_Ptr_t * vNodes, * vUnreach; -// Aig_Obj_t * pObj, * pFanin; -// int i; - int Iter, RetValue = 1; - - // create latches out of the additional PI/PO pairs - Aig_ManSeqStrashConvert( p, nLatches, pInits ); - - // iteratively rehash the network - for ( Iter = 0; RetValue; Iter++ ) - { -// Aig_ManPrintStats( p ); -/* - Aig_ManForEachObj( p, pObj, i ) - { - assert( pObj->Type > 0 ); - pFanin = Aig_ObjFanin0(pObj); - assert( pFanin == NULL || pFanin->Type > 0 ); - pFanin = Aig_ObjFanin1(pObj); - assert( pFanin == NULL || pFanin->Type > 0 ); - } -*/ - // mark nodes unreachable from the PIs - vUnreach = Aig_ManDfsUnreach( p ); - if ( Iter == 0 && Vec_PtrSize(vUnreach) > 0 ) - printf( "Unreachable objects = %d.\n", Vec_PtrSize(vUnreach) ); - // collect nodes reachable from the POs - vNodes = Aig_ManDfsSeq( p ); - // remove nodes unreachable from the POs - if ( Iter == 0 ) - Aig_ManRemoveUnmarked( p ); - // continue rehashing as long as there are changes - RetValue = Aig_ManSeqRehashOne( p, vNodes, vUnreach ); - Vec_PtrFree( vNodes ); - Vec_PtrFree( vUnreach ); - } - - // perform the final cleanup - Aig_ManIncrementTravId( p ); - vNodes = Aig_ManDfsSeq( p ); - Aig_ManRemoveUnmarked( p ); - Vec_PtrFree( vNodes ); - // remove buffers if they are left -// Aig_ManRemoveBuffers( p ); - - // clean up - if ( !Aig_ManCheck( p ) ) - { - printf( "Aig_ManSeqStrash: The network check has failed.\n" ); - return 0; - } - return 1; - -} - - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigShow.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigShow.c deleted file mode 100644 index a88f4930c..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigShow.c +++ /dev/null @@ -1,356 +0,0 @@ -/**CFile**************************************************************** - - FileName [ivyShow.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [And-Inverter Graph package.] - - Synopsis [Visualization of HAIG.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - May 11, 2006.] - - Revision [$Id: ivyShow.c,v 1.00 2006/05/11 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Writes the graph structure of AIG for DOT.] - - Description [Useful for graph visualization using tools such as GraphViz: - http://www.graphviz.org/] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_WriteDotAig( Aig_Man_t * pMan, char * pFileName, int fHaig, Vec_Ptr_t * vBold ) -{ - FILE * pFile; - Aig_Obj_t * pNode;//, * pTemp, * pPrev; - int LevelMax, Level, i; - - if ( Aig_ManNodeNum(pMan) > 200 ) - { - fprintf( stdout, "Cannot visualize AIG with more than 200 nodes.\n" ); - return; - } - if ( (pFile = fopen( pFileName, "w" )) == NULL ) - { - fprintf( stdout, "Cannot open the intermediate file \"%s\".\n", pFileName ); - return; - } - - // mark the nodes - if ( vBold ) - Vec_PtrForEachEntry( vBold, pNode, i ) - pNode->fMarkB = 1; - - // compute levels -// LevelMax = 1 + Aig_ManSetLevels( pMan, fHaig ); - LevelMax = 1 + Aig_ManLevels( pMan ); - Aig_ManForEachPo( pMan, pNode, i ) - pNode->Level = LevelMax; - - // write the DOT header - fprintf( pFile, "# %s\n", "AIG structure generated by IVY package" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "digraph AIG {\n" ); - fprintf( pFile, "size = \"7.5,10\";\n" ); -// fprintf( pFile, "ranksep = 0.5;\n" ); -// fprintf( pFile, "nodesep = 0.5;\n" ); - fprintf( pFile, "center = true;\n" ); -// fprintf( pFile, "orientation = landscape;\n" ); -// fprintf( pFile, "edge [fontsize = 10];\n" ); -// fprintf( pFile, "edge [dir = none];\n" ); - fprintf( pFile, "edge [dir = back];\n" ); - fprintf( pFile, "\n" ); - - // labels on the left of the picture - fprintf( pFile, "{\n" ); - fprintf( pFile, " node [shape = plaintext];\n" ); - fprintf( pFile, " edge [style = invis];\n" ); - fprintf( pFile, " LevelTitle1 [label=\"\"];\n" ); - fprintf( pFile, " LevelTitle2 [label=\"\"];\n" ); - // generate node names with labels - for ( Level = LevelMax; Level >= 0; Level-- ) - { - // the visible node name - fprintf( pFile, " Level%d", Level ); - fprintf( pFile, " [label = " ); - // label name - fprintf( pFile, "\"" ); - fprintf( pFile, "\"" ); - fprintf( pFile, "];\n" ); - } - - // genetate the sequence of visible/invisible nodes to mark levels - fprintf( pFile, " LevelTitle1 -> LevelTitle2 ->" ); - for ( Level = LevelMax; Level >= 0; Level-- ) - { - // the visible node name - fprintf( pFile, " Level%d", Level ); - // the connector - if ( Level != 0 ) - fprintf( pFile, " ->" ); - else - fprintf( pFile, ";" ); - } - fprintf( pFile, "\n" ); - fprintf( pFile, "}" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - - // generate title box on top - fprintf( pFile, "{\n" ); - fprintf( pFile, " rank = same;\n" ); - fprintf( pFile, " LevelTitle1;\n" ); - fprintf( pFile, " title1 [shape=plaintext,\n" ); - fprintf( pFile, " fontsize=20,\n" ); - fprintf( pFile, " fontname = \"Times-Roman\",\n" ); - fprintf( pFile, " label=\"" ); - fprintf( pFile, "%s", "AIG structure visualized by ABC" ); - fprintf( pFile, "\\n" ); - fprintf( pFile, "Benchmark \\\"%s\\\". ", "aig" ); -// fprintf( pFile, "Time was %s. ", Extra_TimeStamp() ); - fprintf( pFile, "\"\n" ); - fprintf( pFile, " ];\n" ); - fprintf( pFile, "}" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - - // generate statistics box - fprintf( pFile, "{\n" ); - fprintf( pFile, " rank = same;\n" ); - fprintf( pFile, " LevelTitle2;\n" ); - fprintf( pFile, " title2 [shape=plaintext,\n" ); - fprintf( pFile, " fontsize=18,\n" ); - fprintf( pFile, " fontname = \"Times-Roman\",\n" ); - fprintf( pFile, " label=\"" ); - fprintf( pFile, "The set contains %d logic nodes and spans %d levels.", Aig_ManNodeNum(pMan), LevelMax ); - fprintf( pFile, "\\n" ); - fprintf( pFile, "\"\n" ); - fprintf( pFile, " ];\n" ); - fprintf( pFile, "}" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - - // generate the COs - fprintf( pFile, "{\n" ); - fprintf( pFile, " rank = same;\n" ); - // the labeling node of this level - fprintf( pFile, " Level%d;\n", LevelMax ); - // generate the CO nodes - Aig_ManForEachPo( pMan, pNode, i ) - { -/* - if ( fHaig || pNode->pEquiv == NULL ) - fprintf( pFile, " Node%d%s [label = \"%d%s\"", pNode->Id, - (Aig_ObjIsLatch(pNode)? "_in":""), pNode->Id, (Aig_ObjIsLatch(pNode)? "_in":"") ); - else - fprintf( pFile, " Node%d%s [label = \"%d%s(%d%s)\"", pNode->Id, - (Aig_ObjIsLatch(pNode)? "_in":""), pNode->Id, (Aig_ObjIsLatch(pNode)? "_in":""), - Aig_Regular(pNode->pEquiv)->Id, Aig_IsComplement(pNode->pEquiv)? "\'":"" ); -*/ - fprintf( pFile, " Node%d [label = \"%d\"", pNode->Id, pNode->Id ); - - fprintf( pFile, ", shape = %s", (Aig_ObjIsLatch(pNode)? "box":"invtriangle") ); - fprintf( pFile, ", color = coral, fillcolor = coral" ); - fprintf( pFile, "];\n" ); - } - fprintf( pFile, "}" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - - // generate nodes of each rank - for ( Level = LevelMax - 1; Level > 0; Level-- ) - { - fprintf( pFile, "{\n" ); - fprintf( pFile, " rank = same;\n" ); - // the labeling node of this level - fprintf( pFile, " Level%d;\n", Level ); - Aig_ManForEachObj( pMan, pNode, i ) - { - if ( (int)pNode->Level != Level ) - continue; -/* - if ( fHaig || pNode->pEquiv == NULL ) - fprintf( pFile, " Node%d [label = \"%d\"", pNode->Id, pNode->Id ); - else - fprintf( pFile, " Node%d [label = \"%d(%d%s)\"", pNode->Id, pNode->Id, - Aig_Regular(pNode->pEquiv)->Id, Aig_IsComplement(pNode->pEquiv)? "\'":"" ); -*/ - fprintf( pFile, " Node%d [label = \"%d\"", pNode->Id, pNode->Id ); - - fprintf( pFile, ", shape = ellipse" ); - if ( vBold && pNode->fMarkB ) - fprintf( pFile, ", style = filled" ); - fprintf( pFile, "];\n" ); - } - fprintf( pFile, "}" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - } - - // generate the CI nodes - fprintf( pFile, "{\n" ); - fprintf( pFile, " rank = same;\n" ); - // the labeling node of this level - fprintf( pFile, " Level%d;\n", 0 ); - // generate constant node - if ( Aig_ObjRefs(Aig_ManConst1(pMan)) > 0 ) - { - pNode = Aig_ManConst1(pMan); - // check if the costant node is present - fprintf( pFile, " Node%d [label = \"Const1\"", pNode->Id ); - fprintf( pFile, ", shape = ellipse" ); - fprintf( pFile, ", color = coral, fillcolor = coral" ); - fprintf( pFile, "];\n" ); - } - // generate the CI nodes - Aig_ManForEachPi( pMan, pNode, i ) - { -/* - if ( fHaig || pNode->pEquiv == NULL ) - fprintf( pFile, " Node%d%s [label = \"%d%s\"", pNode->Id, - (Aig_ObjIsLatch(pNode)? "_out":""), pNode->Id, (Aig_ObjIsLatch(pNode)? "_out":"") ); - else - fprintf( pFile, " Node%d%s [label = \"%d%s(%d%s)\"", pNode->Id, - (Aig_ObjIsLatch(pNode)? "_out":""), pNode->Id, (Aig_ObjIsLatch(pNode)? "_out":""), - Aig_Regular(pNode->pEquiv)->Id, Aig_IsComplement(pNode->pEquiv)? "\'":"" ); -*/ - fprintf( pFile, " Node%d [label = \"%d\"", pNode->Id, pNode->Id ); - - fprintf( pFile, ", shape = %s", (Aig_ObjIsLatch(pNode)? "box":"triangle") ); - fprintf( pFile, ", color = coral, fillcolor = coral" ); - fprintf( pFile, "];\n" ); - } - fprintf( pFile, "}" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - - // generate invisible edges from the square down - fprintf( pFile, "title1 -> title2 [style = invis];\n" ); - Aig_ManForEachPo( pMan, pNode, i ) - fprintf( pFile, "title2 -> Node%d%s [style = invis];\n", pNode->Id, (Aig_ObjIsLatch(pNode)? "_in":"") ); - - // generate edges - Aig_ManForEachObj( pMan, pNode, i ) - { - if ( !Aig_ObjIsNode(pNode) && !Aig_ObjIsPo(pNode) && !Aig_ObjIsBuf(pNode) ) - continue; - // generate the edge from this node to the next - fprintf( pFile, "Node%d%s", pNode->Id, (Aig_ObjIsLatch(pNode)? "_in":"") ); - fprintf( pFile, " -> " ); - fprintf( pFile, "Node%d%s", Aig_ObjFaninId0(pNode), (Aig_ObjIsLatch(Aig_ObjFanin0(pNode))? "_out":"") ); - fprintf( pFile, " [" ); - fprintf( pFile, "style = %s", Aig_ObjFaninC0(pNode)? "dotted" : "bold" ); -// if ( Aig_NtkIsSeq(pNode->pMan) && Seq_ObjFaninL0(pNode) > 0 ) -// fprintf( pFile, ", label = \"%s\"", Seq_ObjFaninGetInitPrintable(pNode,0) ); - fprintf( pFile, "]" ); - fprintf( pFile, ";\n" ); - if ( !Aig_ObjIsNode(pNode) ) - continue; - // generate the edge from this node to the next - fprintf( pFile, "Node%d", pNode->Id ); - fprintf( pFile, " -> " ); - fprintf( pFile, "Node%d%s", Aig_ObjFaninId1(pNode), (Aig_ObjIsLatch(Aig_ObjFanin1(pNode))? "_out":"") ); - fprintf( pFile, " [" ); - fprintf( pFile, "style = %s", Aig_ObjFaninC1(pNode)? "dotted" : "bold" ); -// if ( Aig_NtkIsSeq(pNode->pMan) && Seq_ObjFaninL1(pNode) > 0 ) -// fprintf( pFile, ", label = \"%s\"", Seq_ObjFaninGetInitPrintable(pNode,1) ); - fprintf( pFile, "]" ); - fprintf( pFile, ";\n" ); -/* - // generate the edges between the equivalent nodes - if ( fHaig && pNode->pEquiv && Aig_ObjRefs(pNode) > 0 ) - { - pPrev = pNode; - for ( pTemp = pNode->pEquiv; pTemp != pNode; pTemp = Aig_Regular(pTemp->pEquiv) ) - { - fprintf( pFile, "Node%d", pPrev->Id ); - fprintf( pFile, " -> " ); - fprintf( pFile, "Node%d", pTemp->Id ); - fprintf( pFile, " [style = %s]", Aig_IsComplement(pTemp->pEquiv)? "dotted" : "bold" ); - fprintf( pFile, ";\n" ); - pPrev = pTemp; - } - // connect the last node with the first - fprintf( pFile, "Node%d", pPrev->Id ); - fprintf( pFile, " -> " ); - fprintf( pFile, "Node%d", pNode->Id ); - fprintf( pFile, " [style = %s]", Aig_IsComplement(pPrev->pEquiv)? "dotted" : "bold" ); - fprintf( pFile, ";\n" ); - } -*/ - } - - fprintf( pFile, "}" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - fclose( pFile ); - - // unmark nodes - if ( vBold ) - Vec_PtrForEachEntry( vBold, pNode, i ) - pNode->fMarkB = 0; - - Aig_ManForEachPo( pMan, pNode, i ) - pNode->Level = Aig_ObjFanin0(pNode)->Level; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManShow( Aig_Man_t * pMan, int fHaig, Vec_Ptr_t * vBold ) -{ - extern void Abc_ShowFile( char * FileNameDot ); - static int Counter = 0; - char FileNameDot[200]; - FILE * pFile; - // create the file name -// Aig_ShowGetFileName( pMan->pName, FileNameDot ); - sprintf( FileNameDot, "temp%02d.dot", Counter++ ); - // check that the file can be opened - if ( (pFile = fopen( FileNameDot, "w" )) == NULL ) - { - fprintf( stdout, "Cannot open the intermediate file \"%s\".\n", FileNameDot ); - return; - } - fclose( pFile ); - // generate the file - Aig_WriteDotAig( pMan, FileNameDot, fHaig, vBold ); - // visualize the file - Abc_ShowFile( FileNameDot ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigTable.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigTable.c deleted file mode 100644 index a13ae0513..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigTable.c +++ /dev/null @@ -1,268 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigTable.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Structural hashing table.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigTable.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -// hashing the node -static unsigned long Aig_Hash( Aig_Obj_t * pObj, int TableSize ) -{ - unsigned long Key = Aig_ObjIsExor(pObj) * 1699; - Key ^= Aig_ObjFanin0(pObj)->Id * 7937; - Key ^= Aig_ObjFanin1(pObj)->Id * 2971; - Key ^= Aig_ObjFaninC0(pObj) * 911; - Key ^= Aig_ObjFaninC1(pObj) * 353; - return Key % TableSize; -} - -// returns the place where this node is stored (or should be stored) -static Aig_Obj_t ** Aig_TableFind( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_Obj_t ** ppEntry; - if ( Aig_ObjIsLatch(pObj) ) - { - assert( Aig_ObjChild0(pObj) && Aig_ObjChild1(pObj) == NULL ); - } - else - { - assert( Aig_ObjChild0(pObj) && Aig_ObjChild1(pObj) ); - assert( Aig_ObjFanin0(pObj)->Id < Aig_ObjFanin1(pObj)->Id ); - } - for ( ppEntry = p->pTable + Aig_Hash(pObj, p->nTableSize); *ppEntry; ppEntry = &(*ppEntry)->pNext ) - if ( *ppEntry == pObj ) - return ppEntry; - assert( *ppEntry == NULL ); - return ppEntry; -} - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Resizes the table.] - - Description [Typically this procedure should not be called.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TableResize( Aig_Man_t * p ) -{ - Aig_Obj_t * pEntry, * pNext; - Aig_Obj_t ** pTableOld, ** ppPlace; - int nTableSizeOld, Counter, i, clk; -clk = clock(); - // save the old table - pTableOld = p->pTable; - nTableSizeOld = p->nTableSize; - // get the new table - p->nTableSize = Aig_PrimeCudd( 2 * Aig_ManNodeNum(p) ); - p->pTable = ALLOC( Aig_Obj_t *, p->nTableSize ); - memset( p->pTable, 0, sizeof(Aig_Obj_t *) * p->nTableSize ); - // rehash the entries from the old table - Counter = 0; - for ( i = 0; i < nTableSizeOld; i++ ) - for ( pEntry = pTableOld[i], pNext = pEntry? pEntry->pNext : NULL; - pEntry; pEntry = pNext, pNext = pEntry? pEntry->pNext : NULL ) - { - // get the place where this entry goes in the table - ppPlace = Aig_TableFind( p, pEntry ); - assert( *ppPlace == NULL ); // should not be there - // add the entry to the list - *ppPlace = pEntry; - pEntry->pNext = NULL; - Counter++; - } - assert( Counter == Aig_ManNodeNum(p) ); -// printf( "Increasing the structural table size from %6d to %6d. ", nTableSizeOld, p->nTableSize ); -// PRT( "Time", clock() - clk ); - // replace the table and the parameters - free( pTableOld ); -} - -/**Function************************************************************* - - Synopsis [Checks if node with the given attributes is in the hash table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_TableLookup( Aig_Man_t * p, Aig_Obj_t * pGhost ) -{ - Aig_Obj_t * pEntry; - assert( !Aig_IsComplement(pGhost) ); - if ( pGhost->Type == AIG_OBJ_LATCH ) - { - assert( Aig_ObjChild0(pGhost) && Aig_ObjChild1(pGhost) == NULL ); - if ( !Aig_ObjRefs(Aig_ObjFanin0(pGhost)) ) - return NULL; - } - else - { - assert( pGhost->Type == AIG_OBJ_AND ); - assert( Aig_ObjChild0(pGhost) && Aig_ObjChild1(pGhost) ); - assert( Aig_ObjFanin0(pGhost)->Id < Aig_ObjFanin1(pGhost)->Id ); - if ( !Aig_ObjRefs(Aig_ObjFanin0(pGhost)) || !Aig_ObjRefs(Aig_ObjFanin1(pGhost)) ) - return NULL; - } - for ( pEntry = p->pTable[Aig_Hash(pGhost, p->nTableSize)]; pEntry; pEntry = pEntry->pNext ) - { - if ( Aig_ObjChild0(pEntry) == Aig_ObjChild0(pGhost) && - Aig_ObjChild1(pEntry) == Aig_ObjChild1(pGhost) && - Aig_ObjType(pEntry) == Aig_ObjType(pGhost) ) - return pEntry; - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [Checks if node with the given attributes is in the hash table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_TableLookupTwo( Aig_Man_t * p, Aig_Obj_t * pFanin0, Aig_Obj_t * pFanin1 ) -{ - Aig_Obj_t * pGhost; - // consider simple cases - if ( pFanin0 == pFanin1 ) - return pFanin0; - if ( pFanin0 == Aig_Not(pFanin1) ) - return Aig_ManConst0(p); - if ( Aig_Regular(pFanin0) == Aig_ManConst1(p) ) - return pFanin0 == Aig_ManConst1(p) ? pFanin1 : Aig_ManConst0(p); - if ( Aig_Regular(pFanin1) == Aig_ManConst1(p) ) - return pFanin1 == Aig_ManConst1(p) ? pFanin0 : Aig_ManConst0(p); - pGhost = Aig_ObjCreateGhost( p, pFanin0, pFanin1, AIG_OBJ_AND ); - return Aig_TableLookup( p, pGhost ); -} - -/**Function************************************************************* - - Synopsis [Adds the new node to the hash table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TableInsert( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_Obj_t ** ppPlace; - assert( !Aig_IsComplement(pObj) ); - assert( Aig_TableLookup(p, pObj) == NULL ); - if ( (pObj->Id & 0xFF) == 0 && 2 * p->nTableSize < Aig_ManNodeNum(p) ) - Aig_TableResize( p ); - ppPlace = Aig_TableFind( p, pObj ); - assert( *ppPlace == NULL ); - *ppPlace = pObj; -} - -/**Function************************************************************* - - Synopsis [Deletes the node from the hash table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TableDelete( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_Obj_t ** ppPlace; - assert( !Aig_IsComplement(pObj) ); - ppPlace = Aig_TableFind( p, pObj ); - assert( *ppPlace == pObj ); // node should be in the table - // remove the node - *ppPlace = pObj->pNext; - pObj->pNext = NULL; -} - -/**Function************************************************************* - - Synopsis [Count the number of nodes in the table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_TableCountEntries( Aig_Man_t * p ) -{ - Aig_Obj_t * pEntry; - int i, Counter = 0; - for ( i = 0; i < p->nTableSize; i++ ) - for ( pEntry = p->pTable[i]; pEntry; pEntry = pEntry->pNext ) - Counter++; - return Counter; -} - -/**Function******************************************************************** - - Synopsis [Profiles the hash table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -******************************************************************************/ -void Aig_TableProfile( Aig_Man_t * p ) -{ - Aig_Obj_t * pEntry; - int i, Counter; - for ( i = 0; i < p->nTableSize; i++ ) - { - Counter = 0; - for ( pEntry = p->pTable[i]; pEntry; pEntry = pEntry->pNext ) - Counter++; - if ( Counter ) - printf( "%d ", Counter ); - } -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigTime.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigTime.c deleted file mode 100644 index 786ced378..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigTime.c +++ /dev/null @@ -1,299 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigTime.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Representation of timing information.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigTime.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Aig_TBox_t_ Aig_TBox_t; -typedef struct Aig_TObj_t_ Aig_TObj_t; - -// timing manager -struct Aig_TMan_t_ -{ - Vec_Ptr_t * vBoxes; // the timing boxes - Aig_MmFlex_t * pMemObj; // memory manager for boxes - int nTravIds; // traversal ID of the manager - int nPis; // the number of PIs - int nPos; // the number of POs - Aig_TObj_t * pPis; // timing info for the PIs - Aig_TObj_t * pPos; // timing info for the POs -}; - -// timing box -struct Aig_TBox_t_ -{ - int iBox; // the unique ID of this box - int TravId; // traversal ID of this box - int nInputs; // the number of box inputs - int nOutputs; // the number of box outputs - int Inouts[0]; // the int numbers of PIs and POs -}; - -// timing object -struct Aig_TObj_t_ -{ - int iObj2Box; // mapping of the object into its box - float timeOffset; // the static timing of the node - float timeActual; // the actual timing of the node -}; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Starts the network manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_TMan_t * Aig_TManStart( int nPis, int nPos ) -{ - Aig_TMan_t * p; - int i; - p = ALLOC( Aig_TMan_t, 1 ); - memset( p, 0, sizeof(Aig_TMan_t) ); - p->pMemObj = Aig_MmFlexStart(); - p->vBoxes = Vec_PtrAlloc( 100 ); - Vec_PtrPush( p->vBoxes, NULL ); - p->nPis = nPis; - p->nPos = nPos; - p->pPis = ALLOC( Aig_TObj_t, nPis ); - memset( p->pPis, 0, sizeof(Aig_TObj_t) * nPis ); - p->pPos = ALLOC( Aig_TObj_t, nPos ); - memset( p->pPos, 0, sizeof(Aig_TObj_t) * nPos ); - for ( i = 0; i < nPis; i++ ) - p->pPis[i].iObj2Box = -1; - for ( i = 0; i < nPos; i++ ) - p->pPos[i].iObj2Box = -1; - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the network manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TManStop( Aig_TMan_t * p ) -{ - Vec_PtrFree( p->vBoxes ); - Aig_MmFlexStop( p->pMemObj, 0 ); - free( p->pPis ); - free( p->pPos ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Creates the new timing box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TManCreateBox( Aig_TMan_t * p, int * pPis, int nPis, int * pPos, int nPos, float * pPiTimes, float * pPoTimes ) -{ - Aig_TBox_t * pBox; - int i; - pBox = (Aig_TBox_t *)Aig_MmFlexEntryFetch( p->pMemObj, sizeof(Aig_TBox_t) + sizeof(int) * (nPis+nPos) ); - memset( pBox, 0, sizeof(Aig_TBox_t) ); - pBox->iBox = Vec_PtrSize( p->vBoxes ); - Vec_PtrPush( p->vBoxes, pBox ); - pBox->nInputs = nPis; - pBox->nOutputs = nPos; - for ( i = 0; i < nPis; i++ ) - { - assert( pPis[i] < p->nPis ); - pBox->Inouts[i] = pPis[i]; - Aig_TManSetPiArrival( p, pPis[i], pPiTimes[i] ); - p->pPis[pPis[i]].iObj2Box = pBox->iBox; - } - for ( i = 0; i < nPos; i++ ) - { - assert( pPos[i] < p->nPos ); - pBox->Inouts[nPis+i] = pPos[i]; - Aig_TManSetPoRequired( p, pPos[i], pPoTimes[i] ); - p->pPos[pPos[i]].iObj2Box = pBox->iBox; - } -} - -/**Function************************************************************* - - Synopsis [Creates the new timing box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TManSetPiDelay( Aig_TMan_t * p, int iPi, float Delay ) -{ - assert( iPi < p->nPis ); - p->pPis[iPi].timeActual = Delay; -} - -/**Function************************************************************* - - Synopsis [Creates the new timing box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TManSetPoDelay( Aig_TMan_t * p, int iPo, float Delay ) -{ - assert( iPo < p->nPos ); - p->pPos[iPo].timeActual = Delay; -} - -/**Function************************************************************* - - Synopsis [Creates the new timing box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TManSetPiArrival( Aig_TMan_t * p, int iPi, float Delay ) -{ - assert( iPi < p->nPis ); - p->pPis[iPi].timeOffset = Delay; -} - -/**Function************************************************************* - - Synopsis [Creates the new timing box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TManSetPoRequired( Aig_TMan_t * p, int iPo, float Delay ) -{ - assert( iPo < p->nPos ); - p->pPos[iPo].timeOffset = Delay; -} - -/**Function************************************************************* - - Synopsis [Increments the trav ID of the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TManIncrementTravId( Aig_TMan_t * p ) -{ - p->nTravIds++; -} - -/**Function************************************************************* - - Synopsis [Returns PI arrival time.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -float Aig_TManGetPiArrival( Aig_TMan_t * p, int iPi ) -{ - Aig_TBox_t * pBox; - Aig_TObj_t * pObj; - float DelayMax; - int i; - assert( iPi < p->nPis ); - if ( p->pPis[iPi].iObj2Box < 0 ) - return p->pPis[iPi].timeOffset; - pBox = Vec_PtrEntry( p->vBoxes, p->pPis[iPi].iObj2Box ); - // check if box timing is updated - if ( pBox->TravId == p->nTravIds ) - return p->pPis[iPi].timeOffset; - pBox->TravId = p->nTravIds; - // update box timing - DelayMax = -1.0e+20F; - for ( i = 0; i < pBox->nOutputs; i++ ) - { - pObj = p->pPos + pBox->Inouts[pBox->nInputs+i]; - DelayMax = AIG_MAX( DelayMax, pObj->timeActual + pObj->timeOffset ); - } - for ( i = 0; i < pBox->nInputs; i++ ) - { - pObj = p->pPis + pBox->Inouts[i]; - pObj->timeActual = DelayMax + pObj->timeOffset; - } - return p->pPis[iPi].timeActual; -} - -/**Function************************************************************* - - Synopsis [Returns PO required time.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -float Aig_TManGetPoRequired( Aig_TMan_t * p, int iPo ) -{ - return 0.0; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigTiming.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigTiming.c deleted file mode 100644 index df8bd2f46..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigTiming.c +++ /dev/null @@ -1,351 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigTiming.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Incremental updating of direct/reverse AIG levels.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigTiming.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Returns the reverse level of the node.] - - Description [The reverse level is the level of the node in reverse - topological order, starting from the COs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Aig_ObjReverseLevel( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - assert( p->vLevelR ); - Vec_IntFillExtra( p->vLevelR, pObj->Id + 1, 0 ); - return Vec_IntEntry(p->vLevelR, pObj->Id); -} - -/**Function************************************************************* - - Synopsis [Sets the reverse level of the node.] - - Description [The reverse level is the level of the node in reverse - topological order, starting from the COs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Aig_ObjSetReverseLevel( Aig_Man_t * p, Aig_Obj_t * pObj, int LevelR ) -{ - assert( p->vLevelR ); - Vec_IntFillExtra( p->vLevelR, pObj->Id + 1, 0 ); - Vec_IntWriteEntry( p->vLevelR, pObj->Id, LevelR ); -} - -/**Function************************************************************* - - Synopsis [Resets reverse level of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjClearReverseLevel( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_ObjSetReverseLevel( p, pObj, 0 ); -} - -/**Function************************************************************* - - Synopsis [Returns required level of the node.] - - Description [Converts the reverse levels of the node into its required - level as follows: ReqLevel(Node) = MaxLevels(Ntk) + 1 - LevelR(Node).] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjRequiredLevel( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - assert( p->vLevelR ); - return p->nLevelMax + 1 - Aig_ObjReverseLevel(p, pObj); -} - -/**Function************************************************************* - - Synopsis [Computes the reverse level of the node using its fanout levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjReverseLevelNew( Aig_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_Obj_t * pFanout; - int i, iFanout = -1, LevelCur, Level = 0; - Aig_ObjForEachFanout( p, pObj, pFanout, iFanout, i ) - { - LevelCur = Aig_ObjReverseLevel( p, pFanout ); - Level = AIG_MAX( Level, LevelCur ); - } - return Level + 1; -} - -/**Function************************************************************* - - Synopsis [Prepares for the computation of required levels.] - - Description [This procedure should be called before the required times - are used. It starts internal data structures, which records the level - from the COs of the network nodes in reverse topologogical order.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManStartReverseLevels( Aig_Man_t * p, int nMaxLevelIncrease ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i; - assert( p->pFanData != NULL ); - assert( p->vLevelR == NULL ); - // remember the maximum number of direct levels - p->nLevelMax = Aig_ManLevels(p) + nMaxLevelIncrease; - // start the reverse levels - p->vLevelR = Vec_IntAlloc( 0 ); - Vec_IntFill( p->vLevelR, Aig_ManObjNumMax(p), 0 ); - // compute levels in reverse topological order - vNodes = Aig_ManDfsReverse( p ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - assert( pObj->fMarkA == 0 ); - Aig_ObjSetReverseLevel( p, pObj, Aig_ObjReverseLevelNew(p, pObj) ); - } - Vec_PtrFree( vNodes ); -} - -/**Function************************************************************* - - Synopsis [Cleans the data structures used to compute required levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManStopReverseLevels( Aig_Man_t * p ) -{ - assert( p->vLevelR != NULL ); - Vec_IntFree( p->vLevelR ); - p->vLevelR = NULL; - p->nLevelMax = 0; - -} - -/**Function************************************************************* - - Synopsis [Incrementally updates level of the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManUpdateLevel( Aig_Man_t * p, Aig_Obj_t * pObjNew ) -{ - Aig_Obj_t * pFanout, * pTemp; - int iFanout = -1, LevelOld, Lev, k, m; - assert( p->pFanData != NULL ); - assert( Aig_ObjIsNode(pObjNew) ); - // allocate level if needed - if ( p->vLevels == NULL ) - p->vLevels = Vec_VecAlloc( Aig_ManLevels(p) + 8 ); - // check if level has changed - LevelOld = Aig_ObjLevel(pObjNew); - if ( LevelOld == Aig_ObjLevelNew(pObjNew) ) - return; - // start the data structure for level update - // we cannot fail to visit a node when using this structure because the - // nodes are stored by their _old_ levels, which are assumed to be correct - Vec_VecClear( p->vLevels ); - Vec_VecPush( p->vLevels, LevelOld, pObjNew ); - pObjNew->fMarkA = 1; - // recursively update level - Vec_VecForEachEntryStart( p->vLevels, pTemp, Lev, k, LevelOld ) - { - pTemp->fMarkA = 0; - assert( Aig_ObjLevel(pTemp) == Lev ); - pTemp->Level = Aig_ObjLevelNew(pTemp); - // if the level did not change, no need to check the fanout levels - if ( Aig_ObjLevel(pTemp) == Lev ) - continue; - // schedule fanout for level update - Aig_ObjForEachFanout( p, pTemp, pFanout, iFanout, m ) - { - if ( Aig_ObjIsNode(pFanout) && !pFanout->fMarkA ) - { - assert( Aig_ObjLevel(pFanout) >= Lev ); - Vec_VecPush( p->vLevels, Aig_ObjLevel(pFanout), pFanout ); - pFanout->fMarkA = 1; - } - } - } -} - -/**Function************************************************************* - - Synopsis [Incrementally updates level of the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManUpdateReverseLevel( Aig_Man_t * p, Aig_Obj_t * pObjNew ) -{ - Aig_Obj_t * pFanin, * pTemp; - int LevelOld, LevFanin, Lev, k; - assert( p->vLevelR != NULL ); - assert( Aig_ObjIsNode(pObjNew) ); - // allocate level if needed - if ( p->vLevels == NULL ) - p->vLevels = Vec_VecAlloc( Aig_ManLevels(p) + 8 ); - // check if level has changed - LevelOld = Aig_ObjReverseLevel(p, pObjNew); - if ( LevelOld == Aig_ObjReverseLevelNew(p, pObjNew) ) - return; - // start the data structure for level update - // we cannot fail to visit a node when using this structure because the - // nodes are stored by their _old_ levels, which are assumed to be correct - Vec_VecClear( p->vLevels ); - Vec_VecPush( p->vLevels, LevelOld, pObjNew ); - pObjNew->fMarkA = 1; - // recursively update level - Vec_VecForEachEntryStart( p->vLevels, pTemp, Lev, k, LevelOld ) - { - pTemp->fMarkA = 0; - LevelOld = Aig_ObjReverseLevel(p, pTemp); - assert( LevelOld == Lev ); - Aig_ObjSetReverseLevel( p, pTemp, Aig_ObjReverseLevelNew(p, pTemp) ); - // if the level did not change, to need to check the fanout levels - if ( Aig_ObjReverseLevel(p, pTemp) == Lev ) - continue; - // schedule fanins for level update - pFanin = Aig_ObjFanin0(pTemp); - if ( Aig_ObjIsNode(pFanin) && !pFanin->fMarkA ) - { - LevFanin = Aig_ObjReverseLevel( p, pFanin ); - assert( LevFanin >= Lev ); - Vec_VecPush( p->vLevels, LevFanin, pFanin ); - pFanin->fMarkA = 1; - } - pFanin = Aig_ObjFanin1(pTemp); - if ( Aig_ObjIsNode(pFanin) && !pFanin->fMarkA ) - { - LevFanin = Aig_ObjReverseLevel( p, pFanin ); - assert( LevFanin >= Lev ); - Vec_VecPush( p->vLevels, LevFanin, pFanin ); - pFanin->fMarkA = 1; - } - } -} - -/**Function************************************************************* - - Synopsis [Verifies direct level of the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManVerifyLevel( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i, Counter = 0; - assert( p->pFanData ); - Aig_ManForEachNode( p, pObj, i ) - if ( Aig_ObjLevel(pObj) != Aig_ObjLevelNew(pObj) ) - { - printf( "Level of node %6d should be %4d instead of %4d.\n", - pObj->Id, Aig_ObjLevelNew(pObj), Aig_ObjLevel(pObj) ); - Counter++; - } - if ( Counter ) - printf( "Levels of %d nodes are incorrect.\n", Counter ); -} - -/**Function************************************************************* - - Synopsis [Verifies reverse level of the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManVerifyReverseLevel( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i, Counter = 0; - assert( p->vLevelR ); - Aig_ManForEachNode( p, pObj, i ) - if ( Aig_ObjLevel(pObj) != Aig_ObjLevelNew(pObj) ) - { - printf( "Reverse level of node %6d should be %4d instead of %4d.\n", - pObj->Id, Aig_ObjReverseLevelNew(p, pObj), Aig_ObjReverseLevel(p, pObj) ); - Counter++; - } - if ( Counter ) - printf( "Reverse levels of %d nodes are incorrect.\n", Counter ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigTruth.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigTruth.c deleted file mode 100644 index 74a030b79..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigTruth.c +++ /dev/null @@ -1,98 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigTruth.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Computes truth table for the cut.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigTruth.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Computes truth table of the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Aig_ManCutTruthOne( Aig_Obj_t * pNode, unsigned * pTruth, int nWords ) -{ - unsigned * pTruth0, * pTruth1; - int i; - pTruth0 = Aig_ObjFanin0(pNode)->pData; - pTruth1 = Aig_ObjFanin1(pNode)->pData; - if ( Aig_ObjIsExor(pNode) ) - for ( i = 0; i < nWords; i++ ) - pTruth[i] = pTruth0[i] ^ pTruth1[i]; - else if ( !Aig_ObjFaninC0(pNode) && !Aig_ObjFaninC1(pNode) ) - for ( i = 0; i < nWords; i++ ) - pTruth[i] = pTruth0[i] & pTruth1[i]; - else if ( !Aig_ObjFaninC0(pNode) && Aig_ObjFaninC1(pNode) ) - for ( i = 0; i < nWords; i++ ) - pTruth[i] = pTruth0[i] & ~pTruth1[i]; - else if ( Aig_ObjFaninC0(pNode) && !Aig_ObjFaninC1(pNode) ) - for ( i = 0; i < nWords; i++ ) - pTruth[i] = ~pTruth0[i] & pTruth1[i]; - else // if ( Aig_ObjFaninC0(pNode) && Aig_ObjFaninC1(pNode) ) - for ( i = 0; i < nWords; i++ ) - pTruth[i] = ~pTruth0[i] & ~pTruth1[i]; - return pTruth; -} - -/**Function************************************************************* - - Synopsis [Computes truth table of the cut.] - - Description [The returned pointer should be used immediately.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Aig_ManCutTruth( Aig_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vNodes, Vec_Ptr_t * vTruthElem, Vec_Ptr_t * vTruthStore ) -{ - Aig_Obj_t * pObj; - int i, nWords; - assert( Vec_PtrSize(vLeaves) <= Vec_PtrSize(vTruthElem) ); - assert( Vec_PtrSize(vNodes) <= Vec_PtrSize(vTruthStore) ); - assert( Vec_PtrSize(vNodes) == 0 || pRoot == Vec_PtrEntryLast(vNodes) ); - // assign elementary truth tables - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->pData = Vec_PtrEntry( vTruthElem, i ); - // compute truths for other nodes - nWords = Aig_TruthWordNum( Vec_PtrSize(vLeaves) ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pData = Aig_ManCutTruthOne( pObj, Vec_PtrEntry(vTruthStore, i), nWords ); - return pRoot->pData; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigTsim.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigTsim.c deleted file mode 100644 index 79d295cde..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigTsim.c +++ /dev/null @@ -1,436 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigTsim.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Ternary simulation.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigTsim.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#define TSI_MAX_ROUNDS 1000 - -#define AIG_XVS0 1 -#define AIG_XVS1 2 -#define AIG_XVSX 3 - -static inline void Aig_ObjSetXsim( Aig_Obj_t * pObj, int Value ) { pObj->nCuts = Value; } -static inline int Aig_ObjGetXsim( Aig_Obj_t * pObj ) { return pObj->nCuts; } -static inline int Aig_XsimInv( int Value ) -{ - if ( Value == AIG_XVS0 ) - return AIG_XVS1; - if ( Value == AIG_XVS1 ) - return AIG_XVS0; - assert( Value == AIG_XVSX ); - return AIG_XVSX; -} -static inline int Aig_XsimAnd( int Value0, int Value1 ) -{ - if ( Value0 == AIG_XVS0 || Value1 == AIG_XVS0 ) - return AIG_XVS0; - if ( Value0 == AIG_XVSX || Value1 == AIG_XVSX ) - return AIG_XVSX; - assert( Value0 == AIG_XVS1 && Value1 == AIG_XVS1 ); - return AIG_XVS1; -} -static inline int Aig_XsimRand2() -{ - return (rand() & 1) ? AIG_XVS1 : AIG_XVS0; -} -static inline int Aig_XsimRand3() -{ - int RetValue; - do { - RetValue = rand() & 3; - } while ( RetValue == 0 ); - return RetValue; -} -static inline int Aig_ObjGetXsimFanin0( Aig_Obj_t * pObj ) -{ - int RetValue; - RetValue = Aig_ObjGetXsim(Aig_ObjFanin0(pObj)); - return Aig_ObjFaninC0(pObj)? Aig_XsimInv(RetValue) : RetValue; -} -static inline int Aig_ObjGetXsimFanin1( Aig_Obj_t * pObj ) -{ - int RetValue; - RetValue = Aig_ObjGetXsim(Aig_ObjFanin1(pObj)); - return Aig_ObjFaninC1(pObj)? Aig_XsimInv(RetValue) : RetValue; -} -static inline void Aig_XsimPrint( FILE * pFile, int Value ) -{ - if ( Value == AIG_XVS0 ) - { - fprintf( pFile, "0" ); - return; - } - if ( Value == AIG_XVS1 ) - { - fprintf( pFile, "1" ); - return; - } - assert( Value == AIG_XVSX ); - fprintf( pFile, "x" ); -} - -// simulation manager -typedef struct Aig_Tsi_t_ Aig_Tsi_t; -struct Aig_Tsi_t_ -{ - Aig_Man_t * pAig; // the original AIG manager - // ternary state representation - int nWords; // the number of words in the states - Vec_Ptr_t * vStates; // the collection of ternary states - Aig_MmFixed_t * pMem; // memory for ternary states - // hash table for terminary states - unsigned ** pBins; - int nBins; -}; - -static inline unsigned * Aig_TsiNext( unsigned * pState, int nWords ) { return *((unsigned **)(pState + nWords)); } -static inline void Aig_TsiSetNext( unsigned * pState, int nWords, unsigned * pNext ) { *((unsigned **)(pState + nWords)) = pNext; } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates simulation manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Tsi_t * Aig_TsiStart( Aig_Man_t * pAig ) -{ - Aig_Tsi_t * p; - p = (Aig_Tsi_t *)malloc( sizeof(Aig_Tsi_t) ); - memset( p, 0, sizeof(Aig_Tsi_t) ); - p->pAig = pAig; - p->nWords = Aig_BitWordNum( 2*Aig_ManRegNum(pAig) ); - p->vStates = Vec_PtrAlloc( 1000 ); - p->pMem = Aig_MmFixedStart( sizeof(unsigned) * p->nWords + sizeof(unsigned *), 10000 ); - p->nBins = Aig_PrimeCudd(TSI_MAX_ROUNDS/2); - p->pBins = ALLOC( unsigned *, p->nBins ); - memset( p->pBins, 0, sizeof(unsigned *) * p->nBins ); - return p; -} - -/**Function************************************************************* - - Synopsis [Deallocates simulation manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TsiStop( Aig_Tsi_t * p ) -{ - Aig_MmFixedStop( p->pMem, 0 ); - Vec_PtrFree( p->vStates ); - free( p->pBins ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Computes hash value of the node using its simulation info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_TsiStateHash( unsigned * pState, int nWords, int nTableSize ) -{ - static int s_FPrimes[128] = { - 1009, 1049, 1093, 1151, 1201, 1249, 1297, 1361, 1427, 1459, - 1499, 1559, 1607, 1657, 1709, 1759, 1823, 1877, 1933, 1997, - 2039, 2089, 2141, 2213, 2269, 2311, 2371, 2411, 2467, 2543, - 2609, 2663, 2699, 2741, 2797, 2851, 2909, 2969, 3037, 3089, - 3169, 3221, 3299, 3331, 3389, 3461, 3517, 3557, 3613, 3671, - 3719, 3779, 3847, 3907, 3943, 4013, 4073, 4129, 4201, 4243, - 4289, 4363, 4441, 4493, 4549, 4621, 4663, 4729, 4793, 4871, - 4933, 4973, 5021, 5087, 5153, 5227, 5281, 5351, 5417, 5471, - 5519, 5573, 5651, 5693, 5749, 5821, 5861, 5923, 6011, 6073, - 6131, 6199, 6257, 6301, 6353, 6397, 6481, 6563, 6619, 6689, - 6737, 6803, 6863, 6917, 6977, 7027, 7109, 7187, 7237, 7309, - 7393, 7477, 7523, 7561, 7607, 7681, 7727, 7817, 7877, 7933, - 8011, 8039, 8059, 8081, 8093, 8111, 8123, 8147 - }; - unsigned uHash; - int i; - uHash = 0; - for ( i = 0; i < nWords; i++ ) - uHash ^= pState[i] * s_FPrimes[i & 0x7F]; - return uHash % nTableSize; -} - -/**Function************************************************************* - - Synopsis [Inserts value into the table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_TsiStateLookup( Aig_Tsi_t * p, unsigned * pState, int nWords ) -{ - unsigned * pEntry; - int Hash; - Hash = Aig_TsiStateHash( pState, nWords, p->nBins ); - for ( pEntry = p->pBins[Hash]; pEntry; pEntry = Aig_TsiNext(pEntry, nWords) ) - if ( !memcmp( pEntry, pState, sizeof(unsigned) * nWords ) ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Inserts value into the table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TsiStateInsert( Aig_Tsi_t * p, unsigned * pState, int nWords ) -{ - int Hash = Aig_TsiStateHash( pState, nWords, p->nBins ); - assert( !Aig_TsiStateLookup( p, pState, nWords ) ); - Aig_TsiSetNext( pState, nWords, p->pBins[Hash] ); - p->pBins[Hash] = pState; -} - -/**Function************************************************************* - - Synopsis [Inserts value into the table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Aig_TsiStateNew( Aig_Tsi_t * p ) -{ - unsigned * pState; - pState = (unsigned *)Aig_MmFixedEntryFetch( p->pMem ); - memset( pState, 0, sizeof(unsigned) * p->nWords ); - Vec_PtrPush( p->vStates, pState ); - return pState; -} - -/**Function************************************************************* - - Synopsis [Inserts value into the table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_TsiStatePrint( Aig_Tsi_t * p, unsigned * pState ) -{ - int i, Value, nZeros = 0, nOnes = 0, nDcs = 0; - for ( i = 0; i < Aig_ManRegNum(p->pAig); i++ ) - { - Value = (Aig_InfoHasBit( pState, 2 * i + 1 ) << 1) | Aig_InfoHasBit( pState, 2 * i ); - if ( Value == 1 ) - printf( "0" ), nZeros++; - else if ( Value == 2 ) - printf( "1" ), nOnes++; - else if ( Value == 3 ) - printf( "x" ), nDcs++; - else - assert( 0 ); - } - printf( " (0=%5d, 1=%5d, x=%5d)\n", nZeros, nOnes, nDcs ); -} - - -/**Function************************************************************* - - Synopsis [Cycles the circuit to create a new initial state.] - - Description [Simulates the circuit with random input for the given - number of timeframes to get a better initial state.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManTernarySimulate( Aig_Man_t * p, int fVerbose ) -{ - Aig_Tsi_t * pTsi; - Vec_Ptr_t * vMap; - Aig_Obj_t * pObj, * pObjLi, * pObjLo; - unsigned * pState, * pPrev; - int i, k, f, fConstants, Value, nCounter; - // allocate the simulation manager - pTsi = Aig_TsiStart( p ); - // initialize the values - Aig_ObjSetXsim( Aig_ManConst1(p), AIG_XVS1 ); - Aig_ManForEachPiSeq( p, pObj, i ) - Aig_ObjSetXsim( pObj, AIG_XVSX ); - Aig_ManForEachLoSeq( p, pObj, i ) - Aig_ObjSetXsim( pObj, AIG_XVS0 ); - // simulate for the given number of timeframes - for ( f = 0; f < TSI_MAX_ROUNDS; f++ ) - { - // collect this state - pState = Aig_TsiStateNew( pTsi ); - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - { - Value = Aig_ObjGetXsim(pObjLo); - if ( Value & 1 ) - Aig_InfoSetBit( pState, 2 * i ); - if ( Value & 2 ) - Aig_InfoSetBit( pState, 2 * i + 1 ); - } -// Aig_TsiStatePrint( pTsi, pState ); - // check if this state exists - if ( Aig_TsiStateLookup( pTsi, pState, pTsi->nWords ) ) - break; - // insert this state - Aig_TsiStateInsert( pTsi, pState, pTsi->nWords ); - // simulate internal nodes - Aig_ManForEachNode( p, pObj, i ) - Aig_ObjSetXsim( pObj, Aig_XsimAnd(Aig_ObjGetXsimFanin0(pObj), Aig_ObjGetXsimFanin1(pObj)) ); - // transfer the latch values - Aig_ManForEachLiSeq( p, pObj, i ) - Aig_ObjSetXsim( pObj, Aig_ObjGetXsimFanin0(pObj) ); - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - Aig_ObjSetXsim( pObjLo, Aig_ObjGetXsim(pObjLi) ); - } - if ( f == TSI_MAX_ROUNDS ) - { - printf( "Aig_ManTernarySimulate(): Did not reach a fixed point after %d iterations (not a bug).\n", TSI_MAX_ROUNDS ); - Aig_TsiStop( pTsi ); - return NULL; - } - // OR all the states - pState = Vec_PtrEntry( pTsi->vStates, 0 ); - Vec_PtrForEachEntry( pTsi->vStates, pPrev, i ) - { - for ( k = 0; k < pTsi->nWords; k++ ) - pState[k] |= pPrev[k]; - } - // check if there are constants - fConstants = 0; - if ( 2*Aig_ManRegNum(p) == 32*pTsi->nWords ) - { - for ( i = 0; i < pTsi->nWords; i++ ) - if ( pState[i] != ~0 ) - fConstants = 1; - } - else - { - for ( i = 0; i < pTsi->nWords - 1; i++ ) - if ( pState[i] != ~0 ) - fConstants = 1; - if ( pState[i] != Aig_InfoMask( 2*Aig_ManRegNum(p) - 32*(pTsi->nWords-1) ) ) - fConstants = 1; - } - if ( fConstants == 0 ) - { - Aig_TsiStop( pTsi ); - return NULL; - } - - // start mapping by adding the true PIs - vMap = Vec_PtrAlloc( Aig_ManPiNum(p) ); - Aig_ManForEachPiSeq( p, pObj, i ) - Vec_PtrPush( vMap, pObj ); - // find constant registers - nCounter = 0; - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - { - Value = (Aig_InfoHasBit( pState, 2 * i + 1 ) << 1) | Aig_InfoHasBit( pState, 2 * i ); - nCounter += (Value == 1 || Value == 2); - if ( Value == 1 ) - Vec_PtrPush( vMap, Aig_ManConst0(p) ); - else if ( Value == 2 ) - Vec_PtrPush( vMap, Aig_ManConst1(p) ); - else if ( Value == 3 ) - Vec_PtrPush( vMap, pObjLo ); - else - assert( 0 ); -// Aig_XsimPrint( stdout, Value ); - } -// printf( "\n" ); - Aig_TsiStop( pTsi ); - if ( fVerbose ) - printf( "Detected %d constants after %d iterations of ternary simulation.\n", nCounter, f ); - return vMap; -} - -/**Function************************************************************* - - Synopsis [Reduces the circuit using ternary simulation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Aig_ManConstReduce( Aig_Man_t * p, int fVerbose ) -{ - Aig_Man_t * pTemp; - Vec_Ptr_t * vMap; - while ( (vMap = Aig_ManTernarySimulate( p, fVerbose )) ) - { - if ( fVerbose ) - printf( "RBeg = %5d. NBeg = %6d. ", Aig_ManRegNum(p), Aig_ManNodeNum(p) ); - p = Aig_ManRemap( pTemp = p, vMap ); - Aig_ManStop( pTemp ); - Vec_PtrFree( vMap ); - Aig_ManSeqCleanup( p ); - if ( fVerbose ) - printf( "REnd = %5d. NEnd = %6d. \n", Aig_ManRegNum(p), Aig_ManNodeNum(p) ); - } - return p; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigUtil.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigUtil.c deleted file mode 100644 index 15b4459ba..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigUtil.c +++ /dev/null @@ -1,851 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigUtil.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Various procedures.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigUtil.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function******************************************************************** - - Synopsis [Returns the next prime >= p.] - - Description [Copied from CUDD, for stand-aloneness.] - - SideEffects [None] - - SeeAlso [] - -******************************************************************************/ -unsigned int Aig_PrimeCudd( unsigned int p ) -{ - int i,pn; - - p--; - do { - p++; - if (p&1) { - pn = 1; - i = 3; - while ((unsigned) (i * i) <= p) { - if (p % i == 0) { - pn = 0; - break; - } - i += 2; - } - } else { - pn = 0; - } - } while (!pn); - return(p); - -} /* end of Cudd_Prime */ - -/**Function************************************************************* - - Synopsis [Increments the current traversal ID of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManIncrementTravId( Aig_Man_t * p ) -{ - if ( p->nTravIds >= (1<<30)-1 ) - Aig_ManCleanData( p ); - p->nTravIds++; -} - -/**Function************************************************************* - - Synopsis [Collect the latches.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManLevels( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i, LevelMax = 0; - Aig_ManForEachPo( p, pObj, i ) - LevelMax = AIG_MAX( LevelMax, (int)Aig_ObjFanin0(pObj)->Level ); - return LevelMax; -} - -/**Function************************************************************* - - Synopsis [Reset reference counters.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManResetRefs( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManForEachObj( p, pObj, i ) - pObj->nRefs = 0; - Aig_ManForEachObj( p, pObj, i ) - { - if ( Aig_ObjFanin0(pObj) ) - Aig_ObjFanin0(pObj)->nRefs++; - if ( Aig_ObjFanin1(pObj) ) - Aig_ObjFanin1(pObj)->nRefs++; - } -} - -/**Function************************************************************* - - Synopsis [Cleans MarkB.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManCleanMarkA( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManForEachObj( p, pObj, i ) - pObj->fMarkA = 0; -} - -/**Function************************************************************* - - Synopsis [Cleans MarkB.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManCleanMarkB( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManForEachObj( p, pObj, i ) - pObj->fMarkB = 0; -} - -/**Function************************************************************* - - Synopsis [Cleans the data pointers for the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManCleanData( Aig_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManForEachObj( p, pObj, i ) - pObj->pData = NULL; -} - -/**Function************************************************************* - - Synopsis [Recursively cleans the data pointers in the cone of the node.] - - Description [Applicable to small AIGs only because no caching is performed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjCleanData_rec( Aig_Obj_t * pObj ) -{ - assert( !Aig_IsComplement(pObj) ); - assert( !Aig_ObjIsPo(pObj) ); - if ( Aig_ObjIsAnd(pObj) ) - { - Aig_ObjCleanData_rec( Aig_ObjFanin0(pObj) ); - Aig_ObjCleanData_rec( Aig_ObjFanin1(pObj) ); - } - pObj->pData = NULL; -} - - -/**Function************************************************************* - - Synopsis [Detects multi-input gate rooted at this node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjCollectMulti_rec( Aig_Obj_t * pRoot, Aig_Obj_t * pObj, Vec_Ptr_t * vSuper ) -{ - if ( pRoot != pObj && (Aig_IsComplement(pObj) || Aig_ObjIsPi(pObj) || Aig_ObjType(pRoot) != Aig_ObjType(pObj)) ) - { - Vec_PtrPushUnique(vSuper, pObj); - return; - } - Aig_ObjCollectMulti_rec( pRoot, Aig_ObjChild0(pObj), vSuper ); - Aig_ObjCollectMulti_rec( pRoot, Aig_ObjChild1(pObj), vSuper ); -} - -/**Function************************************************************* - - Synopsis [Detects multi-input gate rooted at this node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjCollectMulti( Aig_Obj_t * pRoot, Vec_Ptr_t * vSuper ) -{ - assert( !Aig_IsComplement(pRoot) ); - Vec_PtrClear( vSuper ); - Aig_ObjCollectMulti_rec( pRoot, pRoot, vSuper ); -} - -/**Function************************************************************* - - Synopsis [Returns 1 if the node is the root of MUX or EXOR/NEXOR.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjIsMuxType( Aig_Obj_t * pNode ) -{ - Aig_Obj_t * pNode0, * pNode1; - // check that the node is regular - assert( !Aig_IsComplement(pNode) ); - // if the node is not AND, this is not MUX - if ( !Aig_ObjIsAnd(pNode) ) - return 0; - // if the children are not complemented, this is not MUX - if ( !Aig_ObjFaninC0(pNode) || !Aig_ObjFaninC1(pNode) ) - return 0; - // get children - pNode0 = Aig_ObjFanin0(pNode); - pNode1 = Aig_ObjFanin1(pNode); - // if the children are not ANDs, this is not MUX - if ( !Aig_ObjIsAnd(pNode0) || !Aig_ObjIsAnd(pNode1) ) - return 0; - // otherwise the node is MUX iff it has a pair of equal grandchildren - return (Aig_ObjFanin0(pNode0) == Aig_ObjFanin0(pNode1) && (Aig_ObjFaninC0(pNode0) ^ Aig_ObjFaninC0(pNode1))) || - (Aig_ObjFanin0(pNode0) == Aig_ObjFanin1(pNode1) && (Aig_ObjFaninC0(pNode0) ^ Aig_ObjFaninC1(pNode1))) || - (Aig_ObjFanin1(pNode0) == Aig_ObjFanin0(pNode1) && (Aig_ObjFaninC1(pNode0) ^ Aig_ObjFaninC0(pNode1))) || - (Aig_ObjFanin1(pNode0) == Aig_ObjFanin1(pNode1) && (Aig_ObjFaninC1(pNode0) ^ Aig_ObjFaninC1(pNode1))); -} - - -/**Function************************************************************* - - Synopsis [Recognizes what nodes are inputs of the EXOR.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ObjRecognizeExor( Aig_Obj_t * pObj, Aig_Obj_t ** ppFan0, Aig_Obj_t ** ppFan1 ) -{ - Aig_Obj_t * p0, * p1; - assert( !Aig_IsComplement(pObj) ); - if ( !Aig_ObjIsNode(pObj) ) - return 0; - if ( Aig_ObjIsExor(pObj) ) - { - *ppFan0 = Aig_ObjChild0(pObj); - *ppFan1 = Aig_ObjChild1(pObj); - return 1; - } - assert( Aig_ObjIsAnd(pObj) ); - p0 = Aig_ObjChild0(pObj); - p1 = Aig_ObjChild1(pObj); - if ( !Aig_IsComplement(p0) || !Aig_IsComplement(p1) ) - return 0; - p0 = Aig_Regular(p0); - p1 = Aig_Regular(p1); - if ( !Aig_ObjIsAnd(p0) || !Aig_ObjIsAnd(p1) ) - return 0; - if ( Aig_ObjFanin0(p0) != Aig_ObjFanin0(p1) || Aig_ObjFanin1(p0) != Aig_ObjFanin1(p1) ) - return 0; - if ( Aig_ObjFaninC0(p0) == Aig_ObjFaninC0(p1) || Aig_ObjFaninC1(p0) == Aig_ObjFaninC1(p1) ) - return 0; - *ppFan0 = Aig_ObjChild0(p0); - *ppFan1 = Aig_ObjChild1(p0); - return 1; -} - -/**Function************************************************************* - - Synopsis [Recognizes what nodes are control and data inputs of a MUX.] - - Description [If the node is a MUX, returns the control variable C. - Assigns nodes T and E to be the then and else variables of the MUX. - Node C is never complemented. Nodes T and E can be complemented. - This function also recognizes EXOR/NEXOR gates as MUXes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ObjRecognizeMux( Aig_Obj_t * pNode, Aig_Obj_t ** ppNodeT, Aig_Obj_t ** ppNodeE ) -{ - Aig_Obj_t * pNode0, * pNode1; - assert( !Aig_IsComplement(pNode) ); - assert( Aig_ObjIsMuxType(pNode) ); - // get children - pNode0 = Aig_ObjFanin0(pNode); - pNode1 = Aig_ObjFanin1(pNode); - - // find the control variable - if ( Aig_ObjFanin1(pNode0) == Aig_ObjFanin1(pNode1) && (Aig_ObjFaninC1(pNode0) ^ Aig_ObjFaninC1(pNode1)) ) - { -// if ( Fraig_IsComplement(pNode1->p2) ) - if ( Aig_ObjFaninC1(pNode0) ) - { // pNode2->p2 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild0(pNode1));//pNode2->p1); - *ppNodeE = Aig_Not(Aig_ObjChild0(pNode0));//pNode1->p1); - return Aig_ObjChild1(pNode1);//pNode2->p2; - } - else - { // pNode1->p2 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild0(pNode0));//pNode1->p1); - *ppNodeE = Aig_Not(Aig_ObjChild0(pNode1));//pNode2->p1); - return Aig_ObjChild1(pNode0);//pNode1->p2; - } - } - else if ( Aig_ObjFanin0(pNode0) == Aig_ObjFanin0(pNode1) && (Aig_ObjFaninC0(pNode0) ^ Aig_ObjFaninC0(pNode1)) ) - { -// if ( Fraig_IsComplement(pNode1->p1) ) - if ( Aig_ObjFaninC0(pNode0) ) - { // pNode2->p1 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild1(pNode1));//pNode2->p2); - *ppNodeE = Aig_Not(Aig_ObjChild1(pNode0));//pNode1->p2); - return Aig_ObjChild0(pNode1);//pNode2->p1; - } - else - { // pNode1->p1 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild1(pNode0));//pNode1->p2); - *ppNodeE = Aig_Not(Aig_ObjChild1(pNode1));//pNode2->p2); - return Aig_ObjChild0(pNode0);//pNode1->p1; - } - } - else if ( Aig_ObjFanin0(pNode0) == Aig_ObjFanin1(pNode1) && (Aig_ObjFaninC0(pNode0) ^ Aig_ObjFaninC1(pNode1)) ) - { -// if ( Fraig_IsComplement(pNode1->p1) ) - if ( Aig_ObjFaninC0(pNode0) ) - { // pNode2->p2 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild0(pNode1));//pNode2->p1); - *ppNodeE = Aig_Not(Aig_ObjChild1(pNode0));//pNode1->p2); - return Aig_ObjChild1(pNode1);//pNode2->p2; - } - else - { // pNode1->p1 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild1(pNode0));//pNode1->p2); - *ppNodeE = Aig_Not(Aig_ObjChild0(pNode1));//pNode2->p1); - return Aig_ObjChild0(pNode0);//pNode1->p1; - } - } - else if ( Aig_ObjFanin1(pNode0) == Aig_ObjFanin0(pNode1) && (Aig_ObjFaninC1(pNode0) ^ Aig_ObjFaninC0(pNode1)) ) - { -// if ( Fraig_IsComplement(pNode1->p2) ) - if ( Aig_ObjFaninC1(pNode0) ) - { // pNode2->p1 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild1(pNode1));//pNode2->p2); - *ppNodeE = Aig_Not(Aig_ObjChild0(pNode0));//pNode1->p1); - return Aig_ObjChild0(pNode1);//pNode2->p1; - } - else - { // pNode1->p2 is positive phase of C - *ppNodeT = Aig_Not(Aig_ObjChild0(pNode0));//pNode1->p1); - *ppNodeE = Aig_Not(Aig_ObjChild1(pNode1));//pNode2->p2); - return Aig_ObjChild1(pNode0);//pNode1->p2; - } - } - assert( 0 ); // this is not MUX - return NULL; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Aig_ObjReal_rec( Aig_Obj_t * pObj ) -{ - Aig_Obj_t * pObjNew, * pObjR = Aig_Regular(pObj); - if ( !Aig_ObjIsBuf(pObjR) ) - return pObj; - pObjNew = Aig_ObjReal_rec( Aig_ObjChild0(pObjR) ); - return Aig_NotCond( pObjNew, Aig_IsComplement(pObj) ); -} - - -/**Function************************************************************* - - Synopsis [Prints Eqn formula for the AIG rooted at this node.] - - Description [The formula is in terms of PIs, which should have - their names assigned in pObj->pData fields.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjPrintEqn( FILE * pFile, Aig_Obj_t * pObj, Vec_Vec_t * vLevels, int Level ) -{ - Vec_Ptr_t * vSuper; - Aig_Obj_t * pFanin; - int fCompl, i; - // store the complemented attribute - fCompl = Aig_IsComplement(pObj); - pObj = Aig_Regular(pObj); - // constant case - if ( Aig_ObjIsConst1(pObj) ) - { - fprintf( pFile, "%d", !fCompl ); - return; - } - // PI case - if ( Aig_ObjIsPi(pObj) ) - { - fprintf( pFile, "%s%s", fCompl? "!" : "", (char*)pObj->pData ); - return; - } - // AND case - Vec_VecExpand( vLevels, Level ); - vSuper = Vec_VecEntry(vLevels, Level); - Aig_ObjCollectMulti( pObj, vSuper ); - fprintf( pFile, "%s", (Level==0? "" : "(") ); - Vec_PtrForEachEntry( vSuper, pFanin, i ) - { - Aig_ObjPrintEqn( pFile, Aig_NotCond(pFanin, fCompl), vLevels, Level+1 ); - if ( i < Vec_PtrSize(vSuper) - 1 ) - fprintf( pFile, " %s ", fCompl? "+" : "*" ); - } - fprintf( pFile, "%s", (Level==0? "" : ")") ); - return; -} - -/**Function************************************************************* - - Synopsis [Prints Verilog formula for the AIG rooted at this node.] - - Description [The formula is in terms of PIs, which should have - their names assigned in pObj->pData fields.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjPrintVerilog( FILE * pFile, Aig_Obj_t * pObj, Vec_Vec_t * vLevels, int Level ) -{ - Vec_Ptr_t * vSuper; - Aig_Obj_t * pFanin, * pFanin0, * pFanin1, * pFaninC; - int fCompl, i; - // store the complemented attribute - fCompl = Aig_IsComplement(pObj); - pObj = Aig_Regular(pObj); - // constant case - if ( Aig_ObjIsConst1(pObj) ) - { - fprintf( pFile, "1\'b%d", !fCompl ); - return; - } - // PI case - if ( Aig_ObjIsPi(pObj) ) - { - fprintf( pFile, "%s%s", fCompl? "~" : "", (char*)pObj->pData ); - return; - } - // EXOR case - if ( Aig_ObjIsExor(pObj) ) - { - Vec_VecExpand( vLevels, Level ); - vSuper = Vec_VecEntry( vLevels, Level ); - Aig_ObjCollectMulti( pObj, vSuper ); - fprintf( pFile, "%s", (Level==0? "" : "(") ); - Vec_PtrForEachEntry( vSuper, pFanin, i ) - { - Aig_ObjPrintVerilog( pFile, Aig_NotCond(pFanin, (fCompl && i==0)), vLevels, Level+1 ); - if ( i < Vec_PtrSize(vSuper) - 1 ) - fprintf( pFile, " ^ " ); - } - fprintf( pFile, "%s", (Level==0? "" : ")") ); - return; - } - // MUX case - if ( Aig_ObjIsMuxType(pObj) ) - { - if ( Aig_ObjRecognizeExor( pObj, &pFanin0, &pFanin1 ) ) - { - fprintf( pFile, "%s", (Level==0? "" : "(") ); - Aig_ObjPrintVerilog( pFile, Aig_NotCond(pFanin0, fCompl), vLevels, Level+1 ); - fprintf( pFile, " ^ " ); - Aig_ObjPrintVerilog( pFile, pFanin1, vLevels, Level+1 ); - fprintf( pFile, "%s", (Level==0? "" : ")") ); - } - else - { - pFaninC = Aig_ObjRecognizeMux( pObj, &pFanin1, &pFanin0 ); - fprintf( pFile, "%s", (Level==0? "" : "(") ); - Aig_ObjPrintVerilog( pFile, pFaninC, vLevels, Level+1 ); - fprintf( pFile, " ? " ); - Aig_ObjPrintVerilog( pFile, Aig_NotCond(pFanin1, fCompl), vLevels, Level+1 ); - fprintf( pFile, " : " ); - Aig_ObjPrintVerilog( pFile, Aig_NotCond(pFanin0, fCompl), vLevels, Level+1 ); - fprintf( pFile, "%s", (Level==0? "" : ")") ); - } - return; - } - // AND case - Vec_VecExpand( vLevels, Level ); - vSuper = Vec_VecEntry(vLevels, Level); - Aig_ObjCollectMulti( pObj, vSuper ); - fprintf( pFile, "%s", (Level==0? "" : "(") ); - Vec_PtrForEachEntry( vSuper, pFanin, i ) - { - Aig_ObjPrintVerilog( pFile, Aig_NotCond(pFanin, fCompl), vLevels, Level+1 ); - if ( i < Vec_PtrSize(vSuper) - 1 ) - fprintf( pFile, " %s ", fCompl? "|" : "&" ); - } - fprintf( pFile, "%s", (Level==0? "" : ")") ); - return; -} - - -/**Function************************************************************* - - Synopsis [Prints node in HAIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ObjPrintVerbose( Aig_Obj_t * pObj, int fHaig ) -{ - assert( !Aig_IsComplement(pObj) ); - printf( "Node %p : ", pObj ); - if ( Aig_ObjIsConst1(pObj) ) - printf( "constant 1" ); - else if ( Aig_ObjIsPi(pObj) ) - printf( "PI" ); - else - printf( "AND( %p%s, %p%s )", - Aig_ObjFanin0(pObj), (Aig_ObjFaninC0(pObj)? "\'" : " "), - Aig_ObjFanin1(pObj), (Aig_ObjFaninC1(pObj)? "\'" : " ") ); - printf( " (refs = %3d)", Aig_ObjRefs(pObj) ); -} - -/**Function************************************************************* - - Synopsis [Prints node in HAIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManPrintVerbose( Aig_Man_t * p, int fHaig ) -{ - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj; - int i; - printf( "PIs: " ); - Aig_ManForEachPi( p, pObj, i ) - printf( " %p", pObj ); - printf( "\n" ); - vNodes = Aig_ManDfs( p ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - Aig_ObjPrintVerbose( pObj, fHaig ), printf( "\n" ); - printf( "\n" ); -} - -/**Function************************************************************* - - Synopsis [Write speculative miter for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDump( Aig_Man_t * p ) -{ - static int Counter = 0; - char FileName[20]; - // dump the logic into a file - sprintf( FileName, "aigbug\\%03d.blif", ++Counter ); - Aig_ManDumpBlif( p, FileName ); - printf( "Intermediate AIG with %d nodes was written into file \"%s\".\n", Aig_ManNodeNum(p), FileName ); -} - -/**Function************************************************************* - - Synopsis [Writes the AIG into the BLIF file.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDumpBlif( Aig_Man_t * p, char * pFileName ) -{ - FILE * pFile; - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pConst1 = NULL; - int i, nDigits, Counter = 0; - if ( Aig_ManPoNum(p) == 0 ) - { - printf( "Aig_ManDumpBlif(): AIG manager does not have POs.\n" ); - return; - } - // collect nodes in the DFS order - vNodes = Aig_ManDfs( p ); - // assign IDs to objects - Aig_ManConst1(p)->iData = Counter++; - Aig_ManForEachPi( p, pObj, i ) - pObj->iData = Counter++; - Aig_ManForEachPo( p, pObj, i ) - pObj->iData = Counter++; - Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->iData = Counter++; - nDigits = Aig_Base10Log( Counter ); - // write the file - pFile = fopen( pFileName, "w" ); - fprintf( pFile, "# BLIF file written by procedure Aig_ManDumpBlif()\n" ); -// fprintf( pFile, "# http://www.eecs.berkeley.edu/~alanmi/abc/\n" ); - fprintf( pFile, ".model test\n" ); - // write PIs - fprintf( pFile, ".inputs" ); - Aig_ManForEachPiSeq( p, pObj, i ) - fprintf( pFile, " n%0*d", nDigits, pObj->iData ); - fprintf( pFile, "\n" ); - // write POs - fprintf( pFile, ".outputs" ); - Aig_ManForEachPoSeq( p, pObj, i ) - fprintf( pFile, " n%0*d", nDigits, pObj->iData ); - fprintf( pFile, "\n" ); - // write latches - if ( Aig_ManRegNum(p) ) - { - fprintf( pFile, "\n" ); - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - fprintf( pFile, ".latch n%0*d n%0*d 0\n", nDigits, pObjLi->iData, nDigits, pObjLo->iData ); - fprintf( pFile, "\n" ); - } - // write nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - fprintf( pFile, ".names n%0*d n%0*d n%0*d\n", - nDigits, Aig_ObjFanin0(pObj)->iData, - nDigits, Aig_ObjFanin1(pObj)->iData, - nDigits, pObj->iData ); - fprintf( pFile, "%d%d 1\n", !Aig_ObjFaninC0(pObj), !Aig_ObjFaninC1(pObj) ); - } - // write POs - Aig_ManForEachPo( p, pObj, i ) - { - fprintf( pFile, ".names n%0*d n%0*d\n", - nDigits, Aig_ObjFanin0(pObj)->iData, - nDigits, pObj->iData ); - fprintf( pFile, "%d 1\n", !Aig_ObjFaninC0(pObj) ); - if ( Aig_ObjIsConst1(Aig_ObjFanin0(pObj)) ) - pConst1 = Aig_ManConst1(p); - } - if ( pConst1 ) - fprintf( pFile, ".names n%0*d\n 1\n", nDigits, pConst1->iData ); - fprintf( pFile, ".end\n\n" ); - fclose( pFile ); - Vec_PtrFree( vNodes ); -} - -/**Function************************************************************* - - Synopsis [Writes the AIG into the BLIF file.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManDumpVerilog( Aig_Man_t * p, char * pFileName ) -{ - FILE * pFile; - Vec_Ptr_t * vNodes; - Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pConst1 = NULL; - int i, nDigits, Counter = 0; - if ( Aig_ManPoNum(p) == 0 ) - { - printf( "Aig_ManDumpBlif(): AIG manager does not have POs.\n" ); - return; - } - // collect nodes in the DFS order - vNodes = Aig_ManDfs( p ); - // assign IDs to objects - Aig_ManConst1(p)->iData = Counter++; - Aig_ManForEachPi( p, pObj, i ) - pObj->iData = Counter++; - Aig_ManForEachPo( p, pObj, i ) - pObj->iData = Counter++; - Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->iData = Counter++; - nDigits = Aig_Base10Log( Counter ); - // write the file - pFile = fopen( pFileName, "w" ); - fprintf( pFile, "// Verilog file written by procedure Aig_ManDumpVerilog()\n" ); -// fprintf( pFile, "// http://www.eecs.berkeley.edu/~alanmi/abc/\n" ); - if ( Aig_ManRegNum(p) ) - fprintf( pFile, "module %s ( clock", p->pName? p->pName: "test" ); - else - fprintf( pFile, "module %s (", p->pName? p->pName: "test" ); - Aig_ManForEachPiSeq( p, pObj, i ) - fprintf( pFile, "%s n%0*d", ((Aig_ManRegNum(p) || i)? ",":""), nDigits, pObj->iData ); - Aig_ManForEachPoSeq( p, pObj, i ) - fprintf( pFile, ", n%0*d", nDigits, pObj->iData ); - fprintf( pFile, " );\n" ); - - // write PIs - if ( Aig_ManRegNum(p) ) - fprintf( pFile, "input clock;\n" ); - Aig_ManForEachPiSeq( p, pObj, i ) - fprintf( pFile, "input n%0*d;\n", nDigits, pObj->iData ); - // write POs - Aig_ManForEachPoSeq( p, pObj, i ) - fprintf( pFile, "output n%0*d;\n", nDigits, pObj->iData ); - // write latches - if ( Aig_ManRegNum(p) ) - { - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - fprintf( pFile, "reg n%0*d;\n", nDigits, pObjLo->iData ); - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - fprintf( pFile, "wire n%0*d;\n", nDigits, pObjLi->iData ); - } - // write nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - fprintf( pFile, "wire n%0*d;\n", nDigits, pObj->iData ); - // write nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - fprintf( pFile, "assign n%0*d = %sn%0*d & %sn%0*d;\n", - nDigits, pObj->iData, - !Aig_ObjFaninC0(pObj) ? " " : "~", nDigits, Aig_ObjFanin0(pObj)->iData, - !Aig_ObjFaninC1(pObj) ? " " : "~", nDigits, Aig_ObjFanin1(pObj)->iData - ); - } - // write POs - Aig_ManForEachPoSeq( p, pObj, i ) - { - fprintf( pFile, "assign n%0*d = %sn%0*d;\n", - nDigits, pObj->iData, - !Aig_ObjFaninC0(pObj) ? " " : "~", nDigits, Aig_ObjFanin0(pObj)->iData ); - if ( Aig_ObjIsConst1(Aig_ObjFanin0(pObj)) ) - pConst1 = Aig_ManConst1(p); - } - if ( Aig_ManRegNum(p) ) - { - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - { - fprintf( pFile, "assign n%0*d = %sn%0*d;\n", - nDigits, pObjLi->iData, - !Aig_ObjFaninC0(pObjLi) ? " " : "~", nDigits, Aig_ObjFanin0(pObjLi)->iData ); - if ( Aig_ObjIsConst1(Aig_ObjFanin0(pObjLi)) ) - pConst1 = Aig_ManConst1(p); - } - } - if ( pConst1 ) - fprintf( pFile, "assign n%0*d = 1\'b1;\n", nDigits, pConst1->iData ); - - // write initial state - if ( Aig_ManRegNum(p) ) - { - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - fprintf( pFile, "always @ (posedge clock) begin n%0*d <= n%0*d; end\n", - nDigits, pObjLo->iData, - nDigits, pObjLi->iData ); - Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i ) - fprintf( pFile, "initial begin n%0*d <= 1\'b0; end\n", - nDigits, pObjLo->iData ); - } - - fprintf( pFile, "endmodule\n\n" ); - fclose( pFile ); - Vec_PtrFree( vNodes ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/aig/aigWin.c b/src/vendor/stp/src/extlib-abc/aig/aig/aigWin.c deleted file mode 100644 index 844f05ff0..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/aig/aigWin.c +++ /dev/null @@ -1,184 +0,0 @@ -/**CFile**************************************************************** - - FileName [aigWin.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG package.] - - Synopsis [Window computation.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: aigWin.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "aig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Evaluate the cost of removing the node from the set of leaves.] - - Description [Returns the number of new leaves that will be brought in. - Returns large number if the node cannot be removed from the set of leaves.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Aig_NodeGetLeafCostOne( Aig_Obj_t * pNode, int nFanoutLimit ) -{ - int Cost; - // make sure the node is in the construction zone - assert( pNode->fMarkA ); - // cannot expand over the PI node - if ( Aig_ObjIsPi(pNode) ) - return 999; - // get the cost of the cone - Cost = (!Aig_ObjFanin0(pNode)->fMarkA) + (!Aig_ObjFanin1(pNode)->fMarkA); - // always accept if the number of leaves does not increase - if ( Cost < 2 ) - return Cost; - // skip nodes with many fanouts - if ( (int)pNode->nRefs > nFanoutLimit ) - return 999; - // return the number of nodes that will be on the leaves if this node is removed - return Cost; -} - -/**Function************************************************************* - - Synopsis [Builds reconvergence-driven cut by changing one leaf at a time.] - - Description [This procedure looks at the current leaves and tries to change - one leaf at a time in such a way that the cut grows as little as possible. - In evaluating the fanins, this procedure looks only at their immediate - predecessors (this is why it is called a one-level construction procedure).] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManFindCut_int( Vec_Ptr_t * vFront, Vec_Ptr_t * vVisited, int nSizeLimit, int nFanoutLimit ) -{ - Aig_Obj_t * pNode, * pFaninBest, * pNext; - int CostBest, CostCur, i; - // find the best fanin - CostBest = 100; - pFaninBest = NULL; -//printf( "Evaluating fanins of the cut:\n" ); - Vec_PtrForEachEntry( vFront, pNode, i ) - { - CostCur = Aig_NodeGetLeafCostOne( pNode, nFanoutLimit ); -//printf( " Fanin %s has cost %d.\n", Aig_ObjName(pNode), CostCur ); - if ( CostBest > CostCur || - (CostBest == CostCur && pNode->Level > pFaninBest->Level) ) - { - CostBest = CostCur; - pFaninBest = pNode; - } - if ( CostBest == 0 ) - break; - } - if ( pFaninBest == NULL ) - return 0; - assert( CostBest < 3 ); - if ( Vec_PtrSize(vFront) - 1 + CostBest > nSizeLimit ) - return 0; - assert( Aig_ObjIsNode(pFaninBest) ); - // remove the node from the array - Vec_PtrRemove( vFront, pFaninBest ); -//printf( "Removing fanin %s.\n", Aig_ObjName(pFaninBest) ); - - // add the left child to the fanins - pNext = Aig_ObjFanin0(pFaninBest); - if ( !pNext->fMarkA ) - { -//printf( "Adding fanin %s.\n", Aig_ObjName(pNext) ); - pNext->fMarkA = 1; - Vec_PtrPush( vFront, pNext ); - Vec_PtrPush( vVisited, pNext ); - } - // add the right child to the fanins - pNext = Aig_ObjFanin1(pFaninBest); - if ( !pNext->fMarkA ) - { -//printf( "Adding fanin %s.\n", Aig_ObjName(pNext) ); - pNext->fMarkA = 1; - Vec_PtrPush( vFront, pNext ); - Vec_PtrPush( vVisited, pNext ); - } - assert( Vec_PtrSize(vFront) <= nSizeLimit ); - // keep doing this - return 1; -} - -/**Function************************************************************* - - Synopsis [Computes one sequential cut of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_ManFindCut( Aig_Obj_t * pRoot, Vec_Ptr_t * vFront, Vec_Ptr_t * vVisited, int nSizeLimit, int nFanoutLimit ) -{ - Aig_Obj_t * pNode; - int i; - - assert( !Aig_IsComplement(pRoot) ); - assert( Aig_ObjIsNode(pRoot) ); - assert( Aig_ObjChild0(pRoot) ); - assert( Aig_ObjChild1(pRoot) ); - - // start the cut - Vec_PtrClear( vFront ); - Vec_PtrPush( vFront, Aig_ObjFanin0(pRoot) ); - Vec_PtrPush( vFront, Aig_ObjFanin1(pRoot) ); - - // start the visited nodes - Vec_PtrClear( vVisited ); - Vec_PtrPush( vVisited, pRoot ); - Vec_PtrPush( vVisited, Aig_ObjFanin0(pRoot) ); - Vec_PtrPush( vVisited, Aig_ObjFanin1(pRoot) ); - - // mark these nodes - assert( !pRoot->fMarkA ); - assert( !Aig_ObjFanin0(pRoot)->fMarkA ); - assert( !Aig_ObjFanin1(pRoot)->fMarkA ); - pRoot->fMarkA = 1; - Aig_ObjFanin0(pRoot)->fMarkA = 1; - Aig_ObjFanin1(pRoot)->fMarkA = 1; - - // compute the cut - while ( Aig_ManFindCut_int( vFront, vVisited, nSizeLimit, nFanoutLimit ) ); - assert( Vec_PtrSize(vFront) <= nSizeLimit ); - - // clean the visit markings - Vec_PtrForEachEntry( vVisited, pNode, i ) - pNode->fMarkA = 0; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/Makefile b/src/vendor/stp/src/extlib-abc/aig/cnf/Makefile deleted file mode 100644 index ff9f88b36..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -SRCTOP = ../../.. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.c) -OBJS = $(SRCS:.c=.o) -CFLAGS += -I.. -CXXFLAGS += -I.. - -libabc.a: $(OBJS) - $(AR) rc $@ $(OBJS) - $(RANLIB) $@ - - -.PHONY: clean -clean: - rm -rf *.o *~ *.a .#* depend - -#depend: $(SRCS) -# @$(CXX) -MM -MG $(CXXFLAGS) $(SRCS) > $@ - --include depend diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfCore.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfCore.c deleted file mode 100644 index faf5be23a..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfCore.c +++ /dev/null @@ -1,185 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfCore.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfCore.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Cnf_Man_t * s_pManCnf = NULL; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Converts AIG into the SAT solver.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig, int nOutputs ) -{ - Cnf_Man_t * p; - Cnf_Dat_t * pCnf; - Vec_Ptr_t * vMapped; - Aig_MmFixed_t * pMemCuts; - int clk; - // allocate the CNF manager - if ( s_pManCnf == NULL ) - s_pManCnf = Cnf_ManStart(); - // connect the managers - p = s_pManCnf; - p->pManAig = pAig; - - // generate cuts for all nodes, assign cost, and find best cuts -clk = clock(); - pMemCuts = Dar_ManComputeCuts( pAig, 10 ); -p->timeCuts = clock() - clk; - - // find the mapping -clk = clock(); - Cnf_DeriveMapping( p ); -p->timeMap = clock() - clk; -// Aig_ManScanMapping( p, 1 ); - - // convert it into CNF -clk = clock(); - Cnf_ManTransferCuts( p ); - vMapped = Cnf_ManScanMapping( p, 1, 1 ); - pCnf = Cnf_ManWriteCnf( p, vMapped, nOutputs ); - Vec_PtrFree( vMapped ); - Aig_MmFixedStop( pMemCuts, 0 ); -p->timeSave = clock() - clk; - - // reset reference counters - Aig_ManResetRefs( pAig ); -//PRT( "Cuts ", p->timeCuts ); -//PRT( "Map ", p->timeMap ); -//PRT( "Saving ", p->timeSave ); - return pCnf; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Man_t * Cnf_ManRead() -{ - return s_pManCnf; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_ClearMemory() -{ - if ( s_pManCnf == NULL ) - return; - Cnf_ManStop( s_pManCnf ); - s_pManCnf = NULL; -} - - -#if 0 - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Dat_t * Cnf_Derive_old( Aig_Man_t * pAig ) -{ -/* - // iteratively improve area flow - for ( i = 0; i < nIters; i++ ) - { -clk = clock(); - Cnf_ManScanMapping( p, 0 ); - Cnf_ManMapForCnf( p ); -PRT( "iter ", clock() - clk ); - } -*/ - // write the file - vMapped = Aig_ManScanMapping( p, 1 ); - Vec_PtrFree( vMapped ); - -clk = clock(); - Cnf_ManTransferCuts( p ); - - Cnf_ManPostprocess( p ); - Cnf_ManScanMapping( p, 0 ); -/* - Cnf_ManPostprocess( p ); - Cnf_ManScanMapping( p, 0 ); - Cnf_ManPostprocess( p ); - Cnf_ManScanMapping( p, 0 ); -*/ -PRT( "Ext ", clock() - clk ); - -/* - vMapped = Cnf_ManScanMapping( p, 1 ); - pCnf = Cnf_ManWriteCnf( p, vMapped ); - Vec_PtrFree( vMapped ); - - // clean up - Cnf_ManFreeCuts( p ); - Dar_ManCutsFree( pAig ); - return pCnf; -*/ - Aig_MmFixedStop( pMemCuts, 0 ); - return NULL; -} - -#endif - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfCut.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfCut.c deleted file mode 100644 index 3518958d4..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfCut.c +++ /dev/null @@ -1,371 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfCut.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfCut.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates cut of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Cut_t * Cnf_CutAlloc( Cnf_Man_t * p, int nLeaves ) -{ - Cnf_Cut_t * pCut; - int nSize = sizeof(Cnf_Cut_t) + sizeof(int) * nLeaves + sizeof(unsigned) * Aig_TruthWordNum(nLeaves); - pCut = (Cnf_Cut_t *)Aig_MmFlexEntryFetch( p->pMemCuts, nSize ); - pCut->nFanins = nLeaves; - pCut->nWords = Aig_TruthWordNum(nLeaves); - pCut->vIsop[0] = pCut->vIsop[1] = NULL; - return pCut; -} - -/**Function************************************************************* - - Synopsis [Deallocates cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutFree( Cnf_Cut_t * pCut ) -{ - if ( pCut->vIsop[0] ) - Vec_IntFree( pCut->vIsop[0] ); - if ( pCut->vIsop[1] ) - Vec_IntFree( pCut->vIsop[1] ); -} - -/**Function************************************************************* - - Synopsis [Creates cut for the given node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Cut_t * Cnf_CutCreate( Cnf_Man_t * p, Aig_Obj_t * pObj ) -{ - Dar_Cut_t * pCutBest; - Cnf_Cut_t * pCut; - unsigned * pTruth; - assert( Aig_ObjIsNode(pObj) ); - pCutBest = Dar_ObjBestCut( pObj ); - assert( pCutBest != NULL ); - assert( pCutBest->nLeaves <= 4 ); - pCut = Cnf_CutAlloc( p, pCutBest->nLeaves ); - memcpy( pCut->pFanins, pCutBest->pLeaves, sizeof(int) * pCutBest->nLeaves ); - pTruth = Cnf_CutTruth(pCut); - *pTruth = (pCutBest->uTruth << 16) | pCutBest->uTruth; - pCut->Cost = Cnf_CutSopCost( p, pCutBest ); - return pCut; -} - -/**Function************************************************************* - - Synopsis [Deallocates cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutPrint( Cnf_Cut_t * pCut ) -{ - int i; - printf( "{" ); - for ( i = 0; i < pCut->nFanins; i++ ) - printf( "%d ", pCut->pFanins[i] ); - printf( " } " ); -} - -/**Function************************************************************* - - Synopsis [Allocates cut of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutDeref( Cnf_Man_t * p, Cnf_Cut_t * pCut ) -{ - Aig_Obj_t * pObj; - int i; - Cnf_CutForEachLeaf( p->pManAig, pCut, pObj, i ) - { - assert( pObj->nRefs > 0 ); - pObj->nRefs--; - } -} - -/**Function************************************************************* - - Synopsis [Allocates cut of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutRef( Cnf_Man_t * p, Cnf_Cut_t * pCut ) -{ - Aig_Obj_t * pObj; - int i; - Cnf_CutForEachLeaf( p->pManAig, pCut, pObj, i ) - { - pObj->nRefs++; - } -} - -/**Function************************************************************* - - Synopsis [Allocates cut of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutUpdateRefs( Cnf_Man_t * p, Cnf_Cut_t * pCut, Cnf_Cut_t * pCutFan, Cnf_Cut_t * pCutRes ) -{ - Cnf_CutDeref( p, pCut ); - Cnf_CutDeref( p, pCutFan ); - Cnf_CutRef( p, pCutRes ); -} - -/**Function************************************************************* - - Synopsis [Merges two arrays of integers.] - - Description [Returns the number of items.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Cnf_CutMergeLeaves( Cnf_Cut_t * pCut, Cnf_Cut_t * pCutFan, int * pFanins ) -{ - int i, k, nFanins = 0; - for ( i = k = 0; i < pCut->nFanins && k < pCutFan->nFanins; ) - { - if ( pCut->pFanins[i] == pCutFan->pFanins[k] ) - pFanins[nFanins++] = pCut->pFanins[i], i++, k++; - else if ( pCut->pFanins[i] < pCutFan->pFanins[k] ) - pFanins[nFanins++] = pCut->pFanins[i], i++; - else - pFanins[nFanins++] = pCutFan->pFanins[k], k++; - } - for ( ; i < pCut->nFanins; i++ ) - pFanins[nFanins++] = pCut->pFanins[i]; - for ( ; k < pCutFan->nFanins; k++ ) - pFanins[nFanins++] = pCutFan->pFanins[k]; - return nFanins; -} - -/**Function************************************************************* - - Synopsis [Computes the stretching phase of the cut w.r.t. the merged cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Cnf_TruthPhase( Cnf_Cut_t * pCut, Cnf_Cut_t * pCut1 ) -{ - unsigned uPhase = 0; - int i, k; - for ( i = k = 0; i < pCut->nFanins; i++ ) - { - if ( k == pCut1->nFanins ) - break; - if ( pCut->pFanins[i] < pCut1->pFanins[k] ) - continue; - assert( pCut->pFanins[i] == pCut1->pFanins[k] ); - uPhase |= (1 << i); - k++; - } - return uPhase; -} - -/**Function************************************************************* - - Synopsis [Removes the fanin variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutRemoveIthVar( Cnf_Cut_t * pCut, int iVar, int iFan ) -{ - int i; - assert( pCut->pFanins[iVar] == iFan ); - pCut->nFanins--; - for ( i = iVar; i < pCut->nFanins; i++ ) - pCut->pFanins[i] = pCut->pFanins[i+1]; -} - -/**Function************************************************************* - - Synopsis [Inserts the fanin variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutInsertIthVar( Cnf_Cut_t * pCut, int iVar, int iFan ) -{ - int i; - for ( i = pCut->nFanins; i > iVar; i-- ) - pCut->pFanins[i] = pCut->pFanins[i-1]; - pCut->pFanins[iVar] = iFan; - pCut->nFanins++; -} - -/**Function************************************************************* - - Synopsis [Merges two cuts.] - - Description [Returns NULL of the cuts cannot be merged.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Cut_t * Cnf_CutCompose( Cnf_Man_t * p, Cnf_Cut_t * pCut, Cnf_Cut_t * pCutFan, int iFan ) -{ - Cnf_Cut_t * pCutRes; - static int pFanins[32]; - unsigned * pTruth, * pTruthFan, * pTruthRes; - unsigned * pTop = p->pTruths[0], * pFan = p->pTruths[2], * pTemp = p->pTruths[3]; - unsigned uPhase, uPhaseFan; - int i, iVar, nFanins, RetValue; - - // make sure the second cut is the fanin of the first - for ( iVar = 0; iVar < pCut->nFanins; iVar++ ) - if ( pCut->pFanins[iVar] == iFan ) - break; - assert( iVar < pCut->nFanins ); - // remove this variable - Cnf_CutRemoveIthVar( pCut, iVar, iFan ); - // merge leaves of the cuts - nFanins = Cnf_CutMergeLeaves( pCut, pCutFan, pFanins ); - if ( nFanins+1 > p->nMergeLimit ) - { - Cnf_CutInsertIthVar( pCut, iVar, iFan ); - return NULL; - } - // create new cut - pCutRes = Cnf_CutAlloc( p, nFanins ); - memcpy( pCutRes->pFanins, pFanins, sizeof(int) * nFanins ); - assert( pCutRes->nFanins <= pCut->nFanins + pCutFan->nFanins ); - - // derive its truth table - // get the truth tables in the composition space - pTruth = Cnf_CutTruth(pCut); - pTruthFan = Cnf_CutTruth(pCutFan); - pTruthRes = Cnf_CutTruth(pCutRes); - for ( i = 0; i < 2*pCutRes->nWords; i++ ) - pTop[i] = pTruth[i % pCut->nWords]; - for ( i = 0; i < pCutRes->nWords; i++ ) - pFan[i] = pTruthFan[i % pCutFan->nWords]; - // move the variable to the end - uPhase = Kit_BitMask( pCutRes->nFanins+1 ) & ~(1 << iVar); - Kit_TruthShrink( pTemp, pTop, pCutRes->nFanins, pCutRes->nFanins+1, uPhase, 1 ); - // compute the phases - uPhase = Cnf_TruthPhase( pCutRes, pCut ) | (1 << pCutRes->nFanins); - uPhaseFan = Cnf_TruthPhase( pCutRes, pCutFan ); - // permute truth-tables to the common support - Kit_TruthStretch( pTemp, pTop, pCut->nFanins+1, pCutRes->nFanins+1, uPhase, 1 ); - Kit_TruthStretch( pTemp, pFan, pCutFan->nFanins, pCutRes->nFanins, uPhaseFan, 1 ); - // perform Boolean operation - Kit_TruthMux( pTruthRes, pTop, pTop+pCutRes->nWords, pFan, pCutRes->nFanins ); - // return the cut to its original condition - Cnf_CutInsertIthVar( pCut, iVar, iFan ); - // consider the simple case - if ( pCutRes->nFanins < 5 ) - { - pCutRes->Cost = p->pSopSizes[0xFFFF & *pTruthRes] + p->pSopSizes[0xFFFF & ~*pTruthRes]; - return pCutRes; - } - - // derive ISOP for positive phase - RetValue = Kit_TruthIsop( pTruthRes, pCutRes->nFanins, p->vMemory, 0 ); - pCutRes->vIsop[1] = (RetValue == -1)? NULL : Vec_IntDup( p->vMemory ); - // derive ISOP for negative phase - Kit_TruthNot( pTruthRes, pTruthRes, pCutRes->nFanins ); - RetValue = Kit_TruthIsop( pTruthRes, pCutRes->nFanins, p->vMemory, 0 ); - pCutRes->vIsop[0] = (RetValue == -1)? NULL : Vec_IntDup( p->vMemory ); - Kit_TruthNot( pTruthRes, pTruthRes, pCutRes->nFanins ); - - // compute the cut cost - if ( pCutRes->vIsop[0] == NULL || pCutRes->vIsop[1] == NULL ) - pCutRes->Cost = 127; - else if ( Vec_IntSize(pCutRes->vIsop[0]) + Vec_IntSize(pCutRes->vIsop[1]) > 127 ) - pCutRes->Cost = 127; - else - pCutRes->Cost = Vec_IntSize(pCutRes->vIsop[0]) + Vec_IntSize(pCutRes->vIsop[1]); - return pCutRes; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfData.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfData.c deleted file mode 100644 index 87617c8bd..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfData.c +++ /dev/null @@ -1,4784 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfData.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfData.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static char s_Data3[81] = "!#&()*+,-.0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz|"; - -static char * s_Data4[] = { -"! B a . 8 .B 8a K !K T Ta j 8j Tj s ( + (B +a (. +8 .B( +8a (K +K T( +T j( ", -"+j Tj( s+ E !E H Ha E. 8E H. H8 EK EK! HT HTa jE 8jE Hj sH d +d Hd g d. 8d ", -"Hd. g8 dK +dK Td gT dj +jd Hjd gs 2 !2 2B a2 5 58 5B 5a 2K 2K! T2 Ta2 5j 58", -"j 5T s5 ; +; ;B a; 5; > 5;B >a ;K +;K T; +T; ;j >j 5T; s> E2 !E2 H2 Ha2 5E ", -"58E H5 H58 EK2 !E2K HT2 TaH2 5jE 8j5E H5T sH5 d; +d; H; g; 5d >d H5d g> dK;", -" dK+; H;T gT; 5dj >jd H;j gs> N !N NB aN N. 8N .BN 8aN Q Q! QT Qa Qj Q8 QTj", -" sQ (N +N (BN +aN N.( +8N (BN. 8a+N Q( +Q QT( +QT Qj( +Q8 TjQ( s+Q W W! HW ", -"Wa W. W8 HW. H8W WQ Q!W Z Za Wj W8Q Zj sZ Wd +W HWd gW Wd. +W8 WdH. gW8 Qd ", -"+WQ Zd gZ Wjd +Wj Zdj gZs m m! mB am 5m 8m 5mB 5am Qm Q!m Tm Qam p p8 pT sp", -" m; +m m;B +ma 5m; >m m;5B >ma Q; +Qm Q;T +Tm p; p> pT; sp> Wm W!m Hm Hma 5", -"W 5W8 H5W H8m WQm WmQ! Zm Zam pW pW8 Zp sZp v v+ vH gv v5 v> vH5 gv> vQ v+Q", -" Zv gZv pv pv> Zpv y # & #B a& #. 8& .B# 8a& #K &K T# T& j# &j Tj# s& #( +&", -" #B( +a& #(. +8& #(.B 8a+& #(K +&K T#( +T& j#( +j& j#T( s+& #E &E H# H& #E.", -" 8&E H#. H8& EK# &EK HT# H&T j#E &jE Hj# sH& d# d& Hd# g& d#. 8d& d#H. g8& ", -"dK# d&K Td# gT& dj# d&j H#dj gs& #2 &2 2B# a&2 5# 5& 5B# 5a& 2K# &2K T#2 T&", -"2 5j# 5&j 5T# s5& ;# ;& ;#B a;& 5;# >& ;#5B >&a ;#K ;&K T;# T;& ;j# >&j 5#T", -"; s>& #E2 &E2 H#2 H&2 5#E 5&E H5# H5& #E2K EK&2 T#H2 H2T& j#5E 5E&j H#5T H5", -"s& d;# d&; H;# g;& 5d# >&d H#5d g>& ;#dK dK;& H#T; T;g& 5#dj d&>j H#;j >&gs", -" #N &N #BN a&N N.# 8&N #BN. aN8& Q# Q& QT# Qa& Qj# Q8& TjQ# sQ& #(N +&N #(N", -"B a&+N #(N. 8&+N .BN#( +8a&N Q#( +Q& T#Q( Q&+T j#Q( Q&+j QTj#( +Qs& W# W& H", -"W# H&W W#. W8& W#H. W8H& WQ# W&Q Z# Z& Wj# W&j Zj# sZ& Wd# +W& WdH# gW& d#W", -". 8dW& HWd#. W8g& Qd# Qd& Zd# gZ& W#dj W&+j djZ# Z&gs m# m& m#B am& 5m# 5&m", -" m#5B am5& Qm# Q&m Tm# Tm& p# p& pT# sp& m;# +m& ;#mB m&a; m;5# >m& 5m;#B a", -"m>& Q;# Q;& Q#T; T;Q& p;# p>& T;p# p&s> Wm# W&m Hm# Hm& 5W# 5W& H#5W 5WH& Q", -"mW# WQm& Zm# Z&m pW# p&W Zp# Zp& v# v& vH# gv& v5# v>& H5v# v&g> vQ# v&Q Zv", -"# Zv& pv# pv& Z#pv y& C !C D Da C. 8C D. D8 CK CK! DT DTa jC 8jC Dj sD C( +", -"C D( +D C(. +8C D(. +D8 CK( +CK DT( +DT jC( +jC Dj( s+D CE !CE HD HDa CE. 8", -"CE HD. H8D EKC !CEK HDT DTHa jCE jC8E HjD sHD dC +dC Dd gD dC. 8dC Dd. gD8 ", -"dKC dK+C DdT gDT djC +Cdj Ddj gsD C2 !C2 D2 Da2 5C 58C 5D 5D8 2KC !C2K DT2 ", -"T2Da 5jC 8j5C 5DT s5D ;C +;C D; +D; 5;C >C 5D; >D ;CK ;C+K D;T D;+T ;jC >jC", -" D;j s>D CE2 CE!2 HD2 H2Da 5CE 8C5E H5D 5DH8 CE2K !E2CK H2DT HDTa2 jC5E 58j", -"CE 5DHj H5sD d;C d;+C H;D gD; 5dC >Cd 5Dd g>D ;CdK +d;CK TdD; D;gT 5Cdj dj>", -"C Dd5T >Dgs CN !CN DN DaN N.C 8CN DN. D8N QC Q!C QD QDa QjC Q8C QDj sQD C(N", -" +CN D(N +DN C(N. 8C+N N.D( +ND8 QC( +QC QD( +QD jCQ( +CQ8 Q(Dj +QsD WC W!C", -" WD WDa WC. W8C WD. WD8 WQC WCQ! ZD ZDa WjC WCQ8 ZDj sZD WdC +WC WDd gWD dC", -"W. +CW8 W.Dd WDg8 QdC +CQd ZDd gZD WCdj +CWj DdZj gDsZ mC mC! Dm Dma 5mC 8m", -"C 5Dm D8m QmC mCQ! QDm DmQa pC p8C pD spD m;C +mC Dm; +Dm m;5C >mC 5mD; >Dm", -" Q;C +CQ; QD; QD+m p;C p>C pD; p>D WmC mCW! HmD DmWa 5WC 5CW8 5WD WD5a QmWC", -" Q!WmC ZDm DmZa pWC W8pC ZpD pDsZ vC v+C vD gvD v5C v>C vD5 v>D vQC +QvC Zv", -"D vDgZ pvC >Cpv pvD yD b b& bD c b. b8 bD. c8 bK bK& bT cT bj b8j bTj sc b(", -" b+ bD( c+ b(. b+8 D(b. c+8 bK( b+K bT( c+T bj( b+j b(Dj sc+ bE b&E bH cH b", -"E. b8E bH. cH8 bKE &EbK bHT cHT bjE bE&j bHj scH bd b+d bHd gc bd. b8d b.Dd", -" gc8 bdK bKd& bTd gcT bdj +jbd Hjbd gsc b2 b&2 bD2 c2 b5 b58 b5D c5 bK2 &2b", -"K bT2 c2T b5j 5&bj b5T sc5 b; b+; b;D c; b5; >b 5Db; c> b;K bK;& bT; c;T b;", -"j >bj 5Tb; c>s bE2 &Eb2 bH2 c2H b5E bE5& bH5 c5H EKb2 bK&E2 HTb2 HTc2 5jbE ", -"&jEb5 H5bT sHc5 bd; d&b; bH; gc; b5d >bd H5bd c>g dKb; d&;bK H;bT gTc; 5dbj", -" bd>j H;bj gsc> bN b&N bDN cN bN. b8N DNb. c8N bQ bQ& bQD cQ bQj bQ8 QDbj s", -"cQ b(N b+N D(bN c+N N.b( +8bN bD(N. +8cN bQ( b+Q b(QD cQ+ Qjb( +Qb8 bQDj( s", -"+cQ bW bW& bHW cW bW. bW8 b.WD cW8 bWQ W&bQ Zb Zc bWj W8bQ Zbj Zcs bWd b+W ", -"WDbd gcW Wdb. +Wb8 bHWd. g8cW bQd +WbQ Zbd Zcg Wjbd +Wbj bdZj gsZc bm bm& b", -"mD cm b5m b8m 5Dbm c5m bQm Q&bm bTm cQm pb pb8 pbD cp bm; b+m Dmb; cm+ 5mb;", -" >bm b5Dm; c>m bQ; +Qbm QDb; cQ; pb; p>b bTp; cp> bWm W&bm bHm cWm b5W 5Wb8", -" H5bW c5W WQbm bWQm& Zbm Zcm pbW bWp& Zpb cpZ vb vb+ vbH cv vb5 v>b bHv5 cv", -"> vbQ b+vQ Zvb cvZ pvb v>pb pvZb yc 0 !0 0B a0 1 18 1B 1a 0K !K0 T0 Ta0 1j ", -"18j 1T s1 0( +0 0B( +a0 1( 1+ 1(B 1+a 0(K +0K T0( +T0 1j( 1+j 1T( s1+ E0 !E", -"0 H0 Ha0 1E 18E 1H 1H8 EK0 !0EK HT0 TaH0 1jE 8j1E 1HT s1H d0 +d0 Hd0 g0 1d ", -"1+d 1Hd g1 dK0 dK+0 Td0 gT0 1dj +j1d 1Td gs1 02 !02 2B0 a02 15 158 15B 1a5 ", -"2K0 !02K T02 T2a0 15j 581j 1T5 s15 ;0 +;0 ;0B a;0 1; >1 1;B >1a ;0K ;0+K T;", -"0 +0T; 1;j >j1 1T; s>1 E02 E0!2 H02 a0H2 15E 581E 1H5 H51a E02K !E20K T0H2 ", -"HTa02 5j1E 158jE H51T 1Hs5 d;0 d;+0 H;0 g;0 1d5 >1d 1H; g>1 ;0dK +d;0K H0T;", -" T;g0 dj1; 1d>j H;1T s>g1 0N !0N 0BN a0N 1N 18N 1NB 1aN Q0 Q!0 QT0 Qa0 1Q 1", -"Q8 1QT s1Q 0(N +0N 0(NB a0+N 1(N 1+N (B1N +a1N Q0( +Q0 T0Q( +0Qa 1Q( 1+Q QT", -"1( 1+sQ W0 W!0 HW0 Wa0 1W 1W8 1HW 1Wa WQ0 W0Q! Z0 Za0 1WQ W81Q Z1 sZ1 Wd0 +", -"W0 WdH0 gW0 1Wd 1+W HW1d g1W Qd0 +0Qd Zd0 gZ0 1Qd +W1Q Z1d gZ1 m0 m0! m0B a", -"m0 1m 1m8 1mB 1am Qm0 m0Q! Tm0 Q0am p1 p18 p1T sp1 m;0 +m0 ;0mB +0am 1m; >m", -"1 m;1B 1a>m Q;0 +0Q; Q0T; +0Tm p1; p>1 1Tp; s1p> Wm0 m0W! Hm0 H0am 1W5 W81m", -" 1Hm H81m QmW0 Q!Wm0 Zm0 amZ0 p1W 1Wp8 Zp1 Z1sp v0 v+0 vH0 gv0 v1 v>1 v1H g", -"v1 vQ0 +Qv0 Zv0 g0Zv pv1 v1p> Zv1 y1 9 9& 9B 9a 91 : 91B :a 9K 9&K 9T 9Ta 9", -"j :j 9T1 s: 9( 9+ 9(B 9+a 91( :+ 1B9( :+a 9(K 9+K 9T( 9+T 9j( :+j 9(1T s:+ ", -"9E 9&E 9H 9Ha 91E :E 9H1 :H 9EK &E9K 9HT H&9T 9jE :jE 9Hj s:H 9d 9+d 9Hd g9", -" 9d1 :d 1H9d g: 9dK 9Kd& 9Td g9T 9dj :dj 1T9d g:s 92 9&2 92B 9a2 95 :5 95B ", -":5a 92K &29K 9T2 92T& 95j :5j 95T s:5 9; 9+; 9;B 9a; 95; :> 1B9; :>a 9;K 9K", -";& 9T; +T9; 9;j :>j 1T9; s:> 9E2 &E92 9H2 92H& 95E :5E 9H5 :H5 EK92 9&E2K H", -"T92 9HT&2 5j9E 5j:E H59T s5:H 9d; d&9; 9H; g9; 95d :>d 1H9; g:> dK9; d&;9K ", -"H;9T 9Tg; 5d9j >j:d H;9j s:g> 9N 9&N 9NB 9aN 91N :N 1B9N :aN 9Q 9Q& 9QT 9Qa", -" 9Q1 :Q 1Q9T s:Q 9(N 9+N (B9N +a9N 1(9N :+N 91(NB +a:N 9Q( 9+Q QT9( +Q9T 9(", -"1Q :Q+ 9Q1T( s+:Q 9W 9W& 9HW 9Wa 9W1 :W 1H9W :HW 9WQ W&9Q Z9 Z9a 9Wj :WQ Z9", -"1 Z: 9Wd 9+W HW9d g9W 1W9d :W+ 9H1Wd g:W 9Qd +W9Q Z9d gZ9 1Q9d :Qd 9dZ1 Z:g", -" 9m 9m& 9mB 9am 95m :m 1B9m :ma 9Qm Q&9m 9Tm Qa9m p9 :p p9T :ps 9m; 9+m m;9", -"B +m9a 1m9; :>m 95;mB :a>m 9Q; +Q9m Q;9T +T9m p9; :p> 9Tp; s>:p 9Wm W&9m 9H", -"m Hm9a 95W :W5 1H9m :Hm WQ9m 9WQm& Z9m 9aZm p9W :pW Zp9 Z:p v9 v9+ v9H gv9 ", -"v91 :v 9Hv1 :vg v9Q 9+vQ Zv9 Zvg9 pv9 :vp pvZ9 y: C0 !C0 D0 Da0 1C 18C 1D 1", -"D8 CK0 !0CK DT0 TaD0 1jC 8j1C 1DT s1D C0( +C0 D0( +D0 1C( 1+C 1D( 1+D 0(CK ", -"CK+0 T0D( DT+0 jC1( 1C+j 1(Dj 1+sD CE0 CE!0 HD0 DaH0 1CE 8C1E 1HD H81D C0EK", -" !E0CK DTH0 HDTa0 jC1E 18jCE Hj1D 1HsD dC0 dC+0 Dd0 gD0 1dC 1C8d 1Dd g1D CK", -"d0 +dC0K D0Td DTg0 1Cdj djC1+ Dd1T s1gD C02 C0!2 D02 D2a0 15C 581C 1D5 5D1a", -" C02K C02!K T2D0 DTa02 5j1C 158jC 5D1T 1Ds5 ;C0 ;C+0 D;0 +0D; 1;C >C1 1D; >", -"D1 CK;0 +;C0K D0T; a;0DT 1C;j 1j>C D;1T s1>D E0C2 C02!E D0H2 HDa02 5C1E 158", -"CE H51D 1H5D8 C02EK EK0!C2 HDT02 DTaH02 15jCE 58j1CE 1H5Dj s1H5D ;Cd0 +d;C0", -" H0D; D;g0 1C5d 1d>C H;1D >Dg1 dK;C0 dK;+C0 H;DT0 gDT;0 djC1; >j1dC 1H;Dj g", -"s>1D C0N C0!N D0N a0DN 1CN 8C1N 1DN 1ND8 QC0 !CQ0 QD0 DaQ0 1QC 1CQ8 1QD 1Qs", -"D 0(CN C0+N 0(DN D0+N C(1N +C1N D(1N 1N+D C0Q( QC+0 D0Q( +0QD QC1( 1C+Q 1(Q", -"D +Q1D WC0 !CW0 WD0 DaW0 1WC 1CW8 1WD WD1a QCW0 Q!WC0 ZD0 DaZ0 1CWj 1WQ8C Z", -"1D sDZ1 dCW0 WC+0 W0Dd WDg0 Wd1C 1C+W WD1d 1WgD dCQ0 +WQC0 DdZ0 ZDg0 1CQd 1", -"+WQC 1DZd gDZ1 mC0 !Cm0 Dm0 D0am 1mC 1C8m 1Dm D81m mCQ0 Q!mC0 Q0Dm am0QD p1", -"C 18pC pD1 s1pD ;Cm0 mC+0 m;D0 +0Dm m;1C 1m>C Dm1; 1D>m ;CQ0 +QmC0 Q0D; +QD", -"m0 1;pC p1>C 1Dp; p1>D mCW0 W!mC0 H0Dm am0WD 1C5W 1W58C Hm1D 1HmD8 WQmC0 Wm", -"CQ!0 DmZ0 ZDam0 1WpC p1W8C pDZ1 Zp1sD vC0 +Cv0 vD0 g0vD v1C >Cv1 v1D vDg1 Q", -"Cv0 v+QC0 Z0vD ZvDg0 pCv1 pv>1C v1pD y1D b9 b9& 9D c9 b1 :b b1D :c b9K 9&bK", -" bT9 c9T b1j :bj b1T s:c b9( b+9 9D( c9+ b1( :b+ b(1D :c+ 9(bK bK9+ b(9T 9+", -"cT b(9j b+:j b(1T s+:c b9E 9&bE bH9 c9H b1E :bE b1H :cH 9EbK b9&EK 9HbT 9Hc", -"T bE9j bj:E 9Hbj :Hsc bd9 9+bd 9Dd gc9 b1d :db 1Hbd g:c bK9d d&Kb9 9Tbd c9g", -"T 9dbj bd:j 1Tbd s:gc b92 9&b2 9D2 c29 b15 :b5 95D :c5 92bK b9&2K b29T 9Tc2", -" 95bj b5:j 95bT c5s: b;9 9+b; 9D; c;9 b1; :>b 1Db; c>: bK9; ;&Kb9 9Tb; 9Tc;", -" 9;bj :b>j 1Tb; s:c> 9Eb2 b9&E2 b29H 9Hc2 bE95 b5:E 9Hb5 c5:H b9E2K 9&EbK2 ", -"bH9T2 c29HT b15jE :b5jE b1H5T :cHs5 9db; d&;b9 9Hb; c;g9 95bd >b:d 1Hb; c>g", -": bd9;K bd9;&K bH;9T c;9gT b1d;j :>bdj b1HT; g:sc> b9N 9&bN 9DN c9N b1N :bN", -" bN1D :cN bQ9 b9Q& 9QD cQ9 b1Q :Qb 1QbT :cQ 9(bN bN9+ D(9N 9+cN 1(bN b+:N b", -"1D(N cN:+ b(9Q 9+bQ 9(QD 9+cQ b(1Q b+:Q b1QD( :+cQ bW9 b9W& 9WD cW9 b1W :Wb", -" 1HbW :cW 9WbQ bW9Q& Zb9 Zc9 9Wbj bW:Q Zb1 Z:c 9Wbd 9+bW WD9d cWg9 1Wbd b+:", -"W b1HWd :Wgc 9Qbd b+W9Q bdZ9 g9Zc 1Qbd bQ:d b1Zd Zcg: bm9 b9m& 9Dm cm9 b1m ", -":mb 1Dbm :cm 9Qbm bQ9m& 9Tbm 9Qcm pb9 :pb p9D cp: 9mb; 9+bm Dm9; 9+cm 1mb; ", -">b:m b1mD; :mc> 9Qb; b+Q9m QD9; 9Qc; b1p; pb:> 9Dp; c>:p 9Wbm bW9m& 9Hbm 9H", -"cm 95bW b5:W 1Hbm c5:W bW9Qm 9WQbm& bmZ9 cmZ9 b1pW pb:W pbZ9 cpZ: vb9 b+v9 ", -"v9D cv9 vb1 :vb b1vD :vc bQv9 vb9+Q vbZ9 Z9cv vbp9 pb:v vbZ1 y:c L !L LB aL", -" L. 8L .BL 8aL M M! TM aM Mj 8M TMj sM (L +L (BL +aL (L. +8L (L.B 8a+L M( +", -"M TM( +TM Mj( +M8 MjT( s+M EL !EL HL HaL EL. 8EL HL. H8L ME ME! HM HMa MjE ", -"8ME HMj sHM dL +dL HdL gL dL. 8dL dLH. g8L dM +Md HMd gM dMj 8dM dMHj gsM L", -"2 !L2 2BL aL2 5L 58L 5BL 5aL M2 M2! TM2 aM2 5M 5M8 5TM s5M ;L +;L ;LB a;L 5", -";L >L ;L5B >La M; +M; T;M aM; 5M; >M T;5M >Ms EL2 EL!2 HL2 aLH2 5EL 8E5L H5", -"L HL5a ME2 !EM2 HM2 H2aM 5ME 5E8M H5M H5sM d;L d;+L H;L g;L 5dL >Ld HL5d g>", -"L dM; +dM; HM; gM; 5dM >Md 5dHM >Mg LN !LN NBL aLN N.L 8LN LBN. aN8L QM Q!M", -" QTM QaM QMj Q8M TMQj sQM (LN +LN (LNB aL+N (LN. 8L+N (BLN. +8aLN QM( +QM T", -"MQ( Qa+M MjQ( Q8+M QTMj( +QsM WL W!L HWL WaL WL. W8L WLH. HLW8 WM WM! ZM Za", -"M WMj W8M ZMj sZM WdL +WL WdHL gWL dLW. +LW8 HWdL. W8gL WMd +WM ZdM gZM dMW", -"j W8+M dMZj sZgM mL mL! mLB amL 5mL 8mL mL5B 5Lam Mm Mm! TmM aMm pM p8M pTM", -" spM m;L +mL ;LmB +Lam m;5L >mL 5m;LB am>L Q;M +Mm MmT; Tm+M pM; >Mp T;pM s", -"p>M WmL mLW! HmL HLam 5WL 5LW8 HL5W HL8m WMm W!Mm ZMm aMZm pWM W8pM ZpM sMZ", -"p vL v+L vHL gvL v5L v>L H5vL >Lgv vM vM+ ZvM gvM pvM >Mv vMZp yM #L &L #BL", -" a&L #L. 8&L #L.B a&8L M# M& TM# T&M Mj# 8M& MjT# sM& #(L +&L #(LB a&+L (L#", -". 8&+L #L.(B +8a&L M#( +M& M#T( T&+M j#M( M&+j TMj#( +Ms& #EL &EL H#L H&L E", -"L#. &E8L #LH. 8&HL M#E M&E HM# HM& j#ME 8EM& MjH# HMs& d#L d&L d#HL g&L #Ld", -". 8Ld& Hd#L. 8&gL dM# dM& H#dM gM& Mjd# d&8M dMjH# sMg& #L2 &L2 #L2B &2aL 5", -"#L 5&L #B5L a&5L M#2 M&2 M#T2 T2M& 5M# 5M& TM5# 5Ms& ;#L ;&L #B;L aL;& ;#5L", -" >&L 5;#LB a&>L M;# M;& T#M; M;T& 5#M; >M& M;#5T sM>& EL#2 EL&2 #LH2 &LH2 #", -"E5L &E5L 5#HL HL5& #EM2 &EM2 M#H2 H2M& M#5E 5EM& H#5M 5MH& ;#dL dL;& ;#HL ;", -"&gL d#5L d&>L H5d#L g&>L d#M; M;d& H#M; M;g& 5#dM dM>& H5Md# >&gM #LN &LN #", -"LNB &LaN #LN. &L8N #LN.B 8a&LN QM# Q&M TMQ# aMQ& MjQ# 8MQ& QTMj# Q&sM (L#N ", -"&L+N #LN(B +a&LN #LN(. +8&LN N.#(BL 8a&+LN M#Q( Q&+M QTM#( +QTM& QMj#( +Q8M", -"& TMjQ#( s+QM& W#L W&L W#HL HLW& #LW. 8&WL HW#L. H8W&L WM# WM& ZM# Z&M MjW#", -" 8MW& MjZ# sMZ& d#WL +LW& HWd#L W&gL Wd#L. d&LW8 Wd#HL. gW8&L W#dM W&+M dMZ", -"# Z&gM dMjW# dM&W8 ZdMj# Z&Mgs m#L m&L #BmL aLm& m#5L 5Lm& 5m#LB am&5L Mm# ", -"Mm& T#Mm MmT& pM# p&M TMp# sMp& ;#mL +Lm& m;#LB am&+L 5m;#L m&>L m;#5BL >ma", -"&L Q#M; M;Q& Mm#T; aMm;& M;p# p&>M pTM;# >Mps& m#WL WLm& m#HL HLm& W#5L 5LW", -"& H5W#L H5&WL W#Mm MmW& MmZ# MmZ& WMp# WMp& pMZ# ZMp& v#L v&L H#vL gLv& 5#v", -"L >Lv& vH5#L gv>&L vM# vM& Z#vM vMZ& p#vM vMp& ZpvM# y&M U U! UD Ua U. U8 U", -"D. U8D UM U!M V Va Uj U8M Vj Vs U( U+ UD( U+D U(. U+8 D(U. +DU8 UM( U+M V( ", -"V+ Uj( U+j Vj( Vs+ UE U!E UH UHa UE. U8E UH. UH8 UME MEU! VH VHa UjE UE8M V", -"Hj VsH Ud U+d UHd gU Ud. U8d U.Dd gU8 UdM +MUd Vd gV Udj +jUd Vdj gVs U2 U!", -"2 UD2 Ua2 U5 U58 U5D U5a UM2 M2U! V2 V2a U5M 5MU8 V5 Vs5 U; U+; U;D Ua; U5;", -" >U 5DU; >UD U;M +MU; V; V+; U;j >MU V5; V> UE2 !EU2 UH2 HaU2 U5E 58UE UH5 ", -"H5U8 MEU2 U!ME2 V2H HaV2 UE5M U58ME V5H sHV5 Ud; +dU; UH; gU; U5d >Ud H5Ud ", -"g>U dMU; dM;U+ Vd; gV; 5dUj Ud>M V5d V>g UN U!N UDN UaN UN. U8N DNU. UND8 U", -"Q UQ! VQ VQa UQj UQ8 VQj VsQ U(N U+N D(UN UN+D N.U( +8UN UD(N. U+D8N UQ( U+", -"Q VQ( V+Q QjU( +QU8 QjV( sQV+ UW UW! UHW UWa UW. UW8 U.WD H8UW UWQ Q!UW VZ ", -"VZa UWj W8UQ VZj sZV UWd U+W WDUd gUW WdU. +WU8 UHWd. UWg8 UQd +WUQ VZd gVZ", -" WjUd +WUj ZjVd sZgV Um Um! UmD Uam U5m U8m 5DUm 5aUm UQm Q!Um Vm Vma pU pU", -"8 Vp Vps Um; U+m DmU; +DUm 5mU; >Um U5Dm; Ua>m UQ; +QUm Vm; V+m pU; p>U Vp;", -" V>p UWm W!Um UHm HmUa U5W 5WU8 H5UW H8Um WMUm Mm!UW VZm ZaVm pUW UWp8 VpZ ", -"sZVp vU vU+ vUH gvU vU5 v>U UHv5 v>gU vUQ U+vM Vv Vvg pvU v>pU Vvp yV bU U&", -" bUD cU bU. b8U UDb. cU8 bM bM& Vb Vc bMj b8M Vbj scV bU( b+U UDb( cU+ U(b.", -" U+b8 bUD(. U+c8 bM( b+M Vb( Vc+ b(Uj U+bj bjV( V+sc bUE U&E bHU cUH UEb. b", -"EU8 b.UH UHc8 bME bEM& VbH VcH bEUj bE8M bHVj sHVc bdU Ud& UHbd gcU b.Ud U8", -"bd bHUd. cUg8 bdM +Mbd Vdb gVc Udbj 8dbM bdVj scgV bU2 U&2 UDb2 c2U b5U U5&", -" bU5D c5U bM2 b2M& V2b Vc2 b5M 5Mb8 V5b c5V b;U U;& bUD; c;U U5b; >bU b5UD;", -" c>U bM; +Mb; V;b c;V U;bj >Mb b5V; V>c UEb2 &EU2 b2UH UHc2 bEU5 UE5& UHb5 ", -"UHc5 MEb2 M&Eb2 bHV2 cHV2 bE5M b5M8E bHV5 cHV5 Udb; d&U; UHb; c;gU U5bd bd>", -"U bH5Ud gUc> dMb; dM&b; bHV; c;gV 5dbM bd>M b5Vd c>gV bUN U&N UDbN cUN UNb.", -" bNU8 bUDN. U8cN bQU UQ& VbQ cQV UQbj UQb8 bQVj VscQ U(bN bNU+ bUD(N U+cN b", -"U(N. b+U8N UD(bN. cU+8N b(UQ U+bQ bQV( V+cQ bQUj( b+QU8 VbQj( cQVs+ bWU UW&", -" UHbW cWU b.UW UWb8 bHUW. UWc8 bWM WMU& ZbV ZcV UWbj W8bM VbZj VZsc UWbd U+", -"bW bHUWd cWgU bWUd. b+WU8 UHWbd. cWUg8 UQbd +WbM VdZb ZcgV bWMdj d&jUW ZbVd", -"j gVZsc bmU Um& bUDm cmU U5bm U8bm b5UDm U5cm bMm Q&Um Vmb cmV pbU pU& Vpb ", -"cpV Umb; U+bm bmUD; U+cm b5Um; bm>U U5Dbm; >Ucm UQb; +Mbm bQV; V+cm bMp; pb", -">M V;pb V>cp UWbm W&Um UHbm UHcm U5bW 5WU& bH5UW U5cW WMbm Mm&bW VmZb VZcm ", -"bWpU UWp& ZbVp VpZc vbU vU& bHvU cvU b5vU >bvU vbUH5 vUc> vbM b+vM Vvb cvV ", -"vbpU vb>M pbVv yVc k k! kB ak 1k 8k 1kB 1ak kM kM! Tk Tka l l8 lT ls k( +k ", -"k(B +ka 1k( 1+k k(1B +k1a kM( +kM Tk( +Tk l( l+ lT( ls+ kE kE! Hk Hka 1kE 8", -"kE 1Hk H8k kME M!kE HkT akHM lE l8E lH lsH dk +kd Hkd gk 1dk 8dk Hk1d g1k d", -"kM dk+M Tdk gkT ld l+d lHd gl k2 k2! k2B ak2 5k 5k8 5kB 5ak kM2 M!k2 Tk2 T2", -"ak l5 l58 l5T ls5 k; +k; k;B ak; 1;k >k 1Bk; >ka k;M k;+M Tk; T;+k l; l> l;", -"T l>s kE2 !Ek2 Hk2 H2ak 5kE 5E8k H5k 5aHk MEk2 kME!2 H2Tk ak2HM l5E 58lE lH", -"5 sHl5 dk; +dk; Hk; gk; 5dk >kd Hk1; >kg k;dM dkM+; TkH; Tkg; ld5 l>d lH; g", -"l> kN kN! kNB akN 1kN 8kN kN1B 1Nak Qk Qk! QkT Qak lQ lQ8 lQT lsQ k(N +kN (", -"BkN +Nak k(1N 1N+k 1k(NB akN1+ Qk( +Qk Q(Tk Qa+k lQ( l+Q QTl( s+lQ Wk Wk! H", -"kW Wak 1Wk W8k Hk1W W8Hk WkQ Q!Wk Zk Zka lW lW8 lZ lZs Wkd +Wk HWdk gkW Wk1", -"d +k1W 1HWdk 1Wgk Qdk Wk+Q Zkd gZk lWd l+W lZd glZ km km! kmB akm 1mk 8km 1", -"Bkm ak1m Qkm Q!km Tkm akTm lp lp8 lpT lsp km; +km m;kB ak+m km1; >km km;1B ", -"ak>m Qk; Qk+m TkQ; Tk+m l;p l>p pTl; spl> Wkm W!km Hkm akHm 5Wk W85k Hk1m W", -"a5k kmWM km!WM Zkm akZm lWp pWl8 lZp splZ vk vk+ vkH gvk v1k >kv 1Hvk gv>k ", -"vkQ +Qvk Zvk Zvgk lv lv> lvZ yl 9k k& 9kB 9ak 91k :k 1B9k :ak 9M 9M& 9Tk 9a", -"M l9 l: l9T ls: 9k( 9+k k(9B +k9a 1k9( :+k 91k(B +k:a 9M( 9+M 9(Tk +T9M l9(", -" l:+ 9Tl( s:l+ 9kE k&E 9Hk Hk& 1k9E :kE 91Hk :Hk 9ME 9EM& 9HM HM9a l9E l:E ", -"lH9 l:H 9dk dk& Hk9d g9k 91dk :dk 9H1dk g:k 9dM +M9d HM9d g9M ld9 l:d 9Hld ", -"gl: 9k2 k&2 k29B 92ak 95k :5k 9B5k 5a:k 9M2 92M& 92Tk 92aM l95 l:5 95lT l5s", -": 9;k k;& 9Bk; ak9; 5k9; >k: k;B95 :a>k 9M; +M9; Tk9; aM9; l;9 l>: 9Tl; s:l", -"> kE92 &Ek2 92Hk H2k& 9E5k 5k:E Hk95 H5:k ME92 k&EM2 92HM 9HM&2 95lE :5lE 9", -"Hl5 l5:H dk9; k;d& Hk9; 9;gk 5k9d :d>k 9H5dk >kg: dM9; dk&M; HM9; 9Mg; 95ld", -" :>ld 9Hl; g:l> 9kN k&N kN9B 9Nak 1k9N :kN 91kNB ak:N 9Qk Qk& Qk9T Qa9M l9Q", -" l:Q 9QlT :Qls k(9N 9N+k 9k(NB akN9+ 91k(N +k:N 1k(9NB :+akN 9(Qk +Q9M 9QTk", -"( 9+QTk 9Ql( :Ql+ l9QT( :Q+ls 9Wk Wk& Hk9W Wk9a 91Wk :Wk 9H1Wk Hk:W 9WM W&9", -"M Z9k Zk& lW9 l:W lZ9 Z:l Wk9d +k9W 9HWdk 9Wgk 9W1dk +W:k 1HW9dk :Wgk WM9d ", -"+W9M 9dZk Z9gk 9Wld :Wl+ Z9ld Z:gl 9mk km& 9Bkm ak9m 5k9m :mk kmB95 ak:m 9M", -"m kmQ& Tk9m aM9m p9l :pl lTp9 ls:p km9; +k9m km;9B akm9+ km;95 :m>k 95;kmB ", -":>akm Qk9; +M9m 9Q;Tk ak;9Q p9l; :pl> l;p9T l>ps: Wk9m kmW& Hk9m kmH& 5k9W ", -"5W:k 9H5Wk Hk:m WM9m km&WM 9MZm kmZ& p9lW lW:p p9lZ lZ:p v9k vk& 9Hvk v9gk ", -"95vk :vk v91Hk gk:v v9M 9+vM v9Zk v9gM lv9 lv: Z9lv yl: Uk U!k Dk Uak 1U 1U", -"8 1UD 1Ua UkM kMU! Vk Vak lU lU8 Vl lsV Uk( U+k Dk( +Dk 1U( 1U+ 1(Dk U+1D k", -"MU( Uk+M Vk( V+k lU( l+U Vl( l+V UkE kEU! UHk HkUa 1UE 1EU8 1UH UH1a kMUE U", -"!kME VHk HkVa lUE U8lE lHV VslH Udk +kUd Ddk gUk 1Ud U+1d UH1d g1U UkdM dkM", -"U+ Vdk gVk ldU U+ld ldV glV Uk2 k2U! Dk2 U2ak 1U5 5kU8 5Dk U51a kMU2 U!kM2 ", -"V2k akV2 lU5 U5l8 Vl5 V5ls U;k +kU; Dk; D;+k 1U; >kU U;1D >kD UkM; k;MU+ V;", -"k +kV; l;U l>U l;V V>l kEU2 U!kE2 U2Hk ak2UH 1EU5 1U58E U51H 1UH5a UkME2 kM", -"EU!2 HkV2 V2Hak U5lE lU58E V5lH lsVH5 dkU; dk;U+ HkU; U;gk U51d 1U>d UH1; g", -"U>k dkMU; U+dk;M HkV; V;gk U5ld >Uld V5ld V>gl UkN kNU! DkN UNak 1UN 1NU8 1", -"NDk 1NUa UQk U!Qk VQk QaVk lUQ UQl8 VlQ lQVs k(UN UN+k k(DN +NDk U(1N 1NU+ ", -"1UD(N 1U+DN U(Qk +kUQ QkV( +QVk UQl( U+lQ VQl( lQV+ UWk U!Wk WDk WkUa 1UW U", -"81W UH1W UW1a WkUQ UWQk! ZkV VaZk lWU UWl8 lZV VlsZ WkUd +kUW DdWk UWgk UW1", -"d U+1W 1UHWd 1UgW QkUd U+WQk VdZk ZkgV UWld U+lW VZld lZgV Umk U!km Dkm akU", -"m 1Um U81m Um1D Ua1m QkUm km!UQ Vmk akVm pUl l8pU Vpl lsVp kmU; +kUm kmD; D", -"k+m Um1; 1U>m 1UmD; Dk>m QkU; U+Qkm QkV; +kVm pUl; pUl> l;Vp Vpl> WkUm km!U", -"W HkUm akmUH U51W 1UW8m UH1m 1UH8m UWQkm UWQkm! VmZk ZkVam pUlW lWpU8 lZVp ", -"VplsZ vUk U+vk vDk vUgk v1U vU>k 1UvD v1gU UQvk vU+Qk Vvk gkVv lvU vUl> lvV", -" ylV t t& tD tc t1 t: t1D t:c tM tM& Vt tcV lt lt: ltV u t( t+ tD( tc+ t1( ", -"t:+ 1Dt( :ct+ tM( t+M Vt( t+V lt( lt+ l(Vt u+ tE t&E tH tcH t1E t:E tH1 t:H", -" tME M&tE tHV VctH ltE lEt: ltH uH td t+d tHd gt td1 t:d 1Htd gt: tdM +Mtd ", -"tdV gtV ltd t:ld tHld ug t2 t&2 tD2 tc2 t5 t:5 t5D tc5 tM2 M&t2 Vt2 V2tc lt", -"5 t5l: t5V u5 t; t+; t;D tc; t5; t> 1Dt; t>c t;M +Mt; t;V Vtc; lt; t>l Vlt;", -" u> tE2 &Et2 tH2 c2tH t5E :5tE tH5 :Ht5 MEt2 tM&E2 V2tH tcVH2 lEt5 t:5lE t5", -"lH uH5 td; d&t; tH; gt; t5d t>d 1Ht; gt> dMt; t+dM; Vdt; t;gV t5ld ldt> tHl", -"; ug> tN t&N tDN tcN t1N t:N 1DtN tN:c tQ tQ& tQV tcQ ltQ t:Q VltQ uQ t(N t", -"+N D(tN c+tN 1(tN :+tN t1D(N t:c+N tQ( t+Q VQt( cQt+ l(tQ tQl+ tQVl( u+Q tW", -" tW& tHW tcW tW1 t:W 1HtW :ctW tWQ WMt& tZ tZc ltW t:lW tZl uZ tWd t+W WDtd", -" gtW 1Wtd :Wt+ tH1Wd tWg: tQd +WtQ tZd gtZ tWld t+lW ldtZ uZg tm tm& tmD tc", -"m t5m t:m 1Dtm :ctm tQm Q&tm tmV cQtm tp tp: tpV up tm; t+m Dmt; cmt+ 1mt; ", -"t>m t5Dm; tmc> tQ; +Qtm Vmt; cQt; tp; tp> t;Vp up> tWm W&tm tHm cWtm t5W :W", -"t5 1Htm :Htm WMtm tWQm& tZm tmZc tpW tW:p tZp uZp tv tv+ tvH gtv tv1 tv: v1", -"tH :vgt tvQ vMt+ tZv cvtZ lvt t>lv tZlv yu ) !) )B a) ). 8) .B) 8a) )K !K) ", -"T) Ta) j) 8j) Tj) s) * +* *B a* *. 8* *B. 8*a *K +*K T* +T* *j +j* T*j s* E", -") !E) H) Ha) E). 8E) H). H8) EK) !)EK HT) TaH) jE) jE8) Hj) sH) d* +d* H* g", -"* d*. 8d* H*. g8* dK* dK+* H*T gT* dj* dj8* H*j gs* )2 !)2 2B) a)2 5) 58) 5", -"B) 5a) 2K) !)2K T)2 T2a) 5j) 8j5) 5T) s5) ;* +;* *B; a;* 5* >* 5*B >*a ;*K ", -";*+K T;* a;T* 5*j >*j 5T* s>* E)2 E)!2 H)2 a)H2 5E) 8E5) H5) H)5a E)2K !)2E", -"K T)H2 HTa)2 jE5) 58jE) H)5T H5s) d;* d;+* H;* g;* 5d* >*d H5* g>* ;*dK +d;", -"*K T;H* T;g* dj5* dj>* 5TH* s*g> )N !)N )BN a)N N.) 8)N )BN. aN8) Q) Q!) QT", -") Qa) Qj) Q8) TjQ) sQ) *N +*N *BN a*N *N. 8*N .B*N aN8* Q* +Q* Q*T Qa* Q*j ", -"Q8* QT*j s*Q W) W!) HW) Wa) W). W8) W)H. H)W8 WQ) W)Q! Z) Za) Wj) W)Q8 Zj) ", -"sZ) W* +W* H*W gW* W*. W8* H.W* W8g* W*Q W*+Q Z* gZ* W*j W*+j Z*j sZ* m) m)", -"! m)B am) 5m) 8m) m)5B 5)am Qm) m)Q! Tm) Q)am p) p8) pT) sp) m* +m* m*B am*", -" 5*m >m* 5m*B am>* Q;* Q*+m Tm* T*+m p* p>* p*T sp* Wm) m)W! Hm) H)am 5W) 5", -")W8 H)5W H)8m QmW) Q!Wm) Zm) amZ) pW) W8p) Zp) s)Zp v* v+* vH* gv* v5* v>* ", -"H5v* >*gv vQ* +Qv* Zv* Z*gv pv* v>p* Zp* y* , ,& ,B ,a ,. ,8 ,.B ,8a ,K ,&K", -" ,T ,Ta ,j ,8j ,Tj s, ,* - *B, -a ,*. -8 ,.*B -8a ,*K -K ,T* -T ,j* -j T*,j", -" s- ,E ,&E ,H ,Ha ,E. ,8E ,H. ,H8 ,EK &E,K ,HT H&,T ,jE ,E&j ,Hj s,H ,d -d ", -",Hd g- ,d. -8d ,.H* g-8 ,dK -dK ,Td g-T ,dj -jd H*,j s-g ,2 ,&2 ,2B ,a2 ,5 ", -",58 ,5B ,5a ,2K &2,K ,T2 ,2T& ,5j 5&,j ,5T s,5 ,; -; ,;B -a; ,5; -> *B,5 ->", -"a ,;K -;K ,T; -T; ,;j ->j 5T,; s-> ,E2 &E,2 ,H2 ,2H& ,5E ,E5& ,H5 H5,8 EK,2", -" ,&E2K HT,2 ,HT&2 5j,E &jE,5 H5,T ,Hs5 ,d; -d; ,H; g-; ,5d ->d H5,d g-> dK,", -"; dK-; H;,T g;-T 5d,j -d>j H;,j g>s- ,N ,&N ,NB ,aN ,N. ,8N .B,N 8a,N ,Q ,Q", -"& ,QT ,Qa ,Qj ,Q8 QT,j s,Q ,*N -N ,N*B -aN *N,. -8N *B,N. 8a-N ,Q* -Q Q*,T ", -"-QT Q*,j -Q8 ,QT*j s-Q ,W ,W& ,HW ,Wa ,W. ,W8 HW,. H8,W ,WQ W&,Q Z, Z&, ,Wj", -" W8,Q Z,j sZ, ,Wd -W H*,W g-W ,.W* -W8 ,HWd. g8-W ,Qd -WQ Z*, Z- W*,j -Wj ,", -"dZj Z-s ,m ,m& ,mB ,am ,5m ,8m 5m,B 5a,m ,Qm Q&,m ,Tm Qa,m p, p&, p,T sp, ,", -"m; -m *B,m -ma 5*,m ->m m*B,5 -a>m ,Q; -Qm Q;,T -Tm p*, -p ,Tp* -ps ,Wm W&,", -"m ,Hm Hm,a ,5W 5W,8 H5,W H8,m WQ,m ,WQm& Z,m ,aZm p,W ,Wp& Zp, Zps, v, -v v", -",H -vg v,5 -v> ,Hv5 g>-v v,Q -vQ Zv, Z-v pv, -pv pvZ, y- C) !C) D) Da) C). ", -"8C) D). D8) CK) !)CK DT) TaD) jC) jC8) Dj) sD) *C +*C D* +D* *C. 8*C D*. D8", -"* *CK *C+K D*T D*+T *jC +C*j D*j s*D CE) CE!) HD) DaH) E)C. CE8) D)H. H)D8 ", -"C)EK CE)!K DTH) HDTa) CEj) 8jCE) H)Dj HDs) d*C d*+C H*D gD* *Cd. d*8C H.D* ", -"D8g* *CdK +d*CK TdD* D*gT dC*j dj*+C D*Hj gDs* C)2 C)!2 D)2 D2a) 5C) 8C5) 5", -"D) 5)D8 C)2K !)2CK T2D) DTa)2 jC5) 58jC) 5)Dj 5Ds) ;*C ;*+C D;* a;D* 5*C >*", -"C 5D* >D* *C;K +;*CK T;D* a;*DT 5C*j *j>C D*5T >Ds* E)C2 CE)!2 D)H2 HDa)2 C", -"E5) 58CE) H)5D H5D8) CE)2K EKC!)2 HDT)2 DTaH)2 5jCE) 8jC5E) H5DT) sH5D) ;*d", -"C +d;*C D;H* D;g* d*5C d*>C 5DH* gD>* dK;*C dK;+*C H;DT* gDT;* dj*5C >*djC ", -"H5*Dj >D*gs C)N C)!N D)N a)DN C)N. C)8N N.D) 8)DN QC) !CQ) QD) DaQ) jCQ) 8C", -"Q) Q)Dj QDs) *CN *C+N D*N +ND* N.*C *C8N *ND. DN8* Q*C +CQ* QD* Q*+D QC*j Q", -"C8* DjQ* QDs* WC) !CW) WD) DaW) C)W. 8CW) D)W. W)D8 QCW) Q!WC) ZD) DaZ) jCW", -") W8QC) DjZ) ZDs) W*C +CW* WD* WDg* *CW. WC8* W.D* D8W* WCQ* +WQ*C Z*D gDZ*", -" WC*j +Wj*C D*Zj sDZ* mC) !Cm) Dm) D)am mC5) mC8) 5)Dm D)8m mCQ) Q!mC) Q)Dm", -" am)QD pC) 8Cp) pD) s)pD m*C +Cm* Dm* D*+m 5Cm* m*>C Dm5* Dm>* QCm* m*C+Q D", -"mQ* am*QD p*C >Cp* pD* pDs* mCW) W!mC) H)Dm am)WD WC5) 5W8C) 5)WD H8mD) WQm", -"C) WmCQ!) DmZ) ZDam) WCp) pW8C) Z)pD ZpDs) v*C +*vC vD* g*vD 5*vC v*>C 5Dv*", -" >*vD Q*vC v+Q*C vDZ* ZvDg* v*pC pv>*C pDZ* y*D ,b ,b& ,D c, ,b. ,8b ,D. c8", -", ,bK bK,& ,DT cT, ,jb b8,j ,Dj sc, b* -b ,D* c- b*. -b8 ,.D* c-8 b*K -bK b", -"T* c-T b*j -jb D*,j s-c ,bE b&,E ,Hb cH, bE,. ,Eb8 ,.bH ,Hc8 bK,E ,b&EK bH,", -"T ,HcT ,Ebj &jE,b bH,j cHs, ,db -bd ,Dd gc- ,.bd b8-d ,.Dd g8c- ,Kbd bd-K b", -"T,d -Tgc bd,j bd-j H*bj gcs- ,b2 b&,2 ,D2 c2, ,5b b5,8 ,5D c5, bK,2 ,b&2K ,", -"2bT ,Tc2 b5,j ,5b&j b5,T c5s, ,;b -b; ,D; c-; b5* ->b 5D,; c>- ,Kb; b;-K bT", -",; -Tc; b;,j >b-j 5Tb* c>s- bE,2 ,b&E2 ,2bH ,Hc2 ,Eb5 ,5b8E bH,5 ,Hc5 ,bE2K", -" bK&,E2 ,HbT2 c2H,T ,5bjE ,5b&jE ,H5bT s,Hc5 bd,; bd-; bH,; c;g- b5,d -d>b ", -"H5b* g-c> ,db;K -bd;K ,H;bT c-Tg; ,5dbj ->bdj ,H;bj s-gc> ,bN b&,N ,DN c,N ", -"bN,. ,Nb8 DN,. ,8cN ,Qb ,bQ& ,QD cQ, bQ,j bQ,8 QD,j cQs, b*N -bN ,ND* c-N *", -"Nb. b8-N ,D*N. -8cN bQ* -Qb QDb* c-Q Q*bj bQ-j ,QD*j cQs- ,Wb ,bW& ,WD cW, ", -",.bW bW,8 ,.WD ,Wc8 bW,Q ,WbQ& Zb, Zc, bW,j ,W8bQ ,DZj s,Zc bW* -Wb H*bW c-", -"W b.W* bW-8 ,WDd. c8-W bQ,d bW-Q Zb* Z-c W*bj bW-j b*Zj Zcs- ,mb ,bm& ,Dm c", -"m, b5,m b8,m 5D,m ,5cm bQ,m ,Qbm& bT,m ,Qcm pb, ,8pb pD, cp, bm* -mb Dm,; c", -"-m 5*bm >b-m ,5Dm* ->cm bQ,; bQ-m QD,; -Qcm pb* -pb ,Dp* cp- bW,m ,Wbm& bH,", -"m ,Hcm b5,W ,5Wb8 5W,D ,5cW ,WbQm bWQ,m& ,DZm cmZ, ,Wpb pbW,8 pbZ, Z,cp vb*", -" -vb vD, cv- ,5vb vb-> ,5vD -vc> ,Qvb vb-Q vbZ* cvZ- vbp* pb-v pbZ* yc- 0) ", -"!0) )B0 a0) 1) 18) 1)B 1a) 0)K 0)!K T0) a0T) 1j) 8j1) 1T) s1) *0 +*0 *B0 a*", -"0 1* 1+* 1*B 1a* *0K *0+K T*0 +0T* 1*j +j1* 1T* s*1 E0) E0!) H0) a0H) 1E) 8", -"E1) 1H) 1)H8 0)EK !E)0K T0H) HTa0) jE1) 18jE) 1)Hj 1Hs) d*0 d*+0 H*0 g*0 1d", -"* 8d1* 1H* g1* *0dK +d*0K H0T* T*g0 dj1* dj*1+ H*1T s*g1 0)2 0)!2 0)2B 0)a2", -" 15) 581) 5B1) 1)5a 0)2K 0)2!K 0)T2 Ta0)2 5j1) 158j) 1)5T 15s) ;*0 ;*+0 ;0*", -"B ;*a0 1;* >*1 *B1; 1a>* *0;K +;*0K ;*T0 a;*T0 ;j1* 1*>j 5T1* s1>* 0)E2 0)2", -"!E 0)H2 Ha0)2 5E1) 158E) 1)H5 1H58) 0)2EK EK0!)2 HT0)2 Ta0H)2 15jE) 58j1E) ", -"1H5T) s1H5) ;*d0 +d;*0 ;*H0 ;*g0 5d1* 1d>* H51* >*g1 dK;*0 dK;+*0 H;T*0 gT;", -"*0 dj*1; >*1dj 1H;T* s*1g> 0)N 0)!N 0)NB 0)aN 1)N 8)1N )B1N a)1N Q0) !0Q) T", -"0Q) a0Q) 1Q) 1)Q8 QT1) 1Qs) *0N *0+N 0B*N *0aN 1*N 1N8* 1N*B 1Na* Q*0 +0Q* ", -"Q0T* Q0a* 1Q* +Q1* Q*1T 1Qs* W0) !0W) W0H) a0W) 1W) 1)W8 HW1) 1)Wa Q0W) Q!W", -"0) Z0) a0Z) 1)Wj 1WQ8) Z1) s)Z1 W*0 +0W* H0W* W*g0 1W* +W1* H*1W 1Wg* W0Q* ", -"+WQ*0 Z*0 g0Z* W*1Q 1+WQ* Z1* Z1s* m0) !0m) )Bm0 m0a) 1m) 1)8m m)1B 1)am m0", -"Q) Q!m0) m0T) am0Q) p1) 18p) 1Tp) p1s) m*0 +0m* m0*B a0m* 1m* 1m>* *B1m am1", -"* Q0m* m*0+Q T0m* am*Q0 p*1 p1>* 1Tp* s1p* m0W) W!m0) m0H) am0H) 1)5W 1W58)", -" 1)Hm 1Hm8) WQm0) Wm0Q!) m0Z) Zam0) 1Wp) p1W8) p1Z) Zp1s) v*0 +*v0 H*v0 v*g", -"0 v1* >*v1 1Hv* g*v1 Q*v0 v+Q*0 v*Z0 Zv*g0 v1p* pv>1* p*Z1 y*1 ,9 ,9& ,9B ,", -"a9 ,1 :, ,1B :a, ,9K 9&,K ,T9 9T,a ,1j :j, ,1T s:, 9* -9 9*B -9a ,1* :- *B,", -"1 :-a 9*K -9K 9T* -T9 9*j :-j 1T9* s-: ,9E 9&,E ,H9 9H,a ,1E :,E ,1H :H, 9E", -",K ,9&EK 9H,T ,H9T& ,E9j ,j:E 9H,j :Hs, ,d9 -9d 9H* g-9 ,1d :-d 1H,d g:- ,K", -"9d 9d-K 9T,d -Tg9 9d,j -j:d 1T,d s-g: ,92 9&,2 92,B ,29a ,15 :5, ,B95 ,5:a ", -"92,K ,9&2K ,29T ,T9&2 95,j ,5:j 95,T :5s, ,;9 -9; *B9; 9a-; ,1; :-> *B95 :a", -"-> ,K9; 9;-K 9T,; 9T-; 9;,j -j:> 1T,; :-s> 9E,2 ,9&E2 ,29H ,H9&2 ,E95 ,5:E ", -"9H,5 ,H:5 ,9E2K 9&E,2K ,H9T2 9HT,a2 ,15jE :5j,E ,1H5T s,H:5 9d,; 9d-; 9H,; ", -"-9g; 95,d ->:d 1H,; :-g> ,d9;K -9d;K ,H;9T -T9g; ,1d;j :->dj ,1HT; g:s-> ,9", -"N 9&,N 9N,B ,N9a ,1N :,N 1N,B ,a:N ,Q9 ,9Q& 9Q,T 9Q,a ,1Q :Q, 1Q,T :Qs, 9*N", -" -9N 9N*B 9a-N ,N1* :-N ,1*NB -a:N 9Q* -Q9 Q*9T 9Q-T 1Q9* :-Q ,1QT* :Qs- ,W", -"9 ,9W& 9H,W 9W,a ,1W :W, 1H,W ,H:W 9W,Q ,W9Q& Z9, ,aZ9 9W,j ,W:Q Z1, Z:, 9W", -"* -W9 H*9W -Wg9 1W,d :-W ,1HW* :Wg- 9Q,d 9W-Q Z9* Z-9 1Q,d -W:Q ,1Z* Z:- ,m", -"9 ,9m& ,B9m 9a,m ,1m :m, ,B1m ,a:m 9Q,m ,Q9m& 9T,m ,Qa9m p9, :p, ,1pT s,:p ", -"9m* -m9 *B9m 9a-m 1m,; :-m ,1m*B :a-m 9Q,; 9Q-m Tm9* 9T-m p9* -p: 9Tp* :ps-", -" 9W,m ,W9m& 9H,m ,Hm9a 95,W ,5:W 1H,m ,H:m ,W9Qm 9WQ,m& ,mZ9 Z9a,m ,1pW p,:", -"W p9Z, Z,:p v9* -v9 ,Hv9 g9-v v1, :v- ,1vH -vg: ,Qv9 v9-Q v9Z* Z9-v v9p* -p", -":v p9Z* y:- C0) C0!) D0) a0D) 1C) 8C1) 1D) 1)D8 0)CK C0)!K T0D) DTa0) jC1) ", -"18jC) 1)Dj 1Ds) *C0 *C+0 D*0 +0D* 1*C 1C8* 1D* +D1* CK*0 +*C0K D0T* a*0DT 1", -"C*j *jC1+ D*1T 1Ds* E0C) C0)!E D0H) HDa0) CE1) 18CE) HD1) 1HD8) C0)EK EK)!C", -"0 HDT0) DTaH0) 1jCE) 8jC1E) 1HDT) s1HD) *Cd0 +d*C0 H0D* D*g0 d*1C 1+d*C H*1", -"D 1Dg* dK*C0 dK*+C0 H*DT0 gDT*0 dj*1C 1+d*jC 1H*Dj s*1gD 0)C2 C02!) 0)D2 Da", -"0)2 5C1) 158C) 1)5D 1D58) C02)K 2K!C0) DT0)2 Ta0D)2 15jC) 58j1C) 1D5T) s15D", -") *C;0 +;*C0 ;*D0 a;*D0 1C5* 1*>C 5D1* 1D>* ;*C0K ;*C+0K D;T*0 D;Ta*0 ;jC1*", -" >*1jC 1D;T* >D*s1 C02E) !E)C02 HD0)2 Da0H)2 15CE) 58C1E) 1H5D) H5D1a) EKC0", -")2 0)C2EK! DT0H)2 0)T2HDa 5jC1E) 5C1)8jE H5D1T) 1H5sD) d;*C0 d;*+C0 H;D*0 g", -"D;*0 1d5*C >*1dC 1H;D* >D*g1 ;*CdK0 dK+*;C0 D;TH*0 D;Tg*0 1d5*jC dj*>C1 H;j", -"1D* gs1>D* 0)CN C0N!) 0)DN Da0)N C)1N 18C)N D)1N 1D8)N C0Q) Q!C0) D0Q) QDa0", -") QC1) 1Q8C) 1)QD s1QD) C0*N +*C0N *0DN a*0DN *C1N 1+*CN 1ND* 1+D*N *CQ0 +Q", -"*C0 Q0D* +QD*0 1CQ* 1+Q*C QD1* s*1QD C0W) W!C0) D0W) WDa0) WC1) 1W8C) 1)WD ", -"1WD8) WQC0) WC0Q!) D0Z) ZDa0) 1WQC) W8C1Q) 1DZ) Z1Ds) *CW0 +W*C0 W0D* gWD*0", -" 1CW* 1+W*C WD1* g1DW* W*QC0 W*C+Q0 D*Z0 Z*Dg0 1W*QC *jC1+W 1DZ* Z1*gD C0m)", -" mC0!) m0D) am0D) mC1) 1m8C) 1)Dm 1Dm8) QmC0) mC0Q!) QDm0) QD0am) 1Cp) p18C", -") 1Dp) pD1s) *Cm0 m*C+0 D0m* am*D0 1Cm* >m1*C Dm1* >Dm1* m*CQ0 +QCm*0 QD;*0", -" am0QD* 1*pC p>1*C 1Dp* p>D1* WmC0) mC0W!) HmD0) WD0am) 1W5C) W8C1m) 1HmD) ", -"am)1WD QmCW0) QCW0m)! ZDm0) am0ZD) p1WC) 1W8pC) Zp1D) sZ1pD) *Cv0 v+*C0 D*v", -"0 gvD*0 1*vC v>1*C 1Dv* gv1D* vQ*C0 +Q*vC0 ZvD*0 gvDZ*0 pv1*C v>1p*C Zp*1D ", -"1Dy* ,b9 b9,& ,D9 c9, ,1b :b, ,1D :c, b9,K ,b9&K 9D,T ,Tc9 b1,j ,j:b b1,T :", -"cs, b*9 -b9 9D* c-9 b1* :-b 1Db* :c- bK9* b9-K 9Tb* c9-T 9*bj :b-j 1Tb* :cs", -"- b9,E ,b9&E 9H,D ,Hc9 ,Eb1 ,b:E b1,H cH:, ,b9EK b9&,EK ,H9bT c9H,T ,1bjE :", -"bj,E ,1HbT s,H:c 9db* bd-9 9Hb* c-g9 b1,d -b:d 1Hb* :cg- ,db9K -b9dK ,Dd9T ", -"c-9gT ,1dbj :-bdj ,1DTd g:sc- b9,2 ,b9&2 ,29D ,9c2 b1,5 ,5:b 95,D :,c5 ,b92", -"K b9&,2K ,D9T2 c29,T ,1b5j :b5,j ,1D5T s,5:c 9;b* b;-9 9D,; -9c; b1,; >b:- ", -"1D,; :-c> ,;b9K -b9;K ,D;9T c-9T; ,1;bj :->bj ,1DT; s-:c> ,b9E2 b9&,E2 ,H9b", -"2 c29,H ,1b5E :b5,E ,1Hb5 :cH,5 b9E,2K b9,&EK2 bH9,T2 ,H9c2T b15,jE ,5b:jE ", -"b1H,5T :cHs,5 ,db9; -b9d; ,H;9D c-9g; ,1db5 :->bd ,1Hb; g:c-> bd9,;K bd9-;K", -" 9H;bT* -T9gc; b1d,;j ->b:dj b1H,T; s-cg:> b9,N ,b9&N ,N9D ,9cN ,Nb1 ,b:N ,", -"N1D cN:, ,b9Q ,Qb9& 9Q,D ,Qc9 b1,Q ,Q:b 1Q,D :,cQ bN9* b9-N 9ND* -9cN bN1* ", -"-b:N ,1D*N cN:- 9Qb* bQ-9 QD9* c9-Q 1Qb* :b-Q ,1QD* c-:Q ,b9W ,Wb9& 9W,D ,W", -"c9 b1,W ,W:b 1W,D :,cW ,Wb9Q bW9,Q& ,DZ9 c9Z, ,1WbQ :Wb,Q ,1Zb :cZ, 9Wb* bW", -"-9 WD9* c9-W 1Wb* :b-W ,1WDd c-:W ,Qdb9 -Wb9Q b*Z9 c-Z9 ,1Qbd :-WbQ b1Z* :c", -"Z- ,b9m ,mb9& 9D,m ,mc9 b1,m ,m:b 1D,m :,cm ,Qb9m bQ9,m& ,QD9m cQ9,m ,1pb :", -"bp, ,1pD p,:c 9mb* bm-9 Dm9* c9-m 1mb* :b-m ,1Dm* c-:m ,Q;b9 -Qb9m ,QD9; c-", -"Q9m b1p* pb:- 9Dp* :c-p ,Wb9m bW9,m& ,Hm9D cW9,m ,1Wb5 :Wb,5 ,1Hbm :cW,5 bW", -"9,Qm WQ9m,b& Zb9,m Zc9,m pb9,W :pb,W Zpb,1 cpZ:, b*v9 -bv9 ,Dv9 v9c- ,1vb v", -"b:- ,1vD :c-v vb9,Q -vb9Q Zvb9* cvZ-9 pvb,1 :v-pb Zpb9* :cy- )L !)L )BL a)L", -" )L. 8)L )L.B a)8L M) M)! TM) aM) Mj) 8M) MjT) sM) *L +*L *BL a*L *L. 8*L .", -"B*L 8La* M* +M* T*M aM* M*j 8M* TM*j s*M E)L E)!L H)L a)HL )LE. E)8L )LH. 8", -")HL ME) !EM) HM) H)aM jEM) ME8) MjH) HMs) d*L d*+L H*L g*L *Ld. d*8L *LH. 8", -"*gL dM* +dM* HM* gM* M*dj dM8* M*Hj s*gM )L2 )L!2 )L2B )La2 5)L 8)5L )B5L a", -")5L M)2 !)M2 M)T2 M2a) 5M) 5)8M TM5) 5Ms) ;*L ;*+L ;L*B ;*aL 5*L >*L 5L*B a", -"*>L M;* +;M* M;T* M;a* 5M* >M* T*5M s*>M )LE2 !)2EL )LH2 Ha)L2 E)5L 58E)L 5", -")HL H58)L E)M2 ME)!2 M)H2 aM)H2 ME5) 5M8E) H)5M sH5M) ;*dL +d;*L ;*HL ;*gL ", -"d*5L d*>L HL5* g*>L d;M* dM;+* M;H* M;g* dM5* dM>* 5MH* >*gM )LN )L!N )LNB ", -")LaN )LN. )L8N .BL)N 8a)LN QM) M)Q! TMQ) Q)aM MjQ) Q)8M QTMj) QMs) *LN *L+N", -" NB*L *LaN N.*L *L8N *BLN. a*L8N Q*M Q*+M QTM* aMQ* QM*j 8MQ* M*jQT Q*sM W)", -"L !)WL W)HL a)WL )LW. 8)WL HW)L. H8W)L WM) M)W! ZM) aMZ) MjW) W)8M MjZ) ZMs", -") W*L +LW* HLW* W*gL *LW. WL8* H*WL. gW8*L WM* W*+M Z*M Z*gM M*Wj 8MW* M*Zj", -" sMZ* m)L !)mL )BmL m)aL m)5L m)8L 5m)LB am)5L Mm) M!m) T)Mm a)Mm pM) 8Mp) ", -"TMp) pMs) m*L +Lm* mL*B aLm* 5Lm* m*>L m*L5B >ma*L Mm* M*+m MmT* Mma* p*M p", -"*>M T*pM sMp* m)WL W!m)L m)HL am)HL W)5L 5W8)L H5W)L H8m)L W)Mm Mm)W! MmZ) ", -"aMmZ) WMp) pW8M) pMZ) ZpMs) v*L +*vL H*vL v*gL 5*vL v*>L vH5*L gv>*L vM* +M", -"v* vMZ* g*vM vMp* >*vM ZMp* y*M ,L ,&L ,LB ,aL ,L. ,8L .B,L 8a,L ,M ,M& ,TM", -" ,aM ,Mj ,8M TM,j s,M ,*L -L ,L*B -aL *L,. -8L *B,L. 8a-L ,M* -M T*,M -TM M", -"*,j -M8 M*j,T s-M ,EL &E,L ,HL ,LH& EL,. 8E,L HL,. ,LH8 ,ME ,EM& ,HM HM,a M", -"j,E ,E8M HM,j ,HsM ,dL -dL ,LH* g-L dL,. 8d-L ,HdL. -8gL ,dM -Md HM,d g-M d", -"M,j 8d-M ,HMdj gMs- ,L2 &L,2 2B,L aL,2 ,5L ,L5& 5B,L ,L5a ,M2 ,2M& TM,2 ,2a", -"M ,5M 5M,8 5T,M ,5sM ,;L -;L ;L,B a;-L ,L5* ->L ,5;LB -a>L ,M; -M; T;,M T;-", -"M 5M,; >M- ,5TM; >Ms- EL,2 ,&EL2 HL,2 ,HaL2 5E,L ,58EL ,LH5 ,H58L ME,2 M&E,", -"2 ,2HM ,HM&2 ,E5M ,5M8E H5,M s,H5M d;,L d;-L ,LH; -;gL ,L5d -d>L ,H5dL >Lg-", -" dM,; dM-; HM,; g;-M 5d,M -d>M ,H5dM g->M ,LN &L,N NB,L aL,N N.,L 8L,N ,LN.", -"B ,8aLN ,QM Q&,M QT,M Qa,M QM,j Q8,M ,QTMj ,QsM *L,N -LN *B,LN aL-N ,*LN. 8", -"L-N ,LN*B. -8aLN Q*,M -QM ,QTM* Qa-M M*j,Q Q8-M ,QTM*j sQ-M ,WL ,LW& HW,L ,", -"LWa WL,. ,LW8 ,HWL. ,H8WL ,WM W&,M Z,M ,aZM WM,j W8,M ,MZj sMZ, ,LW* -WL ,H", -"WdL gL-W ,WdL. W8-L H*L,W. -W8gL WM,d -WM ,dZM Z-M ,WMdj W8-M Z*M,j -MsZ ,m", -"L ,Lm& mL,B ,Lam 5m,L ,L8m ,5mLB ,5amL ,Mm M&,m Tm,M aM,m p,M ,8pM ,TpM sMp", -", ,Lm* -mL m*L,B am-L m*L,5 >L-m ,5Lm*B ->amL Q;,M -Mm Mm*,T Tm-M ,Mp* -pM ", -"p*T,M -Msp Wm,L m&L,W ,LHm ,HmaL ,L5W ,5W8L ,H5WL ,H8mL WM,m Mm&,W ,MZm Z&M", -",m ,WpM p&W,M ZMp, Zp&,M v,L -vL ,HvL gL-v ,5vL >L-v v,H5L -vg>L vM, -vM vM", -"Z, gM-v vMp, >M-v Zp*,M y-M U) U!) UD) Ua) U). U8) D)U. U)D8 UM) M)U! V) Va", -") Uj) U)8M Vj) Vs) U* U+* U*D Ua* U*. U8* U.D* D8U* U*M +MU* V* V+* U*j +jU", -"* V*j s*V UE) !EU) UH) HaU) E)U. 8EU) H)U. U)H8 MEU) U!ME) VH) HaV) jEU) U8", -"ME) HjV) VHs) Ud* +dU* UH* gU* d*U. 8dU* U.H* U8g* dMU* dM*U+ Vd* gV* djU* ", -"U+jd* H*Vj s*gV U)2 !)U2 D)U2 a)U2 U5) 58U) U)5D U)5a M)U2 U!M)2 V2) a)V2 U", -")5M U58M) V5) s)V5 U;* +;U* D;U* a;U* U5* >U* 5DU* Ua>* M;U* M;*U+ V;* a;V*", -" 5MU* U*>M V5* V>* E)U2 U!E)2 H)U2 UHa)2 5EU) U58E) U)H5 UH58) UME)2 ME)U!2", -" H)V2 V2Ha) U5ME) 5MEU8) H5V) VsH5) d;U* U+d;* H;U* U;g* 5dU* Ud>* H5U* >*g", -"U dM;U* U+dM;* H;V* g;V* U5dM* >MUd* H5V* V*g> U)N !)UN D)UN a)UN N.U) 8)UN", -" UD)N. U8D)N UQ) U)Q! VQ) QaV) QjU) U)Q8 QjV) VQs) U*N +*UN UND* UNa* *NU. ", -"UN8* U*DN. U8*DN UQ* +QU* V*Q +QV* Q*Uj Q8U* Q*Vj sQV* UW) W!U) U)WD U)Wa W", -")U. U)W8 UHW). UH8W) U)WM UWQ!) VZ) VaZ) U)Wj UW8Q) VjZ) s)VZ UW* +WU* H*UW", -" UWg* U.W* W8U* UH*W. gUW8* WMU* U+WQ* Z*V Z*gV W*Uj U+W*j ZjV* VZs* Um) m)", -"U! U)Dm U)am 5mU) U)8m U5Dm) U5am) U)Mm Mm)U! Vm) amV) pU) U8p) Vp) s)Vp Um", -"* +mU* DmU* amU* 5*Um Um>* U5*Dm >DmU* Q;U* Mm*U+ Vm* +mV* pU* >Up* Vp* s*V", -"p WmU) UWm!) U)Hm UHma) U)5W U5W8) UH5W) UH8m) Mm)UW UW)Mm! Z)Vm VZam) UWp)", -" pUW8) Z)Vp VpZs) vU* U+v* UHv* g*vU U5v* >*vU vUH5* gvU>* UQv* vU+Q* Vv* V", -"*gv vUp* >MvU* Z*Vp yV* ,U ,U& ,UD cU, ,U. ,U8 UD,. ,Uc8 ,UM U&,M V, Vc, ,U", -"j b8,M V,j s,V ,U* -U U*,D c-U ,.U* -U8 ,UD*. c8-U bM* -UM V*b V- U*,j -Uj ", -",jV* V-s ,UE ,EU& ,UH ,UcH UE,. ,EU8 ,.UH UH,8 ,EbM M&E,U V,H cHV, ,EUj ,U8", -"ME ,HVj sHV, ,Ud -Ud UH,d g-U ,.Ud U8-d ,UHd. g8-U bd,M bd-M Vd, V-g Ud,j U", -"d-j ,dVj s-gV ,U2 ,2U& UD,2 ,Uc2 ,U5 U5,8 U5,D ,Uc5 ,2bM M&2,U V,2 c2V, b5,", -"M ,U58M V5, V5s, ,U; -U; U;,D -Uc; U5,; ->U ,U5D; -Uc> bM,; bM-; V;, V-; U;", -",j -U>M ,5V; V-> UE,2 ,U&E2 ,2UH c2U,H ,EU5 ,U58E UH,5 c5U,H ,UME2 ,UEM&2 ,", -"HV2 VcH,2 ,U5ME M&E,U5 ,HV5 s,VH5 Ud,; Ud-; UH,; g;-U U5,d -d>U ,UH5d ->gU ", -",UdM; -UdM; ,HV; V;g- ,U5dM >M-bd ,5Vd g-V> ,UN ,NU& UD,N ,UcN UN,. ,NU8 ,U", -"DN. cU8,N ,UQ U&,Q V,Q V,cQ UQ,j UQ,8 ,QVj sQV, ,NU* -UN ,UD*N cN-U ,U*N. U", -"8-N U*N,D. c-U8N UQb* -UQ ,QV* V-Q ,UQ*j UQ-j V*bQj -QVs ,UW U&,W UH,W ,UcW", -" ,.UW UW,8 ,UHW. cWU,8 bW,M ,UWQ& Z,V VcZ, UW,j ,UWQ8 ZjV, VZs, UW,d -UW ,U", -"HW* -UcW ,UWd. UW-8 ,U.WD* c-WU8 UQ,d bW-M VdZ, Z-V ,UWdj UW-j Zb*Vj sZV- ,", -"Um U&,m Um,D ,Ucm U5,m U8,m ,U5Dm c5U,m bM,m Mm&,U Vm, V,cm pU, ,Up& Vp, s,", -"Vp Um,; -Um ,UmD; -Ucm ,U5m* >U-m U5*,Dm c>-Um UQ,; bM-m ,QV; V-m ,Up* -pU ", -"V*pb V-p UW,m ,UWm& UH,m cWU,m U5,W ,U5W8 ,UH5W c5W,U ,UWMm ,UWMm& VmZ, ZcV", -",m ,UpW pU&,W Z,Vp cpZV, vU, -vU ,UvD gU-v ,Uv5 v>-U vU,H5 cv->U ,UvM vb-M ", -"Vv, V-v vUp, pv-U V,pv yV- k) k)! k)B ak) 1k) 8k) k)1B 1)ak kM) M!k) Tk) T)", -"ak l) l8) lT) ls) k* +k* k*B ak* 1*k 8k* 1k*B ak1* k*M k*+M Tk* T*+k l* l+*", -" l*T ls* kE) !Ek) Hk) H)ak kE1) kE8) 1)Hk H)8k MEk) kME!) H)Tk ak)HM lE) 8E", -"l) lH) sHl) dk* +dk* Hk* gk* dk1* dk8* Hk1* 1*gk k*dM dkM+* TkH* Tkg* ld* 8", -"dl* lH* gl* k)2 !)k2 2Bk) k2a) 5k) 5)8k k)5B 5)ak M)k2 kM)!2 k)T2 ak)T2 l5)", -" 58l) 5Tl) s5l) k;* +;k* *Bk; k;a* 5k* >k* *B5k ak>* M;k* k;M+* k;T* ak;T* ", -"l;* l>* 5Tl* s>l* E)k2 kE)!2 k)H2 ak)H2 kE5) 5k8E) H)5k H5k8) kME)2 ME)k2! ", -"HkT)2 Hk)aM2 5El) l58E) H5l) lsH5) d;k* dk;+* k;H* k;g* dk5* dk>* 5kH* >*gk", -" dkM;* +kdM;* Hk;T* gkT;* 5dl* >*ld H5l* g>l* k)N !)kN )BkN k)aN k)1N kN8) ", -"1k)NB ak)1N Qk) k)Q! Q)Tk Q)ak lQ) Q8l) QTl) sQl) k*N +Nk* kN*B aNk* 1Nk* k", -"N8* k*N1B ak*1N Qk* Q*+k TkQ* akQ* l*Q +Ql* Q*lT lQs* Wk) k)W! H)Wk W)ak 1)", -"Wk W)8k 1HWk) 1Wak) W)Qk WkQ!) Zk) akZ) lW) W8l) lZ) l)sZ Wk* W*+k WkH* Wkg", -"* Wk1* 8kW* 1H*Wk g1Wk* QkW* +WkQ* Zk* Z*gk lW* +Wl* lZ* l*gZ km) k!m) m)kB", -" a)km 1)km 8)km km)1B akm1) Q)km km)Q! T)km akmQ) lp) p8l) pTl) l)sp km* k*", -"+m *Bkm kma* km1* km>* km*1B >kam* kmQ* km*+Q kmT* akmQ* l*p p>l* lTp* spl*", -" W)km km)W! H)km akmH) 5)Wk 5Wk8) 1Hmk) H8km) km)WM Wk)Mm! kmZ) Zkam) pWl) ", -"lWp8) l)Zp lZps) vk* +kv* Hkv* g*vk 1*vk >*vk v1Hk* >kgv* Qkv* vk+Q* vkZ* Z", -"vkg* lv* v>l* Zpl* yl* ,k ,k& ,kB ,ak ,1k :k, 1k,B ,a:k ,kM k&,M ,Tk 9a,M l", -", l:, l,T ls, ,k* -k *B,k -ka 1*,k :-k k*B,1 :a-k 9M* -kM Tk9* -Tk l*9 l- ,", -"Tl* l-s ,kE ,Ek& ,Hk Hk,a 1k,E ,k:E 1H,k ,H:k ,E9M k&E,M 9H,M ,HkT& l,E :,l", -"E lH, s,lH ,dk -kd Hk,d g-k 1d,k -k:d ,1Hdk :-gk 9d,M 9d-M HM9* -Tgk ld, l-", -"d ,Hld gl- ,k2 ,2k& k2,B ,2ak ,5k ,5:k ,B5k 5a,k ,29M k&2,M ,2Tk ,Tk&2 l,5 ", -":5l, ,5lT l5s, ,k; -k; ,Bk; ak-; 1;,k >k- ,1;kB -a>k 9M,; 9M-; Tk,; Tk-; l;", -", l-> ,Tl; s-l> kE,2 k&E,2 ,2Hk ,Hk&2 ,E5k :5k,E H5,k :H5,k ,kME2 ,kEM&2 ,H", -"kT2 ak2,HM ,5lE l:5,E ,Hl5 ls,H5 dk,; dk-; Hk,; g;-k 5d,k -d>k ,1Hk; g->k ,", -"dkM; -kdM; ,HkT; -Tkg; ,5ld ->ld ,Hl; g-l> ,kN ,Nk& kN,B ,Nak 1k,N ,k:N ,1k", -"NB :ak,N ,Qk Q&,k Qk,T Qa,k l,Q :Ql, ,QlT lQs, ,Nk* -kN k*N,B ak-N k*N,1 :N", -"-k ,1Nk*B :-akN Qk9* -Qk ,QkT* Qa-k ,Ql* l-Q l*9QT -Qls ,Wk W&,k Hk,W Wa,k ", -"1W,k ,W:k ,1HWk :HW,k 9W,M ,WkQ& Zk, ,aZk lW, :Wl, lZ, l,Z: Wk,d -Wk ,HkW* ", -"-Wgk ,1Wdk -k:W 1H*,Wk g:-Wk WM9* 9W-M ,dZk Z-k ,Wld l-W Z9l* l-Z ,km k&,m ", -",Bkm ak,m 1m,k ,k:m ,1mkB :ma,k 9M,m km&,Q Tk,m akm,Q l,p l,:p lTp, spl, km", -",; -km km*,B ak-m km*,1 -k:m kmB,1; :-mak Qk,; 9M-m km*,T Tk-m p9l* l-p l;,", -"pT ls-p Wk,m km&,W Hk,m akm,H 5W,k :W5,k ,1Hkm :Hm,k ,WkMm ,WkMm& ,kZm Zk&,", -"m p,lW :pl,W Zpl, lZ,:p vk, -vk ,Hvk gk-v ,1vk >k-v v1,Hk :v-gk ,Qvk v9-M v", -"kZ, Zk-v lv, l-v Zvl, yl- Uk) k)U! Dk) U)ak 1U) 1)U8 1)Dk 1)Ua kMU) U!kM) V", -"k) akV) lU) U8l) Vl) l)Vs U*k +kU* Dk* D*+k 1U* U+1* U*1D Ua1* UkM* k*MU+ V", -"*k +kV* l*U U+l* l*V Vls* kEU) U!kE) U)Hk ak)UH UE1) 1U8E) 1)UH 1UH8) UkME)", -" kMEU!) HkV) VHak) UEl) lU8E) VHl) lsVH) dkU* dk*U+ HkU* U*gk Ud1* 1U+d* UH", -"1* 1Ug* dkMU* U+dk*M HkV* V*gk Udl* l+Ud* Vdl* l*gV k)U2 U!k)2 k)D2 ak)U2 1", -")U5 1U58) 5)Dk 1Ua5) UkM)2 kM)U!2 k)V2 V2ak) U5l) lU58) l)V5 lsV5) k;U* k;*", -"U+ k;D* ak;U* U51* 1U>* Dk5* Dk>* k;MU* U+kM;* k;V* V+k;* U5l* >Ul* V5l* l*", -"V> UkE)2 kE)U!2 UHk)2 UH)ak2 1U5E) 5kEU8) 1UH5) ak)UH5 kMEU)2 !)k2UME V2Hk)", -" ak)V2H lU5E) U58lE) Vl5H) Vs5lH) dk;U* U+dk;* UH;k* gUk;* 1Ud5* >kUd* 1UH5", -"* >kgU* UdkM;* dkU;+M* Vdk;* gVk;* ldU5* l>Ud* lH;V* V>lg* k)UN U!k)N k)DN ", -"ak)UN U)1N 1U8)N 1UD)N 1Ua)N U)Qk UQk!) QkV) VQak) UQl) lUQ8) VQl) lsVQ) UN", -"k* k*NU+ DNk* ak*UN 1NU* 1U+*N 1U*DN 1Ua*N QkU* U+Qk* QkV* V+Qk* UQl* l+UQ*", -" lQV* s*VlQ U)Wk UWk!) W)Dk UWak) 1)UW 1UW8) 1UHW) 1UWa) UWQk) Wk)UQ! VkZ) ", -"ZkVa) UWl) lWU8) l)VZ lZVs) WkU* U+Wk* DkW* gUWk* UW1* 1U+W* 1UHW* g1UW* UW", -"*Qk +WkUQ* V*Zk gVZk* UWl* l+WU* VlZ* glZV* U)km km)U! D)km akmU) 1)Um 1Um8", -") 1UmD) 1Uam) km)UQ UQ)km! kmV) Vmak) l)pU pUl8) l)Vp Vpls) kmU* km*U+ kmD*", -" akmU* Um1* >kUm* km*1D >kDm* km*UQ U+Qkm* kmV* V+mk* pUl* l>pU* l*Vp V>lp*", -" km)UW UW)km! UHmk) ak)UHm 1UW5) km)UW8 1UHm) ak)U5W UWQkm) W)QkUm! ZkVm) V", -"maZk) lWpU) pU8lW) VplZ) lZsVp) U*vk vU+k* Dkv* gvUk* 1Uv* >kvU* v1UH* >kvD", -"* vUQk* U+Qvk* vkV* Vvgk* vUl* lv>U* l*Vv l*yV t, t&, tD, tc, t1, t:, ,1tD ", -"t,:c tM, ,Mt& Vt, V,tc lt, t:l, l,V u, t* t- t*D t-c t*1 t-: 1Dt* :ct- t*M ", -"t-M t*V V-t lt* l-t Vlt* u- t,E ,&tE tH, cHt, ,1tE :,tE ,1tH t,:H ,MtE tM&,", -"E V,tH tcV,H t,lE t:,lE tHl, uH, td* t-d tH* gt- ,1td :-td 1Ht* t-g: ,dtM -", -"Mtd Vdt* V-gt tdl* ldt- tHl* ug- t,2 ,&t2 ,Dt2 c2t, t5, :5t, ,5tD t,c5 ,Mt2", -" tM&,2 t,V2 tcV,2 t5l, t:5l, V5l, u5, t;* t-; ,Dt; c-t; t5* t>- 5Dt* c>t- ,", -"Mt; -Mt; V;t* t;V- t5l* t>l- V5t* u-> ,Et2 t&,E2 ,Ht2 tcH,2 ,5tE t:5,E ,Ht5", -" t:H,5 tM,E2 M&Et,2 tHV,2 Vc,tH2 t5,lE l:,t5E tH5l, ,Hu5 ,dt; -dt; ,Ht; t;g", -"- ,5td ->td H5t* g-t> tdM,; t-dM; tH;V* V-gt; t5dl* l-t>d tH5l* g-u> t,N ,&", -"tN ,DtN c,tN ,1tN :,tN t1D,N t:c,N tQ, ,Qt& V,tQ t,cQ tQl, t,:Q lQV, uQ, t*", -"N t-N D*tN tNc- 1*tN tN:- t*1DN t-:cN tQ* t-Q V*tQ tQV- tQl* tQl- tQ*Vl u-Q", -" tW, ,Wt& ,HtW t,cW ,1tW t,:W tH1,W t:H,W ,WtQ tWQ,& tZ, Z,tc tWl, t:Wl, l,", -"tZ uZ, tW* t-W H*tW tWg- 1Wt* :-tW tH*1W t-Wg: ,Qtd -WtQ tZ* tZ- tWl* lWt- ", -"l*tZ uZ- tm, ,mt& ,Dtm t,cm ,1tm t,:m t5D,m t:mc, ,Qtm tQm,& V,tm tcQ,m tp,", -" p,t: l,Vp up, tm* t-m Dmt* c-tm 1mt* :-tm t5*Dm t-mc> ,Qt; -Qtm Vmt* tmV- ", -"tp* tp- t*Vp up- ,Wtm tWm,& ,Htm tcW,m ,5tW t:W,5 tH5,W t:H,m tWQ,m Mm&tW, ", -"Z,tm tZc,m p,tW tp:,W Z,tp Zpu, tv* tv- vDt* t-cv v1t* t-:v tv1,H gtv:- vMt", -"* tQ-v t*Vv Z-tv l*tv tvl- l,Vv yu- F !F FB aF F. 8F .BF 8aF FK !KF TF TaF ", -"jF 8jF TjF sF (F +F (BF +aF (F. +8F (F.B 8a+F (FK +FK T(F +TF j(F +jF j(TF ", -"s+F G G! GH Ga G. G8 GH. G8H GK GK! GT GTa Gj G8j GTj sG Gd +G GHd gG Gd. +", -"G8 HdG. gG8 GdK +GK GTd gGT Gjd +Gj TdGj gsG F2 !F2 2BF aF2 5F 58F 5BF 5aF ", -"2KF !F2K TF2 T2aF 5jF 8j5F 5TF s5F ;F +;F ;FB a;F 5;F >F ;F5B >Fa ;FK ;F+K ", -"T;F +FT; ;jF >jF 5FT; s>F G2 G2! GH2 Ga2 G5 G58 G5H G5a G2K 2KG! GT2 TaG2 G", -"5j 58Gj G5T sG5 G; +G; G;H gG; G5d >G H5G; g>G G;K GK+; GT; GTg; G;j >Gj H;", -"Gj s>G FN !FN NBF aFN N.F 8FN FBN. aN8F QF Q!F QTF QaF QjF Q8F TjQF sQF (FN", -" +FN (FNB aF+N (FN. 8F+N .BN(F +8aFN Q(F +QF T(QF +FQa j(QF +FQ8 QTj(F +QsF", -" GW W!G GHW GaW GW. G8W HWG. W8Ga GQ GQ! ZG ZGa GQj GQ8 ZGj sZG GWd +GW HWG", -"d gGW WdG. G8+W GHWd. G8gW GQd +GQ ZGd gZG QdGj GQ+j GjZd sGgZ mF mF! mFB a", -"mF 5mF 8mF mF5B 5Fam QmF mFQ! TmF QFam pF p8F pTF spF m;F +mF ;FmB +Fam m;5", -"F >mF 5m;FB am>F Q;F +FQ; QFT; +FTm p;F p>F T;pF >Fsp Gm Gm! GmH Gam G5W G8", -"m H5Gm H8Gm GQm Q!Gm ZGm GaZm pG pG8 ZpG spG vG v+G vGH gvG vG5 v>G G5vH >G", -"gv vGQ +GvQ ZvG gGZv pvG p>G pGZv yG #F &F #BF a&F #F. 8&F #F.B a&8F #FK &F", -"K T#F T&F j#F &jF j#TF s&F #(F +&F #(FB a&+F (F#. 8&+F #BF(. +8a&F (F#K &F+", -"K #(TF +FT& #(jF +F&j Tj#(F +&sF G# G& GH# Ga& G#. G8& H#G. H8G& G#K G&K GT", -"# GT& Gj# G&j G#Hj sG& Gd# +G& HdG# gG& d#G. 8dG& GHd#. G8g& dKG# GKd& G#Td", -" GTg& G#dj G&+j dj#GT g&sG #F2 &F2 #F2B &2aF 5#F 5&F #B5F a&5F #F2K 2K&F #F", -"T2 &FT2 j#5F 5F&j T#5F 5&sF ;#F ;&F #B;F aF;& ;#5F >&F 5;#FB a&>F #F;K &F;K", -" ;#TF TF;& j#;F &j>F ;j#TF s&>F G#2 G&2 H#G2 G2H& G5# G5& G#H5 H5G& 2KG# &2", -"GK T#G2 G2T& 5jG# 5&Gj G#5T G5s& G;# G;& G#H; G;g& G#5d >G& G5Hd# gG>& ;#GK", -" GK;& G#T; T;G& G#;j G&>j G5Td# >&sG #FN &FN #FNB &FaN #FN. &F8N #FN.B 8a&F", -"N Q#F Q&F T#QF QFT& j#QF QF&j QTj#F Q&sF (F#N &F+N #FN(B +a&FN #FN(. +8&FN ", -"#BFN.( 8a&+FN #(QF +FQ& QT#(F +QT&F Qj#(F &jF+Q Tj#Q(F s+Q&F GW# G&W HWG# W", -"aG& W#G. W8G& GHW#. G8HW& GQ# GQ& ZG# Z&G G#Wj W&Gj GjZ# Z&sG WdG# G&+W GHW", -"d# G&gW GWd#. +GW8& HWdG#. gGW8& G#Qd G&+Q GdZ# gGZ& dj#GQ d&jGQ ZGdj# Z&Gg", -"s m#F m&F #BmF aFm& m#5F 5Fm& 5m#FB am&5F m#QF QFm& m#TF TFm& p#F p&F T#pF ", -"sFp& ;#mF +Fm& m;#FB am&+F 5m;#F m&>F m;#5BF >ma&F ;#QF QF;& Q;T#F +Tm&F ;#", -"pF >Fp& pT;#F p>&sF Gm# Gm& G#Hm HmG& G#5W 5WG& G5HW# G5aW& QmG# Q&Gm GmZ# ", -"GmZ& pG# pG& Z#pG pGZ& vG# v&G GHv# gGv& G5v# >Gv& vGH5# gv>G& GQv# GQv& vG", -"Z# ZGv& vGp# v&pG ZpvG# y&G I I! DI aI I. 8I DI. D8I IK IK! TI TIa Ij 8Ij D", -"jI sI I( +I DI( +DI I(. +I8 I(D. D8+I I(K +IK TI( +TI Ij( +Ij D(Ij sI+ GI G", -"I! J Ja GI. G8I J. J8 GIK IKG! JT JTa GjI 8IGj Jj sJ Id +GI Jd gJ Id. 8Id J", -"d. gJ8 IdK GK+I JTd gJT Idj Gj+I Jjd sJg I2 I2! DI2 aI2 5I 5I8 5DI 5aI I2K ", -"2KI! TI2 I2Ta 5Ij 58Ij 5TI sI5 I; +I; D;I aI; 5I; >I D;5I >DI I;K +KI; TI; ", -"T;+I I;j >Ij T;5I s>I GI2 I2G! J2 Ja2 G5I 5IG8 J5 J58 I2GK GI2!K JT2 TaJ2 5", -"IGj G58Ij J5T sJ5 G;I G;+I J; gJ; 5Id >GI J5d J> GKI; IdK+; J;T gTJ; I;Gj G", -"j>I J;j J>s IN IN! DIN aIN IN. 8IN IND. DN8I QI QI! QDI QaI QIj Q8I DjQI sI", -"Q I(N +IN I(DN +NaI N.I( +N8I DI(N. +D8IN QI( +QI Q(TI QD+I Q(Ij Q8+I Ij(QD", -" +QsI WI WI! JW JWa WI. W8I JW. J8W GQI Q!WI ZJ ZJa WIj Q8WI ZJj sJZ WId +W", -"I JWd gJW W.Id W8+I WdJ. gWJ8 QId GQ+I ZJd gZJ IdWj WI+j ZdJj gZsJ Im Im! D", -"mI aIm 5Im 8Im Dm5I 8IDm QIm Q!Im TIm aITm pI pI8 pDI spI Im; +Im ImD; Dm+I", -" 5mI; >Im Im;5D Dm>I QI; QI+m D;QI TI+m pI; p>I D;pI p>sI GmI W!Im Jm Jma 5", -"WI W85I J5W J8m QIGm Im!GQ ZJm ZaJm pGI G8pI Jp Jps vI vI+ Jv Jvg vI5 v>I J", -"v5 J>v vIQ +QvI JvZ gZJv pvI v>pI Jpv yJ bI I& bDI cI bI. b8I DIb. c8I bKI ", -"I&K bTI cTI bjI I&j TIbj scI bI( b+I DIb( c+I I(b. +Ib8 bDI(. +Ic8 I(bK bK+", -"I b(TI +TcI b(Ij +Ibj Ij(bT c+sI bG bG& Jb cJ bG. bG8 Jb. cJ8 bGK bKG& JbT ", -"cJT bGj G8bj Jjb sJc bGd b+G Jbd gJc b.Id +Gb8 bdJ. J8gc bKId bK+G bTJd gTc", -"J Gjbd +Gbj bdJj gcsJ bI2 I&2 DIb2 c2I b5I 5I& bD5I c5I I2bK &2IK b2TI TIc2", -" 5Ibj Ij5& 5IbT c5sI b;I I;& bDI; c;I 5Ib; >bI b5DI; c>I bKI; IK;& TIb; TIc", -"; I;bj bj>I I;jbT sIc> bG2 b2G& Jb2 cJ2 bG5 G5b8 J5b cJ5 G2bK I&2GK bTJ2 JT", -"c2 G5bj I&jG5 b5Jj c5sJ bG; +Gb; J;b cJ; G5bd >bG b5J; J>c bKG; I;&GK bTJ; ", -"cTJ; G;bj bG>j b;Jj c>sJ bIN I&N DIbN cIN INb. bN8I bDIN. 8IcN bQI QI& QIbT", -" cQI QIbj QIb8 bQDIj cQsI I(bN bN+I bDI(N +IcN bI(N. I&N+8 DI(bN. c+8IN b(Q", -"I +IbQ bQDI( +QcI Ij(bQ I&j+Q bQDIj( sI+cQ bGW WI& JbW cJW b.WI G8bW bWJ. J", -"8cW bGQ G&bQ ZJb ZcJ GQbj GQb8 JjZb ZcsJ WIbd +GbW bWJd cWgJ Id.bW b+GW8 Jb", -"Wd. cJWg8 GQbd +GbQ JbZd gJZc IdjbW IdjW& ZJbdj sJZgc bmI Im& bDIm cmI 5Ibm", -" 8Ibm b5DIm 5Icm QIbm ImQ& TIbm QIcm pbI pI& bTpI cpI Imb; +Ibm Im;bD +Icm ", -"Im;b5 bm>I b5DIm; >Icm QIb; I;Q& bQ;TI QIc; b;pI >bpI pbDI; pIc> bGm G&bm J", -"mb cJm G5bW G8bm b5Jm J5cW GQbm Im&GQ JmZb cmZJ pbG bGp& Jpb cpJ vbG vI& Jv", -"b cvJ bGv5 >bvI vbJ5 J>cv bGvQ QIv& ZbJv JvZc vbpG vIp& pbJv yJc 0F !0F 0BF", -" a0F 1F 18F 1FB 1aF 0FK 0F!K T0F a0TF 1jF 8j1F 1TF s1F 0(F +0F 0(FB a0+F 1(", -"F 1+F (B1F +a1F (F0K 0F+K 0(TF T0+F j(1F 1F+j T(1F 1+sF G0 G0! GH0 Ga0 1G 1", -"G8 1GH 1Ga G0K !KG0 GT0 TaG0 1Gj 18Gj 1GT sG1 Gd0 +G0 HdG0 gG0 1Gd 1+G GH1d", -" g1G dKG0 GK+0 G0Td GTg0 Gj1d +j1G GT1d sGg1 0F2 0F!2 0F2B 0Fa2 15F 581F 5B", -"1F 1F5a 0F2K 2K0!F 0FT2 Ta0F2 5j1F 158jF 1F5T 15sF ;0F ;0+F 0B;F ;0aF 1;F >", -"F1 ;F1B 1a>F 0F;K +;0FK ;0TF a;0TF 1F;j 1j>F 1FT; s1>F G02 !0G2 H0G2 a0G2 1", -"G5 15G8 G51H G51a 2KG0 G02!K T0G2 GTa02 15Gj 1G58j G51T 1Gs5 G;0 +0G; G0H; ", -"G;g0 1G; >G1 G;1H >Gg1 ;0GK +G;0K G0T; gGT;0 Gj1; 1G>j GT1; s1>G 0FN 0F!N 0", -"FNB 0FaN 1FN 8F1N NB1F aF1N Q0F !0QF T0QF a0QF 1QF 1FQ8 QT1F 1QsF (F0N 0F+N", -" 0B(FN +a0FN (F1N +F1N 1(FNB 1+aFN 0(QF Q0+F QT0(F +QT0F Q(1F 1F+Q 1QT(F s1", -"+QF GW0 G0W! HWG0 G0Wa 1GW G81W GH1W Ga1W GQ0 G0Q! ZG0 GaZ0 1GQ G81Q Z1G Z1", -"sG WdG0 GW+0 GHWd0 GWg0 GW1d +G1W 1GHWd 1GgW G0Qd +0GQ GdZ0 ZGg0 GQ1d +G1Q ", -"1GZd gGZ1 m0F !0mF 0BmF m0aF 1mF 1F8m mF1B 1Fam m0QF Q!m0F m0TF am0QF p1F 1", -"8pF 1TpF p1sF ;0mF m0+F m;0FB am0+F m;1F 1m>F 1m;FB >m1aF ;0QF +Qm0F Q;T0F ", -"+Tm0F 1;pF p1>F p1T;F p>1sF Gm0 m0G! G0Hm G0am 1Gm G81m Gm1H Ga1m QmG0 GQm!", -"0 GmZ0 ZGam0 pG1 1Gp8 pGZ1 s1pG vG0 +Gv0 GHv0 vGg0 v1G >Gv1 1GvH gGv1 GQv0 ", -"v+GQ0 vGZ0 ZvGg0 v1pG p1>G ZGv1 y1G 9F 9&F 9FB 9aF 91F :F 1B9F :aF 9FK &F9K", -" 9TF 9FT& 9jF :jF 9F1T s:F 9(F 9+F (B9F +a9F 1(9F :+F 91(FB +a:F (F9K +F9K ", -"T(9F 9F+T j(9F +j:F 9T1(F :+sF 9G 9G& 9GH 9Ga 9G1 :G 1G9H :GH 9GK 9KG& 9GT ", -"GT9a 9Gj :Gj 1G9T s:G 9Gd 9+G GH9d g9G 1G9d :G+ 9G1Hd g:G Gd9K 9K+G GT9d 9G", -"gT Gj9d +G:j 9GT1d sGg: 9F2 &F92 2B9F aF92 95F :5F 5B9F 5a:F 2K9F 9&F2K TF9", -"2 9TaF2 5j9F 5j:F 9F5T :5sF 9;F 9F;& ;F9B 9Fa; 9F1; :>F 95;FB :a>F ;F9K ;&F", -"9K 9FT; 9+T;F 9F;j :j>F 95T;F >Fs: 9G2 92G& GH92 92Ga 9G5 :G5 G59H G5:H G29", -"K 9G&2K 92GT 9GT&2 G59j G5:j G59T s5:G 9G; +G9; G;9H 9Gg; 1G9; :>G 9G5H; :G", -"g> 9KG; 9+G;K GT9; g9GT; G;9j >j:G 9G5Td :>sG 9FN &F9N NB9F aF9N 1F9N :FN 9", -"1FNB aF:N 9QF 9FQ& QT9F 9FQa 9F1Q :QF 9Q1TF sF:Q (F9N +F9N 9(FNB 9+aFN 91(F", -"N +F:N 1(F9NB :+aFN Q(9F 9F+Q 9QT(F 9+QTF 9Q1(F +Q:F 1Q(9TF :Q+sF 9GW G&9W ", -"GH9W Ga9W 1G9W :GW 9G1HW Ga:W 9GQ G&9Q Z9G 9GZ& 1G9Q :GQ 9GZ1 Z:G GW9d +G9W", -" 9GHWd 9GgW 9G1Wd +G:W 1GH9Wd gG:W GQ9d +G9Q 9GZd gGZ9 9GQ1d +G:Q Z91Gd :Gg", -"Z 9mF 9Fm& mF9B 9Fam 9F1m :mF 95mFB am:F Qm9F m&F9Q 9FTm 9QamF p9F :pF 9TpF", -" sF:p m;9F 9F+m 9m;FB 9+maF 95;mF >F:m 1mF9;B :>amF 9FQ; 9+QmF 9Q;TF 9+TmF ", -"9;pF >F:p p9T;F :ps>F 9Gm G&9m Gm9H Ga9m 1G9m :Gm 9G5Hm Ga:m GQ9m 9GQm& 9GZ", -"m Z9Gam p9G :pG pGZ9 sG:p v9G 9+vG 9GvH gGv9 9Gv1 :vG v91GH :Ggv 9GvQ v9+GQ", -" ZGv9 Zv9gG v9pG pv:G Zp9vG y:G I0 I0! DI0 aI0 1I 1I8 1DI 1aI I0K !KI0 TI0 ", -"T0aI 1Ij 18Ij 1TI sI1 I0( +I0 I0D( +0aI 1I( 1+I DI1( +D1I 0(IK I0+K I0T( +0", -"TI 1(Ij +j1I 1(TI 1+sI GI0 I0G! J0 Ja0 1GI G81I J1 J18 I0GK GI0!K JT0 TaJ0 ", -"Gj1I 1G8Ij J1T sJ1 Id0 +0Id Jd0 gJ0 1Id +G1I J1d gJ1 I0dK Id0+K TdJ0 JTg0 I", -"j1d Idj1+ 1TJd g1sJ I02 !0I2 I2D0 I2a0 1I5 158I 5D1I 5a1I 2KI0 I02!K I2T0 T", -"Ia02 15Ij 1I58j 5T1I 1Is5 I;0 +0I; D0I; a0I; 1I; >I1 D;1I 1D>I ;0IK I;0+K T", -"0I; +TI;0 Ij1; 1I>j TI1; s1>I I0G2 GI0!2 J02 a0J2 G51I 1G58I J15 1aJ5 GI02K", -" I02GK! T0J2 JTa02 1G5Ij G581Ij 1TJ5 s1J5 G0I; Id0+; J;0 g0J; G;1I 1G>I J1;", -" J>1 Id0;K +G0I;K T;J0 gJT;0 Idj1; >I1Gj 1TJ; J1s> I0N !0IN I0DN I0aN 1IN 1", -"N8I DI1N 1NaI QI0 I0Q! Q0TI Q0aI 1QI Q81I QD1I 1QsI 0(IN I0+N DI0(N +DI0N I", -"(1N 1N+I 1DI(N 1+DIN I0Q( +0QI QDI0( +QDI0 1(QI +Q1I 1QDI( sI1+Q WI0 I0W! J", -"W0 WaJ0 1WI W81I J1W 1WJ8 G0QI GQI!0 ZJ0 JaZ0 GQ1I 1GQ8I ZJ1 Z1sJ W0Id +0WI", -" WdJ0 JWg0 WI1d +W1I 1WJd gWJ1 Q0Id +GQI0 JdZ0 g0ZJ QI1d 1+GQI ZdJ1 ZJg1 Im", -"0 I!m0 D0Im a0Im 1Im 8I1m Dm1I aI1m Q0Im Im0Q! T0Im QaIm0 pI1 1Ip8 1DpI s1p", -"I m;I0 +0Im Im;D0 +DmI0 Im1; 1I>m 1DmI; >Dm1I Q0I; +QIm0 QD;I0 +TIm0 1Ip; p", -"1>I pD1I; p>D1I G0Im Im0W! Jm0 amJ0 Gm1I 1Gm8I J1m 1aJm Im0GQ GQ0Im! Z0Jm Z", -"Jam0 1GpI pG81I Jp1 J1sp vI0 +Iv0 Jv0 g0Jv v1I >Iv1 Jv1 g1Jv QIv0 vI+Q0 Z0J", -"v JvZg0 v1pI pvI>1 Z1Jv yJ1 9I 9I& 9DI c9I b1I :I 1D9I :cI 9IK 9KI& 9TI 9Tc", -"I 9Ij :Ij 1T9I s:I 9I( 9+I DI9( 9+cI b(1I :I+ b1DI( c+:I I(9K 9K+I 9(TI +T9", -"I 9(Ij +I:j b1TI( s+:I bG9 G&9I J9 cJ9 b1G :Gb J91 :J bK9G I&K9G J9T cTJ9 9", -"Gbj bG:j J9j :Js 9Id 9+bG J9d gJ9 1Gbd :Id b1Jd :Jg 9KId b+G9K 9TJd gTJ9 Id", -"9j Id:j 9dJj sJg: 9I2 92I& DI92 9Ic2 95I :I5 5D9I c5:I I29K I&29K 92TI c29T", -"I 5I9j 5I:j 5T9I s5:I 9I; +I9; D;9I 9Ic; 1Ib; :>I b1;DI :Ic> 9KI; I;&9K TI9", -"; c;9TI I;9j >j:I I;j9D :>sI b29G I&29G J92 c2J9 9Gb5 bG:5 J95 :J5 bG92K 9G", -"2I&K 9TJ2 cJ9T2 b1G5j :Gb5j 95Jj J5s: 9Gb; I;&9G J9; J9c; 1Gb; >b:G b1J; :J", -"> bG;9K I;K9+G 9TJ; cJ;9T Idj95 :>Gbj 9;Jj s:J> 9IN 9NI& DI9N 9IcN bN1I :IN", -" b1DIN cN:I 9QI Q&9I QD9I 9QcI 1Q9I :QI b1QTI :QsI I(9N 9N+I 9DI(N c9+IN b1", -"I(N +I:N 1D(9IN :c+IN 9(QI +Q9I 9QDI( cQ9+I b1QI( +Q:I Ij(9QD :cQ+I 9WI W&9", -"I J9W J9cW 1GbW :WI b1JW :JW 9GbQ bGQ9& ZJ9 cJZ9 1GbQ bG:Q J9Z1 Z:J WI9d +W", -"9I 9WJd gWJ9 b1GWd +W:I J91Wd :WgJ QI9d b+G9Q ZdJ9 ZJg9 Idj9W QI:d ZJ91d gZ", -":J 9Im I&9m Dm9I 9Icm 1Ibm :Im b1mDI cm:I QI9m Im&9Q TI9m cQ9Im p9I :pI 9Dp", -"I sI:p Im9; +I9m 9DmI; cm9+I b1mI; >I:m 1Dm9I; c>:Im QI9; I;&9Q 9QDI; cQ;9I", -" 9Ip; p>:I p9DI; cp:>I 9Gbm Im&9G J9m J9cm 1Gbm bG:m b1Jm :Jm bGQ9m 9GQIm& ", -"JmZ9 ZJ9cm b1pG pb:G Jp9 :Jp v9I 9+vI Jv9 g9Jv b1vI :vI vbJ1 :Jv 9QvI v9I+Q", -" Z9Jv cvZJ9 v9pI pv:I pvJ9 yJ: FL !FL LBF aFL FL. 8FL FL.B aF8L MF MF! TMF ", -"aMF MjF 8MF MjTF sMF (FL +FL (FLB aF+L FL(. 8F+L (BLF. +8aFL M(F +MF M(TF +", -"FaM j(MF +F8M TMj(F +MsF GL GL! GHL GaL GL. G8L HLG. GLH8 GM GM! GTM GaM GM", -"j G8M HMGj sGM GdL +GL HdGL gGL dLG. +LG8 GHdL. G8gL GMd +GM TdGM gMG dMGj ", -"G8+M dMjGT sGgM FL2 FL!2 FL2B FLa2 5FL 8F5L LB5F aF5L MF2 !FM2 MFT2 M2aF 5M", -"F 5F8M TM5F 5MsF ;FL ;F+L LB;F ;FaL ;F5L >FL 5;FLB aF>L M;F +FM; TFM; aFM; ", -"5FM; >MF M;F5T sM>F GL2 !LG2 HLG2 aLG2 G5L 58GL GLH5 GL5a GM2 M2G! G2HM G2a", -"M G5M 5MG8 H5GM G5sM G;L +LG; GLH; G;gL GL5d >GL G5HdL gG>L GM; G;+M HMG; G", -"Mg; 5dGM >MG G5TdM sG>M FLN FL!N FLNB FLaN FLN. FL8N .BLFN 8aFLN QMF MFQ! T", -"MQF QFaM MjQF QF8M QTMjF QMsF FL(N FL+N (BLFN +aFLN N.(FL +8FLN (BFN.L 8aF+", -"LN M(QF QM+F QTM(F aMF+Q QMj(F +Q8MF TMjQ(F s+QMF GWL GLW! HWGL GLWa WLG. G", -"LW8 GHWL. G8HWL GQM Q!GM ZGM GaZM WMGj W8GM GMZj ZGsM WdGL GW+L GHWdL GWgL ", -"GWdL. +GW8L HWdGL. gGW8L QdGM GQ+M GMZd ZGgM dMjGQ +GQ8M ZGdMj gZsGM mFL !F", -"mL LBmF mFaL mF5L mF8L 5mFLB amF5L MmF M!mF TFMm aFMm pMF 8MpF TMpF pMsF ;F", -"mL mF+L m;FLB amF+L 5m;FL mF>L m;F5BL >maFL QFM; +FMm MmFT; aMm+F M;pF pM>F", -" pTM;F >MpsF GmL mLG! GLHm GLam GL5W GL8m G5HWL G5aWL GMm G!Mm GMZm aMGm pG", -"M G8pM ZMpG sMpG vGL +GvL GHvL vGgL G5vL vG>L vGH5L gv>GL vMG +GvM ZGvM gGv", -"M vMpG pG>M ZpvGM yGM #FL &FL #FLB &FaL FL#. &F8L #L.FB 8a&FL M#F M&F M#TF ", -"TFM& j#MF 8FM& TMj#F M&sF (F#L &F+L (BL#F +a&FL #L.(F +8&FL (BF#L. 8a&+FL #", -"(MF +FM& TM#(F aMF+& Mj#(F M&F+j Mj#T(F s+M&F G#L G&L H#GL GLH& #LG. 8&GL G", -"H#L. G8H&L GM# GM& G#HM HMG& MjG# 8MG& GTMj# GMs& d#GL +LG& GHd#L G&gL Gd#L", -". d&LG8 Hd#GL. gG8&L G#dM G&+M dM#GT GMg& dMjG# dM&G8 GTMdj# gsGM& FL#2 FL&", -"2 #L2FB a&FL2 #F5L &F5L 5B#FL 5a&FL #FM2 &FM2 TM#F2 aMF&2 M#5F 5FM& 5TM#F s", -"5M&F #F;L &F;L ;#FLB a;&FL 5;#FL &F>L ;#F5BL >&aFL ;#MF MF;& M;#TF aM;&F M;", -"#5F M&>F 5T#M;F >Ms&F #LG2 &LG2 GH#L2 Ga&L2 5#GL GL5& G5H#L G5a&L M#G2 G2M&", -" GTM#2 GT&M2 G#5M 5MG& G5TM# sG5M& ;#GL GL;& G;H#L gG;&L G5d#L G&>L H5#G;L ", -"g>G&L G#M; M;G& GT;M# gMG;& G5Md# GM>& dM#G5T >MgG& FL#N FL&N #LNFB a&FLN #", -"LNF. 8&FLN .BL#FN a&F8LN M#QF QFM& QTM#F aMFQ& QMj#F M&FQ8 TMjQ#F sQM&F #LN", -"(F +&FLN #FN(BL a&F+LN #(FN.L 8&F+LN (FLBN.# 8a+&FLN QM#(F M&F+Q TM#Q(F +QT", -"M&F Mj#Q(F +Q8M&F #(TFQMj M&Fs+Q W#GL GLW& GHW#L GaW&L GW#L. G8W&L HW#GL. H", -"8WG&L G#WM WMG& GMZ# GMZ& GQMj# GQ8M& ZGMj# Z&GsM GWd#L d&LGW HWdG#L gGW&L ", -"Wd#GL. G8Wd&L WdG#HL. G8Wg&L dM#GQ dM&GQ ZGdM# Z&GgM GQMdj# GQ8dM& dMjZG# g", -"sGZ&M #FmL &FmL m#FLB am&FL 5m#FL m&F5L m#F5BL 5aFm&L m#MF MFm& Mm#TF aMm&F", -" M#pF M&pF pTM#F p&MsF m;#FL m&F+L ;#FmLB m&Fa;L m;#5FL >m&FL LBmF5;# am&>F", -"L Mm#;F Mm&+F Tm#M;F aMFQ;& pM;#F >Mp&F M;#pTF p&F>Ms m#GL GLm& GmH#L Gam&L", -" G5W#L G5&WL H5#GmL amLG5& G#Mm MmG& ZGMm# Z&GMm GMp# GMp& ZpGM# Zp&GM G#vL", -" G&vL vGH#L gvG&L vG5#L v>G&L G5Hv#L v&Gg>L GMv# GMv& ZvGM# Zv&GM pvGM# >Mv", -"G& pGMZv# GMy& UI U!I UDI UaI UI. U8I DIU. 8IUa IM IM! VI VaI UjI 8IM VIj s", -"IV UI( U+I DIU( +IUa I(U. +IU8 UDI(. U+D8I IM( +IM VI( V+I U(Ij +IUj IjV( V", -"+sI UG UG! JU JUa UG. UG8 JU. J8U UGM U!GM VJ VJa UGj G8Uj JjV sJV UGd U+G ", -"JUd gJU U.Id +GU8 UdJ. J8gU IdM +MUG VJd gVJ GjUd +GUj VdJj sJgV UI2 I2U! D", -"IU2 U2aI U5I 5IU8 UD5I 5IUa IM2 I!M2 V2I aIV2 5IM 8I5M V5I V5sI U;I +IU; UD", -"I; aIU; 5IU; >UI U5DI; Ua>I IM; I;+M V;I +IV; I;Uj >MI 5IV; V>I UG2 G2U! JU", -"2 UaJ2 UG5 G5U8 J5U U5J8 U2GM IM2G! VJ2 JaV2 G5Uj UG58M J5V VsJ5 UG; +GU; J", -";U J;gU G5Ud >UG U5J; J>U GMU; IdM+; J;V J;gV G;Uj UG>M V5J; J>V UIN INU! D", -"IUN UNaI INU. UN8I UDIN. U8IDN UQI Q!IM VQI QaVI QIUj QIU8 QIVj VQsI I(UN U", -"N+I UDI(N U+DIN UI(N. U+8IN DI(UN. +DIU8N U(QI +IUQ QIV( +QVI IM(Qj U+Q8I V", -"QIj( sIV+Q UGW U!WI JUW UWJa U.WI G8UW UWJ. UWJ8 UGQ Q!UG ZJV ZaVJ GQUj GQU", -"8 VZJj VZsJ WIUd +GUW UWJd JUgW Id.UW U+GW8 JUWd. gJUW8 GQUd +GUQ VdZJ ZJgV", -" IdMWj IdMW8 ZJVdj gVZsJ UmI U!Im UDIm aIUm 5IUm 8IUm U5DIm U5aIm IMm I!Mm ", -"VmI aIVm pUI U8pI VpI sIVp ImU; +IUm Im;UD U+maI Im;U5 Um>I U5DIm; >DmUI QI", -"U; IM+m QIV; +IVm U;pI pI>M pIV; pIV> UGm U!Gm JmU UaJm G5UW G8Um U5Jm U8Jm", -" GQUm IMmW! JmV JaVm pUG UGp8 JpV VpsJ vUG U+vI JvU gUJv UGv5 >UvI vUJ5 vUJ", -"> vIM +IvM VvJ JvgV vUpG vI>M VvJp yJV bUI U&I UDbI cUI UIb. 8IU& bUDI. U8c", -"I bMI IM& VbI VcI IMbj 8IbM bjVI VcsI UIb( +IU& bUDI( U+cI bUI(. b+U8I UDIb", -"(. cU+8I b(IM +IbM bIV( cIV+ IM(bj IM&+j VbIj( sIVc+ bGU UG& JbU cJU b.UG U", -"Gb8 bUJ. cUJ8 bGM GMU& VJb cJV UGbj G8bM VbJj VJsc UGbd U+bG bdJU cJgU Id.b", -"U b+GU8 JbUd. cJUg8 GMbd +GbM JbVd cJgV IdMbj IdMb8 JjVbd gVJsc UIb2 U2I& b", -"UDI2 UIc2 bU5I 5IU& b5UDI U5cI b2IM I2M& bIV2 cIV2 5IbM IM5& b5VI cIV5 bUI;", -" I;U& b;UDI U;cI b5UI; U&>I U5Db;I cU>I IMb; M;I& b;VI cIV; IM;b5 bM>I V5bI", -"; >IVc b2UG U2G& bUJ2 JUc2 UGb5 G5U& b5JU cUJ5 b2GM IM&G2 JbV2 V2cJ G5bM IM", -"&G5 JbV5 VJc5 UGb; G;U& b;JU cUJ; bG5Ud bG>U J5bUd >UcJ GMb; IdM;& JbV; VJc", -"; IdMb5 bG>M J5Vbd cJV> UIbN UNI& bUDIN UIcN bUIN. I&NU8 UDIbN. cU8IN QIbM ", -"QIU& bQVI VQcI bQUIj IM&Q8 VbQIj sIVcQ bUI(N I&NU+ UDIb(N cU+IN UI(bN. U+8I", -"&N UDbIN.( U+8cIN IM(bQ IM&+Q VbQI( cQV+I bQUIj( U+QI&j Ij(VbQ cQVsI+ UGbW ", -"G&UW bWJU JUcW bGUW. bG8UW JbUW. cJUW8 UGbQ GQU& VJZb VZcJ bGQUj IM&W8 ZJVb", -"j sJZVc bGUWd b+GUW JbUWd cJUgW bWUId. U+GbW8 bWUJd. gJUcW8 IdMbW IdMW& ZJV", -"bd gVZcJ bWMIdj bW8IdM JjVZbd sJZgVc bUIm ImU& bmUDI UmcI b5UIm Im&U5 U5Dbm", -"I c5UIm IMbm MmI& bmVI cIVm bMpI U&pI VbpI pIVc Im;bU Im&U+ UmDb;I cmU+I b5", -"UIm; >ImU& Imb;U5D c>UIm IMmb; IMmb+ VmbI; cQ;VI pbUI; >MbpI VpbI; cpV>I UG", -"bm GmU& bmJU cUJm bG5UW bG8Um J5bUW cJ5UW GMbm IMmG& JbVm VJcm bGpU UGp& pb", -"VJ cJVp bGvU UGv& JbvU vUcJ vbUG5 v>bUG JvbU5 cvJ>U bGvM IMv& vbVJ cJVv pvb", -"UG >MvbG JpVvb cJyV kF kF! kFB akF 1kF 8kF kF1B 1Fak kMF M!kF TkF TFak lF l", -"8F lTF lsF k(F +kF (BkF +Fak k(1F 1F+k 1k(FB akF1+ M(kF kM+F k(TF +FTk l(F ", -"l+F T(lF sFl+ Gk Gk! GkH Gak 1Gk G8k Gk1H Gk1a GkM kMG! GTk TkGa lG lG8 lGH", -" lsG Gkd +Gk GHdk gkG Gk1d +k1G 1GHdk 1Ggk dkGM Gk+M TdGk GTgk lGd l+G GTld", -" glG kF2 !Fk2 2BkF k2aF 5kF 5F8k kF5B 5Fak MFk2 kMF!2 kFT2 akFT2 l5F 58lF 5", -"TlF sFl5 k;F +Fk; ;FkB aFk; 1Fk; >kF k;F1B ak>F kFM; k;M+F TFk; ak;TF l;F l", -">F T;lF >Fls Gk2 k2G! G2Hk G2ak G5k 5kG8 H5Gk 5aGk kMG2 GkM!2 G2Tk GTka2 lG", -"5 G5l8 G5lH l5sG Gk; G;+k HkG; Gkg; Gk1; >kG 1G;Hk >Ggk k;GM +GkM; TkG; gkG", -"T; lG; l>G GTl; g>lG kFN !FkN NBkF kFaN kF1N kN8F 1kFNB akF1N QkF kFQ! QFTk", -" QFak lQF Q8lF QTlF sFlQ (FkN kF+N k(FNB akF+N 1k(FN 1+kFN k(F1NB 1+FakN k(", -"QF +FQk QkT(F +QkTF Q(lF +QlF lQT(F ls+QF GkW W!Gk GHWk WaGk Gk1W W8Gk 1GHW", -"k 1GaWk GQk Q!Gk ZkG GaZk lGW GQl8 lZG sZlG GWdk Gk+W GkHWd GkgW 1GWdk 1+GW", -"k GkH1Wd g1GWk QdGk GQ+k GkZd gGZk GQld +GlW ZGld lGgZ kmF k!mF mFkB aFkm 1", -"Fkm 8Fkm kmF1B akm1F QFkm kmFQ! TFkm akmQF lpF p8lF pTlF sFlp m;kF +Fkm km;", -"FB akm+F km;1F km>F 1mFk;B >kamF QFk; +QkmF Qk;TF ak;QF p;lF >Flp l;pTF l>p", -"sF Gkm G!km HkGm akGm Gk1m 8kGm 1GmHk akm1G QkGm GQkm! GkZm ZkGam lGp l8pG ", -"ZplG splG vkG +Gvk GkvH gGvk 1Gvk >Gvk v1GHk >kgvG GQvk vk+GQ ZGvk ZvkgG lv", -"G p>lG ZvlG ylG 9kF k&F kF9B 9Fak 1k9F :kF 91kFB ak:F 9MF 9FM& 9FTk 9FaM l9", -"F l:F 9TlF sFl: k(9F 9F+k 9k(FB akF9+ 91k(F +k:F 1k(9FB :+akF M(9F 9F+M 9Tk", -"(F 9+TkF 9(lF :+lF l9T(F ls:+F 9Gk Gk& Gk9H Gk9a 91Gk :Gk 9G1Hk Ga:k 9GM G&", -"9M GT9M Ga9M lG9 l:G 9GlH s:lG Gk9d +k9G 9GHdk 9Ggk 9G1dk +G:k 1GH9dk :Ggk ", -"GM9d +G9M 9GTdk 9GgM 9Gld :Gl+ lG9Td lGg: kF92 &Fk2 9kF2B akF92 9F5k 5k:F 9", -"5kFB :5akF MF92 k&FM2 9TkF2 9aMF2 95lF :5lF l95TF ls:5F 9Fk; kF;& k;F9B ak;", -"9F k;F95 :k>F 95Fk;B :>akF 9FM; k;&MF 9T;kF aM;9F 9;lF >Fl: l;9TF l>s:F 92G", -"k G2k& 9GHk2 9Gak2 Gk95 G5:k 9G5Hk :GH5k 92GM 9GM&2 9GTk2 9GaM2 9Gl5 l5:G l", -"G9H5 lsG:5 Gk9; k;G& 9G;Hk g9Gk; 9G5dk :G>k G5k9H; g:>Gk GM9; k;&GM 9GTk; g", -"9MG; 9Gl; :>lG lG;9H l>Gg: kF9N &FkN 9kFNB akF9N 91kFN kF:N 1kF9NB :akFN 9F", -"Qk QFk& 9QTkF 9QakF 9QlF lF:Q l9QTF :QFls 9k(FN k&F+N k(F9NB 9+FakN 1k(9FN ", -":+kFN 1k9(NBF akF:+N 9Qk(F 9+QkF Qk(9TF akF9+Q l9Q(F :Q+lF 9QTl(F ls+:QF Gk", -"9W WkG& 9GHWk 9GaWk 9G1Wk Gk:W 1GH9Wk :GHWk GQ9M QkG& 9GZk GkZ& 9GlW :GlW Z", -"9lG lGZ: 9GWdk dk&GW GkH9Wd g9GWk 1GW9dk :G+Wk 91GkHWd g:GWk 9GQdk dk&GQ Z9", -"Gdk Zk&gG lG9Qd :GQl+ lZ9Gd glZ:G 9Fkm kFm& kmF9B akm9F kmF95 km:F 95FkmB :", -"makF 9FMm km&QF 9TmkF aMm9F lFp9 lF:p p9lTF :plsF km;9F km&+F 9mFk;B akF9+m", -" 95;kmF :>mkF km1;9FB >ka:mF 9Q;kF k;&QF kmF9T; akF9Q; l;p9F l>p:F p9Tl;F :", -"psl>F Gk9m kmG& 9GmHk akm9G 9G5Wk Gk:m G5k9Hm :GmHk GM9m km&GQ Z9Gkm Zk&Gm ", -"p9lG lG:p Zp9lG :pGlZ 9Gvk Gkv& v9GHk gv9Gk v91Gk vk:G 9G5vkH :vGgk 9GvM v9", -"M+G Zv9Gk ZvkG& v9lG lG:v lvZ9G l:yG Ik Ik! DkI aIk 1UI 8Ik Dk1I Ua1I IkM I", -"!kM VIk aIVk lI lI8 lIV lsI Ik( +Ik D(Ik Dk+I 1(Ik U+1I Ik(1D 1U+aI kMI( Ik", -"+M IkV( +IVk lI( l+I VIl( sIl+ UGk U!Gk Jk Jka 1UG U81G J1U J8k IkGM IkMG! ", -"JkV VaJk lGU UGl8 lJ lJs Idk +kUG Jkd gJk UG1d U+1G 1UJd J1gU dkIM Idk+M Vd", -"Jk JkgV lId U+lG lJd glJ Ik2 I!k2 I2Dk I2ak 5Ik 8I5k Dk5I aI5k kMI2 IkM!2 I", -"kV2 V2aIk lI5 5Il8 V5lI l5sI Ik; I;+k IkD; Ika; U;1I >kI Ik;1D Dk>I k;IM Ik", -";+M IkV; V+Ik; lI; l>I V;lI lIV> U2Gk Ik2G! Jk2 akJ2 U51G 1UG58 J5k 5aJk Ik", -"MG2 Gk2IM! V2Jk JkVa2 UGl5 lGU58 lJ5 J5ls GkU; Idk+; Jk; J;gk UG1; 1U>G 1UJ", -"; J>k IdkM; +GkIM; V;Jk gVJk; UGl; >UlG lJ; J>l IkN I!kN DNIk aNIk 1NIk IN8", -"k IkN1D 1UaIN QIk Q!Ik QIVk aIQk lIQ Q8lI VQlI lQsI k(IN +NIk Ik(DN +DkIN I", -"k(1N 1U+IN 1D(IkN akN1+I Q(Ik QI+k VQIk( V+QIk QIl( +QlI VlQI( lsI+Q WIk W!", -"Ik JkW WaJk UG1W 8IWk 1UJW W8Jk GkUQ UGQk! ZJk ZaJk lWI W8lI lJZ lZsJ IdWk ", -"WI+k WkJd gWJk Idk1W IdkW8 J1UWd gJ1UW IdQk Idk+Q ZdJk ZJgk WIld +WlI ZJld ", -"gZlJ Ikm I!km IkDm Ikam Um1I Ik8m Ikm1D akm1I ImQk IkmQ! IkVm VmaIk lIp l8p", -"I lIVp splI kmI; Ik+m IkmD; akm+I Ikm1; Ik>m 1DmIk; >kDIm IkQ; Ikm+Q VmIk; ", -"V+mIk pIl; p>lI VplI; V>lpI GkUm IkmW! Jkm akJm UG1m IkmG8 1UJm 8kJm IkmGQ ", -"Ik!GMm JmZk ZJkam pUlG lGpU8 Jpl lsJp vIk +Ivk Jvk gkJv 1UvI vI>k v1Jk >kJv", -" QIvk vIk+Q ZkJv VvJgk lvI v>lI lvJ ylJ tI tI& tDI tcI t1I t:I 1DtI :Itc tI", -"M IMt& VtI tIVc ltI l:I VtlI uI tI( t+I DIt( c+tI 1It( :It+ t1DI( t:c+I IMt", -"( +ItM VIt( tIV+ tIl( t+lI ltVI( u+I tG tG& tJ tJc tG1 t:G tJ1 :Jt tGM GMt&", -" tJV VJtc ltG t:lG lJt uJ tGd t+G tJd gtJ 1Gtd :Gt+ J1td :Jgt GMtd +GtM VJt", -"d tJgV tGld t+lG ldtJ uJg tI2 I&t2 DIt2 c2tI t5I :It5 5DtI tIc5 IMt2 IM&t2 ", -"tIV2 tcVI2 t5lI l5:I tIV5 u5I t;I +It; D;tI tIc; 1It; t>I t5DI; >Itc IMt; t", -"+IM; tIV; tc;VI t;lI lIt> t5VI; u>I tG2 G&t2 tJ2 c2tJ tG5 :Gt5 tJ5 t5:J GMt", -"2 tGM&2 V2tJ tJVc2 t5lG t:Gl5 t5lJ uJ5 tG; +Gt; tJ; t;gJ 1Gt; t>G J1t; t>J ", -"GMt; t+GM; VJt; tJ;gV tGl; lGt> l;tJ uJ> tIN I&tN DItN cItN 1ItN tN:I t1DIN", -" t:cIN tQI QIt& VQtI tIcQ tQlI :QlI tQVlI uQI I(tN +ItN tDI(N tc+IN t1I(N t", -":+IN 1DIt(N :cIt+N QIt( +QtI tQVI( tcQ+I tQIl( t:Q+I Vl(tQI +QuI tGW G&tW t", -"JW cJtW 1GtW :GtW J1tW tW:J tGQ GQt& tZJ ZctJ tGlW :GtQ lJtZ uZJ WItd +GtW ", -"JWtd tWgJ tG1Wd t:G+W tJ1Wd gtJ:W GQtd +GtQ ZJtd gZtJ tGQld t:G+Q lJZtd gZu", -"J tmI Imt& DmtI tIcm 1Itm :Itm t5DIm t:mcI QItm tQIm& tIVm tcQIm tpI lI:p p", -"IVt upI Imt; +Itm tmDI; tcm+I t5Im; >Itm 1Dmt;I t>cIm QIt; t+QIm tQ;VI tcQI", -"; pIt; pIt> tpVI; p>uI tGm Gmt& tJm cJtm 1Gtm :Gtm J1tm tm:J GQtm tGQm& ZJt", -"m tJmZc tpG tG:p tpJ uJp tvG vIt+ tvJ tJcv v1tG tG:v t5Jv :Jtv vItQ tv+GQ t", -"JVv cvVtJ lGtv lI:v Jptv yuJ e e! eB ae e. 8e e.B 8ea eK eK! Te Tea ej 8ej ", -"Tej se e* +e *Be +ea e*. +e8 e.*B ae8* e*K +eK Te* +Te ej* +ej ejT* se+ Ge ", -"Ge! He Gae Ge. G8e He. H8e GeK eKG! GTe TeGa Gje 8eGj Hej sGe f f+ fH gf f.", -" f8 fH. gf8 fK f+K fT gfT fj f8j fTj sf e2 e2! e2B ae2 5e 5e8 5eB 5ae e2K 2", -"Ke! Te2 T2ae 5ej 58ej 5Te se5 e; +e; e;B ae; 5e; >e *B5e >ea e;K +Ke; Te; T", -";+e e;j >ej Te5* >es Ge2 e2G! He2 G2ae G5e 5eG8 H5e 5aHe e2GK Ge2!K G2Te ae", -"2GT 5eGj G58ej 5THe G5se f; f+; fH; gf; f5 f> f5H f>g f;K +;fK fT; g;fT f5j", -" f>j f5T sf> eN eN! eNB aeN eN. 8eN .BeN aN8e Qe Qe! QeT Qae Qej Q8e QTej s", -"eQ e*N +eN eN*B +Nae *Ne. +N8e *BeN. aeN8* Qe* +Qe TeQ* Qa+e ejQ* Q8+e ej*Q", -"T +Qse We We! HeW Wae We. W8e H.We W8He GQe Q!We Ze Zea Wej Q8We Zej sZe fW", -" f+W fHW gfW fW. f8W HWf. gWf8 fQ fQ+ Zf Zfg fQj fQ8 Zfj sfZ em em! emB aem", -" 5em 8em 5Bem ae8m Qem Q!em Tem aeTm pe pe8 peT spe em; +em *Bem ae+m em5* ", -">em em;5B ae>m Qe; Qe+m TeQ; Te+m pe; >ep Tep* sp>e Gme W!em Hem aeGm 5We W", -"85e 5WHe Wa5e QeGm em!GQ Zem aeZm pGe G8pe Zpe Zpse fv fv+ fvH gfv fv5 f>v ", -"vHf5 gvf> fvQ v+fQ Zfv gvZf fp fp> fpZ yf ,e e& ,eB ,ae ,e. ,8e e.,B 8e,a ,", -"eK e&K ,Te Te& ,je e&j Te,j se& ,e* -e ,e*B -ae e*,. -8e *Be,. 8e-a e*,K -e", -"K ,eT* -Te ,e*j -je ej*,T s-e ,G ,G& ,GH ,Ga ,G. ,G8 ,.He G8,H ,GK ,KG& ,GT", -" GT,a ,Gj G8,j GT,j sG, f, f- fH, gf- f,. f-8 ,Hf. f8g- f,K f-K fT, f-T fj,", -" f-j ,Hfj sf- ,e2 e&2 e2,B ,2ae ,5e 5e& ,B5e 5e,a e2,K &2eK ,2Te T2e& 5e,j ", -"ej5& 5e,T ,5se ,;e -e; ,Be; ae-; 5e,; >e- e;B,5 -a>e ,Ke; e;-K Te,; Te-; e;", -",j -j>e e;j,T >es- ,G2 ,2G& ,2He ,2Ga ,G5 G5,8 G5,H G5,a G2,K e&2GK ,2GT ,G", -"T&2 G5,j e&jG5 G5,T ,Gs5 f;, f-; ,Hf; g;f- f5, f>- ,Hf5 g-f> ,;fK fK-; ,Tf;", -" f;-T ,5fj ->fj ,5fT f>s- ,eN e&N eN,B ,Nae eN,. ,N8e ,eN.B aeN,8 ,Qe Qe& Q", -"e,T Qe,a Qe,j Qe,8 ,QTej ,Qse e*,N -eN *Be,N ae-N ,e*N. 8e-N ,eN*B. -8aeN ,", -"eQ* -Qe ,QTe* Qa-e ej*,Q Q8-e ,QTej* -Qse ,GW We& He,W Ga,W ,.We G8,W ,GHW.", -" ,G8Wa ,GQ G&,Q Ze, Ze& GQ,j GQ,8 ,GZj Zes, fW, f-W ,HfW -Wgf ,Wf. -Wf8 fHW", -",. f-Wg8 fQ, f-Q Zf, Z-f ,Wfj -Wfj fjZ, Z-sf ,me em& ,Bem ae,m 5e,m 8e,m em", -"B,5 aem,5 Qe,m emQ& Te,m emT& pe, pe& ,Tpe pes, em,; -me em;,B ae-m em;,5 -", -"m>e ,5em*B >e-am Qe,; Qe-m ,Q;Te Te-m ,;pe -pe peT,; se-p ,Gm G&,m Gm,H Ga,", -"m G5,W G8,m ,G5Hm em&H5 GQ,m em&GQ ,GZm emZ& pG, ,Gp& pGZ, pGs, fv, -vf fHv", -", gf-v v,f5 -vf> fvH,5 f>g-v v,fQ fQ-v fvZ, -vZf fp, fp- Z,fp yf- Ie Ie! De", -" Dea Ie. 8Ie De. D8e IeK I!eK DeT aITe Ije Ij8e Dej sIe I* +Ie De* +De I*. ", -"8I* D.I* D8+e I*K +KI* TI* De+T I*j I*+j I*Dj sI* GIe IeG! Je Jae IeG. GI8e", -" Je. J8e IeGK GIe!K JTe TeJa GIej IjeG8 Jje sJe fI f+I Jf gJf fI. f8I Jf. J", -"f8 fIK +IfK JfT fTgJ fjI +Ifj Jfj sfJ Ie2 I!e2 De2 I2ae 5Ie 8I5e 5De D85e e", -"2IK Ie2!K I2Te ae2TI Ij5e Ije58 De5T 5Dse I;e I;+e De; D;+e 5I* >eI De5* >e", -"D IKe; I;e+K TeD; ae;TI Ij5* I*>j TI5* sI>e IeG2 GIe!2 Je2 aeJ2 GI5e G58Ie ", -"J5e 5aJe GIe2K Ie2GK! TeJ2 JTae2 IjeG5 G58Ije 5TJe J5se fI; +If; Jf; J;gf f", -"5I f>I Jf5 J>f I;fK f+I;K fTJ; JfTg; 5Ifj >Ifj f5Jj J>sf IeN I!eN DeN DNae ", -"eNI. IN8e eND. DN8e QIe IeQ! QDe DeQa IjQe 8IQe DjQe QDse I*N +NI* DNI* +ND", -"e *NI. IN8* I*ND. +De8N QI* QI+e DeQ* QD+e IjQ* 8IQ* I*jQD QIs* WIe IeW! JW", -"e WaJe IeW. 8IWe WeJ. W8Je QIWe GQIe! ZJe JaZe IjWe GQ8Ie JjZe ZJse fWI +Wf", -"I JfW gWJf WIf. W8fI fWJ. JWf8 fQI +QfI ZfJ gJZf WIfj Q8fI JjZf ZfsJ Ime I!", -"em Dem aeDm Im5e Im8e Dm5e 8eDm ImQe ImeQ! DmQe aemQD pIe 8Ipe pDe pDse Im*", -" Im+e ImD* De+m Im5* Im>e Im*5D De>m ImQ* Im*+Q DeQ; ae;QD pI* pI>e Dep* pD", -">e ImWe ImeW! Jme aeJm WI5e G8mIe 5WJe 8eJm ImeGQ GQIem! JmZe ZJaem WIpe pG", -"8Ie Jpe seJp fvI f+vI Jvf gfJv vIf5 vIf> fvJ5 f>Jv vIfQ fv+QI JvZf ZfJgv fp", -"I pIf> Jpf yJf h h& hD hc h. h8 hD. hc8 hK h&K hT hcT hj h8j hTj hs h* h- h", -"D* hc- h*. h-8 D*h. c-h8 h*K h-K hT* h-T hj* h-j D*hj hs- hG hG& hJ hJc hG.", -" h8G hJ. hJ8 hGK G&hK hJT cJhT hjG G8hj hJj hsJ hf hf- hJf i hf. hf8 h.Jf i", -"8 hfK hKf- hfT iT hfj f-hj Jfhj is h2 h&2 hD2 hc2 h5 h58 h5D hc5 h2K &2hK h", -"T2 c2hT h5j 5&hj h5T hs5 h; h-; h;D hc; h5; h> 5Dh; h>c h;K -;hK hT; c;hT h", -";j h>j 5Th; hs> hG2 G&h2 hJ2 h2cJ h5G G5h8 hJ5 cJh5 G2hK hG&2K JTh2 cJTh2 G", -"5hj h5G&j J5hT h5sJ hf; f-h; hJ; i; hf5 h>f Jfh5 i> f;hK f-;hK J;hT iT; f5h", -"j hjf> J;hj is> hN h&N hDN hcN hN. h8N DNh. c8hN hQ hQ& hQD hcQ hQj hQ8 QDh", -"j hsQ h*N h-N D*hN hNc- *Nh. -8hN hD*N. c-8hN hQ* h-Q QDh* c-hQ Q*hj -Qh8 h", -"QD*j hQs- hW hW& hJW hcW hW. hW8 JWh. cWh8 hWQ GQh& hZ hZc hWj GQh8 hZj hZs", -" hfW h-W JfhW iW fWh. f8hW JfWh. iW8 hfQ f-hQ hZf iZ fQhj fQh8 hjZf iZs hm ", -"hm& hmD hcm h5m h8m 5Dhm c5hm hQm Q&hm hTm cQhm hp hp8 hpD hps hm; h-m Dmh;", -" c-hm 5*hm h>m h5Dm* hmc> hQ; -Qhm QDh; cQh; hp; hp- pDh; cph> hWm Gmh& hJm", -" cJhm h5W G8hm J5hW c5hW GQhm hWQm& hZm hmZc hpG pGh8 hZp cphZ hv hv- hvJ i", -"v hv5 hv> h5Jv iv> hvQ hQ-v hZv iZv hpf fph> Jphv yi e0 e0! e0B ae0 1e 1e8 ", -"1eB 1ae e0K !Ke0 Te0 T0ae 1ej 18ej 1Te se1 e*0 +e0 e0*B +0ae 1e* 1+e *B1e +", -"e1a *0eK e0+K e*T0 +0Te ej1* +j1e Te1* 1+se Ge0 e0G! He0 G0ae 1Ge G81e 1He ", -"Ga1e e0GK Ge0!K G0Te ae0GT Gj1e 1G8ej GT1e 1Gse f0 f+0 fH0 gf0 f1 f1+ f1H g", -"f1 f0K +0fK fT0 g0fT f1j 1+fj f1T sf1 e02 !0e2 2Be0 e2a0 1e5 158e 1B5e 5a1e", -" 2Ke0 e02!K e0T2 ae0T2 15ej 1e58j 5T1e 1es5 e;0 +0e; ;0eB a0e; 1e; >e1 1Be;", -" 1a>e ;0eK e;0+K T0e; ae;T0 ej1; 1e>j Te1; s1>e e0G2 Ge0!2 e0H2 ae0G2 G51e ", -"1G58e H51e 1Ga5e Ge02K e02GK! GTe02 GT0ae2 1G5ej G581ej 1GT5e se1G5 f;0 +;f", -"0 H;f0 f;g0 f15 f>1 1Hf5 g1f> ;0fK f+;0K T;f0 fT;g0 1;fj >jf1 1Tf5 f1s> e0N", -" !0eN 0BeN e0aN 1eN 1N8e eN1B 1Nae Qe0 e0Q! Q0Te Q0ae 1Qe Q81e Qe1T 1Qse *0", -"eN e0+N *Be0N ae0+N e*1N 1N+e 1e*NB 1+eaN e*Q0 +0Qe QeT*0 +QeT0 Qe1* +Q1e 1", -"QeT* se1+Q We0 e0W! H0We W0ae 1We W81e He1W Wa1e G0Qe GQe!0 Ze0 aeZ0 GQ1e 1", -"GQ8e Z1e Z1se fW0 +Wf0 HWf0 fWg0 f1W 1+fW 1HfW gWf1 fQ0 +Qf0 Zf0 g0Zf f1Q 1", -"+fQ Zf1 g1Zf em0 e!m0 m0eB a0em 1em 8e1m 1Bem ae1m Q0em em0Q! T0em aemQ0 pe", -"1 1ep8 1Tpe s1pe e0m* +0em em;0B aem+0 em1; 1e>m 1em*B >e1am Q0e; +Qem0 Qe;", -"T0 ae;Q0 1ep* p1>e pe1T; >eps1 G0em em0W! H0em aemG0 Gm1e 1Gm8e He1m aem1G ", -"em0GQ GQ0em! emZ0 Zeam0 1Gpe pG81e peZ1 Zpes1 fv0 v+f0 vHf0 g0fv fv1 v>f1 f", -"Hv1 fvg1 vQf0 fv+Q0 Z0fv Zfgv0 fp1 p>f1 Z1fp yf1 9e 9e& 9eB 9ae ,1e :e ,B1e", -" :ea 9eK 9Ke& 9Te Te9a 9ej :ej 1T9e s:e 9e* -9e *B9e 9a-e 1e9* :-e ,1e*B -a", -":e e*9K 9e-K Te9* 9T-e ej9* -j:e ,1Te* :-se ,G9 G&9e 9He 9G,a ,1G :Ge 1G,H ", -":He ,K9G e&K9G 9G,T ,GT9a 9G,j ,G:j 1G,T :Gse f9 f-9 f9H gf9 f91 :f ,1fH :f", -"g f9K fK-9 f9T fTg9 f9j :fj ,1fT sf: 9e2 92e& e29B 92ae 95e :e5 9B5e 5a:e e", -"29K e&29K 92Te 9Te&2 5e9j 5e:j 5T9e s5:e 9e; 9e-; 9Be; ae9; 1e,; >e: ,1;eB ", -":a>e 9Ke; -9e;K Te9; -T9e; e;9j >j:e e;j9T s:>e ,29G e&29G 92He ,Ga92 9G,5 ", -",G:5 H59e H5:e ,G92K 9G2e&K ,GT92 ae29GT ,1G5j :G5,j ,1G5T :Hes5 f9; -9f; 9", -"Hf; g;f9 f95 :f> 9Hf5 f>g: 9;fK f-9;K 9Tf; f-T9; 95fj fj:> 95fT s:f> 9eN 9N", -"e& eN9B 9Nae ,N1e :eN ,1eNB ae:N 9Qe Q&9e Qe9T Qa9e 1Q9e :Qe ,1QTe :Qse e*9", -"N 9e-N 9e*NB -9aeN ,1e*N -e:N 1eN9*B :-aeN Qe9* 9Q-e 9QeT* -Q9Te ,1Qe* -Q:e", -" 1Qe9T* s-:Qe 9We W&9e He9W Wa9e 1G,W :We ,1GHW He:W 9G,Q ,GQ9& Z9e 9aZe 1G", -",Q ,G:Q ,1Ze Z:e f9W -Wf9 9HfW gWf9 ,1fW :fW f91HW :Wgf f9Q -Qf9 Zf9 g9Zf ,", -"1fQ :fQ f9Z1 Z:f 9em e&9m 9Bem ae9m 1e,m :em ,1meB ae:m Qe9m em&9Q Te9m aem", -"9Q p9e :pe 9Tpe se:p em9; 9e-m 9em*B -m9ae ,1me; :m>e emB,1; :-mae Qe9; -Q9", -"em 9QeT; -Tm9e 9ep* >e:p p9eT; -ps:e 9G,m em&9G He9m aem9G 1G,m ,G:m ,1GHm ", -"He:m ,GQ9m 9GQem& 9eZm Z9eam ,1pG pG:e p9Ze Ze:p fv9 f9-v fHv9 fvg9 v9f1 :f", -"v fv91H gf:v v9fQ -vf9Q fvZ9 Zf9-v fp9 :fp Z9fp y:f Ie0 I!e0 De0 D0ae 1Ie 8", -"I1e 1De D81e e0IK Ie0!K D0Te ae0TI Ij1e Ije18 De1T 1Dse I*0 +0I* D0I* +0De ", -"1I* +I1e De1* +D1e *0IK I*0+K T0I* +DeT0 Ij1* I*j1+ TI1* 1Is* IeG0 GIe!0 Je", -"0 aeJ0 GI1e 1G8Ie J1e 1aJe GIe0K Ie0GK! TeJ0 JTae0 Ije1G 1G8Ije 1TJe J1se f", -"I0 +If0 Jf0 g0Jf f1I 1+fI Jf1 Jfg1 I0fK f+I0K J0fT JfTg0 1Ifj f1+Ij f1Jj J1", -"sf e0I2 Ie0!2 e0D2 ae0I2 5I1e 1I58e 5D1e 1De5a Ie02K e02IK! DeT02 TI0ae2 Ij", -"e15 5I81ej 1De5T sI15e I0e; I;e+0 D0e; ae;D0 5I1* 1I>e De1; 1D>e I;e0K +I0e", -";K De;T0 ae0TI; I;j1e >I1ej e;j1D sI*>1 GIe02 Ie0G2! e0J2 Jae02 1G5Ie G581I", -"e 1eJ5 J158e Ie0G2K !0I2GeK JTe02 ae0JT2 1G5Ije 8eGj1I5 J15Te sJ15e I;f0 f+", -"I;0 f;J0 Jf;g0 1If5 >If1 f1J5 J1f> fI;0K I;0f+K JfT;0 fT;gJ0 f15Ij f>1Ij Jf", -"15T J>sf1 e0IN Ie0!N e0DN ae0DN Ie1N 1I8eN 1NDe 1DeaN IeQ0 QIe!0 Q0De QDea0", -" QI1e 1QI8e QD1e sI1Qe *0IN I*0+N I*0DN +De0N 1NI* 1+IeN 1De*N 1+DeN Q0I* +", -"QIe0 QDe*0 +QDe0 QI1* 1+QI* 1QDI* sI*1Q IeW0 WIe!0 WeJ0 JWae0 WI1e 1WI8e 1W", -"Je J1W8e GQIe0 QI0We! JeZ0 ZJae0 1GQIe W8I1Qe J1Ze sJZ1e WIf0 f+WI0 fWJ0 Jf", -"Wg0 1WfI f1+WI JWf1 Jf1gW QIf0 fQ+I0 Z0Jf ZfJg0 1QfI f1Q+I JfZ1 Zf1sJ I0em ", -"Ime!0 D0em aemD0 Im1e 1Im8e De1m aem1D ImeQ0 QI0em! QDem0 ae0TIm 1Ipe pI81e", -" 1Dpe pDes1 I0m* Im*+0 Im*D0 am*I0 Im1* >I1em Im*1D >eD1m Im*Q0 Im0+Qe Im*T", -"0 ae0QD; 1Ip* >ep1I pDe1; sI*p1 ImeG0 WI0em! emJ0 Jmae0 1GmIe W8I1em 1eJm J", -"1m8e GQIem0 ImQeW!0 ZJem0 JmaZe0 pG1Ie 1WIpe8 peJ1 Jps1e f0vI fv+I0 J0fv Jv", -"gf0 vIf1 f>v1I fvJ1 J>fv1 fvQI0 vI+fQ0 ZfJv0 JvgZf0 pIf1 fp>1I J1fp Jfy1 h9", -" h9& h9D hc9 h1 h: h1D h:c h9K 9&hK hT9 c9hT h1j h:j h1T hs: h9* h-9 9Dh* h", -"9c- h1* h:- 1Dh* :ch- 9*hK -9hK 9Th* h9-T 9*hj :-hj 1Th* s-h: h9G 9Gh& hJ9 ", -"J9hc h1G h:G hJ1 :Jh 9GhK h9G&K J9hT cJ9hT 9Ghj :Ghj J9hj :Jhs hf9 f9h- Jf9", -" i9 hf1 :fh Jfh1 i: hKf9 f-9hK f9hT i9T f9hj hj:f f9Jj is: h92 9&h2 9Dh2 c2", -"h9 h15 h:5 95hD :ch5 92hK h9&2K 9Th2 hc9T2 95hj :5hj 95hT s:h5 h;9 -9h; 9Dh", -"; h9c; h1; h>: 1Dh; c>h: 9;hK h-9;K 9Th; hc;9T 9;hj :>hj 1Th; s:h> 9Gh2 h9G", -"&2 h2J9 cJ9h2 9Gh5 :Gh5 J9h5 h5:J h9G2K 9G&h2K J9Th2 hcTJ92 h1G5j h:G5j J95", -"hT hsJ:5 f9h; f-9h; J9h; i9; f9h5 :fh> J1h; i:> f9;hK h-;f9K Jf9T; 9Ti; f95", -"hj h>:fj Jf95T s:i> h9N 9&hN 9DhN c9hN h1N h:N 1DhN hN:c hQ9 9Qh& 9QhT h9cQ", -" h1Q h:Q 1QhT s:hQ 9*hN -9hN h9D*N c-9hN 1*hN hN:- h1D*N h:c-N 9Qh* h9-Q hQ", -"9D* c-Qh9 1Qh* :-hQ h1QD* h:Qs- hW9 9Wh& J9hW h9cW h1W h:W J1hW hW:J 9GhQ h", -"W9Q& hZ9 Z9hc 9Whj :GhQ hZ1 hZ: f9hW h9-W JWf9 i9W f1hW hW:f Jf91W i:W f9hQ", -" f-Qh9 Z9hf iZ9 f1hQ hQ:f h1Zf iZ: hm9 9mh& 9Dhm h9cm h1m h:m 1Dhm :chm 9Qh", -"m hQ9m& 9Thm hcQ9m hp9 hp: p9hT h:cp 9mh; h9-m hm9D; c-mh9 1mh; :-hm h1mD; ", -"h:mc> 9Qh; h-Q9m hQ;9D cQ;h9 p9h; h:-p hp9D; cp-h: 9Ghm hW9m& J9hm cJmh9 95", -"hW :Ghm J1hm hm:J hW9Qm 9GQhm& Z9hm hZc9m p9hW hW:p h1Jp Z:hp hv9 v9h- J9hv", -" iv9 hv1 hv: h1Jv i:v v9hQ hv-9Q Z9hv Zvi9 h1fp :fhp Zvh1 yi: eL eL! eLB ae", -"L eL. 8eL .BeL 8Lae Me Me! TeM aMe Mej 8Me TMej seM e*L +eL eL*B +Lae *Le. ", -"+L8e *BeL. aeL8* Me* +Me MeT* Te+M ejM* 8M+e Me*Tj +Mse GeL eLG! HeL GLae e", -"LG. GL8e eLH. HL8e GMe G!Me HMe aMHe MeGj 8eGM MeHj GMse fL f+L fHL gfL fL.", -" f8L HLf. gLf8 fM fM+ fTM gfM fMj f8M HMfj sfM eL2 !Le2 2BeL e2aL 5eL 5L8e ", -"eL5B 5Lae Me2 M!e2 T2Me M2ae 5Me 8M5e Te5M 5Mse e;L +Le; ;LeB aLe; 5Le; >eL", -" e;L5B ae>L Me; M;+e MeT; Mea; Me5* >Me Me;5T se>M eLG2 GeL!2 eLH2 aeLG2 GL", -"5e G58eL HL5e G5aeL G2Me Me2G! H2Me aMeG2 5eGM G5M8e 5MHe se5GM f;L +;fL H;", -"fL f;gL f5L f>L H5fL >Lgf fM; +Mf; HMf; g;fM f5M f>M H5fM >Msf eLN !LeN NBe", -"L eLaN N.eL eN8L eLN.B aeL8N QeM Q!Me QTMe aMQe QMej 8MQe MejQT QesM *LeN e", -"L+N *BeLN aeL+N e*LN. +e8LN eLN*B. 8eLa*N MeQ* Qe+M Me*QT aMe+Q Me*Qj +Qe8M", -" QeTM*j se+QM WeL eLW! HLWe WLae eLW. WL8e HeWL. H8eWL WMe W!Me ZeM aMZe Me", -"Wj 8MWe MeZj sMZe fWL +WfL HWfL fWgL WLf. W8fL fHWL. f8WgL fQM +WfM ZfM gMZ", -"f WMfj W8fM ZMfj fMsZ emL e!mL mLeB aLem 5Lem 8Lem emL5B aem5L Mem M!em MeT", -"m Meam peM 8Mpe TepM sMpe eLm* +Lem em;LB aem+L em;5L em>L 5eLm*B >eamL MeQ", -"; Me+m MemT; aMe+m Mep* pe>M peTM; >Mesp GLem emLW! HLem aemGL 5LWe G8meL H", -"5eWL H8emL MeGm MemW! MeZm ZeaMm GMpe pG8Me ZMpe ZpesM fvL v+fL vHfL gLfv v", -"5fL >Lfv fvH5L f>gvL fvM f+vM fMZv fvgM fpM >Mfp fMZp yfM ,eL e&L eL,B ,Lae", -" eL,. ,L8e ,eL.B aeL,8 ,Me Me& Te,M ae,M Me,j 8e,M Mej,T ,Mse e*,L -eL *Be,", -"L ae-L ,e*L. 8e-L ,eL*B. -8aeL ,eM* -Me Me*,T Te-M Me*,j 8M-e ,TMej* -Mse ,", -"GL ,LG& ,LHe ,LGa GL,. ,LG8 ,GHL. ,G8HL ,GM G&,M GT,M Ga,M GM,j G8,M ,GTMj ", -",GsM f,L f-L ,HfL gLf- ,Lf. -8fL fH,L. f-8gL fM, f-M ,HfM f-gM ,Mfj -Mf8 fT", -"M,j fMs- eL,2 &Le2 ,eL2B aeL,2 ,L5e 5Le& ,5eLB ,5aeL ,2Me M2e& Me2,T aMe,2 ", -"5e,M Me5& ,5TMe se5,M ,Le; e;-L e;L,B ae;-L e;L,5 -e>L ,5Le;B >e-aL Me,; Me", -"-; Me;,T -TMe; Me;,5 -M>e ,5TMe; s->Me GL,2 e&LG2 ,GHL2 ,GaL2 ,LG5 ,G58L ,G", -"5HL ,G5aL ,2GM Me&G2 ,GTM2 Me&H2 G5,M Me&G5 ,G5HM sG,5M ,;fL -;fL fH;,L f-;", -"gL ,5fL >Lf- f5H,L f>g-L ,Mf; f;-M fTM,; f-TM; ,5fM f->M f5T,M f>Ms- eL,N &", -"LeN ,eLNB aeL,N ,eLN. e&L8N eLN,.B ,8LaeN Qe,M MeQ& ,QTMe aMe,Q Mej,Q Me&Q8", -" ,QTMej seM,Q ,e*LN eL-N ,eL*BN -aeLN e*L,N. -8eLN NB*L,e. aeL-8N Me*,Q Qe-", -"M ,QTMe* -QTMe ,QMej* -Q8Me QMej,T* s-QMe ,LWe WLe& ,GHWL ,GaWL ,GWL. ,G8WL", -" HeL,W. aeL,W8 GQ,M MeW& ,GZM MeZ& ,GQMj Me&W8 ZeM,j Ze&sM ,WfL fL-W fHW,L ", -"f-WgL fW,L. f-W8L ,HWfL. gf8-WL ,WfM -WfM fMZ, fMZ- fQM,j f-Q8M ZfM,j sfZ-M", -" ,Lem eLm& emL,B aem,L emL,5 em&5L ,5LemB aeL,8m Me,m emM& Mem,T aMe,m ,Mpe", -" Mep& peT,M pe&sM em;,L em-L ,mLe;B -maeL ,5em*L >e-mL 5m*B,eL -ma>eL Mem,;", -" Me-m ,TmMe; -TmMe peM,; pe-M Me;p,T -psMe ,LGm em&GL ,GmHL em&HL ,G5WL ,G8", -"mL emL,H5 aeL,5W GM,m MemG& ZeM,m Ze&Mm ,GpM pG&,M Zpe,M ZpeM& fLv, fL-v fv", -"H,L -vgfL fv5,L f>-vL v,Hf5L -vgf>L v,fM fM-v Zfv,M -vMZf p,fM fM-p fpZ,M f", -"-yM Ue Ue! UeD Uae Ue. U8e U.De D8Ue UeM U!Me Ve Vea Uej 8MUe Vej seV Ue* U", -"+e DeU* +DUe U.I* +eU8 I*.UD U+eD8 IM* +MUe Ve* V+e I*Uj +eUj I*Vj V+se UGe", -" GeU! JUe UaJe GeU. G8Ue UeJ. U8Je GMUe IM!Ge VJe JaVe GjUe UG8Me VeJj VJse", -" fU fU+ JfU gfU fU. fU8 J.fU fUJ8 fUM U+fM Vf Vfg fUj U+fj Vfj sfV Ue2 e2U!", -" U2De U2ae U5e 5eU8 5DUe 5aUe U2Me IM2e! Ve2 aeV2 5MUe U5e8M V5e V5se Ue; +", -"eU; DeU; aeU; 5IU* >eU U5eD; Ua>e MeU; IM;+e Ve; +eV; IM5* Ue>M 5IV* V>e Ge", -"U2 UGe!2 UeJ2 JUae2 G5Ue UG58e U5Je J5U8e IM2Ge UG2Me! JeV2 VJae2 UG5Me G5M", -"U8e VeJ5 seVJ5 fU; U+f; fUJ; g;fU fU5 f>U fUJ5 gUf> U;fM fU+M; Vf; V;gf U5f", -"M fU>M Vf5 Vf> UeN eNU! UNDe UNae eNU. UN8e UeDN. U8eDN UQe Q!Ue VeQ QaVe Q", -"eUj Q8Ue QeVj sQVe UNI* UN+e I*NUD U+eDN I*NU. U+e8N DeNU*. aeNU8* QIU* +QU", -"e QIV* +QVe IM*Qj IM*Q8 VeQ*j sI*VQ UWe U!We UWJe WaUe U.We W8Ue JUWe. J8UW", -"e GQUe UGQe! ZeV ZaVe WeUj UGQ8e ZjVe VZse fUW U+fW JWfU gWfU UWf. UWf8 JfU", -"W. Jf8UW fUQ U+fQ VfZ ZfgV UWfj UQf8 fjVZ sZVf Uem U!em DeUm aeUm 5eUm 8eUm", -" U5eDm aemU5 QeUm IMme! Vem aeVm pUe U8pe Vpe seVp ImU* +eUm Im*UD aemU+ Im", -"*U5 Ue>m 5DeUm* >eUDm QeU; IMm+e QeV; +eVm Uep* pU>e pIV* >eVp GmUe UGme! U", -"eJm JmUae 5WUe UG8em J5UWe J8mUe IMmWe Im!WMe VeJm ZeVam UGpe pUG8e ZeVp Jp", -"Vse fvU f+vU fUJv fvgU vUf5 v>fU JvfU5 J>fvU vUfQ fvU+Q Vfv gfVv fpU p>fU f", -"pV yVf hU hU& hUD hcU hU. h8U UDh. cUh8 hM hM& Vh Vhc hMj h8M Vhj hsV hU* h", -"-U U*hD -Uhc U*h. -Uh8 hUD*. c-Uh8 hM* h-M Vh* V-h U*hj -Uhj V*hj V-hs hUG ", -"UGh& hJU hUcJ UGh. UGh8 JUh. hUJ8 hMG GMh& VhJ cJVh UGhj G8hM JjVh VhsJ hfU", -" f-U fUhJ iU h.fU fUh8 JfUh. iU8 hfM f-hM Vfh iV fUhj f8hM hjVf iVs hU2 U&h", -"2 UDh2 c2hU h5U U5h8 U5hD hUc5 hM2 M&h2 Vh2 h2Vc h5M 5Mh8 Vh5 c5Vh h;U -Uh;", -" U;hD hUc; U5h; h>U h5UD; >Uhc hM; -Mh; Vh; h;V- U;hj h>M V5h; h>V UGh2 hUG", -"&2 JUh2 cJUh2 UGh5 h5UG8 hUJ5 cJ5hU GMh2 hMG&2 h2VJ VhJc2 G5hM h5MG8 J5Vh V", -"h5sJ fUh; f;-U hUJ; iU; fUh5 fUh> Jf5hU i>U fMh; f-UM; h;Vf iV; f5hM hf>M h", -"5Vf iV> hUN U&hN UDhN cUhN UNh. U8hN hUDN. hcU8N hQU UQh& VhQ cQVh UQhj UQh", -"8 VQhj VshQ U*hN hN-U hUD*N c-UhN hU*N. -U8hN U*DhN. hc8-UN UQh* -UhQ V*hQ ", -"hQV- hQU*j -UQh8 VhQ*j V-hsQ hWU UWh& JUhW hUcW UWh. UWh8 hJUW. hJ8UW hWM W", -"Mh& hZV VhZc UWhj W8hM VZhj sZVh fUhW -UhW JfUhW iUW fUWh. f-UW8 hJWfU. UWi", -"8 fUhQ -UfQ VfhZ iZV fUQhj f-UWj VfZhj sZiV hmU Umh& UmhD hUcm U5hm U8hm h5", -"UDm hc5Um hMm Mmh& Vhm cmVh hpU pUh8 hpV Vphs Umh; -Uhm hmUD; c-mhU h5Um* >", -"Uhm U5*hmD h>cUm UQh; -Mhm Vmh; hmV- pUh; >Mhp h;Vp V-hp UGhm hWUm& hUJm cJ", -"mhU U5hW h5WU8 hJ5UW c5WhU GMhm hWMm& JmVh VhmZc pUhW hpUG8 VphZ cpJVh hvU ", -"fU-v vUhJ ivU vUh5 vUh> hvJU5 v>iU hvM hM-v hvV iVv hMfp >Mhv Vfhp yiV ke k", -"e! keB ake 1ek 8ke 1Bke ak1e keM M!ke Tke akTe le le8 leT lse ke* +ke *Bke ", -"ak+e ke1* +k1e ke*1B ake1+ Mek* ke+M keT* Tk+e le* l+e Tel* sel+ Gke G!ke H", -"ke akHe Gk1e 8eGk Hk1e 8kHe keGM keMG! TkHe akeGT lGe G8le lHe sGle fk fk+ ", -"fkH gfk f1k f8k 1Hfk f1gk fkM +kfM fTk fTgk lf lf+ lfH glf ke2 k!e2 e2kB k2", -"ae 5ke 8k5e 5Bke ak5e k2Me keM!2 T2ke akeT2 le5 5el8 5Tle l5se ke; k;+e kBe", -"; kea; ke1; >ke ke;1B ak>e Mek; ke;+M keT; akeT; le; l>e Tel; >els G2ke ke2", -"G! H2ke akeG2 5eGk G5k8e 5kHe akeG5 keMG2 Gk2Me! GTke2 ak2HMe G5le lG58e H5", -"le lsG5e fk; +kf; Hkf; g;fk f5k f>k H5fk gf>k k;fM fk+M; Tkf; fTkg; lf5 lf>", -" f5lH l>sf keN k!eN eNkB aNke 1Nke kN8e keN1B ake1N Qke Q!ke TkQe akQe leQ ", -"Q8le QelT lQse e*kN +Nke ke*NB ake+N ke*1N 1+ekN 1eNk*B akN1+e keQ* Qk+e Qk", -"eT* ake+Q Qel* +Qle leQT* lse+Q Wke W!ke WkHe akWe Wk1e 8kWe 1HeWk ake1W Qk", -"We GQke! Zke akZe lWe W8le lZe sZle fkW +Wfk HkfW gWfk 1Wfk W8fk f1HWk f8kg", -"W fQk +Qfk Zfk gkZf lfW fQl+ lfZ Zfgl kem k!em kBem keam ke1m ke8m kem1B ak", -"e1m kmQe kemQ! keTm akeTm lep l8pe lTpe sple emk; ke+m kem*B ake+m kem1; ke", -">m keB1m* >keam keQ; kem+Q kemT; akeQ; pel; p>le lepT; l>esp keGm kemW! keH", -"m akeGm Wk5e kemG8 kem1H ake5W kemGQ ke!GMm keZm Zkeam pGle lGp8e Zple lZes", -"p fvk f+vk fHvk fvgk v1fk fv>k fv1Hk f>kgv vkfQ fvk+Q fvZk Zfkgv lfp l>fp Z", -"flv ylf ,ke ke& ,Bke ak9e 1e,k :ek keB,1 ak:e 9Me Mek& Tk9e aM9e le9 l:e ,T", -"le s:le ke9* -ke ke*,B ak-e ke*,1 -k:e ,1ek*B :-ake Me9* 9M-e ,Tke* Tk-e 9e", -"l* l-e le9T* les- ,Gk G&,k Gk,H Ga,k 1G,k ,G:k ,1GHk Hk:e 9G,M ke&GM GT,k a", -"Me9G lG, :Gle ,GlH sGl, f9k f-k ,Hfk f-gk ,1fk :fk f91Hk gk:f f9M -kfM ,Tfk", -" f9gM lf9 lf: f9lH sfl- ,2ke k2e& ke2,B ake,2 5k9e 5k:e ,5keB :e5ak 92Me ke", -"&M2 ,Tke2 aMe92 ,5le l5:e le95T lse:5 ke,; ke-; ke;,B -kae; ke;,1 :e>k keB,", -"1; >k-ae Me9; -kMe; ke;,T -Tke; ,;le >el- le;,T l>es- ,2Gk ke&G2 ,GkH2 ke&H", -"2 G5,k :G5,k ,G5Hk :He5k ,GkM2 ke2GM& ,GTk2 ak2,GT ,Gl5 l:G,5 lG,H5 :Hel5 ,", -"kf; f;-k f9Hk; f-kg; ,5fk >k:f f95Hk f>kg: 9Mf; f-kM; f9Tk; f-Tk; f9l; l>:f", -" lf9H5 glf:> ,Nke kNe& keN,B ake,N keN,1 ke:N ,1NkeB :eakN Qk9e keQ& ,QkTe ", -"ake,Q ,Qle :Qle le9QT :Qels ke*,N ke-N 9eNk*B -kaeN ,1ek*N :-keN ke1*,NB -k", -"a:eN ,Qke* Qk-e Qke9T* -QkTe le9Q* -Qle 9Qel*T l-sQe Gk,W keW& ,GkHW ake,W ", -",1GWk Wk:e 1He,Wk :HeWk GQ,k ke&GQ ,GZk keZ& ,GlW :Wle Z9le leZ: ,Wfk -Wfk ", -"f9HWk f-kgW f91Wk fk:W ,1HfkW :fgWk ,Qfk -Qfk f9Zk f-Zk f9lW lW:f l,Zf Z:lf", -" ke,m emk& kem,B ake,m kem,1 ke:m keB,1m :emak Me9m kemQ& kem,T aMe9m p9le ", -"le:p lep,T :pels kem,; ke-m keB9m* -kmae ,1mke; :-mke ke,m1;B :ea-km ke;,Q ", -"-Qkem ,Tmke; -Tkem lep,; le-p leTp9* l-pse Gk,m kemG& kem,H akm,G ,1Gkm :Gm", -",k ,1Hkem :Hekm Mem9G ,GQkm& Z9ekm Zkem& pGl, :pGle lZep9 Z:elp v9fk fk-v f", -"v9Hk -vkgf fv95k fk:v f1Hvk, :fvgk v9fM -vkfQ Zf9vk Z-kfv l,fp :flv fp9lZ l", -"fy: Uek U!ke Dke akUe 1Ue U81e Ue1D Ua1e keIM IkMe! Vek akVe lIe U8le leV s", -"Ile Ik* +kUe IkD* Dk+e Ue1* U+1e Ik*1D ak*1I k*IM Ik*+M IkV* +kVe lI* U+le ", -"Vel* sIl* GkUe Ik!Ge Jke akJe UG1e 1UG8e 1UJe 8kJe IkMGe UGkMe! VeJk JkVae ", -"UGle lGU8e lJe lesJ fUk U+fk Jfk Jfgk f1U 1Uf8 f1Jk f1gU IkfM fU+kM Vfk gkV", -"f lfU fUl+ lfJ Vfgl U2ke Ik2e! D2ke akeU2 U51e 1Ue58 Dk5e akeU5 IkMe2 ke2IM", -"! keV2 Veka2 U5le lI58e V5le seVl5 keU; Ik;+e keD; akeU; Ue1; 1U>e Ik*5D Dk", -">e Ik;Me +IkMe; keV; V+ek; Uel; lI>e Vel; leV> Ik2Ge UG2ke! keJ2 Jkae2 1UG5", -"e G5kU8e 5kJe J5k8e UGkMe2 IkGMe2! JkVe2 VeaJk2 lGU5e UG5le8 J5le lJs5e U;f", -"k fU+k; fkJ; Jfkg; 1Uf5 fU>k f5Jk Jf>k fUkM; Ik;fM+ V;fk Vfgk; fUl; lIf> l;", -"Vf J>lf UNke IkNe! DNke akeUN 1NUe 1Ue8N 1UeDN 1UaeN QkUe UQek! QkVe VeQak ", -"UQle lIQ8e lQVe seVlQ INk* Ik*+N Ik*DN ak*IN Ik*1N Ik*8N IkN1D* akN1I* IkQ*", -" Ik*+Q VeQk* V+eQk QIl* l+IQe lI*VQ sI*lQ WkUe UWek! WkJe JkWae UW1e 1UW8e ", -"J1UWe J8kWe UGQke Ik!WMe JkZe ZJkae UWle lWI8e ZJle lJZse UWfk fU+Wk JWfk J", -"fkgW 1UfW f1U+W Jf1UW Jf8Wk UQfk fUQ+k ZkVf VfZgk fUlW lfU+W ZflJ glJZf keU", -"m Ikme! keDm akeUm Ue1m Ikm8e kem1D aem1U IkmQe Ik!Mem keVm Vemak pUle lIp8", -"e leVp Vpels kmI* Ikm+e IkmD* akmI* Ikm1* >kIem 1Dekm* >kDem IkmQ* U+Qkem V", -"emk; V+ekm pIl* l>Ipe Vpel; V>elp IkmWe Im!Wke keJm Jkmae 1UGem UG8kem J1mU", -"e J8kem UGQkem ImQkWe! ZJkem ZkaVem lGpUe lG8pUe leJp Jplse vUfk fvU+k fvJk", -" Jvkgf v1fU f>Uv1 Jv1fU J>kfv fvUQk fQ+vIk fkVv Vfvgk lIfp fpUl> Jplf lfyJ ", -"ht ht& htD htc ht1 h:t t1hD t:hc htM tMh& Vht tcVh lh lh: lhV uh ht* t-h hD", -"t* hct- t*h1 t-h: t*1hD h:tc- t*hM hMt- t*Vh Vht- lh* l-h l*Vh uh- htG h&tG", -" tJh hctJ tGh1 tGh: h1tJ tJh: tGhM tGMh& VhtJ tJVhc lhG lGh: lJh uJh tf tf-", -" tfJ it tf1 tf: J1tf it: tfM fMt- tfV iVt lfh tfl- lJtf ui ht2 t&h2 tDh2 h2", -"tc ht5 t:h5 hDt5 tch5 tMh2 htM&2 h2Vt Vhtc2 lh5 h5l: t5Vh uh5 ht; h;t- hDt;", -" tch; t5h; h>t t5*hD htc> t;hM t-hM; t;Vh V-ht; lh; h>l l;Vh uh> h2tG tG&h2", -" h2tJ tJhc2 tGh5 t:Gh5 h5tJ tJ5h: tGMh2 hM&tG2 tJVh2 VhctJ2 h5lG lh:G5 h5lJ", -" hJu5 tf; f-t; h;tJ it; tf5 tf> Jft5 it> fMt; tf-M; t;Vf t;iV l;tf h>lf hJl", -"; ui> htN t&hN tDhN hNtc t1hN hNt: ht1DN h:tcN htQ h&tQ tQVh tchQ lhQ hQl: ", -"VlhQ uhQ hNt* hNt- t*DhN t-hcN t*1hN h:t-N h1Dt*N t-ch:N t*hQ hQt- tQ*Vh V-", -"htQ hQl* hQl- lhVQ* h-uQ htW h&tW hWtJ tchW tWh1 t:hW tJh1W h:WtJ tGhQ tGQh", -"& hZt htZc lhW lWh: hZl uZh tfW hWt- JftW itW f1tW tW:f tfJ1W t:iW tfQ f-tQ", -" tZf iZt lWtf h-lW hZlf uiZ htm h&tm hDtm tchm t5hm t:hm ht5Dm h:mtc tQhm h", -"tQm& tmVh Vhmtc hpl h:tp Vplh uph tmh; hmt- tm*hD t-mhc t5*hm hmt> tmDh1; h", -">tcm tQh; t-Qhm Vhmt; V-mht l;hp hpl- lh;Vp hpu- tGhm tGmh& hmtJ tJmhc t5hW", -" h:Wt5 tJ5hW :Jmht tGQhm tG&hMm hmtZ hZtcm lGhp lhW:p tZhp hZup hvt t-hv tJ", -"hv itv h1tv tvh> hvtJ1 tvi: hQtv hvt-Q tZhv tZiv lvh hvl- hZlv uiy 3 !3 3B ", -"a3 3. 83 .B3 8a3 3K !K3 T3 Ta3 j3 8j3 Tj3 s3 3( +3 3B( +a3 3(. +83 3(.B 8a+", -"3 3(K +3K T3( +T3 j3( +j3 j3T( s+3 E3 !E3 H3 Ha3 E3. 8E3 H3. H83 EK3 !3EK H", -"T3 TaH3 jE3 jE83 Hj3 sH3 d3 +d3 Hd3 g3 d3. 8d3 d3H. g83 dK3 dK+3 Td3 gT3 dj", -"3 +3dj H3dj gs3 4 4! 4B 4a 45 48 45B 48a 4K 4K! 4T 4Ta 4j 48j 4T5 s4 4; 4+ ", -"4;B 4+a 45; >4 5;4B >4a 4;K 4+K 4T; 4+T 4j; >j4 T;4j s>4 4E 4E! 4H 4Ha 45E ", -"48E 4H5 4H8 4EK EK4! 4HT HT4a 4jE 8j4E 4Hj s4H 4d 4+d 4Hd g4 4d5 >4d H54d g", -">4 4dK +d4K 4Td g4T 4dj 4d>j H;4j gs4 3N !3N 3BN a3N N.3 83N 3BN. aN83 Q3 Q", -"!3 QT3 Qa3 Qj3 Q83 TjQ3 sQ3 3(N +3N 3(NB a3+N 3(N. 83+N 3(N.B +8a3N Q3( +Q3", -" T3Q( +3Qa j3Q( +3Q8 QTj3( +Qs3 W3 W!3 HW3 Wa3 W3. W83 W3H. H3W8 WQ3 W3Q! Z", -"3 Za3 Wj3 W3Q8 Zj3 sZ3 Wd3 +W3 WdH3 gW3 d3W. +3W8 HWd3. W8g3 Qd3 +3Qd Zd3 g", -"Z3 W3dj +3Wj djZ3 g3sZ 4m 4m! 4mB 4am 45m 48m 5m4B 8m4a 4Q 4Q! 4QT 4Qa p4 p", -"48 p4T sp4 4m; 4+m m;4B +m4a 5m4; >m4 45m;B 4a>m 4Q; 4+Q Q;4T +Q4T p4; p>4 ", -"4Tp; p>s4 4W 4W! 4HW 4Wa 4W5 4W8 H54W H84W 4WQ Q!4W Z4 Z4a p4W 4Wp8 Zp4 sZ4", -" v4 v4+ v4H gv4 v45 v>4 4Hv5 v>g4 v4Q 4+vQ Zv4 gZ4 pv4 p4v> pvZ4 y4 #3 &3 #", -"B3 a&3 #3. 8&3 #3.B a&83 #3K &3K T#3 T&3 j#3 &j3 j#T3 s&3 #3( +&3 #3(B a&+3", -" 3(#. 8&+3 .B3#( +8a&3 3(#K &3+K #3T( +3T& #3j( +3&j Tj#3( +&s3 #E3 &E3 H#3", -" H&3 E3#. &E83 #3H. 8&H3 #3EK EK&3 T#H3 H3T& #Ej3 jE&3 j#H3 H&s3 d#3 d&3 d#", -"H3 g&3 #3d. 83d& Hd#3. 8&g3 #3dK &3dK d#T3 T&g3 j#d3 d3&j dj#H3 s&g3 4# 4& ", -"4#B 4a& 45# 48& 5B4# 5a4& 4#K 4&K 4T# 4T& 4j# 4&j 4#5T s4& 4;# 4+& ;#4B a;4", -"& 5;4# >&4 45;#B 4a>& ;#4K 4K;& 4#T; +T4& 4#;j 4&>j ;j#4T >&s4 4#E 4&E 4H# ", -"4H& 5#4E 4E5& 4#H5 H54& EK4# &E4K HT4# H&4T j#4E 4E&j 4#Hj 4Hs& 4d# 4d& 4#H", -"; g4& 4#5d 4d>& 4H5d# >&g4 dK4# 4Kd& 4#Td 4Tg& 4#dj d&4j 4Hjd# g&s4 #3N &3N", -" #3NB &3aN #3N. &38N 3BN#. 8a&3N Q#3 Q&3 T#Q3 Q3T& j#Q3 Q3&j QTj#3 Q&s3 3(#", -"N &3+N 3(N#B +a&3N 3(N#. +8&3N 3B(N.# 8a&+3N #3Q( +3Q& QT#3( +QT&3 Qj#3( &j", -"3+Q Tj#Q3( s+Q&3 W#3 W&3 W#H3 H3W& #3W. 8&W3 HW#3. H8W&3 Q#W3 W3Q& Z#3 Z&3 ", -"j#W3 W3&j j#Z3 s3Z& d#W3 +3W& HWd#3 W&g3 Wd#3. d&3W8 Wd#H3. gW8&3 d#Q3 Q3d&", -" d#Z3 g3Z& dj#W3 d&jW3 Zdj#3 Z&3gs 4m# 4&m m#4B am4& 5m4# 8m4& 45m#B am&48 ", -"4Q# 4Q& 4#Tm Qa4& p4# p&4 4Tp# p&s4 m;4# +m4& 4m;#B am&4+ 45m;# 4&>m 5m;4#B", -" >m4a& 4#Q; +Q4& 4QT;# 4+QT& 4;p# p4>& p4T;# p>4s& 4W# 4W& 4#Hm Hm4& 4#5W 5", -"W4& 4H5W# 4H8W& WQ4# W&4Q Z4# Z4& 4Wp# 4Wp& p4Z# Z&s4 v4# v&4 4Hv# v&g4 45v", -"# v4>& v4H5# gv>4& 4Qv# 4Qv& v4Z# Z&g4 v4p# p4v& Zpv4# y&4 C3 !C3 D3 Da3 C3", -". 8C3 D3. D83 CK3 !3CK DT3 TaD3 jC3 jC83 Dj3 sD3 C3( +C3 D3( +D3 3(C. 8C+3 ", -"3(D. +3D8 3(CK CK+3 T3D( DT+3 C3j( jC+3 j3D( +Ds3 CE3 CE!3 HD3 DaH3 E3C. CE", -"83 D3H. H3D8 C3EK EKC!3 DTH3 HDTa3 CEj3 8jCE3 H3Dj HDs3 dC3 dC+3 Dd3 gD3 C3", -"d. dC83 d3D. D8g3 CKd3 +dC3K D3Td DTg3 jCd3 djC+3 D3dj sDg3 4C 4C! 4D 4Da 4", -"5C 48C 4D5 4D8 4CK CK4! 4DT DT4a 4jC 8j4C 4Dj s4D 4;C 4+C 4D; 4+D 5;4C >C4 ", -"45D; >D4 ;C4K +C4K D;4T +D4T 4C;j 4j>C D;4j >Ds4 4CE !C4E 4HD HD4a 5C4E 8C4", -"E H54D H84D EK4C 4CE!K HD4T 4HDTa jC4E 48jCE Hj4D 4HsD 4dC +d4C 4Dd g4D 4C5", -"d 4d>C 5D4d >Dg4 dK4C 4+dCK Dd4T 4DgT 4Cdj >j4dC Dd4j gDs4 C3N C3!N D3N a3D", -"N C3N. C38N N.D3 83DN QC3 !CQ3 QD3 DaQ3 jCQ3 8CQ3 Q3Dj QDs3 3(CN C3+N 3(DN ", -"D3+N C3N(. +8C3N D3(N. +D83N C3Q( QC+3 D3Q( +3QD QjC3( +Q8C3 QDj3( s+QD3 WC", -"3 !CW3 WD3 DaW3 C3W. 8CW3 D3W. W3D8 QCW3 Q!WC3 ZD3 DaZ3 jCW3 W8QC3 DjZ3 ZDs", -"3 dCW3 WC+3 W3Dd WDg3 WdC3. +W8C3 WDd3. gWD83 dCQ3 +WQC3 DdZ3 ZDg3 djCW3 +W", -"jC3 ZDdj3 gZsD3 4mC mC4! 4Dm Dm4a 5m4C 4C8m 45Dm Dm48 4QC 4CQ! 4QD QD4a p4C", -" 48pC pD4 pDs4 m;4C 4C+m 4mD; +m4D 45m;C 4m>C 4D5m; 4D>m 4CQ; 4C+Q Q;4D +Q4", -"D 4;pC p4>C 4Dp; p4>D 4WC W!4C 4WD WD4a 4C5W 4CW8 5W4D WD48 WQ4C 4WQ!C Z4D ", -"4DZa 4WpC p4W8C pDZ4 sDZ4 v4C 4+vC vD4 vDg4 45vC v4>C 4Dv5 v4>D 4QvC v4+QC ", -"vDZ4 gDZ4 v4pC pv>4C p4vD y4D b3 b&3 bD3 c3 b3. b83 D3b. c83 bK3 &3bK bT3 c", -"T3 bj3 b3&j b3Dj sc3 b3( b+3 D3b( c+3 3(b. +8b3 bD3(. +8c3 3(bK +3bK T3b( +", -"Tc3 j3b( b3+j bTj3( c+s3 bE3 &Eb3 bH3 cH3 E3b. 8Eb3 H3b. H8c3 EKb3 bK&E3 HT", -"b3 HTc3 jEb3 &jEb3 b3Hj cHs3 bd3 b3d& b3Dd gc3 d3b. b38d bHd3. c8g3 dKb3 d&", -"3bK b3Td cTg3 b3dj d&jb3 bHjd3 g3sc 4b 4b& 4bD c4 4b5 4b8 b54D c45 4bK bK4&", -" 4bT c4T 4bj b84j b54T sc4 4b; 4b+ b;4D c4+ 45b; >b4 4b5D; c>4 4Kb; 4Kb+ b;", -"4T 4+cT b;4j 4b>j 4bT;j s4c> 4bE b&4E 4bH c4H 4Eb5 4Eb8 b54H 4Hc5 bK4E 4b&E", -"K bH4T 4HcT 4Ebj 4b8jE bH4j sHc4 4bd b+4d bH4d gc4 b54d 4b>d 4bH5d g4c> 4Kb", -"d 4b+dK bT4d gTc4 bd4j >b4dj 4bHdj scg4 b3N &3bN D3bN c3N N.b3 83bN bD3N. 8", -"3cN bQ3 b3Q& b3QD cQ3 Qjb3 b3Q8 bQDj3 s3cQ 3(bN +3bN bD3(N +3cN b3(N. b+83N", -" D3(bN. c+83N Q3b( b3+Q bQD3( +Qc3 bQj3( b+Q83 QD3bj( cQ+s3 bW3 b3W& b3WD c", -"W3 W3b. b3W8 bHW3. W8c3 WQb3 bWQ&3 Zb3 Zc3 b3Wj bW8Q3 bjZ3 s3Zc Wdb3 b3+W b", -"HWd3 g3cW bWd3. b+W83 WD3bd. cW8g3 b3Qd b+WQ3 bdZ3 g3Zc bWjd3 b+Wj3 Zbdj3 Z", -"cgs3 4bm bm4& bm4D c4m 45bm bm48 4b5Dm 48cm 4bQ bQ4& bQ4D c4Q pb4 4bp& 4bpD", -" cp4 4mb; bm4+ 4bDm; 4+cm 4b5m; 4b>m b5m4D; >mc4 b;4Q b+4Q 4bQD; 4+cQ 4bp; ", -"p4>b pb4D; p>c4 4bW bW4& bH4W c4W b54W bW48 4bH5W 4Wc5 bW4Q 4bWQ& Z4b Zc4 4", -"bpW pb4W8 pbZ4 s4Zc vb4 4bv& 4bvD cv4 4bv5 v4>b vb4H5 v>c4 4bvQ vb4+Q vbZ4 ", -"g4Zc p4vb pvb>4 Zpbv4 yc4 6 6! 6B 6a 61 68 61B 68a 6K 6!K 6T 6Ta 6j 68j 6T1", -" s6 6( 6+ 6(B 6+a 61( 6+1 1(6B 1+6a 6(K 6+K 6T( 6+T 6j( 6+j 6(1T s6+ 6E 6!E", -" 6H 6Ha 61E 68E 6H1 6H8 6EK EK6! 6HT HT6a 6jE 8j6E 6Hj s6H 6d 6+d 6Hd g6 6d", -"1 68d 1H6d g61 6dK +d6K 6Td g6T 6dj +j6d 1T6d gs6 46 6!4 46B 4a6 7 78 7B 7a", -" 46K 4K6! 4T6 6T4a 7j 78j 7T 7s 6; 4+6 6;B 6a; 7; 7> 7B; 7>a 6;K 4K6+ 6T; 6", -"+4T 7;j 7>j 7T; 7s> 46E 4E6! 4H6 6H4a 7E 78E 7H 7H8 6E4K 6!4EK 6H4T 4H6Ta 7", -"jE 8j7E 7HT 7sH 4d6 6+4d 6H; g46 7d 7>d 7Hd g7 4K6d 4+6dK 6T4d 4Tg6 7dj >j7", -"d 7Td g7s 6N 6!N 6NB 6aN 61N 68N 1N6B 6N1a 6Q 6Q! 6QT 6Qa 6Q1 6Q8 1Q6T s6Q ", -"6(N 6+N (B6N +a6N 1(6N 6N1+ 61(NB 6+1aN 6Q( 6+Q QT6( +Q6T 6(1Q 1+6Q 6Q1T( 6", -"+sQ 6W 6W! 6HW 6Wa 6W1 6W8 1H6W 1W6a 6WQ Q!6W Z6 Z6a 6Wj W86Q Z61 sZ6 6Wd 6", -"+W HW6d g6W 1W6d 1+6W 6H1Wd 6Wg1 6Qd +W6Q Z6d gZ6 1Q6d +W6j 6dZ1 sZg6 6m 6m", -"! 6mB 6am 7m 78m 7Bm 7am 4Q6 Q!6m 6Tm 6Q4a 7p 7p8 7pT 7sp 6m; 6+m m;6B +m6a", -" 7m; 7>m m;7B >m7a 6Q; 6+4Q Q;6T +T6m 7p; 7p> pT7; 7ps> 4W6 6!4W 6Hm 6W4a 7", -"W 7W8 7HW 7Wa 6W4Q 4WQ6! Z46 4aZ6 7pW pW78 7Z 7Zs v6 v6+ v6H gv6 7v 7v> 7vH", -" g7v v6Q 6+vQ Zv6 Zvg6 7vp pv7> 7Zv y7 69 6& 69B 6a9 691 :6 916B :6a 69K 6&", -"K 6T9 6T& 6j9 :6j 9T6j s:6 69( 6+9 9(6B 9+6a 916( :6+ 691(B 6+:a 9(6K 6K9+ ", -"6(9T 9+6T 6(9j 6+:j 6T91( :6s+ 69E 6&E 6H9 6H& 916E :6E 691H :H6 9E6K &E6K ", -"9H6T H&6T 6E9j 6j:E 9H6j :Hs6 6d9 6d& 9H6d g69 691d :d6 6H91d g:6 6K9d 6Kd&", -" 9T6d 6Tg9 9d6j 6d:j 6Hj9d s:g6 49 49& 49B 49a 79 7: 7B9 7:a 49K 4K6& 49T 6", -"T4& 79j 7:j 7T9 7s: 49; 49+ 4B9; 9+4a 79; 7:> 9;7B :>7a 4K9; 4K9+ 9T6; 9+4T", -" 9;7j >j7: 9T7; 7:s> 49E 4E6& 49H 6H4& 79E 7:E 7H9 7:H 9E4K 49&EK 9H4T 49HT", -"& 9j7E :j7E 9H7T 7Hs: 49d 6d4& 9H4d g49 7d9 7:d 9H7d g7: 4K9d 49+dK 9T4d 49", -"gT 9d7j 7j:d 9T7d 7sg: 69N 6&N 9N6B 6N9a 916N :6N 691NB 6a:N 6Q9 6Q& 9Q6T 9", -"Q6a 9Q6j :Q6 6Q91T :Qs6 9(6N 6N9+ 69(NB 6+9aN 691(N 6+:N 91(6NB :6+aN 6(9Q ", -"9+6Q 6Q9T( 6+Q9T 6Q91( 6+:Q 9Q16T( :Q6s+ 6W9 6W& 9H6W 9W6a 691W :W6 6H91W 6", -"H:W 9W6Q W&6Q Z69 Z6& 9W6j 6W:Q 6jZ9 Z:6 9W6d 9+6W 6H9Wd 6Wg9 6W91d 6+:W 9H", -"16Wd :Wg6 9Q6d Qd6& 6dZ9 Z6g9 6Wj9d 6Q:d Z691d g6Z: 49m 6m& 4B9m 9a6m 79m 7", -":m 9m7B :m7a 49Q 6Q4& 9Q4T 9Q4a 7p9 :p7 p97T :p7s 9m6; 9+6m 49m;B 49+am 9m7", -"; :m7> 7B9m; 7:>am 9Q6; 9+4Q 49QT; 49+Qa 7;p9 7>:p 7p9T; 7p>s: 49W 6W4& 9H4", -"W 9W4a 7W9 7:W 9H7W :H7W 9W4Q 49WQ& Z49 49Z& p97W 7W:p 7Z9 7Z: v69 v6& 49vH", -" v6g9 7v9 :v7 v97H :vg7 49vQ 6Qv& v6Z9 Z4g9 p97v :p7v Z97v y7: 6C 6!C 6D 6D", -"a 61C 68C 6D1 6D8 6CK CK6! 6DT DT6a 6jC 8j6C 6Dj s6D 6C( 6+C 6D( 6+D 1C6( 6", -"C1+ 6(1D 1+6D CK6( +C6K DT6( +D6T jC6( 6C+j 6(Dj 6+sD 6CE !C6E 6HD HD6a 1C6", -"E 8C6E 1H6D H86D EK6C 6!CEK HD6T 6HDTa jC6E 68jCE Hj6D 6HsD 6dC +d6C 6Dd g6", -"D 6C1d 6C8d 1D6d 6Dg1 dK6C 6+dCK Dd6T 6DgT 6Cdj 6+jdC Dd6j gDs6 46C 4C6! 4D", -"6 6D4a 7C 78C 7D 7D8 6C4K 6!4CK 6D4T 4DT6a 7jC 8j7C 7DT 7sD 6;C 4C6+ 6D; 6+", -"4D 7;C 7>C 7D; 7>D ;C6K 4+6CK D;6T 4+D6T ;j7C 7j>C D;7T 7Ds> 6C4E 6!4CE 6H4", -"D 4H6Da 7CE 8C7E 7HD H87D 46CEK 4CE6!K 4H6DT 6HD4Ta jC7E 78jCE Hj7D sH7D 4C", -"6d 4+6dC 6D4d 4Dg6 7dC >C7d 7Dd g7D 4d6CK 6+C4dK 4Dd6T g46DT dj7C 7>djC Dd7", -"T 7Dgs 6CN !C6N 6DN Da6N 1C6N 8C6N 6N1D 6ND8 6QC 6CQ! 6QD QD6a 6C1Q 6CQ8 1Q", -"6D 6QsD C(6N +C6N D(6N 6N+D 61C(N 6+1CN 6D1(N 6+D1N QC6( 6C+Q 6(QD +Q6D 6Q1", -"C( 6+Q1C 6QD1( s6+QD 6WC W!6C 6WD WD6a 6C1W 6CW8 1W6D WD68 WQ6C 6WQ!C Z6D 6", -"DZa 6CWj 6W8QC 6DZ1 sDZ6 Wd6C 6C+W WD6d 6WgD 6W1dC 6+W1C 6WD1d g61WD 6CQd 6", -"+WQC 6DZd gDZ6 6WjdC 6+WjC Z61Dd gZ6sD 6mC mC6! 6Dm Dm6a 7mC 8m7C 7Dm D87m ", -"4C6Q 4Q6!C 6Q4D 4QD6a 7pC p87C 7pD 7Dsp m;6C 6C+m Dm6; +D6m m;7C 7m>C Dm7; ", -">m7D 6CQ; 4+Q6C QD6; 4+Q6D p;7C >C7p 7;pD p>7D 4C6W 4W6!C 6W4D 4WD6a 7WC W8", -"7C 7WD WD7a 4WQ6C 6WC4Q! 4DZ6 Z46Da pW7C 7pW8C 7ZD 7DsZ v6C 6+vC v6D vDg6 7", -"vC >C7v 7vD 7Dgv 6QvC v6+QC vDZ6 Zv6gD 7Cpv 7p>vC 7DZv y7D b6 b6& b6D c6 b6", -"1 :b6 6Db1 :c6 b6K bK6& b6T c6T b6j b6:j 6Dbj sc6 b6( b6+ b(6D c6+ 61b( b6:", -"+ b61D( :+c6 6(bK bK6+ b(6T 6+cT b(6j 6+bj b6T1( s+c6 b6E bE6& b6H c6H 61bE", -" b6:E 6Hb1 c6:H 6EbK b6&EK 6HbT 6HcT bE6j :b6jE 6Hbj sHc6 b6d 6+bd 6Hbd gc6", -" 6db1 b6:d b6H1d :cg6 bK6d b6+dK 6Tbd gTc6 6dbj :db6j b6Hdj scg6 4b6 b64& 4", -"9D c46 7b 7:b 7bD 7c 4Kb6 4b6&K b64T 49cT 7bj :b7j 7bT 7cs b6; b64+ 6Db; c6", -"; 7b; 7>b b;7D 7c> bK6; 4b+6K 6Tb; 6Tc; b;7j >j7b bT7; c>7s 4Eb6 4b6&E b64H", -" 49cH 7bE 7E:b 7bH 7cH 4b6EK b6E4&K 4bH6T c46HT bj7E 7:bjE bH7T 7Hsc b64d 4", -"b+6d 6Hb; c4g6 7bd :d7b bH7d g7c 4bd6K d&Kb6; 4bT6d c6;gT bd7j 7:dbj bT7d g", -"s7c b6N bN6& bN6D c6N 61bN b6:N b61DN cN:6 b6Q 6&bQ 6QbT c6Q 6Qb1 b6:Q b6Q1", -"D c6:Q 6(bN bN6+ b6D(N 6+cN b61(N :b6+N 6D(b1N :c6+N b(6Q 6+bQ b6QD( 6+cQ b", -"6Q1( :Qb6+ b6(1QD :cQ6+ b6W 6&bW 6HbW c6W 6Wb1 b6:W b6H1W c6:W 6WbQ b6WQ& Z", -"b6 Zc6 6Wbj :Wb6Q b6Z1 s6Zc 6Wbd 6+bW b6HWd cWg6 b6W1d :Wb6+ 6WDb1d g:c6W 6", -"Qbd b6+Qd b6Zd g6Zc b6Wdj :Qdb6 Zb61d Zc6g: b6m 6&bm 6Dbm c6m 7bm :m7b bm7D", -" 7cm b64Q 4bQ6& 6Tbm 49cQ 7pb 7b:p pb7D 7cp 6mb; 6+bm 49Dm; 6+cm bm7; >m7b ", -"7bDm; cm7> 6Qb; 4b+6Q 49QD; 6Qc; 7;pb p>7b 7pbD; 7pc> b64W 4bW6& 6Hbm 49cW ", -"7bW :W7b bH7W 7cW 4bW6Q b6W4Q& 4bZ6 c4Z6 pb7W 7pb:W 7Zb 7Zc vb6 b6v& 49vD c", -"v6 7vb 7b:v vb7H 7cv b6vQ vb6+Q vbZ6 Z6cv pv7b :vb7p Zv7b y7c 3L !3L 3BL a3", -"L 3L. 83L 3L.B a38L M3 M3! TM3 aM3 Mj3 8M3 MjT3 sM3 3(L +3L 3(LB a3+L (L3. ", -"83+L 3L.(B +8a3L M3( +M3 M3T( +3aM j3M( +38M TMj3( +Ms3 E3L E3!L H3L a3HL 3", -"LE. E38L 3LH. 83HL ME3 !EM3 HM3 H3aM jEM3 ME83 MjH3 HMs3 d3L d3+L d3HL g3L ", -"3Ld. d38L Hd3L. 83gL dM3 +3dM H3dM gM3 Mjd3 83dM dMjH3 sMg3 4L 4L! 4LB 4aL ", -"45L 48L 5B4L 4L5a 4M 4M! 4TM 4aM 4M5 48M 5T4M s4M 4;L 4+L ;L4B 4La; 5;4L >L", -"4 45;LB 4a>L 4M; 4+M T;4M +T4M M;4j >M4 4T5M; s4>M 4EL !E4L 4HL Ha4L 5E4L 8", -"E4L 4LH5 4LH8 4ME ME4! 4HM HM4a 4E5M 4E8M H54M 4HsM 4dL +d4L 4LH; g4L 4L5d ", -"4d>L 4H5dL >Lg4 4dM +M4d HM4d g4M 5d4M 4d>M 4HM5d g4>M 3LN 3L!N 3LNB 3LaN 3", -"LN. 3L8N 3L.NB 8a3LN QM3 M3Q! TMQ3 Q3aM MjQ3 Q38M QTMj3 QMs3 (L3N 3L+N 3(NL", -"B +a3LN 3L.(N +83LN .BL3(N 8a3+LN M3Q( QM+3 QTM3( aM3+Q QMj3( +Q8M3 TMjQ3( ", -"s+QM3 W3L !3WL W3HL a3WL 3LW. 83WL HW3L. H8W3L WM3 M3W! ZM3 aMZ3 MjW3 W38M ", -"MjZ3 ZMs3 d3WL W3+L HWd3L W3gL Wd3L. +W83L Wd3HL. gW83L W3dM +3WM dMZ3 ZMg3", -" dMjW3 +WM83 ZdMj3 gZsM3 4mL mL4! mL4B 4Lam 5m4L 4L8m 45mLB amL48 4QM Q!4M ", -"Tm4M Qa4M p4M 48pM 4TpM p4sM m;4L 4L+m 4m;LB amL4+ 45m;L 4m>L 5m;4LB >m4aL ", -"Q;4M +Q4M 4QTM; aMm4+ 4Mp; p4>M p4TM; >Mps4 4WL W!4L 4LHm 4LWa 4L5W 4LW8 4H", -"5WL 4H8WL 4WM 4!WM Z4M 4aZM 4WpM W84M p4ZM sMZ4 v4L 4+vL 4HvL v4gL 45vL v4>", -"L v4H5L gv>4L vM4 4+vM vMZ4 Z4gM p4vM v4>M Zpv4M y4M #3L &3L #3LB &3aL 3L#.", -" &38L 3L.#B 8a&3L M#3 M&3 M#T3 T3M& j#M3 83M& TMj#3 M&s3 3(#L &3+L (BL#3 +a", -"&3L 3L.#( +8&3L 3B(#L. 8a&+3L #3M( +3M& TM#3( aM3+& Mj#3( M&3+j Mj#T3( s+M&", -"3 E3#L E3&L #3HL &3HL 3L.#E 8&E3L H#3L. H8&3L #EM3 &EM3 M#H3 H3M& Mj#E3 M&E", -"83 HMj#3 sHM&3 #3dL &3dL Hd#3L &3gL d#3L. d&38L d#3HL. g8&3L M#d3 d3M& dM#H", -"3 M&g3 dMj#3 dM&83 HM#dj3 gsM&3 4#L 4&L #B4L a&4L 5#4L 4L5& 45#LB 48a&L 4M#", -" 4M& TM4# T&4M 4#5M 5M4& 4T5M# 4Ms& ;#4L 4L;& 4;#LB a;&4L 45;#L 4&>L 5;#4LB", -" >&4aL 4#M; +M4& M;#4T aM;4& M;#4j 4M>& 4T5M;# >Ms4& #E4L &E4L H#4L 4LH& 45", -"#EL 48&EL 4H5#L 4H8&L M#4E 4EM& 4#HM HM4& 4M5#E 48M&E 4HM5# s4HM& d#4L 4Ld&", -" 4Hd#L 4&gL 4d5#L >&4dL H5#4dL g>4&L 4#dM dM4& 4HMd# 4Mg& 4dM5# >M4d& dM#4H", -"j >Mg4& 3L#N 3L&N #LN3B a&3LN 3L.#N 8&3LN #L.3BN a&38LN M#Q3 Q3M& QTM#3 aM3", -"Q& QMj#3 M&3Q8 TMjQ#3 sQM&3 3(N#L +&3LN 3B(#LN a&3+LN #L.3(N 8&3+LN 3LNB#(.", -" 3L+N8a& QM#3( M&3+Q TM#Q3( +QTM&3 Mj#Q3( +Q8M&3 TMQj#3( M&3s+Q #3WL &3WL H", -"W#3L H&W3L W#3L. W8&3L W#3HL. W83H&L M#W3 W3M& M#Z3 M&Z3 WMj#3 W8M&3 ZMj#3 ", -"Z&Ms3 Wd#3L d&3WL Wd#H3L gW&3L d#3WL. W83d&L W3HLd#. W8&g3L dM#W3 dM&W3 ZdM", -"#3 Z&Mg3 WM#dj3 dM3W&j dMjZ#3 gsMZ&3 m#4L 4Lm& 4m#LB am&4L 45m#L m&L48 5m#4", -"LB 48am&L 4#Mm Q&4M Mm#4T aMm4& 4Mp# 4Mp& p4TM# p&4sM 4m;#L m&L4+ m;#4LB 4+", -"am&L 5m;4#L >m4&L mL4B5;# am&>L4 Mm#4; Mm&4+ 4QTM;# 4+TMm& p4M;# >Mp4& M;#p", -"4T p&4>Ms W#4L 4LW& 4HW#L 4H&WL 4W5#L 4W8&L H5#4WL m&L4H8 4#WM WM4& 4MZ# 4M", -"Z& p4WM# p&4WM Zp4M# Zp&4M 4#vL 4&vL v4H#L gv4&L v45#L v>4&L 4H5v#L v>&g4L ", -"4Mv# 4Mv& Zv4M# Zv&4M pv4M# >Mv4& pvMZ4# 4My& U3 U!3 UD3 Ua3 U3. U83 D3U. U", -"3D8 UM3 M3U! V3 Va3 Uj3 U38M Vj3 Vs3 U3( U+3 D3U( U3+D 3(U. +8U3 UD3(. U+D8", -"3 M3U( U3+M V3( V+3 j3U( U3+j j3V( s3V+ UE3 !EU3 UH3 HaU3 E3U. 8EU3 H3U. U3", -"H8 MEU3 U!ME3 VH3 HaV3 jEU3 U8ME3 HjV3 VHs3 Ud3 +dU3 U3Dd gU3 d3U. U38d UHd", -"3. U8g3 U3dM dM3U+ Vd3 gV3 U3dj U+jd3 djV3 g3Vs 4U 4U! 4UD 4Ua 4U5 4U8 U54D", -" U54a 4UM U!4M V4 V4a 4Uj U84M V45 s4V 4U; 4U+ U;4D U+4D 45U; >U4 4U5D; 4U>", -"D U;4M U+4M V4; V4+ U;4j 4U>M 4jV; V>4 4UE U!4E 4UH UH4a 4EU5 4EU8 U54H UH4", -"8 UM4E 4UM!E V4H 4HVa 4EUj 4U8ME 4HV5 sHV4 4Ud U+4d UH4d g4U U54d 4U>d 4UH5", -"d >Ug4 Ud4M 4U+dM V4d gV4 Ud4j >M4Ud 4dV5 g4V> U3N !3UN D3UN a3UN N.U3 83UN", -" UD3N. U8D3N UQ3 U3Q! VQ3 QaV3 QjU3 U3Q8 QjV3 VQs3 3(UN +3UN UD3(N U+D3N U3", -"(N. U+83N D3(UN. +D3U8N Q3U( U3+Q Q3V( +QV3 UQj3( U+Q83 VQj3( Vs+Q3 UW3 W!U", -"3 U3WD U3Wa W3U. U3W8 UHW3. UH8W3 U3WM UWQ!3 VZ3 VaZ3 U3Wj UW8Q3 VjZ3 s3VZ ", -"WdU3 U3+W UHWd3 UWg3 UWd3. U+W83 WD3Ud. gUW83 U3Qd U+WQ3 Z3Vd g3VZ UWjd3 U+", -"Wj3 VZdj3 gVZs3 4Um 4!Um Um4D Um4a 45Um Um48 4U5Dm 4U8Dm 4UQ Q!4U V4Q 4QVa ", -"pU4 4Up8 Vp4 s4Vp 4mU; Um4+ 4UDm; 4U+Dm 4U5m; 4U>m U5m4D; >Dm4U U;4Q U+4Q 4", -"QV; 4+Vm 4Up; p4>U p4V; p>V4 4UW 4!UW UH4W UW4a U54W UW48 4UH5W 4UHW8 UW4Q ", -"4UWQ! Z4V ZaV4 4UpW pU4W8 Z4Vp VZs4 vU4 4Uv+ 4UvD vUg4 4Uv5 v4>U vU4H5 gvU>", -"4 4UvM vU4+Q Vv4 g4Vv p4vU >Mv4U pvV4 yV4 bU3 U&3 UDb3 cU3 U3b. b3U8 bUD3. ", -"U8c3 bM3 b3M& Vb3 Vc3 b3Uj b38M bjV3 s3Vc U3b( b3U+ bUD3( U+c3 bU3(. b+U83 ", -"UD3b(. cU+83 M3b( b3+M b3V( c3V+ bMj3( b+M83 Vbj3( Vs+c3 UEb3 &EU3 b3UH UHc", -"3 bUE3. b8UE3 bHU3. cUH83 MEb3 M&Eb3 bHV3 VHc3 bMjE3 b8ME3 VbHj3 VsHc3 b3Ud", -" U3d& bHUd3 cUg3 bdU3. b8dU3 UH3bd. gcU83 b3dM dM&b3 bdV3 g3Vc bdMj3 d&jU3 ", -"Vdbj3 gVsc3 4bU 4U& bU4D c4U b54U b84U 4bU5D 4Uc5 4bM bM4& V4b c4V b54M b84", -"M 4bV5 Vsc4 b;4U b+4U 4bUD; 4Uc; 4bU5; 4b>U b5U4D; >Uc4 b;4M b+4M 4bV; V4c;", -" 4bM;j 4b>M V4b;j c4V> bU4E 4EU& bH4U 4UcH 4bU5E 4b8UE 4bHU5 c4UH5 4EbM 4bM", -"&E 4bVH cHV4 4bM5E 4b8ME V4bH5 c4VsH bd4U Ud4& 4bHUd c4gU 4bdU5 >b4Ud bH54U", -"d c>g4U bd4M dM&4b 4bVd c4gV 4bdUj >Mb4d V4db5 V>gc4 U3bN &3UN bUD3N U3cN b", -"U3N. b8U3N UD3bN. cU83N b3UQ U3Q& bQV3 VQc3 bQUj3 bQ8U3 VbQj3 cQVs3 bU3(N b", -"+U3N UD3b(N cU+3N U3(bN. U+3b8N D3UNb(. U+8c3N bQU3( b+QU3 VbQ3( cQV+3 UQ3b", -"j( &j3U+Q bQjV3( Vs+cQ3 b3UW U3W& bHUW3 UWc3 bWU3. bW8U3 UH3bW. cWU83 b3WM ", -"bWM&3 VbZ3 Z3Vc bWMj3 bW8M3 ZbVj3 ZcVs3 bWUd3 b+WU3 UHWbd3 cWUg3 UW3bd. d&3", -"UW8 W.DdbU3 gU8cW3 bWMd3 b+WM3 ZbVd3 gVZc3 dM3bWj dM3bW8 VdjZb3 ZcsgV3 bm4U", -" Um4& 4bUDm 4Ucm 4bU5m 4b8Um b5U4Dm c4U8m bQ4U UQ4& 4bVm V4cQ 4bpU 4Up& pbV", -"4 c4Vp 4bUm; 4b+Um bmU4D; c4U+m b5m4U; >b4Um 5mD;4bU c>4Um 4bQU; 4b+UQ V4bQ", -"; c4V+Q pb4U; >Mbp4 Vp4b; cpV>4 bW4U UW4& 4bHUW 4UcW 4bWU5 4bWU8 bH54UW c4W", -"U5 bW4M 4bWM& V4Zb VZc4 pb4UW pU&4W ZpbV4 cpZV4 4bvU 4Uv& vb4UH vUc4 vb4U5 ", -"v>b4U 4bHvU5 cv>4U 4bvM vbM4+ vbV4 c4Vv pvb4U >Mv4b Vvp4b c4yV 6k 6!k 6kB 6", -"ak 61k 68k 1k6B 8k6a 6M 6M! 6Tk 6aM l6 l68 l6T ls6 6k( 6+k k(6B +k6a 1k6( +", -"k68 61k(B 6+1ak 6M( 6+M 6(Tk +T6M l6( l+6 6Tl( s6l+ 6kE kE6! 6Hk Hk6a 1k6E ", -"6E8k 61Hk Hk68 6ME ME6! 6HM HM6a l6E 68lE lH6 s6lH 6dk +k6d Hk6d g6k 61dk 8", -"k6d 6H1dk 68gk 6dM +M6d HM6d g6M ld6 6+ld 6Hld gl6 4k 4k! 4kB 4ak 7k 78k 7B", -"k 7ak 4kM 6!4M 4Tk 6a4M 7l 7l8 7lT 7sl 4k; 4+k 4Bk; +k4a 7k; >k7 k;7B 7a>k ", -"6M; 6+4M Tk6; +T4k l;7 l>7 7Tl; 7sl> 4kE kE4! 4Hk Hk4a 7kE 8k7E 7Hk H87k 4E", -"6M 4kM!E 6H4M 4HkaM 7lE 78lE lH7 lH7s 4dk +k4d Hk4d g4k 7dk 7d>k Hk7d g7k 6", -"d4M 4+kdM HM6; 4Tgk ld7 7>ld 7Hld gl7 6kN kN6! kN6B 6Nak 1k6N 6N8k 61kNB ak", -"N68 6Qk Q!6M Qk6T Qa6M l6Q 6Ql8 6QlT lQs6 k(6N 6N+k 6k(NB akN6+ 61k(N 6+1kN", -" 1k(6NB 6+1akN 6(Qk +Q6M 6QTk( 6+QTk 6Ql( 6+lQ l6QT( ls6+Q 6Wk 6!Wk Hk6W Wk", -"6a 61Wk Wk68 6H1Wk 6H8Wk 6WM 6!WM Z6k 6aZk lW6 6Wl8 lZ6 s6lZ Wk6d +k6W 6HWd", -"k 6Wgk 6W1dk 6+W8k 1HW6dk g61Wk WM6d +W6M 6dZk Z6gk 6Wld 6+lW Z6ld g6lZ 4km", -" 6!km 4Bkm ak6m 7km 8k7m km7B ak7m 4Qk Q!4k Qk4T Qa4k 7lp l87p lp7T 7lsp km", -"6; +k6m km;4B akm4+ km7; 7k>m 7Bkm; 7>akm Qk6; +Q4k 4QkT; ak;4Q 7pl; 7pl> 7", -"lpT; l>p7s 4Wk 4!Wk Hk4W Wa4k 7Wk W87k Hk7W Wa7k 6W4M 4WkQ! Z4k 4aZk lW7 l8", -"7W 7Zl lZ7s v6k 4+vk 4Hvk v6gk 7vk >k7v vk7H gk7v v6M 6+vM v6Zk Z4gk lv7 7v", -"l> 7Zlv yl7 69k 6&k 9k6B ak6& 916k :6k 691kB 6a:k 6M9 6M& 9T6M 9a6M l69 l:6", -" 6Tl9 s6l: 9k6( +k6& 69k(B 6+9ak 691k( 6+:k 91k6(B :6+ak 6(9M 9+6M 6T9k( 6+", -"T9M 69l( :6l+ l69T( ls:6+ 9k6E 6Ek& 69Hk Hk6& 691kE 6k:E 6H91k 6H:k 6E9M 6E", -"M& 9H6M HM6& 69lE :6lE 6Hl9 l6:H 69dk dk6& 6H9dk 6&gk 6d91k 6d:k 9H16dk :6g", -"k 9d6M dM6& 6HM9d 6Mg9 6dl9 l6:d lH69d g6l: 49k 4k& 9k4B 9a4k 79k 7:k 9k7B ", -":a7k 49M 6M4& 9T4k 9a4M 7l9 l:7 l97T l:7s 9;4k 9+4k k;B49 ak;49 9;7k 7:>k 7", -"B9k; 7:>ak 9M6; 9+4M 49Tk; aM;49 79l; 7:l> 7l9T; l>7s: 9k4E 4Ek& 9H4k Hk4& ", -"9k7E :k7E 9H7k 7k:H 4E9M 49M&E 9H4M 49HaM 79lE lE7: l97H 7:lH 9d4k dk4& 49H", -"dk 49gk 9d7k 7k:d 7H9dk 7:gk 9d4M dk&4M 49HdM 49gM l97d 7:ld 7Tdl9 l:g7 9k6", -"N 6Nk& 69kNB akN6& 691kN 6k:N 91k6NB :6akN 9Q6M Qk6& 6Q9Tk 6Qa9M 6Ql9 l6:Q ", -"l69QT :Q6ls 69k(N k&N6+ 9k(6NB 6+9akN 91k6(N :6+kN 916k(BN akN:6+ 6Q9k( 6+Q", -"9M 9QT6M( 9+Q6aM l69Q( :Q6l+ 6Q9lT( ls6:Q+ 69Wk Wk6& 6H9Wk 6H&Wk 6W91k 6W:k", -" 9H16Wk :H6Wk 9W6M WM6& 6MZ9 6MZ& 6Wl9 l6:W l6Z9 Z6l: 6W9dk dk&6W 9HW6dk g6", -"9Wk 9W16dk :W6+k 691HWkd g:6Wk 6WM9d dk&6Q Z69dk Z6&gk lW69d :Qdl6 lZ69d gl", -"Z:6 9m4k km4& kmB49 akm49 9m7k 7k:m 7B9km 7:akm 9Q4k Qk4& 49QTk aMm49 p97l ", -"7l:p 7lp9T 7sl:p km;49 km&4+ 49mk;B 49+akm 79km; 7:>km km;7B9 :>m7ak 49Qk; ", -"k;&4Q 9Q;4Tk 49+aMm 7lp9; l>p7: l;p7T9 7spl>: 9W4k Wk4& 49HWk km&4H 9W7k 7k", -":W 7H9Wk 7:HWk 9W4M Mm&6W 49Zk 4kZ& l97W 7:lW Z97l l:7Z 49vk 4kv& v69Hk gv6", -"k& 79vk vk7: 7v9Hk :vkg7 49vM 6Mv& Zv69M Zv6k& v97l l:7v lvZ79 l:y7 6U 6U! ", -"6UD 6Ua 6U1 6U8 1U6D 1U6a 6UM U!6M V6 V6a l6U 6Ul8 Vl6 s6V 6U( 6U+ 6(Dk U+6", -"D 6(1U 1U6+ 6U1D( 6U+1D UM6( U+6M V6( V6+ 6Ul( 6Ul+ l(V6 V6l+ 6UE U!6E 6UH ", -"UH6a 6E1U 6EU8 1U6H UH68 UM6E 6UM!E V6H 6HVa 6UlE l6U8E V6lH sHV6 6Ud U+6d ", -"UH6d g6U 1U6d U86d 6UH1d 6Ug1 Ud6M 6U+dM V6d gV6 6Uld l+6Ud V6ld s6gV 4U6 6", -"!4U 4Dk 6U4a 7U 7U8 7UD 7Ua 6U4M 4U6M! V46 4aV6 7lU l87U 7V 7Vs 6U; 6U4+ U;", -"6D Ua6; 7U; 7>U U;7D 7D>k U;6M 4U+6M V6; 4+V6 7Ul; 7Ul> 7V; 7V> 4E6U 4U6!E ", -"6U4H 4UH6a 7UE U87E 7UH UH7a 4U6ME 6UE4M! 4HV6 V46Ha lE7U 7lU8E 7VH Vs7H 6U", -"4d 4U+6d UH6; 4Ug6 7Ud >U7d UH7d g7U 4Ud6M 6U+4dM 4dV6 V4g6 7Uld l>7Ud 7Vd ", -"g7V 6UN U!6N 6NDk 6NUa 6N1U 6NU8 6U1DN 6U8DN 6UQ Q!6U V6Q 6QVa 6UlQ UQ68 lQ", -"V6 sQV6 U(6N 6NU+ 6UD(N 6U+DN 6U1(N 6U+1N 1U(6DN 6UN1+D 6(UQ U+6Q 6QV( 6+VQ", -" l6UQ( l+6UQ Vl6Q( l+V6Q 6UW 6!UW UH6W UW6a 1U6W UW68 6UH1W 6UHW8 UW6Q 6UWQ", -"! Z6V ZaV6 6UlW lW6U8 VlZ6 VZs6 UW6d U+6W 6UHWd 6UgW 6UW1d 6U+1W 1UW6Dd g6U", -"1W UQ6d 6U+WM VdZ6 Z6gV lW6Ud l+W6U Z6Vld gV6lZ 6Um 6!Um Um6D Ua6m 7Um U87m", -" Um7D Ua7m 6U4Q 4UQ6! V6m 6aVm 7pU 78pU 7Vp Vp7s Um6; U+6m 4Dkm; 4+Dkm Um7;", -" >m7U 7UDm; 7>UDm UQ6; 4U+6Q 6QV; 6+Vm 7;pU p>7U V;7p 7pV> 6U4W 4UW6! UH6m ", -"4UW6a 7UW UW78 UH7W UW7a 4UW6Q Mm!6UW V4Z6 Z4V6a 7UlW 7pUW8 7ZV sZ7V v6U 6U", -"v+ 4Dvk v6gU 7vU v>7U vU7H gU7v 6UvM v6U+Q Vv6 g6Vv 7Ulv 7vUl> 7Vv y7V t6 t", -"6& t6D tc6 t61 t:6 6Dt1 c6t: t6M 6Mt& Vt6 c6V lt6 l6t: V6lt u6 t6( t+6 6Dt(", -" c6t+ 61t( :6t+ t61D( t:c6+ 6Mt( 6+tM t(V6 V6t+ t6l( l6t+ ltV6( u6+ t6E 6&t", -"E tH6 c6tH 61tE :6tE 6Ht1 t6:H 6MtE t6M&E V6tH cHV6 t6lE t:6lE l6tH u6H td6", -" 6+td 6Htd gt6 6dt1 t6:d tH61d t:g6 6dtM t+6dM V6td c6gV l6td t:dl6 tdVl6 u", -"g6 t4 t4& t4D tc4 7t 7t: 7tD 7ct t4M 4Mt& t4V Vtc4 7tl l:7t 7Vt u7 t4; t4+ ", -"4Dt; c4t+ 7t; t>7 7Dt; 7ct> 4Mt; 4+tM V4t; V4t+ l;7t 7tl> t;7V u7> t4E 4&tE", -" t4H c4tH 7tE tE7: 7tH tH7c 4MtE t4M&E V4tH tc4VH lE7t 7tl:E lH7t u7H t4d 4", -"+td 4Htd gt4 7td 7:td 7Htd g7t 4dtM t4+dM V4td t4gV ld7t 7tdl> td7V ug7 t6N", -" 6&tN 6DtN tNc6 61tN :6tN t61DN t:c6N tQ6 6Qt& V6tQ c6tQ l6tQ t6:Q tQVl6 u6", -"Q 6(tN 6+tN t6D(N tc6+N t61(N t:6+N 6D1t(N :c6t+N 6Qt( 6+tQ tQV6( tcQ6+ tQ6", -"l( t:Q6+ Vl6tQ( 6+uQ tW6 6Wt& 6HtW c6tW 6Wt1 t6:W tH61W t:H6W 6WtQ tW6Q& tZ", -"6 Z6tc l6tW t:Wl6 Z6lt uZ6 6Wtd 6+tW tH6Wd tWg6 tW61d t:W6+ 6WDtd1 gt:6W 6Q", -"td t+W6Q Z6td g6tZ tQdl6 t:Q6d tZl6d gZu6 t4m 4&tm 4Dtm c4tm 7tm 7:tm 7Dtm ", -"tm7c t4Q 4Qt& V4tQ c4tQ tp7 :p7t 7Vtp up7 6mt; 4+tm t4Dm; tc4+m 7mt; 7>tm 7", -"tDm; t>7cm 4Qt; 4+tQ t4VQ; tc4+Q 7pt; 7pt> tp7V; 7pu> t4W 4Wt& 4HtW c4tW 7t", -"W 7:tW 7HtW tW7c 4WtQ t4WQ& tZ4 t4Zc lW7t 7tW:p tZ7 uZ7 tv4 v6t+ v6tH g4tv ", -"tv7 7t:v tH7v tvg7 v6tQ tv4+Q t4Vv g4tZ 7tlv lvt7: 7Ztv yu7 < = =B5 =a> =K =+K =T =T+ =j =j> =T5 s= 4=", -"d =H5 g=> =dK +d=K =HT g=T =jd =d>j =Hj s=g =m 5m=B >m=a =Q =Q+ =QT =Qa p= p=> ", -"p=T s=p 4W< 4!W< H= vH=5 v>g= =Qv v+=Q Z= Z=g p=v v>p= Z=p y= ,<", -" <& ,= ,5=B ->=a =,K -=K =T, =T- =j, =j- ,5=T s=- ,4E ,E4& ,4H 4H,a ,E5< ,E", -"48 4H,5 4H,8 4E,K <&E4K 4H,T ,4HT& ,E4j <&j4E 4H,j ,4sH =d, -=d =H, g=- ,5=", -"d =d-> ,H=5 ->g= ,d=K -d=K ,H=T g-=T ,d=j =d-j ,H=j s-g= ,=-m =B5,m =a->m =Q, =Q- ,Q=T -Q=T p=, ", -"-p= p,=T -ps= ,4W 4&,W 4H,W 4W,a 4W,5 4W,8 ,4H5W -= =Hv,5 g=-v> v,=Q =Q-v Z=, Z", -"-= v=p, p=-v Z,p= y-= =C =D5 =D> =CK +C=K =DT +D=T ", -"=jC >C=j =Dj s=D C H5=D g>=D d", -"K=C =+dCK Dd=T gD=T dj=C =j>dC Hj=D gs=D C 5D=m >m=D =QC +Q=C =QD +Q=D p=C >Cp= p=D sp=D ", -"4CW< Cv= =5vD v>=D vQ=C =Qv+C Z=D =DgZ =C", -"pv p=v>C Zp=D y=D b< b<& ,D< c< b<. b8< ,.D< c<8 b ,5=D c=> =bK -b=K =bT c=T =", -"bj -j=b ,D=j s=c ,E4b <&E4b 4b,H ,4cH bE5< ,48bE H5b< H5c< ,4bEK 4bE<&K ,4H", -"bT c4H,T ,4jbE <&E4bj ,4Hbj c5b bH=5 c>g= bd=K", -" =b-dK bH=T gc=T bd=j =b>dj bH=j gsc= bm=b =b5Dm >=cm =bQ -Q=b ,Q=D c=Q p=b =b-p pb=", -"D cp= 4b,W =b =bvH5 v>c= vb=Q -v=bQ Z=b Z=c", -" pv=b -pv=b Zp=b yc= 6< 6!< 6= 7=B =a7 =6K 6+=K =T6 6+=T =j7 7>=j =T7 s=7 6", -"<4E 6!4=7d =H7 g7= 6d=K =6+dK 6H=T g6=T 7d=j 7>=d", -"j 7H=T s=g7 6m7= =m7B =m7a =Q6 6", -"+=Q 6Q=T 6Q=a p=7 7>p= 7p=T p=7s W<6m 7= =H7v", -" 7vg= v6=Q =Qv6+ Z=6 g6Z= p=7v 7p>v= 7Z= y7= ? ?& ?B ?a ?1 ?: ?B1 ?:a ?K ?&", -"K ?T ?Ta ?j ?:j ?T1 s? ?* ?- ?B* ?-a ?1* ?:- 1*?B :-?a ?*K ?-K ?T* ?-T ?j* ", -"?-j 1T?* s?- ?E ?&E ?H ?Ha ?1E ?:E ?H1 ?:H ?EK &E?K ?HT H&?T ?jE :j?E ?Hj s", -"?H ?d ?-d ?Hd g? ?d1 ?:d 1H?d g?: ?dK -d?K ?Td g?T ?dj :d?j 1T?d g?s ?4 ?4&", -" ?B4 ?a4 7? ?:7 7?B ?a7 ?4K 4&?K ?T4 4T?a ?j7 7:?j ?T7 s?7 ?= ?-= ?=B =a? ?", -"=7 A =B7? Aa ?=K =K?- =T? ?-=T =j? Aj ?T=j As ?4E 4&?E ?H4 4H?a 7?E ?E7: ?H", -"7 7:?H 4E?K ?4&EK 4H?T ?H4T& 7j?E ?:7jE 7H?T ?H7s ?=d -=?d =H? g?= ?d7 Ad 7", -"?=H Ag =K?d ?-=dK ?H=T =Tg? ?d=j Ajd ?H=j Ags ?N ?&N ?BN ?aN ?1N ?:N 1N?B :", -"a?N ?Q ?Q& ?QT ?Qa ?Q1 ?:Q 1Q?T s?Q ?*N ?-N *B?N -a?N 1*?N ?N:- ?B1*N ?:-aN", -" ?Q* ?-Q Q*?T -Q?T 1Q?* :-?Q ?Q1T* ?Qs- ?W ?W& ?HW ?Wa ?W1 ?:W 1H?W :H?W ?W", -"Q W&?Q ?Z ?Za ?Wj :W?Q ?Z1 s?Z ?Wd ?-W H*?W g?W 1W?d :-?W ?H1W* ?Wg: ?Qd -W", -"?Q ?Zd g?Z 1Q?d :Q?d Z1?d Z:g? ?m ?m& ?mB ?am ?m7 ?:m 7B?m 7a?m ?Q4 4Q?& ?T", -"m 4Q?a ?p ?p: ?pT s?p ?=m ?-m =B?m ?m=a 7=?m Am ?=7mB Aam =Q? ?-=Q ?Q=T ?Q=", -"a ?p= Ap =T?p Aps ?W4 4W?& ?Hm 4W?a ?W7 7:?W 7H?W 7W?a 4W?Q ?W4Q& ?Z4 Z4?a ", -"?pW ?W:p ?Zp 7Zs? ?v ?v- ?vH g?v ?v7 Av ?H7v Agv ?vQ ?Q-v ?Zv Z-?v ?pv Apv ", -"7Z?v yA 6C7= =D7 7>=D 6C=K =6+CK 6D=T =D6+T 7j=C 7>=jC 7D=T =D7s 46=dC 7H=D =Dg7 =6dCK 6+d", -"=CK =H6DT g=6DT 7=djC =j>7dC 7Dd=T g7s=D =mC =m7D 7>D=m 6Q=C =Q6+C 6Q=D =QD6+ =C7p 7p>=C 7p=D p=D7s =C =D7v 7vDg= =Qv6C v6+=QC Z6=D ", -"Z=g6D 7vp=C p=>7vC =D7Z =Dy7 ?b ?b& ?D ?c ?b1 ?:b ?D1 ?c: ?bK bK?& ?DT ?cT ", -"?jb :b?j ?Dj s?c ?b* ?-b ?D* ?c- b1?* ?b:- 1D?* :c?- b*?K -b?K bT?* c-?T b*", -"?j ?b-j D*?j ?cs- ?bE b&?E ?Hb ?cH b1?E :b?E b1?H :c?H bK?E ?b&EK bH?T cH?T", -" bj?E ?:bjE bH?j ?Hsc ?db -b?d ?Dd g?c b1?d ?b:d 1D?d ?cg: bd?K ?-bdK bT?d ", -"?Tgc bd?j ?:dbj Dd?j gs?c ?4b 4b?& ?D4 ?c4 7?b 7b?: ?D7 7c? 4b?K ?4b&K 4b?T", -" c4?T 7b?j ?:7bj 7b?T 7cs? =b? ?-=b =D? c=? =b7 Ab 7?=D Ac ?b=K ?-=bK ?D=T ", -"=T?c ?j=b Ajb ?D=j Asc 4b?E ?4b&E 4b?H c4?H ?E7b ?:7bE 7b?H ?H7c ?4bEK 4b&?", -"EK ?H4bT ?c4HT ?j7bE 7:b?jE ?H7bT s?7cH ?d=b ?-=bd ?H=b c=g? 7b?d Abd 7b=H ", -"Agc ?=dbK =b-?dK ?Dd=T c=?gT ?d7bj bdAj ?Hj=b gsAc ?bN b&?N ?DN ?cN b1?N :b", -"?N 1D?N ?N:c ?Qb bQ?& ?QD ?cQ b1?Q ?b:Q 1Q?D ?Qsc b*?N -b?N D*?N ?Nc- ?b1*N", -" ?:-bN ?D1*N ?c:-N bQ?* ?b-Q QD?* c-?Q ?Qb1* ?:Q-b ?QD1* ?cQs- ?Wb bW?& ?WD", -" ?cW b1?W ?b:W 1W?D :c?W bW?Q ?WbQ& ?Zb ?Zc bW?j ?:WbQ Zb?j ?cZ: bW?d ?b-W ", -"WD?d ?Wgc ?Wb1d ?:W-b ?WD1d ?cWg: bQ?d ?-WbQ Zb?d ?cZ- ?Wjbd ?:Qbd ?Zb1d g?", -"Zsc ?mb bm?& ?Dm ?cm 7b?m ?b:m 7D?m ?m7c 4b?Q ?Q4b& 4Q?D c4?Q ?pb pb?: ?pD ", -"?pc ?m=b ?b-m ?m=D ?mc= =m7b Abm ?D7=m Acm ?Q=b ?-Q=b ?Q=D =Q?c =b?p Apb =D", -"?p Apc 4b?W ?W4b& 4W?D c4?W 7b?W ?:W7b 7W?D ?W7c ?W4bQ 4bW?Q& Z4?D ?mZc pb?", -"W ?p:bW ?D7Z 7c?Z ?vb vb?- ?vD ?vc =b7v Avb ?D7v Acv vb?Q ?v-bQ =b?Z cv?Z p", -"b?v pvAb =b7Z yAc =L 5B=L >L=a =M =M+ =TM =aM =M5 >M= 5T", -"=M s=M L H5=L >Lg= =Md +M=d =HM g=M 5", -"d=M =d>M H5=M >Mg= L =B5mL =a>mL =QM +Q=M Tm=M Qa=M p=M >Mp= pT=M sp=M 4LW", -"< Lv= =Hv5L g=v>L =Mv =+vM Z=M =MgZ pv=M ", -"v>=M Zp=M y=M ,L-= =B5,L =a->L =M, =M- ,T=M -T=M ,5=M ->=M =T5,M =Ms- 4E,L ", -"<&E4L ,L4H ,4HaL ,45EL ,48EL ,4H5L ,4H8L ,E4M =dL =H5,L g=->L ,d=M =d-M ,H=M g-=M", -" =M5,d >M-=d =HM,5 g=Ms- =mL ,5m=BL ->m=aL ,Q=M -Q=M =QT,M =Q-aM p,=M =M-p p=T,M -ps=M ,", -"L4W =L v,5=HL -v>g=L v,=M =M-", -"v Z,=M =MZ- p=v,M -pv=M Z=p,M =My- U< U U5=D >U=D =U", -"M U+=M V= V=+ =Uj =U>M V=5 s=V 4EU< 4UU ", -"UH=5 g>=U Ud=M =U+dM V=H V=g Ud=j >M=Ud V5=H gVs= Um=U =U5Dm =U>Dm =UQ U+=Q V=", -"Q V+=Q p=U p>=U V=p Vps= U<4W 4UW=U =UvH5", -" g=Uv> vU=Q =Uv+Q Z=V gVZ= pv=U p=Uv> VpZ= yV= ,U< U<& U<,D c=U =bU5D =Uc> =bM -U=M V=b c=V ,U", -"=j =b>M V5=b V-s= ,E4U ,4U&E 4U,H c4U,H ,4U5E ,4U8E ,4UH5 c5Ud =bHU5", -" c=g>U bd=M =bM-d Vd=b gVc= =bM5d >M=bd V=bH5 c=Vgs ,NU< UN<& ,UDUm ,U5=Dm c=>Um ,U=Q -U=Q Vm=b =QV- pb=U =U-p =bV", -"p V=cp 4U,W = =U5vD, cv=>U v", -"b=M -vU=Q =bVv V-Z= p=bvU -pUv= Vv,p= c=yV k= 7B=k =", -"a>k =kM 6+=M =Tk 6a=M l= l=> l=T l=s 4Ek 7H=k >kg= 6d=M =k+dM 6H=M g6=M l=d >=ld l=H gl= m=k 7=mkB >k=am =Qk +Q=k Qk", -"=T Qa=k l=p p=l> lp=T lsp= W<4k =k 7v=", -"Hk g=k7v v6=M =Qkv+ Z=k =kgZ lv= v>l= l=Z yl= ?k ?k& ?Bk ?ak ?1k ?:k 1k?B :", -"a?k ?M ?M& ?Tk ?aM l? l?: l?T s?l ?k* ?-k k*?B -k?a 1*?k -k?: ?B1k* ?:-ak ?", -"M* ?-M Tk?* -T?M l?* l-? ?Tl* s?l- ?kE k&?E ?Hk Hk?a 1k?E :k?E 1H?k ?k:H ?M", -"E M&?E ?HM HM?a l?E lE?: l?H lHs? ?dk -k?d Hk?d g?k 1d?k ?k:d ?H1dk ?:gk ?d", -"M -M?d HM?d g?M l?d ?:ld ?Hld gl? ?4k 4k?& 4k?B 4a?k 7?k ?k7: ?k7B ?k7a ?M4", -" 4M?& 4T?M 4a?M l?7 7l?: 7l?T l?7s =k? =k- ?B=k ?a=k 7?=k Ak ?=7kB Aak =M? ", -"?-=M ?T=k ?a=M l=? Al =Tl? Als 4k?E ?4k&E 4H?k ?H4ak 7k?E ?:7kE ?k7H ?:H7k ", -"4M?E ?M4&E 4H?M ?HM4a lE7? l?7:E 7l?H l?H7s ?d=k =d-k ?H=k =kg? ?k7d Adk ?H", -"7=k Agk ?d=M ?-M=d ?H=M =Mg? ?=ld Ald =Hl? Alg ?kN k&?N kN?B ak?N 1k?N :k?N", -" ?B1kN ?:akN ?Qk Qk?& Qk?T Qa?M l?Q ?Ql: lQ?T ?Qls k*?N ?N-k ?Bk*N ?-akN ?1", -"k*N ?:-kN k*N?B1 :-k?aN Qk?* -Q?M ?QTk* ?-QTk ?Ql* ?Ql- l?QT* l-?sQ ?Wk Wk?", -"& Hk?W Wa?k 1W?k ?k:W ?H1Wk ?:HWk ?WM WM?& ?Zk Zk?a l?W ?:lW ?Zl l?Z: Wk?d ", -"-k?W ?HWdk ?Wgk ?W1dk ?:W-k 1H*?Wk g?:Wk WM?d -W?M Zk?d gk?Z ?Wld ?-lW ld?Z", -" ?Zgl ?mk km?& km?B ak?m 7k?m ?k:m ?m7kB ?:mak ?Mm Mm?& Tk?m aM?m ?pl l?:p ", -"lp?T ls?p ?m=k -k?m ?=mkB ?-mak ?=7km Akm 7=B?mk akAm ?Q=k -Q=k ?Tm=k ?-Tkm", -" ?pl= Alp l=?pT lsAp 4W?k ?W4k& Hk?m ?Hmak ?k7W ?:W7k ?H7Wk ?:Hkm 4W?M ?WM4", -"& Z4?M ?Z4ak lW?p l?W:p l?7Z s?Z7l ?vk =k-v vk?H gk?v vk7? Avk ?v7Hk gvAk ?", -"vM ?M-v =k?Z =kZ- lv? Alv ?Zlv yAl 6U< 6!U< Dk 7U=D =D>k 6U=M =U6+M V=6 V6=a l=U =Ul> l=V 7V", -"s= U=d 7U=H =Ug7 =U6dM", -" 6U+=Md V6=H =kgV ld=U l=>Ud =H7V V=gl 6NU< U=m =U7Dm 7Ua=m 6U=Q =UQ6+ V6=Q V=6+Q 7p=U l=p>U Vpl= V=pl> = 7vU=H g7Uv= =Uv6Q =U+v6M =", -"kVv Vv6g= =Ulv lv=>U Z=7V l=yV ?t ?t& ?tD ?ct ?t1 ?t: t1?D t:?c ?tM tM?& V?", -" V?c l?t ?tl: V?l u? ?t* t-? t*?D t-?c ?1t* ?:t- ?t1D* ?t:c- t*?M ?Mt- V?* ", -"V?- ?tl* l?t- l*V? u?- ?tE t&?E ?tH tc?H t1?E ?Et: ?1tH t:?H tM?E ?tM&E V?H", -" Vc?H lE?t ?t:lE lHV? u?H ?td ?dt- tH?d g?t ?1td t:?d ?tH1d ?tg: td?M ?td-M", -" V?d g?V ?tld l-?td ldV? u?g ?t4 ?&t4 t4?D t4?c 7t? ?:7t ?D7t 7t?c t4?M ?t4", -"M& V?4 c4V? l?7t ?t:7l 7V? u?7 t= t=- t=D t=c t=7 At =D7t Atc t=M =Mt- t=V ", -"V?c= l=t Alt 7Vt= Au ?Et4 ?t4&E t4?H ?tHc4 ?E7t ?t:7E ?H7t 7tH?c ?t4ME t4&?", -"ME V4?H V?c4H 7tl?E l?:7tE ?H7V ?Hu7 t=d -=td t=H gt= ?d7t Atd =H7t Agt td=", -"M t=-dM =HV? V=g? ldt= ltAd =Hlt Aug ?tN t&?N tD?N ?Ntc t1?N ?Nt: ?t1DN ?t:", -"cN ?tQ ?&tQ V?Q tc?Q ?Qlt t:?Q Vl?Q u?Q ?Nt* ?Nt- ?tD*N ?ct-N ?t1*N ?t:-N t", -"*1?DN t-:?cN t*?Q ?Qt- V*?Q ?QV- ?tQl* t-Ql? V?lQ* ?-uQ ?tW ?&tW tH?W tc?W ", -"?1tW t:?W ?tH1W ?cWt: tW?Q ?tWQ& ?ZV ?ctZ ?tlW l?Wt: l?tZ u?Z tW?d ?Wt- ?tH", -"W* ?Wgt ?tW1d t-W?: ?H1tW* g?t:W tQ?d t-W?Q ?dtZ ?Zgt l?Wtd l-W?t V?dlZ g?u", -"Z ?tm ?&tm tm?D tc?m ?m7t t:?m ?tm7D ?cm7t t4?Q ?tQ4& V?m cmV? ?pt ?t:p ?pV", -" u?p t=m ?mt- tm=D tmc= 7=tm Atm t=7Dm tcAm t=Q =Qt- =QV? ?mV- tp= Apt V=?p", -" Aup t4?W ?tW4& tH?m ?cWt4 ?W7t 7tW?: 7tH?W 7cW?t ?tW4Q ?W&t4Q ?mtZ V?mZc ?", -"Wtp ?pt:W tZ?p ?Zup ?vt t-?v =Htv ?vgt 7t?v Atv ?vt7H gtAv =Qtv ?vt-Q ?vV Z", -"-t= tp?v lvAt tZl= Auy 3F !3F 3BF a3F 3F. 83F 3F.B a38F 3FK 3F!K T3F a3TF j", -"3F j38F j3TF s3F 3(F +3F 3(FB a3+F (F3. 83+F 3F.(B +8a3F (F3K 3F+K 3(TF T3+", -"F 3(jF j3+F Tj3(F +3sF G3 G3! GH3 Ga3 G3. G83 H3G. G3H8 G3K !KG3 GT3 TaG3 G", -"j3 8jG3 G3Hj sG3 Gd3 +G3 HdG3 gG3 d3G. +3G8 GHd3. G8g3 dKG3 GK+3 G3Td GTg3 ", -"G3dj +3Gj dj3GT g3sG 4F 4F! 4FB 4aF 45F 48F 5B4F 4F5a 4FK !K4F 4TF Ta4F 4jF", -" 8j4F 4F5T s4F 4;F 4+F ;F4B 4Fa; 5;4F >F4 45;FB 4a>F ;F4K +F4K 4FT; 4F+T 4F", -";j 4j>F ;jF4T >Fs4 4G 4G! 4GH 4Ga 4G5 4G8 G54H G54a 4GK GK4! 4GT GT4a 4Gj G", -"84j G54T s4G 4Gd 4+G G;4H g4G G54d >G4 4GH5d >Gg4 4KG; 4K+G GT4d 4GgT G;4j ", -"4G>j 4GT5d sGg4 3FN 3F!N 3FNB 3FaN 3FN. 3F8N 3F.NB 8a3FN Q3F !3QF T3QF a3QF", -" j3QF 83QF QTj3F Q3sF (F3N 3F+N 3FN(B +a3FN 3F.(N +83FN N.(3BF 8a3+FN 3(QF ", -"Q3+F QT3(F +QT3F Qj3(F +Q83F Tj3Q(F s+Q3F GW3 G3W! HWG3 G3Wa W3G. G3W8 GHW3", -". G8HW3 GQ3 G3Q! ZG3 GaZ3 G3Wj G3Q8 GjZ3 ZGs3 WdG3 GW+3 GHWd3 GWg3 GWd3. +G", -"W83 HWdG3. gGW83 G3Qd +3GQ GdZ3 ZGg3 dj3GQ +GQ83 ZGdj3 gZsG3 4mF mF4! mF4B ", -"4Fam 5m4F 4F8m 45mFB amF48 4QF 4FQ! 4FTm 4FQa p4F 48pF 4TpF p4sF m;4F 4F+m ", -"4m;FB amF4+ 45m;F 4m>F 5m;4FB >m4aF 4FQ; 4F+Q 4QT;F 4+QTF 4;pF p4>F p4T;F p", -">4sF 4GW 4!Gm Gm4H Ga4W G54W G84W 4GH5W 4G8Hm 4GQ Q!4G Z4G 4GZa pG4 4Gp8 pG", -"Z4 Z4sG v4G 4+vG 4GvH v4gG 4Gv5 v4>G v4GH5 gv>4G 4GvQ +G4Q v4ZG gGZ4 v4pG p", -"4>G Zpv4G y4G #3F &3F #3FB &3aF 3F#. &38F 3F.#B 8a&3F 3F#K 3F&K #3TF &3TF #", -"3jF j3&F Tj#3F &3sF 3(#F &3+F 3BF#( +a&3F 3F.#( +8&3F #(F.B3 8a&+3F 3FK#( +", -"&3FK T#3(F +T&3F j#3(F &j3+F j#3T(F s+&3F G#3 G&3 H#G3 G3H& #3G. 8&G3 GH#3.", -" G8H&3 #3GK &3GK T#G3 G3T& j#G3 G3&j GTj#3 G&s3 d#G3 +3G& GHd#3 G&g3 Gd#3. ", -"d&3G8 Hd#G3. gG8&3 Gd#3K d&3GK GTd#3 gGT&3 dj#G3 d&jG3 GT#dj3 gsG&3 4#F 4&F", -" #B4F a&4F 5#4F 4F5& 45#FB 48a&F #F4K &F4K T#4F 4FT& j#4F 4F&j 4T5#F 4&sF ;", -"#4F 4F;& 4;#FB a;&4F 45;#F 4&>F 5;#4FB >&4aF 4;#FK ;&F4K 4T;#F 4+T&F ;j#4F ", -">&4jF 4T#;jF s>4&F 4G# 4G& GH4# Ga4& 4#G5 G54& 4GH5# 4G8H& G#4K 4KG& 4#GT G", -"T4& 4#Gj G&4j 4GT5# 4Gs& 4#G; +G4& 4GHd# 4Gg& 4G5d# 4G>& G5H4d# g>4G& 4Gd#K", -" 4+G&K 4GTd# g4GT& 4Gjd# >G4&j dj#4GT gs4G& 3F#N 3F&N 3FN#B a&3FN 3F.#N 8&3", -"FN .B3#FN a&38FN #3QF &3QF QT#3F Qa&3F Qj#3F &j3QF Tj#Q3F sQ&3F 3FN#( +&3FN", -" #BF3(N a&3+FN #3FN.( 8&3+FN 3F#N.B( 3F&N+8a Q#3(F +Q&3F T#3Q(F Q&3+TF j#3Q", -"(F +Q3&jF 3(jFQT# +Q&s3F W#G3 G3W& GHW#3 GaW&3 GW#3. G8W&3 HW#G3. H8WG&3 Q#", -"G3 G3Q& G#Z3 G&Z3 GQj#3 GQ8&3 ZGj#3 Z&Gs3 GWd#3 d&3GW HWdG#3 gGW&3 Wd#G3. G", -"8Wd&3 W#H3Gd. G8Wg&3 GQd#3 +GQ&3 ZGd#3 Z&Gg3 GQ#dj3 d&3GQ8 dj#ZG3 gsGZ&3 m#", -"4F 4Fm& 4m#FB am&4F 45m#F m&F48 5m#4FB 48am&F Q#4F 4FQ& 4QT#F 4Qa&F 4#pF 4&", -"pF p4T#F p&4sF 4m;#F m&F4+ m;#4FB 4+am&F 5m;4#F >m4&F 5B4Fm;# am&>F4 4Q;#F ", -"4+Q&F Q;#4TF a;F4Q& p4;#F p>4&F 4T;p#F s>4p&F 4#Gm Gm4& 4GHW# 4GaW& 4G5W# 4", -"G8W& G5H4W# G5a4W& 4#GQ GQ4& 4GZ# 4GZ& 4Gp# 4Gp& Zp4G# Zp&4G 4Gv# 4Gv& v4GH", -"# gv4G& v4G5# v>4G& 4GHv5# v>Gg4& v4GQ# v&4GQ Zv4G# Zv&4G pv4G# pv&4G pvGZ4", -"# 4Gy& I3 I3! DI3 aI3 I3. 8I3 I3D. D38I I3K !KI3 TI3 T3aI Ij3 83Ij D3Ij sI3", -" I3( +I3 I3D( +3aI 3(I. +38I DI3(. +D8I3 3(IK I3+K I3T( +3TI j3I( +3Ij Ij3D", -"( +Is3 GI3 I3G! J3 Ja3 I3G. G38I J3. J83 I3GK GI3!K JT3 TaJ3 G3Ij Ij3G8 Jj3", -" sJ3 Id3 +3Id Jd3 gJ3 d3I. 83Id d3J. g3J8 I3dK Id3+K TdJ3 JTg3 I3dj Idj+3 d", -"jJ3 g3sJ 4I 4I! 4DI 4aI 4I5 48I 5D4I 5a4I 4IK IK4! 4TI TI4a 4Ij 8I4j 5T4I s", -"4I 4I; 4+I D;4I +D4I 45I; >I4 4D5I; 4D>I 4KI; 4K+I T;4I +T4I I;4j 4I>j I;j4", -"D >Is4 4GI GI4! J4 J4a G54I G84I J45 J48 GI4K 4GI!K J4T 4TJa Gj4I 4G8Ij J4j", -" sJ4 4Id +G4I J4d gJ4 5I4d 4G>I 4dJ5 J>4 4KId 4+GIK 4TJ; gTJ4 Id4j >I4Gj 4d", -"Jj g4sJ I3N !3IN I3DN I3aN N.I3 IN83 DI3N. D8I3N QI3 I3Q! Q3TI Q3aI Q3Ij Q3", -"8I Ij3QD QIs3 3(IN I3+N DI3(N +DI3N I3(N. +I83N I3(DN. D83+IN I3Q( +3QI QDI", -"3( +QDI3 Ij3Q( +QI83 QD3Ij( sI+Q3 WI3 I3W! JW3 WaJ3 I3W. W38I W3J. W8J3 G3Q", -"I GQI!3 ZJ3 JaZ3 W3Ij GQ8I3 Z3Jj s3ZJ W3Id +3WI WdJ3 JWg3 Id3W. +WI83 JWd3.", -" gJW83 Q3Id +GQI3 JdZ3 g3ZJ IdjW3 +WIj3 ZJdj3 sJZg3 4Im 4!Im Dm4I am4I 45Im", -" 8m4I 4D5Im 4D8Im 4QI Q!4I QD4I Qa4I pI4 48pI 4DpI pIs4 4mI; +m4I Im;4D 4+D", -"Im Im;45 4I>m 4D5Im; >Dm4I Q;4I +Q4I 4QDI; 4+QTI 4Ip; p4>I pD4I; p>D4I 4WI ", -"4!WI J4W 4WJa 5W4I W84I 4WJ5 4WJ8 GQ4I 4GQI! ZJ4 ZaJ4 4GpI pG48I Jp4 s4Jp v", -"I4 4+vI Jv4 g4Jv 4Iv5 v4>I v4J5 v>J4 4QvI vI4+Q Z4Jv ZJg4 p4vI pvI>4 pvJ4 y", -"J4 bI3 I&3 DIb3 cI3 I3b. b38I bDI3. 8Ic3 I3bK &3IK b3TI TIc3 b3Ij I3&j Ij3b", -"T cIs3 I3b( b3+I bDI3( +Ic3 bI3(. I&3+8 DI3b(. c+8I3 bKI3( I&3+K bTI3( c+TI", -"3 Ij3b( I&j+3 bT3Ij( sI+c3 bG3 b3G& Jb3 cJ3 G3b. b3G8 b3J. c3J8 G3bK I&3GK ", -"bTJ3 JTc3 b3Gj I&jG3 bjJ3 s3cJ b3Id b3+G bdJ3 g3cJ Id3b. b+G83 Jbd3. cJ8g3 ", -"Id3bK b+G3K JbTd3 cJTg3 Idjb3 Idj&3 Jjbd3 sJgc3 4bI 4I& bD4I c4I b54I b84I ", -"4b5DI 48cI bK4I 4KI& bT4I 4TcI bj4I I&4j 4bT5I c4sI b;4I b+4I 4bDI; 4+cI 4b", -"5I; 4b>I b5D4I; >Ic4 I;K4b I;&4K 4bTI; c4+TI I;j4b >I4bj 4bTI;j c>s4I 4bG b", -"G4& J4b cJ4 b54G bG48 4bJ5 J4c5 4KbG 4bG&K 4bJT cTJ4 bG4j I&j4G 4bJj cJs4 b", -"G4d b+4G 4bJ; cJg4 4bG5d 4b>G J4b5d c4J> 4bGdK 4b+GK J4bTd cJ4gT Idj4b >bG4", -"j J4jbd J>sc4 I3bN &3IN bDI3N I3cN bI3N. I&38N DI3bN. c8I3N b3QI Q3I& bQDI3", -" QIc3 Ij3bQ I&jQ3 bQDIj3 sIQc3 bI3(N I&3+N DI3b(N c+I3N I3(bN. +I3b8N 3(INb", -"D. +I8c3N bQI3( b+QI3 QI3bT( cQ+I3 bQ3Ij( Ij3b+Q Qjb3TI( cQ+sI3 b3WI W3I& b", -"WJ3 JWc3 bGW3. bG8W3 JbW3. cJW83 b3GQ bGQ&3 JbZ3 Z3cJ bGQj3 I&jW3 ZJbj3 sJZ", -"c3 Id3bW b+GW3 JbWd3 cJWg3 bW3Id. Id3bW8 bWdJ3. gJ8cW3 bGQd3 b+GQ3 ZJbd3 Zc", -"Jg3 Id3bWj Id3bQ8 JjdZb3 ZcgsJ3 bm4I Im4& 4bDIm 4Icm 4b5Im Im&48 b5D4Im c45", -"Im bQ4I QI4& 4bQTI 4QcI 4bpI 4Ip& pb4TI pIc4 Im;4b Im&4+ 4bDIm; c4+Im 4b5Im", -"; >I4bm Imb;4D5 c>4Im 4bQI; I;&4Q bQ;4TI c4Q+I pb4I; p>b4I 4bTpI; cp>4I bG4", -"W WI4& 4bJm J4cW 4bG5W 4bGW8 J4b5W cJ45W bG4Q 4bGQ& J4Zb cJZ4 4bpG pbG48 pb", -"J4 c4Jp 4bvI 4Iv& vbJ4 c4Jv vb4G5 v>b4G Jv4b5 cvJ>4 vb4GQ vI&4Q ZJ4vb cvZJ4", -" pvb4G pvI4& Jpv4b cJy4 6F 6!F 6FB 6aF 61F 68F 1F6B 6F1a 6FK !K6F 6TF Ta6F ", -"6jF 8j6F 6F1T s6F 6(F 6+F (B6F +a6F 1(6F 6F1+ 61(FB 6+1aF (F6K +F6K T(6F 6F", -"+T j(6F 6F+j 6T1(F 6+sF 6G 6G! 6GH 6Ga 6G1 6G8 1G6H 1G6a 6GK GK6! 6GT GT6a ", -"6Gj G86j 1G6T s6G 6Gd 6+G GH6d g6G 1G6d 1+6G 6G1Hd 6Gg1 Gd6K 6K+G GT6d 6GgT", -" Gj6d +G6j 6GT1d sGg6 46F 4F6! 6F4B 4F6a 7F 78F 7BF 7aF 6F4K 6!4FK 4F6T 4T6", -"aF 7jF 8j7F 7TF 7sF 6;F 4F6+ ;F6B 6Fa; 7;F 7>F ;F7B >F7a ;F6K 4+6FK 6FT; 4+", -"T6F ;j7F 7j>F T;7F >F7s 4G6 6!4G 6G4H 6G4a 7G 7G8 7GH 7Ga 4K6G 4G6!K 6G4T 4", -"GT6a 7Gj G87j 7GT 7sG 6G; 6+4G G;6H 4Gg6 7Gd 7>G G;7H g7G 6KG; 4+G6K GT6; g", -"46GT G;7j >j7G GT7d sGg7 6FN !F6N NB6F aF6N 1F6N 8F6N 61FNB 68aFN 6QF 6FQ! ", -"QT6F 6FQa 6F1Q 6FQ8 6Q1TF 6QsF (F6N +F6N 6(FNB 6+aFN 61(FN 6+1FN 1(F6NB 1+F", -"6aN Q(6F 6F+Q 6QT(F 6+QTF 6Q1(F 6+Q1F 1Q(6TF s6+QF 6GW W!6G GH6W Ga6W 1G6W ", -"G86W 6G1HW 6G8Wa 6GQ Q!6G Z6G 6GZa 1G6Q GQ68 6GZ1 Z6sG GW6d +G6W 6GHWd 6GgW", -" 6G1Wd 6+G1W 1GH6Wd g61GW GQ6d +G6Q 6GZd gGZ6 6GQ1d 6+G1Q Z61Gd gZ6sG 6mF m", -"F6! mF6B 6Fam 7mF 8m7F mF7B am7F 4F6Q 4Q6!F 6FTm 4Qa6F 7pF p87F pT7F sF7p m", -";6F 6F+m 6m;FB 6+maF m;7F 7m>F 7Bm;F 7>amF 6FQ; 4+Q6F 6Q;TF 6+TmF p;7F >F7p", -" 7pT;F 7p>sF 6Gm 6!Gm Gm6H Ga6m 7GW G87W Gm7H Ga7W 6G4Q 4GQ6! 4GZ6 Z46Ga 7p", -"G 78pG 7ZG sG7Z v6G 6+vG 6GvH gGv6 7vG v>7G vG7H 7Ggv 6GvQ v6+GQ ZGv6 Zv6gG", -" pv7G p>7G 7GZv y7G 69F 6&F 9F6B 6F9a 916F :6F 691FB 6a:F 9F6K &F6K 6F9T 6F", -"T& 6F9j 6j:F 6T91F :6sF 9(6F 6F9+ 69(FB 6+9aF 691(F 6+:F 91(6FB :6+aF 69(FK", -" 6+9FK 6T9(F 6+T9F 6j9(F :6+jF 9T(6jF s:6+F 6G9 6G& 9G6H 9G6a 691G :G6 6G91", -"H 6G:H 6K9G 6KG& 9G6T GT6& 9G6j 6G:j 6GT9j :Gs6 9G6d 9+6G 6G9Hd 6Gg9 6G91d ", -"6+:G 9G16Hd :Gg6 6G9dK 6+G9K 6GT9d g69GT 6Gj9d :G6+j 9GT6dj g:s6G 49F 4F6& ", -"9F4B 4F9a 79F 7:F 9F7B :a7F 9F4K 49&FK 4F9T 49TaF 9j7F :j7F 9T7F sF7: 4F9; ", -"4F9+ 49;FB 49+aF 9;7F >F7: 7B9;F 7:>aF 49;FK 49+FK 49T;F 49+TF 79;jF 7:>jF ", -"7T9;F 7s:>F 49G 6G4& 9G4H 9G4a 7G9 7:G 9G7H :G7H 4K9G 49G&K 9G4T 49GT& 9G7j", -" 7j:G 9G7T 7:sG 9G4d 9+4G 49GH; 49gG 9G7d :>7G 7G9H; 7Gg: 49GdK 49+GK 49GTd", -" g49GT 7G9dj 7:G>j 7GT9d 7sGg: 9F6N &F6N 69FNB 6a9FN 691FN 6F:N 91F6NB :6aF", -"N 6F9Q 6FQ& 6Q9TF 6Qa9F 6Q91F 6Q:F 9Q16TF :Q6sF 69(FN 6+9FN 9(F6NB 9+F6aN 9", -"1(6FN :6+FN 916N(BF 6+a:FN 6Q9(F 6+Q9F 9Q(6TF 6+F9Qa 9Q(6jF :Q6+F QT1(69F s", -"6+:QF 9G6W G&6W 6G9HW 6Ga9W 6G91W 6G:W 9G16HW :G6Wa 9G6Q GQ6& 6GZ9 6GZ& 6GQ", -"9j 6G:Q Z691G :GZ6 6G9Wd 6+G9W 9GH6Wd g69GW 9G16Wd :G6+W 691HGWd g:6GW 6GQ9", -"d 6+G9Q Z69Gd Z6&gG 9GQ6dj :GQ6+ 6GjZ9d Z:g6G 4F9m 6Fm& 49mFB 49amF 9m7F 7F", -":m 7B9mF 7:amF 4F9Q 49Q&F 49QTF 49QaF 7Fp9 7F:p 7p9TF 7sp:F 49m;F 49+mF 9mF", -"6;B amF49+ 79m;F 7:>mF 9m;7BF :>m7aF 49Q;F 49+QF 4QF9T; a;F49Q 7p9;F 7p>:F ", -"p9;7TF :p>7sF 9G4W Gm6& 49GHm 49GWa 9G7W :G7W 7G9Hm 7:GHm 9G4Q 49GQ& 49ZG Z", -"49Ga p97G 7G:p Z97G 7GZ: 49vG 6Gv& v69GH gv69G v97G 7G:v 7v9GH :vGg7 v69GQ ", -"v6&GQ Zv69G Zv6G& 7pGv9 :vG7p 7Zv9G 7:yG 6I 6I! 6DI 6aI 6I1 68I 1D6I 1a6I 6", -"IK IK6! 6TI TI6a 6Ij 8I6j 1T6I s6I 6I( 6+I DI6( +D6I 6(1I 1+6I 6D1I( 6+D1I ", -"I(6K 6K+I 6(TI +T6I 6(Ij +I6j 6DjI( 6+sI 6GI GI6! J6 J6a 1G6I G86I J61 J68 ", -"GI6K 6GI!K J6T 6TJa Gj6I 6G8Ij J6j sJ6 6Id +G6I J6d gJ6 1I6d 8I6d 6dJ1 J6g1", -" 6KId 6+GIK 6TJd gTJ6 Id6j Idj6+ 6dJj g6sJ 4I6 6!4I 6D4I 6a4I 7I 7I8 7DI 7a", -"I 4K6I 4I6!K 6T4I 4TI6a 7Ij 8I7j 7TI 7sI 6I; 6+4I D;6I aI6; 7I; 7>I D;7I >D", -"7I 6KI; 4+I6K TI6; 4+T6I I;7j >j7I TI7; 7>sI 6G4I 4G6I! J46 4aJ6 7GI G87I 7", -"J 7J8 4G6IK 6GK4I! 4TJ6 J46Ta Gj7I 7G8Ij 7JT 7Js 6I4d 4+G6I J6; J4g6 7Id >G", -"7I 7Jd g7J 4Id6K I;K6+G 6TJ; gJ46T Id7j 7>GIj J;7T sJg7 6IN IN6! DI6N 6NaI ", -"6N1I 6N8I 6D1IN 6D8IN 6QI Q!6I QD6I Qa6I 1Q6I Q86I 6QD1I 6QsI I(6N 6N+I 6DI", -"(N 6+DIN 6I1(N 6+I1N 1D(6IN 6+N1aI 6(QI +Q6I 6QDI( 6+QTI 6QI1( 6+Q1I Ij(6QD", -" s6I+Q 6WI 6!WI J6W 6WJa 1W6I W86I 6WJ1 6WJ8 GQ6I 6GQI! ZJ6 ZaJ6 WI6j 6GQ8I", -" J6Z1 ZJs6 WI6d +W6I 6WJd gWJ6 6WI1d 6+W1I J61Wd gJ61W QI6d 6+GQI ZdJ6 ZJg6", -" Idj6W 6+WIj ZJ61d sJ6gZ 6Im 6!Im Dm6I aI6m 7Im 8I7m Dm7I aI7m 6Q4I 4QI6! T", -"I6m 4Qa6I 7pI 78pI pD7I 7psI Im6; +I6m 6DmI; 6+DIm Im7; >m7I 7DIm; 7>DIm QI", -"6; 4+Q6I 6QDI; 6+TIm 7;pI p>7I 7pDI; 7sIp> 6W4I 4WI6! J6m 6aJm 7WI W87I 7JW", -" J87W 4GQ6I Im!6GQ J4Z6 ZJ46a pG7I 7pG8I 7ZJ sJ7Z v6I 6+vI Jv6 g6Jv 7vI v>7", -"I 7Jv 7vJ> 6QvI v6I+Q Z6Jv Jv6gZ pv7I 7vIp> 7vJp yJ7 b6I 6I& 9D6I c6I 6Ib1 ", -":I6 b61DI c6:I bK6I 6KI& 6IbT 6TcI 6Ibj 6I:j b6T1I :Is6 b(6I 6Ib+ b6DI( 6+c", -"I b61I( 6+:I 6DIb1( :c6+I b6I(K b6+IK b6TI( c6+TI b6jI( :I6+j Ij(b6T s:I6+ ", -"b6G 6&bG J6b cJ6 6Gb1 b6:G b6J1 :J6 bK6G b6G&K b6JT cTJ6 6Gbj :Gb6j b6Jj s6", -":J 6Gbd 6+bG b6Jd cJg6 b6G1d 6I:d J6b1d g6:J b6GdK b6+GK J6bTd cJ6gT Idjb6 ", -":Id6j J6jbd sJ6g: 49I 6I4& 9D4I 49cI 7bI 7:I 9D7I 7cI 4K9I 49I&K 9T4I c46TI", -" bj7I 7j:I bT7I sI7c 6Ib; 9+4I 49DI; 6Ic; b;7I :>7I 7bDI; 7Ic> 49I;K I;&6K ", -"49TI; c6;TI 7bI;j 7:I>j 7bTI; 7sIc> b64G 4bG6& J49 J4c6 7bG :G7b 7Jb 7J: 4b", -"G6K I&K49G 49JT cJ46T bG7j 7:Gbj J97T sJ7c 6Gb; I;&6G 49J; J4g9 bG7d :I7d J", -"97d :Jg7 49IdK IdK49+ J49Td cJ6T; 7bGdj 7:Idj 7JbTd g7Js: bN6I 6NI& b6DIN 6", -"IcN b61IN 6I:N 6DIb1N :c6IN 6IbQ QI6& b6QTI 6QcI b6Q1I 6Q:I 6QIb1T :cQ6I b6", -"I(N b6+IN 9D(6IN c6+IN 6I(b1N :I6+N b(6D1IN c6+:IN b6QI( b6+QI bQ(6TI c6Q+I", -" Ij(b6Q :QI6+ b(6Q1TI sI+c6Q 6GbW WI6& b6JW J6cW b6G1W 6W:I J6b1W J6:W 6GbQ", -" b6GQ& J6Zb cJZ6 b6G1Q :GQb6 ZJ6b1 Z6:J b6GWd b6+WI J6bWd cJ6gW 6WIb1d :WI6", -"+ b6WJ1d :Jg6W b6GQd b6+GQ ZJ6bd Zc6gJ b6WIdj :QI6d ZbdJ6j Z:Jg6 6Ibm Im6& ", -"49DIm 6Icm bm7I :m7I 7bDIm cm7I 9Q4I Im&6Q 49QTI c4Q6I pb7I 7I:p 7pbTI 7Icp", -" 49Im; Im&6+ 9Dm6I; c6m+I 7bIm; 7:I>m 9Dm7I; 7c>Im 49QI; I;&6Q 6QIbT; c6QI;", -" 7pbI; :pI7> 7D;p9I 7cp>I 6Gbm Im&6G 49Jm J6cm bG7W :W7I J97W 7W:J 4bG6Q b6", -"G4Q& J4Z9 Zc4J6 pb7G :pG7b 7bJp Z:7J 49vI 6Iv& vbJ6 c6Jv vb7G 7I:v 7bJv :v7", -"J vb6GQ v6IQ& Jv6Zb cv6ZJ 7vbpG :vI7p Jp97v 7Jy: 3FL 3F!L 3FLB 3FaL FL3. 3F", -"8L 3L.FB 8a3FL M3F !3MF M3TF M3aF j3MF M38F TMj3F M3sF (F3L 3F+L 3FL(B +a3F", -"L 3L.(F +83FL (BL3F. 8a3+FL 3(MF M3+F TM3(F aM3+F Mj3(F +M83F Mj3T(F s+M3F ", -"G3L !3GL H3GL a3GL 3LG. 83GL GH3L. G8H3L GM3 M3G! G3HM G3aM MjG3 G38M GTMj3", -" GMs3 d3GL G3+L GHd3L G3gL Gd3L. +G83L Hd3GL. gG83L G3dM +3GM dM3GT GMg3 dM", -"jG3 +GM83 GTMdj3 gsGM3 4FL !F4L LB4F aF4L 5F4L 8F4L 45FLB 48aFL 4MF MF4! TM", -"4F 4FaM 4F5M 4F8M 4T5MF 4MsF ;F4L +F4L 4;FLB a;F4L 45;FL 4F>L 5;F4LB >F4aL ", -"4FM; 4F+M M;F4T aM;4F M;F4j 4M>F 4T5M;F >Ms4F 4GL GL4! GH4L 4LGa 4LG5 4LG8 ", -"4GH5L 4G8HL 4GM 4!GM GT4M Ga4M G54M G84M 4GT5M 4GsM 4LG; 4L+G 4GHdL 4GgL 4G", -"5dL 4G>L G5H4dL g>4GL GM4d +G4M 4GTdM 4GgM 4GM5d 4G>M G5T4dM >Mg4G FL3N 3FN", -"!L 3FNLB a3FLN 3L.FN 83FLN .BL3FN a3F8LN M3QF Q!M3F QTM3F aM3QF QMj3F Q8M3F", -" TMjQ3F sQM3F 3FN(L +3FLN (BL3FN a3F+LN N.(3FL 83F+LN (FLBN.3 3L+N8aF QM3(F", -" +QM3F TM3Q(F +Q3aMF Mj3Q(F Q83+MF 3(MFQTj +QMs3F W3GL W!G3L GHW3L GaW3L GW", -"3L. G8W3L HW3GL. W83GaL G3WM GQM!3 GMZ3 ZGaM3 GQMj3 GQ8M3 ZGMj3 sZGM3 GWd3L", -" +GW3L HWdG3L gGW3L Wd3GL. G83+WL W3HLGd. G8Wg3L dM3GQ +GQM3 ZGdM3 gZGM3 GQ", -"Mdj3 dM3GQ8 dMjZG3 sZGgM3 mF4L 4mF!L 4mFLB amF4L 45mFL 48mFL 5mF4LB 48FamL ", -"4FMm MmF4! MmF4T aMm4F 4MpF p48MF p4TMF sp4MF 4m;FL 4+mFL m;F4LB 4+FamL 5m;", -"4FL >m4FL mL4B5;F amF>L4 MmF4; 4+QMF 4QTM;F aMF4+Q p4M;F >Mp4F M;Fp4T sp4>M", -"F 4LGm 4GW!L 4GHWL 4GaWL 4G5WL 4G8WL G5H4WL amL4G8 GQ4M 4GQM! 4GZM Z4GaM 4G", -"pM pG48M Zp4GM sZ4GM 4GvL v4+GL v4GHL gv4GL v4G5L v>4GL 4GHv5L g4Lv>G 4GvM ", -"vM4+G Zv4GM gZ4GM pv4GM >Mv4G pvGZ4M 4GyM 3F#L 3F&L 3FL#B a&3FL 3L.#F 8&3FL", -" #L.3BF a&38FL #3MF &3MF TM#3F aM3&F Mj#3F M&38F Mj#T3F sM&3F 3FL#( +&3FL #", -"3(LBF a&3+FL #(F3L. 8&3+FL (FLB#3. 3F+L8a& M#3(F M&3+F M#3T(F +T3M&F j#3M(F", -" +M3&jF 3(MFTj# M&3s+F #3GL &3GL GH#3L Ga&3L G#3L. G8&3L H#3GL. H83G&L M#G3", -" G3M& GTM#3 GT&M3 GMj#3 G8M&3 HM#Gj3 sGM&3 Gd#3L d&3GL Hd#G3L gG&3L d#3GL. ", -"G83d&L H#G3dL. G8&g3L dM#G3 dM&G3 GT#dM3 gMG&3 GM#dj3 dM3G&j dMGjH#3 sG&gM3", -" #F4L &F4L 4#FLB 4a&FL 45#FL 48&FL 5B#4FL 5aF4&L M#4F 4FM& 4TM#F 4T&MF 4M5#", -"F 48M&F 5T#4MF s4M&F 4;#FL ;&F4L ;#F4LB 4aF;&L 5;#4FL >&4FL 5#4L;FB 4a&>FL ", -"M;#4F M;&4F 4T#M;F a;F4M& 4M#;jF >M4&F 5FM;4T# s4&>MF G#4L 4LG& 4GH#L 4Ga&L", -" 4G5#L 4G8&L G5#4HL 4GLH5& 4#GM GM4& 4GTM# 4GTM& 4GM5# 4G8M& 4G#H5M s4GM& 4", -"Gd#L 4+G&L G;#4HL g4G&L G5#4dL >G4&L HL5d4G# >G&g4L 4GMd# dM&4G dM#4GT g4MG", -"& dM#4Gj >MG4& 5#dM4GT >M&s4G 3FN#L &3FLN #LN3BF &3FaLN #LN3F. &3F8LN 3LNB#", -"F. 3F&N8aL QM#3F M&3QF TM#Q3F Qa3M&F Mj#Q3F Q83M&F TMQj#3F M&3sQF #(L3FN &3", -"F+LN (FLB#3N 3L+Na&F 3F#LN.( 3L+N8&F (BN.3F#L 8a+F3L&N M#3Q(F +Q3M&F 3(MFQT", -"# Q3aM+&F 3(MFQj# j3+FQ&M TjQ#3(MF M&s3+QF GW#3L G&W3L HW#G3L Wa3G&L W#3GL.", -" W83G&L W3HLG#. HLW&G83 GQM#3 GQ&M3 ZGM#3 Z&GM3 WM#Gj3 M&3GQ8 GMjZ#3 sGMZ&3", -" Wd#G3L G&3+WL W3HLGd# G&Wg3L W3GLd#. GW+38&L 3LH.WdG# GWg38&L GQ#dM3 dM3GQ", -"& dM#ZG3 gMGZ&3 Q#G3dMj W38M+G& dMZjG#3 sGgZM&3 4m#FL m&F4L m#F4LB 4aFm&L 5", -"m#4FL 48Fm&L mL4B5#F am5&4FL Mm#4F Mm&4F 4T#MmF aMF4Q& p4M#F p&4MF 4TMp#F s", -"4Mp&F m;#4FL 4+Fm&L mL4B;#F a;4&mFL 5#4Lm;F m&F>L4 LB;F5m4# am>&4FL 4Q#M;F ", -"M;F4Q& Q#M;4TF MmT&4+F M;#p4F p&4>MF M;p#4TF >&s4pMF 4GW#L 4G&WL Gm#4HL amL", -"4G& G5#4WL m&L4G8 W#4LG5H HL5&4GW 4GQM# Mm&4G Z4GM# Z4&GM pG4M# pG&4M pGMZ4", -"# Z4MpG& v4G#L v&4GL 4GHv#L v&Gg4L 4G5v#L >G4v&L 45v#GHL >&g4vGL vM4G# vM&4", -"G vMGZ4# Z4GvM& vM4pG# >M4pG& ZGvMp4# y&4GM UI3 I3U! DIU3 U3aI I3U. U38I UD", -"I3. U8ID3 IM3 I!M3 VI3 aIV3 U3Ij 83IM IjV3 VIs3 I3U( U3+I UDI3( U+DI3 UI3(.", -" U+8I3 DI3U(. +DIU83 M3I( +3IM I3V( +IV3 IM3j( U+jI3 VIj3( sIV+3 UG3 G3U! J", -"U3 UaJ3 G3U. U3G8 U3J. U8J3 U3GM IM3G! VJ3 VaJ3 U3Gj UG8M3 VjJ3 s3VJ U3Id U", -"3+G UdJ3 JUg3 Id3U. U+G83 JUd3. gJU83 I3dM IdM+3 J3Vd g3VJ IdMj3 IdM83 JjVd", -"3 gVJs3 4UI U!4I UD4I Ua4I U54I U84I 4U5DI 4U8aI 4IM 4!IM V4I 4aVI Uj4I 8I4", -"M 4IV5 V4sI U;4I U+4I 4UDI; 4U+aI 4U5I; 4U>I U5D4I; >I4Ua I;4M +I4M 4IV; 4+", -"VI IM;4j 4I>M V45I; >IV4 4UG 4!UG J4U 4UJa U54G UG48 4UJ5 4UJ8 UG4M 4UGM! J", -"4V JaV4 UG4j 4UG8M V4J5 VJs4 UG4d U+4G 4UJ; J4gU 4UG5d 4U>G J4U5d >UJ4 Id4M", -" IdM4+ V4J; J4gV IdM4j >MG4U J4V5d J4V> I3UN U!I3N UDI3N UaI3N UI3N. U8I3N ", -"DI3UN. 8I3UaN U3QI IM3Q! QIV3 VQaI3 IM3Qj UQ8I3 VQIj3 sIVQ3 UI3(N U+I3N DI3", -"U(N +I3UaN I3(UN. +I3U8N D3UNI(. +3UND8I IM3Q( U+QI3 VQI3( V+QI3 UQ3Ij( Ij3", -"U+Q Ij3VQ( V+QsI3 U3WI UGW!3 UWJ3 JUWa3 UGW3. UG8W3 JUW3. J8UW3 U3GQ UGQ!3 ", -"Z3VJ ZJVa3 UGQj3 UGQ83 ZJVj3 sJZV3 Id3UW U+GW3 JUWd3 gJUW3 UW3Id. Id3UW8 UW", -"dJ3. gUWJ83 IdMW3 U+GQ3 ZJVd3 gVZJ3 Id3UWj Id3UQ8 VZdJj3 sJZgV3 Um4I Im!4U ", -"4UDIm 4UaIm 4U5Im 4U8Im U5D4Im U8m4aI UQ4I IMm4! 4QVI V4QaI 4UpI pU48I pIV4", -" Vps4I Im;4U 4U+Im 4UDIm; U+m4aI 4U5Im; >I4Um ImU;4D5 4Ua>Im IMm4; IMm4+ V4", -"QI; V4+QI pU4I; >MIp4 Vp4I; V>p4I UG4W 4UGW! 4UJm J4UWa 4UG5W 4UGW8 J4U5W J", -"48UW UG4Q 4UGQ! VZJ4 ZJ4Va 4UpG pUG48 J4Vp JpVs4 4UvI vU4+G vUJ4 Jvg4U vU4G", -"5 v>U4G Jv4U5 J>v4U 4IvM vIM4+ J4Vv VvJg4 pvU4G >Mv4I JpVv4 J4yV UIb3 U3I& ", -"bUDI3 UIc3 bUI3. I&3U8 UDIb3. cU8I3 b3IM I3M& bIV3 VIc3 IM3bj IM&83 VbIj3 s", -"IVc3 bUI3( I&3U+ UDIb3( cU+I3 UI3b(. U+8I&3 3(U.bDI U+8cI3 IM3b( IM&+3 VbI3", -"( Vc+I3 bM3Ij( IM3b+j Ij3Vb( Vc+sI3 b3UG U3G& bUJ3 JUc3 bGU3. bG8U3 JbU3. c", -"JU83 b3GM IM&G3 VbJ3 c3VJ bGMj3 bG8M3 JjVb3 sJVc3 Id3bU b+GU3 JbUd3 cJUg3 U", -"G3bd. I&3U8d bdUJ3. gcUJ83 IdMb3 IdM&3 VJbd3 gVJc3 IM3bdj Id3b8M VdbJj3 sJc", -"gV3 bU4I U&4I 4bUDI 4UcI 4bU5I 4b8UI b5U4DI c4U5I bM4I IM4& 4bVI cIV4 4bM5I", -" IM&48 V4b5I c4VsI 4bUI; I;&4U b;U4DI c4U+I b5U4I; >I4U& 45b;UDI c>4UI IM;4", -"b IM;4& V4bI; c4V+I 4bMI;j >Mb4I I;jV4b V>c4I bG4U UG4& 4bJU cUJ4 4bGU5 4bG", -"U8 J4bU5 cJ4U5 bG4M IM&4G JbV4 VJc4 4bGUj 4bG8M J4Vb5 sJ4Vc 4bGUd 4b+UG J4b", -"Ud cJ4gU bG54Ud >bG4U 4bdJ5U J>c4U IdM4b IdM4& J4Vbd gV4cJ 4bMIdj >Mb4G J4b", -"V5d J>Vc4 bUI3N I&3UN UDIb3N cUI3N UI3bN. U83I&N D3UNbI. U8Ic3N IM3bQ IM&Q3", -" VbQI3 cQVI3 bQUIj3 IM3bQ8 Ij3VbQ cQVsI3 UI3b(N U+3I&N D3UNbI( U+Ic3N 3(U.b", -"IN b3U+8IN UDb.3(IN UIc3+8N bQ3IM( IM3b+Q bQIV3( V+IcQ3 Qjb3IM( b3+Q8IM IjV", -"3bQ( s+cQVI3 bGUW3 UG&W3 JbUW3 cJUW3 UG3bW. I&3UW8 bWUJ3. J8UcW3 bGQU3 IM&W", -"3 ZJVb3 ZcJV3 IM3bWj IM3bW8 JjVZb3 ZcVsJ3 bWUId3 Id3UW& bWUJd3 gJUcW3 Wdb3U", -"G. b3+GUW8 W3J.bdU gWJ8cU3 Id3bWM Id3UQ& VJdZb3 ZcJgV3 IdWjbM3 +WUjI&3 djJ3", -"ZbV g3sJZcV 4bUIm Im&4U bmU4DI c4UIm b5U4Im 4U8Im& 45bmUDI 4U8cmI IMm4b IMm", -"4& V4bQI c4VQI pb4IM pU&4I Vp4bI cpV4I 4bUIm; 4U+Im& Imb;4UD 4U+cmI Imb;4U5", -" Im&>U4 bU4I5mD; c4U>Im 4bQIM; 4b+IMm 4bQV;I c4IV+m IM;pb4 >I4pU& pbIV4; V>", -"4cpI 4bGUW 4UGW& J4bUW cJ4UW bG54UW bG84UW 4bWJ5U c4UJ8m 4bGUQ IM&4W ZJ4Vb ", -"Zc4VJ pbG4U pUG4& JpV4b cpJV4 vb4UG vU&4G Jv4bU cvJ4U 4bGvU5 >I4vU& vb4J5U ", -"J>4cvU vbM4G vIM4& VvJ4b cvVJ4 pb4vIM >I4vbM Vv4Jpb yJVc4 6kF kF6! kF6B 6Fa", -"k 1k6F 6F8k 61kFB akF68 6MF MF6! 6FTk 6FaM l6F 68lF 6TlF sFl6 k(6F 6F+k 6k(", -"FB akF6+ 61k(F 6+1kF 1k(6FB 6+1akF M(6F 6F+M 6Tk(F 6+TkF 6(lF 6+lF l6T(F ls", -"6+F 6Gk 6!Gk Gk6H Gk6a 61Gk Gk68 6G1Hk 6G8Hk 6GM 6!GM GT6M Ga6M lG6 6Gl8 6G", -"lH s6lG Gk6d +k6G 6GHdk 6Ggk 6G1dk 6+G8k 1GH6dk g61Gk GM6d +G6M 6GTdk 6GgM ", -"6Gld 6+lG lG6Td g6lG 4kF kF4! kF4B 4Fak 7kF 8k7F kF7B ak7F 4F6M 4kM!F 4FTk ", -"4TkaF 7lF 78lF lF7T sF7l 4Fk; 4F+k k;F4B ak;4F k;7F 7k>F 7Bk;F 7>akF 6FM; 4", -"+kMF 4Tk;F aM;6F 7;lF >F7l 7lT;F l>7sF 4Gk 4!Gk Gk4H Ga4k 7Gk G87k Gk7H Ga7", -"k 6G4M 4GkM! GT4k 4GTak lG7 l87G 7GlH lG7s Gk4d +G4k 4GkH; 4Ggk Gk7d 7G>k 7", -"GHdk 7Ggk GM6; 4+G6M 4GTdk g4kGT 7Gld 7>lG 7GTld lGg7 kF6N 6!kFN 6kFNB akF6", -"N 61kFN 68kFN 1kF6NB 68FakN 6FQk 6Qk!F 6QTkF 6QakF 6QlF l6Q8F l6QTF ls6QF 6", -"k(FN 6+kFN k(F6NB 6+FakN 1k(6FN +kF68N 1k6(NBF 6F1+akN 6Qk(F 6+QkF Qk(6TF a", -"kF6+Q l6Q(F l+6QF 6QTl(F s6Ql+F Gk6W 6GWk! 6GHWk 6GaWk 6G1Wk 6G8Wk 1GH6Wk G", -"8k6Wa GQ6M 6GQM! 6GZk Z6Gak 6GlW lG6W8 Z6lG lZs6G 6GWdk 6+GWk GkH6Wd g6GWk ", -"1GW6dk +Gk6W8 61GkHWd 6G8gkW 6GQdk 6+GWM Z6Gdk gZ6Gk lG6Qd l+G6W lZ6Gd glZ6", -"G 4Fkm kmF6! kmF4B akm4F km7F 78kmF 7BkmF 7akmF 4FQk 4Qk!F 4QkTF aMm6F lF7p", -" 7lp8F 7lpTF 7slpF km;4F 4+kmF 6mFk;B akF6+m 7km;F 7>mkF km;7BF >km7aF 4Qk;", -"F 4+QkF kmF6T; akF4+Q 7lp;F l>p7F l;p7TF 7spl>F Gk4W 4GkW! 4GkHm akm4G Gk7W", -" 7GW8k 7GHWk 7GaWk GQ4k 4GQk! 4GZk Z4kGa 7plG 7pGl8 lG7Z 7sGlZ 4Gvk v6+Gk v", -"6GHk gv6Gk vk7G 7>Gvk 7vGHk g7vGk 6GvM v6M+G Zv6Gk Z4kgG lG7v l>G7v lvZ7G l", -"Gy7 9k6F 6Fk& 69kFB akF6& 691kF 6k:F 91k6FB :6akF 6F9M 6FM& 6T9kF 6T&kF 69l", -"F :6lF l69TF ls:6F 69k(F k&F6+ 9k(6FB 6+9akF 91k6(F :6+kF 916k(BF akF:6+ 6M", -"9(F 6+M9F 9T(6MF k&F6+T l69(F l:6+F 6T9l(F s:6l+F 69Gk Gk6& 6G9Hk 6Gak& 6G9", -"1k 6G:k 9G16Hk :G6Hk 9G6M GM6& 6GT9M 6GTk& 6Gl9 l6:G lG69H lsG:6 6G9dk dk&6", -"G 9GH6dk g69Gk 9G16dk :G6+k 691HGkd g:6Gk 6GM9d dM&6G 9GT6dM g6M9G lG69d l:", -"G6+ 6GTld9 gl:6G 9k4F 4Fk& 49kFB 49akF 9k7F :k7F 7B9kF 7:akF 4F9M 49M&F 49T", -"kF 49aMF lF79 lF7: 7l9TF 7sl:F k;F49 k;&4F 49Fk;B akF49+ 79k;F 7:>kF k;F7B9", -" :>F7ak 49M;F M;&6F k;F49T aMF49+ 7l9;F l>7:F l;97TF 7s:l>F 9G4k Gk4& 49GHk", -" 49Gak 9G7k 7k:G 7G9Hk 7:GHk 9G4M 49GM& 49GHM 49GaM l97G 7:lG 7GTl9 7sGl: 4", -"9Gdk dk&4G 9G;4Hk g49Gk 7G9dk 7:G>k 9G;7Hk g7:Gk 49GdM M;&6G 9GT4dk g49GM l", -"G79d l>G7: 7G9lH; gl7:G 69kFN k&F6N 9kF6NB 6aFk&N 91k6FN :6kFN 916kNBF akF:", -"6N 6Q9kF 6Q&kF 9QT6MF akF6Q& l69QF :Q6lF 6Q9lTF ls6:QF 9k(6FN 6+Fk&N 9k6(NB", -"F ak6&+FN 916k(FN 6+k:FN NB1F9k6( ak:F6+N 9Q(6MF k&F6+Q QT6F9M( 6F+Q9aM 6Q9", -"l(F l+6:QF 69l(QTF l6:Qs+F 6G9Wk 6G&Wk 9GH6Wk Gak6W& 9G16Wk :G6Wk 691HGkW 6", -"Ga:Wk 6GQ9M 6GQk& Z69Gk Z6&Gk lG69W :GQl6 lZ69G Z:l6G 9GW6dk +Gk6W& 69HkGWd", -" 6G&gkW 691WGkd 6+G:Wk GH1d69Wk g6G:Wk 9GQ6dM 6GQdk& 6GMZ9d Z6Gg9M 6GQld9 :", -"G6l+W lG6Z9d Z:6glG kmF49 km&4F 49FkmB akF6m& 79kmF 7:kmF kmF7B9 :mk7aF 49Q", -"kF Mm&6F kmF49T akF49Q 7lp9F :pl7F p9l7TF :pl7sF 49mk;F kmF49+ km6;9FB ak6m", -";&F km;79F :mk7>F km7B9;F ak:m7>F k;F49Q k;F4Q& Tk9;4QF aM9m4+F l;97pF :p7l", -">F l97Tp;F >F7s:pl 49GWk km&4G 9Gm4Hk 49Gakm 7G9Wk 7:GWk 9Gm7Hk 7Gk:Hm 49GW", -"M Mm&6G Z49Gk Z4kG& 7pGl9 :pG7l 7Zl9G 7Z:lG v69Gk v6&Gk 49GvkH g4Gvk& 7v9Gk", -" :vG7k v9G7Hk g7G:vk v6M9G v6MG& Z4Gv9M Z4Gg9M lv79G lv:7G 7Z9lvG yl7:G 6UI", -" 6!Ik Dk6I Ua6I 1U6I U86I 6U1DI 6U8aI 6IM 6!IM V6I 6aVI lI6 68lI V6lI s6lI ", -"6(Ik U+6I Ik(6D 6U+aI Ik(61 6U+1I 6D1Ik( 1U+6aI 6(IM +I6M 6IV( 6+VI 6Il( 6+", -"lI Vl6I( lsI6+ 6UG 6!UG J6U 6UJa 1U6G UG68 6UJ1 6UJ8 UG6M 6UGM! J6V JaV6 6U", -"lG lG6U8 lJ6 s6lJ UG6d U+6G 6UJd J6gU Idk61 Idk68 J61Ud gJ61U Id6M IdM6+ Vd", -"J6 J6gV 6Ild l+G6U J6ld g6lJ 4Ik 4!Ik Dk4I aI4k 7UI U87I Dk7I Ua7I 6I4M 4Ik", -"M! 4IV6 V46aI lI7 l87I 7VI lI7s U;6I +I4k Ik;4D ak;4I U;7I 7I>k 7UDI; 7>UaI", -" IM6; IM;6+ 6IV; V4+6I 7Il; 7>lI V;7I 7IV> 6U4G 4UG6! J4k 4aJk 7UG UG78 7JU", -" J87U 4UG6M Ik!4GM V4J6 J4V6a 7UlG 7UGl8 7Jl sJ7V UG6; Idk4+ 4dJk J4gk UG7d", -" >U7G Jk7d >k7J Idk4M 4+kIdM V6J; gV4J6 7Ild l>G7U ld7J 7Jgl 6NIk IkN6! IkN", -"6D 6UaIN IkN61 6U8IN 6D1IkN akN68I UQ6I 6UQI! 6QVI V6QaI 6QlI lI6Q8 Vl6QI l", -"sI6Q Ik(6N 6U+IN 6D(IkN akN6+I 1U(6IN 6UN1+I 6(1UDIN 6NU+1aI 6UQI( 6U+QI V6", -"QI( V6+QI lI6Q( l+I6Q V6QlI( sIQV6+ UG6W 6UGW! 6UJW J6WUa 6UG1W 6UGW8 J61UW", -" J68UW UG6Q 6UGQ! J6Zk ZJ6Va 6WlI lWI68 Z6lJ lJZs6 Idk6W 6U+WI J6WUd gJ6UW ", -"1UW6Id 6W8Idk 6UWJ1d J6Wg1U Idk6Q 6U+GQ ZJ6Vd gV6ZJ lWI6d l+W6I lJZ6d glJZ6", -" Um6I Ikm6! Ikm4D akm4I Um7I 7U8Im 7UDIm 7UaIm QI4k IMm6! 6IVm V6maI 7plI 7", -"pU8I 7IVp 7sIVp Ikm6; Ikm4+ 6DmIk; 4+DIkm 7UIm; 7>UIm Ikm7D; >Im7Ua Ik;4Q I", -"Mm6+ V6mI; V6+Im 7pUI; l>I7p 7VpI; 7V>pI UG6m 4WIk! 4WJk J4kWa UG7W 7UGW8 J", -"k7W 7JUW8 IMm6G Ik!4GQ J4Zk ZJ4ak 7WlI 7pUG8 Jp7V Jpl7s 4Ivk v6U+G v6Jk Jv6", -"gU vU7G 7vU>G 7UJv J>k7v 6IvM v6I+M J6Vv Vv6gJ lI7v lvI7> 7Jlv 7Jyl t6I 6It", -"& 6DtI tIc6 6It1 t6:I t61DI t:c6I 6ItM IM6& tIV6 cIV6 t6lI l6:I ltV6I u6I 6", -"It( 6+tI t6DI( tc6+I t61I( t:6+I 6D1tI( :c6t+I t6IM( t+6IM Vt6I( t+V6I lt6I", -"( lt+6I Vt6lI( 6+uI tG6 6Gt& tJ6 c6tJ 6Gt1 t6:G t6J1 J6t: 6GtM tG6M& VtJ6 V", -"Jc6 l6tG t:Gl6 J6lt uJ6 6Gtd 6+tG J6td g6tJ tG61d t:G6+ tJ61d gtJ:6 tG6dM t", -"+G6M tdVJ6 gV6tJ ltG6d t+Gl6 lJt6d gJu6 t4I 4It& 4DtI tIc4 7tI 7It: tD7I 7I", -"tc 4ItM t4IM& tIV4 tc4VI lI7t 7:lI Vt7I u7I 4It; 4+tI t4DI; tc4+I 7It; 7It>", -" 7tDI; t>7cI t4IM; t4+IM t4VI; t4V+I 7tlI; l>I7t 7VtI; 7>uI t4G 4Gt& tJ4 cJ", -"t4 7tG 7:tG 7Jt tJ7c 4GtM t4GM& VJt4 tJ4Vc lG7t 7tGl: tJ7V uJ7 4Gtd 4+tG J4", -"td g4tJ 7Gtd 7>tG td7J 7Jgt t4GdM t4+GM tJ4Vd gt4VJ 7tGld t>G7l lJ;7t g7uJ ", -"6ItN t6I&N t6DIN tc6IN t61IN t:6IN 6D1tIN :I6tcN 6QtI tQ6I& tQV6I tcQ6I tQ6", -"lI t:Q6I Vl6tQI 6QuI t6I(N t+6IN 6DIt(N c6It+N 6I1t(N :I6t+N 61t(DIN t6:Ic+", -"N tQ6I( t+Q6I V6ItQ( t+Ic6Q lI6tQ( t+6:QI l6tQVI( u6+QI 6GtW tG6W& J6tW tcW", -"J6 tG61W t:G6W tJ61W :Jt6W 6GtQ tGQ6& Z6tJ Zc6tJ tGQl6 t:G6Q lJZt6 ZJu6 tG6", -"Wd t+G6W tJ6Wd gtJ6W 6WItd1 t+6:WI J61tWd :J6gtW tGQ6d t+G6Q tZJ6d gtZJ6 tW", -"6lId t+6:GQ tZ6lJd ug6ZJ 4Itm t4Im& t4DIm tc4Im 7Itm t:m7I 7tDIm 7ctIm 4QtI", -" t4QI& t4VQI tc4QI 7Itp :pI7t tp7VI 7puI t4Im; t4+Im 6Dmt;I t+Ic6m 7tIm; t>", -"7Im 7DItm; 7cIt>m t4QI; t4+QI tQIV6; t4IcQ; tp7I; tp>7I 7VItp; u7Ip> 4GtW t", -"4GW& J4tW tJ4cW 7GtW 7tG:W tW7J 7Jt:W 4GtQ t4GQ& ZJt4 tZ4cJ 7ptG tpG7: 7JtZ", -" 7ZuJ v6tG tv4+G t4Jv cv6tJ tG7v :vI7t 7Jtv g7tJv tv4GQ t4+GQ Vv6tJ cvVJ6 l", -"vt7G :vI7l lvJ7t yJu7 e= 5e=B =a>e =eK +e=K =Te +T=e =je =j>e 5T=e s=e 4G", -"< 4!G< 4He Ga4e G5< G84e H54e H84e 4KG< 4G= f5=H f>g= f=K f+=K =Tf gf=T =jf =jf> f5=T sf= m =B5em >e=am", -" =Qe +Q=e Qe=T Qa=e p=e >ep= pe=T sep= 4We 4!We Hf= =H", -"fv5 g=fv> =Qf =+fQ Z=f Zfg= fp= p=f> fpZ= yf= ,e =B5,e >e-=a ,e=K -e=K ,T=e =e-T ,j=e =", -"e-j =T5,e -=se ,4G 4&,G 4G,H 4G,a 4G,5 4G,8 ,4GH5 ,4GH8 ,K4G ,4G&K 4G,T ,4G", -"T& 4G,j <&j4G ,4GHj ,4sG f=, f-= fH=, f-g= =,f5 ->f= =Hf,5 g=f-> f,=K =Kf- ", -"=,fT f-=T =,fj f-=j =Hjf, f-s= e-=m emB=5, =a->em ,Q=e =e-Q =QT,e =Q-Te =ep, pe-= p=T,e -ps=e 4G,", -"W We4& ,4GHm -v= fv5=H, f>-g=v =,fQ f-=Q f=Z,", -" f-Z= p,f= f-p= fpZ=, f-y= I< I 5D=I =D>e =IK +I=K", -" =TI +T=I =Ij >I=j 5T=I s=I G<4I I J=5 J>= f", -"I=K =If+K J=T =TgJ fj=I f>=Ij J=j s=J Im=I =D5Im >eD=m =QI +Q=I QD=I Qa=I p", -"=I p>=I pD=I sp=I WI4e I=I v=J5 v>J= fQ=I =Qf+", -"I Z=J gZJ= =Ifp fp>=I Jp= yJ= h< h<& hD< hc< h<. h8< D= h5=D c=h> h=K =Kh- h=", -"T hc=T h=j =jh> h5=T hs= h4G 4Gh& hJ4 cJh4 4Gh5 4Gh8 J4h5 J4h8 4GhK h4G&K J", -"4hT cJ4hT 4Ghj h48Gj J4hj h4sJ h=f f-h= J=h i= f=h5 f>h= h5J= i>= =Khf h=f-", -"K hJ=T i=T hf=j h=jf> hJ=j is= h=hm h=5Dm c=h>m h=Q h-=Q hQ=D hc=Q hp= h=-p =", -"Dhp s=hp h4W 4Wh& J4hW c4hW 4Wh5 4Wh8 J5h= J=hv5 v>i= =Qhv h=Q-v hZ= iZ= h", -"=fp fp-h= Z=hp yi= 6e 6e! 6eB 6ae 6e1 68e 6B1e 1a6e 6eK eK6! 6Te Te6a 6ej 8", -"e6j 1T6e s6e 6e* 6+e *B6e +e6a 1e6* 1+6e 6e1*B 6+e1a e*6K 6K+e Te6* +T6e ej", -"6* +e6j 6Te1* 6+se 6G< 6!G< 6He Ga6e 1G< G86e 1H6e Ga1< 6KG< 6Ge7 =B7e 7a>e 6e=K =6+eK 6T=e =T6+e ", -"7e=j >j7e 7e=T >e7s 6G4e 4G6 7fH g7f =Kf6 f=6+", -"K f6=T g=f6T 7fj fj7> 7fT sf7 6eN eN6! eN6B 6Nae 6N1e 6N8e 6e1NB 68eaN 6Qe ", -"Q!6e Qe6T Qa6e 1Q6e Q86e 6Qe1T 6Qse e*6N 6N+e 6e*NB 6+eaN 6e1*N 6+e1N 1eN6*", -"B aeN68* Qe6* +Q6e 6QeT* 6+QTe 6Qe1* 6+Q1e 1Qe6T* s6e+Q 6We 6!We He6W Wa6e ", -"1W6e W86e 6He1W 6H8We GQ6e 6GQm7e 7=emB 7ae>m 6Q=e =Q6+e =Q6Te =Qa6e 7ep= 7p>e 7p", -"e=T 7sep= 6W4e 4We6! He6m aem6G 7We W87e He7W Wa7e 4GQ6e 7v fv7H gf7v f6=Q =Qf6+ fvZ6 Z", -"f6g= 7fp 7pf> 7Zf y7f ?e ?e& ?Be ?ae ?1e ?:e 1e?B :e?a ?eK e&?K ?Te Te?a ?j", -"e :e?j 1T?e s?e ?e* ?-e *B?e -a?e 1e?* :e?- ?B1e* ?:-ae e*?K -e?K Te?* ?e-T", -" ej?* ?e-j ?T1e* ?-se ?G ?G& ?GH ?Ga ?G1 ?:G 1G?H :G?H ?GK G&?K ?GT GT?a ?G", -"j :G?j 1G?T s?G ?f ?f- ?fH g?f ?f1 :f? f1?H :fg? ?fK ?Kf- ?fT ?Tgf ?fj ?j:f", -" f1?T s?f ?4e 4e?& 4e?B 4a?e 7?e 7:e ?B7e 7e?a 4e?K ?4e&K 4T?e ?T4ae 7e?j 7", -"j:e 7e?T 7?se ?=e =e?- ?B=e =e?a 7e?= Ae ?=7eB Aae ?e=K ?-=eK =e?T ?-T=e =e", -"?j Aje ?T7=e Ase ?G4 4G?& 4G?H 4G?a ?G7 7:?G 7G?H 7G?a 4G?K ?G4&K 4G?T ?GT4", -"a 7G?j ?:G7j 7G?T ?G7s ?f= f-?= =H?f ?fg= 7f? Af ?H7f Agf =K?f ?f-=K =T?f ?", -"fTg= =j?f Afj ?T7f Asf ?eN e&?N eN?B ae?N 1e?N ?N:e ?B1eN ?:aeN ?Qe Qe?& Qe", -"?T Qa?e 1Q?e :e?Q ?Q1Te ?Qse e*?N -e?N ?Be*N ?-aeN ?1e*N ?:-eN 1e*?BN :-e?a", -"N Qe?* ?e-Q ?QTe* ?-QTe ?Q1e* ?:Q-e 1Qe?T* s?-Qe ?GW G&?W He?W Ga?W 1G?W :G", -"?W ?G1HW ?:GWa ?GQ GQ?& ?ZG Ze?a 1G?Q :G?Q Z1?G sG?Z ?fW f-?W fH?W ?Wgf f1?", -"W ?W:f ?f1HW g?:fW ?fQ f-?Q ?Zf ?fZ- f1?Q ?Q:f ?jZf ?Zsf ?me em?& em?B ae?m", -" 7e?m :e?m ?m7eB ?:mae 4Q?e ?Q4e& Te?m ?Qa4e ?pe 7e:p pe?T se?p =e?m ?e-m ?", -"=emB ?-mae ?=7em Aem 7=e?mB aeAm =e?Q ?-Q=e ?Tm=e ?-Tem pe?= Ape ?p=Te spAe", -" ?Gm Gm?& Gm?H Ga?m 7G?W :G?m ?G7Hm ?:GHm 4G?Q ?GQ4& Z4?G ?Z4Ga ?pG ?G:p ?G", -"7Z sG?p ?vf -v?f fv?H gf?v 7f?v Afv ?v7fH gfAv =Q?f ?fQ-v ?fZ= g?Zfv ?pf Ap", -"f 7f?Z yAf 6I< 6!I< 6De De6a 1I< 8I6e 1D6e D86e 6KI< I=I 7D=I 7D>e 6I=K =I6+K 6T=I =TI6+ 7I=j 7>I=j 7T=I =I7s 4G6I< 4G6I 7Jf J>7f =If6K f6+=IK J6=T J=g6T fj7I 7", -"f>Ij =T7J 7Jsf 6NI< II=m 7De=m 7>Dem 6", -"Q=I =QI6+ =QD6I =Qa6I 7p=I p=I7> p=D7I s=I7p I 7vJ= J>=7v =Qf6I =Q+v6I Z6J= Z=Jg6 7Ifp 7fp>I Z=7", -"J 7Jyf h? h?& h?D ?ch h?1 h:? ?Dh1 ?ch: h?K ?Kh& h?T hT?c h?j ?:hj ?Dhj hs?", -" h?* h?- h*?D h-?c ?1h* ?:h- ?D1h* h:?c- ?Kh* ?Kh- h*?T ?-hT h*?j ?-hj ?Djh", -"* h?s- h?G h&?G ?J ?Jc ?Gh1 ?Gh: ?J1 ?J: ?KhG ?G&hK ?JT cJ?T ?Ghj ?:Ghj ?Jj", -" s?J ?fh h-?f ?Jf i? h1?f ?fh: J1?f i?: ?Khf ?fh-K hT?f i?T hj?f ?fjh: Jf?j", -" i?s h?4 ?4h& ?Dh4 h4?c 7h 7h: 7hD 7hc ?Kh4 h?4&K ?Th4 ?ch4T 7hj 7:hj 7hT h", -"s7 h=? ?-h= h?=D ?ch= 7h= Ah =D7h Ahc =Kh? h=?-K h?=T c=?hT =j7h Ahj =T7h A", -"hs ?Gh4 ?G4h& ?J4 c4?J 7hG 7Gh: ?J7 7c?J ?G4hK h4&?GK J4?T ?Jc4T 7Ghj 7h:Gj", -" hT7J 7Jhs ?fh= h=?f- ?J= i?= 7hf Ahf 7f?J Ai h=?fK ?f-h=K =T?J =Ti? hj7f h", -"fAj =j?J Ais h?N ?&hN hN?D hN?c ?1hN hN?: ?D1hN h:?cN h?Q h&?Q ?QhT hQ?c ?Q", -"h1 ?:hQ ?QDh1 hQs? ?*hN hN?- ?D*hN ?ch-N h?1*N h:?-N h1*?DN ?c-h:N h*?Q ?-h", -"Q ?QDh* ?cQh- h?Q1* h:Q?- ?Q*h1T hs?-Q h?W h&?W ?JW hW?c ?Wh1 ?:hW J1?W ?W:", -"J ?GhQ ?GQh& hZ? ?chZ ?Whj h:W?Q h1?Z s?hZ hW?f ?-hW Jf?W i?W ?fh1W h:W?f ?", -"Jf1W ?:iW hQ?f ?fQh- ?fhZ i?Z ?fQh1 :fQh? hZ?f1 s?iZ h?m h&?m ?Dhm hm?c 7hm", -" ?:hm 7Dhm hm7c ?Qh4 h?Q4& ?Thm ?cQh4 hp? h:?p hT?p s?hp ?=hm ?-hm ?Dmh= c=", -"?hm 7=hm Ahm 7h=Dm hcAm h?=Q h=Q?- h=Q?D c=Qh? h=?p Aph hp?=D hpAs ?Ghm ?Gm", -"h& ?Jm cJ?m 7hW 7:hW hW7J hW7c ?GQh4 ?G&h4Q h4?Z hZ?c4 hW?p hp?:G hZ7 7Zhs ", -"hv? h?-v ?Jv i?v hv7 Ahv 7Jhv Aiv hQ?v hv?-Q ?Zhv ?Ziv ?phv hpAf 7Zhv Aiy <", -"eL L =B5", -"eL >e=aL =Me +M=e Te=M aM=e 5M=e =M>e =T5Me se=M 4LG< 4GLf= =Hf5L g=f>L =Mf =+fM fT=M gf=M f5=M =Mf> =HMf5 =Msf eLe=mL em", -"L=B5 =am>eL Qe=M =Q+Me =QTMe =QaMe pe=M p=>Me p=TMe s=pMe 4LWe 4We!L 4HeWL ", -"4WaeL 4We5L 4W8eL v=L fv5=HL f>vg=L fv=M =Qf+M =MZf g=MZf =M", -"fp fp>=M fpZ=M =Myf e-=L ,5e=BL =a->eL ,M=e =e-M =TM,e =T-Me =M5,e >M-=e ,5T=Me s=-Me ,L", -"4G ,4G&L ,4GHL ,4GaL ,4G5L ,4G8L ,4LH5e <&LG5a 4G,M -=L f5,=HL f>-g=L =,fM f-", -"=M =HMf, g=Mf- =Mf,5 f>M-= =H,f5M sf=-M ,eL 5m=L,eB >m=a-eL =QM,e =Q-Me Mem=T, =Te-Mm", -" p=M,e -p=Me peT=M, s=M-pe ,4GWL L =,f5vHL >Lg=-vf =Qf,M -vMf= Z=f,M Z-=fM fp=,M fp-=M ", -"Z=Mfp, yf-=M Ue =U5De >eU=D =IM +I=M V=I V+=I Ue=j =I>M V5=I >eV= UG4e 4UG J5=U =UJ> fU=M =Uf+M J=V gVJ= fU=j f>U=M =jVf Vfs", -"= UNI< IeU=m U5e=D", -"m >Im=Ua UQ=I =UQ+I Ve=Q V=+QI pU=I p=U>e =IVp V>ep= UW4e 4UWe! UUv= J=vU5 J>=vU fU=Q =Uf+Q VfZ= J=VgZ =Ufp fpU>= V", -"=Jp J=yV hU< U h=U5D c=h>U h=M h-=M V=h h=V- h5=M >Mh= =jVh V=hs 4UhG h4UG& ", -"hUJ4 cJ4hU h4UG5 h48UG J5Uh= J=hU5 =Ui> hf=M h=Mf- h=Vf iV= h=Mf5 h", -">Mf= J=Vh5 s=iV U=Um h5U=Dm h>Uc=m hQ=U h=Q-U =QVh c=VhQ =Uhp -pUh= V=hp cp=V", -"h 4UhW h4WU& J=U hvUJ=5 iv>=U =Mhv h", -"vM-= V=hZ Z=iV fpUh= fp-=U Jp=Vh yVi= 6ek 6!ke 6Bke ak6e e 7=ekB 7ae>k 6M=e =k+Me Tk=e =Tk+e l=e >el= le=T", -" les= G<4k 4Gkk7f fk7H gk7f f6=M =kf+M fT=", -"k g=kfT lf7 l>7f =Hlf g7lf 6Nke k=em =km7eB 7am>ke Qk=e =Qk+e =QkTe =Qake lep= l>ep= l=pTe l=s", -"pe Wk4e k7v 7fvHk g7fvk fQ=k =Qf+", -"k =kZf Z=kgf 7flv lfp7> 7Zlf lfy7 ?ke ke?& ke?B ak?e 1e?k ?k:e ?B1ke ?:ake ", -"?Me Me?& Tk?e aM?e l?e ?:le ?Tle les? ke?* ?e-k ?Bke* ?-ake ?1ke* ?:-ke ke*", -"?B1 :-k?ae Me?* ?e-M ?Tke* ?-Tke ?el* ?-le l?Te* l-?se ?Gk Gk?& Gk?H Ga?k 1", -"G?k ?k:G ?G1Hk ?:GHk ?GM GM?& GT?M Ga?M l?G ?:lG ?GlH lGs? ?fk fk?- fk?H gk", -"?f ?1fk fk?: ?f1Hk g?:fk ?fM f-?M fT?M gM?f lf? ?fl- lH?f lfg? 4k?e ke4& ?B", -"4ke ?a4ke ?k7e 7k:e 7?keB ?a7ke 4M?e ?M4e& ?T4ke ?aM4e 7?le 7:le ?T7le 7sel", -"? ?k=e =e-k ?=ekB =a?ke ?=7ke Ake 7ek?=B akAe =e?M ?-M=e =T?ke ?aM=e ?=le A", -"le l=?Te lsAe 4G?k ?G4k& ?G4Hk ?Ga4k ?k7G ?:G7k ?G7Hk ?G7ak 4G?M ?GM4& ?GT4", -"k ?Ga4M 7l?G l?G7: l?G7H s?G7l =k?f f-=k ?f=Hk g=k?f fk7? Afk 7f?Hk gfAk =M", -"?f ?fM-= ?fT=k g?Mf= ?fl= Alf lf?=H glAf ke?N ke&?N ?BkeN ?akeN ?1keN ?:ekN", -" keN?B1 :ek?aN Qk?e ?Qke& ?QTke ?Qake ?Qle ?:Qle l?QTe s?lQe ?ke*N ?-keN ke", -"*?BN -ke?aN ke*?1N :ek?-N ke?B1*N ak:e?-N ?Qke* ?-Qke Qke?T* ?Qe-Tk l?Qe* l", -"-?Qe leQ?T* s?Ql-e Gk?W ?GWk& ?GHWk ?GaWk ?G1Wk ?:GWk 1He?Wk ?Hk:We GQ?M ?G", -"Qk& Zk?G ?ZGak ?GlW l?G:W lG?Z s?ZlG fk?W ?-Wfk ?fHWk g?fWk ?f1Wk :f?Wk f1H", -"?Wk :fWg?k fQ?M ?fQ-k ?MZf g?Zfk lW?f lf?:W ?Zlf gl?Zf ke?m ?mke& ?mkeB ?am", -"ke ?m7ke ?:mke 7ek?mB ?ak:em Me?m ?Mme& ?Tmke ?aMem le?p :pel? ?plTe s?ple ", -"?=ekm ?-mke =ke?mB ?ae-km 7=e?mk keAm =B?m7ek Akmae ?Mm=e ?-Mem ?Qe=Tk ?Qe=", -"ak l=?pe leAp ?pTl=e Apels Gk?m ?Gmk& ?GmHk ?Gakm ?G7Wk ?:Gkm ?Hk7We ?Gk7Wa", -" GM?m ?GMm& ?Z4Gk ?GaMm lG?p ?pGl: ?Zl7G s?plG fk?v -vk?f ?vfHk g?vfk ?v7fk", -" fvAk 7fH?vk Avkgf fv?M ?vMf- ?Zf=k g?vfM ?plf lfAp lv?Zf ylAf 6Ue 6!Ue Ue6", -"D Ua6e 1U6e U86e 6Ue1D 6U8De Ue6M Ik 7Ue=D 7>UD", -"e 6I=M =Ik+M V6=I V=6+I l=I =Il> =I7V >e7V 4UG6e I =U7J >kJ= =Uf6M =U+f6M =kVf J=Vg6 =Ulf lf7>U l=J 7Vsf 6", -"NUe 6Ue!N 6UeDN 6UaeN 6Ue1N 6U8eN IkN1D< akN1I< UQ6e 6UQe! 6QVe V6eQa QIl< ", -"lIUem 7Dm=Ik >Dm7U", -"e QI=k =QI+k V=6QI =QaIk lIp= l=Ip> V=plI V>e7p I J=k7v J>=vk =Uf6Q =U+f6Q ZJ=k J=kgZ =Ilv fpU7", -"> Jpl= l=yJ h?t h&?t ?Dht ht?c ?th1 ?th: ?t1hD ?t:hc h?M h&?M V?h Vh?c lh? ", -"l?h: lhV? u?h t*h? h?t- ?tDh* ?cht- ?t1h* ?t:h- h?1t*D ?cth:- h*?M ?-hM V*h", -"? h?V- h?l* h?l- V?lh* h?u- ?tG ?&tG ?Jt tJ?c ?1tG t:?G J1?t ?t:J ?GhM ?tGM", -"& ?JV cJV? h?lG lh?:G ?Jl u?J tf? t-?f tf?J i?t f1?t ?t:f ?Jtf1 ?ti: hM?f ?", -"fMt- V?f i?V ?flh lf?h: ?Jlf ui? ht4 h&t4 hDt4 tch4 7ht 7th: 7Dht ht7c ?Mh4", -" h?M4& h4V? V?hc4 7hl l:7h 7Vh u7h t=h t-h= ht=D htc= 7ht= Aht t=7hD htAc h", -"?=M h=Mt- h=V? c=Vh? l=h Alh V=7h Auh t4?G ?tG4& h4tJ tJ4?c ?G7t 7tGh: tJ7h", -" ?J7t: ?tG4M ?G&h4M J4V? ?JVc4 lG7h 7hl:G 7V?J ?Ju7 tf= f-t= t=J it= tf7 At", -"f 7Jtf Ait =Mtf tf=-M V?J= t=iV tfl= lfAh ?Jl= Aiu hN?t ?t&hN ?tDhN ?chtN ?", -"t1hN ?t:hN ht1?DN ?cth:N ?thQ ?tQh& hQV? V?hcQ hQl? lh?:Q V?lhQ h?uQ ?t*hN ", -"t-?hN h?Dt*N t-h?cN h?1t*N t-?h:N hDt*?1N hN?ct-: ?tQh* t-Qh? V?hQ* V?-hQ l", -"h?Q* l-h?Q lhQV?* uh-?Q ?thW ?tGW& ?WtJ ?cWtJ ?tG1W h:W?t ?Jt1W ?J:tW ?WhM ", -"?tGQ& tZ?J hZ?tc h?lW lhW?: lJ?Z hZu? ?Wtf t-W?f ?JtfW ?tiW tf?1W tf:?W tf1", -"?JW i?t:W ?Qtf tfQ?- tf?Z ?ZiV lhW?f lhW?- V?flZ i?uZ ?thm ?tmh& ?tmhD ?cmh", -"t hm7t h:m7t 7htDm 7hctm ?Mhm ?Mmh& hmV? V?mhc 7htp hpl?: 7Vhp hpu? hmt= t-", -"mh= t=hDm t=chm t=7hm htAm 7hDt=m Atmhc ht=Q t=Qh- V?mh= c=Qht hpl= hpAl l=", -"hVp upAh t4hW ?tGm& ?mtJ ?Jmtc hW7t 7hWt: ?J7tW ?J:tm ?tG4Q ?G&t4Q h4tZ V?m", -"cJ lW7h lhW7: tp?J hZu7 tf?v hv?t- tv?J ?vit 7htv hvAt hv7tJ itAv =Qtf hv?-", -"M t=hZ ?viV hvl= lvAh hZl= yAui O !O OB aO O. 8O .BO 8aO OK !KO TO TaO jO j", -"O8 jOT sO (O +O (BO +aO (O. +8O (O.B 8a+O (OK +OK T(O +TO jO( +jO T(jO s+O ", -"EO !EO HO HaO EO. 8EO HO. H8O EKO !OEK HTO TaHO jOE 8EjO HjO sHO dO +dO HdO", -" gO dO. 8dO dOH. g8O dKO dK+O TdO gTO djO jO8d jOTd gsO O2 !O2 2BO aO2 5O 5", -"8O 5BO 5aO 2KO !O2K TO2 T2aO jO5 58jO 5TO s5O ;O +;O ;OB a;O 5;O >O ;O5B >O", -"a ;OK ;O+K T;O +OT; ;jO >jO jOT; s>O EO2 EO!2 HO2 aOH2 5EO 8E5O H5O HO5a EO", -"2K !EO2K TOH2 HTaO2 5EjO jO58E jOH5 H5sO d;O d;+O H;O g;O 5dO >Od HO5d g>O ", -";OdK +d;OK HOT; T;gO jO5d dj>O jOH; >Ogs P P! PB aP P. 8P P.B 8Pa QP Q!P TP", -" QaP Pj Q8P TPj sP P( +P P(B +Pa P(. +P8 .BP( +8aP QP( +QP TP( +TP Pj( +Pj ", -"T(Pj sP+ WP W!P HP HPa WP. W8P HP. H8P WQP WPQ! ZP ZaP WjP 8PWj ZPj sZP dP ", -"+WP HPd gP dP. 8dP H.dP gP8 QdP Qd+P ZdP gZP dPj Wj+P dPZj gsP mP mP! mPB a", -"mP 5P 5P8 5PB 5aP QmP mPQ! TmP amTP pP p8P pTP spP ;P +mP ;PB a;P 5P; >P 5B", -";P >Pa Q;P Q;+P T;P Tm+P p;P >Pp T;pP >Ps WmP mPW! HmP amHP 5WP W85P H5P 5a", -"HP QmWP Q!WmP ZmP amZP pWP W8pP ZpP ZpsP vP v+P vHP gvP v5P >Pv H5vP >Pg vQ", -"P +QvP ZvP ZvgP pvP pv>P ZPpv yP #O &O #BO a&O #O. 8&O #O.B a&8O #OK &OK T#", -"O T&O jO# &jO T#jO s&O #(O +&O #(OB a&+O (O#. 8&+O (BO#. +8a&O (O#K &O+K #(", -"TO +OT& #(jO +&jO jOT#( +&sO #EO &EO H#O H&O EO#. &E8O #OH. 8&HO #OEK EK&O ", -"T#HO HOT& #EjO &EjO H#jO H&sO d#O d&O d#HO g&O #Od. 8Od& Hd#O. 8&gO #OdK &O", -"dK d#TO T&gO d#jO jOd& dj#HO gOs& #O2 &O2 #O2B &2aO 5#O 5&O #B5O a&5O #O2K ", -"2K&O #OT2 &OT2 5#jO jO5& T#5O 5&sO ;#O ;&O #B;O aO;& ;#5O >&O 5;#OB a&>O #O", -";K &O;K ;#TO TO;& ;#jO &j>O ;j#TO s&>O EO#2 EO&2 #OH2 &OH2 #E5O &E5O 5#HO H", -"O5& #O2EK &EO2K HT#O2 H&TO2 jO5#E &jE5O H5T#O sH5&O ;#dO dO;& ;#HO ;&gO d#5", -"O d&>O H5d#O g&>O dK;#O d&;OK H;T#O gT;&O dj#5O >&djO H;j#O gs>&O P# P& P#B", -" aP& P#. 8P& .BP# 8aP& QP# Q&P TP# TP& Pj# P&j T#Pj sP& P#( +P& #BP( +aP& #", -"(P. +8P& P#(.B aP&+8 P#Q( Q&+P P#T( T&+P j#P( P&+j Pj#T( +Ps& WP# W&P HP# H", -"P& P#W. 8PW& P#H. 8PH& QPW# WQP& ZP# Z&P W#Pj P&Wj PjZ# Z&sP dP# dP& H#dP g", -"P& P#d. d&8P dP#H. 8Pg& Q#dP dPQ& dPZ# Z&gP d#Pj P&dj dPjZ# g&sP mP# m&P P#", -"mB m&aP 5P# 5P& P#5B aP5& mPQ# QmP& mPT# m&TP pP# p&P TPp# p&sP ;P# ;P& PB;", -"# ;&aP 5#;P >P& ;P#5B aP>& Q#;P ;PQ& T#;P ;PT& ;Pp# p&>P pT;P# >&sP mPW# Wm", -"P& mPH# m&HP WP5# W&5P H#5P 5PH& WQmP# m&PWQ mPZ# m&ZP WPp# W&pP pPZ# ZPp& ", -"vP# v&P HPv# v&gP 5Pv# v&>P vH5P# >&gP QPv# Q&vP vPZ# ZPv& vPp# pPv& ZpvP# ", -"y&P CO !CO DO DaO CO. 8CO DO. D8O CKO !OCK DTO TaDO jOC 8CjO DjO sDO C(O +C", -"O D(O +DO (OC. 8C+O (OD. +OD8 (OCK CK+O T(DO DT+O C(jO +CjO D(jO +DsO CEO C", -"E!O HDO DaHO EOC. CE8O DOH. HOD8 COEK !EOCK DTHO HDTaO CEjO jO8CE HDjO HDsO", -" dCO dC+O DdO gDO COd. dC8O dOD. D8gO CKdO +dCOK DOTd DTgO dCjO djC+O jODd ", -"gOsD CO2 CO!2 DO2 D2aO 5CO 8C5O 5DO 5OD8 CO2K !C2OK T2DO DTaO2 5CjO jO58C j", -"O5D 5DsO ;CO ;C+O D;O +OD; ;C5O >CO 5OD; >DO CK;O +;COK DOT; a;ODT ;CjO jO>", -"C jOD; sD>O EOC2 !EOC2 DOH2 HDaO2 CE5O 58CEO HO5D H5D8O EKCO2 EK2!CO HDTO2 ", -"DTaHO2 jO5CE 58CjOE H5DjO sH5DO ;CdO +d;CO HOD; D;gO dC5O dC>O 5ODd gD>O dK", -";CO dK;+CO H;DTO gDT;O djC5O >jdCO H;jDO >DOgs PC PC! DP DPa PC. 8PC DP. D8", -"P QPC PCQ! QDP DPQa PjC QC8P DPj sPD PC( +PC DP( +DP C(P. +C8P P(D. D8+P PC", -"Q( QP+C Q(DP QD+P jCP( +CPj D(Pj +DsP WPC PCW! HPD DPWa PCW. WC8P H.DP D8HP", -" QPWC Q!WPC ZDP DPZa WCPj PjCW8 DPZj ZDsP dPC +CdP DdP gPD PCd. 8CdP D.dP D", -"8gP QCdP dPC+Q DdZP ZDgP dCPj dPj+C dPDj gDsP mPC P!mC DmP amDP 5PC 5C8P 5D", -"P D85P mPQC Q!mPC TmDP amPQD pPC 8PpC pDP pDsP ;PC +C;P D;P Dm+P 5C;P >PC D", -";5P >PD QC;P ;PC+Q DPQ; a;PQD ;PpC pP>C D;pP pD>P mPWC W!mPC DmHP amPWD WP5", -"C 5W8PC 5DHP H5PD8 WQmPC WmPQ!C DmZP ZDamP WPpC pW8PC ZPpD sPDZp vPC +PvC v", -"DP vDgP 5PvC vP>C 5DvP vD>P QPvC v+QPC ZPvD ZvDgP vPpC >PpvC pPvD yDP bO b&", -"O bDO cO bO. b8O DOb. c8O bKO &ObK bTO cTO bjO jOb8 jObT scO b(O b+O D(bO c", -"+O (Ob. +8bO bD(O. +8cO (ObK +ObK T(bO +TcO b(jO jOb+ bTj(O c+sO bEO &EbO b", -"HO cHO EOb. 8EbO HOb. H8cO EKbO bK&EO HTbO HTcO bEjO &jEbO jObH cHsO bdO bO", -"d& bODd gcO dOb. bO8d bHdO. c8gO dKbO d&ObK bOTd cTgO jObd d&jbO bHjdO gOsc", -" bO2 &Ob2 DOb2 c2O b5O bO5& bO5D c5O 2KbO bK&O2 TOb2 TOc2 jOb5 &jOb5 bO5T s", -"Oc5 b;O bO;& bOD; c;O 5;bO >bO b5D;O c>O ;ObK ;&ObK bOT; T;cO jOb; bj>O b5T", -";O >Osc EOb2 b&EO2 HOb2 HOc2 5EbO b58EO bOH5 H5cO bKEO2 &EObK2 bHTO2 c2HTO ", -"b5jEO b5E&jO bH5jO c5HsO d;bO d&;bO bOH; gOc; bO5d bd>O bH5dO >Ogc bd;OK bd", -"O;&K bH;TO c;TgO b5djO >bdjO bH;jO c>gsO bP bP& bPD cP bP. b8P b.DP cP8 bQP", -" Q&bP bTP cQP bPj Q8bP DPbj scP bP( b+P b(DP cP+ P(b. +Pb8 bPD(. +Pc8 QPb( ", -"+QbP b(TP +QcP b(Pj +Pbj bTPj( s+cP bWP W&bP bHP cWP WPb. W8bP b.HP H8cP WQ", -"bP bWQP& ZbP ZcP WjbP P&jbW bPZj sPZc bdP +WbP HPbd gcP b.dP 8dbP bHPd. g8c", -"P QdbP dP&bQ bdZP gPZc dPbj dP&bj ZbdPj scgP bmP m&bP DmbP cmP b5P 5Pb8 5Db", -"P c5P QmbP m&PbQ TmbP TmcP pbP b8pP bTpP cpP b;P +mbP D;bP c;P 5Pb; >Pb b5P", -"D; c>P Q;bP ;P&bQ T;bP Q;cP b;pP pb>P pbD;P >Pcp WmbP m&PbW HmbP HmcP 5WbP ", -"b5W8P H5bP H5cP bWQmP bWQm&P bmZP ZmcP bWpP pbW8P ZPpb cPZp vbP b+vP bHvP c", -"vP b5vP vb>P vbH5P >Pcv bQvP vb+QP ZPvb cPZv pPvb >Pbpv ZpbvP ycP 0O !0O 0B", -"O a0O 1O 18O 1OB 1aO 0OK 0O!K T0O a0TO jO1 18jO 1TO s1O 0(O +0O 0(OB a0+O 1", -"(O 1+O (B1O +a1O (O0K 0O+K 0(TO T0+O 1(jO jO1+ T(1O 1+sO E0O E0!O H0O a0HO ", -"1EO 8E1O 1HO 1OH8 0OEK !EO0K T0HO HTa0O 1EjO jO18E jO1H 1HsO d0O d0+O d0HO ", -"g0O 1dO 1O8d Hd1O g1O 0OdK +d0OK d0TO T0gO jO1d djO1+ 1OTd gOs1 0O2 0O!2 0O", -"2B 0Oa2 15O 581O 5B1O 1O5a 0O2K 2K0!O 0OT2 Ta0O2 15jO jO158 1O5T 15sO ;0O ;", -"0+O 0B;O ;0aO 1;O >O1 ;O1B 1a>O 0O;K +;0OK ;0TO a;0TO jO1; jO>1 1OT; s1>O 0", -"OE2 !EO02 0OH2 Ha0O2 5E1O 158EO 1OH5 1H58O EK0O2 2K0!EO HT0O2 Ta0HO2 jO15E ", -"158jOE 1H5jO s1H5O ;0dO +d;0O ;0HO ;0gO 1O5d 1d>O 1OH; >Og1 dK;0O dK;+0O H;", -"T0O gT;0O djO1; >j1dO 1H;jO gs>1O P0 P0! P0B aP0 1P 1P8 1PB 1aP QP0 P0Q! TP", -"0 Q0aP 1QP Q81P 1TP sP1 P0( +P0 0BP( +0aP 1P( 1+P P(1B +P1a P0Q( QP+0 P0T( ", -"+0TP 1(Pj +Q1P 1(TP 1+sP WP0 P0W! HP0 H0aP 1WP W81P 1HP H81P QPW0 Q!WP0 ZP0", -" aPZ0 Wj1P 1WQ8P Z1P Z1sP dP0 +0dP H0dP gP0 1dP +W1P HP1d g1P Q0dP dP0+Q dP", -"Z0 ZPg0 Qd1P dPj1+ 1dZP sPg1 mP0 P!m0 P0mB mPa0 1mP 8m1P 1B5P 5a1P mPQ0 Q!m", -"P0 mPT0 amPQ0 p1P 1Pp8 1TpP p1sP ;P0 +0;P PB;0 a0;P 1;P >P1 1B;P 1a>P Q0;P ", -";P0+Q T0;P a;PQ0 1;pP p1>P T;1P s1>P mPW0 W!mP0 mPH0 amPH0 5W1P 1W58P H51P ", -"1Hm8P WQmP0 WmPQ!0 mPZ0 ZamP0 1WpP p1W8P p1ZP sP1Zp vP0 +Pv0 HPv0 vPg0 v1P ", -"v1>P 1HvP g1>P QPv0 v+QP0 vPZ0 ZvPg0 pPv1 >Ppv1 ZPv1 y1P 9O 9&O 9OB 9aO 91O", -" :O 1B9O :aO 9OK &O9K 9TO 9OT& 9jO :jO jO9T s:O 9(O 9+O (B9O +a9O 1(9O :+O ", -"91(OB +a:O (O9K +O9K T(9O 9O+T 9(jO +j:O 9T1(O :+sO 9EO &E9O 9HO 9OH& 1E9O ", -":EO 9O1H :HO EK9O 9&EOK HT9O 9HTaO 9EjO jO:E jO9H sO:H 9dO 9Od& Hd9O g9O 9O", -"1d :dO 9H1dO g:O dK9O d&O9K 9OTd 9TgO jO9d dj:O 9HjdO gOs: 9O2 &O92 2B9O aO", -"92 95O :5O 5B9O 5a:O 2K9O 9&O2K TO92 9TaO2 jO95 jO:5 9O5T :5sO 9;O 9O;& ;O9", -"B 9Oa; 9O1; :>O 95;OB :a>O ;O9K ;&O9K 9OT; 9+T;O jO9; :j>O 95T;O >Os: EO92 ", -"9&EO2 HO92 9HaO2 5E9O 5E:O 9OH5 H5:O 9EO2K &EO92K 9HTO2 H&O9T2 95jEO :5jEO ", -"9H5jO :H5sO d;9O d&;9O 9OH; 9;gO 9O5d >O:d 9H5dO >Og: 9d;OK 9dO;&K 9H;TO g9", -"T;O 95djO :>djO 9H;jO g:s>O 9P 9P& 9PB 9aP 9P1 :P 1B9P :Pa 9QP Q&9P 9TP Qa9", -"P 9Pj :QP 1T9P s:P 9P( 9+P P(9B +P9a 9(1P :P+ 9P1(B +P:a QP9( +Q9P 9(TP +T9", -"P 9(Pj +Q:P 9TP1( s+:P 9WP W&9P 9HP HP9a 1W9P :WP 1H9P :HP WQ9P 9WQP& Z9P 9", -"aZP Wj9P Wj:P 9PZ1 Z:P 9dP +W9P HP9d g9P 1d9P :dP 9HP1d g:P Qd9P dP&9Q 9dZP", -" Z9gP dP9j Qd:P Z91dP gPZ: 9mP m&9P mP9B am9P 95P :mP 9B5P 5a:P Qm9P m&P9Q ", -"Tm9P 9QamP p9P :pP 9TpP sP:p 9;P +m9P 9B;P a;9P 1;9P >P: 95P;B :a>P Q;9P ;P", -"&9Q T;9P a;P9Q 9;pP >P:p p9T;P s:>P Wm9P m&P9W Hm9P 9HmaP 5W9P 5W:P H59P H5", -":P 9WQmP 9WQm&P 9mZP Z9amP 9WpP pW:P ZPp9 :PZp v9P 9+vP 9HvP v9gP 95vP :vP ", -"v91HP >Pg: 9QvP v9+QP ZPv9 Zv9gP pPv9 pv:P Zp9vP y:P C0O C0!O D0O a0DO 1CO ", -"8C1O 1DO 1OD8 0OCK C0O!K T0DO DTa0O 1CjO jO18C jO1D 1DsO 0(CO C0+O 0(DO D0+", -"O C(1O +C1O D(1O 1O+D C0O(K +C0OK DT0(O +DT0O jO1C( 1+jCO 1DT(O s1+DO E0CO ", -"C0O!E D0HO HDa0O CE1O 18CEO HD1O 1HD8O C0OEK EK0!CO HDT0O DTaH0O jO1CE 18Cj", -"OE 1HDjO s1HDO C0dO +dC0O d0DO D0gO dC1O 1+dCO 1ODd 1DgO dKC0O dKC+0O DdT0O", -" gDT0O djC1O 1+CdjO 1DdjO gs1DO 0OC2 C02!O 0OD2 Da0O2 5C1O 158CO 1O5D 1D58O", -" C02OK 2K0!CO DT0O2 Ta0DO2 jO15C 158jOC 1D5jO s15DO C0;O +;C0O ;0DO a;0DO ;", -"C1O 1C>O 1OD; 1D>O ;C0OK ;C0+OK D;T0O D;0+TO ;jC1O >j1CO 1D;jO >DOs1 C02EO ", -"!EOC02 HD0O2 Da0HO2 15CEO 58C1EO 1H5DO H5D1aO EK2C0O E02K!CO DT0HO2 DTH0aO2", -" 15CjOE 5E1O8jC H5D1TO 1H5sDO d;C0O d;C+0O H;D0O gD;0O 1d5CO >C1dO 1H;DO >D", -"Og1 ;C0dKO C0;O+dK Td0D;O D;Tg0O 1dC;jO djC>O1 djO1D; gs1>DO PC0 !CP0 DP0 D", -"0aP 1PC 1C8P 1DP D81P PCQ0 Q!PC0 Q0DP aP0QD 1CPj PjC18 QD1P 1DsP C0P( PC+0 ", -"P0D( +0DP PC1( 1C+P 1(DP +D1P QPC0( +QPC0 QDP0( +QDP0 PjC1( 1+QPC 1QDP( sP1", -"+D PCW0 W!PC0 H0DP aP0WD WP1C 1W8PC HP1D 1HPD8 WQPC0 WPCQ!0 DPZ0 ZDaP0 PjC1", -"W 1W8PjC 1DZP sP1ZD PCd0 dPC+0 D0dP DPg0 1CdP 1+WPC Dd1P 1DgP dPCQ0 +QCdP0 ", -"ZDdP0 gZDP0 dPj1C dPC1+Q Z1DdP gZ1DP PCm0 mPC!0 mPD0 amPD0 1C5P 1m8PC 5D1P ", -"1Dm8P QmPC0 mPCQ!0 QDmP0 QDmaP0 1PpC p18PC 1DpP sP1pD PC;0 ;PC+0 D0;P a;PD0", -" 1C;P 1P>C D;1P 1D>P ;PCQ0 +QC;P0 QD;P0 aP0QD; p1;PC >Pp1C pD1;P >Ps1D WmPC", -"0 mPCW!0 HmDP0 HmDaP0 1W5PC 5W81PC 1HmDP H8m1DP QmPWC0 QCW0mP! ZDmP0 amPZD0", -" p1WPC 1W8pPC Zp1DP Zp1sPD PCv0 v+PC0 DPv0 gvDP0 1PvC >Pv1C 1DvP >Pg1D vQPC", -"0 +QPvC0 ZvDP0 vDPgZ0 pv1PC pv1>PC Zv1DP 1DyP b9O 9&bO 9DO c9O b1O :bO bO1D", -" :cO 9ObK b9&OK bO9T 9TcO jOb1 bj:O jO9D sO:c 9(bO bO9+ D(9O 9+cO 1(bO b+:O", -" b1D(O c+:O b9(OK b+9OK bT9(O c9+TO b1j(O :b+jO b1T(O :c+sO 9EbO b9&EO bO9H", -" 9HcO 1EbO bE:O bO1H cH:O b9EOK 9&EbKO bH9TO c9HTO b1jEO :bjEO b1HjO :cHsO ", -"bO9d d&Ob9 9ODd c9gO bO1d bd:O b1HdO gO:c bd9OK 9+ObdK bTd9O gc9TO b1djO :d", -"bjO b1TdO g:scO 9Ob2 b9&O2 DO92 9Oc2 bO95 b5:O 9O5D :Oc5 b9O2K 9&ObK2 bT9O2", -" c29TO b15jO :b5jO b1T5O :c5sO bO9; ;&Ob9 9OD; 9;cO bO1; :b>O b1;DO >O:c b;", -"9OK 9+Ob;K bT;9O c;9TO b1;jO :>bjO b1T;O c>s:O b9EO2 9&EbO2 bH9O2 c29HO b15", -"EO :b5EO b1H5O :cH5O 9EObK2 EOb29&K 9HObT2 9HTc2O 95EbjO b5j:EO bHO95T s:Hc", -"5O bd9;O bd9;&O bH;9O c;9gO b1d5O :>bdO b1H;O g:c>O 9dOb;K d&b;9OK bHO9T; g", -"9Tc;O djOb1; >bj:dO djO95D c>sg:O bP9 b9P& 9DP cP9 b1P :Pb 1DbP :cP 9QbP bQ", -"9P& 9TbP 9QcP 9Pbj bQ:P 1TbP :csP b(9P 9+bP 9(DP 9+cP b(1P b+:P b1PD( :+cP ", -"bQ9P( b+Q9P bTP9( cQ9+P b1QP( :Qb+P b1TP( :cQ+P 9WbP bW9P& 9HbP 9HcP 1WbP b", -"W:P 1HbP cW:P bW9QP 9WQbP& bPZ9 cPZ9 b1WPj :WbPj b1ZP :PZc 9dbP dP&b9 Dd9P ", -"cPg9 1dbP bd:P b1HdP :cgP bQd9P 9+QbdP Zb9dP Zcg9P dPjb1 :QdbP Zb1dP g:PZc ", -"9mbP m&Pb9 Dm9P 9mcP 95bP b5:P 5D9P c5:P bQ9mP bQ9m&P bTm9P cQ9mP b1pP pb:P", -" 9DpP :Pcp 9;bP ;P&b9 D;9P 9;cP 1;bP >b:P b1;DP :c>P bQ;9P 9+Qb;P bT;9P cQ;", -"9P pb9;P :p>bP p9D;P cp:>P bW9mP bW9m&P bHm9P cW9mP b1W5P :Wb5P b1H5P :cW5P", -" 9WQbmP QmP&bW9 Zb9mP Zc9mP pb9WP :pbWP Zpb9P cpZ:P bPv9 vb9+P 9DvP v9cP b1", -"vP vb:P vb1HP :Pcv vb9QP b+Qv9P Zvb9P cvZ9P pvb9P :vbpP Zvb1P :cyP R R! RB ", -"Ra R. R8 R.B R8a RM RM! RT RTa Rj R8M RTj sR R( R+ R(B R+a R(. R+8 .BR( +8R", -"a RM( R+M RT( R+T Rj( R+j TjR( sR+ RE RE! RH RHa RE. R8E RH. RH8 RME MER! R", -"HT HMRa RjE RE8M RHj sRH Rd R+d RHd gR Rd. R8d HdR. gR8 RdM +MRd RTd gRT Rd", -"j +jRd HjRd gsR R2 R2! R2B Ra2 R5 R58 R5B R5a RM2 M2R! RT2 R2aM R5M 5MR8 R5", -"T sR5 R; R+; R;B Ra; R5; >R 5;RB >Ra R;M +MR; RT; +TR; R;j >MR 5TR; s>R RE2", -" !ER2 RH2 HaR2 R5E 58RE RH5 H5R8 MER2 RME!2 R2HM aM2RH RE5M R58ME H5RT RHs5", -" Rd; +dR; RH; gR; R5d >Rd H5Rd g>R dMR; dM;R+ HMR; RTg; 5dRj Rd>M H;Rj gR>M", -" RP RP! RPB RaP RP. R8P P.RB 8PRa S S! ST Sa Sj S8 STj Ss RP( R+P P(RB +PRa", -" P(R. +PR8 RP(.B R+8aP S( S+ ST( S+T Sj( S+8 TjS( Ss+ RW RW! RHW RWa RW. RW", -"8 R.HP H8RW SW S!W SZ SZa SWj S8W SZj SsZ RWd R+W HPRd gRW R.dP +WR8 dP.RH ", -"RWg8 Sd S+W SZd gS Sdj S8d ZdSj gSs Rm Rm! RmB Ram R5m R8m RB5P 5aRm Sm S!m", -" STm Sam Sp Sp8 SpT Ssp Rm; R+m RB;P +mRa 5PR; >PR ;PBR5 Ra>P S; S+m S;T Sa", -"; Sp; S> pTS; S>s RWm W!Rm RHm HmRa R5W 5WR8 H5RW H8Rm SWm W!Sm SZm ZaSm Sp", -"W pWS8 SZp SZsp vR vR+ vRH gvR vR5 v>R RHv5 gR>P Sv Sv+ SvZ gSv Svp S>v ZpS", -"v yS R# R& R#B Ra& R#. R8& .BR# 8aR& RM# R&M RT# RT& Rj# R&j TjR# sR& R#( R", -"+& #BR( +aR& #(R. +8R& R#(.B R+8a& M#R( +MR& T#R( +TR& j#R( +jR& RTj#( R+s&", -" R#E R&E RH# RH& #ER. 8&RE H#R. H8R& M#RE REM& R#HM HMR& j#RE RE&j R#Hj RHs", -"& Rd# Rd& HdR# gR& d#R. 8dR& RHd#. R8g& R#dM dMR& R#Td RTg& R#dj d&Rj RHjd#", -" g&sR R#2 R&2 2BR# a&R2 R5# R5& 5BR# 5aR& M#R2 R2M& T#R2 R2T& R#5M 5MR& R#5", -"T R5s& R;# R;& ;#RB a;R& 5;R# >R& R5;#B Ra>& R#M; M;R& R#T; T;R& R#;j R&>M ", -"R5T;# >&sR #ER2 &ER2 H#R2 R2H& 5#RE RE5& R#H5 H5R& RM#E2 M&ER2 RHT#2 RH&T2 ", -"R5M#E R5&ME RH5T# sRH5& d;R# d&R; R#H; R;g& R#5d Rd>& RH5d# >&gR dM;R# dM&R", -"; RH;T# gRT;& R5dM# >MRd& RH;j# >MgR& RP# R&P P#RB aPR& P#R. 8PR& RP#.B aP&", -"R8 S# S& ST# Sa& Sj# S8& TjS# Ss& P#R( +PR& RP#(B aP&R+ RP#(. R+8P& P#(R.B ", -"R+8aP& S#( S+& T#S( +TS& j#S( +jS& STj#( s+S& RW# RW& R#HP HPR& W#R. W8R& R", -"HW#. RH8W& SW# S&W SZ# SZ& WjS# W8S& ZjS# S&sZ R#dP +WR& dP#RH RWg& dP#R. d", -"P&R8 RH#dP. gRW8& Sd# Sd& ZdS# gS& djS# 8dS& SZdj# S&gs Rm# Rm& m#RB amR& R", -"#5P 5PR& R5m#B R5am& Sm# S&m TmS# TmS& Sp# Sp& pTS# S&sp R#;P +mR& ;P#RB a;", -"PR& ;P#R5 Rm>& R5#;PB >PRa& S;# S;& T;S# T;S& p;S# S>& SpT;# S&s> WmR# W&Rm", -" R#Hm HmR& R#5W 5WR& RH5W# RH5W& WmS# W&Sm ZmS# SmZ& pWS# SWp& S#Zp ZpS& vR", -"# vR& RHv# v&gR R5v# >Rv& vRH5# >PgR& Sv# Sv& S#Zv S&gv S#pv pvS& SZpv# yS&", -" RU RU! RD RDa RU. R8U RD. RD8 RUM U!RM VR VRa RjU U8Rj VRj sRV RU( R+U RD(", -" R+D U(R. U+R8 D(R. +DR8 UMR( RU+M VR( V+R R(Uj U+Rj RjV( V+sR RUE U!RE RHU", -" UHRa UER. REU8 R.UH UHR8 UMRE RUM!E VRH RHVa REUj R8UME RHVj VRsH RdU U+Rd", -" RDd gRU R.Ud U8Rd R.Dd RDg8 RUdM R+UdM VdR gVR UdRj R+jUd RdVj sRgV RU2 U!", -"R2 RD2 R2Ua R5U U5R8 R5D U5Ra UMR2 RUM!2 V2R RaV2 U5Rj R5U8M V5R V5sR R;U U", -"+R; RD; UaR; U5R; >RU 5DR; >RD RUM; R+UM; V;R R+V; U;Rj Rj>U R5V; V>R UER2 ", -"RUE!2 R2UH RHUa2 REU5 R5U8E UHR5 RH5U8 RUME2 U!MRE2 RHV2 V2RHa R5UME U58RjE", -" RHV5 VsHR5 UdR; R+Ud; UHR; RDg; U5Rd Rd>U 5DRd >RgU dM;RU R+UdM; RHV; V;gR", -" R5dUj >MRUd R5Vd gRV> UP UP! RDP UaP UP. U8P R.DP D8UP SU S!U SV SVa SUj S", -"8U SVj SsV UP( U+P R(DP +DUP P(U. +PU8 RDP(. R+D8P SU( S+U SV( SV+ UjS( U+S", -"8 VjS( VsS+ RWU R!UW RWD UWRa R.UW UWR8 R.WD H8UP SUW UWS! SZV VZSa UWSj UW", -"S8 SjVZ SVsZ UdP U+RW HPUd gUP U.dP 8dUP RWDd. U8gP SdU U+Sd SVd gSV UdSj U", -"8Sd SjVd SsgV RmU R!Um RDm UaRm U5P U8Rm 5DRm 5aUP SUm UmS! SVm VmSa SpU pU", -"S8 VpS VpSs U;P U+Rm DmR; +DRm 5PU; >PU R5D;P RD>P S;U U+S; SV; V+S; pUS; S", -">U S;Vp S>V UWRm RWUm! UHRm RHmUa U5RW R5WU8 H5UP RH8Um UWSm S!UWm VmSZ SZV", -"am SWpU SpUW8 SZVp SZpVs vRU R+vU vRD vRgU R5vU vU>P R5vD gU>P SvU vUS+ VvS", -" VvgS pUSv vUS> VpSv yVS Rb Rb& RbD cR Rb. Rb8 bDR. cR8 RbM bMR& VRb cRV Rb", -"j b8Rj RbVj scR Rb( Rb+ bDR( cR+ b(R. b+R8 RbD(. R+c8 R(bM bMR+ RbV( V+cR R", -"(bj b+Rj VRbj( s+cR RbE REU& RbH cRH bER. REb8 R.bH RHc8 REbM M&ERb RbVH VR", -"cH REbj Rb8ME bHRj sHcR Rbd b+Rd bHRd gcR R.bd b8Rd RbHd. g8cR bMRd dM&Rb R", -"bVd cRgV bdRj d&jRb VdRbj scgR Rb2 R2U& bDR2 cR2 Rb5 b5R8 b5RD cR5 R2bM M&2", -"Rb RbV2 V2cR b5Rj Rb58M RbV5 c5sR Rb; b+R; b;RD cR; b5R; >Rb Rb5D; c>R bMR;", -" M;&Rb RbV; V;cR b;Rj Rb>M V5Rb; sRc> bER2 Rb&E2 R2bH RHc2 REb5 Rb58E bHR5 ", -"RHc5 RbME2 RbEM&2 V2RbH cRVH2 Rb5ME M&ERb5 V5RbH cR5sH bdR; Rb+d; bHR; c;gR", -" b5Rd Rb>d RbH5d gRc> RbdM; RbdM;& VdRb; gVcR; Rb5dM >MbRd V5dRb V>gcR RbP ", -"UP& bPRD cRP R.bP bPR8 RbDP. R8cP Sb Sb& SVb Sc Sbj Sb8 VbSj Scs R(bP bPR+ ", -"RbDP( R+cP RbP(. Rb+8P bP(RD. cR+8P Sb( Sb+ VbS( Sc+ bjS( b+S8 SVbj( S+sc R", -"bW bWR& bHRW cRW R.bW bWR8 RbHW. RWc8 SbW bWS& SZb ScZ bWSj bWS8 SjZb ZcSs ", -"bWRd b+RW RbHdP cRgP RbWd. dP&U8 dP.RbH cRWg8 Sbd b+Sd ZbSd gSc bdSj b8Sd S", -"Zbdj gsSc Rbm bmR& bmRD cRm b5Rm b8Rm Rb5Dm R5cm Sbm bmS& VmSb Scm Spb pbS8", -" SbVp Scp bmR; b+Rm RbmD; R+cm Rb5;P Rb>P b5PRD; cR>P Sb; b+S; V;Sb Sc; pbS", -"; S>b SpbV; Sc> bWRm RbWm& bHRm RHcm b5RW Rb5W8 RbH5W R5cW bWSm SbWm& SmZb ", -"cmSZ SWpb SpbW8 ZpSb SZcp vRb Rbv& RbvD cvR Rbv5 >Rvb vRbH5 v>cR Svb vbS+ S", -"bVv Scv pvSb v>Sb VvpSb ycS Rk Rk! RkB Rak R1 R18 R1B R1a RkM kMR! RTk TkRa", -" lR lR8 lRT lsR Rk( R+k k(RB +kRa R1( R1+ 1(RB 1+Ra kMR( Rk+M R(Tk +kRT lR(", -" l+R RTl( sRl+ RkE kER! RHk HkRa R1E RE8k R1H 1HR8 kMRE RkM!E HkRT RHTak lR", -"E R8lE lHR sRlH Rdk +kRd HkRd gRk R1d 1+Rd 1HRd gR1 RkdM dkMR+ TkRd RTgk ld", -"R R+ld RHld glR Rk2 k2R! k2RB R2ak R15 5kR8 RB5k 1aR5 kMR2 RkM!2 R2Tk ak2RT", -" lR5 R5l8 R5lT l5sR R;k +kR; RBk; akR; R1; >kR RB1; R1>a RkM; k;MR+ TkR; ak", -";RT l;R l>R RTl; sRl> kER2 RkE!2 R2Hk ak2RH RE5k R158E 1HR5 R1H5a RkME2 kME", -"R2! RHTk2 RHTak2 R5lE lR58E RHl5 lsRH5 dkR; dk;R+ HkR; R;gk 1dR5 R1>d 1HR; ", -"gR>k dkMR; R+dk;M RH;Tk gRTk; R5ld >Rld RHl; gRl> kP kP! kPB akP R1P 8kP RB", -"1P 1PRa Sk S!k STk Sak Sl Sl8 SlT Ssl kP( +kP P(kB ak+P R(1P 1PR+ kP(1B akP", -"1+ Sk( S+k TkS( +TSk Sl( l+S STl( l+Ss RWk R!Wk HkP WkRa R1W 1WR8 1HRW 1WRa", -" SWk WkS! SZk ZkSa lWS S8lW lZS lZSs dkP +kRW dkHP gkP 1WRd 1+RW dkP1H R1gP", -" Sdk +WSk ZkSd gSk ldS S+lW SZld glS Rmk R!km RBkm akRm R1m 1mR8 RB1m 1aRm ", -"Skm kmS! TkSm akSm Slp lpS8 lTSp Slsp k;P +kRm kB;P k;aP 1mR; >kP k;P1B ak>", -"P S;k +kS; TkS; akS; l;S S>l lTS; Ssl> WkRm km!RW HkRm akmRH 1WR5 R1W8m 1HR", -"m akPH5 WkSm S!Wkm SmZk SZakm SplW SlpW8 SplZ SZpls vRk R+vk RHvk vRgk vR1 ", -"vR>k R1vH gk>P Svk vkS+ ZkSv gkSv lvS S>lv lZSv ylS R9 R9& R9B R9a R91 :R 9", -"1RB :Ra R9M 9MR& R9T 9TRa lR9 l:R R9lT s:R R9( R9+ 9(RB 9+Ra 91R( :R+ R91(B", -" R+:a R(9M 9MR+ R(9T 9+RT R9l( :Rl+ lR9T( s+:R R9E REk& R9H 9HRa 91RE :RE 9", -"HR1 :RH RE9M k&ERM 9HRT R9HT& R9lE lE:R R9lH :RlH R9d 9+Rd 9HRd gR9 9dR1 :R", -"d R9H1d g:R 9MRd dk&RM 9TRd R9gM R9ld :Rld lHR9d gRl: R92 R2k& 92RB R29a R9", -"5 :R5 RB95 R5:a R29M k&2RM R29T R9T&2 R9l5 l5:R 95RT s5:R R9; 9+R; RB9; 9aR", -"; 95R; :>R R95;B :a>R 9MR; k;&RM 9TR; aM;R9 R9l; :Rl> l;R9T :>sR 9ER2 k&ER2", -" R29H R9H&2 RE95 R5:E 9HR5 RH:5 R9ME2 R9EM&2 R9HT2 aM2R9H lR95E :R5lE lHR95", -" :RHl5 9dR; dk&R; 9HR; R9g; 95Rd >R:d R9H1; :>gR R9dM; R9dM;& R9HT; gR9T; l", -"dR95 l>:Rd lH;R9 g:Rl> R9P kP& RB9P 9PRa 9PR1 :RP kPB91 Ra:P S9 S9& S9T S9a", -" Sl9 S: lTS9 S:s R(9P 9PR+ kP(9B akP9+ kP(91 R+:P 9P(R1B :R+aP S9( S9+ 9TS(", -" 9+Sa l(S9 S:+ Sl9T( S+s: R9W 9WR& 9HRW 9WRa 9WR1 :RW R9H1W RH:W S9W 9WS& S", -"Z9 Z9Sa S9lW S:W S9lZ S:Z 9WRd 9+RW dkP9H R9gP dkP91 R+:W 9HPR1d :RgP S9d 9", -"+Sd Z9Sd gS9 S9ld S:d SZ9ld gS: R9m 9mR& RB9m 9aRm 95Rm :Rm R95mB Ra:m S9m ", -"9mS& 9TSm 9aSm Sp9 S:p STp9 :pSs 9mR; 9+Rm k;P9B ak;9P k;P95 :R>P k;B95P :>", -"Ram S9; 9+S; 9TS; 9aS; S9l; S:> Sp9T; s:S> 9WRm km&RW 9HRm km&RH 95RW R5:W ", -"R9H1m RH:m 9WSm S9Wm& SmZ9 SZ9am SWp9 :WSp ZpS9 SZ:p vR9 R9v& R9vH vRg9 R9v", -"1 :vR vR91H gR:v Sv9 v9S+ ZvS9 g9Sv S9lv S:v Sv9lZ y:S RUk U!Rk RDk DkRa R1", -"U 1UR8 R1D 1URa UkRM RUkM! VRk RaVk lRU R8lU VlR VlsR UkR( RU+k R(Dk +kRD R", -"(1U 1UR+ R(1D 1+RD RUkM( R+UkM RkV( R+Vk RUl( R+lU VRl( lRV+ UkRE RUk!E HkR", -"D RHUak RE1U R1U8E 1URH R1HU8 RUkME U!kRME RHVk VRHak RUlE lRU8E VRlH lsVRH", -" RUdk R+Udk DkRd RDgk 1URd R1+Ud 1DRd R1gU dkMRU R+UdkM RdVk VRgk RdlU l+RU", -"d lRVd VlgR UkR2 RUk!2 R2Dk ak2RD 1UR5 R1U58 1DR5 R1D5a RUkM2 U!kRM2 RkV2 V", -"2Rak R5lU lRU58 lRV5 lsVR5 RUk; R+Uk; DkR; ak;RD 1UR; R1>U 1DR; R1>D k;MRU ", -"R+Uk;M R;Vk V+Rk; R;lU lR>U lRV; >RVl RUkE2 U!kRE2 RHUk2 RHUak2 R1U5E 1U5R8", -"E R1HU5 1UHR5a UkMRE2 !ER2UkM V2RHk ak2VRH lRU5E R5Ul8E VlRH5 Vs5lHR dk;RU ", -"R+Udk; RH;Dk gRUk; R1dU5 >kRUd R1HU; >kgRD RdUk;M dkR;U+M VdRk; gVRk; ldRU5", -" l>RUd lH;VR V>lgR UPk U!kP DkP akUP 1UP U81P 1PRD Ua1P SUk U!Sk SVk VaSk S", -"lU lUS8 SlV SVls U(kP +kUP D(kP Dk+P 1(UP U+1P R1DP( R1+DP UkS( U+Sk VkS( S", -"kV+ SUl( lUS+ l(SV SVl+ WkUP kP!UW HkUP akPUH 1URW R1WU8 1WRD R1WUa UWSk S!", -"UWk ZkSV SZVak SUlW SlUW8 SVlZ SlVsZ dkUP dkPU+ dkDP UPgk Ud1P dkPU8 dkP1D ", -"1UgP UdSk S+UWk SkVd SVgk lUSd S8dlU SVld SlgV kmUP km!UP DkRm akmRD 1URm R", -"1mU8 1DRm akPU5 UmSk S!Ukm SkVm SVakm pUSl SlpU8 SlVp SlVsp k;UP k;PU+ k;DP", -" ak;UP U;1P 1U>P k;P1D Dk>P U;Sk S+Ukm SkV; SV+km lUS; >USl SVl; SlV> RWUkm", -" RWUkm! RHmDk RWDakm R1WU5 1UWR8m R1HUm 1UHR8m SUWkm km!SUW SZVkm ZkVSam Sl", -"pUW lWpS8U SlVZp VplSsZ UPvk vRU+k RDvk gvRDk R1vU >kvUP R1vD >kgUP SUvk Sv", -"U+k vkSV VvgSk vUSl lv>SU SlVv SlyV tR tR& tRD tcR tR1 t:R R1tD :cR tRM R&t", -"M VtR VtcR ltR :Rlt lRVt uR tR( t+R RDt( cRt+ R1t( :Rt+ tR1D( :+cR RMt( R+t", -"M VRt( tRV+ tRl( lRt+ ltVR( uR+ tRE R&tE tHR cRtH R1tE tE:R R1tH :RtH RMtE ", -"tRM&E VRtH tcVRH tRlE t:RlE lRtH uRH tdR R+td RHtd gtR R1td :Rtd tHR1d t:gR", -" RdtM t+RdM tRVd VtgR lRtd t:dlR tdVlR ugR tR2 R&t2 RDt2 c2tR t5R :Rt5 R5tD", -" cRt5 RMt2 tRM&2 tRV2 tcVR2 lRt5 t:Rl5 tRV5 uR5 t;R R+t; RDt; cRt; R1t; t>R", -" t5RD; :Rc> R;tM t+RM; tRV; tc;VR lRt; >Rlt t5VR; u>R REt2 tR&E2 RHt2 tcRH2", -" R5tE t:R5E RHt5 t:HR5 tRME2 M&EtR2 tHVR2 cRVtH2 t5RlE lt5:RE tH5lR RHu5 Rd", -"t; t+Rd; RHt; t;gR R5td >Rtd tH5Rd gRt> tdRM; dM&t;R tH;VR gtVR; t5dlR t>lR", -"d tH;lR g>uR tP tP& tPD tcP tP1 t:P 1DtP :ctP St St& StV Sct Stl S:t SVlt u", -"S tP( t+P DPt( cPt+ 1Pt( :Pt+ tP1D( t:Pc+ St( St+ S(Vt tcS+ l(St l+St SlVt(", -" uS+ tWR RWt& tHP cRtW R1tW :RtW 1HtP :HtP StW tWS& tZS tZSc lWSt tWS: lZSt", -" uZS tdP R+tW HPtd gtP 1dtP :dtP tHP1d t:gP Std t+Sd SdtZ gtS ldSt t:Sd Std", -"lZ ugS tmR Rmt& RDtm cRtm t5P :Rtm 5DtP cR:m Stm tmS& tmSV tmSc tpS tpS: Vp", -"St upS t;P R+tm D;tP c;tP 1;tP t>P t5PD; tc>P St; t+S; t;SV S;tc l;St S>t S", -"t;Vp u>S RWtm tWRm& RHtm tcWRm R5tW t:WR5 H5tP t:HRm SWtm StWm& tmSZ ScZtm ", -"tWSp S:ptW SZtp SZup tvR vRt+ vRtH gRtv vRt5 >Ptv tvR1H >Pgt tvS S+tv StVv ", -"tvgS Stlv tvS: lvVSt yuS )O !)O )BO a)O )O. 8)O )O.B a)8O )OK )O!K T)O a)TO", -" jO) 8)jO T)jO s)O *O +*O *BO a*O *O. 8*O .B*O 8Oa* *OK *O+K T*O +OT* *jO j", -"O8* jOT* s*O E)O E)!O H)O a)HO )OE. E)8O )OH. 8)HO )OEK !E)OK T)HO HTa)O E)", -"jO jO8E) H)jO H)sO d*O d*+O H*O g*O *Od. d*8O *OH. 8*gO *OdK +d*OK HOT* T*g", -"O d*jO dj*+O jOH* gOs* )O2 )O!2 )O2B )Oa2 5)O 8)5O )B5O a)5O )O2K !)2OK )OT", -"2 Ta)O2 5)jO jO58) T)5O 5)sO ;*O ;*+O ;O*B ;*aO 5*O >*O 5O*B a*>O *O;K +;*O", -"K ;*TO a;*TO jO5* *j>O 5OT* >Os* )OE2 !)2EO )OH2 Ha)O2 E)5O 58E)O 5)HO H58)", -"O EK)O2 !)OEK2 HT)O2 Ta)HO2 jO5E) 58EjO) H5T)O sH5)O ;*dO +d;*O ;*HO ;*gO d", -"*5O d*>O HO5* g*>O dK;*O dK;+*O H;T*O gT;*O dj*5O >*djO H5*jO s*Og> P) P)! ", -"P)B aP) P). 8P) .BP) 8)aP QP) P)Q! TP) Q)aP Pj) Q)8P T)Pj sP) P* +P* P*B aP", -"* P*. 8P* P.*B aP8* Q*P Q*+P TP* T*+P P*j 8PQ* PjT* sP* WP) P)W! HP) H)aP P", -")W. W)8P P)H. H)8P QPW) Q!WP) ZP) aPZ) W)Pj Pj)W8 PjZ) ZPs) W*P W*+P HP* gP", -"* W.P* 8PW* H.P* 8Pg* dPQ* +WQP* Z*P Z*gP P*Wj dPj8* P*Zj s*gP mP) P!m) P)m", -"B mPa) 5P) 5)8P P)5B 5)aP mPQ) Q!mP) mPT) amPQ) pP) 8Pp) TPp) pPs) m*P m*+P", -" *B;P m*aP 5P* >P* *B5P aP>* ;PQ* m*P+Q m*TP am*TP p*P p*>P TPp* s*>P mPW) ", -"W!mP) mPH) amPH) WP5) 5W8P) H)5P H5P8) WQmP) WmPQ!) mPZ) ZamP) WPp) pW8P) p", -"PZ) sP)Zp vP* +Pv* HPv* vPg* 5Pv* vP>* 5PH* >*gP Q*vP v+QP* vPZ* ZvPg* vPp*", -" >Ppv* ZPp* y*P ,O ,&O ,OB ,aO ,O. ,8O .B,O 8a,O ,OK &O,K ,TO ,OT& ,jO ,O&j", -" jO,T s,O ,*O -O ,O*B -aO *O,. -8O *B,O. 8a-O *O,K -OK ,OT* -TO ,O*j -jO *j", -"O,T s-O ,EO &E,O ,HO ,OH& EO,. 8E,O HO,. ,OH8 EK,O ,&EOK HT,O ,HTaO jO,E &j", -"E,O ,OHj ,HsO ,dO -dO ,OH* g-O dO,. 8d-O ,HdO. -8gO dK,O dK-O ,OTd gO-T ,Od", -"j dj-O ,HjdO gOs- ,O2 &O,2 2B,O aO,2 ,5O ,O5& 5B,O ,O5a 2K,O ,&O2K TO,2 ,Ta", -"O2 jO,5 &jO,5 ,O5T ,5sO ,;O -;O ;O,B a;-O ,O5* ->O ,5;OB -a>O ;O,K ;O-K ,OT", -"; T;-O ,O;j >O-j ,5T;O >Os- EO,2 ,&EO2 HO,2 ,HaO2 5E,O ,58EO ,OH5 ,H58O ,EO", -"2K &EO,2K ,HTO2 H&O,T2 ,5jEO ,5E&jO ,H5jO s,H5O d;,O d;-O ,OH; -;gO ,O5d -d", -">O ,H5dO >Og- ,d;OK -d;OK ,H;TO -T;gO ,5djO ->djO ,H;jO s-g>O ,P ,P& ,PB ,a", -"P ,P. ,8P P.,B 8P,a ,QP Q&,P ,TP Qa,P ,Pj Q8,P TP,j sP, ,P* -P *B,P -Pa ,.P", -"* -P8 P*.,B 8P-a Q*,P -QP T*,P -TP P*,j -Pj P*j,T s-P ,WP W&,P ,HP HP,a WP,", -". W8,P ,.HP H8,P WQ,P ,WQP& Z,P ,aZP Wj,P P&j,W ,PZj Z,sP ,dP -WP HP,d g-P ", -",.dP W8-P ,HPd. g8-P Qd,P Qd-P ,dZP Z-P dP,j Wj-P Z*P,j gPs- ,mP m&,P mP,B ", -"am,P ,5P 5P,8 ,B5P 5a,P Qm,P m&P,Q Tm,P ,QamP p,P ,8pP ,TpP p,sP ,;P -mP ,B", -";P am-P 5P,; >P- ,5P*B -a>P Q;,P Q;-P T;,P Tm-P ,;pP -pP p*T,P >Ps- Wm,P m&", -"P,W Hm,P ,HmaP 5W,P ,5W8P H5,P ,H58P ,WQmP ,WQm&P ,mZP Z&m,P ,WpP p&W,P ZPp", -", sP,Zp v,P -vP ,HvP gP-v ,5vP >P-v v,H5P g->P ,QvP vQ-P ZPv, -PZv pPv, pv-", -"P Zp*,P y-P C)O C)!O D)O a)DO )OC. C)8O )OD. 8)DO )OCK !CO)K T)DO DTa)O C)j", -"O jO8C) D)jO D)sO *CO *C+O D*O +OD* CO*. *C8O *OD. DO8* CK*O +*COK DOT* a*O", -"DT *CjO *jC+O jOD* D*sO E)CO CE)!O D)HO HDa)O C).EO 8CE)O HD)O. H8D)O CE)OK", -" EK)!CO HDT)O DTaH)O jOCE) 8CEjO) HjD)O sHD)O *CdO +d*CO HOD* D*gO d*CO. 8d", -"*CO H*DO. gD8*O dK*CO dK*+CO H*DTO gDT*O dj*CO 8dC*jO H*jDO s*DgO )OC2 !)2C", -"O )OD2 Da)O2 C)5O 58C)O D)5O 5D8)O 2KC)O CKO!)2 DT)O2 Ta)DO2 jO5C) 58CjO) 5", -"DT)O s5D)O *C;O +;*CO ;*DO a;*DO *C5O *C>O 5OD* D*>O ;*COK ;*C+OK D;T*O D;T", -"a*O ;jC*O >*jCO 5D*jO >D*sO CE)O2 !O2CE) HD)O2 Da)HO2 5CE)O 8CE5)O H5D)O 5D", -")H8O C)OEK2 C)!OEK2 DT)HO2 DTH)aO2 5CEjO) 5)jO8CE 5D)HjO H5Ds)O d;*CO d;*+C", -"O H;D*O gD;*O 5d*CO >*dCO H5*DO >D*gO ;*CdKO dK+*;CO D;TH*O D;Tg*O 5dC*jO d", -"j*>CO djO5D* gs*>DO PC) !CP) DP) D)aP C)P. PC8) P)D. D)8P PCQ) Q!PC) Q)DP a", -"P)QD jCP) PjC8) D)Pj DPs) P*C +CP* DP* D*+P *CP. 8CP* D.P* 8PD* QCP* P*C+Q ", -"DPQ* aP*QD PC*j P*j+C P*Dj DPs* PCW) W!PC) H)DP aP)WD WPC). W8PC) HPD). H8P", -"D) WQPC) WPCQ!) DPZ) ZDaP) PjCW) W8CPj) ZDPj) sPDZ) WCP* dPC+* DPH* DPg* dP", -"C*. W8*PC HP*D. gPD8* dPCQ* +WQP*C DPZ* Z*DgP dPj*C dPCQ8* Z*DPj sP*gD PCm)", -" mPC!) mPD) amPD) PC5) 5P8C) 5)DP 5DP8) QmPC) mPCQ!) QDmP) QDmaP) PCp) p8PC", -") DPp) sPDp) mCP* m*P+C m*DP am*DP 5CP* P*>C DP5* DP>* m*PQC +QmP*C QD;P* Q", -"D;aP* P*pC >Pp*C DPp* sP*pD WmPC) mPCW!) HmDP) HmDaP) 5WPC) W8C5P) H5PD) aP", -")5WD QmPWC) W)Q!mPC ZDmP) amPZD) pWPC) W8PpC) ZpDP) ZpDsP) P*vC v+P*C DPv* ", -"gvDP* v5P*C >Pv*C vD5P* >PgD* vQP*C P*Cv+Q ZvDP* gvDZ*P pvP*C pv*>PC Zp*DP ", -"DPy* ,bO b&,O ,DO c,O bO,. ,Ob8 DO,. ,8cO bK,O ,b&OK ,ObT ,TcO ,Obj &jO,b ,", -"ODj c,sO b*O -bO ,OD* c-O *Ob. b8-O ,D*O. -8cO *ObK bK-O bOT* cO-T jOb* bj-", -"O ,Dj*O sOc- bE,O ,b&EO ,ObH ,HcO ,bEO. ,8bEO ,HbO. cH8,O ,bEOK bK&,EO ,HbT", -"O cHT,O ,jbEO b8E,jO ,HjbO s,HcO ,Obd bd-O ,ODd gOc- ,dbO. -b8dO ,DdO. c-8g", -"O ,dbOK -bdOK ,DdTO c-TgO ,djbO -jbdO ,DdjO s-gcO bO,2 ,b&O2 DO,2 ,Oc2 ,Ob5", -" ,5b8O ,O5D ,5cO ,bO2K bK&,O2 ,DTO2 c2T,O ,5bjO ,5b&jO ,5DjO s,5cO ,Ob; b;-", -"O ,OD; -;cO bO5* -b>O ,5D;O >Oc- ,;bOK -b;OK ,D;TO c-T;O ,;jbO ->bjO ,D;jO ", -"s-c>O ,bEO2 b&E,O2 ,HbO2 c2H,O ,5bEO b5E,8O ,H5bO c5H,O bKE,O2 EO,2bK& bHO,", -"T2 ,HTc2O b5E,jO 5jbE,8O ,HOb5T c5Hs,O ,db;O -bd;O ,H;bO c-;gO ,5dbO ->bdO ", -",5DdO c>g-O bdO,;K bd;-OK ,HObT; -T;gcO djOb5* >bd-jO djO,5D c>gs-O ,Pb ,bP", -"& ,DP cP, ,.bP b8,P ,.DP ,8cP bQ,P ,QbP& bT,P ,QcP bP,j P&j,b DP,j cPs, bP*", -" -Pb DPb* c-P b.P* b8-P ,DP*. c8-P Q*bP bQ-P TPb* -QcP P*bj bP-j P*j,D c-sP", -" bW,P ,WbP& bH,P ,HcP ,WbP. ,W8bP ,HPb. cW8,P ,WbQP bWQ,P& ,DZP cPZ, ,WjbP ", -"bW8,Pj ZbP,j sP,Zc bd,P bW-P HPb* c-gP ,dPb. -Wb8P ,DdP. c-W8P ,QdbP -WbQP ", -"bPZ* cPZ- dPjb* -WjbP Zb*Pj s-PZc bm,P m&P,b Dm,P ,mcP b5,P ,5Pb8 5D,P ,5cP", -" ,QbmP ,Qbm&P ,QDmP cQm,P ,Ppb pb8,P ,DpP p,cP b;,P bm-P D;,P -mcP 5Pb* >b-", -"P ,5D;P c->P ,Q;bP -Qb;P ,QD;P c-Q;P bPp* pb-P pb*DP cP-p ,WbmP ,Wbm&P ,Hmb", -"P cWm,P ,5WbP b5W,8P ,H5bP c5W,P bWQ,mP QmP&,Wb Zbm,P ZcP,m pbW,P ,W8pbP Zp", -"b,P cpZ,P ,Pvb vb-P ,DvP cP-v vb5,P -v>bP vD,5P cv->P vbQ,P -vbQP Zvb,P cvZ", -"-P pvb,P -pvbP ZpbP* c-yP 0)O 0)!O 0)OB 0)aO 1)O 8)1O )B1O a)1O )O0K !K0)O ", -"0)TO Ta0)O 1)jO jO18) T)1O 1)sO *0O *0+O 0B*O *0aO 1*O 1O8* 1O*B 1Oa* 0O*K ", -"+*0OK *0TO a*0TO jO1* *jO1+ 1OT* 1*sO 0)EO !E)0O 0)HO Ha0)O E)1O 18E)O H)1O", -" 1H8)O EK0)O !0OEK) HT0)O Ta0H)O jO1E) 18EjO) 1HT)O s1H)O *0dO +d*0O *0HO *", -"0gO d*1O 1+d*O 1OH* 1*gO dK*0O dK*+0O H*T0O gT*0O dj*1O 1+d*jO 1H*jO s*1gO ", -")O02 0)2!O 0)2OB a0)O2 5)1O 158)O 15)OB 1a5)O 0)2OK !)O2K0 T0)O2 a0)TO2 jO1", -"5) 158jO) 1T5)O s15)O *0;O +;*0O *B;0O a;*0O 1O5* 1*>O 1;*OB >*1aO ;*0OK ;*", -"0+OK T;*0O T;0a*O ;jO1* >*1jO 1T;*O s*1>O 0)2EO !EO0)2 H0)O2 a0)HO2 15E)O 5", -"8E1)O 1H5)O H5)1aO E)O2K0 0)EO2K! T0)HO2 0)HOTa2 15EjO) 5)jO18E H5)1TO 1H5s", -")O d;*0O d;*+0O H;*0O g;*0O 1d5*O >*1dO 1H;*O g>1*O ;*0dKO dK+*;0O T;0H*O T", -";*g0O 1d5*jO dj*>O1 ;jO1H* g>1s*O P0) !0P) )BP0 P0a) 1P) 1)8P P)1B 1)aP P0Q", -") Q!P0) P0T) aP0Q) 1)Pj Pj)18 1)TP 1Ps) P*0 +0P* P0*B a0P* 1P* +P1* *B1P aP", -"1* Q0P* P*0+Q T0P* aP*Q0 Q*1P P*j1+ TP1* 1Ps* P0W) W!P0) P0H) aP0H) WP1) 1W", -"8P) 1)HP 1HP8) WQP0) WP0Q!) P0Z) ZaP0) Pj)1W 1W8Pj) 1PZ) sP1Z) W0P* dP0+* H", -"0P* P*g0 W*1P 1+WP* HP1* 1Pg* dP0Q* +WQP*0 P*Z0 Z*Pg0 dPj1* 1+WP*j 1PZ* sP*", -"g1 P0m) mP0!) mP0)B amP0) 1)5P 1m8P) 1mP)B 1amP) QmP0) mP0Q!) TmP0) Tm0aP) ", -"1Pp) p18P) p1TP) sP1p) m0P* m*P+0 m*P0B am*P0 5P1* 1P>* 1m*PB >P1a* m*PQ0 +", -"QmP*0 Tm*P0 am0TP* 1Pp* >Pp1* p*1TP sP*p1 WmP0) mP0W!) HmP0) Hm0aP) 1W5P) 5", -"W81P) 1HmP) am)1HP QmPW0) P!m0WQ) ZmP0) amPZ0) p1WP) 1W8pP) Zp1P) Zp1sP) P*", -"v0 v+P*0 vHP*0 gvP*0 1Pv* >Pv1* v1HP* >Pg1* vQP*0 P*0v+Q ZvP*0 gvPZ*0 pv1P*", -" pv1>P* Zp*1P 1Py* ,9O 9&,O 9O,B ,O9a ,1O :,O 1O,B ,a:O 9O,K ,9&OK ,O9T ,T9", -"aO ,O9j ,j:O ,O1T :,sO 9*O -9O 9O*B 9a-O ,O1* :-O ,1*OB -a:O *O9K 9O-K 9OT*", -" 9T-O jO9* :O-j ,1T*O sO:- 9E,O ,9&EO ,O9H ,H9aO 1E,O ,E:O ,O1H ,H:O ,9EOK ", -"9&E,OK ,H9TO 9HT,aO ,1jEO :j,EO ,1HjO s,H:O ,O9d 9d-O 9OH* -9gO ,O1d -d:O ,", -"1HdO gO:- ,d9OK -9dOK ,Td9O -T9gO ,1djO :-djO ,1TdO g:s-O 9O,2 ,9&O2 ,9O2B ", -",a9O2 ,O95 ,5:O ,15OB :5a,O ,9O2K 9&O,2K ,T9O2 9TO,a2 ,15jO :5j,O ,1T5O s,5", -":O ,O9; 9;-O ,;9OB -9a;O ,O1; >O:- ,1;OB :->aO ,;9OK -9;OK ,T;9O -T9;O ,1;j", -"O :->jO ,1T;O s-:>O ,9EO2 9&E,O2 ,H9O2 9HO,a2 ,15EO :5,EO ,1H5O :H5,O 9EO,2", -"K EO,29&K 9HO,T2 HO,29Ta 95E,jO ,5j:EO ,HO95T :H5s,O ,d9;O -9d;O ,H;9O g-9;", -"O ,1d5O :->dO ,1H;O g:->O 9dO,;K 9d;-OK ,HO9T; g9;-TO djO,1; ->j:dO ;jO,1H ", -"s->g:O ,P9 ,9P& ,B9P 9a,P ,1P :P, ,B1P ,a:P 9Q,P ,Q9P& 9T,P ,Qa9P 9P,j ,Q:P", -" 1T,P :Ps, 9P* -P9 *B9P 9a-P 1P9* :-P ,1P*B :a-P Q*9P 9Q-P TP9* 9T-P P*9j -", -"Q:P P*j9T :-sP 9W,P ,W9P& 9H,P ,HP9a 1W,P ,W:P 1H,P ,H:P ,W9QP 9WQ,P& ,PZ9 ", -"Z9a,P ,1WPj :WQ,P ,1ZP :PZ, 9d,P 9W-P HP9* -Pg9 1d,P -W:P ,1HdP :-gP ,Qd9P ", -"-W9QP 9PZ* -PZ9 dPj,1 :-WPj Z9*1P :PZ- 9m,P m&P,9 ,m9PB ,am9P 95,P ,5:P ,1m", -"PB :ma,P ,Q9mP ,Q9m&P ,Tm9P 9Tm,aP ,1pP p,:P p9T,P sP,:p 9;,P 9m-P ,;P9B -m", -"9aP 1;,P :->P ,1;PB :-maP ,Q;9P -Q9;P ,T;9P -Tm9P 9Pp* :P-p p9*TP -ps:P ,W9", -"mP ,W9m&P ,Hm9P 9Hm,aP ,1W5P :W5,P ,1H5P :Hm,P 9WQ,mP QmP&,W9 Z9m,P ,amZ9P ", -"p9W,P :pW,P Zp9,P Z:p,P ,Pv9 v9-P v9H,P -vg9P ,1vP :P-v v1,HP :v-gP v9Q,P -", -"v9QP Zv9,P Z-v9P pv9,P :v-pP Zp9P* :-yP 0)CO C0)!O 0)DO Da0)O C)1O 18C)O D)", -"1O 1D8)O C0)OK !K)C0O DT0)O Ta0D)O jO1C) 18CjO) 1DT)O s1D)O C0*O +*C0O *0DO", -" a*0DO *C1O 1+*CO 1OD* 1+D*O *C0OK *C0+OK D*T0O D*0+TO *jC1O 1+C*jO 1D*jO s", -"*1DO C0)EO !E)C0O HD0)O Da0H)O 1CE)O 8CE1)O 1HD)O H8)1DO EK)C0O 0)EOCK! DT0", -"H)O 0)HODTa 1CEjO) C)8O1jE Hj)1DO 1HDs)O d*C0O d*C+0O H*D0O gD*0O 1d*CO 8dC", -"1*O 1H*DO g1D*O *C0dKO C0dO+*K Td0D*O D*Tg0O 1dC*jO dj1*+CO djO1D* g1Ds*O C", -"02)O !)2C0O D0)O2 a0)DO2 15C)O 58C1)O 1D5)O 5D)1aO CKO0)2 0)C2!KO T0)DO2 0)", -"TODa2 15CjO) 5)jO18C 5D)1TO 1D5s)O ;*C0O ;*C+0O D;*0O D;0a*O 1;*CO >*1CO 1D", -";*O >D*1O *C0;OK C0;O+*K T;0D*O a;D*T0O 1;C*jO *jC>O1 ;jO1D* s*1>DO CEO0)2 ", -"0)C2!EO D0)HO2 0)HODa2 5CE1)O 5E1O8C) H5)1DO 5OD81H) 0)C2EKO C)!OE02K 0)HOD", -"T2 DaHO0)T2 5)jO1CE 5j1EC)8O H)Dj15O 15s)HDO ;*Cd0O C0;O+d* D;0H*O D;*g0O 5", -"dC1*O 1d*>CO 1HO5D* g1*>DO C0;OdK* dK+*C0;O T;H*D0O D*g0T;O dj1;*CO dj>*1CO", -" jOH;1D* >Dgs1*O C0P) PC0!) P0D) aP0D) PC1) 1P8C) 1)DP 1DP8) QPC0) PC0Q!) Q", -"DP0) QD0aP) PjC1) Q8C1P) 1QDP) sP1D) *CP0 P*C+0 D0P* aP*D0 1CP* 1+P*C DP1* ", -"aP*1D P*CQ0 +QCP*0 QD*P0 aP0QD* P*j1C P*C1+Q P*j1D sP*1D WPC0) PC0W!) HPD0)", -" WD0aP) 1WPC) W8C1P) 1HPD) aP)1WD QPCW0) QCW0P)! ZDP0) aP0ZD) 1WCPj) QC8P1W", -") Z1DP) Z1DsP) dPC*0 +WCP*0 HP*D0 gPD*0 1W*PC P*C1+W 1HPD* g1PD* QdCP*0 QCd", -"P+*0 Z*DP0 gPDZ*0 dPC1Q* WC*j1+P Z1*DP sPDZ1* mPC0) PC0m)! DmP0) Dm0aP) 1mP", -"C) 8mC1P) 1DmP) am)1DP mPCQ0) P!m0QC) Tm0DP) amDPQ0) p1PC) 1P8pC) pD1P) pD1", -"sP) m*PC0 +mCP*0 Dm*P0 am0DP* 1m*PC >P1*C 1DmP* >PD1* Q;CP*0 QCm*+P0 ;P0QD*", -" m*DP+Q0 p*1PC p*1>PC pD*1P sP1pD* mPCW0) P!m0WC) Dm0HP) amHPD0) 5WC1P) W)8", -"P1mC 1H)5DP H)8m1DP QCW0mP) !Cm)QPW0 DmPZ0) amZPD0) 1WPpC) 18pCWP) pDPZ1) s", -"1pDZP) vP*C0 P*Cv+0 vDP*0 gP*vD0 v1P*C v1*>PC v1DP* >D*g1P P*CvQ0 P*vC+Q0 v", -"DPZ*0 gDZ*vP0 v1Pp*C >*v1pPC Z1PpD* y*1DP b9,O ,b9&O ,O9D ,9cO ,Ob1 ,b:O ,O", -"1D c,:O ,b9OK b9&,OK ,D9TO c9T,O ,1bjO :bj,O ,1DjO s,O:c bO9* b9-O 9OD* -9c", -"O bO1* -b:O ,1D*O :Oc- b*9OK -b9OK bT*9O c-9TO b1*jO :-bjO b1T*O s-:cO ,b9E", -"O b9&,EO ,H9bO c9H,O ,1bEO :b,EO ,1HbO :cH,O b9E,OK b9,&EKO bH9,TO ,H9cTO b", -"1E,jO ,jb:EO ,1ObHj :cHs,O ,db9O -b9dO ,Dd9O c-9gO ,1dbO :-bdO ,1DdO g:c-O ", -"9dOb*K bd9-OK ,DO9Td -T9gcO djOb1* -jb:dO djO,1D s-cg:O ,b9O2 b9&,O2 ,D9O2 ", -"c29,O ,1b5O :b5,O ,1D5O :c5,O b9O,2K bO,29&K 9DO,T2 ,T9c2O b15,jO ,5b:jO ,1", -"Ob5T :c5s,O ,;b9O -b9;O ,D;9O c-9;O ,1;bO :->bO ,1D;O c>:-O 9;Ob*K b;9-OK ,", -"DO9T; -T9c;O ;jOb1* -jb:>O ;jO,1D c>:s-O b9E,O2 EO,2b9& 9HO,D2 ,H9c2O b1E,5", -"O ,5b:EO ,1ObH5 c5,:HO EO,2b9K 9&,KEOb2 HO,2bT9 ,9c2HTO 5E9O,jb ,b:EjO5 ,O1", -"Hb5T sHc5:,O bd9,;O bd9-;O ,HO9D; g-9c;O ,1Ob5d ->b:dO ,1ObH; c>-g:O ,Obd9;", -"K b9-OdK; ,OH;bT9 gTc;-9O ,O1db;j >j:d-bO 1H,;bTO >Og:s-c ,b9P ,P9b& 9D,P ,", -"Pc9 b1,P ,P:b 1D,P :,cP ,Qb9P bQ9,P& ,QD9P cQ9,P ,1QbP :Qb,P ,1QDP sP,:c 9P", -"b* bP-9 DP9* c9-P 1Pb* :b-P ,1DP* c-:P bQ*9P -Qb9P bTP9* c-Q9P P*jb1 :-QbP ", -"P*j9D s-P:c ,Wb9P bW9,P& ,HP9D cW9,P ,1WbP :Wb,P ,1HbP :cW,P bW9,QP WQP&,b9", -" Zb9,P Zc9,P b1W,Pj ,Wj:Pb Zb1,P Z:c,P ,dPb9 -Wb9P ,Dd9P c-W9P ,1dbP :-WbP ", -",1DdP g:Pc- 9QdbP* bQd-P9 Zb*9P Z-c9P b1WP*j :Wb-Pj Zb1P* Z:-cP ,mb9P bm9,P", -"& ,Dm9P cm9,P ,1mbP :mb,P ,1D5P :cm,P bQ9,mP QmP&,b9 9Dm,TP ,TmcP9 pb9,P :p", -"b,P p9D,P cp:,P ,;Pb9 -mb9P ,D;9P c-m9P ,1;bP :-mbP ,1D;P c>P:- 9Q;bP* bQ;-", -"P9 9QD,;P cm9-TP pb*9P -p:bP p9DP* cp-:P bW9,mP WmbP,9& 9Hm,DP ,HmcP9 b1W,5", -"P ,5W:Pb b1H,5P :H,c5P QmbP,W9 ,bP&WQ9m ,DmZ9P cm9Z,P ,1WpbP pbW:P, Z9PpD, ", -"Z:Pcp, vb9,P -vb9P v9D,P cv-9P vb1,P :v-bP v1D,P :vc-P bQ*v9P vb9-QP Z9PvD,", -" Z-9cvP pbPv1, -pb:vP ZbPp9* y:c-P R) R)! R)B Ra) R). R8) .BR) 8aR) RM) M)R", -"! RT) R)aM Rj) R)8M TjR) sR) R* R+* R*B Ra* R*. R8* R.*B 8*Ra R*M +MR* RT* ", -"+TR* R*j +jR* T*Rj sR* RE) !ER) RH) HaR) E)R. 8ER) H)R. R)H8 MER) RME!) R)H", -"M aM)RH jER) R8ME) R)Hj RHs) Rd* +dR* RH* gR* d*R. 8dR* R.H* R8g* dMR* dM*R", -"+ HMR* RTg* djR* R+jd* H*Rj s*gR R)2 !)R2 2BR) a)R2 R5) 58R) 5BR) R)5a M)R2", -" RM)!2 T)R2 aM)R2 R)5M R58M) R)5T R5s) R;* +;R* *BR; a;R* R5* >R* *BR5 Ra>*", -" M;R* M;*R+ T;R* aM;R* 5MR* R*>M 5TR* >Rs* E)R2 RE)!2 H)R2 RHa)2 5ER) R58E)", -" R)H5 RH58) RME)2 ME)R2! RHT)2 RH)aM2 R5ME) 5MER8) RH5T) sRH5) d;R* R+d;* H", -";R* R;g* 5dR* Rd>* H5R* >*gR dM;R* R+dM;* RH;T* gRT;* R5dM* >MRd* RH5T* >Mg", -"R* RP) P)R! P)RB R)aP P)R. R)8P RP).B aP)R8 S) S!) ST) Sa) Sj) S8) TjS) Ss)", -" R*P +PR* RP*B aPR* R.P* 8PR* P*.RB aP*R8 S* S+* S*T Sa* S*j S8* T*Sj Ss* R", -"W) W!R) R)HP R)Wa W)R. R)W8 RHW). RH8W) SW) W!S) SZ) ZaS) WjS) W8S) ZjS) s)", -"SZ RW* +WR* HPR* RWg* R.W* W8R* RH*W. gRW8* Sd* +WS* SZ* gS* W*Sj W8S* SjZ*", -" s*gS Rm) m)R! m)RB R)am R)5P R)8m R5m)B R5am) Sm) m)S! TmS) amS) Sp) p8S) ", -"pTS) s)Sp Rm* +mR* *BRm amR* 5PR* Rm>* R5*mB >PRa* S;* +mS* TmS* amS* Sp* S", -">* STp* s*S> WmR) RWm!) R)Hm RHma) R)5W R5W8) RH5W) RH8m) WmS) S!Wm) ZmS) S", -"Zam) pWS) SpW8) S)Zp SZps) vR* R+v* RHv* g*vR R5v* >*vR vRH5* >PgR* Sv* v+S", -"* ZvS* S*gv pvS* v>S* ZpS* yS* ,R ,R& ,RB ,Ra ,R. ,R8 RB,. R8,a ,RM R&,M ,R", -"T RT,a ,Rj R8,M RT,j sR, ,R* -R *B,R -Ra ,.R* -R8 ,R*.B R8-a R*,M -RM R*,T ", -"-RT R*,j -Rj ,RT*j s-R ,RE ,ER& ,RH RH,a RE,. ,ER8 ,.RH RH,8 RM,E M&E,R RH,", -"T ,RHT& ,ERj ,R8ME RH,j ,RsH ,Rd -Rd RH,d g-R ,.Rd R8-d ,RHd. g8-R Rd,M Rd-", -"M RT,d -RgM Rd,j Rd-j ,RHdj gRs- ,R2 ,2R& RB,2 ,2Ra ,R5 R5,8 RB,5 R5,a RM,2", -" M&2,R ,2RT ,RT&2 R5,M ,R58M R5,T ,Rs5 ,R; -R; RB,; Ra-; R5,; ->R ,R5*B -a>", -"R R;,M R;-M RT,; RT-; R;,j -R>M ,R5T; ->sR RE,2 ,R&E2 ,2RH ,RH&2 ,ER5 ,R58E", -" RH,5 ,RH5a ,RME2 ,REM&2 ,RHT2 aM2,RH ,R5ME M&E,R5 ,RH5T sR,H5 Rd,; Rd-; RH", -",; g;-R R5,d -d>R ,RH5d ->gR ,RdM; -RdM; ,RHT; -RTg; ,R5dM >M-Rd ,RH;j s-Rg", -"> ,RP R&,P RB,P Ra,P RP,. R8,P ,RP.B ,R8aP S, S&, S,T Sa, S,j S8, ,TSj Ss, ", -"R*,P -RP P*B,R Ra-P P*.,R R8-P ,R.P*B -R8aP S*, S- ,TS* S-T ,jS* S-8 S*T,j ", -"S-s ,RW R&,W RH,W RW,a ,.RW RW,8 ,RHW. ,RHW8 S,W ,WS& SZ, Z&S, ,WSj ,WS8 Sj", -"Z, s,SZ RW,d -RW ,RHW* -RgP ,RWd. RW-8 dP.,RH -RWg8 Sd, S-W Z*S, gS- ,dSj -", -"WS8 SZ*,j s-gS ,Rm R&,m RB,m Ra,m R5,m R8,m ,R5mB ,R5am S,m ,mS& ,TSm ,aSm ", -"Sp, p&S, STp, s,Sp Rm,; -Rm ,Rm*B Ra-m ,R5m* -R>P m*B,R5 >P-Ra S;, S-m ,TS;", -" -TS; p*S, S-p Sp*,T s-S> RW,m ,RWm& RH,m ,RHam R5,W ,R5W8 ,RH5W ,RH8m ,WSm", -" S&W,m SmZ, SZ&,m SWp, Sp&,W ZpS, Ss,Zp vR, -vR ,RvH gR-v ,Rv5 v>-R vR,H5 -", -"vRg> Sv, S-v ZvS, SvZ- pvS, Sv-p Sv,Zp y-S RU) U!R) RD) R)Ua U)R. R)U8 D)R.", -" R)D8 UMR) RUM!) VR) RaV) R)Uj R8UM) RjV) VRs) R*U U+R* RD* UaR* R.U* U8R* ", -"R.D* D8R* RUM* R+UM* V*R R+V* U*Rj R+jU* R*Vj V*sR UER) RUE!) R)UH RHUa) RU", -"E). R8UE) RHU). RH8U) RUME) U!MRE) RHV) VRHa) RjUE) U8ERj) VRHj) VsHR) UdR*", -" R+Ud* UHR* RDg* RdU*. R8dU* RH*U. gRU8* dM*RU R+UdM* RHV* V*gR RdjU* U8dR*", -"j VdR*j s*VgR U)R2 RU)!2 D)R2 RDa)2 R)U5 R5U8) R)5D R5D8) RUM)2 U!MR)2 R)V2", -" V2Ra) R5UM) U58Rj) R5V) Vs5R) U;R* R+U;* D;R* R+D;* U5R* R*>U 5DR* RD>* M;", -"*RU R+UM;* R;V* V+R;* R5*Uj >MRU* R5V* >RV* RUE)2 U!ER)2 RHU)2 UH)Ra2 R5UE)", -" U5ER8) RH5U) RH)U5a UMER)2 !ER)UM2 V2RH) RHaV2) U5ERj) REU85M) V5RH) sRHV5", -") RdU;* U+dR;* RH;U* gRU;* R5dU* >RUd* RH5U* g>RU* RdUM;* dMR;U+* VdR;* gVR", -";* U5dR*j Rdj>U* V5dR* V>gR* UP) P)U! R)DP U)aP P)U. U)8P RDP). RD8P) SU) U", -"!S) SV) VaS) UjS) U8S) VjS) s)SV UP* +PU* DPR* aPU* U.P* 8PU* RD*P. aP*U8 S", -"*U U+S* SV* V+S* U*Sj U8S* SjV* s*SV R)UW RWU!) R)WD RWDa) RWU). RW8U) RWD)", -". RWD8) UWS) S!UW) S)VZ SZVa) SUWj) S8UW) SZVj) SsZV) UWR* R+WU* HPU* UPg* ", -"RW*U. RW8U* RWD*. gUP8* UWS* S+UW* Z*SV S*gV SdU*j S8dU* SZ*Vj Ss*gV R)Um R", -"mU!) R)Dm RDma) U)5P R8mU) R5Dm) RD8m) UmS) S!Um) S)Vm SVam) S)pU SpU8) S)V", -"p SspV) UmR* R+mU* DmR* am*RD 5PU* UP>* R5Dm* >PUD* UmS* S+Um* VmS* SV+m* p", -"US* >US* S*Vp S*V> RWUm) UW)Rm! RHmU) am)RWD R5WU) R5)UW8 R5WD) aP)UH5 SUWm", -") UWmS!) SZVm) VZmSa) SpUW) pUWS8) SZpV) VpZSs) R*vU vRU+* RDv* gvRU* vRU5*", -" >PUv* vRD5* >PgU* vUS* SvU+* S*Vv VvgS* Sp*vU S>vU* VvpS* SVy* ,Rb R&,U ,R", -"D cR, ,.Rb Rb,8 ,.RD ,Rc8 Rb,M ,RbM& V,R V,cR Rb,j ,R8bM ,RVj cRs, Rb* -Rb ", -"R*,D c-R R.b* Rb-8 ,RD*. c8-R bMR* Rb-M ,RV* V-R b*Rj Rb-j V*R,j sRV- ,ERb ", -",Rb&E Rb,H ,RcH ,RbE. ,R8bE ,RHb. cRH,8 ,RbME ,RbM&E ,RVH cRV,H ,RjbE ,Rb&j", -"E V,RHj s,VRH Rb,d Rb-d RD,d c-gR ,Rdb. -Rb8d ,RDd. c-Rg8 ,RdbM -RbdM ,RVd ", -"gRV- ,Rdbj -Rjbd Vd,Rj V-gsR ,2Rb ,Rb&2 ,2RD ,Rc2 Rb,5 ,R5b8 R5,D ,Rc5 ,RbM", -"2 ,RbM&2 ,RV2 cRV,2 ,R5bM Rb5,8M ,RV5 s,VR5 Rb,; Rb-; RD,; -Rc; b5R* >R-U ,", -"R5D; ->cR ,R;bM -RbM; ,RV; V;-R ,R;bj >M-Rb V5*,R -RV> ,RbE2 R&E,U2 ,RHb2 c", -"RH,2 ,R5bE ,REU5& ,RHb5 cR5,H RbE,M2 bER2,M& V,RH2 V,HcR2 ,REb5M ,ER5b8M V5", -",RH s,HcR5 ,Rdb; -Rbd; ,RHb; c-Rg; ,R5bd ->Rbd ,R5Dd c>Rg- Rbd,M; Rbd-M; Vd", -",R; V-gR; Rb5,dM -Rb>Md V5d,R V->gR ,UP U&,P RD,P ,RcP ,.UP U8,P ,RDP. cR8,", -"P Sb, ,US& SV, Sc, ,USj ,US8 SjV, s,Sc bPR* -UP ,RDP* -RcP ,UP*. U8-P P*.,R", -"D c-R8P Sb* S-b V*Sb Sc- b*Sj -US8 SV*,j s-Sc Rb,W ,RWU& RW,D ,RcW ,RWb. ,R", -"Wb8 ,RWD. cRW,8 ,USW SbW,& ZbS, S,Zc SbW,j Sb8,W SZb,j Ss,Zc bWR* Rb-W ,RWD", -"d -RcW ,UdP. -RWb8 dP.,RD c-RW8 ,USd -USd ZbS* Z-Sc Sbd,j S-bW8 SZb*j gScs-", -" Rb,m ,RmU& RD,m ,Rcm U5,P ,R8bm ,R5Dm cR5,m ,USm Sbm,& VmS, cmS, pbS, Spb,", -"8 S,Vp S,cp bmR* Rb-m ,RDm* -Rcm ,U5;P -U>P R5D,;P c>R-m ,US; -US; V;S, S;V", -"- pbS* Sb-p Vp*Sb cpS- ,RWbm RW&,Um ,RHbm cRW,m ,R5bW Rb5,W8 ,R5WD cR5,W Sb", -"W,m ,UWS&m SZb,m ScZ,m Spb,W S8WpU, Vp,SZ ScpZ, ,Rvb vR-U ,RvD cR-v vRb,5 -", -"vR>b vRD,5 cvR-> vbS* Sb-v S,Vv cvS- Svbp* -pUSv Vv,Sp Scy- Rk) k)R! k)RB R", -")ak R1) R)8k 1)RB R)1a kMR) RkM!) R)Tk ak)RT lR) R8l) RTl) l)sR R*k +kR* Rk", -"*B akR* R1* 1+R* *BR1 1aR* RkM* k*MR+ TkR* ak*RT l*R R+l* RTl* sRl* kER) Rk", -"E!) R)Hk ak)RH 1ER) R18E) R)1H R1H8) RkME) kMER)! RHTk) RHTak) REl) lR8E) R", -"Hl) lsRH) dkR* dk*R+ HkR* R*gk 1dR* R1+d* 1HR* R1g* dkMR* R+dk*M RH*Tk gRTk", -"* Rdl* l+Rd* RHl* gRl* k)R2 Rk)!2 Rk)2B ak)R2 R)5k R158) R15)B R1a5) RkM)2 ", -"kM)R2! RTk)2 RT)ak2 R5l) lR58) lR5T) lsR5) k;R* k;*R+ k;*RB ak;R* 1;R* R1>*", -" R1;*B >kRa* k;MR* R+kM;* RT;k* RT;ak* R5l* >Rl* l;RT* l>sR* RkE)2 kE)R2! R", -"Hk)2 RH)ak2 R15E) 5kER8) R1H5) ak)RH5 kMER)2 !ER)kM2 Hk)RT2 akHMR)2 lR5E) R", -"58lE) lHR5) sR5lH) dk;R* R+dk;* RH;k* gRk;* R1d5* >kRd* R1H5* >kgR* RdkM;* ", -"dkR;+M* Hk;RT* RT;gk* ldR5* l>Rd* lH;R* gl>R* kP) k!P) P)kB a)kP R)1P 8)kP ", -"kP)1B akP1) Sk) k)S! TkS) akS) Sl) l)S8 STl) l)Ss kP* k*+P *BkP kPa* 1PR* k", -"P8* kP*1B akP1* S*k +kS* TkS* akS* l*S S+l* lTS* l*Ss R)Wk kP)W! H)kP akPH)", -" R)1W R1W8) R1HW) R1Wa) WkS) S!Wk) S)Zk SZak) SWl) Sl8W) l)SZ SslZ) WkR* dk", -"P+* kPH* kPg* 1WR* dkP8* kP*1H gR1W* WkS* S+Wk* ZkS* S*gk Sdl* S8dl* SZl* l", -"*gS R)km km)R! km)RB akmR) R)1m R1m8) R1m)B akP5) kmS) S!km) STkm) Sakm) l)", -"Sp Slp8) SlpT) Sslp) kmR* km*R+ km*RB akmR* 1mR* kP>* kP*5B >kPa* kmS* S+km", -"* S;Tk* Sa;k* Spl* l*S> Sp*lT Ss*l> km)RW RW)km! RHmk) ak)RHm R1W5) km)RW8 ", -"R1Hm) ak)R5W SWkm) km)S!W SZkm) ZkmSa) SlpW) lWpS8) SZpl) lZpSs) R*vk vR+k*", -" vRHk* gvRk* R1v* >kvR* vR1H* >kgP* vkS* Sv+k* SZ*vk gSvk* l*Sv lv>S* lvZS*", -" l*yS ,R9 R&,k RB,k R9,a ,R1 :R, RB,1 ,R:a R9,M ,R9M& R9,T ,RT9a l,R :Rl, ,", -"RlT sRl, R9* -R9 *BR9 R9-a R*,1 :-R ,R1*B :a-R 9MR* R9-M 9TR* R9-T ,Rl* l-R", -" l*R,T sRl- ,ER9 k&E,R R9,H ,RH9a ,ER1 ,R:E R1,H ,R:H ,R9ME ,R9M&E ,RH9T R9", -"H,aM ,RlE :R,lE ,RlH :RHl, R9,d R9-d 9HR* -Rg9 R1,d -R:d ,R1H* :-gR ,Rd9M -", -"R9dM ,RT9d -RTg9 ,Rld -Rld lH*,R gRl- ,2R9 k&2,R ,R92B ,Ra92 R9,5 ,R:5 ,R15", -"B :R5,a ,R9M2 ,R9M&2 ,RT92 ak2,RT ,Rl5 :R5l, l,R5T ls,R5 R9,; R9-; ,R;9B -R", -"9a; R1,; ->:R ,R1;B :-R>a ,R;9M -R9M; ,RT9; -RT9; ,Rl; -Rl> l;,RT s-Rl> ,R9", -"E2 ,REk&2 ,RH92 ak2,RH ,R15E :R5,E ,R1H5 :RH,5 R9E,M2 k&,MRE2 ,R29HM ,2RH9a", -"M l,R5E l,5:RE lH,R5 s,5:RH ,Rd9; -R9d; ,RH9; g-R9; ,R15d :-R>d ,R1H; g:R->", -" R9d,M; R9d-M; R9H,T; -R;g9M ld,R5 l->Rd lH;,R gl->R ,kP k&,P ,BkP ak,P R1,", -"P ,R:P ,R1PB :Ra,P S9, ,kS& ,TS9 ,aS9 l,S S:, lTS, l,Ss 9PR* -kP kP*,B ak-P", -" kP*,1 -R:P k*B,1P :-RaP S9* S-9 9TS* -TS9 S9l* l-S S9*lT s-S: R9,W kP&,W H", -"k,P akP,H R1,W ,R:W ,R1HP :RH,W ,WS9 S9W,& Z9S, SZ9,a S,lW :WS, SZl, S,Z: 9", -"WR* R9-W dkP,H -kgP dkP,1 -R:W ,1HdkP g:R-W ,dS9 -WS9 Z9S* g9S- Sdl, lWS- l", -"Z*S9 gSl- R9,m km&,R ,Rm9B akm,R R1,m ,R:m ,R1mB :Rm,a ,kSm S9m,& S9T,m S9a", -",m Spl, S,:p Sp9,T Ss,:p 9mR* R9-m k;P,B -Rm9a k;P,1 -R:m k;B,1P :-Ram ,kS;", -" -kS; S9;,T S-9Tm S;l, S>l- Sp9T* l-pSs ,RW9m ,RWkm& ,RH9m ,RHakm ,R15W :RW", -",5 ,R1Hm :RH,m S9W,m km&S,W SZ9,m SamZk, Sp9,W S:p,W lZ,Sp S:Zp, ,Rv9 vR-k ", -"vR9,H -vRg9 ,Rv1 :R-v vR1,H :vRg- v9S* S9-v Sv9Z* gS-v9 l,Sv S-lv lv,SZ l-y", -"S UkR) RUk!) R)Dk ak)RD R)1U R1U8) R)1D R1D8) RUkM) U!kRM) RkV) VRak) RUl) ", -"lRU8) VRl) lsVR) RUk* R+Uk* DkR* ak*RD 1UR* R1+U* 1DR* R1+D* k*MRU R+Uk*M R", -"*Vk V+Rk* R*lU l+RU* lRV* s*VlR RUkE) U!kRE) RHUk) RHUak) R1UE) 1UER8) R1HU", -") R1)UH8 UkMRE) !ER)UkM VRHk) ak)VRH lRUE) R8UlE) VlRH) Vs)lHR dk*RU R+Udk*", -" RH*Dk gRUk* R1dU* 1UdR8* R1HU* gR1U* RdUk*M dkR*U+M VdRk* gVRk* ldRU* R8dl", -"*U lH*VR glVR* RUk)2 U!kR)2 RDk)2 RD)ak2 R1U5) 1U5R8) R1D5) ak)R5D UkMR)2 !", -")k2RUM V2Rk) ak)V2R lRU5) R5Ul8) VlR5) V5Rls) k;*RU R+Uk;* RD;k* RD;ak* R1;", -"U* >kRU* R1D5* >kDR* R;Uk*M k;R*U+M V;Rk* ak;V*R l;RU* l>RU* l;VR* V>lR* Uk", -"ER)2 !ER)Uk2 Hk)RD2 R)UHak2 1UER5) RE1U58) R1)UH5 R)1HU5a E)R2UkM U!RME)k2 ", -"RHkV2) akV2RH) R5UlE) RUlE58) V5RlH) lRV5sH) RdUk;* dkR;U+* Hk;RD* RD;gk* 1", -"UdR5* R1d>U* 1UHR5* >D*gR1 dkR;U*M U+R*k;dM RH;V*k gRkV;* R5dl*U >RUld* lHR", -"V5* glRV>* U)kP kP)U! D)kP akPU) 1)UP 1UP8) R1DP) 1UaP) UkS) S!Uk) VkS) SVa", -"k) SUl) SlU8) l)SV SlVs) kPU* kP*U+ kPD* akPU* UP1* kP*U8 kP*1D aP*1U U*Sk ", -"S+Uk* SkV* SV+k* lUS* S8*lU SVl* Ss*Vl kP)UW UW)kP! RWDk) ak)RWD R1WU) kP)U", -"W8 R1WD) aP)1UH SUWk) UWkS!) SZVk) ZkVSa) SlUW) lWUS8) SlVZ) lZVSs) dkPU* U", -"+WkP* dkPD* gUPk* R1WU* 1U+RW* R1WD* g1UP* SdkU* U+WS*k SZ*Vk gSVk* lW*SU S", -"+UlW* lZ*SV glSV* km)UP Um)kP! RDmk) ak)RDm R1mU) km)U8P R1Dm) ak)U5P SUkm)", -" km)S!U SVkm) VmkSa) SlpU) pUlS8) SlVp) VplSs) km*UP U+mkP* km*RD R+Dkm* kP", -"*U5 >kPU* kP*5D >kDP* S;Uk* km*S+U SV;k* S+kVm* Sp*lU S>lU* Vp*Sl S>Vl* RWU", -"km) k!m)RWU km)RWD akRmUH) kP)U5W R)1WU8m kP)UH5 1HRmU8) km)SUW WmS)U!k Zkm", -"SV) akVmSZ) lWUSp) SplWU8) lZSVp) SlVpsZ) vRUk* kP*vU+ vRDk* gR*vDk vR1U* >", -"P*v1U vR1D* >D*vR1 SvUk* vU+S*k VvSk* gSkVv* lvSU* S>Ulv* lvVS* ylVS* tR, ,", -"Rt& ,RtD t,cR ,Rt1 t,:R R1,D :,cR ,RtM tRM,& tRV, tcV,R tRl, t:Rl, lRV, uR,", -" t*R t-R RDt* cRt- R1t* :Rt- t*R1D c-:R R*tM tR-M tRV* -RVt lRt* -Rlt t*VlR", -" u-R ,RtE tR&,E ,RtH tcR,H tR1,E t:R,E tHR,1 t:H,R tRM,E M&EtR, tHV,R cRVtH", -", ltR,E lt,:RE ltH,R ,RuH ,Rtd -Rtd RHt* gRt- tdR,1 t:d-R tH*R1 g:Rt- tdR,M", -" t-RdM tH*VR V-gtR ltd,R l-tRd tH*lR g-uR ,Rt2 tR&,2 tRD,2 tcR,2 ,Rt5 t:R,5", -" t5R,D tc5,R tRM,2 M&2tR, VtR,2 Vt,cR2 t5Rl, lt5:R, t5V,R ,Ru5 ,Rt; -Rt; t;", -"R,D tc;-R R5t* -Rt> t5*RD c>Rt- t;R,M t-RM; t;V,R V-tR; t5*lR l-t>R t5VR* -", -">uR tR,E2 ,R&tE2 tHR,2 cR,tH2 t5R,E :R,t5E tH5,R tH,cR5 ,RMtE2 M&tE,R2 V,Rt", -"H2 V2tc,RH l,Rt5E lRt5:,E tHRV5, uRH,5 tdR,; t-Rd; tH;,R gt-R; t5d,R t>-Rd ", -"tH5R* gt>-R ,Rdt;M -Rdt;M tHRV;, gtRV-; t5Rld, t>Rl-d tHRl;, u->gR tP, ,Pt&", -" ,DtP t,cP ,1tP t,:P tP1,D t:Pc, St, t&S, VtS, S,tc l,St S,t: SVl, uS, tP* ", -"t-P DPt* c-tP 1Pt* :-tP tP*1D t-P:c St* S-t t*SV StV- l*St Stl- St*Vl u-S ,", -"RtW tWR,& ,HtP tcW,R tWR,1 t:W,R tHP,1 t:H,P S,tW StW,& S,tZ ScZt, Stl,W S:", -"t,W lZ,St SZu, ,dtP -RtW HPt* gPt- tW*R1 t-W:R tHP1* gtP:- tWS* Sdt- S*tZ S", -"-gt Stdl* l-StW tZ*Sl gSu- ,Rtm tmR,& tmR,D tcm,R ,5tP t:m,R t5P,D tc5,P tm", -"S, Stm,& SV,tm Sct,m S,tp S:pt, Vp,St Spu, ,;tP -Rtm tm*RD t-mcR 5Pt* >Pt- ", -"t5PD* t>Pc- tmS* S;t- St;V* V-mSt S*tp tpS- tp*SV S-up tWR,m ,RWtm& tHm,R t", -"H,cRm t5W,R t5,:RW tH5,P tH,:Rm StW,m tWmS&, tZS,m tZmSc, tpS,W tpWS:, tZpS", -", uZ,Sp vRt* tP-v tvR,H cvRt- tvR,1 :vRt- tH5P* :vRc- S*tv tvS- Vv,St V-vSt", -" lvtS* l-vSt Vv,Sl y-uS X X! XB aX X. 8X X.B 8Xa XK XK! TX TXa Xj 8Xj TXj s", -"X X( +X X(B +Xa X(. +X8 .BX( +8aX X(K +XK TX( +TX Xj( +Xj T(Xj sX+ GX GX! H", -"X GaX GX. G8X HX. H8X GXK XKG! GTX TXGa GjX 8XGj HXj sGX dX +GX HXd gX dX. ", -"8dX H.dX gX8 dXK GK+X TdX gXT dXj Gj+X dXHj gsX X2 X2! X2B aX2 5X 5X8 5XB 5", -"aX X2K 2KX! TX2 T2aX 5Xj 58Xj 5TX sX5 X; +X; X;B aX; 5X; >X 5BX; >Xa X;K +K", -"X; TX; T;+X X;j >Xj T;5X >Xs GX2 X2G! HX2 G2aX G5X 5XG8 H5X 5aHX X2GK GX2!K", -" G2TX aX2GT 5XGj G58Xj 5THX G5sX G;X G;+X HX; gX; 5dX >XG 5dHX >Xg GKX; dXK", -"+; TXG; TXg; dj5X Gj>X Td5X gs>X XP XP! XPB aXP XP. 8XP P.XB aX8P QX QX! QX", -"T QaX QXj Q8X XjTP sXQ XP( +XP P(XB aX+P P(X. 8X+P XP(.B aXP+8 QX( +QX Q(TX", -" Qa+X Q(Xj Q8+X Xj(TP +QsX Y Y! YH Ya Y. Y8 YH. Y8H YQ YQ! YZ YZa Yj Y8Q YZ", -"j sY Yd Y+ YHd gY Yd. Y+8 HdY. gY8 YQd Y+Q YZd gYZ Yjd Y+j ZdYj sYg Xm Xm! ", -"XmB aXm 5Xm 8Xm 5BXm aX5P QXm Q!Xm TXm aXTm pX pX8 pXT spX Xm; +Xm XB;P aX+", -"m X;5P >Xm Xm;5B aX>P QX; QX+m TXQ; TX+m pX; >Xp TXp; sp>X Ym Ym! YHm Yam Y", -"5 Y58 Y5H Y5a YQm Q!Ym YZm ZaYm Yp Yp8 YpZ sYp Yv Yv+ YvH gYv Yv5 Y> vHY5 Y", -">g YvQ v+YQ YZv YZgv Ypv Y>p ZpYv yY X# X& X#B aX& X#. 8X& .BX# 8aX& X#K X&", -"K TX# TX& Xj# X&j T#Xj sX& X#( +X& #BX( +aX& #(X. +8X& X#(.B aX&+8 #(XK +KX", -"& X#T( T&+X j#X( X&+j Xj#T( +Xs& GX# G&X HX# HX& X#G. 8XG& X#H. 8XH& X#GK G", -"KX& G#TX TXG& G#Xj X&Gj H#Xj G&sX dX# dX& H#dX gX& X#d. d&8X dX#H. 8Xg& X#d", -"K dKX& T#dX TXg& d#Xj X&dj dXjH# g&sX X#2 X&2 2BX# X2a& 5X# 5X& X#5B aX5& 2", -"KX# &2XK X#T2 T2X& 5#Xj Xj5& 5#TX 5Xs& X;# X;& ;#XB X&a; 5#X; >X& X;#5B aX>", -"& ;#XK XK;& T#X; X;T& X#;j X&>j X;jT# >&sX X#G2 G2X& X#H2 H2X& G#5X 5XG& H#", -"5X 5XH& GX#2K X&2GK GTX#2 GT&X2 Xj#G5 X&jG5 G5TX# sX5G& G#X; X;G& H#X; X;g&", -" 5#dX G&>X H5Xd# >&gX dX#;K dX&;K GT;X# gXT;& dXj5# >XG&j X;jH# >Xgs& XP# X", -"&P P#XB X&aP P#X. X&8P XP#.B aXP8& QX# QX& Q#TX TXQ& Q#Xj 8XQ& Xj#TP QXs& P", -"#X( X&+P XP#(B aXP+& XP#(. X&P+8 P#(X.B +X8aP& X#Q( Q&+X QXT#( +QXT& Xj#Q( ", -"X&j+Q TX#Pj( sX+Q& Y# Y& YH# Ya& Y#. Y8& H#Y. H8Y& YQ# Y&Q YZ# YZ& Yj# Y&j ", -"ZjY# sY& Yd# Y+& HdY# gY& d#Y. 8dY& YHd#. g8Y& QdY# +QY& ZdY# Y&gZ djY# +jY", -"& YZdj# Y&gs Xm# Xm& m#XB X&am 5#Xm Xm5& Xm#5B aXm5& Q#Xm XmQ& T#Xm XmT& pX", -"# pX& TXp# p&sX X#;P X&+m Xm;#B aXm;& Xm;5# Xm>& 5X#;PB >Xam& Q#X; X;Q& QX;", -"T# aX;Q& X;p# p&>X pXT;# >Xps& Ym# Y&m HmY# HmY& Y5# Y5& H5Y# H5Y& QmY# Q&Y", -"m ZmY# YmZ& Yp# Yp& Y#Zp Y&sp Yv# Yv& vHY# Y&gv v5Y# Y>& YvH5# Y&g> vQY# YQ", -"v& Y#Zv ZvY& Y#pv pvY& YZvp# yY& IX IX! DX DXa IX. 8IX DX. D8X IXK I!XK DXT", -" aITX IjX Ij8X DXj sIX IX( +IX DX( +DX X(I. 8I+X X(D. D8+X X(IK IX+K D(TX D", -"X+T I(Xj Ij+X D(Xj +DsX GIX IXG! JX JaX IXG. GI8X JX. J8X IXGK GIX!K JTX TX", -"Ja GIXj IjXG8 JjX sJX IdX Id+X JdX gJX I.dX Id8X dXJ. J8gX IXdK IdX+K TdJX ", -"JTgX dXIj Idj+X dXJj gXsJ IX2 I!X2 DX2 I2aX 5IX 8I5X 5DX D85X X2IK IX2!K I2", -"TX aX2TI Ij5X IjX58 DX5T 5DsX I;X I;+X DX; D;+X I;5X >XI D;5X >XD IKX; I;X+", -"K TXD; aX;TI X;Ij Ij>X X;Dj sI>X IXG2 GIX!2 JX2 aXJ2 GI5X G58IX J5X 5aJX GI", -"X2K IX2GK! TXJ2 JTaX2 IjXG5 G58IjX 5TJX J5sX dXI; IdX+; J;X J;gX Id5X Id>X ", -"5dJX J>X IdX;K +GIX;K TXJ; gJTX; Idj5X >IjdX X;Jj >XsJ IP IP! DXP aIP IP. 8", -"IP D.IP 8IDP QIX Q!IP QDX DXQa IPj 8IQX DjQX sIP IP( +IP D(IP DX+P P(I. 8I+", -"P IP(D. +DX8P Q(IP QI+X Q(DX QD+X I(Pj IP+j IPjD( +IsP YI YI! YJ YJa YI. Y8", -"I YJ. YJ8 YQI QIY! YZJ ZJYa YjI Q8YI YJj sYJ YId Y+I YJd gYJ IdY. +IY8 JdY.", -" Y8gJ QIYd +QYI YdZJ YZgJ IdYj +IYj YdJj sJgY ImX I!Xm DXm aXDm 5IP 8I5P DX", -"5P 8XDm ImQX ImXQ! DmQX aXmQD pIX 8IpX pDX pDsX I;P Im+X I;DP DX+m I;5P >PI", -" I;P5D DX>P I;QX I;P+Q DXQ; aX;QD I;pX pI>X DXp; sI>P YIm ImY! YJm JmYa Y5I", -" 5IY8 YJ5 J5Y8 QIYm YQIm! JmYZ YZJam YpI pIY8 JpY JpsY YvI vIY+ JvY JvgY vI", -"Y5 Y>I Y5Jv Y>J YQvI Yv+QI YZJv gYZJv pIYv pIY> JvYp yJY bX bX& bXD cX bX. ", -"b8X b.DX cX8 bXK bKX& bTX cXT bXj 8Xbj DXbj scX bX( b+X b(DX cX+ X(b. +Xb8 ", -"bXD(. +Xc8 X(bK bK+X b(TX +TcX b(Xj +Xbj bTXj( s+cX bGX G&bX JbX cJX GXb. G", -"8bX bXJ. J8cX GXbK I&KGX bTJX JTcX GjbX I&jGX bXJj cJsX bdX +GbX bdJX gcX b", -".dX 8dbX JbdX. g8cX bKdX dX&bK TdbX gTcX dXbj IdjX& JjbdX scgX bX2 b2X& b2D", -"X cX2 b5X 5Xb8 5DbX c5X X2bK I&2XK b2TX TXc2 5Xbj I&j5X 5TbX c5sX bX; +Xb; ", -"DXb; cX; 5Xb; >Xb b5XD; c>X bKX; I;&XK TXb; TXc; X;bj bX>j X;jbT sc>X GXb2 ", -"I&2GX bXJ2 JXc2 G5bX bG58X b5JX J5cX bGX2K bG2X&K JbTX2 cJTX2 bG5Xj bG5X&j ", -"J5bTX sJc5X G;bX I;&dX bXJ; c;gX 5dbX bG>X J5bdX gc>X bG;XK IdKX;& J;bTX cJ", -";TX dXjb5 >XbGj J;jbX J>scX bXP IP& DXbP cXP b.IP 8IbP IP.bD 8IcP bQX Q&bX ", -"QDbX cQX QXbj Q8bX IPjbT cQsX b(IP +IbP IP(bD +IcP IP(b. IP&+8 DX(bP. cX+8P", -" b(QX +QbX bQXD( +QcX IPjb( IP&+j Ij(bTP sIPc+ Yb Yb& YJb Yc Yb. Yb8 JbY. Y", -"c8 YbQ bQY& YZb YcZ Ybj bQY8 ZbYj sYc Ybd Yb+ JbYd Ycg bdY. b+Y8 YJbd. Y8gc", -" bQYd b+YQ YdZb ZcgY bdYj b+Yj YZbdj gsYc bXm XmI& DXbm cXm 5IbP 8Xbm b5XDm", -" 5IcP QXbm Im&QX TXbm QXcm pbX b8pX bTpX cpX I;bP +Xbm I;PbD +Xcm I;Pb5 bX>", -"P 5DXb;P cX>P QXb; I;PQ& I;PbT QXc; bXp; pb>X pbXD; >Xcp Ybm bmY& JmYb Ycm ", -"Yb5 b5Y8 J5Yb Yc5 bQYm YbQm& YmZb cmYZ Ypb pbY8 YbJp Ycp Yvb vbY+ YbJv Ycv ", -"vbY5 Y>b YJ5vb Yc> YQvb Yvb+Q ZvYb YZcv pvYb p>Yb JpYvb yYc X0 X0! X0B aX0 ", -"1X 1X8 1XB 1aX X0K !KX0 TX0 T0aX 1Xj 18Xj 1TX sX1 X0( +X0 0BX( +0aX 1X( 1+X", -" X(1B +X1a 0(XK X0+K X0T( +0TX 1(Xj +j1X 1(TX 1+sX GX0 X0G! HX0 G0aX 1GX G8", -"1X 1HX Ga1X X0GK GX0!K G0TX aX0GT Gj1X 1G8Xj GT1X 1GsX dX0 +0dX H0dX gX0 1d", -"X +G1X HX1d g1X X0dK dX0+K T0dX TXg0 dj1X dXj1+ Td1X sXg1 X02 !0X2 2BX0 X2a", -"0 1X5 158X 1B5X 5a1X 2KX0 X02!K X0T2 aX0T2 15Xj 1X58j 5T1X 1Xs5 X;0 +0X; ;0", -"XB a0X; 1X; >X1 1BX; 1a>X ;0XK X;0+K T0X; aX;T0 Xj1; 1X>j TX1; s1>X X0G2 GX", -"0!2 X0H2 aX0G2 G51X 1G58X H51X 1Ga5X GX02K X02GK! GTX02 GT0aX2 1G5Xj G581Xj", -" 1GT5X sX1G5 G0X; dX0+; H0X; X;g0 G;1X 1G>X HX1; g1>X dX0;K +G0X;K GT;X0 gX", -"T;0 dXj1; >X1Gj X;j1H >Xgs1 XP0 X!P0 P0XB XPa0 1XP 8X1P XP1B aX1P QX0 X0Q! ", -"Q0TX Q0aX 1QX Q81X QX1T 1QsX P0X( XP+0 XP0(B aXP+0 XP1( +X1P 1XP(B 1+XaP X0", -"Q( +0QX QXT0( +QXT0 1(QX +Q1X 1QXT( sX1+Q Y0 Y0! YH0 Ya0 Y1 Y18 Y1H Y1a YQ0", -" Q!Y0 YZ0 ZaY0 Y1Q 1QY8 YZ1 sY1 Yd0 Y+0 HdY0 gY0 Y1d Y1+ 1HYd gY1 QdY0 +QY0", -" ZdY0 g0YZ 1QYd 1+Yj YdZ1 g1sY Xm0 X!m0 m0XB a0Xm 1Xm 8X1m 1BXm aX1m Q0Xm X", -"m0Q! T0Xm aXmQ0 pX1 1Xp8 1TpX s1pX X0;P +0Xm Xm;0B aXm+0 Xm1; 1X>P 1Xm;B >X", -"1am Q0X; +QXm0 QX;T0 aX;Q0 1Xp; p1>X pX1T; >Xps1 Ym0 m0Y! HmY0 amY0 Y15 1mY", -"8 1HY5 1aY5 QmY0 YQm!0 ZmY0 YZam0 Yp1 p1Y8 ZpY1 Y1sp Yv0 v+Y0 vHY0 g0Yv Yv1", -" Y>1 YHv1 g1Y> vQY0 Yv+Q0 Y0Zv gYZv0 pvY1 p>Y1 ZvY1 yY1 9X 9X& 9XB 9aX 9X1 ", -":X 1B9X :Xa 9XK 9KX& 9TX TX9a 9Xj :Xj 1T9X s:X 9X( 9+X X(9B +X9a 9(1X :X+ 9", -"X1(B +X:a X(9K 9K+X 9(TX +T9X 9(Xj +X:j 9TX1( s+:X 9GX G&9X 9HX Ga9X 1G9X :", -"GX 1H9X :HX GX9K X&K9G GT9X 9GTaX Gj9X Gj:X HX9j :GsX 9dX +G9X HX9d g9X 1d9", -"X :dX 9HX1d g:X 9KdX dX&9K Td9X 9TgX dX9j dX:j dXj9H s:gX 9X2 92X& X29B 92a", -"X 95X :X5 9B5X 5a:X X29K X&29K 92TX 9TX&2 5X9j 5X:j 5T9X s5:X 9X; +X9; 9BX;", -" aX9; 1X9; >X: 95X;B :a>X 9KX; X;&9K TX9; aX;9T X;9j >j:X X;j9T s:>X GX92 X", -"&29G 92HX 9GaX2 G59X G5:X H59X H5:X 9GX2K 9G2X&K 9GTX2 aX29GT 9G5Xj :G5Xj 9", -"G5TX :HXs5 G;9X dX&9; HX9; 9Xg; 5d9X :G>X 9H5dX >Xg: 9G;XK d&K9X; 9GTX; g9X", -"T; dXj95 :>GXj X;j9H g:Xs> 9XP X&9P XP9B aX9P 1X9P :XP 9X1PB aX:P 9QX Q&9X ", -"QX9T Qa9X 1Q9X :QX 9QX1T :QsX XP9( +X9P 9XP(B 9+XaP 9X1P( +X:P 1X(9PB :X+aP", -" 9(QX +Q9X 9QXT( 9+QTX 9QX1( +Q:X Xj(9TP :QXs+ Y9 Y9& Y9H Y9a Y91 Y: 9HY1 Y", -":H Y9Q 9QY& YZ9 Z9Ya Y9j Y:Q Z9Y1 sY: Y9d Y9+ 9HYd gY9 9dY1 Y:+ Y91Hd Y:g 9", -"QYd 9+YQ YdZ9 YZg9 9dYj :QY+ YZ91d gYZ: 9Xm X&9m 9BXm aX9m 1X9m :Xm 95XmB a", -"X:m QX9m Xm&9Q TX9m aXm9Q p9X :pX 9TpX sX:p Xm9; +X9m 9Xm;B aXm9+ 95X;P :X>", -"P X;B95P :Xm>a QX9; X;&9Q 9QXT; aX;9Q 9Xp; >X:p p9XT; :pXs> Y9m 9mY& 9HYm 9", -"aYm Y95 Y:5 9HY5 :HY5 9QYm Y9Qm& YmZ9 YZ9am Yp9 Y:p ZpY9 YpZ: Yv9 v9Y+ YHv9", -" Yvg9 v9Y1 Y:v Yv91H gY:v YQv9 Yv9+Q ZvY9 gY9Zv pvY9 Yp:v Yp9Zv yY: IX0 I!X", -"0 DX0 D0aX 1IX 8I1X 1DX D81X X0IK IX0!K D0TX aX0TI Ij1X IjX18 DX1T 1DsX X0I", -"( IX+0 X0D( +0DX IX1( +I1X 1(DX +D1X IX0(K +IX0K DXT0( +DXT0 IjX1( 1+IXj 1D", -"XT( sI1+X IXG0 GIX!0 JX0 aXJ0 GI1X 1G8IX J1X 1aJX GIX0K IX0GK! TXJ0 JTaX0 I", -"jX1G 1G8IjX 1TJX J1sX I0dX IdX+0 dXJ0 JXg0 Id1X 1+GIX 1dJX J1gX IdX0K +I0dX", -"K JTdX0 gJTX0 Idj1X 1+IdXj J1TdX sJg1X X0I2 IX0!2 X0D2 aX0I2 5I1X 1I58X 5D1", -"X 1DX5a IX02K X02IK! DXT02 TI0aX2 IjX15 5I81Xj 1DX5T sI15X I0X; I;X+0 D0X; ", -"aX;D0 I;1X 1I>X DX1; 1D>X I;X0K +I0X;K DX;T0 aX0TI; I;j1X >I1Xj X;j1D >Xs1D", -" GIX02 IX0G2! X0J2 JaX02 1G5IX G581IX 1XJ5 J158X IX0G2K I!X2G0K JTX02 aX0JT", -"2 1G5IjX Ij1XG58 J15TX sJ15X IdX;0 +GIX;0 X;J0 gJX;0 1G;IX >I1dX 1XJ; J1>X ", -"dX0I;K Id+X;0K J;TX0 gXTJ;0 1IdX;j Idj>X1 J1;TX J>s1X IP0 I!P0 D0IP a0IP 1I", -"P 8I1P DX1P aI1P Q0IP IP0Q! Q0DX QDXa0 QI1X IPj18 QD1X 1IsP P0I( +0IP IP0D(", -" +DXP0 1(IP +I1P 1DXP( 1+DIP IP0Q( +QIX0 QDX0( +QDX0 IPj1( IPj1+ 1QDX( sIP1", -"+ YI0 I0Y! YJ0 JaY0 Y1I 1IY8 YJ1 J1Y8 QIY0 YQI!0 Y0ZJ YZJa0 1QYI Y1Q8I ZJY1", -" Y1sJ IdY0 +IY0 JdY0 g0YJ 1IYd 1+YI YdJ1 YJg1 YQId0 Y+QI0 YZJd0 gYZJ0 Y1QId", -" Y1+QI YZ1Jd gY1sJ I0Xm ImX!0 D0Xm aXmD0 5I1P 1Im8X DX1m aXm1D ImXQ0 QI0Xm!", -" QDXm0 aX0TIm 1IpX pI81X 1DpX sIPp1 I0;P I;P+0 I;PD0 a;PI0 I;1P 1I>P I;P1D ", -">XD1m I;PQ0 Im0+QX I;PT0 aX0QD; pI1X; >Xp1I pDX1; sIP>1 ImY0 YIm!0 Y0Jm YJa", -"m0 1IY5 Y158I J1Y5 YJ15a YQIm0 Im0YQ! YZJm0 ZJmYa0 pIY1 Yp18I Y1Jp JpsY1 Y0", -"vI Yv+I0 Y0Jv gYJv0 vIY1 >IY1 Y1Jv Y1J> YvQI0 vIQY+0 YZvJ0 JvZgY0 Yv1pI Y>p", -"1I JpYv1 YJy1 bX9 I&9X 9DX cX9 b1X :IX 1DbX :cX bK9X I&K9X 9TbX 9TcX 9Xbj b", -"X:j 1TbX :csX b(9X 9+bX 9(DX 9+cX b(1X b+:X b1XD( :+cX bX9(K b+X9K bTX9( cX", -"9+T b1Xj( :I+Xj b1TX( :cXs+ 9GbX bG9X& J9X J9cX 1GbX bG:X b1JX :JX bG9XK bG", -"9X&K 9TJX cJ9TX b1GXj :GbXj 9XJj sX:J 9dbX dX&9I 9dJX cXg9 1dbX bd:X J91dX ", -"gX:J bdX9K IdK9+X J9TdX gJ9TX Idj9X :IdXj J9jdX g:XsJ b29X I&29X 92DX 9Xc2 ", -"95bX b5:X 5D9X c5:X bX92K 9I2X&K bTX92 cX9T2 b1X5j :I5Xj b1T5X :cXs5 9Xb; I", -";&9X DX9; 9Xc; 1Xb; :I>X b1XD; :c>X bX;9K I;K9+X bTX9; cX;9T I;j9X :>IXj X;", -"j9D c>Xs: bG9X2 bG9X&2 9XJ2 cJ9X2 b1G5X :Gb5X 95JX J5:X 9G2bXK bK9GX&2 J9TX", -"2 J9TcX2 9G5bXj bG5:Xj J95TX :Js5X bG;9X 9+GbX; 9XJ; cJ;9X b1GX; :>GbX J95d", -"X >X:J IdK9X; X;G&9IK J9;TX cXTJ9; b1GX;j >Ij:dX J9;Xj :J>sX 9IP I&9P DX9P ", -"9IcP 1IbP :IP b1XDP cX:P 9QbX IP&9Q QD9X 9QcX 1QbX bQ:X IPj9D :IsP 9(IP +I9", -"P 9DXP( cX9+P b1XP( +I:P b1DIP( :cX+P bQX9( b+Q9X 9QDX( cQX9+ IPj9( :QI+X I", -"P(b1T sIP:+ Yb9 9IY& YJ9 Yc9 Yb1 Y:b J9Y1 Y:J bQY9 Yb9Q& ZJY9 Y9Zc b1Yj :QY", -"b ZbY1 Z:Yc bdY9 b+Y9 YdJ9 g9Yc b1Yd :IY+ YJ91d gY:J Yb9Qd Yb+9Q YZb9d gY9Z", -"c Yb1Qd Y:b+Q YZb1d sY:gJ 9Xbm Im&9X DX9m 9Xcm 1Xbm bX:m b1XDm cX:m bQX9m 9", -"QIXm& bTX9m cQX9m b1pX pb:X 9DpX :Xcp I;9P I;P9+ I;P9D cXm9+ I;Pb1 :I>P 95D", -"I;P c>X:m I;P9Q 9+QI;P I;P9T cQX9; pbX9; :pI>X p9DX; cpX:> bmY9 Yb9m& JmY9 ", -"cmY9 b1Y5 :IY5 J9Y5 Y5:J Yb9Qm Im&Y9Q YZb9m YcZ9m pbY9 Yb:p Y9Jp cpY: vbY9 ", -"Yvb9+ Y9Jv Y9cv vbY1 Yb:v Jv9Y1 :JY> Yvb9Q Y9QvI& Jv9YZ YcvZ9 Ypbv9 :vIYp J", -"p9Yv Y:yJ RX RX! RXB RaX RX. R8X X.RB 8XRa XM XM! RTX aXM RjX 8XM TXRj sRX ", -"RX( R+X X(RB +XRa X(R. +XR8 RX(.B R+8aX XM( +XM R(TX +XRT R(Xj +XRj XM(Tj R", -"+sX RG RG! RGH RGa RG. RG8 R.HX G8RH RGM R!GM RGT GTRa RGj G8Rj GTRj sRG RG", -"d R+G HXRd gRG R.dX +GR8 dX.RH RGg8 dXM +MRG GTRd gXM GjRd +GRj dXMHj sRgX ", -"RX2 X2R! X2RB R2aX R5X 5XR8 RB5X 5XRa XM2 M!X2 R2TX X2aM 5XM 8X5M 5XRT R5sX", -" R;X +XR; RBX; aXR; 5XR; >XR X;BR5 Ra>X XM; X;+M TXR; XMa; X;Rj >XM XM;5T s", -"R>X RG2 G2R! R2HX R2Ga RG5 G5R8 G5RH G5Ra R2GM XM2G! R2GT aXMG2 G5Rj RG58M ", -"G5RT RGs5 RG; +GR; G;RH RGg; G5Rd >RG RG5H; gR>X GMR; dXM+; GTR; XMg; G;Rj ", -"RG>M dXMH5 gX>M RXP XPR! XPRB RXaP XPR. RX8P RXP.B aXPR8 SX S!X STX SaX SXj", -" S8X TXSj SsX XPR( RX+P RXP(B aXPR+ RXP(. R+8XP XP(R.B R+8aXP SX( S+X TXS( ", -"+TSX XjS( +XS8 STXj( S+sX YR YR! YRH YaR YR. Y8R RHY. RHY8 SY SY! SZY SYa S", -"Yj SY8 YjSZ sYS YRd Y+R RHYd gYR RdY. R+Y8 YRHd. Y8gR SYd SY+ YZSd gSY YjSd", -" Y+S8 SZYdj sYgS RmX R!Xm RBXm aXRm 5XRm 8XRm XmBR5 aXmR5 SXm XmS! TXSm aXS", -"m SpX pXS8 STpX sXSp XmR; +XRm Xm;RB aXmR+ Xm;R5 Rm>X R5X;PB >XRam S;X +XS;", -" TXS; aXS; pXS; S>X SpTX; >XSs YRm RmY! RHYm RaYm Y5R R5Y8 RHY5 R5Ya SYm Ym", -"S! SmYZ SmYa YpS S8Yp SZYp YpSs YvR vRY+ YHvR YvgR vRY5 Y>R YvRH5 gRY> SvY ", -"YvS+ YZSv SvgY YpSv S>Y SZpYv yYS RX# R&X X#RB aXR& X#R. 8XR& RX#.B aX&R8 X", -"M# XM& R#TX TXR& R#Xj X&Rj XM#Tj R&sX X#R( +XR& RX#(B aX&R+ RX#(. R+8X& X#(", -"R.B R+8aX& M#X( X&+M XM#T( aXM+& XM#j( XM&+j RT#Xj( sX+R& RG# RG& R#HX GaR&", -" G#R. G8R& RGH#. RG8H& R#GM GMR& R#GT GTR& R#Gj G&Rj RGTj# RGs& R#dX +GR& d", -"X#RH RGg& dX#R. dX&R8 RH#dX. gRG8& d#XM XMd& dXMH# XMg& dXMj# dXM&j dX#RHj ", -"gsRG& X#R2 R2X& RX#2B aX&R2 R#5X 5XR& R5X#B R5aX& M#X2 X2M& XM#T2 aXM&2 5#X", -"M XM5& R5TX# sX5R& R#X; X;R& X;#RB aX;R& X;#R5 R&>X R5#X;B >XRa& X#M; M;X& ", -"XM;T# aXM;& XM;5# XM>& X;#R5T >XsR& G#R2 R2G& RGH#2 RGa&2 R#G5 G5R& RG5H# R", -"G5H& XM#G2 XM&G2 RGT#2 XM&H2 RG5M# XM&G5 RG5T# sRG5& R#G; G;R& RG;H# gRG;& ", -"RG5d# RG>& dX#RH5 >XgR& dXM;# dXM;& XM;H# gXM;& dXM5# >XMG& dX#R5T >XgM& XP", -"R# RXP& RXP#B aXPR& RXP#. X&PR8 XP#R.B R8aX&P SX# S&X TXS# TXS& XjS# 8XS& S", -"TXj# S&sX RXP#( X&PR+ XP#R(B R+aX&P XP#R(. R+8X&P .BR(XP# aXR&+P8 X#S( +XS&", -" STX#( S+TX& SXj#( S+8X& Xj#ST( Ss+X& YR# Y&R RHY# RHY& R#Y. R8Y& YRH#. Y8R", -"H& SY# SY& S#YZ YZS& S#Yj Y8S& SZYj# S&sY RdY# R+Y& YRHd# Y&gR YRd#. Y+R8& ", -"RHdY#. gYR8& YdS# Y+S& SZYd# S&gY SYdj# SY+&j YZjSd# gSsY& R#Xm XmR& Xm#RB ", -"aXmR& Xm#R5 Xm&R5 R5#XmB R5aXm& XmS# XmS& STXm# SaXm& S#pX pXS& SpTX# Sp&sX", -" Xm;R# Xm&R+ Rm#X;B RamX;& R5X;P# >XRm& 5#XmR;B aXm>R& X;S# X;S& S;TX# Sa;X", -"& SpX;# S&>X pXTS;# S>sX& RmY# RmY& YRHm# YaRm& R5Y# R5Y& Y5RH# Y5aR& YmS# ", -"SmY& SZYm# SZ&Ym S#Yp S&Yp SZpY# Yp&Ss Y#vR vRY& YvRH# gYvR& YvR5# >RY& vRH", -"Y5# Y>gR& S#Yv YvS& YZvS# Sv&gY SvpY# S&Y> YpZSv# SYy& [ [! [D [a [. [8 [D.", -" [8D [M [!M V[ V[a [j [8M V[j [s [( [+ [D( [+D [(. [+8 D([. +D[8 [M( [+M V[", -"( V[+ [j( [+j V([j [s+ [G [!G [J [Ja [G. [8G [J. J8[ [GM GM[! VJ[ [aVJ [jG ", -"G8[j Jj[ [sJ [d [+G [Jd g[ [d. [8d J.[d g[8 [dM +G[M V[d g[V [dj +G[j [dJj ", -"g[s [2 [!2 [D2 [a2 [5 [58 [5D [5a [M2 M2[! V[2 V2[a [5M 5M[8 V[5 [s5 [; [+;", -" [;D [a; [5; [> 5D[; [>D [;M +M[; V[; [+V; [;j [>M [5V; V>[ [G2 G2[! [J2 J2", -"[a [5G G5[8 J5[ [5J8 GM[2 [!GM2 V2[J VJ[a2 G5[j [5G8M V[J5 J5[s [d; +G[; J;", -"[ g[; [5d [>G [5J; g[> GM[; [+GM; V[J; V;g[ G;[j [d>M [5Vd V>g[ [P [!P [DP ", -"[aP [P. [8P DP[. D8[P S[ S[! SV[ S[a S[j S[8 [jSV [sS [P( [+P DP[( +D[P P([", -". +P[8 [DP(. [+D8P S[( S[+ S(V[ V[S+ S([j [+S8 SV[j( S+[s [Y [Y! YJ[ Ya[ [Y", -". Y8[ Y.[J [JY8 S[Y S![Y ] ]a Yj[ Y8S[ ]j ]s [Yd Y+[ [dYJ g[Y Y.[d [+Y8 YJ[", -"d. Y8g[ S[d Y+S[ ]d ]g [dYj [+Yj ]jd ]gs [m [m! [mD [am [5m [8m 5D[m 5a[m S", -"[m S![m V[m [aVm [p [p8 [pV [ps [m; [+m Dm[; +D[m 5P[; [>m [5D;P [a>P S[; [", -"+S; V[S; [+Vm [p; S>[ V;[p [pV> [Ym Ym[! Jm[ [aJm Y5[ [5Y8 [JY5 [5Ya [mSY S", -"[Ym! ]m ]am [pY Y8[p ]p ]ps [v [v+ [vJ g[v [v5 Y>[ J5[v Y>g[ [vS S+[v ]v ]g", -"v [pv [pY> ]pv ]y [b [& [bD [c [b. [8b bD[. [c8 [bM [&M V[b [cV [jb [&j Vb[", -"j [sc [b( [+b bD[( [c+ b([. b+[8 [bD(. c+[8 bM[( b+[M [bV( V+[c bj[( b+[j V", -"[bj( [+sc [bG [&G [Jb [cJ bG[. bG[8 [bJ. J8[c bG[M GM[& JbV[ VJ[c bG[j G&[j", -" Jb[j [csJ [db [d& Jb[d g[c bd[. b8[d [Jbd. [8gc bd[M dM[& Vb[d [cgV bd[j d", -"&[j Jj[bd gs[c [b2 [&2 bD[2 [c2 [5b [5& b5[D [c5 bM[2 M&[2 [bV2 V2[c b5[j 5", -"M[& Vb[5 c5[s [;b [;& b;[D [c; b5[; [>b [5bD; [>c bM[; M;[& Vb[; V[c; b;[j ", -"[&>M V[5b; c>[s bG[2 G&[2 [bJ2 c2[J bG[5 G5[& Jb[5 J5[c [bGM2 [&GM2 VJ[b2 [", -"cJV2 [5bGM [5&GM J5V[b [sJc5 bG[; G;[& Jb[; c;g[ b5[d >b[d J5[bd c>g[ [dbM;", -" [d&M; J;V[b g[Vc; [5dbM [>bGM J;[bj J>V[c [bP [&P bP[D [cP bP[. b8[P [bDP.", -" [8cP S[b S[& V[Sb Sc[ [jSb [8Sb SV[bj [sSc bP[( b+[P [bDP( [+cP [bP(. [+b8", -"P bPD[(. [c+8P [bS( [+Sb SV[b( S+[c S[bj( S[+b8 V[jSb( [scS+ Yb[ Y&[ [JYb Y", -"c[ [bY. [8Yb YJ[b. Y8[c SYb YbS& ]b ]c YjSb YbS8 ]jb ]sc [dYb [+Yb YJ[bd Yc", -"g[ Yb[d. Yb+[8 [JdYb. g[Yc8 YbSd YbS+ ]bd ]gc S[dbj S[8bd bd]j gs]c [mb [m&", -" bm[D [cm b5[m b8[m [5bDm [5cm [mSb [mS& Vb[m cmS[ [pb [p& pbV[ cp[ bm[; b+", -"[m [mbD; [+cm [5b;P [&>P b5P[;D >P[c [;Sb [;S& SV;[b S;[c [;pb Sb[> [pVb; [", -">Sc [mYb [mY& Jb[m Jm[c [5Yb [5Y& YJ5[b Y5[c SmYb S[&Ym ]bm ]cm SbYp Y&[p ]", -"pb ]pc [vb [v& vb[J cv[ [5vb Yb[> [vJb5 [>Yc Sb[v S&[v ]vb ]cv pb[v SbY> pv", -"]b ]yc kX kX! kXB akX R1X 8kX RB1X 1XRa kXM M!kX TkX akTX lX lX8 lXT lsX kX", -"( +kX X(kB ak+X R(1X 1XR+ kX(1B akX1+ k(XM kX+M T(kX Tk+X lX( l+X TXl( sXl+", -" RGk R!Gk HkX GkRa R1G 1GR8 1GRH 1GRa kXGM kXMG! GkRT akXGT lGR RGl8 lHX sR", -"lG dkX +kRG dkHX gkX 1GRd 1+RG dkX1H R1gX kXdM dkX+M dkTX TkgX ldX R+lG HXl", -"d glX kX2 X!k2 X2kB k2aX 5kX 8k5X 5BkX ak5X k2XM kXM!2 T2kX akXT2 lX5 5Xl8 ", -"5TlX l5sX kX; k;+X kBX; kXa; 1XR; >kX kX;1B ak>X XMk; kX;+M kXT; akXT; lX; ", -"l>X TXl; >Xls R2Gk kX2G! H2kX akXG2 1GR5 R1G58 5kHX akXG5 kXMG2 Gk2XM! RGTk", -"2 ak2RGT RGl5 lGR58 H5lX lsGR5 GkR; dkX+; kXH; kXg; 1GR; R1>G dkXH5 gk>X dk", -"XM; +GkXM; dkXT; gkXT; RGl; lG>X HXl; >Xgl kXP X!kP XPkB kXaP kX1P kX8P kXP", -"1B akX1P SkX kXS! TkSX akSX lXS S8lX STlX lXSs XPk( kX+P kXP(B akX+P kXP1( ", -"R1+XP 1X(kPB 1+XakP kXS( +kSX STkX( S+TkX SXl( S+lX SlTX( Ssl+X Yk Yk! YkH ", -"Yak Y1R Y8k R1YH R1Ya SYk S!Yk YZk YkSa lY lY8 lYZ lYs Ykd Y+k HkYd gYk R1Y", -"d R1Y+ Y1RHd Y1gR YkSd YkS+ YdZk SYgk lYd lY+ YZld glY kXm X!km kBXm kXam 1", -"XRm kX8m kXm1B akX1m kXSm kXmS! kXTm SakXm lXp l8pX lTpX splX Xmk; kX+m kXm", -";B akX+m kXm1; kX>P kXB1;P >kXam kXS; S+kXm S;TkX Sa;kX S;lX lXS> lXpT; l>X", -"Ss Ykm kmY! HkYm akYm Y5k 5kY8 H5Yk 5aYk SmYk SYkm! YmZk SYakm lYp lpY8 lZY", -"p lsYp Yvk vkY+ YHvk Yvgk vRY1 Y>k Yv1RH >kgY YkSv SY+vk ZvYk gYkSv lYv lY>", -" YZlv ylY R9X kX& RB9X 9XRa 9XR1 :RX kXB91 Ra:X 9XM XMk& 9XRT aX9M lX9 l:X ", -"9TlX s:lX R(9X 9XR+ kX(9B akX9+ kX(91 R+:X 9X(R1B :R+aX 9(XM +X9M R9TX( aXM", -"9+ 9Xl( :Xl+ lX9T( lsX:+ R9G 9GR& 9GRH 9GRa 9GR1 :RG R9G1H RG:H 9MRG kX&GM ", -"9GRT aXM9G R9lG :RlG 9HlX :RsG 9GRd 9+RG dkX9H R9gX dkX91 R+:G 9HXR1d :RgX ", -"dX9M dkXM& dkX9T 9XgM 9dlX :dlX lHX9d lXg: R29X k2X& kX29B akX92 9XR5 R5:X ", -"R95XB :R5aX 92XM kX&M2 R9TX2 aXM92 95lX l5:X lX95T lsX:5 9XR; X;k& kX;9B ak", -"X9; kX;95 :R>X k;B95X :>RaX XM9; kX;M& kX;9T aXM9; 9Xl; l:>X lX;9T l>Xs: R2", -"9G kX&G2 R9GH2 kX&H2 9GR5 RG:5 R9GH5 :RGH5 R9GM2 kX2GM& R9GT2 aX29GM lGR95 ", -":RGl5 lHX95 :RGs5 9GR; dkX;& kX;9H gR9G; dkX95 >R:G 9G5RH; g:R>X dXM9; kX;d", -"M& XM;9H g9XM; lG;R9 l>G:R lHX9; glX:> kX9P X&kP kXP9B akX9P kXP91 kX:P 9X1", -"kPB :RaXP S9X 9XS& 9TSX 9aSX S9lX S:X Sl9TX sXS: kXP9( kX&+P 9X(kPB 9+XakP ", -"9X1kP( :R+XP kX9P1(B akX:P+ 9XS( 9+SX S9TX( S9+TX Sl9X( :XS+ lXTS9( S:s+X Y", -"9R Yk& R9YH R9Ya R9Y1 Y:R Y9R1H :RYa SY9 Y9S& YZS9 Y9Sa lY9 lY: Y9lZ S:sY R", -"9Yd R9Y+ Y9RHd Y9gR Y9R1d :RY+ R9HY1d gRY: Y9Sd Y9S+ SZ9Yd SYg9 Y9ld l+Y: l", -"YZ9d Y:gl 9XRm Xmk& kXm9B akX9m kXm95 Rm:X kXB95P :RmaX 9XSm S9Xm& S9TXm S9", -"aXm p9lX lX:p Sp9TX :pXSs kXm9; kXm9+ kXB9;P kX&a;P 95Xk;P :>RXm 1;9PkXB :X", -"a>kP 9XS; S9+Xm S9;TX S9aX; Sp9X; >XS: S9TlX; S:>sX R9Ym kmY& Y9RHm Y9aRm R", -"9Y5 :RY5 Y95RH Y:RH5 SmY9 SY9m& SZ9Ym SY9am S9Yp YpS: Yp9lZ lYs:p vRY9 vkY&", -" Yv9RH gY9vR Yv9R1 >kY: Y9HvR1 :vRgY YvS9 Sv9Y+ Sv9YZ gS9Yv Y9lv Y:lv lYvZ9", -" lYy: [k [!k [Dk [ak [1 [18 [1D [1a [kM kM[! V[k Vk[a [l [l8 [lV [sl [k( [+", -"k Dk[( +D[k [1( [1+ 1D[( 1+[a kM[( +k[M [kV( Vk[+ [l( [l+ l(V[ l+[s [Gk Gk[", -"! Jk[ [aJk [1G 1G[8 J1[ [1J8 Gk[M [!GkM V[Jk JkV[a [lG [8lG lJ[ lJ[s [dk +G", -"[k [dJk g[k [1d 1+[d [dJ1 g[1 dk[M [+GkM Vk[d V[gk [ld [+lG V[ld gl[ [k2 k2", -"[! Dk[2 ak[2 [15 5k[8 1D[5 1a[5 kM[2 [!kM2 [kV2 V[ak2 [l5 l5[8 V5[l [5ls [;", -"k +k[; Dk[; ak[; [1; [>1 1D[; [a>k k;[M [+kM; Vk[; V[+k; [l; [>l V[l; l>[s ", -"Gk[2 [!Gk2 [kJ2 Jk[a2 1G[5 [1G58 [1J5 J1[5a [GkM2 GkM[!2 JkV[2 V[aJk2 [5lG ", -"[lG58 J5[l [slJ5 Gk[; [+Gk; [;Jk [;gk 1G[; [d>k [1J; >kg[ [dkM; +Gk[;M Jk;V", -"[ g[Vk; [5ld lG[> J;[l [>gl [kP kP[! Dk[P ak[P [1P 1P[8 1D[P 1a[P S[k [!Sk ", -"SkV[ Sk[a [lS S8[l SV[l [lSs kP[( +k[P [DkP( [+DkP 1P[( 1+[P [1DP( [1+DP [k", -"S( Sk[+ SV[k( SV+[k l(S[ S[l+ SlV[( [slS+ Yk[ [!Yk YJk JkYa Y1[ [1Y8 J1Yk J", -"8Yk YkS[ S[Yk! ]k ]ak lY[ Y8[l ]l ]ls [dYk [+Yk YdJk YJgk [dY1 [1Y+ YJ1[d Y", -"1g[ Sk[d S[+Yk ]dk ]gk S[ld Y+[l ]ld ]lg [mk km[! Dk[m ak[m [1m 1m[8 1D[m 1", -"a[m Sk[m S[km! Vk[m S[akm [pl lp[8 [lVp ls[p km[; +k[m [mDk; [+mDk 1m[; [1>", -"P [1mD; [>1Dm Sk[; S[+km SV;[k S[ak; l;[p l>[p [plV; V>[Sl [mYk Yk[m! JmYk ", -"YJkam [1Y5 Y1[8m J5Yk YJ58k S[Ykm YkmS[! ]km ak]m [plY [plY8 ]lp ls]p [vk [", -"+vk YkJv gk[v [v1 >k[v J1[v g1[v vkS[ [vS+k ]vk gv]k lv[ [>lY ]lv ]yl [t [t", -"& [tD [ct [t1 [: tD[1 [:c [tM tM[& V[t V[tc [lt [:l V[lt u[ [t( t+[ [Dt( t+", -"[c t([1 [:+ [t1D( [+:c [Mt( tM[+ t(V[ V[t+ l([t l+[: [lVt( u[+ tG[ [&tG tJ[", -" [ctJ [1tG [:G [tJ1 :J[ [GtM tG[M& V[tJ tJV[c tG[l lG[: [ltJ uJ[ td[ [+tG [", -"Jtd g[t [1td [:d td[J1 g[: tM[d t+[GM V[td V[gt td[l ld[: lJ[td ug[ [t2 t2[", -"& [Dt2 c2[t t5[ [:5 tD[5 t5[c [Mt2 [tM&2 V2[t [cVt2 t5[l [5l: V[t5 u[5 t;[ ", -"[+t; tD[; t;[c [1t; t>[ t5[D; c>[: tM[; t+[M; V[t; [c;Vt t;[l l>[: [l;Vt u[", -"> [Gt2 tG[&2 t2[J tJ[c2 [5tG [5:G [Jt5 J5[: tG[M2 [&MtG2 tJV[2 [cVtJ2 tG5[l", -" [:lG5 lJ[t5 J5u[ [dt; t+[G; [Jt; t;g[ [5td tG[> tJ5[d t>g[ tG;[M tGM[;& tJ", -";V[ g[tV; [ldt5 [:dl> lJ;[t g[u> tP[ [&tP [DtP tP[c [1tP [:P tP[1D :P[c St[", -" [tS& V[St [cSt [lSt S:[ SlV[t u[S [Pt( [+tP tP[D( tcP[+ tP[1( [+:P [1DtP( ", -"[:c+P S([t t+S[ StV[( St+[c Stl[( S+[: [lVSt( S[u+ tY tY& tYJ tYc tY1 tY: Y", -"1tJ :JtY tYS S&tY ]t ]tc lYt tYS: ]lt ]u tYd tY+ YJtd gtY Y1td t+Y: tYJ1d Y", -":g[ SdtY S+tY ]td ]gt ldtY l+tY lt]d ]ug tm[ [&tm tD[m tm[c [1tm [:m t5[Dm ", -":m[c tmS[ S[&tm V[tm [cmSt tp[ [p: V[tp up[ [mt; [+tm tm[D; [cmt+ t5[;P >P[", -": tmD[1; [:mc> t;S[ St+[m St;V[ Sc;[t t;[p [pt> tp[V; S>u[ tYm Y&tm YJtm tm", -"Yc tY5 t5Y: YJt5 t5Yc tmSY tYSm& ]tm tc]m tpY Y:tp ]pt ]up tYv t+[v tJ[v tv", -"g[ t5[v tY> [v1tJ Yct> St[v [v&St ]tv gt]v tYlv tYS> lv]t ]yu Xe Xe! XeB aX", -"e Xe. 8Xe e.XB aX8e XeK X!eK TXe aXTe Xje Xj8e XjTe sXe X* +Xe X*B aX* X*. ", -"8X* X.*B aX8* X*K +KX* TX* TX+e X*j X*+j XjT* sX* GXe XeG! HXe aXHe XeG. GX", -"8e XeH. 8XHe XeGK GXe!K TXHe aXeGT GXej XjeG8 XjHe HXse fX f+X fHX gfX fX. ", -"f8X HXf. f8gX fXK +XfK fTX fTgX fjX +Xfj HXfj sfX Xe2 X!e2 e2XB X2ae 5Xe 8X", -"5e Xe5B aX5e e2XK Xe2!K XeT2 aXeT2 Xj5e Xje58 TX5e 5Xse X;e X;+e *BX; X;ae ", -"5X* >Xe *B5X aX>e XKe; X;e+K X;Te aX;Te Xj5* X*>j TX5* sX>e XeG2 GXe!2 XeH2", -" aXeG2 GX5e G58Xe 5XHe G5aXe GXe2K Xe2GK! GTXe2 GTXae2 XjeG5 G58Xje G5TXe s", -"X5He fX; +Xf; HXf; fXg; f5X f>X H5fX gf>X X;fK f+X;K TXf; fTXg; 5Xfj fj>X 5", -"TfX >Xsf eP eP! ePB aeP eP. 8eP P.eB ae8P QXe Q!eP TeP aXQe ePj 8XQe ejTP s", -"eP X*P +eP *BeP ae+P X.P* 8e+P X*P.B aX*8P QX* QX+e TXQ* Te+P XjQ* 8XQ* X*j", -"TP +esP Ye Ye! YHe Yae Ye. Y8e HeY. H8Ye YQe QeY! YZe ZeYa Yje Q8Ye ZeYj sY", -"e Yf Yf+ YfH gYf Yf. Yf8 fHY. Y8gf YfQ fQY+ ZfY ZfgY Yfj fQY8 YjZf sYf Xme ", -"X!em XBem Xmae 5eP 8e5P 5BeP ae5P XmQe XmeQ! XmTe aXmQe pXe 8Xpe TXpe pXse ", -"Xm* Xm+e *BXm Xma* Xm5* >eP Xm*5B ae>P XmQ* Xm*+Q XmT* aXmQ* pX* pX>e TXp* ", -"se>P Yem emY! HeYm aeYm Y5e 5eY8 H5Ye 5aYe QeYm YQem! YmZe YZaem Ype peY8 Z", -"eYp seYp Yfv fvY+ YHfv Yfgv Yf5 Y>f YHf5 f>gY fQYv Yfv+Q YvZf gYZfv fpY fpY", -"> ZfYp yYf ,X ,X& ,XB ,aX ,X. ,8X X.,B 8X,a ,XK ,KX& ,TX TX,a ,Xj 8X,j TX,j", -" sX, ,X* -X *B,X -Xa ,.X* -X8 X*.,B 8X-a ,KX* -XK T*,X -TX X*,j -Xj X*j,T s", -"-X ,GX G&,X ,HX Ga,X GX,. G8,X ,.HX H8,X GX,K X&K,G GT,X ,GTaX Gj,X X&j,G H", -"X,j ,GsX fX, f-X ,HfX g-X ,Xf. -Xf8 fHX,. g8-X ,XfK fK-X ,TfX -TgX ,Xfj -Xf", -"j fTX,j gXs- ,X2 ,2X& X2,B ,2aX ,5X 5X,8 ,B5X 5a,X X2,K X&2,K ,2TX ,TX&2 5X", -",j X&j,5 5T,X ,5sX ,X; -X; ,BX; aX-; 5X,; >X- ,5X*B -a>X ,KX; X;-K TX,; TX-", -"; X;,j -j>X X;j,T >Xs- GX,2 X&2,G ,2HX ,GaX2 G5,X ,G58X H5,X ,G5aX ,GX2K ,G", -"2X&K ,GTX2 aX2,GT ,G5Xj ,G5X&j ,G5TX sX,G5 ,Xf; f;-X HX,; g;-X ,5fX f->X f5", -"H,X g->X fX;,K f-X;K fTX,; f-TX; f5X,j f>-Xj f5T,X s-Xf> ,XP eP& ,BeP aX,P ", -",.eP 8X,P eP.,B aeP,8 ,QX Q&,X QX,T Qa,X QX,j Q8,X ePj,T ,QsX X*,P -XP X*P,", -"B aX-P X*P,. 8X-P ,X.P*B -X8aP Q*,X -QX ,QXT* Qa-X X*j,Q Q8-X ,TXP*j -QsX Y", -", Y&e Y,H Ya, Y,. Y8, ,HY. ,HY8 Y,Q ,QY& YZ, ZeY& Yj, ,QY8 Z,Yj sY, Yf, Y- ", -"fHY, Y-g f,Y. Y-8 YfH,. Y8g- fQY, Y-Q Y,Zf Y-Z fjY, Y-j YZ,fj sY- ,Xm X&,m ", -",BXm aX,m 5X,m 8X,m ,5XmB aXm,5 QX,m Xm&,Q TX,m aXm,Q pX, ,8pX ,TpX pXs, Xm", -",; -Xm Xm*,B aX-m Xm*,5 -X>P X;B,5P >X-am QX,; QX-m Xm*,T TX-m ,Xp* -pX pX*", -",T sX-p Y,m ,mY& ,HYm ,aYm Y5, ,5Y8 ,HY5 ,5Ya ,QYm Y&Q,m YmZ, YZ&,m Yp, peY", -"& ZpY, s,Yp Yv, Y-v YHv, -vgY f5Y, Y-> Yf5,H g-Y> YQv, -QYv ZvY, YZ-v Y,fp ", -"Y-p fpZY, yY- IXe I!Xe DXe aXDe XeI. IX8e XeD. 8XDe XeIK IXe!K TXDe aXeTI I", -"Xej IjX8e XjDe DXse I*X I*+X DX* DX+e I.X* I*8X D.X* 8XD* IKX* I*X+K TXD* a", -"X*TI X*Ij I*j+X X*Dj DXs* IXGe GIXe! JXe aXJe GIXe. G8IXe XeJ. 8XJe GIXeK I", -"XeGK! TXJe JTaXe IjXGe G8IXje XjJe JXse fIX +IfX JfX JfgX IXf. 8IfX fXJ. JX", -"f8 IXfK f+IXK JXfT JfTgX IjfX f8IXj JXfj JfsX XeI2 IXe!2 XeD2 aXeI2 IX5e 5I", -"8Xe DX5e 5DX8e IXe2K Xe2IK! DXTe2 DXTae2 IjX5e 5I8Xje 5DXTe sI5Xe X;I* I;X+", -"e X;De aX;De I*5X I*>X DX5* DX>e I;XeK +IXe;K DX;Te DX;+Te I;jX* >IjX* X;jD", -"e sI*>X GIXe2 IXeG2! XeJ2 JaXe2 G5IXe 5IXG8e 5XJe J58Xe IXeG2K I!X2GeK JTXe", -"2 aXeJT2 G5IXje 8eGj5IX J5TXe sJ5Xe I;fX f+IX; fXJ; JfXg; 5IfX fI>X JXf5 Jf", -">X fIX;K I;Xf+K JfTX; fTXgJ; f5IXj f>IXj Jf5TX J>sfX IPe I!eP DeP aeDP I.eP", -" IP8e D.eP 8eDP IPQe IPeQ! DXQe aePQD ePIj IPj8e ePDj DesP IP* IP+e IPD* De", -"+P I.P* IP8* IP*D. aP*8I IPQ* IP*+Q DXQ* aX*QD P*Ij IP*+j IP*Dj IPs* YIe Ie", -"Y! YJe JaYe IeY. 8IYe JeY. YeJ8 QIYe YQIe! ZeYJ YZJae IjYe Y8QIe YeJj YJse ", -"YfI f+YI YJf YJgf fIY. YIf8 Y.Jf JfY8 YIfQ Yf+QI YJZf gYZJf YIfj Yf8QI JfYj", -" YJsf emIP ImXe! XmDe aXmDe IP5e 5IP8e De5P aeP5D ImXQe QIXem! QDXem QDXaem", -" IPpe pI8eP DXpe sIPpe XmI* Im*+X XmD* aXmD* IP5* IP>e IP*5D De>P Im*QX +QI", -"Xm* Im*TX +QDXm* IPp* >XpI* DXp* sIP>e ImYe YIem! YeJm YJaem 5IYe Y58Ie YeJ", -"5 YJ58e YQIem ImeYQ! YZJem ZJeYam YIpe Yp8Ie peYJ JpsYe vIYf Yfv+I YfJv gYJ", -"fv YIf5 >IYf JfY5 YJf> YfvQI fvQY+I YZvJf ZfJgYv pIYf fpY>I YJfp YJyf hX hX", -"& hDX hcX hX. h8X DXh. cXh8 hXK X&hK hTX cXhT hjX 8Xhj DXhj hsX hX* h-X DXh", -"* c-X X*h. -Xh8 hDX*. c8-X X*hK hK-X TXh* -TcX X*hj -Xhj hTX*j sXh- hGX G&h", -"X hJX cXhJ GXh. G8hX JXh. hXJ8 GXhK hGX&K JThX cJThX GjhX h8GXj hXJj sXhJ h", -"fX -Xhf hXJf iX fXh. hXf8 JfXh. i8X fXhK f-XhK hXfT iTX hXfj f-jhX JfjhX is", -"X hX2 X&h2 DXh2 h2cX h5X 5Xh8 5DhX cXh5 X2hK hX&2K TXh2 cXTh2 5Xhj h58Xj 5T", -"hX sXh5 h;X -Xh; DXh; cXh; 5Xh; h>X h5DX; hc>X X;hK -X;hK TXh; c-XT; X;hj h", -"j>X h5TX; >Xhs GXh2 hGX&2 JXh2 cJXh2 G5hX h5G8X hXJ5 cJ5hX hGX2K X&2hGK hJT", -"X2 hJTcX2 h5GXj X&jh5G hJ5TX hsJ5X fXh; f-Xh; hXJ; iX; hXf5 hf>X Jf5hX i>X ", -"hfX;K hf;-XK hJ;TX TXi; hf5Xj h>fXj J;jhX >Xis hP hP& hPD hcP hP. h8P DPh. ", -"cPh8 hQX QXh& hTP cQhP hPj Q8hP DPhj hsP hP* h-P DPh* c-hP P*h. -Ph8 hPD*. ", -"c-X8P QXh* -QhP TPh* -QcX P*hj -Phj hTP*j hPs- hY hY& hYJ Ych hY. hY8 h.YJ ", -"h8Yc hYQ Y&hQ hZY YchZ hYj Y8hQ YZhj hsY hYf Y-h YJhf iY h.Yf h8Y- hYJf. iY", -"8 YfhQ hQY- ZfhY iZY Yfhj hjY- hYjZf isY hmX Xmh& DXhm cXhm h5P 5Ph8 5DhP c", -"5hP QXhm hQXm& TXhm cQXhm hpX pXh8 pDhP hPcp h;P -Xhm D;hP c;hP 5Ph; h>P h5", -"PD; hc>P QXh; -QXhm T;hP c-QXm pXh; >Xhp hpDX; >Phs hYm Y&hm YJhm hmYc hY5 ", -"Y5h8 YJh5 h5Yc YQhm hYQm& YZhm hZYcm hpY h8Yp hYJp sYhp hvY Y-hv JvhY iYv Y", -"fh5 h>Y hY5Jv iY> YvhQ hvY-Q YZhv YZiv hYfp Y-hp JpfhY yiY Xe0 X!e0 e0XB Xe", -"a0 1Xe 8X1e Xe1B aX1e e0XK Xe0!K XeT0 aXeT0 Xj1e Xje18 TX1e 1Xse X*0 +0X* X", -"0*B a0X* 1X* +X1e *B1X aX1* *0XK X*0+K T0X* aX*T0 Xj1* X*j1+ TX1* 1Xs* XeG0", -" GXe!0 XeH0 aXeG0 GX1e 1G8Xe HX1e 1GaXe GXe0K Xe0GK! GTXe0 GTXae0 Xje1G 1G8", -"Xje 1GTXe sX1He fX0 +Xf0 HXf0 fXg0 f1X 1+fX 1HfX f1gX X0fK f+X0K TXf0 fTXg0", -" 1Xfj f1+Xj 1TfX f1sX e0X2 Xe0!2 Xe02B aXe02 5X1e 1X58e 1X5eB 1aX5e Xe02K e", -"02XK! TXe02 TX0ae2 Xje15 5X81ej 1TX5e sX15e X0e; X;e+0 X;e0B aX;e0 5X1* 1X>", -"e 1X;*B >X1ae X;e0K +X0e;K TX;e0 aX0Te; X;j1e >X1ej 1TX5* sX*>1 GXe02 Xe0G2", -"! HXe02 HX0ae2 1G5Xe G581Xe 1HX5e H5X1ae Xe0G2K 2Ke!GX0 TX0He2 aXHeT02 1G5X", -"je 8eGj1X5 H5X1Te 1HXse5 X;f0 f+X;0 fHX;0 gfX;0 1Xf5 f1>X f1H5X f>g1X fX;0K", -" X;0f+K fTX;0 gX;fT0 f15Xj f>1Xj f1T5X sf>1X eP0 P!e0 P0eB a0eP 1eP 8e1P 1B", -"eP ae1P Q0eP eP0Q! T0eP aePQ0 QX1e ePj18 Te1P 1esP X0P* +0eP X*P0B aX*P0 X*", -"1P +e1P 1X*PB aX*1P Q0X* +QXe0 QX*T0 aX*Q0 QX1* ePj1+ 1QXT* sX*1Q Ye0 e0Y! ", -"HeY0 aeY0 Y1e 1eY8 1HYe 1aYe QeY0 YQe!0 Y0Ze YZae0 1QYe Y1Q8e ZeY1 Y1se Yf0", -" f+Y0 fHY0 g0Yf Yf1 f1Y+ YHf1 Yfg1 Y0fQ Yf+Q0 Y0Zf gYZf0 f1Yj Yf1+Q Y1Zf Y1", -"sf X0em Xme!0 Xme0B aXme0 5e1P 1Xm8e 1XmeB aXm1e XmeQ0 QX0em! TXme0 aX0Tem ", -"1Xpe pX18e pX1Te sePp1 X0m* Xm*+0 Xm*0B aXm*0 Xm1* 1e>P Xm*1B >eP1a Xm*Q0 X", -"m0+Qe Xm*T0 aX0Qe; 1Xp* >Xp1e pX*1T sX*p1 emY0 Yem!0 YHem0 Yaem0 1eY5 Y158e", -" Y1H5e Y1a5e YQem0 em0YQ! YZem0 ZemYa0 peY1 Yp18e YZ1pe sYp1e Y0fv Yfv+0 Yf", -"vH0 gYfv0 fvY1 Y1f> Yf1vH gY1f> YfvQ0 fvQY+0 YZvf0 ZfvgY0 Y1fp fpY>1 fpZY1 ", -"Yfy1 ,X9 X&9e ,B9X 9a,X ,1X :Xe ,B1X ,a:X ,K9X X&K9e 9T,X ,TX9a 9X,j ,X:j 1", -"T,X :Xse 9X* -X9 *B9X 9a-X 1X9* :-X ,1X*B :a-X 9KX* 9X-K TX9* 9T-X X*9j -j:", -"X X*j9T :-sX 9G,X ,G9X& 9H,X ,Ga9X 1G,X ,G:X 1H,X ,H:X ,G9XK ,G9X&K ,GT9X 9", -"GT,aX ,1GXj :GX,j ,1GTX sX,:G f9X -Xf9 9HfX f9gX ,1fX :fX f91HX gX:f 9XfK f", -"-9XK 9TfX f-T9X 9Xfj fj:X f9T1X sX:f ,29X X&29e ,X92B ,aX92 95,X ,5:X ,1X5B", -" :X5,a ,X92K 9X2e&K ,TX92 aX29Te ,1X5j :X5,j ,1T5X sX,:5 9X,; 9X-; ,X;9B -X", -"9a; 1X,; :->X ,1X;B :-X>a ,X;9K -X9;K ,TX9; -TX9; X;j,1 :-X>j ,1TX; s-X:> ,", -"G9X2 ,G9X&2 ,HX92 aX29He ,1G5X :G5,X ,1H5X :HX,5 9G2,XK X&9eG2K ,G29TX ,2GT", -"9aX 9G5,Xj ,G5:Xj 9G5,TX sX5:He 9Xf; f-9X; f9HX; gf9X; 95fX >X:f f95HX g:Xf", -"> f9X;K -X;f9K f9TX; f9;-TX f95Xj :f>Xj f95TX sf:>X 9eP e&9P 9BeP ae9P 1X,P", -" :eP ,1XPB ae:P 9Q,X eP&9Q Te9P aeP9Q 1Q,X ,Q:X ePj9T :esP X*9P 9X-P 9X*PB ", -"-X9aP ,1XP* -X:P X*B,1P :-XaP QX9* 9Q-X 9QXT* -QX9T X*j9Q -Q:X 9TXP*j s-X:Q", -" Y9e 9eY& ,HY9 ,aY9 Y1, Y:e ,1YH :HY, ,QY9 Y9Qe& Z9Y, YZ9,a ,1Yj :QY, Z1Y, ", -"seY: Yf9 Y-9 YHf9 g9Y- f9Y1 Y:f Yf91H gY:f fQY9 -QY9 Y9Zf Y9Z- f9Yj Yj:f Zf", -"9Y1 Y:sf 9X,m Xm&9e ,Xm9B aXm9e 1X,m ,X:m ,1XmB :Xm,a ,QX9m 9QXem& ,TX9m 9Q", -"a,Xm ,1pX pX:e p9X,T :pXse Xm9* 9X-m Xm*9B -Xm9a Xm*,1 :e>P XmB,1; :-Xam Xm", -"*9Q -QX9m Xm*9T -TX9m 9Xp* :X-p p9XT* -pXs: ,mY9 Y9em& Y9H,m Y9a,m ,1Y5 :eY", -"5 Y95,H Y:H,5 Y9Q,m em&Y9Q YZ9,m Y9mZe& p9Y, Y,:p Yp9Ze sY:pe fvY9 Y9-v Yf9", -"vH gY9-v f9Y5 :fY> Yf9H5 Y:gf> Yf9vQ Y-v9Q Zf9Yv Y-Zv9 Y9fp fpY: fp9YZ Y:yf", -" XeI0 IXe!0 XeD0 aXeD0 IX1e 1I8Xe DX1e 1DX8e IXe0K Xe0IK! DXTe0 DXTae0 IjX1", -"e 1I8Xje 1DXTe sI1Xe I0X* I*X+0 D0X* aX*D0 I*1X 1+IX* DX1* aX*1D I*X0K +I0X", -"*K DX*T0 aX0TI* I*j1X 1+IX*j X*j1D sI*1X GIXe0 IXeG0! XeJ0 JaXe0 1GIXe G8I1", -"Xe 1XJe J18Xe IXeG0K I!XKGe0 JTXe0 aXeJT0 1GIXje 8eGj1IX J1TXe sJ1Xe IXf0 f", -"+IX0 fXJ0 JfXg0 1IfX f1+IX JXf1 Jf1gX fIX0K +IXf0K JfTX0 fTXgJ0 f1IXj 1+Ifj", -"X Jf1TX sfJ1X IXe02 Xe0I2! DXe02 DX0ae2 1I5Xe 5I81Xe 1DX5e 5DX1ae Xe0I2K I!", -"X2e0K TX0De2 aXDeT02 1I5Xje 8X5e1Ij 5DX1Te 1DXse5 I;Xe0 +IXe;0 DX;e0 aX0De;", -" 1I;X* >I1X* 1DX5* >XD1e X;0I*K +KI;X*0 I;0TX* X;De+T0 1I;X*j I*j>X1 1DXe;j", -" >I1sX* IXeG02 I!X2Ge0 JXe02 aXeJ02 G5I1Xe 8X5e1GI J15Xe 1aXJ5e IXG0e2K IXG", -"02Ke! TXeJ02 aXJeT02 Ij1XG5e GX8e15Ij 1TXJ5e J15sXe fIX;0 I;Xf+0 JfX;0 gfXJ", -";0 f15IX f>1IX Jf15X J>f1X I;Xf0K I;fX+0K fTXJ;0 X;g0JfT I;jf1X f1I>Xj J1Xf", -"5T sf1J>X I0eP IPe!0 D0eP aePD0 IP1e 1IP8e De1P aeP1D IPeQ0 QI0eP! QDXe0 aX", -"0QDe IPj1e Q8I1eP ePj1D sIP1e I0P* IP*+0 IP*D0 aP*I0 IP1* IP*1+ IP*1D aP*1I", -" IP*Q0 IP0+Qe IP*T0 aX0QD* IP*1Q 1+QIP* IP*1T sIP1* IeY0 YIe!0 JeY0 YJae0 1", -"IYe Y18Ie YeJ1 YJ18e YQIe0 QIeY0! YZJe0 ZJeYa0 Y1QIe 1QIY8e YZ1Je sYJ1e fIY", -"0 Yf+I0 Y0Jf gYJf0 YIf1 Yf1+I JfY1 gY1Jf YfQI0 fQIY+0 YJfZ0 ZfJgY0 Yf1QI Y1", -"IfQ8 Zf1YJ sYfJ1 ImXe0 em0IP! DXme0 aX0Dem 1ImeP 8Im1eP 1DXem 1DXaem QIXem0", -" ImQXe0! Im0TeP aXQeIm0 pI1eP 1IPpe8 pDX1e sX1pDe Im*X0 Im0+eP Xm*D0 aX0Im*", -" Im*1X >eP1I Xm*1D >eD1P Im0QX* Im+XQe0 Im0TX* XmD*+Q0 pI*1X >I1pX* pDX1* >", -"I1seP YIem0 ImeY0! YJem0 JmeYa0 Y15Ie 1ImY8e YJ15e Y1eJ8m ImeYQ0 QmY0Ie! Ze", -"mYJ0 aeJmYZ0 Yp1Ie pI8Y1e JpY1e sY1Jpe YfvI0 fvIY+0 YJfv0 JvfgY0 Yf1vI Y>f1", -"I Jv1Yf Y>Jf1 fQIYv0 YQvIf+0 JvYZf0 gJZfYv0 fpY1I Y>1fpI JpfY1 yJYf1 h9X 9X", -"h& 9DhX h9cX h1X h:X 1DhX :Xhc 9XhK h9X&K 9ThX cX9hT 9Xhj :Xhj 1ThX sXh: 9X", -"h* h9-X DX9* c9-X 1Xh* :Xh- h1DX* c-:X h9X*K -X9hK hT9X* c-X9T h1X*j h:-Xj ", -"h1TX* s-Xh: 9GhX h9GX& hXJ9 cJ9hX 1GhX hG:X hXJ1 :XhJ h9GXK X&Kh9G J9ThX hJ", -"9cXT h1GXj h:GXj J9jhX hsJ:X hXf9 f-9hX JXf9 i9X hXf1 :Xhf Jf91X i:X f9XhK ", -"hf9-XK Jf9TX 9TiX f9jhX :fhXj Jf9Xj s:iX 9Xh2 h9X&2 h9DX2 cX9h2 95hX :Xh5 h", -"15DX h:c5X h9X2K X&2h9K hT9X2 hT9cX2 h15Xj h:5Xj h1T5X hs:5X 9Xh; -X9h; h;9", -"DX c-X9; 1Xh; >Xh: h1;DX c>Xh: h;9XK h;9-XK hT;9X cX9hT; h1;Xj h>:Xj h1TX; ", -"hs>:X h9GX2 X&2h9G J9Xh2 hJ9cX2 h1G5X h:G5X J95hX :Jh5X 9GXh2K X&h29GK hTXJ", -"92 h9cXJT2 9G5hjX h5G:Xj J9Xh5T :J5hsX f9Xh; hf9-X; Jf9X; 9Xi; f95hX h>:fX ", -"Jf95X >Xi: h;Xf9K h9-Xf;K J9XhT; i9;TX f9Xh;j :fXh>j J9Xf5T is:>X hP9 9Ph& ", -"9DhP h9cP h1P h:P 1DhP :chP 9QhP hQ9X& 9ThP cQXh9 9Phj :QhP 1ThP s:hP 9Ph* ", -"h9-P hP9D* c-X9P 1Ph* :-hP h1PD* h:Pc- hQ9X* -QXh9 hTP9* c-Q9X h1QX* h:Q-X ", -"h1TP* hsP:- hY9 h9Y& Y9hJ Y9hc hY1 Y:h YJh1 hY:J Y9hQ hY9Q& Y9hZ hZYc9 Y9hj", -" hQY: YZh1 Y:hZ Y9hf Y9h- JfY9 iY9 Yfh1 hY:f hY1Jf iY: hYf9Q Y-h9Q Zf9hY YZ", -"i9 hY1fQ Y:hfQ hZ1Yf sYi: 9Xhm hm9X& hm9DX cXmh9 95hP :Xhm h1mDX h:mcX hQ9X", -"m Xm&hQ9 hTm9X cX9hTm p9hP hP:p hp9DX cpXh: 9;hP -Xmh9 h;P9D c-X9m 1;hP >Ph", -": h1;DP h>P:c hQ;9X -Q9h;P hT;9P cQ9-Xm hp9X; -pXh: p9DX* cp-:X Y9hm hY9m& ", -"hYJ9m Ych9m Y9h5 h5Y: hY1J5 Y:Jh5 hY9Qm hQ9Y&m hZY9m Yc9hZm h1Yp Y:hp Jp9hY", -" hZ:Yp Y9hv hvY-9 Jv9hY Yvi9 Yvh1 Y:hv hv1YJ Y:iv hvY9Q Y-9hvQ hZvY9 iZYv9 ", -"fp9hY hv:Yp JpfY9 yYi: Re Re! ReB Rae Re. R8e e.RB 8eRa ReM R!Me RTe TeRa R", -"ej 8MRe TeRj sRe Re* R+e *BRe +eRa R.X* +eR8 X*.RB aX*R8 XM* +MRe TXR* +TRe", -" X*Rj +eRj XM*Tj R+se RGe GeR! RHe GaRe GeR. G8Re R.He H8Re GMRe XM!Ge GTRe", -" aXMHe GjRe RG8Me HeRj RGse fR fR+ fRH gfR fR. fR8 RHf. f8gR fRM R+fM fRT f", -"RgM fRj R+fj RHfj sfR Re2 e2R! e2RB R2ae R5e 5eR8 RB5e 5aRe R2Me XM2e! R2Te", -" aXMe2 5MRe R5e8M 5TRe R5se Re; +eR; RBe; aeR; 5XR* >eR R5e*B Ra>e MeR; XM;", -"+e TeR; aXMe; XM5* Re>M XM*5T sR>e GeR2 RGe!2 R2He RGae2 G5Re RG58e H5Re RG", -"5ae XM2Ge RG2Me! RGTe2 aX2HMe RG5Me G5MR8e RG5Te sRG5e fR; R+f; RHf; g;fR f", -"R5 f>R RHf5 gRf> R;fM fR+M; RTf; fRTg; R5fM fR>M R5fT sRf> ReP R!eP RBeP aP", -"Re R.eP 8PRe eP.RB aePR8 Se Se! SeT Sae Sej S8e TeSj Sse ePR* +PRe X*PRB aX", -"*RP X*PR. R+e8P Re.P*B R8eaP* Se* S+e TXS* +TSe X*Sj +eS8 SeT*j S+se YRe Re", -"Y! RHYe RaYe ReY. R8Ye YRHe. Y8RHe SYe YeS! SZe YaSe YjSe Y8Se SjZe seSZ Yf", -"R fRY+ YHfR YfgR Y.fR fRY8 YfRH. gYfR8 Sf Sf+ SfZ gSf Sfj Sf8 fjSZ sfS Rem ", -"R!em RBem aeRm 5eRm 8eRm R5emB aemR5 Sem emS! TeSm aeSm Spe peS8 STpe seSp ", -"XmR* +eRm Xm*RB aXmR* Xm*R5 Re>P XmBR5* >eRam Se; +eS; TeS; aeS; pXS* S>e S", -"peT; >eSs ReYm YRem! HeRm YaRem R5Ye Y5R8e Y5RHe Y5aRe YeSm SYem! SmZe SZea", -"m SeYp SpeY8 ZpSe SseYp fvR f+vR fHvR fvgR fRY5 fRY> Yf5RH f>RgY Sfv fvS+ Z", -"fSv gfSv Sfp Sf> SZfp yfS ,RX Re& RB,X Ra,X ,.Re R8,X ,RX.B ,R8aX ,XM X&,M ", -"RT,X TeR& Re,j 8X,M ,RTXj ,RsX R*,X -RX X*B,R Ra-X X*.,R R8-X ,R.X*B -R8aX ", -"X*,M -XM XM*,T RT-X XM*,j Re-j ,RTX*j -RsX ,RG R&,G RG,H RG,a ,.RG RG,8 ,RG", -"H. ,RGH8 RG,M XM&,G RG,T aXM,G RG,j e&jRG ,RGHj ,RsG fR, f-R ,RfH f-gR ,Rf.", -" -Rf8 fRH,. f-Rg8 ,RfM -RfM ,RfT -RfT ,Rfj -Rfj fRT,j f-sR ,2Re R2e& ,RX2B ", -",RaX2 R5,X 5eR& ,R5XB ,R5aX ,2XM XM&,2 ,RTX2 aXM,2 5X,M XM&,5 ,R5TX sX,R5 R", -"e,; Re-; ,R;XB -RaX; ,R5X; -R>X X;B,R5 >X-Ra XM,; XM-; XM;,T -RTX; XM;,5 -X", -">M ,RTX;j s-R>X ,2RG ,RG&2 ,RGH2 ,RGa2 RG,5 ,RG5& ,RGH5 ,RG5a ,RGM2 X&2,GM ", -",RGT2 aX2,GM ,RG5M ,G5XM& ,RG5T sRG,5 ,Rf; f;-R fRH,; f-Rg; ,Rf5 ->fR fR5,H", -" f>Rg- fRM,; f-RM; fRT,; f-RT; fR5,M f>R-M fR5,T sfR-> Re,P ePR& ePB,R aeP,", -"R eP.,R eP&R8 ,R.ePB ,R8aeP Se, Se& ,TSe ,aSe ,XSj ,8Se SeT,j Ses, X*P,R Re", -"-P ,RXP*B -RaeP ,RXP*. -R8eP ePR*,.B aeP-R8 ,XS* S-X SeT,* -TSe Se*,j -XS8 ", -"X*jS,T sXS- Y,R ,RY& ,RYH ,RYa ,RY. ,RY8 Y,RH. Y8,RH SY, Y&Se YZS, YaS, YjS", -", Y8S, SZe,j SYs, fRY, Y-R YfR,H gRY- YfR,. -RY8 fRHY,. Y-gR8 Sf, Sf- S,Zf ", -"Y-gS fjS, S8Y- SfZ,j S-sY Re,m emR& ,RmXB aXm,R ,R5Xm em&R5 XmB,R5 ,R5aXm ,", -"XSm emS& SeT,m Sae,m pXS, peS& Spe,T Ssep& Xm*,R Re-m XmB,R; -RmaX ,R5Xm* >", -"X-Rm Xm,;R5B >Xa-Rm ,XS; -XS; Se;,T S-TXm Spe,; >XS- S;TpX, -pXSs ,RYm Y&R,", -"m Y,RHm Ya,Rm ,RY5 Y5&,R Y5,RH Y5a,R SmY, SY&,m SZe,m SZem& S,Yp Yp&Se Yp,S", -"Z sY,Sp vRY, fR-v Yv,RH -vRgY Yf5,R -RY> Y5HvR, Y->gR YvS, SvY- Sv,Zf gSf-v", -" S,fp Y-S> SfpZ, Sfy- [e [!e [De [ae [e. [8e De[. D8[e [Me Me[! V[e [aVe [j", -"e 8M[e [jVe [se [* [+e [*D [a* [*. [8* D*[. D8[* [*M +M[* V[* [+Ve [*j +e[j", -" [jV* [s* [Ge Ge[! [Je Je[a Ge[. G8[e [eJ. Je[8 GM[e [!GMe [JVe VJ[ae Gj[e ", -"[8GMe Je[j [Jse [f [f+ [fJ g[f [f. [f8 J.[f J8[f [fM [+fM Vf[ Vfg[ [fj [+fj", -" Jj[f sf[ [e2 e2[! De[2 ae[2 [5e 5e[8 5D[e 5a[e Me[2 [!Me2 [eV2 V[ae2 5M[e ", -"[58Me [5Ve [5se [;e +e[; De[; ae[; [5* [>e 5D[* [a>e Me[; [+Me; [;Ve V[+e; ", -"5M[* [*>M [5V* >e[s Ge[2 [!Ge2 [eJ2 [Jae2 G5[e [5G8e Je[5 J5[8e [GMe2 Me2[!", -"G VJ[e2 [JaVe2 [5GMe G5M[8e J5V[e [sJ5e [f; f+[; J;[f [;gf [f5 [>f J5[f f>g", -"[ [;fM [f+M; V;[f Vfg[; [5fM >M[f V[f5 [>sf [eP eP[! De[P ae[P eP[. 8e[P [D", -"eP. [8DeP S[e [!Se SVe VeSa [jSe [8Se SjVe SVse [*P +e[P DP[* aP[* P*[. 8P[", -"* [*DP. [8*DP S[* [+Se V[S* V+Se [jS* [8S* SVe*j s*S[ [Ye Ye[! Ye[J Ye[a [e", -"Y. Ye[8 YJ[e. YJ8[e [YSe S[Ye! ]e ]ae Ye[j S[8Ye ]je ]se [fY Y+[f YJ[f [fgY", -" Y.[f Y8[f YJf[. g[Yf8 Sf[ S+[f ]f ]gf Yj[f S8[f ]fj ]sf [me em[! De[m ae[m", -" 5e[m 8e[m [5Dem [5aem [mSe S[em! VmSe SVeam [pe [8pe SeVp se[p [m* +e[m Dm", -"[* am[* 5P[* [m>e [5*Dm [>Dem [mS* S[+em VeS; SV+em [p* >e[p V*[p SV>e Ye[m", -" [Yem! Je[m Ya[em Ye[5 Y5[8e YJ5[e Y5[ae S[Yem [YmSe! ]em ae]m [Ype [pY8e ]", -"pe sp]e [vf [+fv [fJv gf[v Y5[f f>[v [vJf5 [>fgY [vSf [vfS+ ]fv gf]v fp[ [>", -"Sf ]pf ]yf [h [h& [hD [ch [h. h8[ [Dh. h8[c hM[ [&hM Vh[ [cVh hj[ [8hM V[hj", -" hs[ [h* [- hD[* [-c h.[* [-8 [hD*. [8c- [*hM [-M [hV* V-[ [*hj [-j Vh[*j [", -"s- [hG hG[& hJ[ hJ[c [Gh. hG[8 h.[J [Jh8 [GhM [hGM& V[hJ VhJ[c hG[j h8[GM [", -"Jhj hJ[s [fh [-f hJ[f i[ h.[f h8[f [fJh. i[8 hM[f fM[- [fVh iV[ hj[f fj[- V", -"f[hj i[s [h2 h2[& [Dh2 h2[c h5[ [5h8 hD[5 h5[c [Mh2 [h&M2 h2V[ Vh[c2 [5hM h", -"5[8M V[h5 h5[s h;[ [-; hD[; h;[c [5h; h>[ h5[D; c>[- [;hM [;-M V[h; V;[- [;", -"hj >M[- Vh5[; [sh> [Gh2 [hG&2 h2[J [cJh2 hG[5 h5[G8 [Jh5 [c5hJ [hGM2 [&GhM2", -" VhJ[2 [cJVh2 h5[GM h5G[&j Vh5[J hs[J5 h;[f [;f- [Jh; i[; h5[f f>[- [f5hJ i", -"[> [fhM; [-fM; Vf[h; V[i; [f5hM [-jf> Vf5[h V>i[ hP[ [&hP [DhP hP[c [Ph. [8", -"hP [hDP. [ch8P Sh Sh& ShV Shc Shj Sh8 SVhj hsS [*hP [-P [hDP* cP[- [h*P. [8", -"-P [*DhP. [-c8P Sh* Sh- S*Vh V-Sh S*hj h8S- ShV*j S-hs hY[ [hY& [JhY [chY h", -".[Y [hY8 hYJ[. hY8[c ShY S&hY ]h ]hc SYhj SYh8 ]hj ]hs [fhY Y-[ hYJ[f i[Y h", -"Y[f. Y8[- [fJhY. Y8i[ Shf Y-Sh ]hf ]i hjSf h8Sf hf]j ]is hm[ [&hm hD[m hm[c", -" [5hm [8hm h5[Dm [c5hm Shm S&hm SVhm hmSc hp[ h8[p VpSh Schp [mh; [-m hm[D;", -" cm[- h5[m* >P[- h5D[m* [-mc> Sh; hmS- SVh; h;Sc h;[p h>S [p*Vh Sch> [Yhm h", -"Y[m& [Jhm [cmhY [hY5 hY5[8 hY5[J Yc5[h SYhm ShYm& ]hm hc]m hY[p [p&hY ]ph h", -"p]s hv[ [-v hJ[v i[v h5[v [-Y> hv[J5 Y>i[ hvS S-hv ]hv ]iv Sfhp Sfh> hp]f ]", -"yi Rek R!ke RBke akRe R1e 1eR8 RB1e 1aRe XMke kXMe! TkRe akXTe lXe R8le RTl", -"e sRle kX* +kRe *BkX kXa* 1XR* 1+Re kX*1B akX1* XMk* kX*+M kXT* akXT* lX* R", -"+le TXl* sXl* GkRe kX!Ge HkRe akXHe 1GRe R1G8e 1HRe R1Gae kXMGe RGkMe! RGTk", -"e RGTake RGle lGR8e RHle lsGRe fRk R+fk RHfk fRgk fR1 R1f8 R1fH fRg1 kXfM f", -"R+kM RTfk fRTgk lfR fRl+ fRlH lXsf R2ke kX2e! kX2eB akXe2 1eR5 R1e58 R1e5B ", -"akX5e kXMe2 XM2ke! RTek2 ak2RTe R5le lX58e lX5Te lsX5e keR; kX;+e kX;*B akX", -"e; 1eR; R1>e kX*5B >kXae kX;Me +kXMe; kX;Te kX;aMe Rel; lX>e lX;Te l>Xse kX", -"2Ge RG2ke! RHek2 ak2RHe R1G5e G5kR8e R1H5e RG5ake RGkMe2 M!kXGe2 kX2HMe akR", -"eGT2 lGR5e RG5le8 lHX5e sX5lHe R;fk fR+k; fRHk; gfRk; R1f5 fR>k fR1H5 f>Rg1", -" fRkM; kX;fM+ fRTk; fT;gkX fRl; >Xlf lfRH5 glf>X keP k!eP kBeP keaP 1PRe ke", -"8P keP1B ake1P Sek keS! TkSe akSe leS S8le lTSe leSs X*kP ke+P kX*PB akXP* ", -"kX*1P kX*8P kXB1P* R1+aeP kXS* +kSe SeTk* S+eTk Sel* S+le lX*ST Ssel+ Yke k", -"eY! HkYe akYe R1Ye 8kYe Y1RHe Y1aRe YkSe SYke! ZkSe SZeak lYe Y8le SZle les", -"Y Yfk fkY+ YHfk Yfgk fRY1 f8Yk Yf1RH gY1fR Sfk fkS+ YkZf gkSf lYf l+Sf ZflY", -" gSlf keRm kXme! kXmeB akXem 1eRm kXm8e keP5B ake5P keSm Sekm! SeTkm Saekm ", -"Sple Spel8 SpelT Sselp Xmk* kXm+e kXm*B akXm* kXm1* ke>P kXB1m* >keaP keS; ", -"S+ekm Se;Tk Saek; Sel; leS> Se;lT S>els keYm Ykem! YkHem Yakem 5kYe Y5k8e Y", -"5kHe Y5ake SYkem YkmSe! SZekm SamZke leYp lYp8e lYZpe lYspe fvYk Yfkv+ Yfkv", -"H gYkfv f5Yk Yf>k Yf5Hk Y>kgf fkSv Sfv+k ZfkSv gSfvk Sflv S>lf lYfZp lYyf ,", -"kX 9eR& RB9e 9aRe R1,X :Re ,R1XB Ra:e 9X,M kX&,M 9TRe akX,T lX, :Rle ,TlX s", -"Xl, 9XR* -kX kX*,B ak-X kX*,1 -R:X k*B,1X :-RaX XM9* 9X-M kX*,T Tk-X ,Xl* l", -"-X lX*,T lXs- R9,G kX&,G 9HRe akX,G R1,G ,R:G ,R1HX RH:e ,RG9M ,GkXM& ,RG9T", -" ,GTakX ,RlG :RGle ,HlX sX,lG fR9 -Rf9 R9fH fRg9 ,Rf1 :fR fR91H gR:f R9fM f", -"-R9M R9fT f-R9T fRl, lX:f lfR,H g-lX ,2kX kX&,2 ,kX2B akX,2 95Re R5:e ,5kXB", -" :Re5a ,kXM2 kX2Me& ,TkX2 ak2,TX ,5lX :Rel5 lX,5T sX,l5 9eR; kX-; kX;,B -kX", -"a; kX;,1 :R>e kXB,1; :>Rae kX;,M -kXM; kX;,T -TkX; ,Xl; >Xl- lX;,T l-Xs> ,R", -"G92 ke2RG& ,HkX2 ak2,RG ,R1G5 :RG,5 ,H5kX :RH5e kX2,GM XMk&,G2 kX2,GT aX9M,", -"G2 lG,R5 :R5lG, lHX,5 sX5lG, R9f; f-R9; fR9H; fR9g; R9f5 :Rf> fR9H5 :fRg> f", -"R9M; f9;-XM fR9T; fR;-Tk lfR,5 lf:>X fR95T gl->X 9PRe ePk& keP,B akX,P keP,", -"1 Re:P kXB,1P :ReaP S9e 9eS& 9TSe 9aSe S9le S:e S9elT seS: kX*,P kX-P kXB9P", -"* -kXaP ,1XkP* :-ReP X*9PR1B :Xa-kP 9XS* -kSe S9eT* S-9TX S9el* lXS- S9TlX*", -" l-SsX Yk, ,kY& ,HYk ,aYk ,RY1 :RY, Y1,RH Y:R,H Y9Se SY9e& Z9Se SZ9ae lY, l", -"eY: YZl, l,sY fRY9 Y-k Yf9RH gkY- Yf9R1 Yk:f Y9HfR1 Y:gfR Sf9 S9Y- S9Zf g9S", -"f l,Sf lY- lYfZ9 sYl- 9eRm kXme& kXm,B akX,m kXm,1 Re:m kXB,1m :Ream 9eSm S", -"9em& S9eTm S9aem p9Se Se:p Sp9Te S:esp kXm,; kX-m kXB,;P -kXam ,R1Xm* :-RXm", -" Xm9*R1B :Ra>eP 9eS; S-9Xm S9eT; S9ae; Sp9X* >eS: S9Tle; -pXls ,kYm Yk&,m Y", -"k,Hm Yak,m ,5Yk Y:R,5 Y5k,H Y5a,k SY9,m SemYk& SZ9em S9mYa, l,Yp lY:pe lY,Z", -"p lYsp, vRf9 Yk-v Yvk,H Y-kgv Yf9R5 >kY- Y9HfR5 :vRgf fvS9 Sf-v9 Sf9Zv gSfv", -"9 S9fp Y-lv fp9SZ lYy- [ke ke[! Dk[e ak[e [1e 1e[8 1D[e 1a[e ke[M [!kMe [kV", -"e V[ake [le [8le V[le le[s [*k +k[* Dk[* ak[* [1* 1+[* 1D[* 1a[* k*[M [+kMe", -" Vk[* V[+ke [l* [+le V[l* l*[s Gk[e [!Gke [kJe Jk[ae 1G[e [1G8e Je[1 J1[8e ", -"[GkMe keM[!G JkV[e V[aJke [Gle [lG8e [Jle [slJe [fk [+fk Jk[f gk[f [f1 [1f8", -" J1[f g1[f [kfM [f+kM fkV[ Vfg[k lf[ l+[f [lVf g[lf ke[2 [!ke2 [Dke2 [ake2 ", -"1e[5 [158e [15De [1a5e [kMe2 keM[!2 V[ke2 [akVe2 [5le [l58e [lV5e [sl5e ke[", -"; [+ke; [;Dke [a;ke 1e[; [1>e [1;De [>1De [;kMe ke;[+M V[;ke Vek[a; [5l* >e", -"[l [l;Ve V>[le [Gke2 ke2[!G Jk[e2 [aeJk2 [1G5e G5k[8e J1[5e J1e[5a keM[G2 k", -"e[!GM2 V[eJk2 akVe[J2 [lG5e [5Gle8 lJ[5e lJ5[se [;fk [f+k; [fJk; g[fk; [1f5", -" >k[f [f1J5 J>k[f [fkM; [+kfM; Vf[k; g[kVf; l;[f [>lf Vf5[l J>l[f ke[P keP[", -"! keDP [akeP 1e[P [18eP [1DeP [1aeP [kSe S[ke! SkVe SVeak S[le S[8le SVle [", -"slSe kP[* [+keP [*DkP [a*kP 1P[* [1+eP [1*DP [1aP* Sk[* S[+ke SVek* SV+ke S", -"[l* [l+Se [l*SV [s*Sl [kYe Yk[e! YeJk YJkae Ye[1 Y1[8e YJ1[e YJ8ke S[Yke Yk", -"[Se! ]ke ak]e [Yle lY[8e ]le ls]e Yk[f Yfk[+ JfYk gYk[f Y1[f [f1Y+ [f1YJ g[", -"1Yf fkS[ Sf[+k ]fk gf]k [lSf lYf[+ ]lf gl]f ke[m [mke! [mDke [amke 1e[m [1m", -"8e [1mDe [1aem S[kem [mkSe! SVekm SakVem le[p [pl8e [plVe [psle km[* [+mke ", -"[m*Dk [amk* 1m[* [>1em [1mD* >kDeP S[;ke S+k[m* SVek; S+kVem l*[p [p*l> [p*", -"Vl V>eSl Yk[em [meYk! YJkem YaeJkm Y1[5e Y1e[8m YJ5ke Y1e[5a Yk[Sem ke[mSY!", -" ke]m ]akem [plYe lY8[pe le]p ]lpse fk[v [vf+k [vJfk g[vfk f1[v [v1f> [v1Jf", -" J>kYf [vfSk Sf+[vk fv]k ]gfvk [plf fp[l> lf]p yl]f ht[ [&ht hD[t ht[c h1[ ", -"[:h hD[1 [ch: [thM ht[M& V[ht Vh[tc lh[ lh[: [lVh u[h t*[ [-t tD[* [ct- [1t", -"* [:- t*[1D :c[- tM[* [t-M V[t* V[t- t*[l l-[ lhV[* u[- [htG tG[h& [Jht tJ[", -"hc hG[1 [h:G [Jh1 hJ[: tG[hM [h&tGM tJV[h Vh[tJc [hlG [:lhG hJ[l hJu[ tf[ [", -"-tf [ftJ i[t h1[f :f[ [f1tJ i[: [tfM [-tfM V[tf V[it [ltf [:lf lJh[f ui[ h2", -"[t ht[&2 ht[D2 [cht2 [ht5 h5[: t5[hD [:hc5 ht[M2 hM&[t2 Vh[t2 [ctVh2 h5[l [", -":lh5 lhV[5 h5u[ [ht; t;[- t;[hD [-tc; [1h; [:h> t5[D* [:-c> t;[hM [-tM; Vh;", -"[t V-[t; h;[l [>l- lh;V[ h>u[ tG[h2 [h&tG2 tJ[h2 [chtJ2 tG5[h [:hG5 tJ5[h :", -"J[h5 [h2tGM hG[&tM2 Vh[tJ2 h2tJ[cV lh[G5 lhG[:5 lJh[5 uh5[J t;[f [-tf; tJ;[", -"f t;i[ t5[f [>tf tf5[J t>i[ tf[M; tfM[-; tfV[; iV[t; lh;[f l-[f> Vf5[t i[u>", -" htP h&tP hDtP tchP tPh1 hP[: htP1D [:hcP Sht S&ht VhSt htSc Shl Sh: SlVh u", -"hS t*hP hPt- tP*hD [-tcP tP*h1 :P[- tPD[1* [:-cP S*ht St[- St*Vh V-[St l*Sh", -" Shl- ShlV* Shu- tYh Y&ht tJhY htYc h1tY hY[: hY1tJ tY:hJ tYSh ShtY& ]ht ht", -"]c lYh Y:Sh ]lh ]uh tYf tY- YJtf itY Y1tf Y:tf tYfJ1 tYi: Sft tYS- ]tf ]it ", -"Shlf tYl- lf]h ui] tmhP tm[h& tm[hD [cmht t5hP hm[: t5PhD [:mhc hmSt Shtm& ", -"VhmSt Shctm tpSh S:hp hplSV hpu[ t;hP tm[- tm[D* [-mtc t5[m* ht>P t5Dh;P [:", -"-cm h;St [-mSt Sh;Vt V-[tm l;Sh S:h> [p*Vt h>uS hmtY tYhm& tJmhY tYchm h5tY", -" [:mhY tY5hJ [:mhJ ShtYm tYmSh& ht]m ]htcm hplY [p:hY hp]l ]puh tYhv Y-tv h", -"v[tJ tYiv h1[v tYh> [v1hJ tYi> tvSh [-vSt hv]t ]tiv hvlY h>lY lv]h ]yui n n", -"! nB an n. 8n n.B 8na nK n!K Tn Tna nj 8nj Tnj sn n( +n n(B +na n(. +n8 .Bn", -"( +8an n(K +nK Tn( +Tn nj( +nj T(nj sn+ nE n!E Hn Hna nE. 8nE Hn. H8n nEK E", -"Kn! HnT HTan njE 8Enj Hnj snH dn +nd Hnd gn dn. 8dn H.dn gn8 dnK +Kdn Tdn g", -"nT dnj dn+j dnHj gsn 4n 4n! 4nB 4an 5n 48n 5nB 5an 4nK n!4K 4Tn Tn4a 4jn 8n", -"4j 5Tn s4n ;n 4+n ;nB a;n 5n; >n 5B;n >na ;nK 4K+n T;n +n4T ;nj >nj T;5n >n", -"s 4nE n!4E 4Hn Hn4a 5nE 4E8n H5n Hn48 nE4K 4nE!K Hn4T 4HTan 4Enj njE48 Hn4j", -" 4Hsn 4dn +n4d H;n g4n 5dn >nd 5dHn >ng 4Kdn dnK4+ T;Hn 4Tgn dn4j dn>j Td5n", -" gs>n Pn n!P PnB aPn Pn. 8Pn n.PB aP8n Qn Qn! QnT Qan Qnj Q8n PjTn sPn Pn( ", -"+Pn n(PB aP+n n(P. 8P+n Pn(.B aPn+8 Qn( +Qn Q(Tn Qa+n Q(nj Q8+n Pj(Tn +Qsn ", -"Wn Wn! HPn Wan Wn. W8n H.Wn W8Hn WnQ Q!Wn Zn Zna Wnj Q8Wn Znj sZn Wnd +Wn d", -"PHn gPn W.dn W8+n dP.Hn W8gn Qdn Wn+Q Znd gZn dnWj Wn+j dnZj gnsZ o o! oB o", -"a o5 o8 o5B o8a oQ o!Q oT oTa op op8 opT os o; o+ o;B o+a o5; o> 5;oB o>a o", -"Q; o+Q oT; o+T op; o>p pTo; os> oW o!W oH oHa o5W o8W oH5 oH8 oWQ Q!oW oZ o", -"Za opW pWo8 oZp osZ ov ov+ ovH go ov5 o>v vHo5 go> ovQ v+oQ oZv goZ opv pvo", -"> opZv yo n# &n n#B an& n#. 8n& .Bn# 8a&n n#K &nK Tn# T&n nj# &nj T#nj sn& ", -"n#( +n& #Bn( +a&n #(n. +8&n n#(.B an&+8 #(nK +K&n n#T( T&+n j#n( &n+j nj#T(", -" +ns& n#E &nE Hn# H&n #En. 8E&n n#H. 8nH& EKn# nK&E H#Tn T&Hn j#nE &Enj H#n", -"j H&sn dn# d&n H#dn gn& n#d. d&8n dn#H. 8ng& n#dK dK&n T#dn T&gn d#nj &ndj ", -"dnjH# g&sn 4n# 4&n n#4B an4& 5n# 5&n n#5B an5& n#4K 4K&n 4#Tn Tn4& 4#nj &n4", -"j 5#Tn 4&sn ;n# ;&n nB;# ;&an 5#;n >n& ;n#5B an>& n#;K ;K&n T#;n ;&Tn ;#nj ", -"&n>j ;njT# >&sn n#4E 4E&n 4#Hn Hn4& n#5E 5E&n H#5n 5&Hn 4n#EK &nE4K 4HTn# 4", -"H&Tn nj#4E &nj4E 4Hjn# snH4& 4#dn dn4& H#;n 4&gn 5#dn d&>n H5nd# >&gn dn#4K", -" d&n4K 4Tdn# g4T&n dnj4# >nd&j ;njH# >ngs& Pn# P&n n#PB P&an n#P. P&8n Pn#.", -"B aP&8n Qn# Q&n Q#Tn T&Qn Q#nj 8nQ& Pj#Tn Q&sn n#P( P&+n Pn#(B aP&+n Pn#(. ", -"P&n+8 n#(P.B +P8an& n#Q( Q&+n QnT#( +QnT& Pj#n( P&j+n TP#nj( sP+&n Wn# W&n ", -"H#Wn W&Hn n#W. 8nW& HPn#. H8P&n W#Qn Q&Wn Zn# Z&n W#nj &nWj njZ# Z&sn W#dn ", -"W&+n dP#Hn W&gn dP#n. dP&8n HP#dn. gP8&n Q#dn d&Qn dnZ# Z&gn dPjn# dP&nj Zn", -"dj# Z&ngs o# o& o#B oa& o5# o8& 5Bo# 5ao& oQ# o&Q oT# oT& op# op& pTo# os& ", -"o;# o+& ;#oB a;o& 5;o# o>& o5;#B >&oa Q;o# +Qo& T;o# +To& p;o# p>o& opT;# o", -"&s> oW# o&W oH# oH& 5Wo# 5Wo& H5o# H5o& WQo# W&oQ oZ# oZ& pWo# oWp& Z#op Z&", -"os ov# ov& vHo# go& v5o# v>o& ovH5# o&g> vQo# oQv& Z#ov Z&go o#pv pvo& oZpv", -"# yo& nC n!C Dn Dna nC. 8nC Dn. D8n nCK CKn! DnT DTan njC 8Cnj Dnj snD nC( ", -"+nC Dn( +Dn C(n. +C8n n(D. D8+n CKn( nC+K D(Tn Dn+T jCn( +Cnj D(nj +Dsn nCE", -" !CnE HnD HDan CEn. nC8E H.Dn D8Hn EKnC n!CEK HDTn HnDTa jCnE njC8E DnHj Hn", -"sD dnC +Cdn Ddn gnD nCd. 8Cdn D.dn D8gn nCdK dnC+K TdDn DngT dCnj dnj+C dnD", -"j gDsn 4nC n!4C 4Dn Dn4a 5nC 4C8n 5Dn D85n nC4K 4nC!K Dn4T 4DTan 4Cnj njC48", -" Dn4j 4Dsn ;nC 4C+n D;n +n4D 5C;n >nC D;5n >nD nC;K ;nC+K T;Dn a;nDT ;Cnj n", -"j>C ;nDj >Dsn nC4E 4nC!E Hn4D 4HDan nC5E 48nCE 5DHn 4H8Dn 4nCEK n!C4EK 4HDT", -"n HnD4Ta njC4E 48CnjE 4HjDn snH4D 4Cdn dnC4+ D;Hn 4Dgn 5Cdn dn>C Dd5n >Dgn ", -"dnC4K 4+CdnK 4DdTn g4DTn dnj4C >ndjC dnj4D >ngsD PnC PCn! DPn aPDn nCP. Pn8", -"C PnD. 8PDn QnC n!QC QDn DnQa QCnj QC8n DjQn QDsn nCP( Pn+C PnD( DP+n PnC(.", -" +P8nC DPn(. +DP8n nCQ( +CQn Q(Dn QD+n PjCn( +Qn8C QDnj( sP+Dn WnC n!WC WDn", -" DnWa nCW. WC8n W.Dn D8Wn WCQn WnQ!C ZnD DnZa WCnj W8nQC DnZj sDZn WCdn +CW", -"n DdWn WDgn dPCn. +Wn8C WDnd. gPD8n QCdn +WnQC DdZn gDZn dPjnC +WnjC ZnDdj ", -"gZnsD oC o!C oD oDa o5C o8C oD5 oD8 oQC Q!oC oDQ QDoa opC p8oC opD osD o;C ", -"o+C oD; o+D 5;oC o>C 5Do; o>D Q;oC +QoC QDo; +QoD p;oC >Cop o;pD oDs> oWC W", -"!oC oHD WDoa 5WoC W8oC H5oD H8oD WQoC o!WQC oZD ZDoa pWoC opW8C oDZp oDsZ o", -"vC v+oC ovD goD v5oC >Cov o5vD oDg> vQoC ov+QC oDZv oDgZ oCpv o>pvC pvoD yo", -"D bn bn& bnD cn bn. b8n b.Dn cn8 bnK bK&n bTn cnT bnj 8nbj Dnbj scn bn( b+n", -" b(Dn cn+ n(b. +nb8 bnD(. +nc8 n(bK bK+n b(Tn +Tcn b(nj +nbj bTnj( s+cn bnE", -" bE&n bHn cnH nEb. bE8n b.Hn H8cn nEbK &nEbK HnbT HncT bEnj &njbE Hnbj sHcn", -" bdn +nbd Hnbd gcn b.dn 8dbn bHnd. g8cn bKdn d&nbK Tdbn gTcn dnbj d&nbj dnj", -"bH gnsc 4bn bn4& bn4D c4n b5n bn48 5Dbn c5n 4Kbn &nK4b bn4T 4Tcn bn4j &nj4b", -" 5Tbn c4sn b;n bn4+ D;bn c;n 5nb; >nb b5nD; c>n bK;n ;&nbK T;bn T;cn ;nbj b", -"n>j ;njbT sc>n 4Ebn &nE4b bn4H 4Hcn bE5n 4b8nE H5bn H5cn 4bnEK 4bE&nK 4bHTn", -" c4HTn 4bjnE &nE4bj 4bHnj c5nsH bn4d d&n4b H;bn c4gn 5dbn bd>n bH5dn gc>n 4", -"bdnK d&Kb;n 4bTdn c;ngT dnj4b >nbdj ;njbH c>ngs bPn P&bn DPbn cPn Pnb. 8Pbn", -" bPDn. 8Pcn bQn Q&bn QDbn cQn Qnbj Q8bn bQnDj cQsn Pnb( +Pbn bPDn( +Pcn bPn", -"(. b+P8n DP(bn. cP+8n b(Qn +Qbn bQnD( +Qcn bQnj( b+Q8n Pj(bTn cQns+ bWn W&b", -"n HPbn cWn b.Wn W8bn bHPn. W8cn WnbQ bWnQ& Zbn Zcn Wnbj &njbW bnZj snZc Wnb", -"d +Wbn bHPdn cWgn bWnd. b+W8n dP.bHn cWng8 Qdbn d&nbQ bdZn gnZc dPjbn b+Wnj", -" Zbndj Zcngs ob ob& obD oc ob5 ob8 b5oD oc5 obQ bQo& obT ocQ opb pbo8 pboD ", -"osc ob; ob+ b;oD oc+ b5o; o>b ob5D; oc> bQo; b+oQ bTo; o+cQ o;pb p>ob opbD;", -" c>os obW bWo& obH ocH b5oW bWo8 bHo5 oHc5 bWoQ obWQ& oZb ocZ oWpb opbW8 op", -"Zb Zcos ovb vbo+ vboH goc o5vb v>ob ovbH5 c>go oQvb ovb+Q ovZb Zcgo pvob o>", -"bpv oZbpv yoc 6n 6!n 6nB 6an 1n 68n 1nB 1an 6nK n!6K 6Tn Tn6a 6jn 8n6j 1Tn ", -"s6n 6n( 6+n n(6B +n6a 1n( 1+n n(1B +n1a n(6K 6K+n 6(Tn +n6T 6(nj +n6j 1(Tn ", -"6+sn 6nE n!6E 6Hn Hn6a 1nE 6E8n 1Hn H81n nE6K 6!nEK Hn6T 6HTan 6Enj njE68 H", -"n6j 6Hsn 6dn +n6d Hn6d g6n 1dn +n1d Hn1d g1n 6Kdn dnK6+ Tn6d 6Tgn dn6j dnj6", -"+ Td1n s6gn 46n 4n6! 6n4B 46an 7n 78n 7Bn 7an 6n4K 6!4nK 46Tn 4T6an 7nj 8n7", -"j 7Tn 7sn 6;n +n6; 6B;n an6; 7;n >n7 ;n7B 7a>n 6K;n ;nK6+ Tn6; a;n6T ;n7j 7", -"n>j T;7n >n7s 6n4E 6!4nE 46Hn 4H6an 7nE 8n7E 7Hn H87n 46nEK 4nE6!K 4H6Tn 6H", -"T4an nj7E 78njE Hn7T 7Hsn dn6; 4+6dn Hn6; 6;gn 7dn 7d>n H;7n g7n dnK6; 4+6d", -"nK 4Td6n g46Tn dn7j 7>dnj Td7n gn7s 6P 6P! 6PB 6aP 6P1 68P 6B1P 1a6P 6QP Q!", -"6P 6TP Qa6P 6Pj Q86P 1T6P s6P 6P( 6+P P(6B +P6a 6(1P 1+6P 6P1(B 6+P1a 6(Qn ", -"+Q6P 6(TP +T6P 6(Pj +Q1n 6TP1( 6+sP 6WP 6!Wn 6HP HP6a 1Wn W86P 1H6P H86P Wn", -"6Q 6WQn! Z6P 6aZn Wn6j 6W8Qn Z1n Z6sP 6dP +W6P HP6d g6P 1d6P +W1n 6HP1d 68g", -"P Qd6P 6+WQn 6dZn Z6gP Qd1n dPj6+ 1dZn s6gP o6 o!6 o6B oa6 7o 7o8 7oB 7oa o", -"6Q 6Qo! oT6 6Qoa 7op o87p 7oT os7 o6; o+6 6;oB 6+oa 7o; o>7 o;7B 7ao> 6Qo; ", -"6+oQ 6To; 6+oT 7;op 7po> 7;oT o>7s o6W 6Wo! oH6 6Hoa 7oW o87W 7oH oH7a 6WoQ", -" o!6WQ oZ6 oaZ6 op7W 7opW8 7Zo os7Z ov6 v6o+ v6oH go6 7vo o>7v ov7H go7 oQv", -"6 ov6+Q ovZ6 g6oZ op7v 7p>ov oZ7v yo7 9n 6&n 9nB 9an 9n1 :n 1B9n :na 9nK 6K", -"&n 9Tn T&9n 9nj :nj 1T9n s:n 9n( 9+n n(9B +n9a 9(1n :n+ 9n1(B +n:a n(9K 9K+", -"n 9(Tn +T9n 9(nj +n:j 9Tn1( s+:n 9nE 6E&n 9Hn H&9n 9E1n :nE 1H9n :Hn nE9K &", -"nE6K Hn9T 6H&Tn 9Enj nj:E Hn9j :Hsn 9dn +n9d Hn9d g9n 1d9n :dn 9Hn1d g:n 9K", -"dn d&n6K Td9n 9Tgn dn9j dn:j dnj9H gns: 49n 9n4& 4B9n 9n4a 79n 7:n 9n7B :n7", -"a 4K9n &nK49 9n4T 49Tan 9n7j 7j:n 9T7n 7:sn 9;n 9n4+ 9B;n a;9n 9;7n >n: 7B9", -";n :a>n 9K;n ;&n6K T;9n a;n9T ;n9j >j:n 7T9;n s:>n 4E9n &nE49 9n4H 49Han 9n", -"7E 7E:n 9H7n :n7H 49nEK 49E&nK 49HTn 9Hn4T& 79njE 7:njE 7H9Tn 7:Hsn 9n4d d&", -"n49 H;9n 49gn 9d7n :d>n 7H9dn >ng: 49dnK d&K9;n 49Tdn g49Tn 7d9nj 7:dnj 7Td", -"9n g:n7s 6P9 6P& 6B9P 9a6P 1P9n :P6 6P19B 6a:P 9Qn Q&6P 9T6P Qa9n 9P6j :Qn ", -"6TP9j :Qsn 6(9P 9+6P 6P9(B 6+P9a 6P19( 6+:P 1P(9nB :P6+a 9(Qn +Q9n 6TP9( 6+", -"T9P 6Pj9( +Q:n Pj(9Tn :Qns+ 9Wn W&6P 9H6P HP6& 1W9n :Wn 6HP91 6H:P Wn9Q 6W&", -"Qn Z9n 6PZ& Wn9j Wn:Q 9nZ1 Z:n 9d6P +W9n 6HP9d 6Pg9 6dP91 6d:P 1HP9dn :Wgn ", -"Qd9n dP&6Q 9dZn Z9gn dPj9n Qd:n Z9n1d gnZ: o9 o9& o9B o9a 7o9 o: 7Bo9 o:a o", -"9Q 6Qo& o9T 6To& op9 o:p o97T os: o9; o9+ 9;oB 9+oa 7;o9 o:> 7o9;B oa:> 9Qo", -"; 9+oQ 9To; 9+oT o;p9 o>:p 7oT9; s:o> o9W 6Wo& o9H 6Ho& o97W o:W o97H o:H 9", -"WoQ o9WQ& oZ9 o9Z& oWp9 op:W Z97o Z:o ov9 v6o& v9oH go9 o97v :vo 7oHv9 go: ", -"oQv9 ov9+Q ovZ9 g9oZ pvo9 op:v oZ97v yo: 6nC n!6C 6Dn Dn6a 1nC 6C8n 1Dn D81", -"n nC6K 6!nCK Dn6T 6DTan 6Cnj njC68 Dn6j 6Dsn nC6( 6C+n 6(Dn +n6D nC1( 1C+n ", -"1(Dn +D1n 6nC(K 6+nCK 6DTn( 6+DTn njC6( 6+jnC 6Djn( sn+6D nC6E 6!nCE Hn6D 6", -"HDan nC1E 68nCE Hn1D 6H8Dn 6nCEK n!C6EK 6HDTn HnD6Ta njC6E 68CnjE 6HjDn snH", -"6D 6Cdn dnC6+ Dn6d 6Dgn 1Cdn 68dnC Dd1n 1Dgn dnC6K 6+CdnK 6DdTn g6DTn dnj6C", -" dnC6+j dnj6D gs6Dn 6n4C 6!4nC 46Dn 4D6an 7nC 8n7C 7Dn D87n 46nCK 4nC6!K 4D", -"T6n 6DT4an nj7C 78njC Dn7T 7Dsn 6C;n ;nC6+ Dn6; a;n6D ;n7C 7n>C D;7n 7D>n ;", -"nC6K 6+C;nK 6D;Tn +Dn6T; ;nj7C 7>jnC 7DT;n 7s>Dn 46nCE 4nC6!E 4H6Dn 6HD4an ", -"nC7E 78nCE Hn7D 7HD8n 6nC4EK 4n6!EKC 6HD4Tn 46anHDT 7njCE njC78E 7HDTn 7sHD", -"n dnC6; 4+6dnC 4Dd6n g46Dn dn7C 7>dnC Dd7n 7Dgn 6dC;nK dn6;+CK Ddn6T; 6D;gn", -"T 7dnjC >nj7dC 7DdTn g7sDn 6PC PC6! 6DP DP6a 6C1P 6C8P 1D6P D86P 6CQn 6QP!C", -" QD6P 6QDaP 6CPj 6Q8PC QD1n 6DsP PC6( 6C+P 6(DP +D6P 6P1C( 6+P1C 6DP1( 6+D1", -"P 6QPC( 6+QPC 6QDP( 6+QDP 6PjC( 6+PjC 6DPj( s6P+D 6CWn 6WP!C HP6D 6HPDa 1CW", -"n 6W8PC WD1n 6H8DP 6WQPC WnC6Q! 6DZn Z6DaP 6WjPC PjC6W8 1DZn Z1nsD 6CdP 6+W", -"PC Dd6P 6DgP 6dP1C 68dPC 6Dd1P g6P1D 6QdPC dPC6+Q Z6DdP gZ6DP dPj6C dPC6+j ", -"Z1nDd Z1ngD o6C 6!oC oD6 6Doa 7oC 7Co8 7oD oD7a 6QoC o!6QC 6QoD oD6Qa 7Cop ", -"7op8C op7D 7Dos 6;oC 6+oC 6Do; 6+oD o;7C >C7o 7;oD 7Do> o6Q;C o+6QC oD6Q; o", -"+D6Q 7op;C 7p>oC 7oDp; os7>D 6WoC o!6WC 6HoD oH6Da oW7C 7oW8C oH7D 7oHD8 o6", -"WQC 6WQo!C oDZ6 oZ6Da 7opWC op87WC 7DoZ osZ7D oCv6 ov6+C v6oD oDg6 7Cov 7vo", -">C ov7D 7Dgo ov6QC v6Qo+C Zv6oD goZ6D 7vopC o>p7vC 7vDoZ 7oyD b6n 6&bn 9Dn ", -"c6n b1n :nb 1Dbn :cn bK9n &nKb6 6Tbn 6Tcn 6jbn bn:j 1Tbn :csn b(9n 6+bn 9(D", -"n 6+cn b(1n b+:n b1nD( :+cn b6n(K b6+nK b6Tn( c6+Tn b6jn( :nb+j b1Tn( :cns+", -" bE9n &nEb6 6Hbn 6Hcn bE1n bn:E 1Hbn cn:H b6nEK b6E&nK b6HTn c6HTn b6jnE :n", -"bjE b6Hnj :cnsH 6dbn d&nb6 Dd9n c6gn 1dbn bd:n b1Hdn :cgn b6dnK dnKb6+ b6Td", -"n gc6Tn dnjb6 :dnbj dnj9D g:nsc bn49 4b6&n 9n4D 49cn 7bn :n7b bn7D 7cn 4b6n", -"K 4b6&nK 4bT9n c46Tn bn7j 7:bnj bT7n sn7c 6;bn ;&nb6 D;9n 6;cn b;7n 7b>n 7b", -"D;n >n7c b6;nK ;nKb6+ b6T;n c6;Tn 7b;nj 7>bnj 7bT;n c>n7s 4b6nE 4b6&nE 4bH9", -"n c46Hn bn7E 7:bnE bH7n cn7H bnE49K 4Eb6&nK bHn49T 49HcnT 7bnjE :nj7bE 7bHT", -"n 7csHn 4bd9n b6d;&n 49Ddn c6;gn bd7n 7:dbn 7bHdn gn7c dnKb6; dn4&b6K bTn49", -"d c4Tg9n 7bdnj 7bj:dn 7bTdn g7csn b6P 6&bP 6DbP c6P 6Pb1 b6:P b6P1D c6:P 6Q", -"bP b6QP& 6TbP 6QcP 6Pbj bQ:n b6T1P c6sP b(6P 6+bP b6PD( 6+cP b6P1( :Pb6+ b6", -"(1DP :cP6+ b6QP( b6+Qn b6TP( c6Q+P b6Pj( :Qnb+ Pj(b6T :cQ+n 6WbP b6WP& 6HbP", -" 6HcP 1Wbn bW:n b6H1P cW:n b6WQn 6W&bQn b6Zn c6Zn b6WPj :WnbQ b1Zn :cZn 6db", -"P dP&b6 b6HdP c6gP b6d1P :Wnb+ 6HPb1d g:Pc6 b6QdP b6QdP& Zb6dP Zc6gP dPjb6 ", -":Qdbn Zb1dn Z:ngc ob6 b6o& o9D oc6 7ob o:b ob7D 7co b6oQ ob6Q& b6oT o9cQ op", -"7b ob:p ob7T os7c b6o; b6o+ 9Do; o9c; 7;ob 7bo> 7obD; c>o: ob6Q; ob+6Q obT6", -"; oc6+Q 7obp; o:p>b 7obT; os:c> b6oW ob6W& b6oH o9cW ob7W ob:W ob7H 7Hoc ob", -"6WQ b6Wo&Q obZ6 Z6oc 7obpW o:pbW 7boZ oc7Z vbo9 ovb6+ v9oD g6oc ov7b ob:v 7", -"vboH 7cgo ovb6Q obQv6& oZbv6 cv6oZ 7vbop :vopb 7Zbov 7cyo Rn Rn! RnB Ran Rn", -". R8n n.RB 8nRa Mn Mn! RTn aMn Rjn 8Mn TnRj sRn Rn( R+n n(RB +nRa n(R. +nR8", -" Rn(.B R+8an Mn( +Mn R(Tn +nRT R(nj +nRj Mn(Tj R+sn RnE n!RE RHn HnRa nER. ", -"RE8n R.Hn HnR8 MnE MEn! HMn aMHn REnj 8EMn HnRj RHsn Rdn +nRd HnRd gRn R.dn", -" 8nRd dn.RH R8gn dMn dM+n TnRd gMn dnRj dM8n dMnHj sRgn R4 R4! R4B R4a R45 ", -"R48 RB5n 48Ra R4M 4!Mn R4T 4TRa R4j 48Rj 4TR5 sR4 R4; R4+ RB;n 4+Ra 5nR; >n", -"R ;nBR5 R4>a M;n 4MR+ 4TR; 4+RT 4jR; >Mn M;n5T sR>n R4E 4!RE R4H 4HRa RE5n ", -"RE48 4HR5 4HR8 RE4M MnE4! 4HRT aMn4H RE4j R48ME 4HRj R4sH R4d 4+Rd 4HRd gR4", -" 4dR5 R4>d R4H5d gR>n 4MRd dMn4+ 4TRd R4gM 4dRj dM>n dMnH5 gM>n RPn n!RP Pn", -"RB RPan PnR. RP8n RPn.B aPnR8 Sn S!n STn San Snj S8n TnSj Ssn PnR( RP+n RPn", -"(B aPnR+ RPn(. R+8Pn Pn(R.B R+8aPn Sn( S+n TnS( +TSn njS( +nS8 STnj( S+sn R", -"Wn R!Wn HnRW WnRa R.Wn WnR8 RHWn. RH8Wn SWn WnS! SZn ZnSa WnSj W8Sn SjZn sn", -"SZ WnRd +nRW RHWdn RWgn dP.Rn R+W8n RHWdn. gRW8n Sdn +WSn ZnSd gSn dnSj 8dS", -"n SZdnj gnSs oR o!R oRB oaR oR5 o8R R5oB R5oa So So! SoT Soa Sop So8 oTSp o", -"sS oR; o+R R;oB R+oa R5o; o>R oR5;B >Roa So; So+ oTS; o+Sa opS; S>o SpTo; o", -"sS> oRW RWo! oHR RHoa R5oW RWo8 RHo5 RHo8 SoW o!SW oZS SaoZ SWop SWo8 SpoZ ", -"oZSs ovR vRo+ vRoH goR o5vR vRo> ovRH5 gRo> Svo ovS+ oZSv goS opSv o>Sv SZp", -"ov yoS Rn# R&n n#RB anR& n#R. 8nR& Rn#.B an&R8 Mn# M&n R#Tn TnR& R#nj M&8n ", -"Mn#Tj R&sn n#R( +nR& Rn#(B an&R+ Rn#(. R+8&n n#(R.B R+8an& n#M( M&+n Mn#T( ", -"aMn+& Mn#j( M&n+j RT#nj( sn+R& n#RE RE&n R#Hn HnR& Rn#E. &nER8 RHn#. RH8&n ", -"n#ME ME&n H#Mn M&Hn Mn#jE M&n8E RHjn# snHR& R#dn dnR& dn#RH R&gn dn#R. d&nR", -"8 RH#dn. gR8&n d#Mn M&dn dMnH# M&gn dMnj# dM&8n dM#Hnj gsR&n R4# R4& 4#RB 4", -"aR& R#5n 48R& R45#B R48a& R#4M 4MR& R#4T 4TR& R#4j 4&Rj R4T5# R4s& R#;n 4+R", -"& ;n#RB a;nR& ;n#R5 R4>& R5#;nB >nRa& M#;n ;&Mn M;nT# aM;&n M;n5# M&>n M;#5", -"Tn >Mns& 4#RE RE4& R#4H 4HR& R45#E R48&E R4H5# R4H5& Mn#4E M&n4E R4HT# M&n4", -"H R4j#E M&n5E R4Hj# sR4H& R#4d 4dR& R4Hd# R4g& R4d5# >nRd& dn#RH5 >ngR& dMn", -"4# dM&R4 M;nH# gR4T& dMn5# >Mnd& dM#H5n >Mg&n PnR# RP&n RPn#B aP&Rn RPn#. P", -"&nR8 Pn#R.B R8aP&n Sn# S&n TnS# T&Sn njS# 8nS& STnj# S&sn RPn#( P&nR+ Pn#R(", -"B R+aP&n Pn#R(. R+8P&n .BR(Pn# aP8nR+& n#S( +nS& STn#( S+T&n Snj#( S+8&n nj", -"#ST( Ss+&n R#Wn WnR& RHWn# RH&Wn RWn#. RW8&n Hn#RW. H8nRW& WnS# W&Sn S#Zn Z", -"nS& SWnj# S8W&n SZnj# SZ&sn dP#Rn dP&Rn RHWdn# gRW&n RW#dn. RW8d&n dPHnR#. ", -"RW8gn& dnS# d&Sn SZdn# S&gn Sdnj# S8d&n ZnjSd# gSs&n oR# o&R R#oB Rao& R5o#", -" R5o& oR5#B o8Ra& So# So& S#oT oTS& S#op opS& SpTo# S&os R;o# R+o& oR;#B o+", -"Ra& oR5;# >Ro& R5;o#B o>Ra& o;S# o+S& S;To# Sa;o& Sp;o# S&o> opTS;# os>S& R", -"Wo# RWo& RHo# RHo& oR5W# o8RW& oHR5# oH8R& oWS# SWo& S#oZ S&oZ SpWo# Sp&oW ", -"SZpo# osZS& o#vR vRo& ovRH# o&gR ovR5# o>vR& vR5oH# go>R& S#ov ovS& SvoZ# S", -"&go Svop# Sv&o> oZpSv# Soy& Un Un! RDn Uan Un. U8n R.Dn D8Un UnM U!Mn Vn Vn", -"a Unj 8MUn Vnj snV Un( U+n R(Dn +DUn n(U. +nU8 RDn(. R+D8n U(Mn +MUn Vn( V+", -"n U(nj +nUj njV( V+sn UnE n!UE UHn HnUa nEU. UE8n U.Hn H8Un UEMn MnEU! VnH ", -"HnVa UEnj U8nME HnVj sHVn Udn +nUd HnUd gUn U.dn 8dUn RDdn. U8gn dMUn dMnU+", -" Vdn gVn dnUj dMnU8 dnVj sngV R4U 4!Un R4D 4URa U5n 4UR8 4DR5 4DR8 Un4M Mn!", -"4U V4R R4Va 4URj R48Uj V5n V4sR U;n 4UR+ 4DR; 4+RD 5nU; >nU R4D5; R4>D M;Un", -" M;nU+ V;n R4V+ ;nUj Un>M 5nV; V>n RE4U R4U!E 4URH R4HUa UE5n R48UE H5Un R4", -"HU8 MnE4U 4UEMn! R4VH V4RHa R4jUE MnE4U8 H5Vn snV4H 4URd R4+Ud 4DRd R4gU 5d", -"Un Ud>n R4D5d gU>n dMn4U 4U+dMn R4Vd V4gR dMnU5 >MnUd 5dVn >ngV UPn n!UP DP", -"Un aPUn PnU. 8PUn RDPn. RD8Pn SUn UnS! SVn VnSa UnSj U8Sn SjVn snSV PnU( +P", -"Un RDPn( R+DPn UPn(. U+P8n DP(Un. +DPU8n UnS( U+Sn S(Vn VnS+ SUnj( S+U8n SV", -"nj( SV+sn UWn U!Wn HPUn WaUn U.Wn W8Un RWDn. RWD8n UWSn S!UWn ZnV ZaVn WnUj", -" S8UWn ZjVn VZsn WnUd +WUn RWDdn UWgn UWnd. U+W8n dP.UHn gUP8n UdSn S+UWn V", -"dZn SVgn SdUnj S8dUn SVdnj gVnSs oU oU! oUD oUa oU5 oU8 R5oD RDo8 SoU S!oU ", -"oV oVa opU oUS8 oVp oVs oU; oU+ RDo; R+oD U5o; o>U oU5D; >RoD oUS; oUS+ oV;", -" oV+ o;pU oUS> V;op oV> oUW UWo! oUH UHoa U5oW UWo8 UHo5 UHo8 SWoU oUWS! oV", -"Z VZoa oWpU opUW8 VpoZ sZoV ovU vUo+ vRoD goU o5vU v>oU ovUH5 gUo> oUSv Svo", -"U+ oVv goV pvoU o>USv opVv yoV Rbn U&n bnRD cRn R.bn bnR8 RbDn. R8cn bMn M&", -"bn Vnb cnV bnRj 8Mbn bnVj cRsn R(bn bnR+ RbDn( R+cn Rbn(. Rb+8n bn(RD. cR+8", -"n b(Mn +Mbn bnV( V+cn Rbjn( &njU+ Vnbj( snVc+ REbn UE&n bnRH RHcn RbnE. Rb8", -"nE RbHn. cRH8n bEMn M&nbE bHVn cHVn RbjnE &njUE VnbHj snVcH bnRd d&Un RbHdn", -" cRgn Rbdn. d&nU8 dn.RbH gcR8n dMbn dM&bn bdVn cngV dMnbj dMnb8 Vdnbj gVnsc", -" R4b 4bR& 4bRD cR4 4bR5 4bR8 R4b5D R4c5 4MRb M&n4b R4Vb V4cR 4bRj M&nb5 b5V", -"n cRs4 4bR; 4bR+ R4bD; R4c; R4b5; R4>b b5nRD; cR>n M;bn M;&bn b;Vn V;cn M;n", -"b5 bM>n V5nb; cnV> RE4b R4b&E 4bRH R4cH R4b5E R4b8E R4bH5 cR4H5 R4bME M&ER4", -"b V4RbH cR4VH R4bjE M&Eb5n V5nbH cR4sH 4bRd d&n4U R4bH; cRg4 R4b5d >nbRd 4b", -"HR5d c>Rg4 dMn4b R4bdM& V4dRb gV4cR dMnb5 >Mbdn V5dbn V>ngc UPbn P&Un RbDPn", -" UPcn RbPn. Rb8Pn bPnRD. cR8Pn Sbn bnS& VnSb Scn bnSj b8Sn SVbnj snSc RbPn(", -" Rb+Pn bPnRD( cR+Pn UP(bn. U+Pb8n R(bPDn. U+Pcn8 bnS( b+Sn SVbn( cnS+ Sbnj(", -" Sb+8n VnjSb( Scs+n bnRW W&Un RbHWn RWcn RbWn. RbW8n Rb.WDn cRW8n bWSn SbW&", -"n ZnSb ZnSc SbWnj Sb8Wn SZbnj ZcnSs RbWdn dP&Un bWnRDd cRWgn dn.RbW b+nRW8 ", -"R.bHWnd cW8gUn bdSn Sb+Wn SZbdn gnSc Sbdnj Sb8dn SbjVdn gScsn obR oU& RboD ", -"ocR Rbo5 Rbo8 obR5D oUc5 Sob obS& oVb Sco opSb obS8 obVp osSc Rbo; Rbo+ obR", -"D; oUc; obR5; >Rob Rb5oD; cRo> obS; obS+ V;ob S+oc Spbo; Sbo> oVpb; ocS> Rb", -"oW UWo& RboH oUcW obR5W ob8RW obHR5 ocRH5 SWob oU&SW SboZ ZcoV SpboW Sb8oW ", -"oVZpb oVsZc vRob vUo& ovbRH gRoc ovbR5 o>bvR ob5vRD cvRo> ovSb Svbo+ obVv S", -"cgo Svbop S>bov oVvpb Scyo q q! qB qa q1 q8 q1B q8a qM q!M qT qTa lq q8l qT", -"l sq q( q+ q(B q+a q1( q+1 1(qB 1+qa qM( q+M qT( q+T lq( l+q l(qT sq+ qE q!", -"E qH qHa q1E q8E qH1 qH8 qME MEq! qHT HMqa lqE lEq8 lHq sqH qd q+d qHd gq q", -"d1 q8d 1Hqd gq1 qdM +Mqd qTd gqT ldq q+ld qHld glq q4 q!4 q4B qa4 7q 7q8 7q", -"B 7qa q4M 4Mq! qT4 4Tqa 7lq q87l 7qT sq7 q; q+4 q;B qa; 7q; q> 7Bq; q>a q;M", -" 4+qM qT; 4+qT l;q q>l qTl; sq> q4E 4Eq! qH4 4Hqa 7qE 7Eq8 7qH qH7a 4MqE q!", -"4ME 4HqT qH4aM lE7q 7lq8E 7qlH 7Hsq qd4 4+qd qH; gq4 7qd q>d qH7d gq7 4dqM ", -"q+4dM 4Tqd qTg4 7qld ldq> qHl; sqg7 qP q!P qPB qaP q1P q8P 1PqB 1aqP Sq Sq!", -" SqT Sqa Slq Sq8 qTSl sqS qP( q+P P(qB +Pqa 1Pq( 1+qP q1P(B q+1aP Sq( Sq+ S", -"(qT q+Sa l(Sq Sql+ SlqT( S+sq qW qW! qHW qWa qW1 qW8 1HqW 1Wqa SqW S!qW Zq ", -"Zqa lWq qWS8 Zql sqZ qWd q+W HPqd gqW 1Wqd 1+qW qH1dP qWg1 Sqd q+Sd Zqd gqZ", -" Sqld q+lW ldZq sqgS oq oq! oqB oqa 7oq oq8 7Boq oq7a Soq S!oq oqT oqSa r r", -"8 rT rs oq; oq+ oBq; q+oa q;7o q>o 7oq;B oaq> Sq; oqS+ qTS; q+oT r; r> r;T ", -"rs> oqW o!qW oqH qHoa 7qW qWo8 oq7H qHo8 qWSo SqWo! Zqo oaZq rW rW8 rZ rZs ", -"vq vq+ vqH goq vq7 vq> 7Hvq vqg7 vqS S+vq Zqv Zqgo rv rv> rZv yr q9 q& q9B ", -"qa9 q91 :q 91qB :qa q9M q&M qT9 qT& lq9 :ql l9qT sq: q9( q+9 9(qB 9+qa 91q(", -" :q+ q91(B :+qa 9Mq( 9+qM 9Tq( 9+qT q9l( l+:q qTl9( q+s: q9E q&E qH9 qH& 91", -"qE :qE 9Hq1 :qH 9MqE M&qE 9HqT HMq& q9lE lE:q l9qH lH:q qd9 qd& 9Hqd gq9 9d", -"q1 :qd qH91d gq: 9dqM dMq& 9Tqd qTg9 l9qd ld:q lHq9d g:sq q49 q&4 49qB 49qa", -" 7q9 :q7 q97B 7a:q 49qM 4Mq& 49qT 4Tq& l97q 7l:q 79qT :q7s q;9 q;& 9;qB 9aq", -"; 79q; q>: 7q9;B qa:> 9Mq; M;q& 9Tq; T;q& l9q; :ql> 7qT9; s:q> 49qE 4&qE 49", -"qH 4Hq& q97E 7E:q 79qH 7H:q q49ME q&4ME qH49T qH&4T 7lq9E :ql7E 7qHl9 :qH7s", -" 49qd 4dq& 9Hq; q;g9 79qd 7d:q 7qH9d g:q> qd49M qd&4M qH;9T gq49T 7qdl9 q>l", -":d 7qT9d glq7: q9P q&P 9PqB 9aqP 9Pq1 :qP q91PB qa:P Sq9 Sq& qTS9 qTS& lqS9", -" S:q Slq9T S:sq 9Pq( 9+qP q9P(B q+9aP q91P( q+:P 9P1q(B :q+aP q9S( q+S9 Sq9", -"T( Sq+9T Slq9( S+:q qTlS9( sq:S+ qW9 qW& 9HqW 9Wqa 9Wq1 :qW qH91W qH:W qWS9", -" qWS& Zq9 Zq& l9qW lW:q lqZ9 Zq: 9Wqd 9+qW qH9dP qWg9 qW19d q+:W 9HPqd1 gP:", -"q qdS9 qdS& qdZ9 g9Zq Sqdl9 Sd:q Zql9d S:gq oq9 oq& q9oB qao9 o97q o:q 7oq9", -"B oa:q So9 oqS& oTS9 o9Sa r9 r: r9T rs: q;o9 q+o9 oq9;B oq+9a 7oq9; q>o: o9", -";7qB o:q>a o9S; o9S+ Sq;9T Sqa9; r;9 r:> 9Tr; s:r> qWo9 qWo& qHo9 qHo& 79qW", -" 7W:q 7oHq9 oq:H SWo9 Sq&oW S9oZ oqZ& r9W r:W rZ9 rZ: vq9 vq& qHv9 g9vq v97", -"q :vq vq79H :vgq S9vq S&vq Z9vq Sog9 rv9 r:v Zvr9 yr: qU q!U qD qDa q1U q8U", -" qD1 qD8 qUM U!qM Vq Vqa lqU lUq8 Vql sqV qU( q+U qD( q+D 1Uq( 1Uq+ 1Dq( 1+", -"qD UMq( U+qM Vq( Vq+ qUl( lUq+ l(Vq l+Vq qUE U!qE qHU UHqa 1UqE U8qE 1UqH U", -"Hq8 UMqE q!UME VqH VHqa qUlE q8lUE lHVq qHVs qdU U+qd qDd gqU 1Uqd U8qd 1Dq", -"d qDg1 UdqM q+UdM Vqd gqV lUqd l+qUd ldVq gVsq q4U 4Uq! qD4 4Uqa 7qU q87U 7", -"qD qD7a 4UqM q!4UM Vq4 qaV4 lq7U 7lqU8 7Vq 7Vsq q;U 4Uq+ qD; 4+qD q;7U q>U ", -"q;7D q>D U;qM q+4UM Vq; q+V4 lUq; lq>U l;Vq V>q 4UqE q!4UE 4UqH qH4Ua qU7E ", -"7qU8E qH7U 7qHU8 q4UME 4UMq!E qHV4 Vq4Ha 7lqUE q8l7UE 7HVq sq7VH 4Uqd q+4Ud", -" 4Dqd qDg4 qd7U >Uqd qD7d gUq> qd4UM 4U+qdM qHV; g4Vq 7qdlU q>lUd 7dVq 7Vgq", -" qUP UPq! qDP UaqP 1UqP U8qP 1DqP D8qP SqU q!SU VqS SaVq lUSq SUq8 SlVq VqS", -"s UPq( U+qP DPq( +DqP q1UP( q+1UP qD1P( q+D1P qUS( SUq+ S(Vq S+Vq SlqU( Sq+", -"lU SlVq( Vq+Ss qWU UWq! qWD UWqa 1UqW UWq8 1WqD WDq8 SUqW SqUW! ZqV qaVZ lU", -"qW Sq8UW lZVq sZVq UWqd U+qW WDqd qWgU qW1Ud q+W1U qWD1d gq1UW SUqd Sq+UW S", -"dVq gVZq SqdlU Sq8Ud VqdlZ glqSV oqU q!oU oqD qDoa 7oU o87U oq7D oU7a oUSq ", -"SqUo! oVq oaVq rU rU8 rV rVs q;oU q+oU q;oD q+oD 7;oU 7Uo> 7oUD; oDq> SUq; ", -"Sq+oU S;Vq o+Vq r;U r>U rV; rV> qWoU oqUW! qHoU oqHUa oU7W 7oUW8 oU7H 7oUH8", -" SqUoW oUWSq! oVZq oVZqa rUW UWr8 rZV sZrV vqU q+vU vqD gUvq 7Uvq vUq> 7Dvq", -" 7ogU vUSq vqSU+ Vvq oVgq rvU v>rU rVv yrV tq tq& tqD cq tq1 :qt t1qD cq: t", -"qM tMq& Vqt cqV ltq lt:q ltVq uq tq( tq+ t(qD cq+ q1t( t+:q tq1D( q+:c qMt(", -" tMq+ t(Vq t+Vq l(tq tql+ Vqlt( uq+ tqE tEq& tqH cqH q1tE tE:q t1qH tH:q qM", -"tE tqM&E tHVq qHVc lEtq :qltE tqlH uqH tqd q+td qHtd gqt t1qd td:q tqH1d g:", -"cq tMqd tq+dM tdVq gVcq tqld :qdlt Vqdlt uqg tq4 q&t4 qDt4 cq4 7tq :q7t 7Dt", -"q 7cq q4tM tq4M& t4Vq c4Vq 7ltq 7tl:q Vq7t uq7 tq; q+t4 qDt; cq; 7qt; t>q t", -"q;7D cq> tMq; tq+4M t;Vq c;Vq tql; ltq> Vq;7t uq> q4tE tq4&E qHt4 qHc4 tE7q", -" 7tq:E 7qtH 7Hcq tq4ME q&Mt4E tqHV4 cqV4H 7tlqE :ql7tE 7tHVq 7quH qdt4 tq+4", -"d qHt; g4cq 7qtd tdq> 7tHqd t>gq tqd4M t4Mqd& Vqdt4 cq;gV 7tdlq t>qld 7Vdtq", -" gqu7 tqP q&tP qDtP cqP q1tP tP:q tq1DP :Pcq Stq S&tq VqSt Scq Sqlt :qSt Sl", -"Vtq uqS qPt( q+tP tqDP( q+cP tq1P( tq+:P qD1tP( cq:+P S(tq tqS+ StqV( S+cq ", -"Stlq( St+:q VqlSt( Squ+ tqW q&tW qHtW cqW t1qW tW:q tqH1W :Wcq tWSq Sq&tW t", -"Zq Zqc tqlW :qWSt ltZq uZq qWtd q+tW tqHdP gPcq tqW1d :qWt+ tW1qDd cqWg: Sd", -"tq St+qW tdZq Scgq Stdlq S:dtq tZqld gquZ ot ot& otD otc ot7 ot: 7Dot ot7c ", -"otS S&ot oVt otSc rt rt: rVt ur ot; ot+ oDt; t+oc 7ot; t>o ot7D; oct> S;ot ", -"S+ot t;oV S;cq rt; rt> t;rV ur> otW o&tW otH tHoc 7otW tWo: 7otH tHo: tWSo ", -"otSW& tZo octZ rtW t:rW rZt urZ tvo t+vq tHvq got 7tvq ot:v otH7v t>go Stvq", -" ot+Sv Zqtv tZgo rtv tvr: tZrv ury n= 5n=B =a>n =nK", -" +n=K =Tn +T=n =jn =j>n 5T=n s=n n H5=n >ng= dn=K =+dnK Hn=T gn=T dn=j >n=dj Hn=j gns=

= o5=B =ao> =Qo o+=Q =To o+=T p=o p=o> op=T s=o oW< Wo= =5oH o>g= ov=Q ov=+Q Z=o Z=go ovp= o>pv= p=oZ yo= ,n ,n& ,nB ,an ,", -"n. ,8n n.,B 8n,a ,nK ,K&n ,Tn T&,n ,nj 8n,j Tn,j sn, ,n* -n *B,n -na ,.n* -", -"n8 n*.,B 8n-a ,Kn* -nK T*,n -Tn n*,j -nj n*j,T s-n ,nE ,E&n ,Hn H&,n nE,. ,", -"E8n ,.Hn H8,n nE,K <&EnK Hn,T ,HnT& ,Enj <&jnE Hn,j ,Hsn ,dn -nd Hn,d g-n ,", -".dn 8d-n ,Hnd. g8-n ,Kdn dn-K Td,n -Tgn dn,j dn-j dnj,H gns- ,4n 4&,n 4B,n ", -"4a,n ,5n 48,n ,B5n 5a,n 4n,K <&K4n 4T,n ,4Tan 4j,n <&j5n 5T,n ,4sn =n, -=n ", -",n=B -n=a ,5=n >n- =B5,n -a>n ,n=K =K-n ,T=n -n=T ,n=j -n=j =T5,n >ns- 4n,E", -" <&E4n 4H,n ,4Han ,E5n ,48nE H5,n ,4H8n ,4nEK ,4E&nK ,4HTn 4H&,Tn ,4jnE n =H5,n g->n =dn,K -=dnK =HT,n ", -"g=-Tn =jd,n >n-dj =Hj,n s-ng= ,P< o=5,B ->oa o,=Q o-Q o,=T o-T o,p= o-p p=o,T os- o,W ,Wo& oH, ,Hoa ,", -"5oW ,Wo8 ,Ho5 ,Ho8 ,WoQ o&W,Q oZ, oaZ, oWp, op&,W opZ, s,oZ ov, o-v o,=H go", -"- o5v, -vo> ov,H5 g-o> oQv, -Qov ovZ, Z-o pvo, op-v oZ,p= yo- C 5D=n =D>n nC=K =+nCK Dn=T =D+Tn nj=C >n=jC Dn=j sn=D 4n=dC =H5Dn g=>Dn =d", -"nCK dnC=+K =HDTn g=DTn =jdnC =jd>nC =HjDn s=gDn Co= =5oD =Do", -"> oQ=C o=+QC oD=Q o+D=Q =Cop o>p=C op=D =Dos Wv=C ovD=5 go>=D ov=QC =Qvo+C =DoZ goZ=D p=ovC p=vo>C p=D", -"oZ =Dyo ,nb <&bn ,Dn cn =b5Dn >nc= bn=K =b-nK bT=n cn=T bn=j >n-bj =bT5n snc", -"= ,4bnE ,4b&nE ,4Hbn c4H,n ,5nbE <&Eb5n ,H5bn c5n-bd =bH5n c", -"=g>n =bdnK -nd=bK =bHTn c=gTn =bjdn >nd=bj =bHnj s=cgn b

=bo5D", -" c>o- ob=Q -Qob ob=T =Qoc op=b ob-p p=boD ocs= ,Wob obW<& ,Hob oHc< ob5,W o", -"b8,W obH,5 ocH,5 obW,Q bWb ovD,5 cv=o> ovb=Q o-vbQ =boZ ocZ- p=bov o-pvb Z=bop o", -"cy- 6n =n7B =n7a 6n=K =6+nK 6T=n =T6+n 7n=j 7>=nj =n7T 7=sn 46", -"=dn =n7H 7=gn =6dnK d", -"nK=6+ =H6Tn g=6Tn 7=dnj >n=7dj 7Td=n g7s=n 6P< 6!

=B7o 7o=a o6=Q o=6+Q =6o", -"T o+T=6 7op= 7o=p> 7o=T 7os= 6Wo< o!6W< 6Ho< oH6a< oW7< 7oW8< 7 7o=H 7og= ov=6Q =Qvo+6 o=Z6 goZ=6 7o=pv o>p7v= 7oZ= 7oy= ?n ?&n ?Bn ?an ", -"?1n ?:n 1n?B :n?a ?nK &n?K ?Tn T&?n ?jn :n?j 1T?n s?n ?n* ?-n n*?B -n?a 1n?", -"* :-n ?B1n* :a-n n*?K ?K-n Tn?* -n?T n*?j -n?j ?T1n* ?-sn ?nE &n?E ?Hn H&?n", -" 1n?E ?E:n 1H?n :n?H nE?K ?&nEK Hn?T ?HTan nj?E ?:njE Hn?j ?Hsn ?dn -n?d Hn", -"?d g?n 1d?n :n?d ?H1dn ?:gn dn?K ?-dnK Td?n ?Tgn dn?j ?:dnj ?Hjdn gns? ?4n ", -"4&?n 4n?B 4a?n 7?n :n7? ?n7B ?n7a 4n?K ?4&nK 4T?n ?T4an 7n?j ?:7nj ?n7T 7?s", -"n ?=n -n?= ?B=n =n?a =n7? An ?=7nB Aan ?n=K ?-=nK =n?T ?-T=n =n?j Ajn ?T7=n", -" Asn 4n?E ?4&nE 4H?n ?H4an 7n?E ?:7nE ?n7H ?:H7n ?4nEK &nE?4K ?H4Tn 4H&?Tn ", -"?j7nE 7:n?jE ?H7Tn s?7Hn =n?d ?-=dn =n?H ?=gn ?n7d Adn ?H7=n Agn ?=dnK -=n?", -"dK ?Td=n g?=Tn ?d7nj dnAj ?Hj=n gsAn ?P ?P& ?PB ?aP ?P1 ?:P 1P?B :P?a ?QP Q", -"&?P ?TP Qa?P ?Pj :Q?P 1T?P s?P ?P* ?-P P*?B -P?a 1P?* :-?P ?P1*B ?:P-a Qn?*", -" -Q?P TP?* -T?P P*?j -Q:n ?TP1* ?-sP ?WP W&?P ?HP HP?a 1W?P :W?P 1H?P :H?P ", -"Wn?Q ?WQP& ?ZP Z&?P Wn?j ?:WQn Z1?P sP?Z ?dP -W?P HP?d g?P 1d?P :d?P ?HP1d ", -"?:gP Qd?P ?-WQn Zn?d gP?Z dP?j ?:QdP ?Z1dP gPs? o? o?& o?B o?a o?7 o:? 7Bo?", -" ?ao: o?Q o&?Q o?T oT?a ?po o:?p 7o?T s?o o?= o-? =Bo? =ao? 7o?= Ao 7o=?B A", -"oa =Qo? ?Qo- =To? ?To- p=o? Aop o?Tp= Aos o?W o&?W o?H oH?a 7o?W ?Wo: 7o?H ", -"?Ho: oW?Q o?WQ& ?Zo ?aoZ op?W o:?pW o?7Z os?Z ?vo o-?v =Ho? go? o?7v Aov o?", -"H7v Aog ov?Q o-?vQ o?Z= ?Zgo op?v opAv ?Zo7v yAo =nC =n7D 7", -">D=n =6nCK 6+n=CK =D6Tn 6+D=Tn 7=njC >nj7=C =D7Tn s=7Dn 6n=7dC 7Dd=n g7=Dn ", -"dnC=6K dn=C6+K 6Dd=Tn g6D=Tn =jn7dC >j7d=nC 7Hn=Dj s=Dg7n 6C

C 7o=D o>D", -"7= o=6QC =Q6o+C =QDo6 o+6=QD 7o=pC p=7o>C p=D7o s=o7D o6W=7vC 7vDo= go7=D =Q6ovC =6o+vQ", -"C Z=o6D Z=6goD p=o7vC >C7vp=o 7Z=oD yo7=D ?bn bn?& ?Dn ?cn b1?n ?b:n 1D?n :", -"n?c bn?K ?b&nK bT?n cn?T bn?j ?:bnj Dn?j sn?c bn?* ?b-n Dn?* cn?- 1nb* :b-n", -" ?D1n* c-:n ?bn*K ?-bnK ?DTn* ?-Tcn ?jbn* ?-jbn ?Djn* s-n?c bn?E ?b&nE bH?n", -" cn?H ?b1nE ?:bnE ?Hb1n ?:Hcn ?bnEK &nE?bK ?HbTn ?cHTn ?jbnE :nb?jE ?Hjbn s", -"?cHn bd?n ?-bdn Dd?n gn?c ?d1bn ?:dbn ?Dd1n g:n?c ?dbnK -nb?dK ?DdTn g?cTn ", -"?djbn ?db-nj ?Ddnj g?scn 4b?n ?4b&n 4D?n ?4cn ?n7b ?:7bn ?n7D cn7? ?4bnK &n", -"K?4b ?D4Tn ?c4Tn ?j7bn 7:b?jn ?D7Tn s?7cn ?b=n ?-=bn =n?D cn?= =n7b Abn ?D7", -"=n Acn ?=nbK =bn?-K =bT?n c=?Tn =b7nj bnAj ?Dj=n scAn ?4bnE &nE?4b ?H4bn ?c", -"4Hn 7?bnE 7bn?:E ?H7bn 7c?Hn 4bn?EK &n?E4bK 4bH?Tn c4H?Tn 7bn?jE 7j?E:nb ?H", -"n7bT 7cHs?n ?=dbn =b-?dn ?Dd=n c=?gn ?d7bn bdAn ?D7dn gcAn =bn?dK =d-n?bK ?", -"Hn=bT g?Tc=n ?dn=bj Adnbj ?Hn=bj Agnsc ?Pb bP?& ?DP ?cP b1?P ?b:P 1D?P :c?P", -" bQ?P ?QbP& bT?P cQ?P bP?j ?:QbP DP?j sP?c bP?* ?b-P DP?* c-?P ?Pb1* ?:P-b ", -"?DP1* ?cP:- ?QbP* ?-QbP ?QDP* ?cQ-P ?Pjb* ?-Pbj ?DP*j s?Pc- bW?P ?WbP& bH?P", -" cW?P ?Wb1P ?:WbP ?HPb1 ?cW:P ?WbQn bWn?Q& Zb?P ?PZc ?WjbP ?Wb:Qn ?Zb1P s?Z", -"cP bd?P ?-WbP Dd?P gP?c ?dPb1 ?:dbP ?Dd1P g?P:c ?QdbP ?Wb-Qn ?ZbdP g?ZcP ?d", -"Pbj ?Wb-Pj ?DdPj g?scP o?b ?bo& o?D oc? 7bo? ob?: 7o?D ?co: ob?Q o?bQ& ob?T", -" ?Qoc ob?p o:?pb op?D ocs? =bo? ob?- =Do? ?co- 7o=b Aob o?D7= Aoc o?=bQ o-?", -"bQ o?D=Q oc?=Q p=bo? opAb ?pDo= osAc ob?W o?bW& ob?H ?Hoc ?W7ob o:?bW o?H7b", -" o:H?c o?bWQ obW?Q& ?DoZ oc?Z ?pobW ?pbo:W ?Zo7b s?oZc ob?v o-?vb ov?D ocg?", -" 7vbo? ovAb ?vD7o goAc ?vobQ ?vbo-Q ?Zo=b go?Zc ?pvob Aopvb ?pvoD yoAc R< R", -" R5=B >R=a =RM R+=M =RT R+=T =Rj =R>M R", -"5=T s=R 4R RH=5 g>=R Rd=M =R+dM", -" RH=T gR=T Rd=j >M=Rd RH=j gs=R R

o=5RB o>=Ra S= S=+ S=T S=a S=p S>= Sp=T s=S RWo< o!RW< RHo< o", -"HRa< 5WR< o8RW< oHR5< oH8R< oWS< S=R =RvH5 g=Ro> S=v v=S+ S=Z gS= p=Sv v>S= SZp= y=S ,", -"R< R<& RB,n Ra,n ,.R< R8,n ,R<.B ,R8a< ,Mn =R =R5,B >n-Ra ,R=M -R=M ,R=T -R=T ,R=j -R=j =RT,5 =Rs- ,ER4 ,R4&E ", -"R4,H ,R4H& ,R45E ,R48E ,R4H5 ,R4H8 ,R4ME n-Rd =RH,5 g=R-> =Rd,M =R-dM =RH,T g=", -"R-T =Rj,d >M-dn =RH,j s=Rg- R<,P o,5=RB o->Ra ", -"S=, S-o S,=T =TS- S,p= o-S> S=p,T S-s= ,RoW o&R,W ,RoH oH&,R o,R5W o8,RW oH", -",R5 oH8,R SWo, S<&oW S,oZ oZ&S< Sp<,W SpR =R5oH, go->R ovS, Svo- S,Z= S-go Sv,p= o-pSv S=Zp, S-yo Rn R5=D >R=D Un=M =RU+M V=R V+=R Rj=U >M=Un V5=R >nV= R4UnU=d =RHU5 g=R>U =RUdM d", -"Mn=U+ Vd=R =RgV =RjUd >nd=Uj V=RH5 V>ng= U

=RDo5 o>U=D S=U S+", -"=U S=V =aoV Sp=U =US> VpS= oVs= UWo< oUWUv= =Rv5D goU>= =USv S=vU+ oVZ= V=go p=USv S>=vU oVvp= S=yV ,Un bn =Rb5D =Rc> Rb=M =R-bM Vn=b =RV- Rb=j >M-bn V=R,5 >nV- ,R4bE <&ER", -"4b ,R4bH cR4,H ,U5nE <&ERb5 ,UH5n cR5H< n-Ud =RbH5 c=Rg> =RbdM =bd", -"-Mn V=R,H c=VgR =Rbdj >Md=Rb =RbHj c=Rgs bPR< ", -"oU ob5=RD oc->R S=b =bS- =boV Sc= Sp=b =bS> oV,p= Scs= ,UoW oU&,W ,UoH ocR,", -"H oU,5W oU8,W oUH,5 cR5W< Sb ob5=RH cv=>R =bSv o-USv SZ=b Z=Sc S=bpv o-", -"pvU oVvp, Scy= q< q!< q= =B7q =aq> q=M q+=M q=T q+=T l=q q", -">l= 7q=T sq= 4=qd 7q=H g=q> qd=M ", -"q=+dM qH=T =Tgq ldq= q>l=d lHq= l=gq q

7o=qB q>o=a S=q S+q= Sq=T Sq=a r= r>= r=T rs= oq= vq7=H vq>g= vqS= vq=S+ Zq= S=gq rv= v>r= rZ= ", -"yr= ?q ?q& ?qB ?qa ?q1 :q? q1?B ?a:q ?qM q&?M ?qT qT?a l?q l?:q qTl? s?q ?q", -"* -q ?Bq* -qa ?1q* -q: ?q1*B qa:- q*?M -qM q*?T -qT ?ql* l-q ?qTl* sq- ?qE ", -"?Eq& ?qH qH?a q1?E ?E:q ?1qH ?H:q qM?E ?qM&E qH?T ?qHT& lE?q :ql?E ?qlH ?Hs", -"q ?qd -qd qH?d g?q ?1qd ?d:q ?qH1d g:-q qd?M qd-M qT?d gM-q ?qld ld-q l?Hqd", -" gql- ?q4 ?4q& q4?B ?4qa ?q7 7?:q 7B?q 7q?a q4?M ?q4M& ?4qT ?qT4a 7l?q ?q7l", -": 7q?T ?q7s q=? -q= =B?q =a-q 7?q= Aq ?q7=B Aqa ?q=M =M-q ?q=T =T-q l?q= Al", -"q l=?qT Aqs q4?E ?q4&E ?4qH ?qH4a ?E7q ?q7:E 7q?H :qH7? ?q4ME q&4?ME ?qH4T ", -"?H4qT& ?q7lE l?7:qE l?H7q s?q7H ?dq= qd-= ?q=H g=-q 7q?d Aqd q=H7? Aqg ?qd=", -"M -q=dM q=H?T -qTg= l=?qd ldAq l=H?q glAq ?qP q&?P qP?B qa?P q1?P ?P:q ?q1P", -"B ?qa:P S? S?& S?T S?a S?l S?: ?TSl s?S q*?P -qP ?qP*B qa-P ?q1P* :P-q q*1?", -"PB -q:aP S?* S?- S*?T ?TS- l*S? S?l- S?lT* S-s? ?qW q&?W qH?W qW?a ?1qW ?W:", -"q ?qH1W :qH?W S?W S&?W S?Z ?aZq lWS? ?WS: l?Zq ?Zsq qW?d -qW ?qHW* gP-q ?qW", -"1d :W-q ?H1qW* -qWg: S?d ?WS- ?dZq g?S ldS? lW-q S?Zld s?gS o?q o&?q ?Boq o", -"q?a 7o?q o?:q ?q7oB o:?qa S?o S&o? ?TSo ?aSo r? r?: r?T r?s q=o? o-q o?q=B ", -"oa-q ?q7o= Aoq q=7o?B oqAa S?= o-S? =TS? =aS? r?= Ar =Tr? Ars oq?W ?qWo& oq", -"?H o?Hqa 7q?W o:?qW o?H7q o:H?q ?WSo S?oW& o?Zq S?Zoa r?W ?:rW r?Z s?rZ ?vq", -" -qv ?Hvq ?vgq ?q7v Aqv ?vq7H goAq S?v S-?v S=?Z S?go r?v Arv ?Zrv Ary qU< ", -"U 7q=D =Dq> qU=M q=U+M V=q =aVq lq=U q>l=U Vql= V=sq q4U=Ud q=H7U q>Dg= q=UdM q+U", -"=Md =HVq V=gq l=qUd l=Uq>d V=qlH V>qg= Uo=U q=D7o q>Do= Sq=U S=qU+ VqS= oV+q= r=U =Ur> rV= s=rV oqUW< qW=U vqD7= vq>=D vq=SU S=Uvq+ V=Zq Vv", -"qg= =Urv rv>=U Z=rV y=rV ?qt q&?t ?qD cq? ?1tq ?t:q ?1qD :q?c tq?M ?qtM& V?", -"q V?cq ?qlt ?t:lq l?Vq u?q tq* -qt qDt* cq- t1q* :qt- ?qD1* :c-q tMq* -Mtq ", -"t*Vq V-q tql* lt-q V?lq* uq- ?Etq ?qt&E tq?H ?Hcq ?qt1E ?t:qE ?qHt1 cq?:H ?", -"qtME tq&?ME ?HVq cq?VH l?qtE l?t:qE V?lqH ?quH tq?d td-q qHt* cqg? ?qdt1 -q", -"t:d ?qD1d cq-g: ?qdtM -qtdM ?dVq V?gq l?dtq l-qtd V?dlq g?uq t4?q ?qt4& ?4q", -"D c4?q ?q7t ?q7t: 7q?D ?q7c ?qt4M tq4?M& V4?q cq?V4 ?q7lt :ql7t? ?q7V ?qu7 ", -"t=q -qt= ?q=D cq= q=7t Aqt q=D7t Aqc tq=M -qt=M Vqt= V=cq ltq= ltAq V=q7t A", -"uq ?qt4E t4&?qE ?qHt4 cq?4H ?q7tE :q?7tE 7tH?q 7cq?H tq4?ME M&?Etq4 V?q4H V", -"?4cqH l?q7tE lE7t:q? 7V?qH u?q7H tdq= -qt=d tq=H t=gq 7tdq= tqAd t=H7q gqAt", -" t=qdM t=d-qM V?dq= cq=gV l=tqd Aqdlt V?d7q uqAg ?tP ?&tP tP?D ?Pcq ?1tP t:", -"?P ?qD1P cq?:P S?t S&?t S?V S?c l?St ?tS: SlV? u?S t*?P ?Pt- ?qDP* cP-q ?tP", -"1* -qt:P ?D1tP* cq-:P S*?t St-q S*V? cqS- St*l? l-qSt S?Vl* S?u- tq?W ?qWt&", -" tH?P ?Wcq ?qWt1 :qW?t ?qW1D cqW?: ?WSt S?tW& tZS? Sc?Z l?WSt S?:tW S?Zlt S", -"?uZ td?P tW-q ?qWDd ?tgP ?td1P -qWt: ?H1tdP cq-:W ?dSt -qWSt ?dSV S?gt S?dl", -"t -qWlt V?dSl g?uS ot? o&?t ?Dot ?cot o?7t ?to: ot?7D ot:?c otS? ot?S& oV? ", -"ocS? r?t ?tr: r?V ur? t=o ot- =Dot oct= 7ot= Aot t=o7D otAc S=t t=S- oVt= t", -"=Sc rt= Art t=rV Aru ?Wot ot?W& ?Hot otc?H ot?7W ot:?W otH7? ot:?H ot?SW S?", -"Wot& oV?Z oV?Zc ?trW r?t:W ?ZrV r?uZ ot?v o-tv =Hot t=go ?vq7t tvAo otH7= g", -"oAt tvS? ot-Sv tZS= ?vSc ?vrt rtAv ?vrV yAur Xn n!X XnB aXn Xn. 8Xn n.XB aX", -"8n XnK XKn! TXn aXTn Xjn Xj8n XjTn sXn Xn( +Xn n(XB aX+n n(X. 8X+n Xn(.B aX", -"n+8 n(XK Xn+K XnT( TX+n X(nj Xj+n XjnT( +Xsn Gn Gn! GnH Gan Gn. G8n G.Hn H8", -"Gn GnK n!GK GTn TnGa Gnj 8nGj HnGj sGn Gnd +Gn dXHn gXn G.dn G8+n dX.Hn G8g", -"n GKdn GK+n TdGn GTgn dnGj Gn+j dXjHn sGgn 4X 4X! 4XB 4aX 4X5 48X 4B5X 5a4X", -" 4XK XK4! 4TX TX4a 4Xj 8X4j 5T4X s4X 4X; 4+X 4BX; +X4a X;5n >X4 X;B5n 4a>X ", -"4KX; 4K+X T;4X +T4X X;4j 4X>j X;j4T s4>X 4GX 4!Gn 4HX Ga4X G5n G84X H54X H8", -"4X 4KGn 4GX!K GT4X 4GTaX Gn4j 4G8Xj HX4j 4GsX 4dX +G4X HX4d g4X 5d4X >nG 4H", -"X5d g4>X 4KdX 4+GXK Td4X 4TgX dX4j Gn>j dXj4H s4gX XPn XPn! PnXB XPan PnX. ", -"XP8n XPn.B aXP8n QXn n!QX TXQn aXQn XjQn 8XQn XjnTP QXsn PnX( XP+n XPn(B aX", -"P+n XPn(. +X8Pn Pn(X.B +X8aPn XnQ( QX+n QXnT( +QXTn XjnQ( +QX8n QXTnj( sX+Q", -"n Yn Yn! YHn Yan Yn. Y8n HnY. H8Yn YQn QnY! YZn ZnYa Yjn Q8Yn ZnYj sYn Ydn ", -"Y+n HnYd gYn dnY. +nY8 YHdn. Y8gn QdYn +QYn YdZn YZgn dnYj +nYj YZdnj gnsY ", -"oX o!X oXB oaX o5X o8X 5XoB 5aoX oQX QXo! oTX QaoX opX pXo8 pXoT osX oX; o+", -"X X;oB +Xoa 5Xo; o>X o5X;B oa>X QXo; +QoX TXo; +ToX o;pX op>X opTX; >Xos oY", -" oY! oYH Yao Y5o Y8o oHY5 oHY8 oYQ YQo! oZY YaoZ Ypo opY8 oZYp sYo Yvo Y+o ", -"oHYv goY ovY5 Y>o YvoH5 Y>go YQov YQo+ YvoZ oZgY opYv o>Yp YZvop yoY Xn# X&", -"n n#XB X&an n#X. X&8n Xn#.B aXn8& n#XK XK&n XnT# X&Tn X#nj &nXj XjnT# X&sn ", -"n#X( X&+n Xn#(B aXn+& Xn#(. X&n+8 n#(X.B +X8an& Xn#(K X&n+K TXn#( +TX&n Xjn", -"#( X&j+n TX#nj( sX+&n Gn# G&n G#Hn H&Gn n#G. 8nG& GnH#. G8nH& n#GK GK&n G#T", -"n T&Gn G#nj &nGj GTnj# G&sn G#dn G&+n dX#Hn G&gn dX#n. dX&8n HX#dn. gX8&n d", -"X#nK dX&nK GTnd# gXT&n dXjn# dX&nj dX#Hnj gsX&n 4X# 4X& X#4B aX4& 4#5X 5X4&", -" 4X5#B 48Xa& X#4K 4KX& 4#TX TX4& 4#Xj X&4j 4TX5# 4Xs& 4#X; +X4& X;#4B aX;4&", -" X;#5n 4X>& 5X#;nB >X4a& X;#4K X;&4K 4TX;# X;&4T X;j4# >X4&j X;#5Tn >Xs4& 4", -"#Gn G&4X 4#HX HX4& G#5n 5&Gn 4HX5# 4H8X& 4GX#K 4G&XK 4GTX# 4GTX& 4GjX# X&j4", -"G 4HXj# s4GX& 4#dX dX4& 4HXd# 4Xg& 4dX5# G&>n dX#H5n >Xg4& 4dX#K dX&4K 4TdX", -"# g4XT& dXj4# >nG&j dX#4Hj >nsG& PnX# XP&n XPn#B aXP&n XPn#. X&P8n Pn#X.B 8", -"XaP&n XnQ# X&Qn QXnT# QaX&n XjnQ# X&jQn QXTnj# sXQ&n XPn#( X&P+n Pn#X(B +Xa", -"P&n Pn#X(. +X8P&n .BX(Pn# aX+P8n& QXn#( +QX&n TX#Qn( QX&+Tn QX#nj( +QX&nj Q", -"#TnXj( +QXsn& Yn# Y&n HnY# H&Yn n#Y. 8nY& YHn#. Y8H&n QnY# Q&Yn Y#Zn ZnY& n", -"jY# &nYj YZnj# Y&sn dnY# +nY& YHdn# Y&gn Ydn#. Y+8&n dn#YH. gY8&n YQdn# Y+Q", -"&n YZdn# gYZ&n Yjdn# Y+j&n ZndYj# sYg&n oX# o&X X#oB aXo& 5Xo# 5Xo& o5X#B o", -"8aX& QXo# QXo& TXo# TXo& o#pX pXo& opTX# o&sX X;o# +Xo& oX;#B o+aX& o5X;# o", -"&>X X;#o5B o>aX& oQX;# o+QX& oTX;# o+TX& opX;# o>pX& pX;oT# os>X& oY# Y&o Y", -"#oH oHY& o5Y# o8Y& Y5oH# Y5ao& oQY# YQo& Y#oZ Y&oZ Y#op opY& YpoZ# Y&os Y#o", -"v ovY& YvoH# Y&go Yvo5# Y&o> ovHY5# goY>& YvoQ# Yv&oQ YZvo# goZY& Ypov# Yp&", -"o> oZvYp# Y&yo In In! DXn aIn In. 8In D.In 8IDn InK IKn! TIn aITn Inj Ij8n ", -"InDj sIn In( +In D(In DX+n n(I. 8I+n In(D. +DX8n n(IK +KIn T(In TI+n I(nj I", -"n+j InjD( +Isn GnI G!In Jn Jna G.In 8IGn Jn. J8n GKIn InKG! JnT TnJa InGj I", -"njG8 Jnj sJn Idn Gn+I Jnd gJn I.dn Id8n dnJ. J8gn dKIn Idn+K TdJn gTJn dnIj", -" Idn+j dnJj gnsJ 4IX 4!In 4DX DX4a 5In 8I4X 5D4X D84X 4KIn InK4! DX4T 4DXTa", -" In4j Inj48 DX4j 4DsX I;n +I4X D;4X +D4X I;5n >nI I;n5D 4D>X IK;n I;n+K I;T", -"n a;nTI ;nIj In>j I;n5T sI>n Gn4I In!4G J4X 4aJn 5IGn 4G8In J5n 48Jn InK4G ", -"4GKIn! 4TJn J4TaX Inj4G 4G8Inj 4XJj J4sX Id4X Idn4+ J;n J4gX Id5n Gn>I 5dJn", -" J>n Idn4K IdK4+X T;Jn gJ4TX Idn4j >nGIj ;nJj >nsJ IPn n!IP IPDn IPan PnI. ", -"IP8n IPnD. D8XPn QIn Q!In DXQn aIQn IjQn 8IQn IPjDn QIsn PnI( IP+n IPnD( +D", -"XPn IPn(. +IP8n DP(In. D8P+In Q(In QI+n QDXn( +QDIn IPjn( IPj+n IP(Dnj sIP+", -"n YIn InY! YJn JnYa InY. 8IYn Y.Jn JnY8 QIYn YQIn! ZJn ZaJn InYj Y8QIn JnYj", -" YJsn IdYn +IYn YdJn YJgn IdnY. Y+8In YJdn. gYJ8n IdQn Y+QIn ZdJn ZJgn YjId", -"n Y+jIn YJjdn sJngY oI oI! oDI oaI oI5 o8I 5DoI 5aoI oIQ QIo! oTI QaoI opI ", -"pIo8 pDoI osI oI; o+I DXo; +DoI 5Io; o>I oD5I; oD>X QIo; +QoI TIo; +ToI o;p", -"I p>oI opDI; sIo> oYI YIo! oJ oJa oIY5 oIY8 oJ5 oJ8 YQoI oYQI! oJZ oaZJ oIY", -"p Y8opI oJp oJs ovI oIY+ oJv goJ o5vI oIY> J5ov oJ> oQvI Y+oQI JvoZ gZoJ pv", -"oI o>IYp opJv yoJ bXn I&n DXbn cXn b.In 8Ibn In.bD 8Icn bKIn IK&n TIbn TIcn", -" Inbj &nIj InjbT cXsn b(In +Ibn In(bD +Icn In(b. I&n+8 DX(bn. cX+8n In(bK I", -"&n+K bTXn( cX+Tn Injb( I&n+j Ij(bTn sInc+ bGn G&bn Jnb cJn b.Gn G8bn bnJ. J", -"8cn bKGn I&nGK bTJn cTJn Gnbj I&nGj bnJj cJsn Gnbd +Gbn bdJn cJgn Idnb. Idn", -"b8 Jnbd. cJng8 IdnbK Idn&K JnbTd cJngT Idnbj Idn&j Jnjbd sJngc 4bX bX4& bX4", -"D c4X b54X b84X 4bX5D 48cX 4KbX I&n4K bT4X 4TcX bX4j I&n4j 4bT5X c4sX b;4X ", -"b+4X I;nbD 4+cX I;nb5 4b>X 5DXb;n c4>X I;nbK I;&nK I;nbT c4X+T I;nbj >Xb4j ", -"4bTX;j c>Xs4 bG4X I&n4G 4bJn J4cX G5bn I&nG5 b5Jn J5cn 4bGXK InK4G& J4bTX c", -"J4TX 4bGXj 4bGX&j J4jbX sJ4cX bd4X Idn4& b;Jn c4gX Idnb5 bG>n J5nbd cJ>n 4b", -"dXK IdK;&n J;nbT cJ;Tn dXj4b >nbGj J;nbj J>nsc IPbn P&In IPnbD IPcn IPnb. I", -"P&8n bPDIn. cX8Pn QIbn I&Qn bQXDn QIcn IPjbn IP&nj bTPInj sIPcn IPnb( IP&+n", -" bPDIn( cX+Pn bP(In. +IPb8n IPbnD(. +IPcn8 bQXn( I&n+Q IP(bTn cQX+n IP(bnj ", -"b+QInj InbjQD( sI+cQn Ybn bnY& JnYb Ycn bnY. b8Yn YJbn. cnY8 bQYn YbQ&n ZnY", -"b ZnYc bnYj Yb8Qn YZbnj snYc bdYn b+Yn YJbdn gnYc Ybdn. Yb+8n JndYb. Ycg8n ", -"YbQdn Yb+Qn YZbdn ZcngY Ybjdn Yb+nj YbdJnj sYcgn obI oI& bXoD ocI b5oI b8oI", -" ob5DX o8cX bQoI QIo& bToI oTcX pboI pIo& opbDX sIoc bXo; b+oI obDI; o+cX o", -"b5I; ob>X b5XoD; >Xoc obQI; ob+QI obTI; oc+QI opbI; o>bpI ob;pDX osc>X Ybo ", -"obY& oJb Yco obY5 obY8 J5ob Y5oc YQob YboQ& YboZ ZcoJ opYb Ypbo8 obJp osYc ", -"ovYb obY+ obJv Ycgo Yvbo5 Ybo> oJvb5 ocY> YvboQ Ybo+Q oJZvb ocZgY Ypbov Y>b", -"op oJpvb Ycyo 6X 6X! 6XB 6aX 6X1 68X 6B1X 1a6X 6XK XK6! 6TX TX6a 6Xj 8X6j 1", -"T6X s6X 6X( 6+X X(6B +X6a 6(1X 1+6X 6X1(B 6+X1a X(6K 6K+X 6(TX +T6X 6(Xj +X", -"6j 6TX1( 6+sX 6GX 6!Gn 6HX Ga6X 1Gn G86X 1H6X Ga1n 6KGn 6GX!K GT6X 6GTaX Gn", -"6j 6G8Xj GT1n 6GsX 6dX +G6X HX6d g6X 1d6X +G1n 6HX1d 68gX 6KdX 6+GXK Td6X 6", -"TgX dX6j dXj6+ dXj6H s6gX 4X6 6!4X 4B6X 6a4X 7X 7X8 7XB 7aX 4K6X 4X6!K 6T4X", -" 4TX6a 7Xj 8X7j 7TX 7sX 6X; 6+4X 6BX; aX6; 7X; >X7 X;7B 7a>X 6KX; 4+X6K TX6", -"; aX;6T X;7j >j7X TX7; >X7s 6G4X 4G6n! 6H4X 4Ga6X 7GX G87X 7HX Ga7X 4G6XK 6", -"GK4X! 4GT6X 6GT4aX Gn7j 7G8Xj GT7X 7GsX 6d4X 4+G6X HX6; 4Xg6 7dX 7G>X HX7d ", -"g7X 4dX6K X;K6+G 4Td6X g4X6T dX7j 7>GXj Td7X gX7s 6XP XP6! XP6B aX6P 1X6P 8", -"X6P 6X1PB 68XaP 6QX Q!6X QX6T Qa6X 1Q6X Q86X 6QX1T 6QsX XP6( +X6P 6XP(B 6+X", -"aP 6X1P( 6+X1P 1X(6PB 1+X6aP 6(QX +Q6X 6QXT( 6+QTX 6QX1( 6+Q1X Xj(6TP s6X+Q", -" Y6 Y6! Y6H Y6a Y61 Y68 6HY1 6HY8 Y6Q 6QY! YZ6 Z6Ya Y6j 6QY8 Z6Y1 sY6 Y6d Y", -"6+ 6HYd gY6 6dY1 6+Y1 Y61Hd Y6g1 6QYd 6+YQ YdZ6 YZg6 6dYj 6+Yj YZ61d g6sY o", -"6X 6Xo! 6XoB 6aoX 7oX o87X oX7B oa7X 6QoX o!6QX 6ToX oT6aX 7pX 78pX oT7X 7o", -"sX 6Xo; 6+oX o6X;B o+6aX oX7; 7o>X 7oX;B 7oa>X QX6; o+6QX oT6X; o+T6X 7;pX ", -"7p>X 7oTX; os7>X Y6o o!Y6 oHY6 oaY6 7Y 7Y8 7YH 7Ya o6YQ Y6oQ! Y6oZ YZ6oa 7Y", -"p Y87p 7ZY sY7 Yv6 o+Y6 YHv6 Yvg6 7Yv Y>7 7HYv g7Y YQv6 Yv6+Q ZvY6 gY6oZ 7v", -"Yp 7pY> YZ7v y7Y 6X9 6X& 6B9X 9a6X 1X9n :X6 6X19B 6a:X 6K9X 6KX& 9T6X TX6& ", -"9X6j 6X:j 6TX9j :Xs6 6(9X 9+6X 6X9(B 6+X9a 6X19( 6+:X 1X(9nB :X6+a 6X9(K 6+", -"X9K 6TX9( 6+T9X 6Xj9( :X6+j Xj(9Tn s:X6+ 9Gn G&6X 9H6X Ga9n 1G9n :Gn 6HX91 ", -"6H:X 9KGn 6G&XK GT9n 6GTX& Gn9j Gn:j 6HX9j :Gsn 9d6X +G9n 6HX9d 6Xg9 6dX91 ", -"6d:X 1HX9dn :Ggn 6dX9K dX&6K 6Td9X g6X9T dXj9n :Gn+j 9GTdnj g:Xs6 49X 6X4& ", -"4B9X 9a4X 7X9 7:X 9X7B :X7a 4K9X 49X&K 9T4X 49TaX 9X7j 7j:X 9T7X 7:sX 9X6; ", -"9+4X 49X;B aX;49 9X7; 7:>X 7X9;B 7:X>a 49X;K X;&6K 49TX; X;&6T 7X9;j 7:X>j ", -"7TX9; 7sX:> 9G4X 49GX& 9H4X 49GaX 9G7X :G7X 9H7X :H7X 49GXK X&K49G 49GTX 6G", -"T4X& 7G9Xj 7:GXj 7GT9X 7sG:X 9d4X dX&49 49HdX 49gX 9d7X :G>n 7HX9d 7:gX 49d", -"XK dXK49+ 49TdX g49TX 7dX9j 7:dXj 7Td9X g7Xs: 9X6P X&6P 6XP9B 6aX9P 6X19P 6", -"X:P 9X16PB :X6aP 9Q6X QX6& 6QX9T 6Qa9X 6QX9j 6Q:X 9TX6Pj :QXs6 6XP9( 6+X9P ", -"9X(6PB 9+X6aP 9X16P( :X6+P 6(9X1PB 6+X:Pa 6QX9( 6+Q9X 6Q(9TX 9+Q6TX Xj(9Qn ", -":QX6+ 6(QX9T1 sX+:Qn Y69 Y6& 6HY9 6HY& 9nY1 Y:6 Y691H :HY6 6QY9 6QY& Z6Y9 Z", -"6Y& 6jY9 :QY6 YZ69j s6Y: 6dY9 6+Y9 Y69Hd Y6g9 Y691d :dY6 9HnY1d g6Y: Y69Qd ", -"Y6+9Q YZ69d gY6Z9 Y6j9d Y:6+Q Y9dZ1n sY:g6 o9X 6Xo& 9XoB 9aoX o97X o:X 7o9X", -"B oa:X 9QoX o9QX& 9ToX o9TaX p97X 7X:p 7oT9X sXo: 9Xo; 9+oX o9X;B o9+aX 7o9", -"X; >Xo: o9;7XB o:>aX o9QX; o9+QX o9TX; o9+TX 7pX9; o:p>X 7T;p9X os:>X Y9o o", -"9Y& oHY9 o9Ya 7Y9 Y:o 7HY9 Yao: YQo9 Y6&oQ Y9oZ oZ9Ya Y97p Ypo: Y97Z Y:7Z o", -"vY9 o9Y+ Yv69H Y9go Y97v :v7Y 7Yv9H Y:go Yv69Q Yv6Q& oZ9Yv go9YZ Yp97v Y:op", -"v 7ZYv9 Y:yo 6IX 6!In 6DX DX6a 1In 8I6X 1D6X D86X 6KIn InK6! DX6T 6DXTa In6", -"j Inj68 DX6j 6DsX 6(In +I6X 6(DX +D6X 1(In +I1n 6DX1( 6+D1X In(6K 6+IXK 6DX", -"T( 6+DTX Inj6( Inj6+ 6DXj( sIn6+ Gn6I In!6G J6X 6aJn Gn1I 6G8In J1n 68Jn In", -"K6G 6GKIn! 6TJn J6TaX Inj6G 6G8Inj 6XJj J6sX Id6X Idn6+ 6dJn J6gX Id1n Idn6", -"8 1dJn J1gn Idn6K IdK6+X J6TdX gJ6TX Idn6j 6+GInj J6jdX sJ6gX 6I4X In!46 6D", -"4X 4DX6a 7IX 8I7X 7DX D87X InK46 6IK4X! 4DX6T 6TI4aX In7j 7I8Xj DX7T 7DsX I", -";6X I;n6+ DX6; aX;6D I;7X 7I>X DX7; 7D>X I;n6K I;K6+X I;n6T 6+D4TX 7IX;j 7>", -"IXj 7DXT; 7sI>X 4G6In 4G6In! 4XJ6 J46aX Gn7I 7G8In 7JX J87X 4G6InK 6!4GInK ", -"J46TX 4TXJ6a 7GIXj Inj7G8 Jn7T sX7J Idn6; 6+GI;n 6XJ; gJ46X Id7X 7>GIn J;7X", -" >X7J IdK6X; Id4X6+K J6;TX J4Tg6X 7IdXj >Ij7dX 7JTdX J>n7s 6IP 6!IP DX6P aI", -"6P 1I6P 8I6P 6DX1P 6D8IP QI6X 6QIn! QD6X 6QDaX QI1n IPj68 IPj6D 6IsP 6(IP +", -"I6P 6DXP( 6+DIP 6IP1( 6+I1P IP(1Dn 1+D6IP 6QIX( 6+QIP 6QDX( 6+QDX IPj6( IPj", -"6+ IP(6Dj sIP6+ Y6I 6IY! YJ6 J6Ya 6IY1 68YI J6Y1 J6Y8 6QYI Y6QI! ZJY6 YZ6Ja", -" 6IYj Y68QI J6Yj YJs6 6IYd 6+YI YdJ6 YJg6 Y61Id Y6+1I YJ61d gY6J1 Y6QId Y6+", -"QI YZ6Jd gY6ZJ Y6jId Y6+Ij YJ6dj sY6gJ oI6 6Io! 6DoI 6aoI 7oI o87I oD7I oa7", -"I 6QoI oIQ6! 6ToI oTI6a op7I 7oIp8 oT7I 7osI 6Io; 6+oI oD6I; o+D6I 7;oI 7Io", -"> 7oDI; o>D7I oIQ6; o+I6Q oTI6; o+T6I 7oIp; o>I7p 7oTI; osI7> oIY6 Y6oI! oJ", -"6 oaJ6 7YI 7IY8 7Jo Y87J Y6oQI oIQY6! Z6oJ oJZ6a 7IYp 7Yp8I oJ7Z 7JsY v6oI ", -"Yv6+I Y6Jv g6oJ 7IYv 7IY> 7voJ 7Jgo Yv6QI Y6Qo+I oJZv6 goJZ6 7vIYp Y>7pI oJ", -"p7v 7Jyo b6X 6&bX 6DbX c6X 6Xb1 :In b6X1D c6:X bK6X I&n6K 6TbX 6TcX 6Xbj In", -":j Inj9D :Isn b(6X 6+bX b6XD( 6+cX b6X1( +I:n b6(1DX :cX6+ b6X(K b6+XK b6TX", -"( c6X+T Inj9( :In+j In(b1T sIn:+ 6GbX I&n6G J9n J6cX 1Gbn bG:n b1Jn :Jn b6G", -"XK I&K9Gn 9TJn cJ6TX Inj9G :Gnbj 9nJj sn:J 6dbX Idn6& 9dJn c6gX Idnb1 Id:n ", -"J9n1d gn:J Idn9K IdK6X& J9nTd c6XgT Idn9j :Idnj J9ndj :Jngs b64X I&n49 9D4X", -" 49cX 7bX :I7X bX7D 7cX 4bX6K I&K49X 4bT6X c4X6T bX7j 7:IXj bT7X sX7c 6Xb; ", -"I;&6X I;n9D 6Xc; bX7; 7b>X 7bXD; >X7c I;n9K I;K6X& I;n9T c6XT; 7bX;j 7>bXj ", -"7bTX; 7cXs> 4bG6X 49GI&n 49Jn cJ46X bG7X 7:GbX J97X 7X:J InK49G 4KbG6X& J49", -"TX c4TJ9n 7bGXj 7bj:Gn 7JbTX 7Js:X Idn49 49+Idn 9;Jn cJ6X; bd7X 7:IdX 7JbdX", -" >n:J IdK49X dX4&b6K J9;Tn c4Tg6X 7bdXj >Ij:Gn 7bTdX J>ns: 6IbP IP6& b6XDP ", -"6IcP b6X1P 6I:P 6DXb1P :cX6P 6QbX IP&6Q b6QDX 6QcX IPjb6 QI:n b6TIPj sIP:n ", -"b6XP( IP&6+ IP(9Dn c6X+P IP(b1n :IP6+ b(6X1DP :I+c6P b6QX( b6+QX IP(b6T c6Q", -"+X IP(b6j :QI+n 6XbjQD( sI+:Qn Yb6 b6Y& J6Yb Yc6 b6Y1 :IY6 YJ6b1 Y6:J b6YQ ", -"Yb6Q& ZbY6 Y6Zc b6Yj Y:b6Q YZb6j s6Yc b6Yd b6Y+ YJ6bd g6Yc Yb61d Y:b6+ YbdJ", -"1n Y:Jg6 Yb6Qd Yb6+Q YZb6d Yc6gZ Yb6dj Yb6+j YbdZ1n sYcg6 o9I 6Io& 9DoI o9c", -"X ob7I o:I 7obDX 7Ioc 9QoI o9IQ& 9ToI oc6QI pb7X op:I 7obTI sIo: 9Io; 9+oI ", -"o9DI; oc6+I 7obI; :Io> 7D;o9I o:Ic> o9IQ; o9+QI o9TI; c6QX; 7pbX; o:Ip> 7b;", -"oTI os:>I obY6 Ybo6& oJ9 Y6oc 7Yb Ybo: Yb7J Yc7 Ybo6Q Y6QoI& Z9oJ oJ9Zc Yb7", -"p o:IYp Yb7Z Yc7Z vbY6 Yvb6+ o9Jv g9oJ Yb7v 7>Yb oJ97v Ycg7 Yvb6Q YbQo9+ oJ", -"9Zv oJ9gZ 7Ybpv :vIop oJpv9 Ycy7 RXn n!RX XnRB RXan XnR. RX8n RXn.B aXnR8 X", -"Mn n!XM XMTn XMan MnXj XM8n XMnTj XMsn XnR( RX+n RXn(B aXnR+ RXn(. R+8Xn Xn", -"(R.B R+8aXn X(Mn XM+n XMnT( aXM+n XMnj( R+jXn RTXnj( sX+Mn RGn R!Gn GnRH Gn", -"Ra R.Gn GnR8 RGHn. RG8Hn GMn G!Mn GnRT aMGn GnRj 8MGn RGTnj RGsn GnRd +nRG ", -"RGHdn RGgn dX.Rn R+G8n RGHdn. gRG8n dMGn GM+n dXMHn GMgn dXMnj dXM8n RGTdnj", -" gsRGn R4X 4!RX RB4X 4XRa 4XR5 4XR8 R45XB R48aX 4XM 4!XM 4XRT aX4M 4XRj 8X4", -"M R4T5X R4sX 4XR; 4XR+ X;BR4 aX;R4 R45X; R4>X R45X;B >XR4a X;4M +X4M XM;4T ", -"aXM4+ XM;4j 4X>M R4TX;j >XsR4 R4G 4!RG 4GRH 4GRa 4GR5 4GR8 R4GH5 R4GH8 4MRG", -" R4GM! 4GRT aXM4G 4GRj R4G8M R4GHj R4sG 4GRd 4+RG R4GH; R4gX R4G5d R4>G 4HX", -"R5d >XgR4 dX4M dXM4+ dXM4H 4XgM dXM4j GM>n R4HdXj >Xg4M XPRn RXPn! RXPnB aX", -"PRn RXPn. R8XPn XPnR.B R8XaPn SXn n!SX TXSn aXSn XjSn 8XSn STXnj SXsn RXPn(", -" R+XPn XPnR(B R+XaPn XPnR(. +XPR8n .BR(XPn aX+PR8n XnS( +XSn STXn( S+TXn SX", -"nj( S+8Xn XjnST( Ss+Xn YRn RnY! RHYn RaYn RnY. R8Yn YRHn. Y8RHn SYn YnS! Zn", -"SY SnYa SnYj SnY8 SZYnj SYsn RdYn R+Yn YRHdn YRgn YRdn. Y+R8n dn.YRH gYR8n ", -"YdSn SnY+ SZYdn SYgn SYdnj SY+8n YZnSdj gSsYn oRX RXo! RXoB RaoX R5oX R8oX ", -"oR5XB o8RaX SoX o!SX SXoT SXoa pXSo SXo8 SpToX sXSo R;oX R+oX oRX;B o+RaX o", -"R5X; oR>X X;BoR5 o>RaX oXS; SXo+ S;ToX Sa;oX SpXo; So>X opTS;X os>SX oYR YR", -"o! YRoH YRoa oRY5 YRo8 Y5oRH Y5aoR SoY S!oY SYoZ YaSo SoYp Y8So SZpoY SosY ", -"vRoY YRo+ YvoRH oYgR YvoR5 >RoY ovRY5H goY>R YvSo Y+So YZvSo SogY SvoYp SoY", -"> YpoSvZ SoyY XnR# RX&n RXn#B aXnR& RXn#. X&nR8 Xn#R.B R8aX&n X#Mn MnX& XMn", -"T# aXM&n XMnj# XM&8n RTXnj# sX&Mn RXn#( X&nR+ Xn#R(B R+aX&n Xn#R(. R+8X&n .", -"BR(Xn# aXR&+n8 XMn#( XM&+n TX#Mn( +TXM&n Mn#Xj( +XM&nj XMTnj#( XM&sn+ R#Gn ", -"GnR& RGHn# RGa&n RGn#. RG8&n Gn#RH. G8nRH& G#Mn M&Gn RGTn# aMnG& RGjn# M&nG", -"8 XM#Hnj sRG&n dX#Rn dX&Rn RGHdn# gRG&n RG#dn. RG8d&n dXHnR#. RG8gn& dXMn# ", -"dXM&n dX#HMn gXM&n dM#Gnj XM&dnj dXHjMn# sX&gMn R#4X 4XR& R4X#B R4aX& R45X#", -" R48X& 4X#R5B 4aXR5& 4#XM XM4& R4TX# aXM4& R4jX# XM&48 XM#5Tn sR4X& X;#R4 X", -";&R4 R4#X;B R4aX;& R45X;# >XR4& 5#X;R4B R4a>X& XM;4# XM;4& XM#T;n XM&a;n XM", -"#;nj >XM4& X;Rj4T# sX&>Mn R#4G 4GR& R4GH# R4GH& R4G5# R4G5& R4#H5X 4G8RH& R", -"4GM# XM&4G R4GT# XM&4H R4Gj# M&nG5 XM#4Hj sR4G& R4Gd# dX&R4 dX#R4H gR4G& dn", -"#RG5 >nGR& H#5nRG; >X&gR4 dXM4# dXM4& dX#R4T g4XM& dX#R4j >MG&n dX4MH5# sX&", -"gR4 RXPn# X&PRn XPnR#B RaXP&n XPnR#. R8XP&n .BP#RXn aXR&8Pn XnS# X&Sn STXn#", -" SaX&n SXnj# S8X&n XjnST# SsX&n XPnR#( R+XP&n XPRn#B( aXR&+Pn #(P.RXn 8X+PR", -"&n XnR(.BP# anR&8X+P SXn#( S+X&n TXnS#( +TXS&n XjnS#( X&jS+n XjSnT#( S+Xsn&", -" RnY# R&Yn YRHn# YaR&n YRn#. Y8R&n RHnY#. RH8Y&n YnS# SnY& SZYn# SZ&Yn SYnj", -"# SY8&n YjnSZ# sYS&n YRdn# Y+R&n dn#YRH gYR&n dn#YR. d&nY8R dnY#RH. gR8Y&n ", -"SYdn# SY+&n YZnSd# gSY&n YjnSd# S+nY&j dnYjSZ# sY&gSn RXo# R&oX oRX#B oaRX&", -" oR5X# o8RX& R5Xo#B R5ao&X oXS# SXo& oTXS# oT&SX SpXo# Sp&oX oTXSp# osSX& o", -"RX;# o+RX& X;#oRB aX;o&R X;#oR5 o>RX& X;o#R5B oaR>X& S;Xo# S;&oX oTXS;# S+X", -"oT& opXS;# S>oX& X;S#opT S>Xos& oRY# YRo& oYRH# YaoR& Y5oR# Y5&oR oHRY5# Y5", -"RoH& S#oY Y&So oZYS# oZ&SY YpoS# Yp&So oZSYp# sYoS& YvoR# Yv&oR oHRYv# goYR", -"& ovRY5# Y>oR& YRoHv5# Y>Rgo& SvoY# Sv&oY oZYSv# goSY& YpoSv# S>Yo& SZYpov#", -" yoYS& [n [!n [Dn [an [n. [8n Dn[. D8[n [Mn Mn[! V[n [aVn [jn 8M[n [jVn [sn", -" [n( [+n Dn[( +D[n n([. +n[8 [Dn(. [+D8n Mn[( +M[n [nV( [+Vn nj[( +n[j V[nj", -"( [+sn [Gn Gn[! Jn[ [aJn Gn[. G8[n [nJ. [8Jn GM[n [!GMn JnV JaVn Gn[j [8GMn", -" VnJj Jn[s [dn +G[n [dJn g[n dn[. 8d[n Jn[d. [8gn dM[n [+GMn VdJn JngV dn[j", -" [+jGn JnVdj gn[s [4 [4! [4D [4a [45 [48 4D[5 4D[8 [4M 4M[! V[4 [aV4 [4j 48", -"[j [4V5 [s4 [4; [4+ 4D[; 4+[a 5n[; [>4 [45D; [a>n 4M[; 4+[M [4V; [4V+ 4j[; ", -"[4>M V[4;j >n[s [4G 4G[! J4[ [aJ4 4G[5 4G[8 [4J5 [4J8 4G[M [4GM! V[J4 J4V[a", -" 4G[j [48GM V5Jn J4[s [4d 4+[d [4J; g[4 4d[5 [d>n J4[5d >ng[ 4d[M [4+GM V;J", -"n V[g4 4d[j [>4GM J4[dj g4[s [Pn n![P DP[n aP[n Pn[. 8P[n [DPn. [8DPn S[n [", -"!Sn VnS[ Sn[a Sn[j Sn[8 SV[nj S[sn Pn[( +P[n [DPn( [+DPn [Pn(. [+8Pn DPn[(.", -" +DP[8n [nS( Sn[+ SV[n( SV+[n S[nj( S[+8n VnjS[( [sS+n [Yn Yn[! [YJn Yn[a [", -"nY. Yn[8 YJ[n. YJ8[n Sn[Y S[Yn! ]n ]an Yn[j S[8Yn ]jn ]sn Yn[d Yn[+ YJ[dn [", -"Ygn [Ydn. Y+[8n [YdJn. g[Y8n Sn[d S[+Yn ]dn ]gn S[dnj S[8dn dn]j gs]n o[ o[", -"! o[D o[a o[5 o[8 [5oD [5oa o[S S!o[ oV[ Sao[ [po S8o[ [poV os[ o[; o[+ [;o", -"D [+oD o5[; [>o o[5D; oD[> S;o[ S+o[ V;o[ V[o+ [;op o[S> oVp[; [>oV o[Y o![", -"Y oJ[ Yao[ Y5o[ Y8o[ J5o[ J8o[ SYo[ o[YS! ]o ]oa o[Yp [poY8 ]op ]os [vo Y+o", -"[ [voJ go[ [5ov o[Y> oJ[v5 [>go o[Sv [voS+ ]ov ]og op[v [pvo> op]v ]yo [bn ", -"[&n bn[D [cn bn[. b8[n [bDn. [8cn bM[n M&[n [bVn V[cn bn[j &n[j V[bnj sn[c ", -"bn[( b+[n [bDn( [+cn [bn(. [+b8n bnD[(. [c+8n [bMn( [+bMn V[bn( [cV+n [jbn(", -" [+jbn [jbVn( [sc+n bG[n G&[n [bJn Jn[c [bGn. [8bGn Jn[b. [cJ8n GMbn [&GMn ", -"JbVn VJcn [jbGn [&jGn JnVbj [sJcn bd[n d&[n Jn[bd gn[c [dbn. [8dbn [dbJn. g", -"[c8n [dbMn [d&Mn JnVbd gVn[c [djbn [d&nj Jnb[dj g[scn [4b [4& 4b[D [c4 4b[5", -" 4b[8 [4b5D [4c5 4b[M 4M[& Vb[4 V[c4 4b[j 4&[j V[4b5 s4[c 4b[; 4b[+ [4bD; [", -"4c; [4b5; [&>n b5n[;D >n[c [4bM; [4+bM V[4b; [c4V+ [4jb; [>4bM V4b[;j V>[c4", -" 4b[G 4G[& Jb[4 J4[c [4bG5 [48bG J4[b5 [c4J5 [4bGM [4&GM J4V[b [c4VJ [4jbG ", -"[4&Gj J4[bj [s4cJ 4b[d 4d[& J4[bd g4[c [4db5 [>4bG J4b[5d J>n[c [4dbM [4dM&", -" J;Vbn g[4Vc [4dbj >MbGn J4b[dj J>Vcn bP[n P&[n [bDPn [Pcn [bPn. [8bPn bPD[", -"n. [c8Pn [bSn Sn[& SV[bn cnS[ S[bnj S[8bn V[nSbj [scSn [bPn( [+bPn bPD[n( [", -"c+Pn bPn[(. b+P[8n bD[(Pn. [+8cPn S[bn( S[+bn V[nSb( Sc[+n [jnSb( Sbn[+j nj", -"V(S[b Sc+[sn [bYn Yn[& YJ[bn [Ycn Yb[n. Yb8[n Jn[Yb. Yc[8n SnYb S[&Yn ]bn ]", -"cn SYbnj SYb8n bn]j sc]n Yb[dn Yb+[n Jn[Ybd g[Ycn [dnYb. Ybn[8d dnJ.Yb[ Yc8", -"g[n S[dbn S[d&n bd]n gc]n Sbn[dj SbnY+j ]jnbd ]cngs o[b o[& [boD oc[ [5ob [", -"5o& o[b5D c5o[ Sbo[ S&o[ V[ob o[Sc ob[p o&[p oVp[b [poc [;ob [+ob o[bD; c;o", -"[ o[b5; ob[> [5boD; [>oc S[;ob o[+Sb oV[b; oV+[c [pob; [p&o> [pboV; oV>[c Y", -"bo[ Y&o[ [Job o[Yc Ybo[5 o[8Yb oJ[b5 oJ8[c YbSo o[&SY ]ob ]oc [poYb [p&oY o", -"p]b os]c ob[v o&[v oJ[vb ocg[ [vob5 [v&o> [vboJ5 oJ>[c [voSb [v&So ov]b go]", -"c [pvob [pvo& ]opvb yo]c qX q!X qXB qaX q1X q8X 1XqB 1aqX qXM XMq! qTX TXqa", -" lXq q8lX qTlX sqX qX( q+X X(qB +Xqa 1Xq( 1+qX q1X(B q+1aX XMq( +XqM TXq( +", -"TqX qXl( q+lX lXqT( q+sX qG qG! qGH qGa qG1 qG8 1GqH 1Gqa qGM GMq! qGT GTqa", -" lGq q8lG qGlH sqG qGd q+G HXqd gqG 1Gqd 1+qG qG1Hd qGg1 GMqd +GqM GTqd qGg", -"M qGld q+lG lGqTd lGgq q4X 4Xq! 4XqB 4aqX 7qX q87X qX7B qa7X 4XqM q!4XM 4Tq", -"X qT4aX lX7 l87X 7TlX lX7s q;X 4+qX X;qB aXq; q;7X q>X 7qX;B qa>X XMq; q+4X", -"M TXq; q+T4X 7Xl; lXq> 7qTX; >Xsq qG4 4Gq! 4GqH 4Gqa 7qG q87G qG7H qG7a 4Gq", -"M qG4M! 4GqT qGT4a 7qlG 7qGl8 7HlX 7qsG qG; 4+qG G;qH qGg4 qG7d q>G 7qGH; >", -"Xgq GMq; q+G4M GTq; gq4GT 7dlX lGq> 7qGTd lXg7 qXP XPq! XPqB aXqP 1XqP 8XqP", -" q1XPB q8aXP SqX q!SX SXqT SXqa SqlX SXq8 SlqTX SqsX XPq( +XqP qXP(B q+aXP ", -"q1XP( q+1XP 1XPq(B 1+XqaP qXS( SXq+ SqTX( Sq+TX SlqX( Sq+lX lXTSq( sqS+X Yq", -" Yq! YqH Yqa Yq1 Yq8 qHY1 qHY8 YqS S!Yq ZqY SaYq lYq S8Yq ZqlY sqY Yqd Yq+ ", -"YHqd gqY qdY1 q+Y1 Yq1Hd g1Yq SdYq S+Yq qdYZ gYZq ldYq l+Yq lYZqd gqlY oqX ", -"oXq! qXoB oXqa oq7X oXq8 7oqXB 7oaqX SXoq SqXo! oXqT SqaoX rX r8X rTX rsX o", -"Xq; oXq+ oqX;B oq+aX 7oqX; oq>X oq;7XB q>oaX SXq; Sq+oX Sq;TX SqaX; r;X r>X", -" TXr; >Xrs Yqo o!Yq oHYq oqYa 7Yq Y87q 7HYq Ya7q SoYq YqoS! oZYq YqaoZ rY r", -"Y8 rZY rsY vqY Y+vq qHYv gYvq vq7Y Y>q vq7YH Y>gq YqSv vqYS+ YZvq goqSY rYv", -" rY> YZrv yrY q9X q&X 9XqB 9aqX 9Xq1 :qX q91XB qa:X 9XqM XMq& 9TqX TXq& q9l", -"X lX:q lXq9T sX:q 9Xq( 9+qX q9X(B q+9aX q91X( q+:X 9X1q(B :q+aX q9XM( q+9XM", -" qT9X( q+T9X lXq9( :ql+X qT9lX( sq:+X qG9 qG& 9GqH 9Gqa 9Gq1 :qG qG91H qG:H", -" 9GqM GMq& 9GqT GTq& l9qG lG:q lGq9H sG:q 9Gqd 9+qG qG9Hd qGg9 qG91d q+:G 9", -"HXqd1 gX:q qG9dM q+G9M qGT9d gq9GT lGq9d :qGl+ lG9qTd glq:G 49qX 4Xq& q49XB", -" qa49X q97X 7X:q 7q9XB 7qa:X 9X4M q&4XM qT49X qT&4X l97X 7:lX 7qT9X 7sX:q 9", -"Xq; X;q& q;9XB qa;9X 7q9X; >X:q q;97XB q>:aX q;9XM q;&XM qT;9X qT;X& lX79; ", -"q>l:X 7T9lX; sq>:X 49qG 4Gq& qG49H qGa49 79qG 7G:q 7qG9H :qG7H qG49M qG&4M ", -"qGT49 qGT4& 7qGl9 :qG7l 7qG9T sqG7: 9Gq; G;q& qG;9H gq49G 7qG9d :Gq> 7G9qH;", -" q>Gg: qG;9M qG;M& qGT9; g49XM 7dXl9 q>Gl: 7G9qTd q>Gs: 9XqP X&qP q9XPB qa9", -"XP q91XP qX:P 9X1qPB :qaXP q9SX SXq& Sq9TX Sqa9X Slq9X :XSq lXqS9T sq:SX q9", -"XP( q+9XP 9XPq(B 9+XqaP 9X1qP( :q+XP 91q(XPB q+a:XP Sq9X( Sq+9X qTXS9( S9Xq", -"+T lXqS9( S:q+X l9qTSX( S:+sqX Yq9 Yq& qHY9 qHY& q9Y1 Y:q Yq91H Ya:q S9Yq S", -"&Yq Y9Zq Y&Zq lqY9 YqS: lYZq9 Y:sq qdY9 q+Y9 Yq9Hd g9Yq Yq91d Y+:q qH9Y1d Y", -":gq SqdY9 Yq+S9 ZqY9d gqZY9 lYq9d lY:q+ Zq9lYd glY:q q9oX oXq& oq9XB oqa9X ", -"7oq9X oq:X oq97XB o:qaX SXo9 Sq&oX oqT9X S9aoX r9X r:X 9TrX s:rX oq9X; oq+9", -"X q;Xo9B o9Xqa; oq97X; o:q>X 7Boq9X; q>ao:X Sq;9X Sq;X& S9XqT; S9Xo+T 9Xr; ", -">Xr: r;X9T r>Xs: oqY9 oqY& Y9oqH Yqao9 Y97q Yqo: 7Yq9H o:HYq Y9So Yq&So oZ9", -"Yq Zq&oY rY9 rY: YZr9 sYr: Y9vq Y&vq vqY9H vq&gY vq7Y9 vqY: 7Y9vqH go:Yq vq", -"YS9 vq&SY ZqvY9 vq&YZ Yvr9 Y:rv rZYv9 rYy: [q [q! [qD [qa [q1 [q8 qD[1 qD[8", -" [qM [Mq! Vq[ [aVq [lq q8[l [lVq sq[ [q( [q+ [(qD q+[a [(q1 q+[1 [q1D( [q+1", -"D [(qM [Mq+ V([q [qV+ l([q [ql+ Vql[( [+sq [qG [!qG Jq Jqa qG[1 qG[8 Jq1 Jq", -"8 [MqG [qGM! JqV qaVJ [qlG [lqG8 Jql sqJ [qd q+[d Jqd gqJ qd[1 q8[d qdJ1 g1", -"Jq [Mqd [q+GM VdJq gVJq [qld [l+qG ldJq sqg[ [q4 q![4 qD[4 qa[4 7[ 7[8 7[D ", -"7[a q4[M [q4M! [qV4 Vq[4a 7[l [87l 7V[ 7[s [q; q+[4 qD[; qa[; 7[; 7[> [;7D ", -"7D[> [Mq; [q+4M [qV; Vq+[4 l;7[ l>7[ V;7[ V>7[ qG[4 [q4G! Jq4 qaJ4 7[G [87G", -" 7Jq 7aJq [q4GM qGM[4! J4Vq JqV4a lG7[ 7[lG8 Jq7V 7Jsq qG[; [q+4G Jq; g4Jq ", -"7[d 7G[> 7dJq g7[ [qd4M [4Mq+G J;Vq Jq;gV ld7[ [>l7G l;Jq 7Vg[ [qP [Pq! [Pq", -"D [Pqa [Pq1 [Pq8 [q1DP [q8DP Sq[ S![q S[Vq [qSa Sq[l [qS8 SlV[q Sq[s qP[( [", -"Pq+ [qDP( [q+DP [q1P( [q+1P qDP[1( [1Pq+D S([q [qS+ Sq[V( Vq+S[ Sq[l( [l+Sq", -" [lSVq( sq[S+ Yq[ [!Yq JqY YaJq [qY1 [qY8 Y1Jq Y8Jq S[Yq Sq[Y! ]q ]qa [lYq ", -"Yq8[l ]lq ]qs [dYq [qY+ qdYJ gYJq Y1[qd Yq+[1 JqY1d Jq8gY [qSd Yq+S[ ]qd ]q", -"g lYq[d lY+[q ld]q gl]q o[q o![q [qoD [qoa 7[o o87[ 7Do[ 7ao[ Sqo[ Sq[o! Vq", -"o[ oVq[a r[ r[8 rV[ r[s [;oq [qo+ o[qD; o[+qD [;7o o[q> 7[oD; [>o7D [qS; o[", -"+Sq oVq[; oV+[q r[; r[> V[r; V>r[ o[Yq Yqo[! oJq oaJq 7[Y Y87[ oJ7[ Ya7[ Sq", -"[oY o[SYq! ]oq oq]a r[Y Y8r[ ]r ]rs vq[ [+vq Jqv oJgq 7[v 7[Y> vq7J 7[go Sq", -"[v vq[S+ ]qv go]q r[v Y>r[ ]rv ]yr tq[ [q& qD[t cq[ [1tq [:q tq[1D [:cq tM[", -"q [Mq& V[tq [cVq tq[l [l:q Vql[t uq[ t([q [qt+ tq[D( [+cq tq[1( [+:q [1Dtq(", -" cq[:+ tq[M( tq+[M Vq[t( cqV[+ [lqt( [:lq+ [ltVq( [qu+ tqG [&qG Jqt cqJ t1q", -"G tG:q J1tq :Jq tMqG tqGM& VqtJ cJVq tqlG [:lqG ltJq uJq [qtd q+tG tdJq cqg", -"[ tqG1d [q:d Jqt1d :Jgq tqGdM tq+GM JqVtd cqJgV [ldtq [:dlq Jqltd gquJ t4[ ", -"[&t4 tD[4 t4[c 7[t 7[: [t7D 7[c tM[4 t4[M& V[t4 cqV[4 [l7t l:7[ V[7t u7[ [q", -"t; [4t+ tq;[D [qc; t;7[ 7[t> 7[tD; [>7c tq;[M t4[+M Vq;[t cq;V[ [l;7t [>l7t", -" 7V[t; 7[u> [4tG tqG4& t4Jq c4Jq tG7[ 7G[: tJ7[ :J7[ tqG4M t4MqG& JqVt4 cqJ", -"V4 7tG[l 7[:lG Jql7t 7Juq [4td tq+4G t;Jq t4g[ td7[ tGq> Jq;7t 7[gt tqGM; t", -"4M[d& Jq;Vt cqJV; 7[dlt [:d7l Jqlt; g7u[ [qtP [Pq& tq[DP [qcP tq[1P [q:P [q", -"1tPD cq[:P tqS[ [qS& Sq[Vt Sq[c Sq[lt Sq[: VqlSt[ Squ[ tq[P( tq+[P [qDtP( c", -"q[+P [q1tP( [:q+P t1qD[P( [:+cqP Sq[t( St+[q Vq[St( Scq[+ [lqSt( S:[q+ SlVq", -"[t( uS+[q tYq Y&tq JqtY Ycq Y1tq Yq[: JqtY1 cqY: YqSt Yq&St ]qt ]qc ltYq lY", -"t:q lt]q ]uq tdYq t+Yq JqtYd tYgq tYq1d [:dYq tY1Jqd g[:Yq StdYq tY+Sq tq]d", -" gq]t lYtqd [:dSq ]lqtd ]qug ot[ [qo& [toD o[cq ot7[ o:[ ot7[D oc7[ o[St ot", -"[S& V[ot oVt[c r[t r[: V[rt ur[ t;o[ t+o[ ot[D; otc[+ ot7[; [>ot 7[Dot; cq>", -"o[ ot[S; ot+S[ oVt[; oVt[+ t;r[ t>r[ rV[t; r[u> tYo Y&ot oJt otYc tY7 7[Y: ", -"7JtY 7[Yc SotY tYoS& ]ot ot]c rtY tYr: ]rt ur] vqtY Y+ot oJtv tYgo 7[tv 7Yt", -"> oJt7v tYg7 vq[St ot+SY tv]o go]t tYrv tYr> rt]v ]yur w w! wB wa w. w8 w.B", -" w8a wK w!K wT wTa wj w8j wTj sw w* w+ w*B w+a w*. w+8 *Bw. 8*wa w*K w+K wT", -"* w+T wj* w+j T*wj sw+ wG w!G wH wHa wG. w8G wH. wH8 wGK GKw! wHT GTwa wjG ", -"G8wj wHj swG fw fw+ fwH gw fw. fw8 f.wH gw8 fwK fKw+ fwT gwT fwj w+fj wHfj ", -"gws w4 w!4 w4B wa4 w5 w58 w5B w5a w4K 4Kw! wT4 4Twa w5j 48wj w5T sw4 w= w=+", -" w=B =aw w=5 w> =Bw5 w>a w=K =Kw+ =Tw w+=T =jw w>j w5=T sw> w4G 4Gw! wH4 4G", -"wa w5G 4Gw8 wH5 4Hw8 4GwK w!4GK 4GwT wH4Ta 4Gwj w5G8j 4Hwj wHs4 fw= w+f= =H", -"w gw= fw5 w>f wHf5 gw> =Kfw fw=+K fw=T =Tgw fw=j fjw> wH=j s=gw wP w!P wPB ", -"waP wP. w8P P.wB 8Pwa wQ wQ! wQT wQa wQj wQ8 TPwj swQ wP* w+P P*wB +Pwa P*w", -". +Pw8 wP*.B w+a8P wQ* w+Q Q*wT +QwT Q*wj +Qw8 wQT*j w+sP Yw Yw! YwH Ywa Yw", -". Yw8 Y.wH wHY8 YwQ Y!wQ Zw Zwa Ywj wQY8 Zwj sYw Yfw Yw+ wHYf gwY Y.fw fwY8", -" YfwH. Y8gw fwQ w+fQ Zwf gwZ fwYj w+Yj fjZw sYgw ow ow! owB owa ow5 ow8 oBw", -"5 w5oa owQ o!wQ owT wQoa pw pw8 pwT swo ow= ow+ =Bow ow=a w5o= w>o ow=5B oa", -"w> =Qw w+=Q ow=T w+oT pw= pw> =Tpw pws= Ywo o!Yw owH owYa Yw5 owY8 wHY5 wHo", -"8 wQoY YwoQ! Zwo oaZw pwY Y8pw Zwp osZw x x+ xH xg x5 x> xH5 xg> xQ x+Q xZ ", -"xZg xp xp> xZp yx w, w& w,B wa& w,. w8& ,.wB ,8wa w,K w&K wT, wT& wj, w&j ,", -"Twj sw& w*, -w *Bw, -wa ,*w. -w8 w*,.B -8wa ,*wK -wK ,Tw* -wT ,jw* -wj wT*,", -"j sw- wG, w&G wH, wH& ,Gw. ,Gw8 ,Hw. ,Hw8 ,GwK G&wK ,GwT GTw& ,Gwj G&wj ,Hw", -"j wHs, fw, -wf f,wH gw- w,f. f8-w fwH,. w8g- w,fK fK-w f,wT fT-w f,wj fj-w ", -"fwT,j s-gw w4, w&4 ,4wB ,4wa w5, w5& ,5wB ,5wa ,4wK 4&wK ,4wT 4Tw& ,4wj 4&w", -"j ,5wT w5s, w=, -w= w,=B =a-w =,w5 w>- w=5,B wa-> w,=K =K-w =,wT =T-w =,wj ", -"=j-w =Tw,5 s-w> ,4wG 4Gw& ,4wH 4Hw& ,Gw5 G5w& ,Hw5 H5w& w4G,K w&4GK wH4,T w", -"H&4T w5G,j w5&Gj wH5,T sw4,G =,fw f=-w =,wH -wg= f,w5 -wf> =Hw,5 g-w> fw=,K", -" -wf=K =Hw,T -wTg= fw5,j w>f-j =Hw,j gws-> wP, w&P ,PwB ,awP ,Pw. ,8wP wP,.", -"B w8a,P wQ, wQ& ,QwT ,Qwa ,Qwj ,Qw8 wQT,j wQs, ,Pw* -wP wP*,B wa-P wP*,. w8", -"-P P*.w,B -w8aP ,Qw* -wQ wQT,* wQ-T wQ*,j wQ-j P*jwT, sP-w Yw, Yw& wHY, wHY", -"& w,Y. w8Y& YwH,. Yw8,H wQY, wQY& Zw, Zw& wjY, w&Yj wjZ, s,Zw fwY, Y-w Yfw,", -"H Y-gw Yfw,. Y8-w fwHY,. gwY-8 f,wQ fQ-w fwZ, Z-w Yfjw, Yj-w Zwf,j Y-sw ow,", -" ow& w,oB wao& w5o, w5o& ow5,B ow8,a wQo, wQo& wTo, wTo& pw, pw& wTp, s,pw ", -"w=o, o-w ow=,B oa-w ow=,5 w>o- w=5o,B o-w>a =,wQ =Q-w owT=, oT-w w=p, -pw p", -"w=,T o-sw Y,o owY& oHY, oaY, o,Y5 o8Y, Yw5,H Yw5,a YQo, Yw&oQ Y,oZ owZ& Y,p", -"w Y&pw Z,pw Y,os x, x- x,H xg- x,5 x-> ,Hx5 g-x> x,Q x-Q xZ, xZ- xp, xp- Zp", -"x, yx- wI w!I wD wDa wI. w8I wD. wD8 wIK IKw! wDT TIwa wjI 8Iwj wDj swD wI*", -" w+I wD* w+D I*w. +Iw8 D*w. +Dw8 I*wK +IwK D*wT +DwT I*wj +Iwj D*wj w+sI wG", -"I GIw! Jw Jwa GIw. G8wI Jw. Jw8 GIwK w!GIK JwT JTwa GjwI w8GIj Jwj swJ fwI ", -"fIw+ Jwf gwJ wIf. fIw8 J.fw J8gw wIfK fw+IK fTJw wTgJ fIwj fw8Ij fwJj sJgw ", -"w4I 4Iw! wD4 4Dwa w5I 48wI w5D 4Dw8 4IwK w!4IK 4DwT wD4Ta 4Iwj w58Ij 4Dwj w", -"5sI =Iw w+=I =Dw w+=D w5=I w>I w5=D w>D wI=K =Iw+K wD=T =Dw+T wj=I >Iwj wD=", -"j =Dsw 4GwI w!4GI Jw4 waJ4 G5wI w5G8I Jw5 w5J8 w4GIK 4GIw!K wTJ4 Jw4Ta w5GI", -"j 4G8wjI w5Jj s4Jw fw=I =Ifw+ J=w J=gw fIw5 >Ifw fwJ5 J>w =IfwK fw+=IK =TJw", -" J=gwT =Ijfw w>fIj =jJw J>sw wIP IPw! wDP DPwa IPw. 8IwP DPw. D8wP wQI QIw!", -" wQD QDwa QIwj Q8wI QDwj wQsI IPw* +IwP DPw* +DwP IP*w. w+8IP wDP*. w+D8P Q", -"Iw* +QwI QDw* +QwD wQI*j w+Q8I wQD*j sw+QD YwI w!YI JwY YaJw wIY. YIw8 Y.Jw", -" Y8Jw YIwQ YwQI! ZwJ waZJ YIwj Yw8QI YjJw sJZw YIfw YIw+ YfJw JwgY YfwI. Yf", -"8wI YJfw. Jw8gY fIwQ Yw+QI JwZf gZJw YfjwI Yw+Ij JwjZf gwZsJ owI w!oI owD w", -"Doa w5oI w8oI w5oD wDo8 wQoI owQI! wQoD owDQa pwI w8pI pwD sIpw =Io o+=I ow", -"=D oa=I =5oI =Io> owD=5 oDw> oI=Q ow+QI oT=I ow+QD =Ipw pIw> =Dpw =Ios oIYw", -" YwoI! oJw oaJw YIw5 Yw58I Y5Jw o8Jw YwoQI oIQYw! oJZw oJZwa pIYw pwY8I Jpw", -" oJsw xI x+I xJ xJg x5I x>I xJ5 xJ> xQI +QxI xZJ gZxJ xpI p>xI xJp yxJ hw h", -"w& hwD cw hw. hw8 h.wD cw8 hwK hKw& hwT cwT hwj w8hj wDhj hsw hw* -wh h*wD ", -"cw- w*h. h8-w hwD*. w8c- w*hK hK-w h*wT hT-w h*wj hj-w hwT*j s-cw hwG hGw& ", -"Jwh cwJ wGh. hGw8 h.Jw h8Jw wGhK hwG&K hTJw wTcJ hGwj hw8Gj hjJw sJcw hfw h", -"f-w hfJw iw h.fw fwh8 Jwhf. iw8 hKfw -whfK fwhT iwT fwhj -wjhf Jwjhf isw hw", -"4 w&h4 wDh4 cw4 hw5 w5h8 wDh5 cw5 w4hK hw4&K wTh4 wTc4 w5hj hw5&j w5hT h4sw", -" h=w -wh= hw=D cw= w=h5 h>w h=w5D cw> =Khw h=-wK hw=T =Tcw hw=j hjw> h=Tw5 ", -"swh> w4hG hw4G& h4Jw c4Jw hGw5 hw5G8 h5Jw c5Jw hw4GK w&Gh4K Jwh4T cwJ4T hw5", -"Gj h4Gw&j Jw5hT cw5sJ fwh= h=f-w Jwh= iw= fwh5 hfw> J=hw5 iw> h=fwK -wfh=K ", -"J=hwT =Tiw h=jfw h>wfj J=jhw swi> hwP w&hP wDhP cwP wPh. w8hP hwDP. w8cP hw", -"Q w&hQ wQhT cwQ wQhj wQh8 hwQDj hQsw wPh* hP-w hwDP* cP-w hwP*. -wh8P wD*hP", -". cw-8P h*wQ hQ-w hwQD* cQ-w hwQ*j -wQh8 hQ*wDj cwQs- hYw Y&hw JwhY Ycw h.Y", -"w Ywh8 hYJw. Y8cw YwhQ hYwQ& hZw Zwc Ywhj hY8wQ hjZw swhZ Yfhw -whY hYJfw i", -"Yw hYfw. hY8-w JwfhY. Ywi8 fwhQ -wQhY hfZw iZw hYjfw Y-jhw hZwfj sYiw oh oh", -"& ohD ohc oh5 oh8 oDh5 h5oc ohQ o&hQ ohT hQoc hpo h8pw hTpw hso oh= oh- =Do", -"h c=oh o=h5 h>o oh=5D och> =Qoh hQo- =Toh =Qcw h=pw o-hp ohTp= ohs= ohY Y&o", -"h oJh ohYc Ywh5 Y8oh h5oJ h8oJ oYhQ ohYQ& hZo ochZ hYpw oh8Yp Zwhp oJhs xh ", -"xh- xJh ix xh5 xh> hJx5 ix> xhQ h-xQ xZh ixZ xph hpx- hZxp ixy w6 w!6 w6B w", -"a6 w1 w18 w1B w1a w6K 6!wK wT6 6Twa w1j 68wj w1T sw6 w6* w+6 6*wB 6+wa w1* ", -"w1+ 1*wB 1+wa 6*wK 6+wK 6Tw* 6+wT 6*wj 6+wj 1Tw* w1s* w6G 6Gw! wH6 6Gwa w1G", -" 6Gw8 w1H 6Hw8 6GwK w!6GK 6GwT wH6Ta 6Gwj w1G8j 6Hwj w1sG fw6 w+f6 wHf6 gw6", -" fw1 w1f8 wHf1 gw1 w6fK fw6+K wTf6 wTg6 w1fj fw1+j w1fT g6sw w46 6!w4 46wB ", -"4aw6 7w 7w8 7wB 7wa 46wK w!46K 4Tw6 wT46a 7wj 78wj 7wT sw7 w=6 =6w+ w6=B =6", -"wa 7w= w>7 =B7w =a7w w6=K w=6+K =6wT =Tw6+ =j7w wj7> =T7w 7sw> 4Gw6 w!46G 4", -"Hw6 wH46a 7wG w87G 7wH wH7a w46GK 4G6w!K wH46T 4GTwa6 wj7G 7wG8j wH7T sG7w ", -"w=f6 fw=6+ =6wH w=g6 7fw w>7f =H7w g7w fw=6K w=+f6K =Hw6T gw=6T fj7w w>7fj ", -"fw7T swg7 w6P 6Pw! 6PwB 6awP w1P 68wP 1PwB 1awP wQ6 6Qw! 6QwT 6Qwa w1Q 6Qw8", -" 1QwT w1sP 6Pw* 6+wP w6P*B w+6aP 1Pw* 1+wP w1P*B w1+aP 6Qw* 6+wQ wQ6T* w+Q6", -"T 1Qw* 1+wQ w1QT* sw6+Q Yw6 w!Y6 wHY6 waY6 Yw1 w1Y8 wHY1 w1Ya wQY6 Yw6Q! Zw", -"6 waZ6 w1Yj Yw1Q8 Zw1 s6Zw Yf6 f6Y+ YHf6 Yfg6 fwY1 f6Y8 Yf61H Ywg1 fQY6 Yf6", -"+Q Y6Zf g6Zw f6Yj Yf6+j fwZ1 g1Zw ow6 w!o6 w6oB o6wa 7wo o87w 7Bow ow7a o6w", -"Q ow6Q! o6wT owT6a pw7 w87p 7Tpw 7spw =6ow o6w+ ow=6B ow+6a ow7= o>7w 7o=wB", -" w>o7a =6wQ ow+6Q owT=6 ow+6T p=7w 7pw> pw7=T pw>7s owY6 Ywo6! o6wH Ywao6 7", -"Yw Y87w 7HYw Ya7w Ywo6Q owQY6! owZ6 Zwo6a pw7Y pw7Y8 7Zw 7Zsw x6 x6+ x6H xg", -"6 x7 x7> x7H xg7 x6Q 6+xQ xZ6 gZx6 xp7 7px> xZ7 yx7 ?w ?w& ?wB ?wa ?w1 :w ?", -"Bw1 :wa ?wK ?Kw& ?wT wT?a ?wj :wj w1?T s?w ?w* -w? w*?B ?a-w ?*w1 :w- ?w1*B", -" wa:- w*?K ?K-w ?*wT ?T-w ?*wj ?j-w ?wT1* s-:w ?wG w&?G ?wH wH?a w1?G :wG w", -"1?H :wH wG?K ?wG&K wH?T ?wHT& wj?G wj:G wH?j sG:w ?fw -w?f fw?H g?w f1?w :f", -"w ?wHf1 gw: ?Kfw ?f-wK fw?T ?Tgw fw?j fj:w ?fTw1 s?gw ?w4 ?4w& w4?B ?4wa 7w", -"? :w7 7B?w ?a7w w4?K ?w4&K ?4wT ?wT4a ?j7w wj7: ?T7w 7s:w ?w= ?=-w =B?w ?w=", -"a ?=7w Aw ?w=7B Awa =K?w ?w=-K ?w=T -wT?= ?w=j Awj 7wT?= Asw w4?G ?w4G& ?4w", -"H ?wH4a ?G7w 7G:w ?H7w 7H:w ?w4GK w&4?GK ?wH4T ?G4wT& ?wj7G :w7Gj 7wH?T :wH", -"7s fw?= ?w=f- ?w=H ?wg= 7w?f Afw 7wH?f Agw ?w=fK -w=?fK ?fTw= g?w=T ?fj7w f", -"wAj 7fT?w gwAs ?wP w&?P wP?B wa?P w1?P :wP ?w1PB wa:P ?wQ w&?Q wQ?T wQ?a w1", -"?Q :wQ ?wQ1T sP:w wP?* ?P-w ?wP*B ?-Pwa ?w1P* :P-w w1*?PB :w-aP ?*wQ ?Q-w ?", -"wQT* -wQ?T ?wQ1* :Q-w ?Q*w1T :wQs- ?Y ?Y& ?YH ?Ya ?Y1 ?Y: Y1?H ?HY: ?YQ Y&?", -"Q ?ZY ?aZw ?Yj ?QY: ?jZw s?Y ?Yf ?Y- Yf?H g?Y Y1?f :f?Y ?Yf1H Y:g? Yf?Q ?QY", -"- ?fZw ?Zgw Yf?j ?jY- ?ZYf1 sYg? o?w o&?w ?Bow ow?a o?7w :wo 7wo?B oa:w ow?", -"Q ?wQo& ow?T o?Twa ?pw :wp ?Tpw ?psw ow?= -wo? ?w=oB o-?wa ?w=7o Aow o?=7wB", -" owAa ?w=Q o-?wQ o?Tw= o-T?w ?wp= Apw ?pw=T swAo ?Yo Y&o? oY?H Yao? ?Y7 :w7", -"Y ?H7Y ?a7Y oY?Q ?YoQ& o?Zw ?ZoYa ?pY Y:?p 7Z?Y ?psY x? x?- x?H x?g x?7 Ax ", -"?Hx7 Axg x?Q ?-xQ x?Z g?xZ x?p Axp ?Zxp Axy w6I 6Iw! wD6 6Dwa w1I 68wI w1D ", -"6Dw8 6IwK w!6IK 6DwT wD6Ta 6Iwj w18Ij 6Dwj w1sI 6Iw* 6+wI 6Dw* 6+wD 1Iw* 1+", -"wI 1Dw* 1+wD w6I*K w+6IK wD6T* w+D6T w1I*j w1+Ij w1DT* sw6+D 6GwI w!6GI Jw6", -" waJ6 1GwI w1G8I Jw1 w1J8 w6GIK 6GIw!K wTJ6 Jw6Ta w1GIj 6G8wjI w1Jj s6Jw w6", -"fI fw6+I fwJ6 g6Jw fIw1 fw1+I fwJ1 g1Jw fw6IK w+If6K Jwf6T gwJ6T fw1Ij f6Iw", -"+j Jw1fT gwsJ6 4Iw6 w!46I 4Dw6 wD46a 7wI w87I 7wD wD7a w46IK 4I6w!K wD46T 4", -"TIwa6 wj7I 7w8Ij wD7T sI7w w6=I =Iw6+ =6wD =Dw6+ =I7w 7Iw> =D7w 7Dw> =Iw6K ", -"w+6=IK =Dw6T =D6w+T 7w=Ij w>7Ij 7wD=T w>D7s w46GI 4G6w!I w4J6 Jw64a wG7I 7w", -"G8I 7Jw 7aJw 4G6wIK 6!w4GIK Jw64T wT4J6a 7wGIj w8G7Ij 7TJw 7Jsw =Ifw6 fw6=I", -"+ w=J6 J=gw6 fw7I w>7fI 7wJ= 7Jgw fw6=IK =6w+fIK J=w6T gw6J=T 7fwIj 7fIw>j ", -"J=j7w J>w7s 6IwP w!6IP 6DwP wD6aP 1IwP w18IP 1DwP w1D8P 6QwI wQ6I! 6QwD wQD", -"6a 1QwI w1Q8I 1QwD sw6QD IP6* w+6IP wD6P* w+D6P w1IP* w1+IP w1DP* w1+DP wQ6", -"I* w+Q6I wQD6* w+Q6D w1QI* w1+QI w1QD* sIP6* w6YI Yw6I! Y6Jw YJ6wa YIw1 Yw1", -"8I Y1Jw Jw1Y8 Yw6QI wQIY6! Z6Jw ZwJ6a Yw1QI Y6IwQ8 Z1Jw sYwJ6 YIf6 Yf6+I Jf", -"Y6 gY6Jw Yf61I Yf68I Jw1Yf gw1YJ Yf6QI Y6Iw+Q Zf6Jw gwZJ6 Yf6Ij Y6IfQ8 Zw1J", -"f gwZJ1 w6oI ow6I! o6wD owD6a ow7I 7oIw8 ow7D 7wDo8 ow6QI wQ6oI! owD6Q oD6w", -"Qa 7Ipw pw78I 7Dpw osI7w =6oI ow+6I owD=6 ow+6D 7o=I w>o7I 7wDo= w>D7o =Qw6", -"I o+6=QI oTI=6 o+6=TI pw7=I pw>7I pwD7= osI7= Ywo6I owIY6! J6ow oJw6a 7IYw ", -"7Yw8I 7woJ oJ87w owQY6I o!Yw6QI oJZw6 Zw6oJa pw7YI 7Y8pwI Zw7J oJs7w x6I 6+", -"xI xJ6 gJx6 x7I 7>xI xJ7 g7xJ 6QxI x6+QI ZJx6 xZJg6 7pxI xp7>I 7ZxJ x7yJ h?", -"w w&h? ?wD cw? hw1 :wh w1?D :wc ?Khw ?w&hK ?whT ?Tcw ?whj hj:w w1hT :whs h*", -"?w h?-w ?*wD -w?c h*w1 -wh: ?wD1* :c-w ?w*hK -w?hK ?wDT* cw?-T ?wjh* :wh-j ", -"?wD*j :wcs- ?Ghw ?wGh& ?Jw cw?J hGw1 :Ghw h1Jw :Jw ?wGhK hw&?GK ?TJw cw?JT ", -"?wjhG :whGj ?jJw ?Jsw hw?f ?fh-w Jw?f i?w fwh1 hf:w Jw1?f i:w ?fhwK -wh?fK ", -"?fTJw ?wiT ?fjhw :fwhj ?Jjfw s?iw ?wh4 ?w4h& ?4wD c4?w 7hw :w7h ?D7w 7cw ?w", -"4hK h4&?wK ?wD4T cw?4T hj7w :w7hj hT7w 7hsw ?wh= ?w=h- ?w=D ?wc= 7wh= Ahw 7", -"wDh= Acw ?w=hK -w?h=K h=T?w cw=?T h=j7w hwAj 7hTw= hsAw ?w4hG hw4?G& J4?w c", -"w?J4 7Ghw :w7hG 7w?J :w7J hw4?GK hGw&?4K ?Jw4T ?J4cwT 7hwGj 7hG:wj ?J7wT hs", -"7Jw ?w=hf ?f-h=w ?wJ= ?wi= hf7w hfAw ?J7fw Aiw ?fwh=K =K?f-wh ?J=wT i?w=T 7", -"hfwj Ahjfw J=j?w isAw h?P h&?P ?DhP hP?c ?Ph1 hP:w ?wD1P :Pcw ?whQ ?wQh& ?T", -"hP ?Qcw ?Phj hQ:w ?wQ1D hPs? h*?P ?-hP ?wDP* cw?-P h?P1* :wh-P ?D*h1P :wc-P", -" ?wQh* -wQh? ?wQD* cwQ?- ?Pjh* :wQh- ?Q*w1D :wc-Q ?Yh Y&h? ?JY ?Yc h1?Y hY:", -"w Y1?J Y:?J hQ?Y ?YhQ& ?YhZ Yc?Z hj?Y :wQhY h1Zw ?JsY ?fhY h?Y- YJ?f i?Y hY", -"1?f ?Y:hf ?JYf1 ?Yi: ?fQhY ?Y-hQ hZ?Yf ?ZiY ?Yjhf :wQhf hZwf1 s?iY oh? o&h?", -" ?Doh ?coh 7ho oh: 7Doh oh7c hQo? oh?Q& hTo? ohc?Q oh?p :whp ?Dpw ohs? o?h=", -" h?o- oh?=D ohc?- 7oh= Aoh 7ho=D ohAc oh?=Q oh-?Q ohT?= oh-?T hpo?= hpAo oh", -"T7= hsAo oh?Y oh?Y& ?Jo oc?J 7hY 7hY: 7J?Y 7hYc oh?YQ ?YQoh& oJ?Z hZo?c ?Yh", -"p :wphY 7YhZ Yc?p x?h h?x- x?J ix? x7h Axh ?Jx7 Aix h?xQ x?h-Q hZx? x?iZ hp", -"x? xpAh hZx7 yAix wR w!R wRB waR wR. w8R R.wB R8wa wM wM! wTR waM wMj w8M R", -"Twj swR wR* w+R R*wB R+wa R*w. R+w8 wR*.B w+R8a wM* w+M RTw* R+wT R*wj R+wj", -" wTR*j w+sR wRG RGw! wHR RGwa RGw. RGw8 RHw. RHw8 wMG GMw! wHM GawM RGwj G8", -"wM RHwj wHsR fwR w+fR wHfR gwR wRf. w8fR fwRH. w8gR fwM w+fM wHfM gwM wMfj ", -"w8fM fwTRj gRsw wR4 R4w! R4wB R4wa w5R R4w8 R5wB R5wa wM4 4Mw! R4wT 4awM w5", -"M 48wM R5wT w5sR =Rw w+=R wR=B wa=R w5=R w>R =Rw5B >Rwa =Mw w+=M wT=R wa=M ", -"w5=M w>M =RTw5 >Msw R4wG w!R4G R4wH wHR4a RGw5 w5RG8 RHw5 wH5R8 4GwM wM4G! ", -"4HwM wHM4a G5wM w5MG8 H5wM swR4G =Rf =+fR fR=H =Rgw f5=R =Rf> =RfH5 gRw> fw", -"=M =Rf+M fR=T =Mgw fR=j fw>M =RfHj >Mgw wRP RPw! RPwB RawP RPw. R8wP wRP.B ", -"w8RaP Sw Sw! SwT Swa Swj Sw8 STwj swS R*wP R+wP wRP*B w+RaP wRP*. w+R8P P*.", -"wRB aP*w8R Sw* Sw+ wTS* w+Sa wjS* w+S8 SwT*j s*Sw YwR w!YR YRwH YRwa wRY. Y", -"Rw8 YwRH. Yw8RH SwY S!Yw ZwS SaZw YjSw YwS8 wjSZ SsZw fRYw YRw+ YfwRH YwgR ", -"YfwR. Yf8wR fRHYw. gwYR8 Sfw YwS+ ZwSf gwS fjSw fwS8 SfZwj swgS owR w!oR wR", -"oB oRwa oRw5 oRw8 owR5B ow8Ra Swo S!ow oTSw owSa pwS S8pw wTSp Sspw ow=R oR", -"w+ ow=RB ow+Ra ow=R5 >Row =R5owB w>oRa S=w owS+ =TSw =aSw pwS= S>w pw=ST S>", -"sw YRow YwoR! oRwH YwaoR YRw5 Yw5R8 Yw5RH Yw5Ra YwSo SwoY! oZSw SwaoZ YpSw ", -"pwYS8 SZpw sYoSw xR xR+ xRH xgR xR5 x>R RHx5 g>xR xS xS+ xZS xgS xpS x>S SZ", -"xp yxS wR, w&R ,RwB ,Rwa ,Rw. ,Rw8 wR,.B w8R,a wM, wM& ,RwT ,awM ,Rwj ,8wM ", -"wTR,j wMs, ,Rw* -wR wR*,B wa-R wR*,. w8-R ,R*w.B -wR8a ,Mw* -wM wTR,* wT-R ", -"wM*,j w8-M ,RTwj* sR-w ,RwG RGw& ,RwH RHw& wRG,. w8R,G wHR,. wH8,R ,GwM GMw", -"& ,HwM HMw& wMG,j w8M,G wHM,j swR,G wRf, fR-w fwR,H gR-w fwR,. -wfR8 wH,fR.", -" gw-R8 f,wM fM-w fwT,R gM-w fwM,j -wMf8 fR,wHj gws-R ,Rw4 R4w& wR4,B waR,4 ", -",Rw5 R5w& w5R,B w5a,R ,4wM 4Mw& wTR,4 wT&R4 ,5wM 5Mw& w5T,R swR,4 wR=, =R-w", -" =Rw,B -w=Ra =Rw,5 -Rw> w5,=RB w>-Ra =,wM =M-w =RTw, -wT=R =Rjw, >M-w =R,w5", -"T w>Ms- R4,G w&R4G wHR,4 wH&R4 w5R,G w5&RG wH5,R wH5R& wM4,G wM&4G wHM,4 wH", -"M4& w5M,G w5MG& wH5,M wH5M& =,fR f-=R =Rf,H g=R-w =Rf,5 w>f-R =R,wH5 gw>-R ", -"=Rf,M -wMf= =Rf,T gwM-= =Rf,j w>Mf- =R,f5T w>Mg- ,RwP R&wP wRP,B waR,P wRP,", -". w8R,P ,RPw.B ,R8waP Sw, Sw& wTS, wTS& wjS, w8S& SwT,j s,Sw wRP,* wR-P P*B", -"wR, -wRaP P*.wR, -wR8P ,RwBP*. w8R-Pa w*S, S-w SwT,* Sa-w Sw*,j S8-w wT*S,j", -" S-sw wRY, YRw& YwR,H Ywa,R YwR,. Yw8,R wHRY,. Y8RwH& YwS, YwS& S,Zw S&Zw S", -"Y,wj Sw8Y& ZwS,j sYwS& Yfw,R -RYw fwRY,H gwY-R fwRY,. Y-wR8 ,Hw.YfR Y-Rgw8 ", -"fwS, SwY- SfZw, S-gw Sfw,j Sf-w8 ZwjSf, gwSs- wRo, oRw& owR,B owa,R owR,5 o", -"w8,R w5Ro,B oaRw5& owS, owS& Swo,T Swao& S,pw S&pw pwS,T os,Sw ow=,R -Row =", -"R,owB o-wRa =R5ow, o-w>R =Bow,R5 w>Ro-a w=S, Swo- S=w,T o-TSw pw=S, pwS- S=", -"Tpw, os-Sw YRo, Yw&oR Y,oRH Yao,R Yw5,R Yw5R& Y5RoH, Y5Roa, Y,So Sw&oY oZ,S", -"w Zw&So pwYS, pw&SY ZwpS, os,SY x,R x-R ,RxH g-xR ,Rx5 ->xR x,RH5 xg->R xS,", -" x-S SZx, gSx- Spx, S-xp xZpS, y-xS [w [w! [wD [wa [w. [w8 w.[D [8wD [wM [!", -"wM Vw Vwa [wj [8wM Vwj swV [w* [w+ [*wD wD[+ w.[* w8[+ [wD*. [w+D8 [*wM wM[", -"+ Vw* Vw+ [*wj wj[+ wjV* s*Vw [wG wG[! Jw[ wa[J w.[G wG[8 J.[w [wJ8 [GwM [w", -"GM! VwJ waVJ wG[j [w8GM JjVw sJVw [fw w+[f [fJw g[w f.[w [wf8 Jw[f. w8g[ [w", -"fM [fw+M Vfw gwV [wfj [f8wM fjVw swg[ [w4 w![4 wD[4 wa[4 [w5 w8[4 [5wD wa[5", -" wM[4 [w4M! Vw4 waV4 wM[5 [w58M Vw5 s4Vw [= [=+ [=D [=a [=5 [>w [5=D =D[> [", -"=M [+=M Vw= =aVw [=j >M[= =jVw s=[ wG[4 [w4G! [wJ4 Jw[4a wG[5 [w5G8 [wJ5 Jw", -"5[8 [w4GM wMG[4! J4Vw VwJ4a [w5GM [4Gw8M J5Vw Vw5sJ [=f [+f= J=[ g[= f5[= f", -">[= J5[= [>gw =M[f [=f+M VwJ= V=g[ =j[f [>f=M Jj[= s=g[ [wP wP[! wP[D wP[a ", -"[Pw. wP[8 [wDP. [w8DP Sw[ S![w VwS SaVw wjS[ [wS8 wjSV SsVw wP[* wP[+ [wDP*", -" [w+DP [wP*. [w+8P [*PwD. [+PwD8 [wS* [wS+ S*Vw S+Vw S[*wj Sw+[8 VwS*j Vw+S", -"s Yw[ [!Yw [JYw [wYa Y.[w [wY8 Yw[J. Jw8[Y YwS[ Yw[S! ]w ]wa [wYj Sw8[Y ]wj", -" ]sw Yw[f [wY+ YJf[w Ywg[ Yw[f. [f8Yw [fYJw. g[wY8 [fSw Sw+[f ]fw ]gw [fjSw", -" Sf8[w fw]j gw]s o[w o![w [woD [woa w5o[ [wo8 o[w5D o[8wD o[Sw Swo[! oVw oa", -"Vw pw[ w8[p Vwp oVsw [=o o+[= =Do[ =ao[ [5o= o[w> [=o5D [>o=D S=[ S+[= VwS=", -" S[=a [p= [>S= pwV= VwS> Ywo[ Yw[o! Jwo[ oJ[wa [wY5 o[8Yw oJ[w5 oJ8[w Yw[So", -" o[YSw! ]ow ow]a Yw[p pw[Y8 ]pw sw]o x[ x[+ xJ[ xg[ x[5 x[> J5x[ g[x> x[S S", -"[x+ ]x ]xg xp[ S>x[ ]xp ]yx hw[ [w& wD[h cw[ h.[w [wh8 hw[D. w8[c hwM w&hM ", -"Vwh cwV [whj w8hM hjVw Vwhs [*hw [-w hw[D* [-cw hw[*. w8[- wD*[h. cw[-8 h*w", -"M hM-w V*hw V-w hwM*j [w-j Vwh*j V-sw hG[w wG[& [Jhw [cJw hw[G. hw8[G Jw[h.", -" cwJ[8 hGwM hwMG& VhJw cJVw hwMGj hw8GM VwJhj cwVsJ hw[f [f-w Jw[hf i[w [fh", -"w. [-fw8 [fhJw. [wi8 fwhM [-fwM hfVw iVw [fjhw [-jfw Vfwhj swiV h4[ w&[4 hD", -"[4 h4[c [wh5 [4h8 hw5[D [wc5 [4hM hwM4& h4Vw c4Vw [4hj hw58M h5Vw h4[s [=h ", -"[-= [h=D c=[ h5[= w>[- [=h5D [>cw hw=M =M[- h=Vw Vwc= hj[= =j[- Vw=h5 Vwh> ", -"hG[4 h4[G& [Jh4 cwJ[4 hw5[G h4[G8 Jw5[h cw5[J hwM4G h4GwM& VwJh4 cwVJ4 hw5G", -"M h4Gw8M Vw5hJ cwVJ5 [fh= f-[= hJ[= i[= [=hf5 [-=f> J=[h5 [>iw [=hfM [-=fM ", -"J=Vhw Vwi= [=jhf [-=fj J=[hj s=i[ [whP wP[& hw[DP [wcP hw[P. hw8[P hPD[w. c", -"w[8P Shw S&hw VwSh Scw hjSw h8Sw VwhSj Shsw hw[P* [w-P hPD[w* cw[-P hP*[w. ", -"[-w8P h*wD[P. [-8cwP S*hw Sw[- VwhS* cwS- Shw*j [-jSw Sh*Vwj V-wSs [hYw [wY", -"& hYJ[w Yw[c hY[w. hY8[w Jw[hY. Ycw[8 SwhY Sw&hY ]hw ]cw hYjSw Sh8Yw hw]j h", -"s]w hY[fw Yw[- Jw[hYf Ywi[ [fwhY. Y-[w8 h.Jw[fY i[Yw8 hfSw Shf-w hf]w ]iw S", -"hfwj [-jYw ]hfwj iw]s oh[ [ho& [hoD o[cw h5o[ h8o[ oh[5D ohc[5 Sho S&oh oVh", -" ohSc pwSh Soh8 oVhp oVhs [=oh o-[ oh[=D [-oc oh[=5 [>oh [=5ohD cw>o[ Sh= o", -"hS- V=Sh cwS= S=hp S=h> oVhp= Shs= o[hY oh[Y& hJo[ oJh[c oh[Y5 oh8[Y oJh[5 ", -"oJh[8 SohY ShoY& ]oh oh]c pw[hY oh8SY hp]o hs]o x[h x[- hJx[ ix[ h5x[ h>x[ ", -"xJ[h5 x[i> xhS Shx- ]xh ]ix hpx[ h>xS xp]h ix]y wq wq! wqB wqa wq1 wq8 q1wB", -" q8wa wqM q!wM wqT qTwa lw lw8 lwT lws wq* wq+ wBq* q+wa q*w1 q+w1 wq1*B wq", -"+1a q*wM q+wM q*wT q+wT lw* lw+ wTl* l+sw wqG w!qG wqH qGwa qGw1 qGw8 qHw1 ", -"qHw8 qGwM wqGM! qGwT wqHaM lwG w8lG lwH lGsw fq fq+ fqH gqf fq1 fq8 qHf1 g1", -"fq fqM q+fM fqT gMfq lfq l+fq lHfq glw wq4 w4q! q4wB w4qa 7wq w87q 7Bwq wq7", -"a q4wM wq4M! w4qT wqT4a lw7 w87l 7Tlw 7slw q=w w+q= =Bwq wq=a q=7w w>q 7wq=", -"B waq> wq=M q=w+M wq=T q=Tw+ lw= lw> =Tlw swl= w4qG wq4G! w4qH wqH4a wq7G 7", -"qGw8 wq7H 7wHq8 wq4GM qG4wM! wqH4T wT4qGa lG7w lw7G8 lH7w lws7G fq= q+f= =H", -"fq g=fq 7fq fq> 7Hfq 7fgq =Mfq fq=+M =Tfq fqTg= 7flw w>lf =Hlw g7lw wqP wPq", -"! qPwB wPqa q1wP wPq8 wq1PB wq8aP Swq S!wq wTSq wqSa lwS S8lw wTSl Sslw wPq", -"* wPq+ wqP*B wq+aP wq1P* wq+1P q*Pw1B w1Pqa* wqS* wqS+ Sq*wT Sw+qT l*Sw l+S", -"w lwST* lwsS+ Yqw q!Yw wHYq wqYa wqY1 wqY8 Yw1qH Yq8wH YqSw SwqY! Zqw waZq ", -"lYw Y8lw lwZ sYlw fqY Y+fq qHYf gYfq Y1fq Y8fq fqY1H fq8gY Sfq S+fq Zqf Sfg", -"q Sflw S8fq Zqlf gwlY oqw o!wq oBwq wqoa oq7w wqo8 7woqB 7waoq oqSw Swoq! w", -"qoT Swaoq rw rw8 rwT rsw owq= wqo+ q=owB q=aow 7o=wq oqw> q=o7wB w>qoa q=Sw", -" Sw+q= q=TSw S=awq rw= rw> =Trw swr> oqYw Yqow! wqoH Yqaow 7wYq Yq87w 7wHYq", -" 7Yawq SwoYq YqoSw! oqZw Zqwoa rYw Ywr8 rZw sYrw xq xq+ xqH xqg xq7 xq> 7qx", -"H gqx7 xqS Sqx+ xZq gqxZ xr xr> xrZ yxr ?qw wq& ?Bwq wq?a w1?q :wq ?qw1B wa", -":q ?wM w&?M wq?T wa?M lw? lw: ?Tlw s?lw q*?w -qw ?qw*B wa-q ?qw1* -q:w w1*?", -"qB :wq-a ?*wM ?M-w ?qTw* wq-T ?wl* l-w lw?T* swl- ?qG qGw& wq?H qG?a ?1qG ?", -"G:q ?qG1H wq:H wM?G ?qGM& wH?M ?qGT& ?qlG lG:w ?wlH lH:w fq? fq- ?Hfq fqg? ", -"f1?q :fq fq?1H :fgq ?Mfq fM-q ?Tfq ?wgM ?flw :flw fqTl? lwg? ?4wq w4q& ?qw4", -"B ?qaw4 ?q7w :q7w ?q7wB :wq7a ?4wM ?wM4& ?qTw4 ?wa4M l?7w l:7w 7wTl? lws7? ", -"?wq= q=-w ?w=qB -qw=a ?q7w= Aqw q=?7wB wqAa ?w=M -qw=M q=T?w -qTw= ?wl= Alw", -" lw=?T lwAs ?4qG ?qG4& ?qG4H ?qG4a 7q?G :wq7G 7wH?q :wH7q ?qG4M ?G4wM& ?qG4", -"T ?G4waM lw?7G lw:7G lwH7? :wH7l q=?f f-q= fq?=H fq-g= ?q7f Aqf 7fq?H gqAf ", -"fq?=M fq-=M fqT?= fq-=T lf?7w lfAq fqT7? glAw wq?P wPq& ?qwPB ?qawP ?qw1P w", -"q:P wq1?PB :wqaP S?w S&?w ?TSw ?aSw S?lw S:w lw?ST S?sw ?qwP* wq-P wq*?PB -", -"qwaP wq1?P* :wq-P ?Bwq1P* -qa:wP S*?w Sw-q S?wT* -qTSw lw?S* S-lw S?Tlw* l-", -"wSs ?Yq Y&?q ?HYq ?aYq Y1?q Yq:w ?Yq1H :wHYq S?Y S&?Y Zq?Y ?aSY lY? ?YS: ?Z", -"lY s?lY fq?Y Y-q fq?YH ?Ygq fq?Y1 fqY: ?Y1fqH g?Y:q S?f S-?Y Sf?Z S?gw S?lf", -" ?Yl- lY?Zf g?lY oq?w wqo& o?qwB o?awq ?q7ow oq:w o?q7wB :woqa o?Sw Sw&o? o", -"?TSw S?aow r?w r:w ?wrT s?rw ?w=oq oq-w q=wo?B o-qwa o?q7w= oqAw =B7wo?q Ao", -"awq ?wS= o-qSw S?=wT o-qwT ?wr= Arw r=T?w rsAw o?Yq Yq&o? o?HYq ?Yaoq ?q7Y ", -":woYq ?Y7qH :woqH So?Y S?Yo& S?ZoY S?Yoa r?Y ?Yr: ?ZrY s?rY x?q xq- ?qxH g?", -"xq ?qx7 Axq x?q7H xqAg x?S S?x- S?xZ g?xS xr? Axr r?xZ yxAr [qw [!wq wqD wa", -"[q [w1 w8[q wD[1 wa[1 wM[q [qwM! Vwq waVq lw[ w8[l lwV Vwsq [q* w+[q [*qD q", -"+wD [*w1 [1w+ [q*1D [q8D* [Mq* [q+wM [qV* wqV+ [ql* [wl+ l*Vw l+Vw qG[w [qw", -"G! Jqw waJq wG[1 [q8wG [wJ1 wqJ8 [qwGM wMG[q! VwJq JqVwa [wlG lw[G8 lwJ Jqs", -"w fq[ [+fq Jqf Jqgw [qf1 [qf8 J1fq J8fq [qfM fq[+M fqV Vfgq [lfq fq8[l Jqlf", -" g[lw [4wq [qw4! w4qD [qaw4 7[w w87[ [w7D [w7a [qw4M [4Mwq! wqV4 Vwq4a 7[lw", -" lw7[8 7Vw 7Vsw [=q [+q= [q=D [q=a 7[= w>7[ =D7[ =a7[ [q=M [=q+M Vq[= Vw=q+", -" l=[ [>lw Vwl= 7[s= [qw4G [4Gwq! wqJ4 Jqw4a [w7G 7[wG8 7wJq Jq87w [4GwqM [!", -"wq4GM JqVw4 Vw4Jqa lw7[G 7[Glw8 7Jlw lwJ7s [=fq fq[=+ Jq= J=gq 7[f [>7f Jq7", -"f 7[gw fq[=M [=+fqM V=Jq Jq=gV 7[lf fq>[l Jql= g[l= wP[q [qwP! wPqD [qawP w", -"P[1 [q8wP [w1DP [w1aP [qSw Sq[w! VqSw VwqSa [lSw Sw8[l SlVw lwVSs [Pq* [q+w", -"P [q*DP [qaP* [q*1P [q8P* w1PqD* w1P[a* [qS* Sw+[q VwqS* Vw+Sq lw[S* lw+S[ ", -"lwVS* Vw+Sl [qYw Yw[q! JwYq JqYwa [wY1 Yq8[w JqYw1 Jq8Yw Sq[Yw Yq[Sw! ]qw w", -"q]a Yw[l lYw[8 ]lw lw]s [fYq fq[Y+ YJfq JqfgY fq[Y1 fq8[Y JqfY1 JqfY8 Sq[f ", -"Sfq[+ ]qf gq]f lYf[q fq8S[ lf]q gl]w [qow o[qw! wqoD o[awq o[7w o[87w 7wDo[", -" 7[aow Sq[ow o[qSw! oqVw oVwqa r[w [wr8 rVw swrV q=o[ [=oq+ [=oqD [=aoq 7o[", -"= [>o7w 7[=oD w>qoD Sq[= S=[q+ oVwq= oVwq+ r[= [>rw Vwr= s=r[ Yw[oq o[wYq! ", -"oqJw oJqwa Yw7[ 7[Yw8 oJq7w oJqw8 YqoSw[ Sqo[Yw! oq]w ]oqwa Ywr[ r[Yw8 ]rw ", -"rs]w xq[ [qx+ xJq gqxJ x7[ 7[x> 7Jxq g7x[ Sqx[ xq[S+ ]xq xq]g xr[ r[x> ]xr ", -"yx]r z z& zD zc z1 z: z1D z:c zM zM& zV zVc zl zl: zlV uz z* z- z*D zc- z*1", -" z:- 1Dz* :cz- z*M z-M zV* zV- zl* zl- l*zV uz- zG zG& zJ zJc z1G z:G zJ1 z", -"J: zGM GMz& zJV cJzV zlG l:zG zlJ uzJ zf zf- zJf iz zf1 z:f Jfz1 iz: zfM f-", -"zM zVf izV zlf lfz: lfzJ uzi z4 z4& z4D zc4 z7 z7: z7D z7c z4M 4Mz& zV4 c4z", -"V zl7 l:z7 z7V uz7 z= z-= z=D zc= z7= Az =Dz7 Azc z=M =Mz- zV= c=zV zl= Azl", -" l=zV Azu z4G 4Gz& zJ4 cJz4 z7G 7:zG zJ7 7Jz: 4GzM z4GM& J4zV zJVc4 lGz7 zl", -"7:G 7Jzl zJu7 zf= f-z= zJ= iz= z7f Azf 7Jzf Azi =Mzf zf-=M J=zV zVi= lfz7 z", -"lAf l=zJ uzAi zP zP& zDP zcP z1P z:P 1DzP :czP zS zS& zVS zcS zlS z:S SlzV ", -"uzS z*P z-P DPz* c-zP 1Pz* :-zP z*1DP z:c-P zS* z-S SVz* Scz- l*zS l-zS zlV", -"S* z-uS zY zY& zJY zYc zY1 zY: YJz1 Y:zJ zYS SYz& ]z ]zc zlY lYz: ]zl uz] z", -"Yf zY- YJzf izY Yfz1 Y:zf zJYf1 zYi: zfS Sfz- ]zf ]zi lYzf lYz- zl]f ]zui z", -"o zo& zoD zoc zo7 zo: 7ozD 7czo zoS Soz& zoV Sczo zr zr: zrV uzr zo= zo- =D", -"zo ocz- 7oz= Azo zo7=D zoAc z=S S-zo S=zV Scz= zr= Azr rVz= uzAr zoY Y&zo z", -"oJ Yczo z7Y Y:zo 7Jzo Ycz7 SozY zoYS& ]zo zo]c zrY rYz: ]zr ]zur zx zx- zxJ", -" izx zx7 Azx xJz7 izAx zxS x-zS ]zx iz]x zxr zxAr zx]r | ", -NULL -}; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Prepares the data for MSOPs of 4-variable functions.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_ReadMsops( char ** ppSopSizes, char *** ppSops ) -{ - unsigned uMasks[4][2] = { - { 0x5555, 0xAAAA }, - { 0x3333, 0xCCCC }, - { 0x0F0F, 0xF0F0 }, - { 0x00FF, 0xFF00 } - }; - char Map[256], * pPrev, * pMemory; - char * pSopSizes, ** pSops; - int i, k, b, Size; - - // map chars into their numbers - for ( i = 0; i < 256; i++ ) - Map[i] = -1; - for ( i = 0; i < 81; i++ ) - Map[s_Data3[i]] = i; - - // count the number of strings - for ( Size = 0; s_Data4[Size] && Size < 100000; Size++ ); - assert( Size < 100000 ); - - // allocate memory - pMemory = ALLOC( char, Size * 75 ); - // copy the array into memory - for ( i = 0; i < Size; i++ ) - for ( k = 0; k < 75; k++ ) - if ( s_Data4[i][k] == ' ' ) - pMemory[i*75+k] = -1; - else - pMemory[i*75+k] = Map[s_Data4[i][k]]; - - // set pointers and compute SOP sizes - pSopSizes = ALLOC( char, 65536 ); - pSops = ALLOC( char *, 65536 ); - pSopSizes[0] = 0; - pSops[0] = NULL; - pPrev = pMemory; - for ( k = 0, i = 1; i < 65536; k++ ) - if ( pMemory[k] == -1 ) - { - pSopSizes[i] = pMemory + k - pPrev; - pSops[i++] = pPrev; - pPrev = pMemory + k + 1; - } - *ppSopSizes = pSopSizes; - *ppSops = pSops; - - // verify the results - derive truth table from SOP - for ( i = 1; i < 65536; i++ ) - { - int uTruth = 0, uCube, Lit; - for ( k = 0; k < pSopSizes[i]; k++ ) - { - uCube = 0xFFFF; - Lit = pSops[i][k]; - for ( b = 3; b >= 0; b-- ) - { - if ( Lit % 3 == 0 ) - uCube &= uMasks[b][0]; - else if ( Lit % 3 == 1 ) - uCube &= uMasks[b][1]; - Lit = Lit / 3; - } - uTruth |= uCube; - } - assert( uTruth == i ); - } -} - -#if 0 - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManDeriveCnfTest() -{ - int i, k, Lit; - printf( "\n" ); - for ( i = 80; i >= 0; i-- ) - { - Lit = i; - for ( k = 0; k < 4; k++ ) - { - if ( Lit % 3 == 0 ) - printf( "%c", 'A' + k ); - else if ( Lit % 3 == 1 ) - printf( "%c", 'a' + k ); - Lit = Lit / 3; - } - printf( "\n" ); - } -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManDeriveCnfTest2() -{ - char s_Data3[81] = "!#&()*+,-.0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz|"; - - unsigned uMasks[4][2] = { - { 0x5555, 0xAAAA }, - { 0x3333, 0xCCCC }, - { 0x0F0F, 0xF0F0 }, - { 0x00FF, 0xFF00 } - }; - char Buffer[100], * pCur; - FILE * pFile; - int CountCur, Counter = 0, nLines = 0; - int pLines[1<<16] = {0}; - int pNums[1<<16] = {0}; - unsigned uTruth, uTruth2, uCube, cCube; - char * pSops[1<<16] = {0}; - char Sop[10]; - char Cube[4]; - int i, k; - - pFile = fopen( "cands2.txt", "r" ); - while ( fgets( Buffer, 100, pFile ) ) - { - if ( Buffer[0] == '0' ) - Extra_ReadHexadecimal( &uTruth2, Buffer+2, 4 ); - else - uTruth2 = 0xFFFFFF; - - // skip all chars till a-d or A-D - if ( Buffer[0] == '0' ) - for ( pCur = Buffer; *pCur != '\n'; pCur++ ) - { -// if ( *pCur >= 'a' && *pCur <= 'd' || *pCur >= 'A' && *pCur <= 'D' ) - if ( *pCur == ':' ) - { - pCur++; - break; - } - } - else - pCur = Buffer; - - - uTruth = 0; - CountCur = 0; - uCube = 0xFFFF; - for ( i = 0; i < 4; i++ ) - Cube[i] = 2; - - for ( ; *pCur; pCur++ ) - { - if ( *pCur == '+' || *pCur == '\n' ) - { - uTruth |= uCube; - uCube = 0xFFFF; - - // get the cube - cCube = 0; - for ( i = 0; i < 4; i++ ) - cCube = 3 * cCube + Cube[i]; - for ( i = 0; i < 4; i++ ) - Cube[i] = 2; - - assert( cCube >= 0 && cCube < 81 ); - Sop[CountCur] = cCube; - CountCur++; - if ( *pCur == '\n' ) - { - Sop[CountCur] = 0; - break; - } - } - else if ( *pCur >= 'a' && *pCur <= 'd' ) - { - uCube &= uMasks[*pCur-'a'][1]; - Cube[*pCur-'a'] = 1; - } - else if ( *pCur >= 'A' && *pCur <= 'D' ) - { - uCube &= uMasks[*pCur-'A'][0]; - Cube[*pCur-'A'] = 0; - } - } - assert( *pCur == '\n' ); - assert( uTruth2 == 0xFFFFFF || uTruth2 == uTruth ); - - Counter += CountCur; - pNums[uTruth] = CountCur; - pSops[uTruth] = ALLOC( char, CountCur ); - memcpy( pSops[uTruth], Sop, CountCur ); - pLines[nLines++] = Counter; - } - fclose( pFile ); - - printf( "Lines = %d. Counter = %d.\n", nLines, Counter ); - -/* - // write the number of cubes - for ( i = 0; i < 65536; i++ ) - printf( "%d,%d ", pNums[i], pNums[i] + pNums[0xffff & ~i] ); - printf( "\n" ); -*/ - - // write the number of cubes - Counter = 0; - for ( i = 1; i < 65536; i++ ) - { - CountCur = pNums[i]; - assert( CountCur > 0 ); - for ( k = 0; k <= CountCur; k++ ) - { - if ( k < CountCur ) - { - assert( pSops[i][k] >= 0 && pSops[i][k] < 81 ); - printf( "%c", s_Data3[pSops[i][k]] ); - } - else - printf( " " ); - if ( ++Counter == 75 ) - { - printf( "\",\n\"" ); - Counter = 0; - } - } - } - printf( "\n" ); - - return 1; -} - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfMan.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfMan.c deleted file mode 100644 index 0a6513601..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfMan.c +++ /dev/null @@ -1,203 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfMan.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfMan.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" -//#include "satSolver.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static inline int Cnf_Lit2Var( int Lit ) { return (Lit & 1)? -(Lit >> 1)-1 : (Lit >> 1)+1; } -static inline int Cnf_Lit2Var2( int Lit ) { return (Lit & 1)? -(Lit >> 1) : (Lit >> 1); } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Starts the fraiging manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Man_t * Cnf_ManStart() -{ - Cnf_Man_t * p; - int i; - // allocate the manager - p = ALLOC( Cnf_Man_t, 1 ); - memset( p, 0, sizeof(Cnf_Man_t) ); - // derive internal data structures - Cnf_ReadMsops( &p->pSopSizes, &p->pSops ); - // allocate memory manager for cuts - p->pMemCuts = Aig_MmFlexStart(); - p->nMergeLimit = 10; - // allocate temporary truth tables - p->pTruths[0] = ALLOC( unsigned, 4 * Aig_TruthWordNum(p->nMergeLimit) ); - for ( i = 1; i < 4; i++ ) - p->pTruths[i] = p->pTruths[i-1] + Aig_TruthWordNum(p->nMergeLimit); - p->vMemory = Vec_IntAlloc( 1 << 18 ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the fraiging manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_ManStop( Cnf_Man_t * p ) -{ - Vec_IntFree( p->vMemory ); - free( p->pTruths[0] ); - Aig_MmFlexStop( p->pMemCuts, 0 ); - free( p->pSopSizes ); - free( p->pSops[1] ); - free( p->pSops ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Returns the array of CI IDs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Cnf_DataCollectPiSatNums( Cnf_Dat_t * pCnf, Aig_Man_t * p ) -{ - Vec_Int_t * vCiIds; - Aig_Obj_t * pObj; - int i; - vCiIds = Vec_IntAlloc( Aig_ManPiNum(p) ); - Aig_ManForEachPi( p, pObj, i ) - Vec_IntPush( vCiIds, pCnf->pVarNums[pObj->Id] ); - return vCiIds; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_DataFree( Cnf_Dat_t * p ) -{ - if ( p == NULL ) - return; - free( p->pClauses[0] ); - free( p->pClauses ); - free( p->pVarNums ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Writes CNF into a file.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_DataWriteIntoFile( Cnf_Dat_t * p, char * pFileName, int fReadable ) -{ - FILE * pFile; - int * pLit, * pStop, i; - pFile = fopen( pFileName, "w" ); - if ( pFile == NULL ) - { - printf( "Cnf_WriteIntoFile(): Output file cannot be opened.\n" ); - return; - } - fprintf( pFile, "c Result of efficient AIG-to-CNF conversion using package CNF\n" ); - fprintf( pFile, "p cnf %d %d\n", p->nVars, p->nClauses ); - for ( i = 0; i < p->nClauses; i++ ) - { - for ( pLit = p->pClauses[i], pStop = p->pClauses[i+1]; pLit < pStop; pLit++ ) - fprintf( pFile, "%d ", fReadable? Cnf_Lit2Var2(*pLit) : Cnf_Lit2Var(*pLit) ); - fprintf( pFile, "0\n" ); - } - fprintf( pFile, "\n" ); - fclose( pFile ); -} - -/**Function************************************************************* - - Synopsis [Writes CNF into a file.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -#if 0 -void * Cnf_DataWriteIntoSolver( Cnf_Dat_t * p ) -{ - sat_solver * pSat; - int i, status; - pSat = sat_solver_new(); - sat_solver_setnvars( pSat, p->nVars ); - for ( i = 0; i < p->nClauses; i++ ) - { - if ( !sat_solver_addclause( pSat, p->pClauses[i], p->pClauses[i+1] ) ) - { - sat_solver_delete( pSat ); - return NULL; - } - } - status = sat_solver_simplify(pSat); - if ( status == 0 ) - { - sat_solver_delete( pSat ); - return NULL; - } - return pSat; -} -#endif -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfMap.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfMap.c deleted file mode 100644 index 3a41f7ece..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfMap.c +++ /dev/null @@ -1,360 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfMap.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfMap.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Computes area flow of the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutAssignAreaFlow( Cnf_Man_t * p, Dar_Cut_t * pCut, int * pAreaFlows ) -{ - Aig_Obj_t * pLeaf; - int i; - pCut->Value = 0; - pCut->uSign = 100 * Cnf_CutSopCost( p, pCut ); - Dar_CutForEachLeaf( p->pManAig, pCut, pLeaf, i ) - { - pCut->Value += pLeaf->nRefs; - if ( !Aig_ObjIsNode(pLeaf) ) - continue; - assert( pLeaf->nRefs > 0 ); - pCut->uSign += pAreaFlows[pLeaf->Id] / (pLeaf->nRefs? pLeaf->nRefs : 1); - } -} - -/**Function************************************************************* - - Synopsis [Computes area flow of the supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cnf_CutSuperAreaFlow( Vec_Ptr_t * vSuper, int * pAreaFlows ) -{ - Aig_Obj_t * pLeaf; - int i, nAreaFlow; - nAreaFlow = 100 * (Vec_PtrSize(vSuper) + 1); - Vec_PtrForEachEntry( vSuper, pLeaf, i ) - { - pLeaf = Aig_Regular(pLeaf); - if ( !Aig_ObjIsNode(pLeaf) ) - continue; - assert( pLeaf->nRefs > 0 ); - nAreaFlow += pAreaFlows[pLeaf->Id] / (pLeaf->nRefs? pLeaf->nRefs : 1); - } - return nAreaFlow; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_DeriveMapping( Cnf_Man_t * p ) -{ - Vec_Ptr_t * vSuper; - Aig_Obj_t * pObj; - Dar_Cut_t * pCut, * pCutBest; - int i, k, AreaFlow, * pAreaFlows; - // allocate area flows - pAreaFlows = ALLOC( int, Aig_ManObjNumMax(p->pManAig) ); - memset( pAreaFlows, 0, sizeof(int) * Aig_ManObjNumMax(p->pManAig) ); - // visit the nodes in the topological order and update their best cuts - vSuper = Vec_PtrAlloc( 100 ); - Aig_ManForEachNode( p->pManAig, pObj, i ) - { - // go through the cuts - pCutBest = NULL; - Dar_ObjForEachCut( pObj, pCut, k ) - { - pCut->fBest = 0; - if ( k == 0 ) - continue; - Cnf_CutAssignAreaFlow( p, pCut, pAreaFlows ); - if ( pCutBest == NULL || pCutBest->uSign > pCut->uSign || - (pCutBest->uSign == pCut->uSign && pCutBest->Value < pCut->Value) ) - pCutBest = pCut; - } - // check the big cut -// Aig_ObjCollectSuper( pObj, vSuper ); - // get the area flow of this cut -// AreaFlow = Cnf_CutSuperAreaFlow( vSuper, pAreaFlows ); - - // Trevor: Always set the best one with fBest. - // otherwise CNF generation fails. Wrote to Alan - // seeking confirmation this was not dangerous. - AreaFlow = AIG_INFINITY; - if (1 || AreaFlow >= (int)pCutBest->uSign ) - { - pAreaFlows[pObj->Id] = pCutBest->uSign; - pCutBest->fBest = 1; - } - else - { - pAreaFlows[pObj->Id] = AreaFlow; - pObj->fMarkB = 1; // mark the special node - } - } - Vec_PtrFree( vSuper ); - free( pAreaFlows ); - -/* - // compute the area of mapping - AreaFlow = 0; - Aig_ManForEachPo( p->pManAig, pObj, i ) - AreaFlow += Dar_ObjBestCut(Aig_ObjFanin0(pObj))->uSign / 100 / Aig_ObjFanin0(pObj)->nRefs; - printf( "Area of the network = %d.\n", AreaFlow ); -*/ -} - - - -#if 0 - -/**Function************************************************************* - - Synopsis [Computes area of the first level.] - - Description [The cut need to be derefed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_CutDeref( Aig_Man_t * p, Dar_Cut_t * pCut ) -{ - Aig_Obj_t * pLeaf; - int i; - Dar_CutForEachLeaf( p, pCut, pLeaf, i ) - { - assert( pLeaf->nRefs > 0 ); - if ( --pLeaf->nRefs > 0 || !Aig_ObjIsAnd(pLeaf) ) - continue; - Aig_CutDeref( p, Aig_ObjBestCut(pLeaf) ); - } -} - -/**Function************************************************************* - - Synopsis [Computes area of the first level.] - - Description [The cut need to be derefed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_CutRef( Aig_Man_t * p, Dar_Cut_t * pCut ) -{ - Aig_Obj_t * pLeaf; - int i, Area = pCut->Value; - Dar_CutForEachLeaf( p, pCut, pLeaf, i ) - { - assert( pLeaf->nRefs >= 0 ); - if ( pLeaf->nRefs++ > 0 || !Aig_ObjIsAnd(pLeaf) ) - continue; - Area += Aig_CutRef( p, Aig_ObjBestCut(pLeaf) ); - } - return Area; -} - -/**Function************************************************************* - - Synopsis [Computes exact area of the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cnf_CutArea( Aig_Man_t * p, Dar_Cut_t * pCut ) -{ - int Area; - Area = Aig_CutRef( p, pCut ); - Aig_CutDeref( p, pCut ); - return Area; -} - -/**Function************************************************************* - - Synopsis [Returns 1 if the second cut is better.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Cnf_CutCompare( Dar_Cut_t * pC0, Dar_Cut_t * pC1 ) -{ - if ( pC0->Area < pC1->Area - 0.0001 ) - return -1; - if ( pC0->Area > pC1->Area + 0.0001 ) // smaller area flow is better - return 1; -// if ( pC0->NoRefs < pC1->NoRefs ) -// return -1; -// if ( pC0->NoRefs > pC1->NoRefs ) // fewer non-referenced fanins is better -// return 1; -// if ( pC0->FanRefs / pC0->nLeaves > pC1->FanRefs / pC1->nLeaves ) -// return -1; -// if ( pC0->FanRefs / pC0->nLeaves < pC1->FanRefs / pC1->nLeaves ) -// return 1; // larger average fanin ref-counter is better -// return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Returns the cut with the smallest area flow.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dar_Cut_t * Cnf_ObjFindBestCut( Aig_Obj_t * pObj ) -{ - Dar_Cut_t * pCut, * pCutBest; - int i; - pCutBest = NULL; - Dar_ObjForEachCut( pObj, pCut, i ) - if ( pCutBest == NULL || Cnf_CutCompare(pCutBest, pCut) == 1 ) - pCutBest = pCut; - return pCutBest; -} - -/**Function************************************************************* - - Synopsis [Computes area flow of the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_CutAssignArea( Cnf_Man_t * p, Dar_Cut_t * pCut ) -{ - Aig_Obj_t * pLeaf; - int i; - pCut->Area = (float)pCut->Cost; - pCut->NoRefs = 0; - pCut->FanRefs = 0; - Dar_CutForEachLeaf( p->pManAig, pCut, pLeaf, i ) - { - if ( !Aig_ObjIsNode(pLeaf) ) - continue; - if ( pLeaf->nRefs == 0 ) - { - pCut->Area += Aig_ObjBestCut(pLeaf)->Cost; - pCut->NoRefs++; - } - else - { - if ( pCut->FanRefs + pLeaf->nRefs > 15 ) - pCut->FanRefs = 15; - else - pCut->FanRefs += pLeaf->nRefs; - } - } -} - -/**Function************************************************************* - - Synopsis [Performs one round of "area recovery" using exact local area.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cnf_ManMapForCnf( Cnf_Man_t * p ) -{ - Aig_Obj_t * pObj; - Dar_Cut_t * pCut, * pCutBest; - int i, k; - // visit the nodes in the topological order and update their best cuts - Aig_ManForEachNode( p->pManAig, pObj, i ) - { - // find the old best cut - pCutBest = Aig_ObjBestCut(pObj); - Dar_ObjClearBestCut(pCutBest); - // if the node is used, dereference its cut - if ( pObj->nRefs ) - Aig_CutDeref( p->pManAig, pCutBest ); - - // evaluate the cuts of this node - Dar_ObjForEachCut( pObj, pCut, k ) -// Cnf_CutAssignAreaFlow( p, pCut ); - pCut->Area = (float)Cnf_CutArea( p->pManAig, pCut ); - - // find the new best cut - pCutBest = Cnf_ObjFindBestCut(pObj); - Dar_ObjSetBestCut( pCutBest ); - // if the node is used, reference its cut - if ( pObj->nRefs ) - Aig_CutRef( p->pManAig, pCutBest ); - } - return 1; -} - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfPost.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfPost.c deleted file mode 100644 index 5b18da487..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfPost.c +++ /dev/null @@ -1,235 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfPost.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfPost.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_ManPostprocess_old( Cnf_Man_t * p ) -{ -// extern int Aig_ManLargeCutEval( Aig_Man_t * p, Aig_Obj_t * pRoot, Dar_Cut_t * pCutR, Dar_Cut_t * pCutL, int Leaf ); - int nNew, Gain, nGain = 0, nVars = 0; - - Aig_Obj_t * pObj, * pFan; - Dar_Cut_t * pCutBest, * pCut; - int i, k;//, a, b, Counter; - Aig_ManForEachObj( p->pManAig, pObj, i ) - { - if ( !Aig_ObjIsNode(pObj) ) - continue; - if ( pObj->nRefs == 0 ) - continue; -// pCutBest = Aig_ObjBestCut(pObj); - pCutBest = NULL; - - Dar_CutForEachLeaf( p->pManAig, pCutBest, pFan, k ) - { - if ( !Aig_ObjIsNode(pFan) ) - continue; - assert( pFan->nRefs != 0 ); - if ( pFan->nRefs != 1 ) - continue; -// pCut = Aig_ObjBestCut(pFan); - pCut = NULL; -/* - // find how many common variable they have - Counter = 0; - for ( a = 0; a < (int)pCut->nLeaves; a++ ) - { - for ( b = 0; b < (int)pCutBest->nLeaves; b++ ) - if ( pCut->pLeaves[a] == pCutBest->pLeaves[b] ) - break; - if ( b == (int)pCutBest->nLeaves ) - continue; - Counter++; - } - printf( "%d ", Counter ); -*/ - // find the new truth table after collapsing these two cuts - - -// nNew = Aig_ManLargeCutEval( p->pManAig, pObj, pCutBest, pCut, pFan->Id ); - nNew = 0; - - -// printf( "%d+%d=%d:%d(%d) ", pCutBest->Cost, pCut->Cost, -// pCutBest->Cost+pCut->Cost, nNew, pCutBest->Cost+pCut->Cost-nNew ); - - Gain = pCutBest->Value + pCut->Value - nNew; - if ( Gain > 0 ) - { - nGain += Gain; - nVars++; - } - } - } - printf( "Total gain = %d. Vars = %d.\n", nGain, nVars ); -} - -/**Function************************************************************* - - Synopsis [Transfers cuts of the mapped nodes into internal representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_ManTransferCuts( Cnf_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_MmFlexRestart( p->pMemCuts ); - Aig_ManForEachObj( p->pManAig, pObj, i ) - { - if ( Aig_ObjIsNode(pObj) && pObj->nRefs > 0 ) - pObj->pData = Cnf_CutCreate( p, pObj ); - else - pObj->pData = NULL; - } -} - -/**Function************************************************************* - - Synopsis [Transfers cuts of the mapped nodes into internal representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_ManFreeCuts( Cnf_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManForEachObj( p->pManAig, pObj, i ) - if ( pObj->pData ) - { - Cnf_CutFree( pObj->pData ); - pObj->pData = NULL; - } -} - -#if 0 -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_ManPostprocess( Cnf_Man_t * p ) -{ - Cnf_Cut_t * pCut, * pCutFan, * pCutRes; - Aig_Obj_t * pObj, * pFan; - int Order[16], Costs[16]; - int i, k, fChanges; - Aig_ManForEachNode( p->pManAig, pObj, i ) - { - if ( pObj->nRefs == 0 ) - continue; - pCut = Cnf_ObjBestCut(pObj); - - // sort fanins according to their size - Cnf_CutForEachLeaf( p->pManAig, pCut, pFan, k ) - { - Order[k] = k; - Costs[k] = Aig_ObjIsNode(pFan)? Cnf_ObjBestCut(pFan)->Cost : 0; - } - // sort the cuts by Weight - do { - int Temp; - fChanges = 0; - for ( k = 0; k < pCut->nFanins - 1; k++ ) - { - if ( Costs[Order[k]] <= Costs[Order[k+1]] ) - continue; - Temp = Order[k]; - Order[k] = Order[k+1]; - Order[k+1] = Temp; - fChanges = 1; - } - } while ( fChanges ); - - -// Cnf_CutForEachLeaf( p->pManAig, pCut, pFan, k ) - for ( k = 0; (k < (int)(pCut)->nFanins) && ((pFan) = Aig_ManObj(p->pManAig, (pCut)->pFanins[Order[k]])); k++ ) - { - if ( !Aig_ObjIsNode(pFan) ) - continue; - assert( pFan->nRefs != 0 ); - if ( pFan->nRefs != 1 ) - continue; - pCutFan = Cnf_ObjBestCut(pFan); - // try composing these two cuts -// Cnf_CutPrint( pCut ); - pCutRes = Cnf_CutCompose( p, pCut, pCutFan, pFan->Id ); -// Cnf_CutPrint( pCut ); -// printf( "\n" ); - // check if the cost if reduced - if ( pCutRes == NULL || pCutRes->Cost == 127 || pCutRes->Cost > pCut->Cost + pCutFan->Cost ) - { - if ( pCutRes ) - Cnf_CutFree( pCutRes ); - continue; - } - // update the cut - Cnf_ObjSetBestCut( pObj, pCutRes ); - Cnf_ObjSetBestCut( pFan, NULL ); - Cnf_CutUpdateRefs( p, pCut, pCutFan, pCutRes ); - assert( pFan->nRefs == 0 ); - Cnf_CutFree( pCut ); - Cnf_CutFree( pCutFan ); - break; - } - } -} -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfUtil.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfUtil.c deleted file mode 100644 index 63991e709..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfUtil.c +++ /dev/null @@ -1,188 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfUtil.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfUtil.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Computes area, references, and nodes used in the mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_ManScanMapping_rec( Cnf_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vMapped ) -{ - Aig_Obj_t * pLeaf; - Dar_Cut_t * pCutBest; - int aArea, i; - if ( pObj->nRefs++ || Aig_ObjIsPi(pObj) || Aig_ObjIsConst1(pObj) ) - return 0; - assert( Aig_ObjIsAnd(pObj) ); - // collect the node first to derive pre-order - if ( vMapped ) - Vec_PtrPush( vMapped, pObj ); - // visit the transitive fanin of the selected cut - if ( pObj->fMarkB ) - { - Vec_Ptr_t * vSuper = Vec_PtrAlloc( 100 ); - Aig_ObjCollectSuper( pObj, vSuper ); - aArea = Vec_PtrSize(vSuper) + 1; - Vec_PtrForEachEntry( vSuper, pLeaf, i ) - aArea += Aig_ManScanMapping_rec( p, Aig_Regular(pLeaf), vMapped ); - Vec_PtrFree( vSuper ); - //////////////////////////// - pObj->fMarkB = 1; - } - else - { - pCutBest = Dar_ObjBestCut( pObj ); - aArea = Cnf_CutSopCost( p, pCutBest ); - Dar_CutForEachLeaf( p->pManAig, pCutBest, pLeaf, i ) - aArea += Aig_ManScanMapping_rec( p, pLeaf, vMapped ); - } - return aArea; -} - -/**Function************************************************************* - - Synopsis [Computes area, references, and nodes used in the mapping.] - - Description [Collects the nodes in reverse topological order.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Aig_ManScanMapping( Cnf_Man_t * p, int fCollect ) -{ - Vec_Ptr_t * vMapped = NULL; - Aig_Obj_t * pObj; - int i; - // clean all references - Aig_ManForEachObj( p->pManAig, pObj, i ) - pObj->nRefs = 0; - // allocate the array - if ( fCollect ) - vMapped = Vec_PtrAlloc( 1000 ); - // collect nodes reachable from POs in the DFS order through the best cuts - p->aArea = 0; - Aig_ManForEachPo( p->pManAig, pObj, i ) - p->aArea += Aig_ManScanMapping_rec( p, Aig_ObjFanin0(pObj), vMapped ); -// printf( "Variables = %6d. Clauses = %8d.\n", vMapped? Vec_PtrSize(vMapped) + Aig_ManPiNum(p->pManAig) + 1 : 0, p->aArea + 2 ); - return vMapped; -} - -/**Function************************************************************* - - Synopsis [Computes area, references, and nodes used in the mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cnf_ManScanMapping_rec( Cnf_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vMapped, int fPreorder ) -{ - Aig_Obj_t * pLeaf; - Cnf_Cut_t * pCutBest; - int aArea, i; - if ( pObj->nRefs++ || Aig_ObjIsPi(pObj) || Aig_ObjIsConst1(pObj) ) - return 0; - assert( Aig_ObjIsAnd(pObj) ); - assert( pObj->pData != NULL ); - // add the node to the mapping - if ( vMapped && fPreorder ) - Vec_PtrPush( vMapped, pObj ); - // visit the transitive fanin of the selected cut - if ( pObj->fMarkB ) - { - Vec_Ptr_t * vSuper = Vec_PtrAlloc( 100 ); - Aig_ObjCollectSuper( pObj, vSuper ); - aArea = Vec_PtrSize(vSuper) + 1; - Vec_PtrForEachEntry( vSuper, pLeaf, i ) - aArea += Cnf_ManScanMapping_rec( p, Aig_Regular(pLeaf), vMapped, fPreorder ); - Vec_PtrFree( vSuper ); - //////////////////////////// - pObj->fMarkB = 1; - } - else - { - pCutBest = pObj->pData; - assert( pCutBest->Cost < 127 ); - aArea = pCutBest->Cost; - Cnf_CutForEachLeaf( p->pManAig, pCutBest, pLeaf, i ) - aArea += Cnf_ManScanMapping_rec( p, pLeaf, vMapped, fPreorder ); - } - // add the node to the mapping - if ( vMapped && !fPreorder ) - Vec_PtrPush( vMapped, pObj ); - return aArea; -} - -/**Function************************************************************* - - Synopsis [Computes area, references, and nodes used in the mapping.] - - Description [Collects the nodes in reverse topological order.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Cnf_ManScanMapping( Cnf_Man_t * p, int fCollect, int fPreorder ) -{ - Vec_Ptr_t * vMapped = NULL; - Aig_Obj_t * pObj; - int i; - // clean all references - Aig_ManForEachObj( p->pManAig, pObj, i ) - pObj->nRefs = 0; - // allocate the array - if ( fCollect ) - vMapped = Vec_PtrAlloc( 1000 ); - // collect nodes reachable from POs in the DFS order through the best cuts - p->aArea = 0; - Aig_ManForEachPo( p->pManAig, pObj, i ) - p->aArea += Cnf_ManScanMapping_rec( p, Aig_ObjFanin0(pObj), vMapped, fPreorder ); -// printf( "Variables = %6d. Clauses = %8d.\n", vMapped? Vec_PtrSize(vMapped) + Aig_ManPiNum(p->pManAig) + 1 : 0, p->aArea + 2 ); - return vMapped; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfWrite.c b/src/vendor/stp/src/extlib-abc/aig/cnf/cnfWrite.c deleted file mode 100644 index da2e7c096..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/cnf/cnfWrite.c +++ /dev/null @@ -1,534 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnfWrite.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [AIG-to-CNF conversion.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnfWrite.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cnf.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Writes the cover into the array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cnf_SopConvertToVector( char * pSop, int nCubes, Vec_Int_t * vCover ) -{ - int Lits[4], Cube, iCube, i, b; - Vec_IntClear( vCover ); - for ( i = 0; i < nCubes; i++ ) - { - Cube = pSop[i]; - for ( b = 0; b < 4; b++ ) - { - if ( Cube % 3 == 0 ) - Lits[b] = 1; - else if ( Cube % 3 == 1 ) - Lits[b] = 2; - else - Lits[b] = 0; - Cube = Cube / 3; - } - iCube = 0; - for ( b = 0; b < 4; b++ ) - iCube = (iCube << 2) | Lits[b]; - Vec_IntPush( vCover, iCube ); - } -} - -/**Function************************************************************* - - Synopsis [Returns the number of literals in the SOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cnf_SopCountLiterals( char * pSop, int nCubes ) -{ - int nLits = 0, Cube, i, b; - for ( i = 0; i < nCubes; i++ ) - { - Cube = pSop[i]; - for ( b = 0; b < 4; b++ ) - { - if ( Cube % 3 != 2 ) - nLits++; - Cube = Cube / 3; - } - } - return nLits; -} - -/**Function************************************************************* - - Synopsis [Returns the number of literals in the SOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cnf_IsopCountLiterals( Vec_Int_t * vIsop, int nVars ) -{ - int nLits = 0, Cube, i, b; - Vec_IntForEachEntry( vIsop, Cube, i ) - { - for ( b = 0; b < nVars; b++ ) - { - if ( (Cube & 3) == 1 || (Cube & 3) == 2 ) - nLits++; - Cube >>= 2; - } - } - return nLits; -} - -/**Function************************************************************* - - Synopsis [Writes the cube and returns the number of literals in it.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cnf_IsopWriteCube( int Cube, int nVars, int * pVars, int * pLiterals ) -{ - int nLits = nVars, b; - for ( b = 0; b < nVars; b++ ) - { - if ( (Cube & 3) == 1 ) // value 0 --> write positive literal - *pLiterals++ = 2 * pVars[b]; - else if ( (Cube & 3) == 2 ) // value 1 --> write negative literal - *pLiterals++ = 2 * pVars[b] + 1; - else - nLits--; - Cube >>= 2; - } - return nLits; -} - -/**Function************************************************************* - - Synopsis [Derives CNF for the mapping.] - - Description [The last argument shows the number of last outputs - of the manager, which will not be converted into clauses but the - new variables for which will be introduced.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped, int nOutputs ) -{ - Aig_Obj_t * pObj; - Cnf_Dat_t * pCnf; - Cnf_Cut_t * pCut; - Vec_Int_t * vCover, * vSopTemp; - int OutVar, PoVar, pVars[32], * pLits, ** pClas; - unsigned uTruth; - int i, k, nLiterals, nClauses, Cube, Number; - - // count the number of literals and clauses - nLiterals = 1 + Aig_ManPoNum( p->pManAig ) + 3 * nOutputs; - nClauses = 1 + Aig_ManPoNum( p->pManAig ) + nOutputs; - Vec_PtrForEachEntry( vMapped, pObj, i ) - { - assert( Aig_ObjIsNode(pObj) ); - pCut = Cnf_ObjBestCut( pObj ); - - // positive polarity of the cut - if ( pCut->nFanins < 5 ) - { - uTruth = 0xFFFF & *Cnf_CutTruth(pCut); - nLiterals += Cnf_SopCountLiterals( p->pSops[uTruth], p->pSopSizes[uTruth] ) + p->pSopSizes[uTruth]; - assert( p->pSopSizes[uTruth] >= 0 ); - nClauses += p->pSopSizes[uTruth]; - } - else - { - nLiterals += Cnf_IsopCountLiterals( pCut->vIsop[1], pCut->nFanins ) + Vec_IntSize(pCut->vIsop[1]); - nClauses += Vec_IntSize(pCut->vIsop[1]); - } - // negative polarity of the cut - if ( pCut->nFanins < 5 ) - { - uTruth = 0xFFFF & ~*Cnf_CutTruth(pCut); - nLiterals += Cnf_SopCountLiterals( p->pSops[uTruth], p->pSopSizes[uTruth] ) + p->pSopSizes[uTruth]; - assert( p->pSopSizes[uTruth] >= 0 ); - nClauses += p->pSopSizes[uTruth]; - } - else - { - nLiterals += Cnf_IsopCountLiterals( pCut->vIsop[0], pCut->nFanins ) + Vec_IntSize(pCut->vIsop[0]); - nClauses += Vec_IntSize(pCut->vIsop[0]); - } -//printf( "%d ", nClauses-(1 + Aig_ManPoNum( p->pManAig )) ); - } -//printf( "\n" ); - - // allocate CNF - pCnf = ALLOC( Cnf_Dat_t, 1 ); - memset( pCnf, 0, sizeof(Cnf_Dat_t) ); - pCnf->nLiterals = nLiterals; - pCnf->nClauses = nClauses; - pCnf->pClauses = ALLOC( int *, nClauses + 1 ); - pCnf->pClauses[0] = ALLOC( int, nLiterals ); - pCnf->pClauses[nClauses] = pCnf->pClauses[0] + nLiterals; - - // create room for variable numbers - pCnf->pVarNums = ALLOC( int, Aig_ManObjNumMax(p->pManAig) ); - memset( pCnf->pVarNums, 0xff, sizeof(int) * Aig_ManObjNumMax(p->pManAig) ); - // assign variables to the last (nOutputs) POs - Number = 1; - if ( nOutputs ) - { - assert( nOutputs == Aig_ManRegNum(p->pManAig) ); - Aig_ManForEachLiSeq( p->pManAig, pObj, i ) - pCnf->pVarNums[pObj->Id] = Number++; - } - // assign variables to the internal nodes - Vec_PtrForEachEntry( vMapped, pObj, i ) - pCnf->pVarNums[pObj->Id] = Number++; - // assign variables to the PIs and constant node - Aig_ManForEachPi( p->pManAig, pObj, i ) - pCnf->pVarNums[pObj->Id] = Number++; - pCnf->pVarNums[Aig_ManConst1(p->pManAig)->Id] = Number++; - pCnf->nVars = Number; - - // assign the clauses - vSopTemp = Vec_IntAlloc( 1 << 16 ); - pLits = pCnf->pClauses[0]; - pClas = pCnf->pClauses; - Vec_PtrForEachEntry( vMapped, pObj, i ) - { - pCut = Cnf_ObjBestCut( pObj ); - - // save variables of this cut - OutVar = pCnf->pVarNums[ pObj->Id ]; - for ( k = 0; k < (int)pCut->nFanins; k++ ) - { - pVars[k] = pCnf->pVarNums[ pCut->pFanins[k] ]; - assert( pVars[k] <= Aig_ManObjNumMax(p->pManAig) ); - } - - // positive polarity of the cut - if ( pCut->nFanins < 5 ) - { - uTruth = 0xFFFF & *Cnf_CutTruth(pCut); - Cnf_SopConvertToVector( p->pSops[uTruth], p->pSopSizes[uTruth], vSopTemp ); - vCover = vSopTemp; - } - else - vCover = pCut->vIsop[1]; - Vec_IntForEachEntry( vCover, Cube, k ) - { - *pClas++ = pLits; - *pLits++ = 2 * OutVar; - pLits += Cnf_IsopWriteCube( Cube, pCut->nFanins, pVars, pLits ); - } - - // negative polarity of the cut - if ( pCut->nFanins < 5 ) - { - uTruth = 0xFFFF & ~*Cnf_CutTruth(pCut); - Cnf_SopConvertToVector( p->pSops[uTruth], p->pSopSizes[uTruth], vSopTemp ); - vCover = vSopTemp; - } - else - vCover = pCut->vIsop[0]; - Vec_IntForEachEntry( vCover, Cube, k ) - { - *pClas++ = pLits; - *pLits++ = 2 * OutVar + 1; - pLits += Cnf_IsopWriteCube( Cube, pCut->nFanins, pVars, pLits ); - } - } - Vec_IntFree( vSopTemp ); - - // write the constant literal - OutVar = pCnf->pVarNums[ Aig_ManConst1(p->pManAig)->Id ]; - assert( OutVar <= Aig_ManObjNumMax(p->pManAig) ); - *pClas++ = pLits; - *pLits++ = 2 * OutVar; - - // write the output literals - Aig_ManForEachPo( p->pManAig, pObj, i ) - { - OutVar = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ]; - if ( i < Aig_ManPoNum(p->pManAig) - nOutputs ) - { - *pClas++ = pLits; - *pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj); - } - else - { - PoVar = pCnf->pVarNums[ pObj->Id ]; - // first clause - *pClas++ = pLits; - *pLits++ = 2 * PoVar; - *pLits++ = 2 * OutVar + !Aig_ObjFaninC0(pObj); - // second clause - *pClas++ = pLits; - *pLits++ = 2 * PoVar + 1; - *pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj); - } - } - - // verify that the correct number of literals and clauses was written - assert( pLits - pCnf->pClauses[0] == nLiterals ); - assert( pClas - pCnf->pClauses == nClauses ); - return pCnf; -} - -// Create a new partial CNF with just the extra bits versus the old CNF. -// This uses the Tseitin transform of Cnf_DeriveSimple -// NB. We assume there will only be one more PO than last time. -Cnf_Dat_t * Cnf_DeriveSimple_Additional( Aig_Man_t * p, Cnf_Dat_t * old ) -{ - Aig_Obj_t * pObj; - Cnf_Dat_t * pCnf; - int OutVar, pVars[32], * pLits, ** pClas; - int i, nLiterals, nClauses; - - // calculate the worst case number of literals and clauses - nLiterals = 1 + 7 * Aig_ManNodeNum(p) + Aig_ManPoNum( p ); - nClauses = 1 + 3 * Aig_ManNodeNum(p) + Aig_ManPoNum( p ); - - // allocate CNF - pCnf = ALLOC( Cnf_Dat_t, 1 ); - memset( pCnf, 0, sizeof(Cnf_Dat_t) ); - pCnf->pClauses = ALLOC( int *, nClauses + 1 ); - pCnf->pClauses[0] = ALLOC( int, nLiterals ); - - // create room for variable numbers - pCnf->pVarNums = ALLOC( int, Aig_ManObjNumMax(p) ); - memset( pCnf->pVarNums, 0xff, sizeof(int) * Aig_ManObjNumMax(p) ); - - // This is the index of the highest CNF variable number. - //printf("Old number of vars: %d\n", old->nVars); - - //Copy over the prior allocation of variables to the new variables - memcpy(pCnf->pVarNums, old->pVarNums, sizeof(int) * old->nVars); - - assert (pCnf->pVarNums[Aig_ManConst1(p)->Id] !=-1); - int Number = old->nVars+1; - - // assign variables to the PIs - int newPI = 0; - Aig_ManForEachPi( p, pObj, i ) - if (pCnf->pVarNums[pObj->Id] == -1) // new! - pCnf->pVarNums[pObj->Id] = Number++; - - //printf("new PI Nodes: %d\n", Number - (old->nVars+1)); - - // assign the clauses - pLits = pCnf->pClauses[0]; - pClas = pCnf->pClauses; - Aig_ManForEachNode( p, pObj, i ) - { - OutVar = pCnf->pVarNums[ pObj->Id ]; - - if (pCnf->pVarNums[pObj->Id] == -1) - { - OutVar = Number++; - pCnf->pVarNums[pObj->Id] = OutVar; - } - else - { - // This skips over variables that have already been generated. - continue; - } - - pVars[0] = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ]; - pVars[1] = pCnf->pVarNums[ Aig_ObjFanin1(pObj)->Id ]; - - // positive phase - *pClas++ = pLits; - *pLits++ = 2 * OutVar; - *pLits++ = 2 * pVars[0] + !Aig_ObjFaninC0(pObj); - *pLits++ = 2 * pVars[1] + !Aig_ObjFaninC1(pObj); - // negative phase - *pClas++ = pLits; - *pLits++ = 2 * OutVar + 1; - *pLits++ = 2 * pVars[0] + Aig_ObjFaninC0(pObj); - *pClas++ = pLits; - *pLits++ = 2 * OutVar + 1; - *pLits++ = 2 * pVars[1] + Aig_ObjFaninC1(pObj); - } - - pCnf->nVars = Number; - //printf("New number of vars: %d\n", pCnf->nVars); - - // WE ASSUME THERE WILL ONLY BE ONE NEW PO. - pObj = Vec_PtrEntry(p->vPos, Vec_PtrSize(p->vPos)-1); - OutVar = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ]; - *pClas++ = pLits; - *pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj); - - pCnf->nClauses = pClas - pCnf->pClauses; - pCnf->pClauses[pCnf->nClauses] = pLits; - pCnf->nLiterals = -1; // not maintained. - - return pCnf; -} - -/**Function************************************************************* - - Synopsis [Derives a simple CNF for the AIG.] - - Description [The last argument shows the number of last outputs - of the manager, which will not be converted into clauses but the - new variables for which will be introduced.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cnf_Dat_t * Cnf_DeriveSimple( Aig_Man_t * p, int nOutputs ) -{ - Aig_Obj_t * pObj; - Cnf_Dat_t * pCnf; - int OutVar, PoVar, pVars[32], * pLits, ** pClas; - int i, nLiterals, nClauses, Number; - - // count the number of literals and clauses - nLiterals = 1 + 7 * Aig_ManNodeNum(p) + Aig_ManPoNum( p ) + 3 * nOutputs; - nClauses = 1 + 3 * Aig_ManNodeNum(p) + Aig_ManPoNum( p ) + nOutputs; - - // allocate CNF - pCnf = ALLOC( Cnf_Dat_t, 1 ); - memset( pCnf, 0, sizeof(Cnf_Dat_t) ); - pCnf->nLiterals = nLiterals; - pCnf->nClauses = nClauses; - pCnf->pClauses = ALLOC( int *, nClauses + 1 ); - pCnf->pClauses[0] = ALLOC( int, nLiterals ); - pCnf->pClauses[nClauses] = pCnf->pClauses[0] + nLiterals; - - // create room for variable numbers - pCnf->pVarNums = ALLOC( int, Aig_ManObjNumMax(p) ); - memset( pCnf->pVarNums, 0xff, sizeof(int) * Aig_ManObjNumMax(p) ); - // assign variables to the last (nOutputs) POs - Number = 1; - if ( nOutputs ) - { - assert( nOutputs == Aig_ManRegNum(p) ); - Aig_ManForEachLiSeq( p, pObj, i ) - pCnf->pVarNums[pObj->Id] = Number++; - } - // assign variables to the internal nodes - Aig_ManForEachNode( p, pObj, i ) - pCnf->pVarNums[pObj->Id] = Number++; - // assign variables to the PIs and constant node - Aig_ManForEachPi( p, pObj, i ) - pCnf->pVarNums[pObj->Id] = Number++; - pCnf->pVarNums[Aig_ManConst1(p)->Id] = Number++; - pCnf->nVars = Number; -/* - // print CNF numbers - printf( "SAT numbers of each node:\n" ); - Aig_ManForEachObj( p, pObj, i ) - printf( "%d=%d ", pObj->Id, pCnf->pVarNums[pObj->Id] ); - printf( "\n" ); -*/ - // assign the clauses - pLits = pCnf->pClauses[0]; - pClas = pCnf->pClauses; - Aig_ManForEachNode( p, pObj, i ) - { - OutVar = pCnf->pVarNums[ pObj->Id ]; - pVars[0] = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ]; - pVars[1] = pCnf->pVarNums[ Aig_ObjFanin1(pObj)->Id ]; - - // positive phase - *pClas++ = pLits; - *pLits++ = 2 * OutVar; - *pLits++ = 2 * pVars[0] + !Aig_ObjFaninC0(pObj); - *pLits++ = 2 * pVars[1] + !Aig_ObjFaninC1(pObj); - // negative phase - *pClas++ = pLits; - *pLits++ = 2 * OutVar + 1; - *pLits++ = 2 * pVars[0] + Aig_ObjFaninC0(pObj); - *pClas++ = pLits; - *pLits++ = 2 * OutVar + 1; - *pLits++ = 2 * pVars[1] + Aig_ObjFaninC1(pObj); - } - - // write the constant literal - OutVar = pCnf->pVarNums[ Aig_ManConst1(p)->Id ]; - assert( OutVar <= Aig_ManObjNumMax(p) ); - *pClas++ = pLits; - *pLits++ = 2 * OutVar; - - // write the output literals - Aig_ManForEachPo( p, pObj, i ) - { - OutVar = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ]; - if ( i < Aig_ManPoNum(p) - nOutputs ) - { - *pClas++ = pLits; - *pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj); - } - else - { - PoVar = pCnf->pVarNums[ pObj->Id ]; - // first clause - *pClas++ = pLits; - *pLits++ = 2 * PoVar; - *pLits++ = 2 * OutVar + !Aig_ObjFaninC0(pObj); - // second clause - *pClas++ = pLits; - *pLits++ = 2 * PoVar + 1; - *pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj); - } - } - - // verify that the correct number of literals and clauses was written - assert( pLits - pCnf->pClauses[0] == nLiterals ); - assert( pClas - pCnf->pClauses == nClauses ); - return pCnf; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darBalance.c b/src/vendor/stp/src/extlib-abc/aig/dar/darBalance.c deleted file mode 100644 index 0811ac8a4..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darBalance.c +++ /dev/null @@ -1,398 +0,0 @@ -/**CFile**************************************************************** - - FileName [darBalance.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Algebraic AIG balancing.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darBalance.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Aig_Obj_t * Dar_Balance_rec( Aig_Man_t * pNew, Aig_Obj_t * pObj, Vec_Vec_t * vStore, int Level, int fUpdateLevel ); -static Vec_Ptr_t * Dar_BalanceCone( Aig_Obj_t * pObj, Vec_Vec_t * vStore, int Level ); -static int Dar_BalanceFindLeft( Vec_Ptr_t * vSuper ); -static void Dar_BalancePermute( Aig_Man_t * p, Vec_Ptr_t * vSuper, int LeftBound, int fExor ); -static void Dar_BalancePushUniqueOrderByLevel( Vec_Ptr_t * vStore, Aig_Obj_t * pObj ); -static Aig_Obj_t * Dar_BalanceBuildSuper( Aig_Man_t * p, Vec_Ptr_t * vSuper, Aig_Type_t Type, int fUpdateLevel ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs algebraic balancing of the AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Dar_ManBalance( Aig_Man_t * p, int fUpdateLevel ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj, * pDriver, * pObjNew; - Vec_Vec_t * vStore; - int i; - // create the new manager - pNew = Aig_ManStart( Aig_ManObjNumMax(p) ); - pNew->pName = Aig_UtilStrsav( p->pName ); - pNew->nRegs = p->nRegs; - pNew->nAsserts = p->nAsserts; - if ( p->vFlopNums ) - pNew->vFlopNums = Vec_IntDup( p->vFlopNums ); - // map the PI nodes - Aig_ManCleanData( p ); - Aig_ManConst1(p)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( p, pObj, i ) - pObj->pData = Aig_ObjCreatePi(pNew); - // balance the AIG - vStore = Vec_VecAlloc( 50 ); - Aig_ManForEachPo( p, pObj, i ) - { - pDriver = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - pObjNew = Dar_Balance_rec( pNew, Aig_Regular(pDriver), vStore, 0, fUpdateLevel ); - pObjNew = Aig_NotCond( pObjNew, Aig_IsComplement(pDriver) ); - Aig_ObjCreatePo( pNew, pObjNew ); - } - Vec_VecFree( vStore ); - // remove dangling nodes - if ( (i = Aig_ManCleanup( pNew )) ) - printf( "Cleanup after balancing removed %d dangling nodes.\n", i ); - // check the resulting AIG - if ( !Aig_ManCheck(pNew) ) - printf( "Dar_ManBalance(): The check has failed.\n" ); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Returns the new node constructed.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Dar_Balance_rec( Aig_Man_t * pNew, Aig_Obj_t * pObjOld, Vec_Vec_t * vStore, int Level, int fUpdateLevel ) -{ - Aig_Obj_t * pObjNew; - Vec_Ptr_t * vSuper; - int i; - assert( !Aig_IsComplement(pObjOld) ); - assert( !Aig_ObjIsBuf(pObjOld) ); - // return if the result is known - if ( pObjOld->pData ) - return pObjOld->pData; - assert( Aig_ObjIsNode(pObjOld) ); - // get the implication supergate - vSuper = Dar_BalanceCone( pObjOld, vStore, Level ); - // check if supergate contains two nodes in the opposite polarity - if ( vSuper->nSize == 0 ) - return pObjOld->pData = Aig_ManConst0(pNew); - if ( Vec_PtrSize(vSuper) < 2 ) - printf( "BUG!\n" ); - // for each old node, derive the new well-balanced node - for ( i = 0; i < Vec_PtrSize(vSuper); i++ ) - { - pObjNew = Dar_Balance_rec( pNew, Aig_Regular(vSuper->pArray[i]), vStore, Level + 1, fUpdateLevel ); - vSuper->pArray[i] = Aig_NotCond( pObjNew, Aig_IsComplement(vSuper->pArray[i]) ); - } - // build the supergate - pObjNew = Dar_BalanceBuildSuper( pNew, vSuper, Aig_ObjType(pObjOld), fUpdateLevel ); - // make sure the balanced node is not assigned -// assert( pObjOld->Level >= Aig_Regular(pObjNew)->Level ); - assert( pObjOld->pData == NULL ); - return pObjOld->pData = pObjNew; -} - -/**Function************************************************************* - - Synopsis [Collects the nodes of the supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_BalanceCone_rec( Aig_Obj_t * pRoot, Aig_Obj_t * pObj, Vec_Ptr_t * vSuper ) -{ - int RetValue1, RetValue2, i; - // check if the node is visited - if ( Aig_Regular(pObj)->fMarkB ) - { - // check if the node occurs in the same polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == pObj ) - return 1; - // check if the node is present in the opposite polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == Aig_Not(pObj) ) - return -1; - assert( 0 ); - return 0; - } - // if the new node is complemented or a PI, another gate begins - if ( pObj != pRoot && (Aig_IsComplement(pObj) || Aig_ObjType(pObj) != Aig_ObjType(pRoot) || Aig_ObjRefs(pObj) > 1) ) - { - Vec_PtrPush( vSuper, pObj ); - Aig_Regular(pObj)->fMarkB = 1; - return 0; - } - assert( !Aig_IsComplement(pObj) ); - assert( Aig_ObjIsNode(pObj) ); - // go through the branches - RetValue1 = Dar_BalanceCone_rec( pRoot, Aig_ObjReal_rec( Aig_ObjChild0(pObj) ), vSuper ); - RetValue2 = Dar_BalanceCone_rec( pRoot, Aig_ObjReal_rec( Aig_ObjChild1(pObj) ), vSuper ); - if ( RetValue1 == -1 || RetValue2 == -1 ) - return -1; - // return 1 if at least one branch has a duplicate - return RetValue1 || RetValue2; -} - -/**Function************************************************************* - - Synopsis [Collects the nodes of the supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Dar_BalanceCone( Aig_Obj_t * pObj, Vec_Vec_t * vStore, int Level ) -{ - Vec_Ptr_t * vNodes; - int RetValue, i; - assert( !Aig_IsComplement(pObj) ); - // extend the storage - if ( Vec_VecSize( vStore ) <= Level ) - Vec_VecPush( vStore, Level, 0 ); - // get the temporary array of nodes - vNodes = Vec_VecEntry( vStore, Level ); - Vec_PtrClear( vNodes ); - // collect the nodes in the implication supergate - RetValue = Dar_BalanceCone_rec( pObj, pObj, vNodes ); - assert( vNodes->nSize > 1 ); - // unmark the visited nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - Aig_Regular(pObj)->fMarkB = 0; - // if we found the node and its complement in the same implication supergate, - // return empty set of nodes (meaning that we should use constant-0 node) - if ( RetValue == -1 ) - vNodes->nSize = 0; - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Procedure used for sorting the nodes in decreasing order of levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Aig_NodeCompareLevelsDecrease( Aig_Obj_t ** pp1, Aig_Obj_t ** pp2 ) -{ - int Diff = Aig_ObjLevel(Aig_Regular(*pp1)) - Aig_ObjLevel(Aig_Regular(*pp2)); - if ( Diff > 0 ) - return -1; - if ( Diff < 0 ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Builds implication supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Dar_BalanceBuildSuper( Aig_Man_t * p, Vec_Ptr_t * vSuper, Aig_Type_t Type, int fUpdateLevel ) -{ - Aig_Obj_t * pObj1, * pObj2; - int LeftBound; - assert( vSuper->nSize > 1 ); - // sort the new nodes by level in the decreasing order - Vec_PtrSort( vSuper, Aig_NodeCompareLevelsDecrease ); - // balance the nodes - while ( vSuper->nSize > 1 ) - { - // find the left bound on the node to be paired - LeftBound = (!fUpdateLevel)? 0 : Dar_BalanceFindLeft( vSuper ); - // find the node that can be shared (if no such node, randomize choice) - Dar_BalancePermute( p, vSuper, LeftBound, Type == AIG_OBJ_EXOR ); - // pull out the last two nodes - pObj1 = Vec_PtrPop(vSuper); - pObj2 = Vec_PtrPop(vSuper); - Dar_BalancePushUniqueOrderByLevel( vSuper, Aig_Oper(p, pObj1, pObj2, Type) ); - } - return Vec_PtrEntry(vSuper, 0); -} - -/**Function************************************************************* - - Synopsis [Finds the left bound on the next candidate to be paired.] - - Description [The nodes in the array are in the decreasing order of levels. - The last node in the array has the smallest level. By default it would be paired - with the next node on the left. However, it may be possible to pair it with some - other node on the left, in such a way that the new node is shared. This procedure - finds the index of the left-most node, which can be paired with the last node.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_BalanceFindLeft( Vec_Ptr_t * vSuper ) -{ - Aig_Obj_t * pObjRight, * pObjLeft; - int Current; - // if two or less nodes, pair with the first - if ( Vec_PtrSize(vSuper) < 3 ) - return 0; - // set the pointer to the one before the last - Current = Vec_PtrSize(vSuper) - 2; - pObjRight = Vec_PtrEntry( vSuper, Current ); - // go through the nodes to the left of this one - for ( Current--; Current >= 0; Current-- ) - { - // get the next node on the left - pObjLeft = Vec_PtrEntry( vSuper, Current ); - // if the level of this node is different, quit the loop - if ( Aig_ObjLevel(Aig_Regular(pObjLeft)) != Aig_ObjLevel(Aig_Regular(pObjRight)) ) - break; - } - Current++; - // get the node, for which the equality holds - pObjLeft = Vec_PtrEntry( vSuper, Current ); - assert( Aig_ObjLevel(Aig_Regular(pObjLeft)) == Aig_ObjLevel(Aig_Regular(pObjRight)) ); - return Current; -} - -/**Function************************************************************* - - Synopsis [Moves closer to the end the node that is best for sharing.] - - Description [If there is no node with sharing, randomly chooses one of - the legal nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_BalancePermute( Aig_Man_t * p, Vec_Ptr_t * vSuper, int LeftBound, int fExor ) -{ - Aig_Obj_t * pObj1, * pObj2, * pObj3, * pGhost; - int RightBound, i; - // get the right bound - RightBound = Vec_PtrSize(vSuper) - 2; - assert( LeftBound <= RightBound ); - if ( LeftBound == RightBound ) - return; - // get the two last nodes - pObj1 = Vec_PtrEntry( vSuper, RightBound + 1 ); - pObj2 = Vec_PtrEntry( vSuper, RightBound ); - if ( Aig_Regular(pObj1) == p->pConst1 || Aig_Regular(pObj2) == p->pConst1 ) - return; - // find the first node that can be shared - for ( i = RightBound; i >= LeftBound; i-- ) - { - pObj3 = Vec_PtrEntry( vSuper, i ); - if ( Aig_Regular(pObj3) == p->pConst1 ) - { - Vec_PtrWriteEntry( vSuper, i, pObj2 ); - Vec_PtrWriteEntry( vSuper, RightBound, pObj3 ); - return; - } - pGhost = Aig_ObjCreateGhost( p, pObj1, pObj3, fExor? AIG_OBJ_EXOR : AIG_OBJ_AND ); - if ( Aig_TableLookup( p, pGhost ) ) - { - if ( pObj3 == pObj2 ) - return; - Vec_PtrWriteEntry( vSuper, i, pObj2 ); - Vec_PtrWriteEntry( vSuper, RightBound, pObj3 ); - return; - } - } -/* - // we did not find the node to share, randomize choice - { - int Choice = rand() % (RightBound - LeftBound + 1); - pObj3 = Vec_PtrEntry( vSuper, LeftBound + Choice ); - if ( pObj3 == pObj2 ) - return; - Vec_PtrWriteEntry( vSuper, LeftBound + Choice, pObj2 ); - Vec_PtrWriteEntry( vSuper, RightBound, pObj3 ); - } -*/ -} - -/**Function************************************************************* - - Synopsis [Inserts a new node in the order by levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_BalancePushUniqueOrderByLevel( Vec_Ptr_t * vStore, Aig_Obj_t * pObj ) -{ - Aig_Obj_t * pObj1, * pObj2; - int i; - if ( Vec_PtrPushUnique(vStore, pObj) ) - return; - // find the p of the node - for ( i = vStore->nSize-1; i > 0; i-- ) - { - pObj1 = vStore->pArray[i ]; - pObj2 = vStore->pArray[i-1]; - if ( Aig_ObjLevel(Aig_Regular(pObj1)) <= Aig_ObjLevel(Aig_Regular(pObj2)) ) - break; - vStore->pArray[i ] = pObj2; - vStore->pArray[i-1] = pObj1; - } -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darCore.c b/src/vendor/stp/src/extlib-abc/aig/dar/darCore.c deleted file mode 100644 index 5f5401b9e..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darCore.c +++ /dev/null @@ -1,244 +0,0 @@ -/**CFile**************************************************************** - - FileName [darCore.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Core of the rewriting package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darCore.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Returns the structure with default assignment of parameters.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_ManDefaultRwrParams( Dar_RwrPar_t * pPars ) -{ - memset( pPars, 0, sizeof(Dar_RwrPar_t) ); - pPars->nCutsMax = 8; // 8 - pPars->nSubgMax = 5; // 5 is a "magic number" - pPars->fFanout = 1; - pPars->fUpdateLevel = 0; - pPars->fUseZeros = 0; - pPars->fVerbose = 0; - pPars->fVeryVerbose = 0; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_ManRewrite( Aig_Man_t * pAig, Dar_RwrPar_t * pPars ) -{ - Dar_Man_t * p; -// Bar_Progress_t * pProgress; - Dar_Cut_t * pCut; - Aig_Obj_t * pObj, * pObjNew; - int i, k, nNodesOld, nNodeBefore, nNodeAfter, Required; - int clk = 0, clkStart; - // prepare the library - Dar_LibPrepare( pPars->nSubgMax ); - // create rewriting manager - p = Dar_ManStart( pAig, pPars ); - // remove dangling nodes - Aig_ManCleanup( pAig ); - // if updating levels is requested, start fanout and timing - if ( p->pPars->fFanout ) - Aig_ManFanoutStart( pAig ); - if ( p->pPars->fUpdateLevel ) - Aig_ManStartReverseLevels( pAig, 0 ); - // set elementary cuts for the PIs - Dar_ManCutsStart( p ); - // resynthesize each node once - clkStart = clock(); - p->nNodesInit = Aig_ManNodeNum(pAig); - nNodesOld = Vec_PtrSize( pAig->vObjs ); - -// pProgress = Bar_ProgressStart( stdout, nNodesOld ); - Aig_ManForEachObj( pAig, pObj, i ) -// pProgress = Bar_ProgressStart( stdout, 100 ); -// Aig_ManOrderStart( pAig ); -// Aig_ManForEachNodeInOrder( pAig, pObj ) - { -// Bar_ProgressUpdate( pProgress, 100*pAig->nAndPrev/pAig->nAndTotal, NULL ); - -// Bar_ProgressUpdate( pProgress, i, NULL ); - if ( !Aig_ObjIsNode(pObj) ) - continue; - if ( i > nNodesOld ) - break; - - // consider freeing the cuts -// if ( (i & 0xFFF) == 0 && Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20) > 100 ) -// Dar_ManCutsStart( p ); - - // compute cuts for the node - p->nNodesTried++; -clk = clock(); - Dar_ObjComputeCuts_rec( p, pObj ); -p->timeCuts += clock() - clk; - - // check if there is a trivial cut - Dar_ObjForEachCut( pObj, pCut, k ) - if ( pCut->nLeaves == 0 || (pCut->nLeaves == 1 && pCut->pLeaves[0] != pObj->Id && Aig_ManObj(p->pAig, pCut->pLeaves[0])) ) - break; - if ( k < (int)pObj->nCuts ) - { - assert( pCut->nLeaves < 2 ); - if ( pCut->nLeaves == 0 ) // replace by constant - { - assert( pCut->uTruth == 0 || pCut->uTruth == 0xFFFF ); - pObjNew = Aig_NotCond( Aig_ManConst1(p->pAig), pCut->uTruth==0 ); - } - else - { - assert( pCut->uTruth == 0xAAAA || pCut->uTruth == 0x5555 ); - pObjNew = Aig_NotCond( Aig_ManObj(p->pAig, pCut->pLeaves[0]), pCut->uTruth==0x5555 ); - } - // remove the old cuts - Dar_ObjSetCuts( pObj, NULL ); - // replace the node - Aig_ObjReplace( pAig, pObj, pObjNew, 1, p->pPars->fUpdateLevel ); - continue; - } - - // evaluate the cuts - p->GainBest = -1; - Required = pAig->vLevelR? Aig_ObjRequiredLevel(pAig, pObj) : AIG_INFINITY; - Dar_ObjForEachCut( pObj, pCut, k ) - Dar_LibEval( p, pObj, pCut, Required ); - // check the best gain - if ( !(p->GainBest > 0 || (p->GainBest == 0 && p->pPars->fUseZeros)) ) - { -// Aig_ObjOrderAdvance( pAig ); - continue; - } - // remove the old cuts - Dar_ObjSetCuts( pObj, NULL ); - // if we end up here, a rewriting step is accepted - nNodeBefore = Aig_ManNodeNum( pAig ); - pObjNew = Dar_LibBuildBest( p ); // pObjNew can be complemented! - pObjNew = Aig_NotCond( pObjNew, Aig_ObjPhaseReal(pObjNew) ^ pObj->fPhase ); - assert( (int)Aig_Regular(pObjNew)->Level <= Required ); - // replace the node - Aig_ObjReplace( pAig, pObj, pObjNew, 1, p->pPars->fUpdateLevel ); - // compare the gains - nNodeAfter = Aig_ManNodeNum( pAig ); - assert( p->GainBest <= nNodeBefore - nNodeAfter ); - // count gains of this class - p->ClassGains[p->ClassBest] += nNodeBefore - nNodeAfter; - } -// Aig_ManOrderStop( pAig ); - -p->timeTotal = clock() - clkStart; -p->timeOther = p->timeTotal - p->timeCuts - p->timeEval; - -// Bar_ProgressStop( pProgress ); - p->nCutMemUsed = Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20); - Dar_ManCutsFree( p ); - // put the nodes into the DFS order and reassign their IDs -// Aig_NtkReassignIds( p ); - // fix the levels -// Aig_ManVerifyLevel( pAig ); - if ( p->pPars->fFanout ) - Aig_ManFanoutStop( pAig ); - if ( p->pPars->fUpdateLevel ) - { -// Aig_ManVerifyReverseLevel( pAig ); - Aig_ManStopReverseLevels( pAig ); - } - // stop the rewriting manager - Dar_ManStop( p ); - Aig_ManCheckPhase( pAig ); - // check - if ( !Aig_ManCheck( pAig ) ) - { - printf( "Aig_ManRewrite: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_MmFixed_t * Dar_ManComputeCuts( Aig_Man_t * pAig, int nCutsMax ) -{ - Dar_Man_t * p; - Dar_RwrPar_t Pars, * pPars = &Pars; - Aig_Obj_t * pObj; - Aig_MmFixed_t * pMemCuts; - int i, nNodes; - // remove dangling nodes - if ( (nNodes = Aig_ManCleanup( pAig )) ) - { -// printf( "Removing %d nodes.\n", nNodes ); - } - // create default parameters - Dar_ManDefaultRwrParams( pPars ); - pPars->nCutsMax = nCutsMax; - // create rewriting manager - p = Dar_ManStart( pAig, pPars ); - // set elementary cuts for the PIs - Dar_ManCutsStart( p ); - // compute cuts for each nodes in the topological order - Aig_ManForEachNode( pAig, pObj, i ) - Dar_ObjComputeCuts( p, pObj ); - // free the cuts - pMemCuts = p->pMemCuts; - p->pMemCuts = NULL; -// Dar_ManCutsFree( p ); - // stop the rewriting manager - Dar_ManStop( p ); - return pMemCuts; -} - - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darCut.c b/src/vendor/stp/src/extlib-abc/aig/dar/darCut.c deleted file mode 100644 index 0c13b5128..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darCut.c +++ /dev/null @@ -1,721 +0,0 @@ -/**CFile**************************************************************** - - FileName [darCut.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Computation of 4-input cuts.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darCut.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Returns the number of 1s in the machine word.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Dar_WordCountOnes( unsigned uWord ) -{ - uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555); - uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333); - uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F); - uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF); - return (uWord & 0x0000FFFF) + (uWord>>16); -} - -// This doesn't count the 1-bits, just strips -// off the trailing 1-bit four times. If it's not zero, -// then there are >4 1-bits. -static inline unsigned Dar_FiveOrMoreBits( unsigned uWord ) -{ - uWord = (uWord-1)&uWord; - uWord = (uWord-1)&uWord; - uWord = (uWord-1)&uWord; - uWord = (uWord-1)&uWord; - - return uWord; // non-zero if >=5 ones. -} - - -/**Function************************************************************* - - Synopsis [Compute the cost of the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Dar_CutFindValue( Dar_Man_t * p, Dar_Cut_t * pCut ) -{ - Aig_Obj_t * pLeaf; - int i, Value, nOnes; - assert( pCut->fUsed ); - Value = 0; - nOnes = 0; - Dar_CutForEachLeaf( p->pAig, pCut, pLeaf, i ) - { - if ( pLeaf == NULL ) - return 0; - assert( pLeaf != NULL ); - Value += pLeaf->nRefs; - nOnes += (pLeaf->nRefs == 1); - } - if ( pCut->nLeaves < 2 ) - return 1001; -// Value = Value * 100 / pCut->nLeaves; - if ( Value > 1000 ) - Value = 1000; - if ( nOnes > 3 ) - Value = 5 - nOnes; - return Value; -} - -/**Function************************************************************* - - Synopsis [Returns the next free cut to use.] - - Description [Uses the cut with the smallest value.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Dar_Cut_t * Dar_CutFindFree( Dar_Man_t * p, Aig_Obj_t * pObj ) -{ - Dar_Cut_t * pCut, * pCutMax; - int i; - pCutMax = NULL; - Dar_ObjForEachCutAll( pObj, pCut, i ) - { - if ( pCut->fUsed == 0 ) - return pCut; - if ( pCut->nLeaves < 3 ) - continue; - if ( pCutMax == NULL || pCutMax->Value > pCut->Value ) - pCutMax = pCut; - } - if ( pCutMax == NULL ) - { - Dar_ObjForEachCutAll( pObj, pCut, i ) - { - if ( pCut->nLeaves < 2 ) - continue; - if ( pCutMax == NULL || pCutMax->Value > pCut->Value ) - pCutMax = pCut; - } - } - if ( pCutMax == NULL ) - { - Dar_ObjForEachCutAll( pObj, pCut, i ) - { - if ( pCutMax == NULL || pCutMax->Value > pCut->Value ) - pCutMax = pCut; - } - } - assert( pCutMax != NULL ); - pCutMax->fUsed = 0; - return pCutMax; -} - -/**Function************************************************************* - - Synopsis [Returns 1 if pDom is contained in pCut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Dar_CutCheckDominance( Dar_Cut_t * pDom, Dar_Cut_t * pCut ) -{ - int i, k; - assert( pDom->fUsed && pCut->fUsed ); - for ( i = 0; i < (int)pDom->nLeaves; i++ ) - { - for ( k = 0; k < (int)pCut->nLeaves; k++ ) - if ( pDom->pLeaves[i] == pCut->pLeaves[k] ) - break; - if ( k == (int)pCut->nLeaves ) // node i in pDom is not contained in pCut - return 0; - } - // every node in pDom is contained in pCut - return 1; -} - -/**Function************************************************************* - - Synopsis [Returns 1 if the cut is contained.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Dar_CutFilter( Aig_Obj_t * pObj, Dar_Cut_t * pCut ) -{ - Dar_Cut_t * pTemp; - int i; - assert( pCut->fUsed ); - // go through the cuts of the node - Dar_ObjForEachCut( pObj, pTemp, i ) - { - if ( pTemp == pCut ) - continue; - if ( pTemp->nLeaves > pCut->nLeaves ) - { - // skip the non-contained cuts - if ( (pTemp->uSign & pCut->uSign) != pCut->uSign ) - continue; - // check containment seriously - if ( Dar_CutCheckDominance( pCut, pTemp ) ) - { - // remove contained cut - pTemp->fUsed = 0; - } - } - else - { - // skip the non-contained cuts - if ( (pTemp->uSign & pCut->uSign) != pTemp->uSign ) - continue; - // check containment seriously - if ( Dar_CutCheckDominance( pTemp, pCut ) ) - { - // remove the given cut - pCut->fUsed = 0; - return 1; - } - } - } - return 0; -} - -/**Function************************************************************* - - Synopsis [Merges two cuts.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Dar_CutMergeOrdered( Dar_Cut_t * pC, Dar_Cut_t * pC0, Dar_Cut_t * pC1 ) -{ - int i, k, c; - assert( pC0->nLeaves >= pC1->nLeaves ); - - // the case of the largest cut sizes - if ( pC0->nLeaves == 4 && pC1->nLeaves == 4 ) - { - if ( pC0->uSign != pC1->uSign ) - return 0; - for ( i = 0; i < (int)pC0->nLeaves; i++ ) - if ( pC0->pLeaves[i] != pC1->pLeaves[i] ) - return 0; - for ( i = 0; i < (int)pC0->nLeaves; i++ ) - pC->pLeaves[i] = pC0->pLeaves[i]; - pC->nLeaves = pC0->nLeaves; - return 1; - } - - // the case when one of the cuts is the largest - if ( pC0->nLeaves == 4 ) - { - if ( (pC0->uSign & pC1->uSign) != pC1->uSign ) - return 0; - for ( i = 0; i < (int)pC1->nLeaves; i++ ) - { - for ( k = (int)pC0->nLeaves - 1; k >= 0; k-- ) - if ( pC0->pLeaves[k] == pC1->pLeaves[i] ) - break; - if ( k == -1 ) // did not find - return 0; - } - for ( i = 0; i < (int)pC0->nLeaves; i++ ) - pC->pLeaves[i] = pC0->pLeaves[i]; - pC->nLeaves = pC0->nLeaves; - return 1; - } - - // compare two cuts with different numbers - i = k = 0; - for ( c = 0; c < 4; c++ ) - { - if ( k == (int)pC1->nLeaves ) - { - if ( i == (int)pC0->nLeaves ) - { - pC->nLeaves = c; - return 1; - } - pC->pLeaves[c] = pC0->pLeaves[i++]; - continue; - } - if ( i == (int)pC0->nLeaves ) - { - if ( k == (int)pC1->nLeaves ) - { - pC->nLeaves = c; - return 1; - } - pC->pLeaves[c] = pC1->pLeaves[k++]; - continue; - } - if ( pC0->pLeaves[i] < pC1->pLeaves[k] ) - { - pC->pLeaves[c] = pC0->pLeaves[i++]; - continue; - } - if ( pC0->pLeaves[i] > pC1->pLeaves[k] ) - { - pC->pLeaves[c] = pC1->pLeaves[k++]; - continue; - } - pC->pLeaves[c] = pC0->pLeaves[i++]; - k++; - } - if ( i < (int)pC0->nLeaves || k < (int)pC1->nLeaves ) - return 0; - pC->nLeaves = c; - return 1; -} - -/**Function************************************************************* - - Synopsis [Prepares the object for FPGA mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Dar_CutMerge( Dar_Cut_t * pCut, Dar_Cut_t * pCut0, Dar_Cut_t * pCut1 ) -{ - assert( !pCut->fUsed ); - // merge the nodes - if ( pCut0->nLeaves <= pCut1->nLeaves ) - { - if ( !Dar_CutMergeOrdered( pCut, pCut1, pCut0 ) ) - return 0; - } - else - { - if ( !Dar_CutMergeOrdered( pCut, pCut0, pCut1 ) ) - return 0; - } - pCut->uSign = pCut0->uSign | pCut1->uSign; - pCut->fUsed = 1; - return 1; -} - - -/**Function************************************************************* - - Synopsis [Computes the stretching phase of the cut w.r.t. the merged cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Dar_CutTruthPhase( Dar_Cut_t * pCut, Dar_Cut_t * pCut1 ) -{ - unsigned uPhase = 0; - int i, k; - for ( i = k = 0; i < (int)pCut->nLeaves; i++ ) - { - if ( k == (int)pCut1->nLeaves ) - break; - if ( pCut->pLeaves[i] < pCut1->pLeaves[k] ) - continue; - assert( pCut->pLeaves[i] == pCut1->pLeaves[k] ); - uPhase |= (1 << i); - k++; - } - return uPhase; -} - -/**Function************************************************************* - - Synopsis [Swaps two advancent variables of the truth table.] - - Description [Swaps variable iVar and iVar+1.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Dar_CutTruthSwapAdjacentVars( unsigned uTruth, int iVar ) -{ - assert( iVar >= 0 && iVar <= 2 ); - if ( iVar == 0 ) - return (uTruth & 0x99999999) | ((uTruth & 0x22222222) << 1) | ((uTruth & 0x44444444) >> 1); - if ( iVar == 1 ) - return (uTruth & 0xC3C3C3C3) | ((uTruth & 0x0C0C0C0C) << 2) | ((uTruth & 0x30303030) >> 2); - if ( iVar == 2 ) - return (uTruth & 0xF00FF00F) | ((uTruth & 0x00F000F0) << 4) | ((uTruth & 0x0F000F00) >> 4); - assert( 0 ); - return 0; -} - -/**Function************************************************************* - - Synopsis [Expands the truth table according to the phase.] - - Description [The input and output truth tables are in pIn/pOut. The current number - of variables is nVars. The total number of variables in nVarsAll. The last argument - (Phase) contains shows where the variables should go.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Dar_CutTruthStretch( unsigned uTruth, int nVars, unsigned Phase ) -{ - int i, k, Var = nVars - 1; - for ( i = 3; i >= 0; i-- ) - if ( Phase & (1 << i) ) - { - for ( k = Var; k < i; k++ ) - uTruth = Dar_CutTruthSwapAdjacentVars( uTruth, k ); - Var--; - } - assert( Var == -1 ); - return uTruth; -} - -/**Function************************************************************* - - Synopsis [Shrinks the truth table according to the phase.] - - Description [The input and output truth tables are in pIn/pOut. The current number - of variables is nVars. The total number of variables in nVarsAll. The last argument - (Phase) contains shows what variables should remain.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Dar_CutTruthShrink( unsigned uTruth, int nVars, unsigned Phase ) -{ - int i, k, Var = 0; - for ( i = 0; i < 4; i++ ) - if ( Phase & (1 << i) ) - { - for ( k = i-1; k >= Var; k-- ) - uTruth = Dar_CutTruthSwapAdjacentVars( uTruth, k ); - Var++; - } - return uTruth; -} - -/**Function************************************************************* - - Synopsis [Performs truth table computation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Dar_CutTruth( Dar_Cut_t * pCut, Dar_Cut_t * pCut0, Dar_Cut_t * pCut1, int fCompl0, int fCompl1 ) -{ - unsigned uTruth0 = fCompl0 ? ~pCut0->uTruth : pCut0->uTruth; - unsigned uTruth1 = fCompl1 ? ~pCut1->uTruth : pCut1->uTruth; - uTruth0 = Dar_CutTruthStretch( uTruth0, pCut0->nLeaves, Dar_CutTruthPhase(pCut, pCut0) ); - uTruth1 = Dar_CutTruthStretch( uTruth1, pCut1->nLeaves, Dar_CutTruthPhase(pCut, pCut1) ); - return uTruth0 & uTruth1; -} - -/**Function************************************************************* - - Synopsis [Minimize support of the cut.] - - Description [Returns 1 if the node's support has changed] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Dar_CutSuppMinimize( Dar_Cut_t * pCut ) -{ - unsigned uMasks[4][2] = { - { 0x5555, 0xAAAA }, - { 0x3333, 0xCCCC }, - { 0x0F0F, 0xF0F0 }, - { 0x00FF, 0xFF00 } - }; - unsigned uPhase = 0, uTruth = 0xFFFF & pCut->uTruth; - int i, k, nLeaves; - assert( pCut->fUsed ); - // compute the truth support of the cut's function - nLeaves = pCut->nLeaves; - for ( i = 0; i < (int)pCut->nLeaves; i++ ) - if ( (uTruth & uMasks[i][0]) == ((uTruth & uMasks[i][1]) >> (1 << i)) ) - nLeaves--; - else - uPhase |= (1 << i); - if ( nLeaves == (int)pCut->nLeaves ) - return 0; - // shrink the truth table - uTruth = Dar_CutTruthShrink( uTruth, pCut->nLeaves, uPhase ); - pCut->uTruth = 0xFFFF & uTruth; - // update leaves and signature - pCut->uSign = 0; - for ( i = k = 0; i < (int)pCut->nLeaves; i++ ) - { - if ( !(uPhase & (1 << i)) ) - continue; - pCut->pLeaves[k++] = pCut->pLeaves[i]; - pCut->uSign |= Aig_ObjCutSign( pCut->pLeaves[i] ); - } - assert( k == nLeaves ); - pCut->nLeaves = nLeaves; - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_ManCutsFree( Dar_Man_t * p ) -{ - if ( p->pMemCuts == NULL ) - return; - Aig_MmFixedStop( p->pMemCuts, 0 ); - p->pMemCuts = NULL; -// Aig_ManCleanData( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dar_Cut_t * Dar_ObjPrepareCuts( Dar_Man_t * p, Aig_Obj_t * pObj ) -{ - Dar_Cut_t * pCutSet, * pCut; - int i; - assert( Dar_ObjCuts(pObj) == NULL ); - pObj->nCuts = p->pPars->nCutsMax; - // create the cutset of the node - pCutSet = (Dar_Cut_t *)Aig_MmFixedEntryFetch( p->pMemCuts ); - Dar_ObjSetCuts( pObj, pCutSet ); - - // Replaced code to remove a spurious Valgrind warning. - //Dar_ObjForEachCut( pObj, pCut, i ) - for ( (pCut) = Dar_ObjCuts(pObj), i = 0; i < (int)(pObj)->nCuts; i++, pCut++ ) - pCut->fUsed = 0; - - // add unit cut if needed - pCut = pCutSet; - pCut->fUsed = 1; - if ( Aig_ObjIsConst1(pObj) ) - { - pCut->nLeaves = 0; - pCut->uSign = 0; - pCut->uTruth = 0xFFFF; - } - else - { - pCut->nLeaves = 1; - pCut->pLeaves[0] = pObj->Id; - pCut->uSign = Aig_ObjCutSign( pObj->Id ); - pCut->uTruth = 0xAAAA; - } - pCut->Value = Dar_CutFindValue( p, pCut ); - return pCutSet; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_ManCutsStart( Dar_Man_t * p ) -{ - Aig_Obj_t * pObj; - int i; - Aig_ManCleanData( p->pAig ); - Aig_MmFixedRestart( p->pMemCuts ); - Dar_ObjPrepareCuts( p, Aig_ManConst1(p->pAig) ); - Aig_ManForEachPi( p->pAig, pObj, i ) - Dar_ObjPrepareCuts( p, pObj ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dar_Cut_t * Dar_ObjComputeCuts( Dar_Man_t * p, Aig_Obj_t * pObj ) -{ - Aig_Obj_t * pFanin0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) ); - Aig_Obj_t * pFanin1 = Aig_ObjReal_rec( Aig_ObjChild1(pObj) ); - Aig_Obj_t * pFaninR0 = Aig_Regular(pFanin0); - Aig_Obj_t * pFaninR1 = Aig_Regular(pFanin1); - Dar_Cut_t * pCutSet, * pCut0, * pCut1, * pCut; - int i, k, RetValue; - - assert( !Aig_IsComplement(pObj) ); - assert( Aig_ObjIsNode(pObj) ); - assert( Dar_ObjCuts(pObj) == NULL ); - assert( Dar_ObjCuts(pFaninR0) != NULL ); - assert( Dar_ObjCuts(pFaninR1) != NULL ); - - // set up the first cut - pCutSet = Dar_ObjPrepareCuts( p, pObj ); - // make sure fanins cuts are computed - Dar_ObjForEachCut( pFaninR0, pCut0, i ) - Dar_ObjForEachCut( pFaninR1, pCut1, k ) - { - p->nCutsAll++; - // make sure K-feasible cut exists - - // if (Dar_WordCountOnes(pCut0->uSign | pCut1->uSign) > 4) - // continue; - - if (0 != Dar_FiveOrMoreBits(pCut0->uSign | pCut1->uSign)) - continue; - - // get the next cut of this node - pCut = Dar_CutFindFree( p, pObj ); - // create the new cut - if ( !Dar_CutMerge( pCut, pCut0, pCut1 ) ) - { - assert( !pCut->fUsed ); - continue; - } - p->nCutsTried++; - // check dominance - if ( Dar_CutFilter( pObj, pCut ) ) - { - assert( !pCut->fUsed ); - continue; - } - // compute truth table - pCut->uTruth = 0xFFFF & Dar_CutTruth( pCut, pCut0, pCut1, Aig_IsComplement(pFanin0), Aig_IsComplement(pFanin1) ); - - // minimize support of the cut - if ( Dar_CutSuppMinimize( pCut ) ) - { - RetValue = Dar_CutFilter( pObj, pCut ); - assert( !RetValue ); - } - - // assign the value of the cut - pCut->Value = Dar_CutFindValue( p, pCut ); - // if the cut contains removed node, do not use it - if ( pCut->Value == 0 ) - { - p->nCutsSkipped++; - pCut->fUsed = 0; - } - else if ( pCut->nLeaves < 2 ) - return pCutSet; - } - // count the number of nontrivial cuts cuts - Dar_ObjForEachCut( pObj, pCut, i ) - p->nCutsUsed += pCut->fUsed; - // discount trivial cut - p->nCutsUsed--; - return pCutSet; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dar_Cut_t * Dar_ObjComputeCuts_rec( Dar_Man_t * p, Aig_Obj_t * pObj ) -{ - if ( Dar_ObjCuts(pObj) ) - return Dar_ObjCuts(pObj); - if ( Aig_ObjIsBuf(pObj) ) - return Dar_ObjComputeCuts_rec( p, Aig_ObjFanin0(pObj) ); - Dar_ObjComputeCuts_rec( p, Aig_ObjFanin0(pObj) ); - Dar_ObjComputeCuts_rec( p, Aig_ObjFanin1(pObj) ); - return Dar_ObjComputeCuts( p, pObj ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darData.c b/src/vendor/stp/src/extlib-abc/aig/dar/darData.c deleted file mode 100644 index 00ec85baf..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darData.c +++ /dev/null @@ -1,11287 +0,0 @@ -/**CFile**************************************************************** - - FileName [dar_.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Storage for AIG subgraph data.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: dar_.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -const int s_nDataSize1 = 2*43906; -unsigned int s_Data1[2*43906] = { - 4, 6, 5, 7, 9, 11, 5, 6, 4, 7, 15, 17, - 2, 8, 4, 21, 3, 10, 5, 25, 7, 25, 9, 25, - 2, 10, 7, 33, 9, 33, 2, 14, 5, 39, 6, 39, - 17, 39, 3, 16, 7, 47, 33, 47, 2, 16, 4, 53, - 7, 53, 3, 14, 5, 59, 17, 59, 53, 59, 3, 11, - 7, 67, 4, 68, 5, 66, 6, 73, 33, 67, 7, 76, - 5, 77, 9, 77, 9, 66, 33, 85, 3, 9, 4, 88, - 7, 91, 88, 93, 6, 88, 21, 89, 11, 89, 21, 100, - 25, 101, 11, 88, 7, 107, 33, 107, 2, 11, 5, 113, - 7, 112, 30, 113, 25, 113, 5, 120, 7, 121, 9, 120, - 9, 113, 25, 128, 21, 129, 9, 112, 2, 9, 6, 137, - 5, 138, 11, 136, 3, 17, 7, 144, 113, 145, 15, 144, - 113, 151, 3, 15, 6, 155, 4, 156, 17, 154, 113, 161, - 2, 17, 7, 165, 5, 166, 155, 165, 15, 164, 2, 15, - 6, 174, 17, 174, 3, 13, 113, 181, 135, 181, 143, 181, - 2, 12, 9, 189, 181, 189, 9, 192, 2, 13, 85, 197, - 107, 197, 3, 12, 7, 203, 11, 203, 33, 203, 197, 203, - 9, 211, 3, 19, 7, 215, 33, 215, 173, 215, 179, 215, - 2, 18, 215, 225, 2, 19, 151, 229, 161, 229, 3, 18, - 113, 235, 229, 235, 2, 4, 25, 241, 9, 241, 15, 241, - 11, 241, 6, 240, 7, 240, 59, 253, 7, 241, 9, 257, - 6, 241, 253, 261, 3, 5, 251, 265, 6, 266, 241, 269, - 253, 265, 7, 272, 7, 273, 241, 277, 53, 265, 7, 280, - 248, 265, 9, 285, 11, 265, 241, 288, 9, 291, 17, 265, - 9, 265, 257, 265, 25, 299, 251, 298, 7, 264, 3, 305, - 5, 305, 128, 305, 101, 305, 299, 305, 241, 305, 7, 317, - 265, 319, 9, 305, 113, 322, 113, 305, 9, 326, 6, 264, - 241, 331, 17, 331, 53, 331, 253, 331, 7, 265, 59, 341, - 241, 343, 331, 341, 241, 346, 241, 347, 15, 341, 113, 353, - 241, 340, 7, 357, 265, 357, 59, 357, 331, 357, 256, 265, - 7, 367, 59, 367, 331, 367, 6, 265, 5, 375, 242, 375, - 316, 375, 25, 375, 241, 382, 305, 375, 241, 386, 241, 387, - 11, 375, 241, 375, 265, 394, 7, 397, 25, 394, 305, 394, - 251, 395, 257, 375, 241, 374, 260, 265, 241, 265, 251, 413, - 331, 413, 261, 413, 375, 413, 257, 413, 19, 413, 12, 413, - 11, 413, 9, 428, 9, 413, 11, 433, 11, 432, 15, 413, - 11, 412, 9, 441, 7, 413, 241, 445, 265, 445, 375, 445, - 409, 445, 411, 445, 6, 412, 241, 457, 445, 457, 241, 460, - 6, 413, 357, 465, 367, 465, 7, 412, 265, 471, 59, 471, - 331, 471, 465, 471, 241, 479, 2, 6, 353, 483, 322, 483, - 30, 483, 25, 483, 9, 490, 305, 483, 9, 494, 19, 483, - 413, 483, 12, 483, 244, 483, 241, 483, 9, 506, 9, 483, - 305, 510, 25, 510, 11, 510, 241, 510, 257, 510, 247, 483, - 11, 483, 2, 524, 4, 527, 5, 524, 3, 531, 9, 524, - 258, 483, 151, 483, 257, 483, 9, 540, 155, 483, 17, 545, - 235, 483, 181, 483, 161, 483, 4, 482, 2, 555, 5, 482, - 2, 559, 6, 559, 17, 559, 5, 483, 2, 567, 6, 566, - 241, 567, 483, 573, 9, 573, 9, 567, 4, 483, 6, 581, - 3, 582, 3, 7, 289, 587, 510, 587, 11, 591, 11, 590, - 516, 587, 413, 587, 483, 598, 498, 587, 500, 587, 19, 587, - 483, 606, 502, 587, 12, 587, 483, 612, 534, 587, 524, 587, - 9, 618, 288, 587, 305, 623, 25, 623, 11, 587, 265, 629, - 331, 631, 510, 628, 9, 628, 483, 636, 483, 628, 9, 640, - 265, 628, 305, 645, 25, 645, 375, 628, 265, 587, 11, 653, - 33, 655, 11, 652, 25, 659, 305, 659, 295, 587, 241, 587, - 9, 587, 4, 668, 2, 671, 3, 668, 5, 675, 524, 668, - 483, 668, 11, 681, 11, 680, 11, 668, 483, 686, 392, 587, - 165, 587, 375, 587, 17, 695, 11, 695, 11, 694, 113, 587, - 567, 587, 305, 705, 25, 705, 555, 704, 5, 586, 3, 713, - 7, 713, 623, 713, 645, 713, 659, 713, 128, 713, 394, 713, - 101, 713, 299, 713, 705, 713, 510, 713, 483, 713, 9, 736, - 9, 713, 113, 740, 483, 740, 241, 713, 375, 746, 375, 713, - 241, 750, 113, 713, 9, 754, 4, 586, 7, 759, 589, 759, - 33, 759, 5, 587, 7, 767, 2, 768, 47, 767, 483, 773, - 759, 767, 483, 777, 17, 767, 113, 781, 483, 781, 483, 766, - 47, 787, 759, 787, 17, 787, 566, 587, 47, 795, 759, 795, - 17, 795, 4, 587, 3, 803, 6, 805, 7, 802, 494, 803, - 490, 803, 736, 803, 25, 803, 483, 816, 305, 803, 483, 820, - 713, 803, 483, 824, 483, 803, 305, 828, 25, 828, 713, 828, - 555, 829, 483, 802, 580, 587, 483, 587, 413, 842, 19, 842, - 12, 842, 11, 843, 9, 851, 9, 842, 11, 855, 11, 854, - 11, 842, 9, 860, 5, 843, 803, 865, 9, 865, 839, 865, - 841, 865, 4, 842, 483, 875, 865, 875, 483, 878, 4, 843, - 787, 883, 795, 883, 5, 842, 587, 889, 47, 889, 759, 889, - 17, 889, 883, 889, 483, 899, 3, 4, 559, 903, 19, 903, - 12, 903, 842, 903, 587, 903, 483, 912, 165, 912, 9, 903, - 11, 918, 483, 903, 241, 923, 555, 923, 587, 922, 11, 922, - 15, 903, 11, 903, 9, 934, 483, 934, 524, 903, 692, 903, - 767, 903, 375, 945, 165, 903, 7, 949, 587, 948, 6, 902, - 3, 955, 7, 902, 787, 959, 795, 959, 889, 959, 767, 959, - 483, 967, 33, 959, 7, 903, 956, 973, 88, 973, 4, 973, - 3, 973, 955, 980, 9, 980, 3, 972, 4, 972, 955, 973, - 3, 990, 375, 973, 9, 973, 3, 996, 6, 903, 4, 1001, - 3, 1001, 3, 1000, 4, 1000, 2, 5, 955, 1011, 914, 1011, - 918, 1011, 11, 1017, 11, 1016, 912, 1011, 483, 1022, 920, 1011, - 906, 1011, 19, 1011, 903, 1030, 842, 1011, 903, 1034, 908, 1011, - 910, 1011, 12, 1011, 903, 1042, 922, 1011, 587, 1046, 928, 1011, - 936, 1011, 934, 1011, 9, 1054, 15, 1011, 11, 1011, 918, 1060, - 9, 1060, 903, 1064, 903, 1060, 9, 1068, 483, 1011, 912, 1072, - 903, 1072, 587, 1076, 587, 1072, 903, 1080, 155, 1072, 587, 1011, - 922, 1086, 483, 1086, 903, 1090, 903, 1086, 483, 1094, 11, 1087, - 9, 1099, 9, 1086, 11, 1103, 17, 1011, 9, 1011, 934, 1108, - 903, 1108, 11, 1113, 11, 1112, 11, 1108, 903, 1118, 587, 1108, - 11, 1123, 668, 1011, 11, 1127, 544, 1011, 155, 1011, 483, 1132, - 67, 1011, 375, 1137, 7, 1010, 2, 1141, 959, 1141, 85, 1141, - 107, 1141, 203, 1141, 67, 1141, 9, 1153, 215, 1141, 47, 1141, - 759, 1141, 6, 1010, 2, 1163, 5, 1163, 17, 1163, 7, 1011, - 2, 1171, 5, 1171, 2, 1170, 5, 1170, 1163, 1171, 5, 1180, - 2, 1181, 483, 1171, 903, 1170, 375, 1189, 972, 1011, 375, 1193, - 6, 1011, 2, 1197, 5, 1197, 2, 1196, 5, 1196, 1141, 1197, - 2, 1206, 5, 1207, 903, 1196, 1000, 1011, 903, 1011, 19, 1216, - 842, 1216, 12, 1216, 11, 1217, 9, 1225, 587, 1216, 483, 1228, - 11, 1216, 9, 1232, 9, 1216, 11, 1237, 11, 1236, 15, 1216, - 483, 1216, 587, 1244, 7, 1217, 59, 1249, 331, 1249, 1213, 1249, - 1215, 1249, 6, 1216, 1249, 1259, 6, 1217, 1189, 1263, 1193, 1263, - 7, 1216, 375, 1269, 1263, 1269, 3, 6, 413, 1275, 1216, 1275, - 241, 1275, 9, 1281, 11, 1283, 11, 1280, 9, 1287, 17, 1275, - 3, 1290, 5, 1293, 4, 1290, 2, 1297, 903, 1291, 1011, 1275, - 11, 1275, 241, 1304, 9, 1307, 248, 1275, 9, 1311, 973, 1275, - 9, 1315, 341, 1275, 803, 1319, 9, 1319, 5, 1274, 3, 1325, - 17, 1325, 357, 1325, 367, 1325, 471, 1325, 341, 1325, 241, 1337, - 1249, 1325, 253, 1325, 53, 1325, 5, 1275, 6, 1347, 2, 1348, - 918, 1347, 903, 1347, 9, 1354, 9, 1347, 903, 1358, 4, 1275, - 6, 1362, 265, 1363, 2, 7, 393, 1369, 334, 1369, 1325, 1369, - 1363, 1374, 17, 1374, 62, 1369, 331, 1369, 17, 1382, 59, 1369, - 17, 1386, 1328, 1369, 1304, 1369, 9, 1393, 17, 1369, 331, 1396, - 241, 1397, 59, 1396, 1325, 1396, 11, 1369, 1275, 1406, 9, 1409, - 265, 1369, 241, 1412, 11, 1413, 15, 1369, 5, 1418, 3, 1421, - 2, 1418, 4, 1425, 1011, 1419, 107, 1369, 67, 1369, 803, 1433, - 9, 1433, 1359, 1369, 203, 1369, 215, 1369, 85, 1369, 5, 1368, - 2, 1447, 7, 1447, 47, 1447, 85, 1447, 107, 1447, 203, 1447, - 67, 1447, 9, 1461, 215, 1447, 759, 1447, 959, 1447, 4, 1368, - 2, 1471, 7, 1471, 265, 1471, 7, 1476, 331, 1471, 59, 1471, - 1325, 1471, 5, 1369, 7, 1486, 803, 1487, 1275, 1486, 803, 1493, - 9, 1493, 1346, 1369, 803, 1499, 9, 1499, 4, 1369, 7, 1505, - 3, 1506, 1060, 1505, 11, 1505, 1011, 1512, 1011, 1505, 7, 1517, - 11, 1517, 11, 1516, 1347, 1505, 1275, 1504, 1362, 1369, 1275, 1369, - 413, 1531, 19, 1531, 12, 1531, 1216, 1531, 1011, 1531, 903, 1540, - 9, 1531, 11, 1545, 11, 1544, 11, 1531, 9, 1550, 903, 1531, - 1011, 1554, 11, 1530, 9, 1559, 5, 1531, 959, 1563, 47, 1563, - 759, 1563, 17, 1563, 1527, 1563, 1529, 1563, 4, 1530, 1563, 1577, - 4, 1531, 1493, 1581, 1499, 1581, 5, 1530, 803, 1587, 9, 1587, - 1581, 1587, 1, 974, 1, 975, 1, 982, 1, 983, 0, 204, - 0, 195, 0, 881, 0, 463, 0, 212, 0, 900, 0, 480, - 0, 194, 0, 880, 0, 462, 0, 213, 0, 901, 0, 481, - 0, 205, 0, 216, 0, 217, 1, 446, 0, 448, 0, 415, - 0, 421, 1, 92, 0, 92, 1, 94, 1645, 1647, 1, 93, - 88, 1650, 1645, 1653, 0, 93, 1, 95, 1657, 1659, 0, 108, - 0, 109, 1, 360, 0, 368, 0, 358, 0, 414, 1, 447, - 1637, 1675, 0, 449, 1635, 1679, 0, 191, 0, 877, 0, 473, - 1, 473, 0, 459, 1, 459, 0, 891, 0, 207, 0, 458, - 0, 876, 0, 190, 1, 458, 0, 472, 0, 890, 0, 206, - 1, 472, 1, 977, 1, 976, 0, 399, 0, 398, 0, 397, - 7, 1722, 0, 275, 0, 269, 241, 1728, 0, 270, 1, 279, - 0, 321, 0, 274, 0, 271, 1, 278, 0, 320, 1, 277, - 241, 1746, 0, 319, 265, 1750, 1, 276, 0, 318, 1, 926, - 0, 1518, 0, 950, 0, 1519, 0, 951, 1, 998, 1, 999, - 0, 575, 0, 1478, 0, 282, 0, 1479, 0, 283, 0, 369, - 0, 359, 1667, 1785, 0, 420, 1, 422, 1, 927, 1, 1421, - 5, 1794, 1419, 1797, 3, 1794, 1799, 1801, 0, 527, 2, 1804, - 525, 1807, 4, 1804, 1809, 1811, 1, 671, 4, 1814, 669, 1817, - 2, 1814, 1819, 1821, 0, 1293, 3, 1824, 1291, 1827, 5, 1824, - 1829, 1831, 1, 1425, 2, 1834, 1419, 1837, 4, 1834, 1839, 1841, - 0, 531, 5, 1844, 525, 1847, 3, 1844, 1849, 1851, 1, 675, - 3, 1854, 669, 1857, 5, 1854, 1859, 1861, 0, 1297, 4, 1864, - 1291, 1867, 2, 1864, 1869, 1871, 1, 1422, 0, 528, 1, 672, - 0, 1294, 1, 1426, 0, 532, 1, 676, 0, 1298, 1, 123, - 0, 79, 1, 993, 0, 124, 1, 80, 0, 1210, 0, 1184, - 0, 125, 1891, 1905, 1, 81, 1893, 1909, 1, 122, 1897, 1913, - 0, 78, 1899, 1917, 0, 1208, 0, 1182, 1, 992, 1, 361, - 1671, 1927, 0, 574, 1, 984, 1, 985, 1, 114, 9, 1937, - 0, 68, 1, 980, 955, 1942, 9, 1942, 0, 568, 9, 1949, - 1, 924, 1, 925, 0, 306, 375, 1957, 0, 308, 1413, 1961, - 0, 26, 1, 306, 1, 308, 1, 714, 0, 1142, 0, 1448, - 0, 1450, 1, 1450, 1413, 1979, 0, 1474, 0, 54, 0, 56, - 1, 1472, 0, 1326, 0, 60, 1, 60, 0, 1166, 0, 40, - 1, 956, 973, 2001, 973, 2000, 0, 556, 1, 22, 0, 1475, - 1, 1165, 1168, 2012, 1169, 2013, 2015, 2017, 1168, 2013, 1169, 2012, - 2021, 2023, 1, 1167, 2, 2027, 1197, 2029, 1997, 2031, 0, 57, - 1, 957, 0, 1451, 1980, 2039, 1979, 2039, 1413, 2042, 1413, 2039, - 1979, 2046, 1, 1449, 5, 2051, 1451, 2053, 1975, 2055, 1, 1451, - 1977, 2059, 1413, 2061, 0, 307, 1967, 2065, 375, 2067, 0, 309, - 1969, 2071, 1413, 2073, 0, 41, 1, 307, 1958, 2079, 1957, 2079, - 375, 2082, 375, 2079, 1957, 2086, 1, 309, 1962, 2091, 1961, 2091, - 1413, 2094, 1413, 2091, 1961, 2098, 1, 41, 2, 2103, 43, 2105, - 1999, 2107, 1, 1143, 5, 2111, 1171, 2113, 1973, 2115, 1, 561, - 564, 2118, 565, 2119, 2121, 2123, 564, 2119, 565, 2118, 2127, 2129, - 0, 91, 7, 2132, 0, 569, 1, 981, 9, 2139, 955, 2139, - 0, 69, 9, 2145, 1, 115, 0, 432, 0, 500, 0, 1245, - 0, 1237, 0, 501, 0, 433, 1, 1415, 1, 348, 1, 388, - 1, 826, 1, 126, 1, 1376, 1, 380, 1, 814, 1, 118, - 1, 302, 1, 710, 1, 102, 1, 402, 1, 834, 1, 130, - 1, 404, 1, 836, 1, 132, 1, 314, 1, 732, 1, 104, - 0, 1236, 0, 1244, 1, 1414, 0, 202, 1, 888, 1, 202, - 1603, 2215, 0, 106, 1, 106, 1663, 2221, 1, 794, 0, 366, - 0, 84, 1, 786, 1, 84, 1941, 2233, 1, 390, 1, 994, - 1, 450, 1, 105, 1, 733, 1, 405, 1, 315, 1, 837, - 1, 133, 1, 407, 1, 451, 1, 391, 1, 1383, 0, 905, - 1, 905, 0, 1477, 1, 1477, 1775, 2269, 6, 2269, 7, 2269, - 6, 2268, 2275, 2277, 1983, 2269, 7, 2268, 2273, 2283, 0, 281, - 1, 281, 1777, 2289, 6, 2289, 7, 2289, 6, 2288, 2295, 2297, - 1987, 2289, 7, 2288, 2293, 2303, 1, 1387, 1, 406, 2227, 2309, - 1, 995, 0, 461, 1, 461, 1621, 2317, 1699, 2317, 0, 1261, - 1, 1261, 0, 879, 0, 193, 1, 879, 1619, 2331, 1701, 2331, - 1, 193, 1617, 2337, 1703, 2337, 0, 1579, 0, 211, 9, 2344, - 1, 1579, 1, 211, 1623, 2351, 1711, 2351, 0, 479, 241, 2356, - 0, 899, 483, 2360, 0, 227, 1, 479, 1627, 2367, 1707, 2367, - 1, 899, 1625, 2373, 1709, 2373, 1, 227, 0, 1273, 0, 1593, - 0, 239, 1, 1273, 1, 1593, 1, 239, 0, 478, 2367, 2393, - 1, 478, 2359, 2397, 1615, 2397, 2357, 2397, 1687, 2397, 0, 1272, - 2387, 2407, 1, 1272, 2381, 2411, 0, 898, 2373, 2415, 0, 210, - 2351, 2419, 1, 898, 2363, 2423, 1613, 2423, 2361, 2423, 1695, 2423, - 1, 210, 2347, 2433, 1611, 2433, 2345, 2433, 1697, 2433, 0, 1592, - 2389, 2443, 0, 192, 9, 2446, 2337, 2449, 2337, 2447, 1, 1592, - 2383, 2455, 1, 192, 1605, 2459, 2329, 2459, 1683, 2459, 0, 460, - 241, 2466, 2317, 2469, 2317, 2467, 0, 878, 483, 2474, 2331, 2477, - 2331, 2475, 0, 238, 2391, 2483, 1, 460, 1609, 2487, 2315, 2487, - 1691, 2487, 1, 878, 1607, 2495, 2327, 2495, 1685, 2495, 1, 238, - 2385, 2503, 0, 1260, 2325, 2507, 0, 1578, 2349, 2511, 0, 226, - 2379, 2515, 1, 1260, 2323, 2519, 1, 1578, 2343, 2523, 1, 226, - 2365, 2527, 1, 349, 1, 127, 1, 827, 1, 389, 1, 119, - 1, 815, 1, 381, 1, 1377, 1, 131, 1, 835, 1, 303, - 1, 403, 1, 711, 1, 103, 1, 1366, 1, 694, 1, 702, - 9, 2563, 0, 572, 1, 572, 1931, 2569, 0, 1516, 1, 1516, - 1761, 2575, 7, 2575, 6, 2574, 2579, 2581, 6, 2575, 7, 2574, - 2585, 2587, 0, 944, 0, 948, 1, 578, 587, 2595, 1, 948, - 1763, 2599, 7, 2599, 6, 2598, 2603, 2605, 6, 2599, 7, 2598, - 2609, 2611, 1, 1186, 1, 996, 3, 2616, 1, 544, 1, 465, - 471, 2622, 1687, 2625, 1, 197, 203, 2628, 1697, 2631, 1, 883, - 889, 2634, 1695, 2637, 1, 181, 189, 2640, 1683, 2643, 0, 445, - 1693, 2647, 1713, 2647, 265, 2646, 1675, 2653, 2257, 2647, 375, 2647, - 457, 2647, 1, 445, 264, 2662, 241, 2662, 1679, 2667, 375, 2662, - 457, 2662, 1691, 2673, 1, 865, 875, 2676, 1685, 2679, 0, 215, - 7, 2682, 1, 215, 1633, 2687, 1, 1563, 0, 457, 241, 2692, - 2317, 2695, 1, 457, 241, 2698, 445, 2699, 445, 2698, 1691, 2705, - 0, 875, 483, 2708, 2331, 2711, 1, 875, 865, 2714, 1685, 2717, - 0, 189, 9, 2720, 2337, 2723, 1, 189, 181, 2726, 1683, 2729, - 0, 203, 7, 2732, 2215, 2735, 11, 2732, 2351, 2739, 0, 471, - 7, 2742, 1689, 2745, 265, 2742, 2367, 2749, 0, 889, 587, 2752, - 2373, 2755, 1, 203, 1629, 2759, 197, 2758, 1697, 2763, 1, 471, - 265, 2766, 2647, 2769, 465, 2766, 1687, 2773, 1, 889, 883, 2776, - 1695, 2779, 0, 107, 7, 2782, 2221, 2785, 1, 107, 1665, 2789, - 1, 795, 0, 367, 2255, 2795, 375, 2795, 7, 2794, 1, 367, - 265, 2802, 1783, 2805, 0, 85, 7, 2808, 2233, 2811, 0, 357, - 7, 2814, 1927, 2817, 1, 85, 2145, 2821, 1, 357, 265, 2824, - 1785, 2827, 1, 787, 0, 573, 483, 2832, 2569, 2835, 1, 579, - 1, 573, 1773, 2841, 1, 997, 1, 545, 1, 1187, 903, 2849, - 1, 1367, 0, 949, 7, 2854, 2599, 2857, 0, 945, 483, 2861, - 1, 949, 1767, 2865, 0, 1517, 7, 2868, 2575, 2871, 1, 1517, - 1765, 2875, 1, 703, 1, 695, 1, 332, 1, 266, 1731, 2885, - 1733, 2885, 1, 1012, 1, 30, 113, 2892, 0, 316, 265, 2896, - 375, 2897, 0, 272, 7, 2902, 1735, 2903, 1, 736, 803, 2908, - 1, 316, 1737, 2913, 375, 2912, 1, 272, 1727, 2919, 241, 2918, - 0, 1374, 2545, 2925, 1, 1374, 1363, 2928, 1, 1382, 0, 904, - 483, 2934, 2265, 2937, 1, 904, 0, 1476, 7, 2942, 2269, 2945, - 1, 1476, 1779, 2949, 2011, 2949, 0, 280, 7, 2954, 2289, 2957, - 1, 280, 1781, 2961, 2035, 2961, 1, 1386, 1, 99, 1, 991, - 0, 1181, 2, 2972, 0, 347, 2165, 2977, 1, 347, 1, 263, - 273, 2983, 272, 2982, 2985, 2987, 272, 2983, 273, 2982, 2991, 2993, - 0, 77, 0, 1207, 5, 2998, 1, 77, 5, 3002, 1917, 3005, - 9, 3003, 0, 121, 7, 3010, 1913, 3013, 9, 3011, 0, 387, - 2259, 3019, 1, 121, 9, 3023, 1, 825, 483, 3027, 1, 387, - 241, 3030, 241, 3031, 1, 98, 0, 1206, 2, 3038, 0, 386, - 2237, 3043, 3033, 3043, 1, 386, 241, 3048, 1, 824, 483, 3052, - 1, 990, 3, 3056, 0, 120, 3023, 3061, 9, 3063, 0, 1180, - 5, 3066, 1, 120, 3016, 3071, 5, 3070, 1897, 3075, 3013, 3075, - 3011, 3071, 9, 3080, 9, 3070, 9, 3071, 3011, 3086, 0, 76, - 3008, 3091, 7, 3090, 1899, 3095, 3005, 3095, 3003, 3091, 9, 3100, - 9, 3091, 3003, 3104, 0, 346, 2531, 3109, 1, 76, 2997, 3113, - 9, 3115, 1, 776, 1, 346, 241, 3120, 2977, 3123, 1, 21, - 2, 3127, 1275, 3129, 9, 3131, 4, 3126, 3133, 3135, 2, 3126, - 668, 3139, 3135, 3141, 587, 3139, 9, 3144, 3135, 3147, 9, 3139, - 587, 3150, 3135, 3153, 100, 3126, 129, 3126, 129, 3127, 100, 3127, - 89, 3127, 11, 3164, 11, 3127, 89, 3169, 89, 3168, 89, 3126, - 0, 25, 2243, 3177, 2547, 3177, 2539, 3177, 2533, 3177, 3024, 3177, - 3, 3177, 1369, 3189, 11, 3191, 5, 3176, 3193, 3195, 3, 3176, - 524, 3199, 3195, 3201, 483, 3199, 11, 3204, 3195, 3207, 11, 3199, - 483, 3210, 3195, 3213, 3023, 3177, 9, 3216, 101, 3177, 128, 3177, - 113, 3177, 9, 3224, 9, 3177, 3023, 3228, 113, 3228, 1, 33, - 5, 3234, 6, 3237, 2997, 3235, 9, 3241, 3177, 3235, 67, 3235, - 9, 3247, 67, 3234, 3239, 3251, 1, 25, 128, 3254, 101, 3254, - 113, 3255, 9, 3254, 113, 3262, 113, 3254, 9, 3266, 9, 3267, - 0, 33, 2759, 3273, 2789, 3273, 2821, 3273, 9, 3273, 67, 3272, - 9, 3283, 1, 251, 298, 3286, 395, 3286, 395, 3287, 298, 3287, - 257, 3287, 265, 3297, 265, 3296, 265, 3287, 257, 3302, 265, 3286, - 0, 305, 2249, 3309, 2553, 3309, 2543, 3309, 2537, 3309, 3034, 3309, - 3031, 3309, 241, 3320, 3235, 3309, 299, 3309, 394, 3309, 375, 3309, - 241, 3330, 241, 3309, 3031, 3334, 375, 3334, 241, 3308, 375, 3341, - 1, 331, 2647, 3345, 413, 3345, 241, 3344, 1369, 3344, 341, 3344, - 0, 253, 7, 3356, 265, 3356, 3345, 3357, 1, 555, 923, 3364, - 923, 3365, 704, 3364, 829, 3364, 829, 3365, 704, 3365, 0, 713, - 2245, 3379, 2549, 3379, 2541, 3379, 2535, 3379, 3028, 3379, 3027, 3379, - 483, 3390, 3235, 3379, 705, 3379, 828, 3379, 803, 3379, 483, 3400, - 483, 3379, 3027, 3404, 803, 3404, 1, 759, 3, 3410, 6, 3413, - 3273, 3411, 767, 3410, 3415, 3419, 0, 559, 0, 251, 413, 3424, - 413, 3425, 257, 3425, 413, 3431, 412, 3430, 3433, 3435, 412, 3431, - 413, 3430, 3439, 3441, 1, 305, 3, 3445, 375, 3447, 3, 3444, - 394, 3444, 299, 3444, 241, 3444, 375, 3456, 375, 3444, 241, 3460, - 1, 253, 265, 3464, 0, 555, 4, 3469, 15, 3471, 483, 3473, - 2, 3468, 3475, 3477, 4, 3468, 524, 3481, 3477, 3483, 11, 3481, - 483, 3486, 3477, 3489, 483, 3481, 11, 3492, 3477, 3495, 1, 713, - 5, 3499, 17, 3501, 587, 3503, 3, 3498, 3505, 3507, 5, 3498, - 668, 3511, 3507, 3513, 9, 3511, 587, 3516, 3507, 3519, 587, 3511, - 9, 3522, 3507, 3525, 828, 3498, 705, 3498, 483, 3498, 803, 3532, - 803, 3498, 483, 3536, 1, 559, 903, 3540, 1, 955, 980, 3544, - 3, 3544, 973, 3549, 973, 3548, 973, 3545, 2139, 3555, 1011, 3544, - 973, 3544, 3, 3560, 0, 1141, 2, 3564, 9, 3565, 3411, 3565, - 0, 1447, 9, 3573, 3411, 3573, 1, 1471, 4, 3579, 11, 3581, - 1369, 3583, 2, 3578, 3585, 3587, 4, 3578, 1418, 3591, 3587, 3593, - 15, 3591, 1369, 3596, 3587, 3599, 1369, 3591, 15, 3602, 3587, 3605, - 265, 3578, 2011, 3609, 0, 1325, 5, 3613, 9, 3615, 1275, 3617, - 3, 3612, 3619, 3621, 5, 3612, 1290, 3625, 3621, 3627, 17, 3625, - 1275, 3630, 3621, 3633, 1275, 3625, 17, 3636, 3621, 3639, 1, 53, - 265, 3642, 2035, 3645, 0, 59, 5, 3648, 1, 1141, 3177, 3653, - 3379, 3653, 3309, 3653, 0, 1163, 5, 3660, 1, 959, 3565, 3665, - 3273, 3665, 3573, 3665, 1, 1447, 3177, 3673, 3309, 3673, 3379, 3673, - 0, 1471, 7, 3680, 2269, 3683, 3345, 3681, 1, 1325, 1369, 3688, - 3357, 3689, 3681, 3689, 0, 39, 5, 3696, 1, 47, 3565, 3701, - 3573, 3701, 3273, 3701, 0, 53, 2, 3709, 587, 3711, 17, 3713, - 7, 3708, 2289, 3717, 4, 3708, 3715, 3721, 2, 3708, 1290, 3725, - 3721, 3727, 1275, 3725, 17, 3730, 3721, 3733, 17, 3725, 1275, 3736, - 3721, 3739, 3345, 3709, 3689, 3709, 1, 59, 3, 3747, 483, 3749, - 15, 3751, 5, 3746, 3753, 3755, 3, 3746, 1418, 3759, 3755, 3761, - 1369, 3759, 15, 3764, 3755, 3767, 15, 3759, 1369, 3770, 3755, 3773, - 1369, 3746, 3681, 3747, 3357, 3747, 3709, 3747, 1, 330, 1369, 3785, - 471, 3785, 367, 3785, 357, 3785, 341, 3785, 241, 3795, 0, 1162, - 17, 3799, 0, 758, 767, 3803, 0, 32, 2215, 3807, 2221, 3807, - 2233, 3807, 3249, 3807, 3246, 3807, 9, 3817, 3235, 3807, 67, 3820, - 9, 3823, 67, 3807, 3235, 3826, 9, 3829, 1, 758, 3807, 3833, - 1, 32, 3104, 3837, 3284, 3837, 3091, 3837, 9, 3842, 3283, 3837, - 9, 3846, 3273, 3837, 67, 3851, 9, 3853, 9, 3837, 3283, 3856, - 3091, 3856, 0, 1470, 3785, 3863, 0, 24, 2203, 3867, 3259, 3867, - 2191, 3867, 3257, 3867, 2179, 3867, 2895, 3867, 2171, 3867, 3265, 3867, - 3269, 3867, 3085, 3867, 3071, 3867, 9, 3889, 3267, 3867, 9, 3893, - 2893, 3867, 113, 3897, 3263, 3867, 113, 3901, 3255, 3867, 101, 3905, - 128, 3905, 113, 3905, 9, 3910, 9, 3905, 113, 3914, 3837, 3867, - 128, 3867, 101, 3867, 9, 3867, 113, 3924, 113, 3867, 9, 3928, - 1, 24, 3220, 3933, 3222, 3933, 3232, 3933, 3226, 3933, 3224, 3933, - 9, 3942, 3228, 3933, 113, 3946, 3177, 3933, 101, 3950, 128, 3950, - 113, 3950, 9, 3956, 9, 3950, 113, 3960, 128, 3933, 3177, 3964, - 101, 3933, 3177, 3968, 9, 3933, 3224, 3972, 3177, 3972, 113, 3976, - 113, 3972, 3177, 3980, 113, 3933, 3228, 3984, 3177, 3984, 9, 3988, - 9, 3984, 3177, 3992, 0, 712, 2201, 3997, 3531, 3997, 2189, 3997, - 3529, 3997, 2177, 3997, 2911, 3997, 2169, 3997, 3535, 3997, 3539, 3997, - 3055, 3997, 3053, 3997, 483, 4019, 3537, 3997, 483, 4023, 2909, 3997, - 803, 4027, 3533, 3997, 803, 4031, 3499, 3997, 705, 4035, 828, 4035, - 803, 4035, 483, 4040, 483, 4035, 803, 4044, 3837, 3997, 828, 3997, - 705, 3997, 483, 3997, 803, 4054, 803, 3997, 483, 4058, 0, 52, - 3785, 4063, 0, 304, 2199, 4067, 3455, 4067, 2187, 4067, 3453, 4067, - 2175, 4067, 2917, 4067, 2167, 4067, 3459, 4067, 3463, 4067, 3051, 4067, - 3049, 4067, 241, 4089, 3461, 4067, 241, 4093, 2913, 4067, 375, 4097, - 3457, 4067, 375, 4101, 3445, 4067, 299, 4105, 394, 4105, 375, 4105, - 241, 4110, 241, 4105, 375, 4114, 3837, 4067, 394, 4067, 299, 4067, - 241, 4067, 375, 4124, 375, 4067, 241, 4128, 0, 38, 17, 4133, - 0, 252, 265, 4137, 3785, 4137, 0, 558, 17, 4143, 1, 712, - 3396, 4147, 3398, 4147, 3408, 4147, 3402, 4147, 3400, 4147, 483, 4156, - 3404, 4147, 803, 4160, 3379, 4147, 705, 4164, 828, 4164, 803, 4164, - 483, 4170, 483, 4164, 803, 4174, 9, 4147, 828, 4147, 3379, 4180, - 705, 4147, 3379, 4184, 483, 4147, 3400, 4188, 3379, 4188, 803, 4192, - 803, 4188, 3379, 4196, 803, 4147, 3404, 4200, 3379, 4200, 483, 4204, - 483, 4200, 3379, 4208, 1, 304, 3326, 4213, 3328, 4213, 3338, 4213, - 3332, 4213, 3330, 4213, 241, 4222, 3334, 4213, 375, 4226, 3309, 4213, - 299, 4230, 394, 4230, 375, 4230, 241, 4236, 241, 4230, 375, 4240, - 9, 4213, 394, 4213, 3309, 4246, 299, 4213, 3309, 4250, 241, 4213, - 3330, 4254, 3309, 4254, 375, 4258, 375, 4254, 3309, 4262, 375, 4213, - 3334, 4266, 3309, 4266, 241, 4270, 241, 4266, 3309, 4274, 0, 1446, - 3833, 4279, 0, 1140, 3833, 4283, 1, 1446, 3867, 4287, 3997, 4287, - 4067, 4287, 1, 46, 4279, 4295, 3807, 4295, 4283, 4295, 1, 1140, - 3867, 4303, 4067, 4303, 3997, 4303, 1, 58, 1369, 4311, 4063, 4311, - 3863, 4311, 4137, 4311, 1, 958, 3807, 4321, 4279, 4321, 4283, 4321, - 1, 1324, 1369, 4329, 3863, 4329, 4063, 4329, 4137, 4329, 1, 214, - 1631, 4339, 2685, 4339, 0, 214, 1, 1562, 1, 444, 449, 4349, - 7, 4349, 265, 4353, 2647, 4355, 2658, 4349, 251, 4349, 2647, 4349, - 375, 4362, 375, 4349, 2647, 4366, 0, 444, 2701, 4371, 1689, 4371, - 1705, 4371, 447, 4371, 2665, 4371, 2241, 4371, 3785, 4371, 2671, 4371, - 265, 4371, 331, 4371, 2663, 4371, 375, 4393, 375, 4371, 1, 510, - 257, 4399, 1, 1058, 0, 1396, 0, 1406, 0, 628, 375, 4409, - 1, 652, 1, 288, 1, 267, 1741, 4417, 1, 1013, 1, 1375, - 1, 333, 2903, 4425, 3361, 4425, 0, 1375, 2931, 4431, 2173, 4431, - 1, 273, 2905, 4437, 1739, 4437, 6, 4436, 7, 4437, 4443, 4445, - 6, 4437, 3359, 4437, 7, 4436, 4449, 4453, 0, 273, 2883, 4457, - 2913, 4457, 3351, 4457, 3457, 4457, 2923, 4457, 1749, 4457, 1743, 4457, - 1, 31, 3224, 4473, 3177, 4473, 113, 4476, 113, 4473, 3177, 4480, - 1, 737, 3400, 4485, 3379, 4485, 803, 4488, 803, 4485, 3379, 4492, - 1, 317, 2903, 4497, 3361, 4497, 2900, 4497, 7, 4497, 265, 4505, - 2897, 4507, 1753, 4497, 1745, 4497, 3330, 4497, 2897, 4497, 375, 4516, - 3309, 4497, 375, 4520, 375, 4497, 2897, 4524, 3309, 4524, 0, 317, - 7, 4530, 2913, 4531, 375, 4535, 375, 4531, 1, 507, 1, 245, - 0, 1397, 1, 913, 0, 1407, 1, 653, 11, 4551, 1, 289, - 1, 629, 713, 4557, 25, 4557, 305, 4557, 0, 629, 375, 4565, - 0, 340, 3785, 4569, 4311, 4569, 4329, 4569, 4555, 4569, 0, 766, - 1413, 4579, 922, 4579, 903, 4579, 483, 4584, 483, 4579, 903, 4588, - 0, 66, 75, 4593, 7, 4593, 3113, 4593, 9, 4599, 3251, 4593, - 9, 4603, 375, 4593, 483, 4593, 9, 4593, 1, 340, 331, 4613, - 1, 766, 483, 4616, 2591, 4617, 483, 4621, 1, 66, 5, 4624, - 6, 4627, 3248, 4625, 1941, 4625, 9, 4633, 36, 4625, 3247, 4625, - 9, 4638, 9, 4624, 1941, 4643, 3807, 4643, 33, 4625, 9, 4648, - 9, 4625, 3247, 4652, 33, 4652, 3807, 4625, 9, 4659, 0, 1170, - 2615, 4663, 903, 4665, 0, 112, 3972, 4669, 3270, 4669, 3086, 4669, - 1938, 4669, 1937, 4669, 9, 4678, 2564, 4669, 3071, 4669, 9, 4684, - 3267, 4669, 9, 4688, 2563, 4669, 9, 4692, 9, 4669, 3267, 4696, - 3933, 4696, 1937, 4696, 3071, 4696, 2563, 4696, 3933, 4669, 9, 4708, - 1, 1170, 1413, 4713, 922, 4713, 483, 4713, 903, 4718, 903, 4713, - 483, 4722, 1, 112, 2, 4727, 7, 4729, 3261, 4727, 9, 4733, - 25, 4727, 903, 4727, 587, 4727, 9, 4727, 0, 972, 3059, 4745, - 1925, 4745, 3563, 4745, 3553, 4745, 3549, 4745, 3547, 4745, 2005, 4745, - 2001, 4745, 1595, 4745, 1945, 4745, 1599, 4745, 2239, 4745, 1717, 4745, - 2619, 4745, 1769, 4745, 1947, 4745, 1933, 4745, 1943, 4745, 955, 4781, - 9, 4781, 0, 802, 807, 4787, 375, 4787, 7, 4787, 805, 4793, - 265, 4793, 483, 4787, 0, 144, 483, 4801, 1, 972, 3551, 4805, - 2003, 4805, 375, 4805, 955, 4805, 9, 4805, 1011, 4805, 1, 802, - 713, 4819, 483, 4819, 1, 144, 0, 256, 2309, 4827, 4437, 4827, - 264, 4826, 299, 4833, 264, 4827, 367, 4837, 265, 4826, 2309, 4841, - 4805, 4827, 4613, 4827, 375, 4827, 510, 4827, 483, 4827, 9, 4852, - 9, 4827, 483, 4856, 0, 1504, 1, 256, 2798, 4863, 7, 4863, - 265, 4867, 264, 4862, 264, 4863, 2795, 4863, 375, 4874, 265, 4862, - 4873, 4879, 305, 4863, 713, 4863, 25, 4863, 375, 4863, 2795, 4888, - 265, 4863, 4871, 4893, 1, 164, 0, 374, 241, 4899, 0, 1346, - 9, 4903, 0, 154, 0, 1412, 2853, 4909, 2163, 4909, 0, 1418, - 1, 1346, 1, 154, 483, 4919, 1, 1412, 241, 4922, 1, 1290, - 4915, 4927, 1, 1280, 1, 246, 0, 566, 2596, 4935, 586, 4934, - 705, 4939, 586, 4935, 795, 4943, 2595, 4935, 587, 4946, 587, 4935, - 2595, 4950, 0, 1086, 375, 4955, 0, 922, 1759, 4959, 2265, 4959, - 3367, 4959, 4421, 4959, 1953, 4959, 1, 566, 5, 4971, 6, 4973, - 1950, 4971, 1949, 4971, 9, 4978, 586, 4970, 586, 4971, 587, 4970, - 4985, 4987, 4827, 4971, 9, 4971, 1949, 4992, 4745, 4971, 4569, 4971, - 587, 4971, 4983, 5001, 1, 1086, 9, 5005, 1, 922, 3369, 5009, - 555, 5009, 257, 5009, 1, 932, 0, 88, 3171, 5019, 10, 5018, - 101, 5023, 101, 5019, 10, 5019, 107, 5029, 0, 934, 375, 5033, - 0, 1108, 587, 5037, 1, 1362, 265, 5041, 1, 88, 93, 5045, - 1643, 5047, 93, 5044, 1645, 5051, 1645, 5045, 2135, 5045, 973, 5044, - 4745, 5059, 3163, 5045, 3173, 5045, 3167, 5045, 7, 5044, 10, 5044, - 10, 5045, 11, 5044, 3807, 5075, 5073, 5075, 33, 5045, 21, 5045, - 973, 5045, 4805, 5085, 3807, 5045, 4279, 5045, 4283, 5045, 4745, 5045, - 11, 5045, 5071, 5097, 1, 1304, 1, 1108, 973, 5103, 972, 5102, - 5105, 5107, 972, 5103, 973, 5102, 5111, 5113, 257, 5103, 0, 260, - 0, 580, 0, 136, 0, 668, 1, 260, 4139, 5127, 4138, 5127, - 264, 5126, 5131, 5133, 264, 5127, 4137, 5137, 265, 5126, 4137, 5141, - 5137, 5142, 5129, 5141, 5138, 5141, 5137, 5141, 4137, 5150, 265, 5127, - 4137, 5154, 5133, 5157, 5133, 5155, 4137, 5161, 4137, 5127, 265, 5165, - 5137, 5167, 265, 5164, 5133, 5171, 1, 580, 1, 136, 5019, 5177, - 1, 524, 5125, 5181, 1, 296, 5019, 5185, 0, 1413, 2559, 5189, - 2209, 5189, 4925, 5189, 0, 1419, 5181, 5197, 1, 295, 973, 5201, - 972, 5201, 49, 5201, 48, 5201, 972, 5200, 5203, 5211, 973, 5200, - 5205, 5215, 48, 5200, 5207, 5219, 49, 5200, 5209, 5223, 1, 1413, - 1417, 5227, 1, 1291, 5125, 5231, 5197, 5231, 0, 1087, 375, 5237, - 0, 923, 1793, 5241, 2941, 5241, 5012, 5241, 3543, 5241, 3559, 5241, - 2891, 5241, 5017, 5241, 1955, 5241, 555, 5241, 5009, 5258, 5009, 5241, - 555, 5262, 1, 1087, 5037, 5267, 1, 923, 555, 5270, 4959, 5273, - 241, 5270, 4959, 5277, 4959, 5271, 555, 5281, 1, 933, 4959, 5285, - 0, 935, 375, 5289, 0, 1109, 5005, 5293, 1, 935, 0, 669, - 4927, 5299, 1, 525, 4915, 5303, 5299, 5303, 1, 669, 1, 297, - 0, 341, 483, 5313, 3747, 5313, 3689, 5313, 3345, 5313, 4415, 5313, - 0, 257, 2255, 5325, 4888, 5325, 4881, 5325, 3467, 5325, 2919, 5325, - 4871, 5325, 4893, 5336, 4894, 5325, 7, 5324, 4863, 5343, 4872, 5325, - 4879, 5347, 4869, 5325, 4893, 5325, 4871, 5352, 5343, 5353, 3, 5325, - 5, 5358, 4862, 5360, 4863, 5361, 5363, 5365, 5343, 5364, 4862, 5361, - 4863, 5360, 5371, 5373, 5344, 5361, 5343, 5361, 4863, 5378, 5, 5325, - 3, 5382, 4862, 5384, 4863, 5385, 5387, 5389, 5343, 5388, 4862, 5385, - 4863, 5384, 5395, 5397, 5344, 5385, 5343, 5385, 4863, 5402, 264, 5325, - 4863, 5406, 4879, 5409, 5344, 5407, 5343, 5407, 4863, 5414, 4863, 5407, - 4871, 5419, 5343, 5418, 7, 5325, 265, 5425, 4863, 5427, 266, 5325, - 375, 5325, 4863, 5432, 510, 5325, 483, 5325, 9, 5438, 9, 5325, - 483, 5442, 251, 5325, 265, 5446, 265, 5447, 4892, 5325, 265, 5325, - 257, 5454, 1, 5457, 7, 5455, 5459, 5461, 0, 5461, 5457, 5465, - 251, 5454, 4863, 5454, 4863, 5325, 3, 5472, 5, 5474, 5, 5472, - 3, 5478, 375, 5472, 7, 5473, 5361, 5485, 5385, 5485, 5477, 5485, - 5481, 5485, 5407, 5485, 264, 5472, 4879, 5497, 5485, 5497, 264, 5473, - 4893, 5503, 265, 5472, 265, 5324, 4417, 5509, 251, 5509, 1, 341, - 5325, 5515, 331, 5514, 1, 257, 445, 5521, 265, 5522, 449, 5521, - 448, 5521, 414, 5521, 415, 5521, 421, 5521, 420, 5521, 253, 5521, - 265, 5538, 340, 5521, 341, 5521, 272, 5520, 241, 5546, 273, 5521, - 5549, 5551, 272, 5521, 273, 5520, 412, 5521, 251, 5559, 241, 5520, - 265, 5562, 5551, 5565, 272, 5563, 5557, 5569, 500, 5521, 432, 5521, - 501, 5521, 413, 5520, 5525, 5579, 5529, 5579, 5533, 5579, 5535, 5579, - 5555, 5579, 5541, 5579, 251, 5579, 5559, 5592, 5560, 5579, 5559, 5579, - 251, 5598, 5577, 5579, 433, 5521, 5579, 5605, 264, 5520, 5543, 5609, - 367, 5609, 264, 5521, 299, 5615, 412, 5520, 5527, 5619, 5531, 5619, - 5537, 5619, 5551, 5619, 5573, 5619, 5575, 5619, 413, 5521, 375, 5632, - 5619, 5635, 251, 5632, 5619, 5639, 5619, 5633, 251, 5643, 483, 5632, - 5619, 5647, 9, 5632, 5619, 5651, 7, 5521, 265, 5654, 5609, 5657, - 265, 5655, 5615, 5661, 2227, 5521, 375, 5665, 4841, 5521, 375, 5669, - 375, 5520, 2227, 5673, 4841, 5673, 4827, 5673, 375, 5521, 413, 5680, - 5619, 5683, 413, 5681, 5559, 5687, 483, 5521, 413, 5690, 5619, 5693, - 413, 5691, 5559, 5697, 9, 5521, 413, 5700, 5619, 5703, 413, 5701, - 5559, 5707, 251, 5521, 413, 5710, 5619, 5713, 413, 5711, 5559, 5717, - 265, 5521, 445, 5720, 5579, 5723, 253, 5720, 5579, 5727, 7, 5720, - 5609, 5731, 4827, 5521, 3, 5735, 5, 5736, 5, 5735, 3, 5740, - 375, 5735, 7, 5734, 5739, 5747, 5743, 5747, 264, 5735, 5747, 5753, - 265, 5735, 265, 5520, 2647, 5759, 5545, 5759, 1783, 5759, 241, 5758, - 5551, 5767, 0, 1171, 4714, 5771, 4716, 5771, 4720, 5771, 4724, 5771, - 2850, 5771, 1413, 5771, 4713, 5782, 922, 5771, 4713, 5786, 4718, 5771, - 903, 5790, 2849, 5771, 903, 5794, 483, 5771, 4722, 5798, 903, 5798, - 4713, 5802, 4713, 5798, 903, 5806, 4722, 5771, 483, 5810, 903, 5771, - 4718, 5814, 2849, 5814, 483, 5814, 4713, 5820, 4713, 5814, 483, 5824, - 4713, 5771, 1413, 5828, 922, 5828, 483, 5828, 903, 5834, 903, 5828, - 483, 5838, 0, 973, 1895, 5843, 2037, 5843, 1597, 5843, 1601, 5843, - 2142, 5843, 2313, 5843, 4810, 5843, 1715, 5843, 1771, 5843, 1935, 5843, - 2140, 5843, 2139, 5843, 955, 5866, 9, 5866, 375, 5843, 4805, 5872, - 483, 5843, 9, 5843, 2139, 5878, 955, 5843, 2139, 5882, 1011, 5843, - 4805, 5843, 375, 5888, 1, 1171, 3, 5892, 4663, 5895, 903, 5897, - 483, 5892, 4663, 5901, 903, 5903, 4663, 5893, 1413, 5907, 922, 5907, - 483, 5907, 903, 5912, 903, 5907, 483, 5916, 1, 973, 956, 5920, - 4745, 5923, 88, 5920, 4745, 5927, 5, 5920, 4745, 5931, 1011, 5933, - 3, 5920, 955, 5936, 4745, 5939, 9, 5936, 4745, 5943, 4745, 5937, - 955, 5947, 9, 5947, 375, 5920, 4745, 5953, 955, 5920, 3, 5956, - 4745, 5959, 5325, 5921, 9, 5920, 3, 5964, 4745, 5967, 4745, 5921, - 375, 5971, 0, 767, 903, 5974, 4617, 5977, 483, 5979, 4617, 5975, - 1413, 5983, 922, 5983, 903, 5983, 483, 5988, 483, 5983, 903, 5992, - 0, 567, 4989, 5997, 4983, 5997, 5001, 6000, 5002, 5997, 4984, 5997, - 4987, 6007, 5001, 5997, 4983, 6010, 3, 5997, 7, 6014, 4970, 6016, - 4971, 6017, 6019, 6021, 4970, 6017, 4971, 6016, 6025, 6027, 7, 5997, - 3, 6030, 4970, 6032, 4971, 6033, 6035, 6037, 4970, 6033, 4971, 6032, - 6041, 6043, 3, 5996, 7, 6047, 2, 5996, 4992, 6051, 6015, 6051, - 7, 6055, 4971, 6057, 9, 6051, 4971, 6060, 4971, 6051, 9, 6064, - 586, 5997, 4971, 6068, 4987, 6071, 4971, 6069, 4983, 6075, 2, 5997, - 6048, 6079, 4971, 6081, 7, 6079, 6047, 6084, 4971, 6087, 4971, 6085, - 6047, 6091, 6047, 6079, 7, 6094, 4971, 6097, 4992, 5997, 587, 6101, - 2839, 5997, 587, 6105, 9, 5997, 4971, 6108, 587, 6111, 4971, 5997, - 2, 6115, 7, 6117, 4975, 6117, 586, 6114, 4987, 6123, 5, 6114, - 6, 6127, 6117, 6129, 6119, 6127, 586, 6115, 5001, 6135, 9, 6114, - 587, 6139, 587, 6115, 9, 6143, 0, 67, 4636, 6147, 37, 6147, - 3008, 6147, 4656, 6147, 4650, 6147, 7, 6146, 4643, 6159, 2233, 6159, - 4625, 6159, 9, 6165, 5, 6147, 6, 6169, 36, 6147, 4625, 6172, - 3807, 6173, 4648, 6147, 9, 6178, 3003, 6147, 9, 6182, 33, 6146, - 6151, 6187, 3856, 6187, 3837, 6187, 9, 6192, 9, 6187, 3837, 6196, - 33, 6147, 4652, 6200, 3807, 6201, 9, 6205, 9, 6200, 4625, 6208, - 3807, 6209, 4625, 6200, 9, 6214, 4652, 6147, 33, 6218, 9, 6147, - 4648, 6222, 3003, 6222, 33, 6222, 4625, 6228, 3807, 6229, 33, 6223, - 3837, 6235, 4625, 6222, 33, 6238, 4625, 6147, 75, 6243, 4629, 6243, - 7, 6243, 4627, 6249, 6171, 6243, 375, 6243, 36, 6242, 33, 6242, - 9, 6258, 9, 6242, 33, 6262, 0, 89, 5079, 6267, 5071, 6267, - 5097, 6270, 5098, 6267, 5072, 6267, 5075, 6277, 5097, 6267, 5071, 6280, - 107, 6267, 5, 6267, 7, 6286, 5044, 6288, 5045, 6289, 6291, 6293, - 5044, 6289, 5045, 6288, 6297, 6299, 7, 6267, 5, 6302, 5044, 6304, - 5045, 6305, 6307, 6309, 5044, 6305, 5045, 6304, 6313, 6315, 5, 6266, - 7, 6318, 5045, 6321, 7, 6319, 7, 6266, 5, 6326, 5045, 6329, - 5075, 6327, 2221, 6327, 5045, 6327, 4, 6266, 6287, 6339, 7, 6341, - 5045, 6343, 10, 6266, 5075, 6347, 2221, 6347, 5045, 6347, 10, 6267, - 5097, 6355, 5045, 6354, 5075, 6359, 5045, 6355, 5071, 6363, 1274, 6267, - 4, 6267, 6324, 6369, 5045, 6371, 7, 6369, 6319, 6374, 5045, 6377, - 5044, 6374, 5045, 6375, 6319, 6383, 6381, 6383, 5044, 6375, 5045, 6374, - 6389, 6391, 6319, 6369, 7, 6394, 5045, 6397, 6, 6267, 3, 6400, - 3, 6267, 6, 6404, 21, 6267, 11, 6409, 5045, 6411, 5045, 6267, - 10, 6414, 5075, 6417, 10, 6415, 5097, 6421, 5311, 6267, 11, 6266, - 2969, 6427, 5082, 6427, 5045, 6427, 21, 6432, 21, 6427, 5045, 6436, - 1, 767, 4580, 6441, 4582, 6441, 4586, 6441, 4590, 6441, 2862, 6441, - 1413, 6441, 4579, 6452, 922, 6441, 4579, 6456, 4584, 6441, 483, 6460, - 2861, 6441, 483, 6464, 759, 6440, 903, 6441, 4588, 6470, 483, 6470, - 4579, 6474, 4579, 6470, 483, 6478, 4588, 6441, 903, 6482, 483, 6441, - 4584, 6486, 2861, 6486, 903, 6486, 4579, 6492, 4579, 6486, 903, 6496, - 4579, 6441, 1413, 6500, 922, 6500, 903, 6500, 483, 6506, 483, 6500, - 903, 6510, 1, 567, 5, 6514, 6, 6517, 4935, 6517, 2137, 6515, - 9, 6523, 14, 6515, 2, 6515, 563, 6529, 4935, 6531, 6519, 6529, - 4935, 6535, 7, 6529, 6520, 6539, 4935, 6539, 6517, 6542, 6517, 6539, - 4935, 6546, 1197, 6529, 4935, 6551, 6, 6515, 5, 6554, 5, 6515, - 6, 6558, 5325, 6515, 903, 6515, 9, 6514, 4950, 6567, 587, 6567, - 4935, 6570, 4935, 6567, 587, 6574, 241, 6515, 4950, 6515, 9, 6581, - 587, 6515, 9, 6585, 4935, 6587, 4935, 6584, 9, 6591, 4935, 6515, - 2, 6594, 7, 6597, 5, 6595, 6539, 6601, 6599, 6601, 6, 6601, - 6597, 6607, 9, 6595, 587, 6611, 587, 6594, 9, 6615, 5843, 6515, - 5313, 6515, 587, 6514, 1, 67, 4594, 6625, 4606, 6625, 3280, 6625, - 75, 6625, 4593, 6632, 2146, 6625, 2145, 6625, 9, 6638, 7, 6625, - 73, 6643, 4593, 6645, 375, 6625, 4593, 6648, 33, 6624, 4593, 6653, - 9, 6655, 9, 6625, 3273, 6658, 2145, 6658, 4593, 6625, 75, 6664, - 375, 6664, 36, 6665, 33, 6665, 9, 6672, 9, 6665, 33, 6676, - 3273, 6625, 9, 6680, 1, 89, 1657, 6685, 25, 6685, 3565, 6685, - 3573, 6685, 3273, 6685, 21, 6684, 483, 6685, 5843, 6685, 11, 6684, - 0, 1487, 10, 6705, 7, 6705, 5, 6708, 5, 6705, 7, 6712, - 0, 1347, 0, 113, 2149, 6719, 9, 6721, 4736, 6719, 9, 6725, - 3023, 6719, 9, 6729, 4740, 6719, 9, 6733, 2879, 6719, 9, 6737, - 587, 6719, 4727, 6740, 9, 6743, 25, 6719, 4727, 6746, 9, 6749, - 4727, 6719, 5, 6753, 6, 6755, 4731, 6755, 2, 6752, 7, 6761, - 6755, 6763, 6757, 6761, 25, 6752, 9, 6769, 587, 6752, 9, 6773, - 9, 6753, 25, 6777, 587, 6777, 3255, 6719, 9, 6783, 0, 137, - 1, 113, 31, 6788, 2, 6788, 7, 6793, 4669, 6793, 4697, 6789, - 14, 6788, 6, 6789, 6, 6788, 5, 6804, 11, 6788, 5, 6808, - 5, 6788, 6, 6813, 6, 6812, 4696, 6813, 9, 6813, 4669, 6820, - 4669, 6813, 9, 6824, 7, 6788, 6815, 6829, 15, 6788, 6803, 6833, - 8, 6788, 8, 6789, 4669, 6839, 1368, 6789, 5, 6789, 35, 6845, - 4669, 6847, 6795, 6845, 4669, 6851, 6, 6845, 6796, 6855, 4669, 6855, - 6793, 6858, 6793, 6855, 4669, 6862, 1171, 6845, 4669, 6867, 17, 6845, - 4669, 6871, 7, 6789, 6811, 6875, 6807, 6875, 6817, 6875, 6801, 6875, - 2, 6874, 2, 6789, 7, 6886, 30, 6788, 3867, 6891, 25, 6788, - 4696, 6895, 3867, 6895, 9, 6899, 9, 6894, 3867, 6903, 4669, 6895, - 9, 6906, 9, 6895, 4669, 6910, 587, 6788, 4696, 6915, 9, 6915, - 4669, 6918, 4669, 6915, 9, 6922, 25, 6789, 4473, 6927, 6791, 6927, - 3972, 6927, 3933, 6927, 9, 6934, 9, 6927, 3933, 6938, 4696, 6789, - 6837, 6943, 25, 6943, 587, 6943, 9, 6789, 6837, 6951, 4669, 6953, - 587, 6951, 4669, 6957, 25, 6951, 4669, 6961, 4669, 6950, 25, 6965, - 6837, 6965, 587, 6965, 4669, 6789, 5, 6972, 6, 6975, 2, 6973, - 6855, 6979, 6977, 6979, 7, 6979, 6975, 6985, 25, 6973, 9, 6989, - 587, 6973, 9, 6993, 9, 6972, 6837, 6997, 25, 6997, 587, 6997, - 9, 6973, 6839, 7005, 9, 6788, 6799, 7009, 6840, 7009, 6839, 7009, - 4669, 7014, 4669, 7009, 6839, 7018, 25, 7008, 3867, 7023, 25, 7009, - 3933, 7027, 1, 137, 6267, 7031, 0, 375, 413, 7034, 413, 7035, - 241, 7034, 3307, 7041, 2885, 7041, 0, 261, 0, 803, 16, 7049, - 7, 7049, 4, 7052, 4, 7049, 7, 7056, 0, 581, 0, 145, - 1, 375, 317, 7064, 265, 7065, 256, 7068, 256, 7069, 4901, 7065, - 4, 7065, 2, 7077, 265, 7077, 2, 7076, 4899, 7083, 2, 7065, - 265, 7087, 4, 7086, 4899, 7091, 2, 7064, 265, 7064, 3, 7064, - 7084, 7099, 7092, 7099, 7083, 7099, 4899, 7104, 7091, 7099, 4899, 7108, - 7075, 7099, 4899, 7099, 7083, 7114, 7091, 7114, 240, 7064, 240, 7065, - 265, 7123, 7, 7125, 7114, 7123, 7099, 7123, 4899, 7130, 4899, 7123, - 7099, 7134, 413, 7065, 7, 7138, 3, 7065, 7079, 7143, 4899, 7145, - 7081, 7143, 4899, 7149, 5, 7065, 7089, 7153, 4899, 7155, 445, 7065, - 4349, 7159, 7121, 7159, 367, 7065, 4863, 7165, 973, 7065, 4805, 7169, - 316, 7064, 4067, 7173, 973, 7064, 4745, 7177, 445, 7064, 4371, 7181, - 257, 7064, 4841, 7185, 2227, 7185, 4827, 7185, 7071, 7185, 305, 7064, - 4067, 7195, 241, 7197, 241, 7194, 4067, 7201, 587, 7064, 257, 7065, - 4863, 7207, 7073, 7207, 628, 7065, 587, 7065, 11, 7214, 11, 7065, - 587, 7218, 241, 7219, 305, 7065, 4497, 7225, 7067, 7225, 4254, 7225, - 4213, 7225, 241, 7232, 241, 7225, 4213, 7236, 4900, 7065, 7121, 7241, - 7095, 7241, 7097, 7241, 241, 7065, 7095, 7249, 4899, 7251, 7097, 7249, - 4899, 7255, 6, 7249, 7121, 7249, 4899, 7261, 4899, 7248, 7121, 7265, - 7095, 7265, 7097, 7265, 4899, 7065, 241, 7272, 7121, 7275, 7095, 7275, - 7097, 7275, 241, 7273, 7123, 7283, 241, 7064, 4371, 7287, 7141, 7287, - 7127, 7287, 7075, 7287, 7134, 7287, 7123, 7287, 4899, 7298, 4899, 7287, - 7123, 7302, 305, 7286, 4067, 7307, 305, 7287, 4213, 7311, 1, 261, - 413, 7315, 3357, 7315, 264, 7319, 265, 7318, 7321, 7323, 264, 7318, - 265, 7319, 7327, 7329, 1, 803, 737, 7332, 4799, 7333, 1274, 7332, - 6, 7333, 2, 7341, 2, 7340, 4787, 7345, 2, 7333, 6, 7348, - 4787, 7351, 2, 7332, 6, 7332, 3, 7356, 587, 7332, 3, 7360, - 3, 7332, 7346, 7365, 7352, 7365, 7345, 7365, 4787, 7370, 7351, 7365, - 4787, 7374, 6, 7365, 6, 7364, 7337, 7365, 4787, 7365, 7345, 7384, - 7351, 7384, 7, 7332, 7379, 7391, 1275, 7332, 7341, 7395, 482, 7332, - 482, 7333, 7384, 7401, 7365, 7401, 4787, 7404, 4787, 7401, 7365, 7408, - 3, 7333, 7343, 7413, 4787, 7415, 7, 7333, 7363, 7419, 7359, 7419, - 7381, 7419, 7339, 7419, 736, 7332, 3997, 7429, 713, 7332, 3997, 7433, - 483, 7435, 483, 7432, 3997, 7439, 11, 7333, 483, 7443, 713, 7333, - 4485, 7447, 7335, 7447, 4188, 7447, 4147, 7447, 483, 7454, 483, 7447, - 4147, 7458, 4798, 7333, 7399, 7463, 7355, 7463, 483, 7333, 7355, 7469, - 4787, 7471, 7399, 7469, 4787, 7475, 4787, 7468, 7399, 7479, 7355, 7479, - 4787, 7333, 483, 7484, 7399, 7487, 7355, 7487, 483, 7485, 7401, 7493, - 483, 7332, 7337, 7497, 7408, 7497, 7401, 7497, 4787, 7502, 4787, 7497, - 7401, 7506, 713, 7496, 3997, 7511, 713, 7497, 4147, 7515, 1, 145, - 586, 7519, 7, 7519, 3, 7522, 3, 7519, 7, 7526, 1, 155, - 483, 7530, 0, 175, 482, 7535, 6, 7535, 2, 7538, 2, 7535, - 6, 7542, 1, 1505, 1011, 7546, 6, 7549, 7, 7549, 6, 7548, - 7553, 7555, 7, 7548, 7551, 7559, 1, 1363, 8, 7563, 6, 7563, - 4, 7566, 4, 7563, 6, 7570, 1374, 7563, 4423, 7575, 1374, 7562, - 4431, 7579, 265, 7562, 5189, 7583, 1, 165, 903, 7586, 6, 7589, - 7, 7589, 6, 7588, 7593, 7595, 7, 7588, 7591, 7599, 1, 175, - 44, 7602, 45, 7603, 7605, 7607, 44, 7603, 45, 7602, 7611, 7613, - 0, 299, 3289, 7617, 2181, 7617, 3307, 7617, 2885, 7617, 1, 299, - 4371, 7627, 2801, 7627, 1669, 7627, 5461, 7627, 3295, 7627, 305, 7626, - 4067, 7639, 251, 7627, 305, 7627, 4213, 7645, 0, 705, 3371, 7649, - 2183, 7649, 0, 101, 3157, 7655, 2185, 7655, 3175, 7655, 6697, 7655, - 3037, 7655, 6685, 7655, 21, 7667, 1, 705, 3377, 7671, 713, 7670, - 3997, 7675, 555, 7671, 713, 7671, 4147, 7681, 1, 101, 3163, 7685, - 25, 7684, 3867, 7689, 21, 7685, 25, 7685, 3933, 7695, 0, 129, - 2253, 7699, 21, 7699, 1, 129, 21, 7704, 0, 395, 2247, 7709, - 4417, 7709, 265, 7709, 7, 7715, 251, 7709, 0, 829, 2251, 7721, - 555, 7721, 1, 395, 2647, 7727, 1719, 7727, 251, 7726, 1, 829, - 555, 7734, 0, 298, 265, 7739, 7, 7741, 7627, 7743, 2551, 7739, - 7642, 7739, 4417, 7739, 7627, 7739, 251, 7752, 251, 7739, 7627, 7756, - 1, 298, 2647, 7761, 1783, 7761, 251, 7760, 7617, 7767, 7617, 7761, - 251, 7771, 0, 704, 2555, 7775, 7678, 7775, 7671, 7775, 555, 7780, - 555, 7775, 7671, 7784, 0, 100, 2557, 7789, 7692, 7789, 2969, 7789, - 5082, 7789, 5045, 7789, 21, 7798, 7685, 7789, 21, 7802, 21, 7789, - 7685, 7806, 5045, 7806, 1, 704, 555, 7812, 7649, 7815, 7649, 7813, - 555, 7819, 1, 100, 21, 7822, 7655, 7825, 7655, 7823, 21, 7829, - 0, 128, 3159, 7833, 2197, 7833, 7707, 7833, 7705, 7833, 21, 7841, - 1, 128, 3161, 7845, 7702, 7845, 25, 7844, 3867, 7851, 21, 7845, - 7699, 7854, 7699, 7845, 21, 7858, 25, 7845, 3933, 7863, 0, 394, - 3291, 7867, 2193, 7867, 7733, 7867, 2885, 7867, 3307, 7867, 7727, 7867, - 251, 7879, 0, 828, 3373, 7883, 2195, 7883, 7737, 7883, 7735, 7883, - 555, 7891, 1, 394, 4371, 7895, 3293, 7895, 7718, 7895, 1721, 7895, - 1725, 7895, 7717, 7895, 305, 7894, 4067, 7909, 251, 7895, 7709, 7912, - 7709, 7895, 251, 7916, 305, 7895, 4213, 7921, 1, 828, 3375, 7925, - 7724, 7925, 713, 7924, 3997, 7931, 555, 7925, 7721, 7934, 7721, 7925, - 555, 7938, 713, 7925, 4147, 7943, 0, 8, 6, 7947, 3, 7948, - 1274, 7947, 113, 7947, 3, 7947, 0, 7957, 6, 7956, 0, 7956, - 9, 7963, 11, 7957, 587, 7947, 1, 10, 5081, 7971, 5026, 7971, - 7, 7971, 2, 7976, 1368, 7971, 5097, 7971, 931, 7971, 1417, 7971, - 939, 7971, 941, 7971, 272, 7971, 1476, 7971, 280, 7971, 949, 7971, - 1517, 7971, 4696, 7971, 149, 7971, 631, 7971, 970, 7971, 50, 7971, - 764, 7971, 357, 7971, 367, 7971, 471, 7971, 1249, 7971, 5019, 7971, - 101, 8022, 128, 7971, 101, 7971, 5019, 8028, 4669, 7971, 9, 8032, - 759, 7971, 33, 8036, 1471, 7971, 265, 8040, 959, 7971, 33, 8044, - 253, 7971, 265, 8048, 113, 7971, 9, 8052, 375, 7971, 88, 7971, - 89, 7971, 2, 7971, 1, 8063, 7, 8062, 1, 8062, 11, 8069, - 9, 8063, 3, 7971, 9, 8074, 33, 7971, 959, 8078, 47, 8078, - 759, 8078, 25, 7971, 305, 7971, 713, 7971, 2, 7970, 8059, 8093, - 8077, 8093, 8075, 8093, 9, 8099, 3867, 8093, 3997, 8093, 4067, 8093, - 3, 7970, 4696, 8109, 8061, 8109, 8072, 8109, 8063, 8109, 9, 8116, - 4669, 8109, 9, 8120, 9, 8109, 4669, 8124, 8063, 8124, 47, 7971, - 33, 8130, 53, 7971, 265, 8134, 265, 7971, 253, 8138, 1471, 8138, - 53, 8138, 587, 7971, 483, 7971, 9, 7971, 4669, 8150, 113, 8150, - 3, 8150, 8093, 8157, 3, 8151, 8063, 8161, 0, 10, 203, 8165, - 107, 8165, 5019, 8169, 85, 8165, 2215, 8165, 2221, 8165, 2233, 8165, - 5075, 8165, 4643, 8165, 5045, 8165, 25, 8185, 4551, 8165, 922, 8165, - 1413, 8165, 273, 8165, 281, 8165, 1477, 8165, 1516, 8165, 948, 8165, - 4625, 8165, 9, 8205, 759, 8165, 959, 8165, 67, 8165, 9, 8213, - 1505, 8165, 1011, 8216, 88, 8165, 33, 8221, 89, 8165, 5019, 8225, - 3, 8165, 33, 8229, 9, 8231, 8063, 8229, 9, 8228, 33, 8237, - 2, 8165, 9, 8241, 33, 8165, 1141, 8165, 1447, 8165, 2, 8164, - 2215, 8251, 2221, 8251, 5075, 8251, 2233, 8251, 4643, 8251, 8229, 8251, - 4625, 8251, 9, 8265, 4295, 8251, 3833, 8251, 4321, 8251, 5045, 8251, - 3, 8164, 8241, 8277, 8093, 8277, 3837, 8277, 4287, 8277, 4303, 8277, - 128, 8277, 101, 8277, 113, 8277, 9, 8292, 9, 8277, 113, 8296, - 47, 8165, 165, 8165, 903, 8302, 265, 8165, 587, 8165, 1011, 8165, - 1505, 8310, 1369, 8165, 483, 8165, 903, 8316, 903, 8165, 483, 8320, - 165, 8320, 9, 8165, 3, 8326, 33, 8329, 3, 8327, 113, 8333, - 0, 240, 4266, 8337, 4888, 8337, 4892, 8337, 4213, 8337, 375, 8344, - 4863, 8337, 375, 8348, 265, 8348, 261, 8337, 3335, 8337, 375, 8357, - 347, 8337, 386, 8337, 331, 8337, 305, 8337, 375, 8366, 340, 8337, - 331, 8371, 375, 8337, 4213, 8374, 4863, 8374, 305, 8374, 1325, 8337, - 59, 8337, 7, 8337, 265, 8387, 4213, 8389, 4863, 8389, 305, 8389, - 265, 8386, 331, 8397, 7, 8336, 5141, 8401, 5137, 8402, 5137, 8401, - 5141, 8406, 5150, 8401, 5154, 8401, 5133, 8413, 5161, 8401, 5127, 8401, - 265, 8419, 5137, 8421, 265, 8418, 5133, 8425, 265, 8401, 5127, 8429, - 5141, 8431, 5127, 8428, 5133, 8435, 3785, 8401, 4329, 8401, 4311, 8401, - 483, 8337, 9, 8337, 1275, 8337, 15, 8337, 265, 8337, 4863, 8452, - 257, 8452, 1, 8457, 6, 8452, 1, 8461, 241, 8462, 241, 8461, - 1, 8466, 7, 8452, 331, 8471, 7, 8453, 7895, 8475, 7287, 8475, - 8465, 8475, 8469, 8475, 7627, 8475, 8459, 8475, 0, 8475, 8457, 8489, - 375, 8475, 1, 264, 3293, 8495, 7718, 8495, 3295, 8495, 3305, 8495, - 3301, 8495, 5512, 8495, 5451, 8495, 7756, 8495, 7091, 8495, 4899, 8512, - 7083, 8495, 4899, 8516, 7092, 8495, 7084, 8495, 4696, 8495, 7075, 8495, - 7123, 8495, 4899, 8528, 7134, 8495, 445, 8495, 4349, 8535, 8386, 8495, - 331, 8539, 471, 8495, 367, 8495, 357, 8495, 631, 8495, 1249, 8495, - 628, 8495, 8387, 8495, 8401, 8495, 4137, 8495, 3863, 8495, 4063, 8495, - 8475, 8495, 4371, 8495, 4549, 8495, 4545, 8495, 407, 8495, 1417, 8495, - 665, 8495, 338, 8495, 1480, 8495, 336, 8495, 4745, 8495, 4669, 8495, - 9, 8586, 4899, 8495, 7091, 8590, 7083, 8590, 7123, 8590, 4569, 8495, - 7709, 8495, 251, 8600, 341, 8495, 4863, 8605, 241, 8605, 253, 8495, - 331, 8610, 251, 8495, 7709, 8614, 5509, 8614, 7739, 8614, 256, 8495, - 375, 8623, 7739, 8495, 251, 8626, 5509, 8495, 251, 8630, 257, 8495, - 305, 8635, 53, 8495, 331, 8638, 1471, 8495, 331, 8642, 6, 8495, - 4349, 8647, 4497, 8647, 413, 8647, 4213, 8647, 8109, 8647, 4147, 8647, - 3933, 8647, 445, 8647, 316, 8647, 4713, 8647, 4863, 8647, 8337, 8647, - 305, 8647, 241, 8672, 241, 8647, 305, 8676, 587, 8647, 8387, 8647, - 7, 8495, 3785, 8685, 4329, 8685, 4311, 8685, 8337, 8684, 331, 8693, - 331, 8685, 8337, 8697, 15, 8685, 241, 8684, 375, 8703, 331, 8495, - 253, 8706, 1471, 8706, 53, 8706, 305, 8495, 6, 8494, 8539, 8717, - 8693, 8717, 4371, 8717, 8623, 8717, 8703, 8717, 8685, 8717, 8337, 8729, - 241, 8729, 471, 8717, 367, 8717, 357, 8717, 1369, 8717, 341, 8717, - 241, 8743, 4569, 8717, 4137, 8717, 4063, 8717, 3863, 8717, 8401, 8717, - 7, 8494, 8389, 8757, 8555, 8757, 8374, 8757, 8670, 8757, 8635, 8757, - 8676, 8757, 8647, 8757, 8337, 8770, 241, 8770, 8337, 8757, 8647, 8776, - 375, 8776, 9, 8757, 375, 8757, 8337, 8784, 241, 8757, 1, 8789, - 8647, 8791, 8647, 8788, 587, 8495, 11, 8796, 11, 8495, 587, 8800, - 9, 8495, 4669, 8804, 1369, 8495, 17, 8495, 241, 8495, 1, 8813, - 7, 8815, 8717, 8817, 7, 8814, 8647, 8821, 7, 8812, 8717, 8825, - 375, 8825, 7, 8813, 1, 8830, 8647, 8833, 8647, 8831, 331, 8831, - 6, 8813, 8337, 8495, 7, 8842, 8717, 8845, 331, 8845, 483, 8843, - 9, 8843, 7, 8843, 8647, 8855, 375, 8855, 0, 264, 3299, 8861, - 5431, 8861, 5469, 8861, 5449, 8861, 4888, 8861, 4863, 8861, 375, 8872, - 629, 8861, 394, 8861, 299, 8861, 659, 8861, 623, 8861, 645, 8861, - 101, 8861, 705, 8861, 128, 8861, 828, 8861, 3345, 8861, 3445, 8861, - 375, 8899, 2981, 8861, 3049, 8861, 7195, 8861, 3461, 8861, 4613, 8861, - 331, 8910, 4614, 8861, 375, 8861, 4863, 8916, 241, 8916, 803, 8861, - 483, 8922, 113, 8861, 9, 8926, 256, 8861, 331, 8931, 5455, 8861, - 251, 8935, 7, 8861, 331, 8939, 241, 8941, 241, 8938, 331, 8945, - 331, 8861, 4613, 8948, 7, 8860, 3837, 8953, 8093, 8953, 394, 8953, - 299, 8953, 375, 8953, 241, 8962, 4303, 8953, 4287, 8953, 241, 8953, - 375, 8970, 483, 8861, 803, 8974, 9, 8861, 113, 8978, 17, 8861, - 241, 8861, 375, 8984, 7, 8984, 331, 8989, 7, 8985, 375, 8993, - 1, 240, 3342, 8997, 2900, 8997, 8672, 8997, 8743, 8997, 3795, 8997, - 8770, 8997, 8729, 8997, 2658, 8997, 7159, 8997, 2703, 8997, 2660, 8997, - 413, 8997, 8757, 8997, 8647, 9022, 8684, 8997, 8717, 9027, 8605, 8997, - 457, 8997, 2647, 9032, 8647, 8997, 305, 9036, 8757, 9036, 8916, 8997, - 257, 8997, 2647, 8997, 375, 9046, 457, 9046, 3341, 8997, 375, 9052, - 2897, 8997, 375, 9056, 305, 8997, 8647, 9060, 340, 8997, 8717, 9065, - 3785, 9065, 8495, 9065, 375, 8997, 3341, 9072, 2897, 9072, 2647, 9072, - 8861, 9072, 7, 8997, 413, 9082, 0, 9085, 1, 9083, 264, 9088, - 264, 9089, 8495, 9082, 8717, 9095, 8495, 9083, 8757, 9099, 305, 9099, - 265, 9083, 2897, 9105, 3341, 9105, 2647, 9105, 9087, 9105, 1, 9105, - 9085, 9115, 9093, 9105, 8861, 9105, 265, 9082, 8717, 9123, 3785, 9123, - 9091, 9123, 8495, 9123, 483, 8997, 9, 8997, 265, 8997, 7, 9136, - 8717, 9139, 3785, 9139, 8495, 9139, 7, 9137, 8647, 9147, 8495, 8997, - 7, 9150, 8717, 9153, 7, 9151, 8647, 9157, 8861, 8997, 375, 9160, - 0, 482, 6, 9165, 4, 9167, 803, 9165, 5, 9165, 587, 9173, - 9, 9173, 5, 9164, 17, 9179, 19, 9165, 12, 9165, 9, 9165, - 11, 9186, 11, 9165, 9, 9190, 1, 586, 4795, 9195, 807, 9195, - 4787, 9198, 4788, 9195, 4790, 9195, 8374, 9195, 8389, 9195, 4797, 9195, - 8086, 9195, 8090, 9195, 8251, 9195, 4283, 9195, 4279, 9195, 3807, 9195, - 1491, 9195, 631, 9195, 1160, 9195, 1466, 9195, 764, 9195, 357, 9195, - 367, 9195, 471, 9195, 1249, 9195, 8800, 9195, 8647, 9195, 4787, 9195, - 807, 9246, 375, 9246, 33, 9195, 759, 9252, 1141, 9195, 759, 9256, - 803, 9195, 375, 9195, 4787, 9262, 8337, 9262, 8165, 9195, 265, 9269, - 566, 9195, 567, 9195, 7971, 9195, 25, 9276, 713, 9276, 8495, 9195, - 11, 9282, 4, 9195, 483, 9287, 5, 9195, 17, 9291, 483, 9290, - 759, 9195, 1141, 9296, 1447, 9296, 33, 9296, 713, 9195, 7971, 9304, - 25, 9195, 7971, 9308, 8337, 9195, 375, 9312, 4, 9194, 9273, 9317, - 9295, 9317, 9291, 9317, 483, 9323, 4279, 9317, 3807, 9317, 4283, 9317, - 8251, 9317, 5, 9194, 9275, 9335, 9288, 9335, 9287, 9335, 483, 9340, - 8647, 9335, 9, 9335, 483, 9335, 9287, 9348, 1447, 9195, 759, 9352, - 11, 9195, 8495, 9357, 8495, 9356, 9, 9195, 1011, 9195, 483, 9195, - 5, 9366, 9317, 9369, 5, 9367, 9287, 9373, 0, 586, 7, 9377, - 4, 9378, 16, 9377, 8800, 9377, 273, 9377, 1477, 9377, 281, 9377, - 948, 9377, 1516, 9377, 750, 9377, 386, 9377, 347, 9377, 510, 9377, - 767, 9377, 375, 9377, 305, 9406, 713, 9406, 165, 9377, 903, 9412, - 8495, 9377, 11, 9416, 566, 9377, 759, 9421, 5, 9377, 759, 9425, - 483, 9427, 483, 9424, 759, 9431, 4, 9377, 0, 9435, 7, 9434, - 0, 9434, 587, 9441, 713, 9435, 713, 9377, 375, 9446, 305, 9377, - 375, 9450, 4, 9376, 767, 9455, 5, 9376, 3837, 9459, 8093, 9459, - 828, 9459, 705, 9459, 803, 9459, 483, 9468, 4287, 9459, 4303, 9459, - 483, 9459, 803, 9476, 1505, 9377, 1011, 9480, 11, 9377, 8495, 9484, - 903, 9377, 165, 9488, 9, 9377, 483, 9492, 1011, 9377, 1505, 9496, - 483, 9377, 9, 9500, 5, 9500, 759, 9505, 5, 9501, 803, 9509, - 1, 482, 6, 9513, 5, 9514, 14, 9513, 5, 9513, 1, 9521, - 6, 9520, 1, 9520, 483, 9527, 11, 9513, 0, 902, 524, 9533, - 1291, 9533, 767, 9533, 7, 9533, 3, 9541, 305, 9533, 375, 9544, - 386, 9533, 347, 9533, 375, 9533, 305, 9552, 483, 9533, 11, 9556, - 11, 9533, 483, 9560, 1, 1010, 5038, 9565, 5037, 9565, 587, 9568, - 668, 9565, 1419, 9565, 8982, 9565, 7, 9564, 3867, 9579, 8277, 9579, - 9459, 9579, 8953, 9579, 4067, 9579, 3997, 9579, 375, 9565, 483, 9565, - 9, 9565, 587, 9596, 587, 9565, 5037, 9600, 9, 9600, 17, 9565, - 8861, 9606, 8861, 9565, 7, 9611, 17, 9610, 0, 1010, 9535, 9617, - 9537, 9617, 9559, 9617, 9563, 9617, 5, 9617, 6, 9627, 7, 9627, - 5006, 9617, 5005, 9617, 9, 9634, 9362, 9617, 1290, 9617, 9533, 9641, - 525, 9617, 9533, 9645, 8804, 9617, 8150, 9617, 922, 9617, 1413, 9617, - 7971, 9617, 9, 9656, 6, 9617, 11, 9661, 9195, 9617, 9, 9664, - 6, 9616, 17, 9669, 7, 9616, 9195, 9673, 9317, 9673, 4321, 9673, - 3833, 9673, 4295, 9673, 5045, 9673, 19, 9617, 12, 9617, 11, 9617, - 9, 9690, 483, 9617, 903, 9694, 1275, 9617, 17, 9698, 9533, 9701, - 9, 9617, 5005, 9704, 9195, 9704, 7971, 9704, 8495, 9704, 11, 9704, - 17, 9617, 1275, 9716, 9533, 9719, 903, 9617, 483, 9722, 8495, 9617, - 9, 9726, 1, 902, 9573, 9731, 9575, 9731, 9599, 9731, 9605, 9731, - 1418, 9731, 9565, 9741, 669, 9731, 9565, 9745, 8386, 9731, 7, 9731, - 8337, 9750, 7, 9730, 9673, 9755, 8251, 9755, 4283, 9755, 3807, 9755, - 4279, 9755, 483, 9731, 15, 9731, 1369, 9768, 9565, 9771, 1369, 9731, - 15, 9774, 9565, 9777, 1011, 9731, 8337, 9731, 7, 9782, 9617, 9731, - 6, 9786, 7, 9786, 6, 9787, 9791, 9793, 7, 9787, 9789, 9797, - 0, 1274, 5, 9801, 1, 1368, 4904, 9805, 4903, 9805, 9, 9808, - 9484, 9805, 1517, 9805, 1476, 9805, 272, 9805, 280, 9805, 949, 9805, - 1197, 9805, 1471, 9805, 265, 9826, 253, 9805, 265, 9830, 53, 9805, - 265, 9834, 5, 9804, 3867, 9839, 8277, 9839, 8953, 9839, 9459, 9839, - 3997, 9839, 4067, 9839, 11, 9805, 9377, 9852, 9, 9805, 4903, 9856, - 265, 9805, 1471, 9860, 253, 9860, 53, 9860, 9377, 9805, 11, 9868, - 5, 9869, 0, 1368, 5075, 9875, 2221, 9875, 4643, 9875, 2233, 9875, - 2215, 9875, 4339, 9875, 7, 9875, 5, 9888, 4, 9889, 10, 9875, - 8714, 9875, 8800, 9875, 4625, 9875, 9, 9901, 47, 9875, 305, 9875, - 8495, 9906, 959, 9875, 5045, 9875, 4551, 9875, 1325, 9875, 59, 9875, - 331, 9875, 5, 9875, 0, 9923, 7, 9922, 0, 9922, 1369, 9929, - 9287, 9923, 4, 9875, 1011, 9935, 8495, 9875, 10, 9938, 10, 9939, - 305, 9938, 11, 9938, 9943, 9947, 11, 9939, 9941, 9951, 4, 9874, - 8495, 9955, 8717, 9955, 4329, 9955, 4311, 9955, 3785, 9955, 5, 9874, - 9195, 9967, 9755, 9967, 9317, 9967, 3833, 9967, 4295, 9967, 4321, 9967, - 5045, 9967, 759, 9875, 11, 9875, 8495, 9984, 17, 9875, 903, 9875, - 265, 9875, 15, 9875, 9195, 9875, 241, 9997, 1, 1274, 6,10001, - 4,10002, 4,10003, 8,10001, 5123,10001, 5,10011, 4,10010, -10013,10015, 4,10011, 5,10010,10019,10021, 341,10001, 4663,10001, - 903,10027, 1471,10001, 253,10001, 53,10001, 4,10001, 1,10037, - 6,10036, 1,10036, 1275,10043, 5,10001, 9935,10047, 8337,10001, - 9,10051, 5,10000, 8685,10055, 1369,10055, 8401,10055, 3863,10055, - 4137,10055, 4063,10055, 4569,10055, 9955,10055, 241,10001, 17,10001, - 1369,10001, 5,10077, 0, 14, 6,10081, 2,10082, 482,10081, - 2,10081, 0,10089, 6,10088, 0,10088, 15,10095, 2,10080, - 17,10099, 1369,10081, 17,10081, 1, 16, 7,10107, 3,10108, - 586,10107, 8306,10107, 1447,10107, 1141,10107, 9875,10107, 241,10121, - 265,10120, 9992,10107, 545,10107, 695,10107, 1382,10107, 1374,10107, - 1386,10107, 59,10107, 1369,10138, 154,10107, 483,10143, 1325,10107, - 1369,10146, 331,10107, 1369,10150, 3,10107, 1,10155, 7,10154, - 1,10154, 17,10161, 8241,10155, 15,10154, 483,10167, 3,10106, - 9673,10171, 8251,10171, 3807,10171, 4279,10171, 4283,10171, 9967,10171, - 33,10107, 1369,10107, 331,10186, 1325,10186, 59,10186, 1011,10107, - 265,10107, 8165,10196, 9875,10196, 1275,10107, 15,10107, 3,10204, - 483,10207, 3,10205, 1369,10211, 8165,10107, 265,10214, 0, 16, - 4,10219, 3,10220, 3,10221, 7,10219, 2,10226,10225,10229, - 2,10227,10223,10233, 1368,10219,10225,10237, 902,10219,10233,10241, - 59,10219, 1325,10219, 331,10219, 3,10219, 4,10250,10233,10253, - 2,10219, 7,10256,10225,10259, 903,10257, 8495,10219, 587,10265, -10001,10219, 903,10269, 2,10218, 8495,10273, 8717,10273,10055,10273, - 4311,10273, 4329,10273, 3785,10273, 265,10219, 1275,10219, 1, 14, - 8982,10291, 8861,10291, 17,10294, 4745,10291, 1011,10299, 53,10291, - 253,10291, 1471,10291, 2,10291, 3,10291, 483,10311,10257,10311, - 59,10291, 17,10316, 62,10291, 1325,10291, 17,10322, 331,10291, - 17,10326, 1328,10291, 334,10291, 393,10291, 1359,10291, 1031,10291, - 499,10291, 8337,10291, 483,10343, 9875,10291, 1011,10347, 3,10290, - 8685,10351, 1369,10351, 8401,10351, 9955,10351, 4063,10351, 4137,10351, - 3863,10351, 4569,10351,10273,10351, 241,10291, 1369,10291, 17,10291, - 8861,10374, 59,10374, 1325,10374, 331,10374, 1, 11, 340,10385, - 341,10385, 264,10385, 375,10391, 1010,10385, 264,10384, 341,10397, -10387,10397, 5,10385, 6,10402, 2,10402, 2,10403, 7,10385, - 265,10410,10397,10413, 265,10411,10391,10417, 5,10384, 29,10421, - 341,10421, 6,10421, 25,10427, 8262,10385, 9,10431, 8279,10385, - 9,10435, 88,10384, 3807,10439, 6347,10439, 6327,10439, 8251,10439, - 9875,10439, 8165,10439, 8229,10385, 8251,10452, 9,10455, 9,10453, - 8251,10459, 8241,10385, 33,10385, 6685,10465, 9,10465, 6267,10385, - 101,10471, 8240,10385, 8296,10475, 8277,10475, 9,10478, 9,10475, - 8277,10482, 8228,10385, 6719,10385, 9,10489, 265,10384,10389,10493, - 5313,10493, 8251,10385, 8229,10498, 9,10501, 483,10384, 5197,10505, - 5125,10505, 1275,10384, 1369,10385, 6685,10513, 9,10513, 1011,10385, - 265,10385, 7,10520,10397,10523, 2,10384,10423,10527,10428,10527, -10427,10527, 25,10532,10425,10527, 340,10527,10397,10539,10399,10527, -10392,10527, 375,10527,10391,10546, 7,10527, 265,10550,10397,10553, - 265,10551,10391,10557,10391,10527, 375,10560,10463,10527, 9,10565, -10487,10527, 9,10569,10519,10527, 6,10573, 7,10572,10575,10577, - 7,10573, 6,10572,10581,10583, 25,10527,10427,10586, 8165,10527, - 903,10527, 265,10527, 7,10594,10397,10597, 9,10527, 3,10384, -10482,10603, 5,10602, 6,10607, 5,10603, 6,10611,10475,10613, -10458,10603,10395,10603, 6,10619, 7,10618,10621,10623, 7,10619, - 6,10618,10627,10629,10407,10603, 6,10633, 7,10632,10635,10637, - 7,10633, 6,10632,10641,10643, 8326,10603,10453,10603, 9,10648, -10475,10603, 9,10652, 9875,10603, 9,10657,10521,10603, 375,10661, - 9,10602, 8251,10665, 3807,10665, 9875,10665, 8165,10665, 8165,10603, - 9,10674, 9,10675, 3807,10603, 9,10681, 9,10603,10475,10684, -10453,10684, 8165,10684, 8251,10603, 9,10693, 2,10385,10613,10697, - 8165,10699,10646,10697, 8327,10697,10690,10697,10676,10697, 5,10696, -10603,10711, 6,10713, 7,10712,10715,10717, 7,10713, 6,10712, -10721,10723, 8326,10697,10603,10726, 8251,10727,10674,10697, 9,10732, - 8165,10696,10613,10737,10705,10737, 8296,10737,10684,10737, 8277,10737, - 9,10746,10603,10737, 9,10750, 9,10737,10603,10754, 8277,10754, - 265,10697, 8165,10697,10684,10762, 8251,10763, 9,10767, 9,10762, -10603,10770, 8251,10771,10603,10762, 9,10776,10684,10697, 8165,10780, - 8165,10781, 9,10697,10674,10786, 8165,10786,10603,10790, 8251,10791, - 8165,10787,10603,10797, 8277,10797,10603,10786, 8165,10802, 8165,10803, -10603,10697, 8326,10808, 8165,10808, 9,10812, 8165,10809, 9,10817, - 9,10808, 8165,10820, 8165,10821, 67,10697,10427,10827, 3,10385, - 8225,10831, 8242,10831,10427,10831,10409,10831, 6,10839, 7,10838, -10841,10843, 7,10839, 6,10838,10847,10849, 7,10831,10421,10853, - 375,10831,10590,10831, 9,10859, 8165,10830,10527,10863, 9,10865, - 8165,10831,10527,10868, 9,10871, 9,10831, 8241,10874,10527,10831, - 8326,10879, 8165,10878, 9,10883, 8165,10879, 9,10886, 9,10879, - 8165,10890, 8165,10891, 8241,10831, 9,10896, 89,10384, 88,10385, - 8225,10903, 8165,10385, 264,10907, 1368,10906,10909,10911, 7,10906, - 2,10915, 2,10914,10909,10919, 265,10915, 5,10907, 3,10924, -10919,10927,10911,10927, 3,10925,10917,10933, 1369,10925, 1369,10906, - 265,10907,10939,10941, 2,10907,10937,10945, 8229,10945, 9,10949, -10831,10945, 9,10953, 3,10907, 5,10957, 6,10959,10786,10957, - 5,10956,10919,10965,10911,10965,10697,10957, 9,10970, 9,10957, -10697,10974, 2,10906,10961,10979,10613,10979, 8296,10979,10974,10979, -10684,10979, 7,10978,10927,10991,10965,10991,10909,10991, 8277,10979, - 9,10998,10957,10979, 9,11002,10603,10979, 9,11006, 9,10979, -10603,11010, 8277,11010,10957,11010, 3,10906,10923,11019,10945,11019, - 9,11023,10527,11019, 9,11027, 9,10384, 1369,11031, 33,11031, - 3,11030, 8251,11037, 3807,11037, 9875,11037, 8165,11037, 3,11031, - 8241,11047, 1, 9, 69,11051, 6625,11053, 981,11050, 980,11050, - 4745,11059, 7966,11050, 7967,11050, 4,11050, 7,11067, 1275,11067, - 7954,11051, 7967,11051,11063,11075, 120,11050, 3867,11079, 112,11050, -11073,11083, 66,11050, 8251,11087, 1941,11087, 6159,11087, 3807,11087, - 9875,11087, 8165,11087, 121,11050, 7966,11051,11065,11103, 7957,11051, - 11,11106, 1141,11051, 1447,11051, 67,11051, 7,11114,11087,11117, - 113,11051,11083,11121, 7947,11123, 7947,11120,11083,11127, 89,11051, - 8495,11131, 25,11050, 113,11134, 3867,11137, 3867,11135, 113,11141, - 567,11050, 4950,11145, 587,11145, 4935,11148, 4935,11145, 587,11152, - 973,11050, 3,11156, 4745,11159, 587,11051, 566,11162, 566,11163, - 567,11163,11165,11169, 567,11162,11167,11173, 1011,11051, 1369,11051, - 6625,11179, 7956,11051, 7955,11051, 33,11051, 6625,11187, 25,11051, -11101,11191, 3984,11191, 3023,11191, 3933,11191, 113,11198, 113,11191, - 3933,11202, 973,11051, 2139,11207,11057,11207, 567,11051, 4971,11213, - 587,11215, 257,11051, 483,11219, 483,11050, 257,11223, 1011,11050, - 973,11227, 972,11226,11229,11231, 972,11227, 973,11226,11235,11237, - 257,11227, 265,11050, 5019,11243, 903,11051, 7,11246, 2,11050, -11187,11251,11073,11251,11127,11251,11207,11251,11113,11251,11111,11251, -11075,11251,11179,11251,11121,11251, 7947,11269, 25,11251, 5019,11251, - 3,11050,11068,11276,11069,11277,11279,11281,11068,11277,11069,11276, -11285,11287,11185,11277, 973,11276, 4745,11293,11103,11277,11109,11277, -11249,11277, 10,11276, 10,11277, 11,11276, 8251,11307, 3807,11307, - 9875,11307,11305,11307, 8165,11307, 33,11277, 7971,11319, 8165,11277, - 25,11323, 7947,11277, 973,11277, 4805,11329, 3807,11277, 8251,11277, - 4279,11277, 4283,11277, 9673,11277, 9967,11277, 9875,11277, 4745,11277, - 11,11277,11303,11349, 7971,11349, 2,11051,11315,11355,11303,11355, -11349,11358,11350,11355,11304,11355,11307,11365,11349,11355,11303,11368, - 5,11355, 7,11372,11276,11374,11277,11375,11377,11379,11276,11375, -11277,11374,11383,11385, 7,11355, 5,11388,11276,11390,11277,11391, -11393,11395,11276,11391,11277,11390,11399,11401, 5,11354, 7,11404, -11277,11407, 7,11405, 7,11354,11087,11413, 5,11412,11277,11417, -11307,11413,11277,11413, 4,11354,11373,11425, 7,11427,11277,11429, - 10,11354,11087,11433,11307,11433,11277,11433, 10,11355,11349,11441, -11277,11440,11307,11445,11277,11441,11303,11449, 4,11355,11410,11453, -11277,11455, 7,11453,11405,11458,11277,11461,11276,11458,11277,11459, -11405,11467,11465,11467,11276,11459,11277,11458,11473,11475,11405,11453, - 7,11478,11277,11481, 1,11452, 1,11355, 4,11486, 67,11355, - 1275,11355, 9,11493,11485,11495,11489,11495, 7947,11355, 11,11501, -11277,11503,11277,11355, 10,11506,11307,11509, 10,11507,11349,11513, - 11,11354,11326,11517,11277,11517, 7947,11520, 7947,11517,11277,11524, - 3,11051, 8213,11529, 8052,11529, 7971,11529, 113,11534, 113,11529, - 7971,11538, 8241,11529, 7947,11528, 483,11529, 112,11051,11326,11549, -11277,11549, 7947,11552, 7947,11549,11277,11556, 67,11050,11187,11561, -11053,11561,11179,11561, 66,11051, 113,11050,11556,11571,11185,11571, -11549,11571, 7947,11576, 25,11570, 3867,11581, 7947,11571,11549,11584, - 25,11571, 3933,11589, 7947,11051, 113,11592,11083,11595,11251,11595, - 113,11593,11549,11601, 3,11593,11549,11605,11517,11605, 3,11592, - 11,11051, 8116,11613, 8099,11613,11272,11613,11561,11613,11491,11613, -11251,11613, 25,11624, 8074,11613, 8093,11629, 25,11613,11251,11632, - 8109,11613, 8063,11636, 8063,11613, 8109,11640, 7957,11612,11277,11645, - 6625,11613, 113,11613, 2,11613,11183,11653,11545,11653,11611,11653, -11529,11653, 7947,11661, 3,11613, 7971,11664, 8093,11667, 7971,11665, - 8109,11671, 2,11612,11605,11675,11326,11675,11277,11675, 7947,11680, - 7947,11675,11277,11684, 7971,11613, 3,11688, 8093,11691, 3,11689, - 8063,11695, 11,11050,11355,11699, 113,11701, 1369,11699,11251,11705, - 33,11699,11251,11709, 3,11698, 8251,11713, 3807,11713,11433,11713, -11413,11713, 9875,11713, 8165,11713, 3,11699, 8241,11727, 0, 11, - 8095,11731, 8112,11731, 6688,11731, 6285,11731, 203,11730, 2351,11741, - 8159,11731, 8162,11731, 8128,11731, 8114,11731, 8097,11731, 8118,11731, - 8100,11731, 5,11730, 1369,11759, 8116,11731, 9,11762, 8099,11731, - 9,11766, 181,11731, 98,11731, 5019,11773, 8058,11731, 8093,11777, - 8156,11731, 8093,11781, 8076,11731, 8093,11785, 30,11731, 8124,11731, - 8063,11790, 8072,11731, 8109,11794, 8063,11731, 8161,11798, 8124,11798, - 8109,11798, 9,11804, 9,11798, 8109,11808, 25,11731, 6685,11812, - 9,11812, 89,11731, 5019,11819, 21,11821, 21,11818, 5019,11825, - 2759,11731, 2789,11731, 2821,11731, 6658,11731, 6685,11731, 25,11836, - 4413,11731, 113,11731, 9,11842, 128,11731, 659,11731, 623,11731, - 645,11731, 705,11731, 299,11731, 828,11731, 394,11731, 241,11731, - 375,11862, 483,11731, 803,11866, 8074,11731, 8093,11871, 9,11873, - 9,11870, 8093,11877, 101,11731, 21,11731, 89,11882, 5019,11885, - 89,11883, 5045,11889, 8061,11731, 8109,11892, 803,11731, 483,11896, - 375,11731, 241,11900, 587,11901, 6625,11731, 9,11906, 6789,11731, - 2,11911, 6855,11913, 1369,11730, 587,11730, 375,11919, 8109,11731, - 8061,11922, 8072,11922, 8063,11922, 9,11928, 9,11922, 8063,11932, - 145,11731, 903,11730, 375,11939, 265,11731, 8161,11731, 8063,11944, - 2,11730, 8124,11949, 8804,11949, 3972,11949, 8150,11949, 8495,11949, - 9,11958, 7971,11949, 9,11962, 3933,11949, 9,11966, 9,11949, - 8109,11970, 8495,11970, 3933,11970, 7971,11970, 8109,11949, 9,11980, - 3,11730, 483,11985, 2,11731, 8075,11989, 9,11991, 3,11731, - 8151,11994, 5,11995, 6,11999, 0,11998, 0,11995, 5,12004, - 8150,11994, 8093,12009, 7971,11994, 8093,12013, 9,12015, 9,12012, - 8093,12019, 1369,11995, 11,12023,12003,12025,12007,12025, 7971,11995, - 8161,12031,11997,12031, 8124,12031, 8109,12031, 9,12038, 9,12031, - 8109,12042, 9,11994, 7971,12046, 8093,12049, 7971,12047, 8109,12053, - 89,11730, 5082,12057, 2969,12057, 5045,12057, 21,12062, 21,12057, - 5045,12066, 88,11731, 7971,12070, 8093,12073, 7971,12071, 8109,12077, - 8150,11731, 3,12080, 8093,12083, 3,12081, 8063,12087, 7971,11731, - 1368,12091, 264,12090,12093,12095, 5,12090, 3,12099, 3,12098, -12093,12103, 1369,12099, 7,12091, 2,12108,12103,12111,12095,12111, - 2,12109,12101,12117, 265,12109, 265,12090, 1369,12091,12123,12125, - 88,12090, 8093,12129, 88,12091, 8061,12133, 2,12091,12001,12137, - 7,12136,12103,12141,12095,12141, 9,12137, 3,12091, 8061,12149, - 8072,12149,12121,12149, 8063,12149, 9,12156, 9,12149, 8063,12160, - 2,12090,12107,12165,12149,12165, 9,12169, 3,12090, 5,12173, - 6,12175,12137,12177,12146,12173, 5,12172,12111,12183,12141,12183, -12093,12183, 8093,12173, 9,12191,12137,12173, 9,12194, 9,12172, - 8093,12199, 9,12173,12137,12202, 9,12090, 3,12206, 8093,12209, - 3,12207, 8063,12213, 9,11731, 8116,12216, 8099,12216, 8074,12216, - 8093,12223, 25,12216, 8109,12216, 8063,12228, 8063,12216, 8109,12232, - 6625,12216, 113,12216, 3,12216, 7971,12240, 8093,12243, 7971,12241, - 8109,12247, 7971,12216, 3,12250, 8093,12253, 3,12251, 8063,12257, - 0, 9, 192,12261, 2329,12263, 211,12261, 2419,12267, 211,12260, - 2433,12271, 192,12260, 2337,12275, 189,12260, 2337,12279, 4,12261, - 7,12282, 413,12260, 413,12261, 1216,12260, 1216,12261, 1086,12261, - 9617,12295, 137,12261, 587,12261, 1011,12300, 9617,12303, 1011,12301, - 9565,12307, 1011,12261, 9617,12311, 587,12313, 587,12310, 9617,12317, - 1011,12260, 5267,12321, 9600,12321, 9565,12321, 587,12326, 587,12321, - 9565,12330, 587,12260, 5231,12335, 5181,12335,10505,12335, 1275,12261, - 2,12260,10001,12345, 5,12347, 4,12346,12349,12351, 4,12347, - 5,12346,12355,12357, 3,12260,11243,12361,11251,12361, 5177,12361, - 5185,12361, 2,12261, 3,12261,11355,12373, 1, 265, 471,12376, - 2647,12379, 357,12376, 1785,12383, 586,12377, 375,12387, 586,12376, - 413,12377, 3,12377, 7,12394, 375,12397, 7,12395, 331,12401, - 483,12395, 15,12405, 5,12377, 17,12409, 587,12411, 3,12376, - 669,12415, 1418,12415,12413,12415, 1369,12415, 15,12422, 15,12415, - 1369,12426, 5,12376,12417,12431, 1419,12431,12415,12435, 668,12431, -12415,12439,12419,12431,12407,12431,12429,12431, 9,12431, 587,12448, -12415,12451,12425,12431, 587,12431, 9,12456,12415,12459, 6719,12377, - 9,12463, 7867,12377, 251,12467, 3357,12377, 3681,12377, 3709,12377, - 2647,12377, 5843,12377, 4407,12377,11917,12377, 305,12377, 713,12377, - 25,12377, 4405,12377, 7041,12377, 251,12493, 1471,12376, 2011,12497, - 53,12376, 2035,12501, 257,12377, 253,12376, 5325,12507, 251,12376, - 7867,12511, 7617,12511, 7041,12511, 7617,12377, 251,12519, 1363,12376, - 5189,12523, 483,12377, 9,12377, 8938,12377, 375,12531, 5313,12377, - 7035,12377, 7091,12537, 7083,12537, 7123,12537, 241,12537, 11,12376, - 5313,12547, 587,12376,12387,12551,11731,12551, 9,12376, 5019,12557, -12361,12557, 1369,12376, 11,12377, 587,12377,12391,12567, 7,12376, - 2,12571, 4,12572,12537,12575, 4,12571, 2,12578,12537,12581, -12545,12571, 240,12571,12537,12587, 8948,12571, 331,12571, 8861,12592, - 8861,12571, 331,12596, 4827,12571, 6,12377, 257,12603, 265,12605, - 241,12603, 1,12609,12607,12611, 7,12377, 3,12614, 375,12617, - 8861,12614, 375,12621, 375,12615, 8861,12625, 241,12614, 375,12629, - 257,12376, 2647,12633, 1783,12633, 256,12377, 375,12639, 8861,12377, - 261,12643, 260,12643, 256,12643, 6,12643, 241,12650, 7,12643, - 241,12654, 331,12655, 6,12642,12645,12661, 7,12642,12647,12665, -12653,12665, 375,12665, 241,12643, 6,12672,12665,12675, 7,12672, - 6,12673,12679,12681,12655,12681, 7,12673,12675,12687, 241,12377, - 7,12691, 331,12693, 7,12690, 375,12697, 8997,12691, 7,12701, - 241,12376, 4457,12705, 374,12705, 5189,12705, 265,12705, 6,12712, - 8386,12705, 6,12705, 265,12718, 7,12705, 8337,12722, 8337,12705, - 7,12726, 8861,12705, 6,12731, 7,12731, 6,12730,12735,12737, - 7,12730,12733,12741, 1, 241, 448,12745, 4349,12747, 445,12744, - 1679,12751, 457,12744, 4371,12755, 8461,12744, 8475,12759, 277,12744, - 4457,12763, 923,12744, 4959,12767, 8388,12744, 8389,12744, 4,12745, - 11,12775, 1369,12777, 2,12745, 1275,12781, 9,12783, 2,12744, - 1419,12787, 668,12787,12779,12787, 587,12787, 9,12794, 9,12787, - 587,12798, 4,12744,12789,12803, 669,12803,12787,12807, 1418,12803, -12787,12811,12791,12803,12785,12803,12801,12803, 15,12803, 1369,12820, -12787,12823,12797,12803, 1369,12803, 15,12828,12787,12831, 445,12745, - 265,12834, 4349,12837, 923,12745, 5009,12841, 8374,12745, 346,12745, - 2981,12847, 386,12745, 387,12745, 3049,12853, 347,12745, 8389,12745, -12771,12859, 1412,12745, 5227,12863, 346,12744, 2977,12867,12857,12867, - 386,12744, 4067,12873,12853,12873, 1412,12744, 5189,12879, 374,12744, -12845,12883, 387,12744, 3043,12887,12851,12887, 347,12744,12847,12893, - 272,12745, 4453,12897, 4437,12897, 1755,12897, 8388,12745, 8495,12905, -12773,12905, 8387,12745, 265,12911, 8861,12913, 265,12910, 8495,12917, - 253,12745, 59,12744, 1325,12744, 341,12745, 375,12745,12883,12929, - 8337,12931, 8337,12928,12883,12935, 4371,12745, 457,12939, 375,12939, - 4531,12745, 375,12945, 8366,12745, 375,12949, 305,12744, 4457,12953, - 375,12952, 4067,12957, 4067,12953, 375,12961, 331,12744, 4457,12965, -12927,12965, 8386,12745, 8495,12971, 331,12971, 1325,12971, 59,12971, - 265,12971, 8375,12745, 8495,12983, 305,12745,12887,12987, 4266,12987, - 3031,12987, 4213,12987, 375,12994, 8337,12986, 375,12999, 375,12987, - 4213,13002, 5325,12745, 7,13007, 5361,13009, 5385,13009, 5407,13009, - 1275,12744, 15,12744, 8475,12745, 375,13021, 8461,13021, 6,12744, - 8429,13027, 8428,13027, 4139,13027, 4138,13027, 3,13026, 5,13036, - 5,13026, 3,13040, 264,13026,13031,13045,13035,13045, 264,13027, - 8401,13051, 4137,13051, 265,13026, 8401,13057,13051,13058,13029,13057, -13052,13057, 4137,13057,13051,13066,13033,13057,13054,13057,13051,13057, - 8401,13074, 4137,13074, 4137,13027, 265,13081,13051,13083, 265,13080, -13045,13087, 341,13027, 265,13027, 8401,13092,13045,13095, 4137,13092, -13045,13099,13045,13093, 8401,13103, 4137,13103, 8401,13027, 265,13109, -13051,13111, 265,13108,13045,13115, 7,12744, 8605,13119, 8374,13119, - 8916,13119, 8389,13119, 412,13119, 241,13119, 265,13130, 264,13118, - 264,13119, 8452,13119, 8647,13119, 265,13118,13137,13143, 8861,13119, - 375,13146, 8337,13119, 375,13150, 265,13150, 305,13119, 713,13119, - 25,13119, 375,13119, 8861,13162, 8337,13162, 265,13119, 241,13168, -13135,13169, 8337,13168, 6,12745,12965,13177,13145,13177,13139,13177, - 8453,13177,13119,13185,12923,13177,12925,13177,13135,13177,13169,13192, -13172,13177,13136,13177,13143,13199,13175,13177,13155,13177,13169,13177, -13135,13206, 3,13177, 5,13210,13118,13212,13119,13213,13215,13217, -13118,13213,13119,13212,13221,13223, 5,13177, 3,13226,13118,13228, -13119,13229,13231,13233,13118,13229,13119,13228,13237,13239, 264,13177, -13119,13242,13143,13245,13119,13243,13135,13249, 413,13177, 8452,13177, - 8861,13255, 305,13177, 8337,13177, 265,13260, 8861,13263, 265,13261, - 8495,13267, 265,13177, 8337,13270, 8861,13273, 8861,13271, 8337,13277, -13119,13177, 264,13280,13143,13283, 264,13281,13169,13287, 265,13280, -13287,13291, 265,13281,13283,13295, 8387,13177, 264,13299, 265,13298, -13301,13303, 264,13298, 265,13299,13307,13309, 265,13176, 8842,13313, - 8495,13313, 8337,13316, 8337,13313, 8495,13320, 7,12745,13039,13325, -13043,13325,13045,13325, 241,13324, 0,13333, 8717,13325, 8495,13325, - 8337,13339, 305,13339, 4311,13325, 4329,13325, 3785,13325,10351,13325, -10055,13325, 8337,13324, 8495,13355, 331,13355, 1325,13355, 59,13355, - 265,13355, 59,13325, 8337,13367, 1325,13325, 8337,13371, 331,13325, - 8337,13375, 8861,13375, 265,13325,13051,13381,13335,13381, 5325,13381, - 1,13381,13333,13389, 8861,13381, 8337,13381,13027,13325, 264,13396, - 264,13397, 265,13396,13401,13403, 265,13397,13399,13407, 265,13324, - 8717,13411, 3785,13411,13045,13411, 8495,13411, 374,12745, 8842,13421, - 8495,13421, 8337,13424, 8337,13421, 8495,13428, 340,12745, 8717,13433, -13045,13433, 3785,13433, 8495,13433, 375,12744, 4371,13443,13428,13443, -12983,13443, 8475,13443,13421,13443, 8337,13452, 305,13442, 4067,13457, - 8337,13443,13421,13460, 305,13443, 4213,13465, 8452,12745, 8647,13469, - 7,13469, 8495,13473, 8337,12745, 375,13476,12883,13479, 375,13477, - 305,13483,13421,13483, 305,13476, 375,13489, 6,13477, 8453,13493, - 8452,13492,13495,13497, 8452,13493, 8453,13492,13501,13503, 7,13477, -13213,13507,13229,13507, 375,13507,13243,13507, 265,13507,13177,13517, - 6,13476, 3,13521, 5,13522,13507,13525, 5,13521, 3,13528, -13507,13531,13517,13521, 264,13521,13507,13537, 7,13476, 8495,13541, - 331,13541, 1325,13541, 59,13541, 265,13541, 265,13476, 8647,13553, - 7,13553, 8495,13557, 265,13477,13177,13561,13521,13561, 7,13561, - 265,12745, 445,13568, 4349,13571, 445,13569, 4371,13575, 8770,13569, - 8729,13569,13027,13569, 375,13583, 8684,13569, 8717,13587, 331,13569, -13177,13591, 8757,13569, 8647,13594, 8647,13569, 8757,13598, 8387,13568, - 8495,13603, 6,13569, 7,13569, 8647,13609, 8495,13608, 8717,13613, - 8495,13609, 8757,13617, 6,13568, 8842,13621, 8495,13621, 8337,13624, -13609,13621, 8337,13621, 8495,13630, 7,13568, 8717,13635, 3785,13635, -13045,13635, 8495,13635,13607,13635, 8337,13568, 8647,13647, 7,13647, - 8495,13651, 8495,13569, 6,13654, 7,13654, 8717,13659, 6,13655, -13659,13663, 7,13655,13657,13667, 8647,13667, 265,12744,13258,13673, -12845,13673,13091,13673,12935,13673,12927,13673,12929,13673, 8337,13685, -13479,13673,12911,13673,13260,13673,12859,13673, 4457,13673, 5189,13673, -13177,13673, 305,13700, 8337,13700, 305,13673,13177,13706, 8386,13673, - 7,13673, 8337,13712, 8861,13673, 6,13717, 7,13717, 6,13716, -13721,13723, 7,13716,13719,13727, 8337,13673,13177,13730, 7,13730, - 1, 587, 264,13737, 375,13739, 16,13737, 264,13736, 341,13745, - 7,13737, 4,13748, 4,13749, 3,13736, 717,13755, 341,13755, - 6,13755, 713,13761, 17,13755, 566,13736, 1108,13737, 9565,13769, -11731,13737, 265,13772,11942,13737, 3565,13737, 3573,13737, 3273,13737, - 375,13736, 113,13736, 4696,13787, 9,13787, 4669,13790, 4669,13787, - 9,13794, 1011,13737, 9565,13799, 9,13801, 9,13798, 9565,13805, - 241,13737, 9,13737, 1011,13810, 9565,13813, 1011,13811, 9617,13817, - 113,13737, 4727,13821, 9,13823, 7049,13737, 807,13827, 375,13827, - 265,13736,11731,13833, 1487,13737, 1011,13736, 5293,13839, 9704,13839, - 9617,13839, 9,13844, 9,13839, 9617,13848, 265,13737,11731,13852, - 4,13736,13757,13857,13762,13857,13761,13857, 713,13862,13759,13857, - 340,13857,13745,13869,13747,13857,13740,13857, 375,13857,13739,13876, - 7,13857, 265,13880,13745,13883, 265,13881,13739,13887,13739,13857, - 375,13890, 713,13857,13761,13894, 265,13857, 7,13898,13745,13901, - 483,13857, 5,13736,13853,13907, 375,13909, 483,13906, 4,13737, - 7,13914, 767,13915,13761,13919, 5,13737, 3,13923, 1,13924, - 1,13923, 3,13928, 17,13923, 587,13933,13927,13935,13931,13935, - 567,13736, 483,13736, 5,13942, 1, 483, 9174,13946, 9175,13946, - 2,13947, 7,13952, 2,13946, 7,13957, 6,13946, 9170,13947, - 9175,13947,13949,13965, 824,13946, 3997,13969, 802,13946,13963,13973, - 766,13946, 825,13946, 9174,13947,13951,13981, 803,13947,13973,13985, - 9165,13987, 9165,13984,13973,13991, 713,13946, 803,13994, 3997,13997, - 3997,13995, 803,14001, 1171,13946, 4663,14005, 903,14007, 155,13946, - 9172,13947, 9171,13947, 713,13947,13979,14017, 4200,14017, 3027,14017, - 4147,14017, 803,14024, 803,14017, 4147,14028, 1171,13947, 4722,14033, - 903,14033, 4713,14036, 4713,14033, 903,14040, 257,13947, 9,14045, - 9,13946, 257,14049, 903,13946, 257,14053, 11,13946, 5197,14057, - 5125,14057,12335,14057, 4,13946, 2,14065, 7,14067,14013,14069, - 5,13946,13958,14072,13959,14073,14075,14077,13958,14073,13959,14072, -14081,14083, 586,14072, 586,14073, 587,14072,14089,14091, 4827,14073, - 9,14073, 4569,14073, 4745,14073, 587,14073,14087,14103, 4,13947, -14093,14107,14087,14107,14103,14110,14104,14107,14088,14107,14091,14117, -14103,14107,14087,14120, 3,14107, 7,14124,14072,14126,14073,14127, -14129,14131,14072,14127,14073,14126,14135,14137, 7,14107, 3,14140, -14072,14142,14073,14143,14145,14147,14072,14143,14073,14142,14151,14153, - 3,14106, 7,14157, 2,14106,14125,14161, 7,14163,14073,14165, - 586,14107,14073,14168,14091,14171,14073,14169,14087,14175, 2,14107, -14158,14179,14073,14181, 7,14179,14157,14184,14073,14187,14073,14185, -14157,14191,14157,14179, 7,14194,14073,14197,14073,14107, 586,14200, -14091,14203, 586,14201,14103,14207, 5,13947,14069,14211, 9165,14213, - 6,14211, 9165,14210,14069,14219, 17,14211, 802,13947, 9165,14225, - 803,13946,14226,14229,14015,14229,14225,14229, 9165,14234, 713,14228, - 3997,14239, 9165,14229,14225,14242, 713,14229, 4147,14247, 9165,13947, - 803,14250,13973,14253, 803,14251,14225,14257, 4,14251, 2,14261, - 7,14263, 5,14250,14265,14267,14069,14267, 587,13947, 9340,14273, - 9323,14273, 9290,14273, 9317,14279, 9335,14273, 9287,14282, 9287,14273, - 9335,14286, 5,14273, 9195,14290, 9317,14293, 9195,14291, 9335,14297, - 9195,14273, 5,14300, 9317,14303, 5,14301, 9287,14307, 587,13946, - 5,14310, 0, 265, 446,14315, 4371,14317, 445,14314, 1675,14321, - 8725,14315, 8766,14315, 471,14314, 2367,14329, 8827,14315, 8836,14315, - 319,14314, 4497,14337, 1302,14315, 667,14315, 8794,14315, 8768,14315, - 8727,14315, 8774,14315, 8732,14315, 1011,14315, 1275,14354, 3,14315, - 1369,14359, 11,14361, 5,14315, 9,14365, 1275,14367, 3,14314, - 1291,14371, 524,14371,14369,14371, 483,14371, 11,14378, 11,14371, - 483,14382, 5,14314, 525,14387,14371,14389,14373,14387,14375,14387, - 1290,14387,14371,14397,14363,14387,14385,14387,14381,14387, 17,14387, - 1275,14406,14371,14409, 1275,14387, 17,14412,14371,14415, 8770,14315, - 241,14418, 8729,14315, 241,14422, 445,14315, 241,14426, 4371,14429, - 1303,14315, 666,14315, 8784,14315, 4266,14315, 8622,14315, 8717,14441, - 8824,14315, 8717,14445, 8702,14315, 8717,14449, 256,14314, 7185,14453, - 2309,14453, 5673,14453, 5521,14453, 375,14461, 4213,14315, 375,14464, - 316,14315, 4533,14469, 1757,14469, 8697,14315, 629,14315, 407,14315, - 5325,14479, 3121,14315, 3031,14315, 5519,14315, 3355,14315, 510,14315, - 8788,14315, 8647,14492, 8676,14315, 8757,14496, 8647,14315, 8831,14500, - 8788,14500, 8757,14500, 241,14506, 241,14500, 8757,14510, 331,14315, - 1325,14315, 59,14315, 5521,14315, 375,14521, 375,14315, 4213,14524, - 8757,14524, 53,14525, 1471,14525, 253,14525, 253,14314, 4425,14537, - 4497,14537, 483,14315, 9,14542, 9,14315, 483,14546, 8684,14315, - 8717,14551, 241,14553, 241,14550, 8717,14557, 331,14551, 251,14315, - 257,14563, 8495,14565, 8635,14315, 8757,14568, 5515,14315, 331,14573, - 8757,14315, 8635,14576, 8676,14576, 8647,14576, 241,14582, 375,14576, - 241,14576, 8647,14588, 1369,14314, 2853,14593, 15,14315, 1275,14315, - 1011,14598, 587,14315, 241,14602, 8831,14315, 8647,14606, 6,14314, -14341,14611,14343,14611,14601,14611,14357,14611, 8495,14611, 241,14611, - 7,14314,14433,14625,14435,14625,14605,14625, 8495,14625, 3785,14625, -10055,14625,10351,14625, 4329,14625, 4311,14625, 4555,14625,14073,14625, - 4971,14625, 8717,14625, 7,14315, 8813,14652,14623,14653, 8495,14657, - 4,14653, 2,14660,14620,14663, 8495,14663,14611,14666,14611,14663, - 8495,14670, 2,14653, 4,14674,14620,14677, 8495,14677,14611,14680, -14611,14677, 8495,14684, 240,14653,14620,14689, 8495,14689,14611,14692, -14611,14689, 8495,14696, 8812,14652, 8717,14701, 8495,14652, 8717,14705, - 241,14707, 241,14704, 8717,14711, 331,14705, 15,14653, 483,14717, - 1275,14653, 9,14721, 8495,14653, 8831,14725,14655,14725, 8788,14725, - 8757,14725, 241,14732, 241,14725, 8757,14736, 375,14653, 8647,14653, - 241,14652, 8647,14745, 8495,14744, 8717,14749, 8495,14745, 8757,14753, - 257,14314, 8614,14757, 4417,14757, 8495,14757, 251,14762, 251,14757, - 8495,14766, 256,14315, 8647,14771, 7207,14771, 5432,14771, 5325,14771, - 375,14778, 8495,14770, 8717,14783, 375,14771, 5325,14786, 8495,14771, - 8757,14791, 8812,14315, 6,14794, 7,14794, 8717,14799, 6,14795, -14799,14803, 7,14795,14797,14807, 8647,14807, 8495,14315, 261,14812, - 260,14812, 256,14812, 8717,14819, 256,14813, 8635,14823, 6,14813, -14815,14827, 7,14813,14817,14831, 8635,14831, 8676,14831, 8647,14831, - 241,14838, 375,14831, 241,14831, 8647,14844, 6,14812, 241,14848, -14831,14851, 7,14812, 8717,14855, 241,14857, 241,14854, 8717,14861, - 331,14855, 241,14812, 6,14866,14831,14869, 7,14866, 8717,14873, - 6,14867,14873,14877,14855,14877, 7,14867,14869,14883, 8647,14883, - 241,14315, 445,14888, 4371,14891, 445,14889, 4349,14895, 8770,14888, - 8729,14888, 587,14888,14625,14903, 8684,14888, 8717,14907, 8757,14888, - 8647,14910, 8387,14889, 8495,14915, 8647,14888, 8757,14918, 6,14889, - 8842,14923, 8495,14923, 8337,14926, 8337,14923, 8495,14930, 7,14889, - 8717,14935, 3785,14935, 8495,14935, 6,14888,14935,14943, 7,14888, - 8647,14947, 8495,14946, 8717,14951,14923,14947, 8495,14947, 8757,14957, - 8495,14888, 6,14960, 7,14960, 8717,14965, 6,14961,14965,14969, - 7,14961,14963,14973, 8647,14973, 8337,14889, 8647,14979, 7,14979, - 8495,14983,12745,14315, 375,14987, 241,14314, 9099,14991, 9036,14991, - 8647,14991, 8997,14996, 5521,14991, 375,15001, 375,14991, 9082,14991, - 8495,15007, 7,14991, 8495,15011, 8997,15013, 8997,15010, 8495,15017, - 8997,14991, 8647,15020, 7,15020, 8495,15025, 0, 241, 460,15029, - 2315,15031, 479,15029, 2393,15035, 479,15028, 2397,15039, 460,15028, - 2317,15043, 457,15028, 2317,15047, 269,15028, 2885,15051, 464,15029, - 16,15029, 413,15029, 6,15058, 4,15029, 7,15062, 7,15063, - 15,15063, 483,15069, 2,15029, 587,15073, 17,15075, 2,15028, - 525,15079, 1290,15079,15071,15079, 1275,15079, 17,15086, 17,15079, - 1275,15090, 4,15028, 1291,15095,15079,15097,15081,15095,15083,15095, - 524,15095,15079,15105,15077,15095,15093,15095,15089,15095, 11,15095, - 483,15114,15079,15117, 483,15095, 11,15120,15079,15123, 9072,15029, - 305,15127, 9105,15029, 305,15131, 9083,15029, 413,15135, 412,15134, -15137,15139, 412,15135, 413,15134,15143,15145, 3445,15029, 375,15149, -12526,15029,12528,15029, 251,15029, 375,15029, 305,15159, 8997,15161, - 8997,15158, 305,15165,12614,15029, 375,15169, 7065,15029, 265,15173, - 7259,15175, 305,15028, 9105,15179, 9072,15179, 375,15179, 8997,15184, - 8997,15179, 375,15188, 9082,15029, 375,15193, 265,15193, 5521,15029, - 375,15199, 265,15199, 483,15029,12377,15204, 9,15029,12377,15208, - 17,15029,13737,15029, 375,15215, 6,15028, 3,15219, 5,15220, -15193,15223, 5,15219, 3,15226,15193,15229,15197,15219,15057,15219, - 3,15235, 2,15234,15237,15239, 2,15235, 3,15234,15243,15245, -15065,15219, 3,15249, 2,15248,15251,15253, 2,15249, 3,15248, -15257,15259, 264,15219,15193,15263, 8997,15219, 7,15028, 4437,15269, -15213,15269, 3,15273, 2,15272,15275,15277, 2,15273, 3,15272, -15281,15283,12571,15269, 4805,15269, 4613,15269,14073,15269, 375,15269, - 510,15269, 4971,15269, 483,15269, 9,15300, 9,15269, 483,15304, - 6,15029, 9020,15309, 9021,15309,12393,15309,12392,15309, 8337,15309, - 265,15318, 8452,15308, 241,15322, 8453,15309,15325,15327, 8452,15309, - 8453,15308, 412,15309, 8997,15335, 241,15308, 265,15338,15327,15341, - 8452,15339,15333,15345,15067,15309, 3,15349, 2,15348,15351,15353, - 2,15349, 3,15348,15357,15359, 413,15308,15313,15363,15315,15363, -15331,15363,15321,15363, 8997,15363,15335,15372,15336,15363,15335,15363, - 8997,15378, 412,15308,15311,15383,15317,15383,15327,15383, 413,15309, -12377,15390,15383,15393, 8997,15390,15383,15397,15383,15391, 8997,15401, -12377,15309, 413,15404,15383,15407, 413,15405,15335,15411, 8997,15309, - 413,15414,15383,15417, 413,15415,15335,15421, 265,15309, 8337,15424, -15363,15427, 265,15308, 241,15430,15327,15433, 7,15029,15223,15437, - 8997,15439,15229,15437, 8997,15443,15263,15437, 8997,15447, 4,15436, -15219,15451, 3,15453, 2,15452,15455,15457, 2,15453, 3,15452, -15461,15463, 264,15436, 264,15437,12377,15436, 375,15471, 8997,15436, -15223,15475,15229,15475, 375,15475,15263,15475, 265,15475,15219,15485, - 59,15437, 1325,15437, 331,15437, 1275,15437, 9,15495, 15,15437, - 483,15499, 265,15437,15266,15503,15219,15503, 8997,15506,15467,15503, - 8997,15503,15219,15512, 305,15503, 265,15436,15469,15519, 331,15519, - 375,15028, 3307,15525, 2885,15525,12511,15525,12377,15525, 251,15533, - 340,15029, 331,15537, 9136,15029, 7,15541, 8997,15029, 375,15544, - 305,15547, 305,15545, 375,15551, 6,15545, 3,15555, 5,15556, - 5,15555, 3,15560, 264,15555, 7,15545, 8495,15567, 331,15567, - 1325,15567, 59,15567, 265,15567, 7,15544,15559,15579,15563,15579, -15223,15579,15229,15579, 375,15579,15263,15579,15565,15579, 265,15579, -15219,15595,15555,15595, 265,15544,15555,15601, 7,15601, 265,15545, - 8647,15607, 7,15607, 8495,15611, 265,15029, 7,15615, 375,15617, - 7,15614, 331,15621, 8997,15614, 7,15625,12377,15029,13421,15629, -13313,15629,13621,15629,14923,15629,12721,15629,12715,15629,12709,15629, - 375,15629,12705,15645, 7,15629, 331,15649, 483,15628, 9,15628, - 7,15628, 375,15657, 265,15028, 9036,15661, 9099,15661, 241,15661, - 6,15667,15629,15669, 8647,15661, 8997,15672, 5521,15661, 375,15677, - 9082,15661, 8495,15681, 375,15661, 7,15661, 8495,15687, 8997,15689, - 8997,15686, 8495,15693, 8997,15661, 8647,15696, 7,15696, 8495,15701, - 0, 587, 9319,15705, 9336,15705, 889,15704, 2373,15711, 9371,15705, - 9374,15705, 9350,15705, 9338,15705, 9321,15705, 9342,15705, 9324,15705, - 578,15705, 3,15705, 6,15730, 7,15705, 567,15735, 9195,15737, - 4,15735, 9366,15741, 483,15741, 9195,15744, 9195,15741, 483,15748, - 7,15704, 9340,15705, 483,15754, 9323,15705, 483,15758, 579,15705, - 9272,15705, 9317,15765, 9368,15705, 9317,15769, 9294,15705, 9317,15773, - 566,15704,15729,15777, 9348,15705, 9287,15780, 9288,15705, 9335,15784, - 9287,15705, 9373,15788, 9348,15788, 9335,15788, 483,15794, 483,15788, - 9335,15798, 567,15705, 9,15802,15777,15805,15777,15803, 9,15809, -12377,15705, 11,15813, 9,15705, 567,15816,15777,15819, 567,15817, - 9290,15705, 9317,15825, 483,15827, 483,15824, 9317,15831, 9275,15705, - 9335,15834, 375,15705, 11,15839, 11,15704, 375,15843, 9335,15705, - 9275,15846, 9288,15846, 9287,15846, 483,15852, 483,15846, 9287,15856, - 9,15704, 5231,15861, 5181,15861,10505,15861,14057,15861, 1011,15704, - 375,15871, 9373,15705, 9287,15874, 4,15704, 9262,15879, 375,15879, - 9195,15882, 7,15879, 265,15887, 9195,15889, 9195,15879, 375,15892, - 483,15879, 5,15704, 5,15705, 9367,15900, 9366,15900, 9317,15905, - 9195,15900, 9317,15909, 483,15911, 483,15908, 9317,15915, 9195,15901, - 9373,15919,15903,15919, 9348,15919, 9335,15919, 483,15926, 483,15919, - 9335,15930, 483,15900, 9195,15934, 9317,15937, 9195,15935, 9335,15941, - 567,15704,15763,15945, 9,15945, 566,15705,15823,15951,15948,15951, -15945,15951, 9,15956, 9195,15950, 9317,15961, 9195,15951, 9335,15965, - 9,15951,15945,15968, 9366,15705, 5,15972, 9317,15975, 5,15973, - 9287,15979, 9195,15705, 566,15982, 9317,15985, 566,15983, 9275,15989, - 5,15983, 9275,15993, 9288,15993, 9287,15993, 483,15998, 483,15993, - 9287,16002, 5,15982, 9317,16007, 483,16009, 483,16006, 9317,16013, - 483,15982, 5,16016, 9317,16019, 5,16017, 9287,16023, 483,15705, - 9340,16026, 9323,16026, 9290,16026, 9317,16033, 9335,16026, 9287,16036, - 9287,16026, 9335,16040, 5,16026, 9195,16044, 9317,16047, 9195,16045, - 9335,16051, 9195,16026, 5,16054, 9317,16057, 5,16055, 9287,16061, - 0, 483, 878,16065, 2327,16067, 899,16065, 2415,16071, 899,16064, - 2423,16075, 878,16064, 2331,16079, 875,16064, 2331,16083, 573,16064, - 2569,16087, 2,16064, 15,16091, 413,16064, 413,16065, 573,16065, - 2567,16099, 1216,16064, 1216,16065, 904,16065, 2263,16107, 6515,16065, - 5,16111, 6539,16113, 903,16064, 4421,16117, 5285,16117, 2265,16117, - 4,16064, 5,16064, 4,16065, 2,16129, 7,16131, 0,16130, - 0,16129, 2,16136, 15,16129, 483,16141,16135,16143,16139,16143, - 9513,16065, 5,16149,16133,16151, 4,16148, 2,16155, 7,16157, -16151,16159, 1, 1011, 996,16162, 14,16162, 5,16163, 6,16169, - 9617,16171, 2,16162, 9617,16175,16171,16176,16172,16175,16171,16175, - 9617,16182, 7,16175,16169,16187, 9617,16189, 5,16162,16186,16193, -16175,16193, 7,16196, 7,16197,16187,16193, 6,16192,16195,16205, -16199,16205, 7,16192,16203,16211,16175,16211, 3,16211,16162,16217, - 3,16193, 7,16221,16162,16222,16162,16221, 7,16226, 7,16227, -16205,16231, 6,16193,16201,16235,16214,16235,16175,16235,16211,16240, -16211,16235,16175,16244,16225,16235,16229,16235,16219,16235, 7,16193, -16175,16254,16205,16257,16205,16255,16175,16261, 9704,16163, 587,16265, - 5293,16163, 587,16269, 997,16162, 972,16162,16235,16275, 9,16275, -14652,16163, 973,16163,16273,16283,16278,16283, 9,16283,16275,16288, -16275,16283, 9,16292, 955,16162, 5241,16297, 1505,16162, 6,16301, - 7,16300,16303,16305, 7,16301, 6,16300,16309,16311, 67,16162, -16235,16315, 9,16163, 9617,16318, 587,16321, 587,16319, 9617,16325, - 15,16162, 257,16163, 9,16331, 9,16162, 973,16335,16275,16337, - 973,16334, 257,16335, 587,16162, 5293,16345, 9704,16345, 9617,16345, - 9,16350, 9,16345, 9617,16354, 6,16162, 5,16358, 7,16162, -16221,16362,16235,16365,16235,16363, 8647,16363, 903,16362,16235,16373, - 6,16163,16329,16377, 7,16163,16167,16381,16205,16381,16361,16381, - 8717,16381,14315,16380, 4311,16381, 4329,16381, 3785,16381,10351,16381, -10055,16381, 973,16162, 9,16402, 972,16163,16341,16407,16165,16407, -16405,16407,16403,16407, 9,16415, 9617,16163, 1368,16418, 14,16418, - 2,16418, 7,16425,16423,16427, 7,16424, 5,16418, 6,16433, -16431,16435,16421,16435, 6,16432,16427,16441, 2,16419,16435,16445, -16171,16445, 7,16445,16433,16451, 9,16418, 587,16455, 587,16419, - 9,16459, 6,16418, 5,16462,16427,16465, 7,16418, 2,16468, -16435,16471,14315,16163, 7,16474, 17,16475, 903,16162, 3,16480, - 6,16483, 6,16482, 5241,16481, 1274,16480, 15,16480, 1275,16480, - 6,16480, 3,16496, 5,16496, 7,16480,16485,16503,16235,16503, - 6,16481,16495,16509,16493,16509, 7,16481,16499,16515,16501,16515, -16487,16515,16205,16515,16361,16515,16491,16515,16167,16515, 1, 903, - 9542,16530, 9543,16530, 1274,16530, 3,16530, 9541,16539, 6,16538, - 7,16538, 5,16545,16530,16547, 5,16539, 7,16551,16530,16552, -16530,16551, 7,16556, 7,16557,16543,16561, 6,16539, 9533,16565, -16545,16565,16555,16565,16559,16565,16549,16565, 7,16539,16543,16577, - 4,16530,16576,16581,16543,16583,16539,16581, 7,16586,16543,16589, - 7,16587,16565,16593,16545,16581,16565,16596,16565,16581,16545,16600, -16568,16581,16579,16581, 7,16581,16539,16608,16543,16611,16539,16609, -16545,16615, 1170,16530,16565,16619, 9541,16531,16535,16623, 559,16530, - 5241,16627, 767,16530,16565,16631, 165,16530, 6,16635, 7,16634, -16637,16639, 7,16635, 6,16634,16643,16645, 9540,16531,16543,16649, -16533,16649,16539,16649,16537,16649, 1275,16530,16623,16659, 9533,16659, - 257,16531, 483,16665, 483,16530, 257,16669, 15,16530, 5241,16673, - 6,16530, 3,16676,16649,16679, 7,16530,16541,16683,16566,16683, -16551,16682,16565,16689,16565,16683, 9533,16692, 375,16683, 1011,16682, -16565,16699, 9533,16683,16565,16702,15269,16683, 4827,16683, 6,16531, -16662,16711,16659,16711, 9533,16714, 9533,16711,16659,16718, 7,16531, -16539,16723, 9533,16725,16537,16723, 9533,16729, 1007,16723,16543,16723, - 9533,16735,16679,16723, 9533,16739, 331,16723, 1325,16723, 59,16723, - 9533,16722,16543,16749,16539,16749,16679,16749,16537,16749, 9533,16531, - 1275,16759,16711,16761, 7,16759,16565,16765, 7,16758,16539,16769, -16543,16769,16679,16769,16537,16769,15029,16531, 7,16779, 1011,16530, - 5,16782, 6,16785, 6,16784, 5241,16783, 14,16782, 1275,16782, - 15,16782, 6,16782, 5,16798, 3,16798, 7,16782,16787,16805, -16565,16805, 6,16783,16797,16811,16795,16811, 7,16783,16801,16817, -16803,16817,16789,16817,16543,16817,16679,16817,16793,16817,16537,16817, - 1, 1369, 1010,16833, 16,16833, 2,16833, 5,16838, 5,16839, -16837,16843, 7,16833, 4,16846,16843,16849, 4,16847,16841,16853, -16835,16853, 2,16832, 11,16859,15900,16833, 331,16832, 59,16832, - 6717,16833, 9,16869, 1325,16832, 265,16832, 4,16833, 7,16876, -16843,16879, 2,16877, 1,16882, 1,16877, 2,16886, 11,16877, - 1369,16891,16885,16893,16889,16893, 5,16833, 2,16898,16853,16901, -15705,16898, 1275,16898, 9,16907, 1346,16833, 9,16911,15705,16833, - 11,16915, 5,16914, 1275,16833, 5,16921, 17,16923, 5,16920, - 9,16927, 1275,16832, 6717,16931, 9,16933, 1, 1275, 5814,16937, - 902,16937, 902,16936, 3,16937, 7,16944, 413,16937, 1216,16937, - 6787,16937, 5,16953, 4,16952,16955,16957, 4,16953, 5,16952, -16961,16963, 1505,16937, 5771,16937, 903,16968, 1011,16937, 903,16972, - 903,16936,16941,16977, 241,16936, 17,16936, 5299,16983, 4915,16983, - 11,16936, 903,16937, 5771,16990,16943,16991, 1011,16990,15208,16937, - 9,16937,15029,17000,15029,16937, 9,17004, 4,16936, 265,17009, - 5,16936, 4,16937, 1011,17015, 1369,16936, 6717,17019, 9,17021, - 1, 17, 4,17025, 6,17026, 113,17025, 1275,17024, 5299,17033, - 4915,17033, 241,17025, 2,17024, 3,17024,11731,17025, 265,17045, - 1, 15, 5886,17049, 5,17048, 483,17053, 413,17049, 1216,17049, - 165,17049, 5843,17049, 1011,17062,14315,17049, 17,17067, 903,17049, - 1011,17070, 1011,17048, 241,17048, 903,17048, 5241,17079, 1011,17049, - 5843,17082, 903,17082,15204,17049, 483,17049,15029,17090,15029,17049, - 483,17094, 3,17048, 483,17099, 2,17049, 3,17049, 5,17105, - 1,17106, 1,17105, 5,17110, 483,17105, 15,17115,17109,17117, -17113,17117, 1369,17105, 0, 1011, 2,17125, 7,17127, 9565,17129, - 5,17124, 9565,17133,17129,17134,17130,17133,17129,17133, 9565,17140, - 6,17133,17127,17145, 9565,17147, 9600,17125, 9,17151, 5267,17125, - 9,17155,16722,17125,10385,17125, 9,17161, 587,17125, 9565,17164, - 9,17167, 9,17165, 9565,17171, 1275,17125, 903,17175, 9,17125, - 375,17125, 587,17181, 9,17124, 5267,17185, 9600,17185, 9565,17185, - 587,17190, 587,17185, 9565,17194, 587,17124, 375,17199,13737,17125, - 9,17203, 6,17124,17176,17207,17175,17207, 903,17210, 903,17207, -17175,17214, 7,17124,10001,17219, 903,17221, 6,17125, 3,17224, -17219,17227, 903,17229, 7,17125, 88,17233, 89,17233, 265,17233, - 264,17232,17239,17241, 264,17233, 3,17233, 9,17246, 3,17232, -17237,17251, 9,17251, 2,17232,17235,17257,17249,17257,17247,17257, - 9,17263, 265,17232,17245,17267, 2,17233,17254,17271, 9,17271, -17251,17274,17251,17271, 9,17278,16531,17232, 9,17233, 3,17284, -17257,17287, 3,17285,17271,17291, 903,17233, 9565,17125, 1368,17297, - 14,17297, 2,17296, 7,17303, 2,17297, 7,17306, 7,17307, -17301,17311, 5,17297,17305,17315,17129,17315, 6,17314,17311,17321, - 6,17315,17309,17325,17303,17325,17299,17325, 587,17296, 9,17333, - 9,17297, 587,17337, 6,17297, 5,17340,17311,17343, 7,17297, - 2,17346,17325,17349,12377,17125, 9,17353,16531,17125, 6,17357, - 7,17357, 6,17356,17361,17363, 7,17356,17359,17367, 0, 903, - 767,17370, 4617,17373, 483,17375, 15,17371, 1011,17379, 767,17371, - 4588,17383, 483,17383, 4579,17386, 4579,17383, 483,17390, 375,17371, - 11,17395, 483,17370, 2265,17399, 4421,17399, 5285,17399, 11,17370, - 375,17407, 6,17370,17380,17411,17379,17411, 1011,17414, 1011,17411, -17379,17418, 7,17370, 3549,17423, 2001,17423, 8495,17423,10291,17423, - 1011,17431,14073,17423,11277,17423, 4971,17423, 5045,17423, 6,17371, - 5,17442,17423,17445, 1011,17447, 7,17371, 1011,17451, 0, 1369, - 2789,17455, 2821,17455, 2759,17455, 2687,17455, 6658,17455, 2,17455, - 6,17466, 6625,17455, 9,17470,12551,17455, 1347,17455,13808,17455, - 6685,17455,13833,17455, 4413,17455,17025,17455, 265,17487, 241,17486, -17038,17455, 903,17455, 9,17455, 6625,17496, 17,17454,12377,17501, - 11,17454,12377,17505, 803,17455, 15,17454, 5303,17511, 4927,17511, -17033,17511,16983,17511, 265,17454, 2853,17521,17082,17455, 11,17455, -12377,17526,12564,17455, 241,17455,13737,17532,17025,17532, 1011,17455, -17049,17538,12377,17455, 10,17543, 10,17542, 305,17543, 11,17543, -17547,17551, 11,17542,17545,17555,17049,17455, 1011,17558, 4,17454, - 5,17455,13737,17455, 241,17566, 0, 1275, 3,17570, 9,17573, - 4,17570, 5,17570, 9856,17579, 9805,17579, 9,17582, 9,17579, - 9805,17586, 5,17571, 3,17591, 0,17592, 0,17591, 3,17596, - 9,17591, 1275,17601,17595,17603,17599,17603, 17,17591, 9805,17609, - 1369,17590, 17,17613, 1486,17571, 17,17617, 1369,17571,17577,17621, - 9,17623, 5,17621, 9,17627, 5,17620, 17,17631, 0, 17, - 4,17634, 587,17637, 155,17635, 1011,17635, 1369,17634,12377,17645, -16990,17635, 587,17635,12377,17650,12566,17635, 903,17635,16937,17656, -12377,17635, 587,17660,16937,17635, 903,17664, 3,17634, 483,17669, - 2,17635, 4,17673, 0,17674, 0,17673, 4,17678, 587,17673, - 17,17683,17677,17685,17681,17685, 3,17635, 1369,17691, 0, 15, - 5,17695, 7,17696, 1369,17694, 5303,17701, 4927,17701,16983,17701, -17033,17701, 3,17694, 3,17695,10104,17712,10105,17713,17715,17717, -10104,17713,10105,17712,17721,17723, 1, 13, 113,17727, 0, 12, -17727,17731, 9,17732, 2,17735, 2,17734, 137,17732, 136,17732, - 2,17733,17741,17745, 3,17733,17739,17749,17743,17749, 2,17732, - 9,17754,17749,17757,17749,17755, 3,17732,17737,17763,17745,17763, - 0, 13, 1, 12, 1369,17771, 33,17771, 3,17770, 8251,17777, - 3807,17777, 9875,17777, 8165,17777, 3,17771, 8241,17787,17769,17771, - 9,17791, 2,17792, 2,17793, 137,17791, 136,17791, 2,17791, - 9,17802, 3,17791,17797,17807, 2,17790,17807,17811,17799,17811, - 3,17790,17805,17817,17795,17817,17803,17817,17801,17817, 1, 413, - 4,17826, 2,17826, 5,17826, 6,17833, 6,17832, 3,17826, - 6,17839, 6,17838, 2653,17827, 1637,17827,14537,17827,14321,17827, - 260,17826, 2903,17827, 1639,17827, 1641,17827, 3361,17827, 331,17826, -17521,17827, 4909,17827,14593,17827, 261,17826, 257,17826, 14,17826, - 1274,17826, 2159,17827, 2161,17827, 251,17827, 2647,17827, 331,17885, - 15,17826, 1275,17826,14652,17827, 6,17827,17829,17895,17831,17895, - 8997,17895,17863,17895,17871,17895,17889,17895,17891,17895, 7,17827, -17833,17911,17839,17911, 8495,17911, 413,17910, 0,17919,17837,17911, -17843,17911, 265,17911,17921,17927, 1,17927,17919,17931, 2647,17927, - 8717,17911, 3785,17911,17853,17911,17875,17911,17877,17911,14315,17910, - 261,17911, 7,17826,17835,17951,17841,17951, 8647,17951, 251,17951, - 6,17826, 5,17960,17911,17963, 3,17960,17911,17967,15029,17827, - 265,17971,17895,17973, 7,17971,14315,17827, 6,17978, 7,17978, - 6,17979,17983,17985, 7,17979,17981,17989, 0, 412, 9036,17993, - 9099,17993,17829,17993,17895,17998,17831,17993,17895,18002,17896,17993, -17898,17993,17913,17993,17915,17993, 446,17993, 4371,18015, 4379,17993, -17900,17993,17917,17993, 4360,17993, 3429,17993,17882,17993, 7039,17993, -17958,17993,17949,17993, 241,17993, 445,18036, 4371,18039, 445,18037, - 4349,18043,16097,17993,12289,17993, 8647,17993, 8997,18050, 4349,17993, - 251,18054,17951,17993, 251,18058, 251,17993, 4349,18062,17827,18062, -17951,18062,17895,17993,17829,18070,17831,18070, 8997,18070, 5521,17993, - 375,18079, 445,17993, 241,18082, 4371,18085, 3,18083, 2,18082, -18089,18091, 2,18083, 3,18082,18095,18097, 465,17993, 5,18101, - 4,18100,18103,18105, 4,18101, 5,18100,18109,18111, 9082,17993, - 8495,18115,17910,17993,17833,18119,17839,18119, 8495,18119, 375,17993, - 7,17993, 8495,18129, 8997,18131,17827,18129,17829,18135,17831,18135, - 8997,18135, 8997,18128, 8495,18143,17827,18128,17833,18147,17839,18147, - 8495,18147, 8997,17993, 8647,18154,17895,18154, 7,18154, 8495,18161, -17827,17993, 241,18164, 6,18167, 6,18166, 265,18165,17895,18173, - 261,18164, 375,18165, 260,18164, 251,18164, 6,18165,18177,18185, - 7,18165,18171,18189,18181,18189, 6,18164,18173,18195, 241,18194, -18189,18199,18189,18195, 7,18164,17833,18205,17839,18205,18169,18205, -18185,18205, 8495,18205, 1, 843, 0, 842,18217,18219, 483,18220, - 4,18223, 4,18222, 581,18220, 580,18220, 4,18221,18229,18233, - 5,18221,18227,18237,18231,18237, 4,18220, 483,18242,18237,18245, -18237,18243, 5,18220,18225,18251,18233,18251, 0, 413,15309,18257, - 265,18258,15363,18261,15424,18257,15363,18265,13375,18257,13381,18257, - 4888,18257,13162,18257, 251,18256, 375,18256, 265,18257,15309,18281, -15383,18283,15309,18280,15363,18287, 331,18257, 2663,18257, 251,18293, - 9,18256, 483,18256, 375,18257, 4863,18300,13119,18300, 4863,18257, - 375,18306,13119,18257, 375,18310, 6,18257, 264,18314, 7,18257, - 264,18318, 264,18319, 265,18319,18321,18325, 265,18318,18323,18329, - 8647,18319, 375,18319, 331,18319, 7,18256, 1689,18339, 1705,18339, - 2701,18339,18317,18339, 8717,18339,12755,18339, 7627,18339, 7895,18339, - 3785,18339,13443,18339, 7287,18339, 265,18339, 331,18339, 8495,18339, - 375,18339,12745,18339, 457,18371, 375,18371, 6,18256,18291,18377, -12745,18257,17895,18381, 8647,18381, 7,18381, 8495,18387, 1, 412, - 1679,18391, 448,18391, 4349,18395, 4351,18391, 4390,18391,18300,18391, - 4457,18391,18277,18391, 1673,18391,18279,18391, 1789,18391,18364,18391, -18335,18391, 3427,18391, 7037,18391, 265,18391, 445,18422, 4349,18425, - 445,18423, 4371,18429,16095,18391,12287,18391, 5189,18391,18299,18391, -18297,18391, 2153,18391, 2151,18391, 4371,18391, 331,18446,18339,18391, - 331,18450, 331,18391, 4371,18454,18339,18454, 445,18391, 265,18460, - 4349,18463, 5,18461, 4,18460,18467,18469, 4,18461, 5,18460, -18473,18475, 465,18391, 3,18479, 2,18478,18481,18483, 2,18479, - 3,18478,18487,18489, 8386,18391,18318,18391, 375,18391,18257,18496, - 7,18391, 265,18501,18257,18503, 8337,18500,18257,18500, 8337,18391, - 7,18510, 8861,18391, 6,18515, 7,18515, 6,18514,18519,18521, - 7,18514,18517,18525,18257,18391, 265,18528, 241,18529, 6,18532, - 6,18533, 375,18528, 261,18529, 260,18529, 251,18529, 6,18529, - 241,18546,18531,18547, 7,18529, 8495,18553,18537,18553, 6,18528, -18553,18559,18541,18559, 7,18528,18549,18565,18535,18565,18547,18565, -18543,18565, 0, 843, 1, 842, 5,18576,18575,18577, 483,18581, - 4,18582, 4,18583, 581,18581, 580,18581, 4,18581, 483,18592, - 5,18581,18587,18597, 4,18580,18597,18601,18589,18601, 5,18580, -18595,18607,18585,18607,18593,18607,18591,18607, 1, 1217,16117,18617, -12291,18617,16103,18617, 4959,18617,17399,18617, 2205,18617, 2207,18617, - 1269,18617, 5,18633, 4,18632,18635,18637, 4,18633, 5,18632, -18641,18643, 1259,18617, 2,18647, 3,18646,18649,18651, 3,18647, - 2,18646,18655,18657, 7,18617, 0, 1216, 9,18662,18617,18665, - 483,18662,18617,18669,18660,18663, 7,18663,18617,18674,18617,18663, - 6,18679, 7,18679, 6,18678,18683,18685, 7,18678,18681,18689, - 1, 1531, 4904,18693,17609,18693,17586,18693, 4903,18693, 9,18700, -17579,18693, 9,18704, 9,18693, 4903,18708,17579,18708, 5,18692, - 0, 1530,18693,18717, 4,18719, 5,18719, 4,18718,18723,18725, - 5,18718,18721,18729, 1, 19, 1369,18733, 3,18733, 3,18732, - 9875,18739, 0, 18,18733,18743, 2,18745, 3,18745, 2,18744, -18749,18751, 3,18744,18747,18755, 0, 1217,12293,18759,16105,18759, - 1269,18759, 2,18765, 3,18764,18767,18769, 3,18765, 2,18764, -18773,18775, 1259,18759, 5,18779, 4,18778,18781,18783, 4,18779, - 5,18778,18787,18789, 375,18759, 7,18759, 1, 1216, 4,18796, -18759,18799, 3,18796, 6,18803, 6,18802, 5,18796, 6,18809, - 6,18808, 2,18796,18759,18815, 5241,18797, 14,18796, 1274,18796, - 2157,18797, 2155,18797,18795,18797,18799,18829,18815,18829, 15,18796, - 1275,18796, 6,18796, 3,18838, 5,18838, 7,18796,18805,18845, -18811,18845,18794,18797,18803,18851,18809,18851, 6,18797,18800,18857, -18816,18857,18799,18857,18759,18862,18815,18857,18759,18866,18835,18857, -18837,18857,18759,18857,18799,18874,18815,18874, 7,18797,18841,18881, -18843,18881,18803,18881,18759,18887,18809,18881,18759,18891,18807,18881, -18813,18881,18821,18881,18823,18881,18759,18880,18803,18903,18809,18903, -18759,18797, 6,18909, 7,18909, 6,18908,18913,18915, 7,18908, -18803,18919,18809,18919,18911,18919, 0, 1531, 1, 1530, 6717,18929, - 9,18931,18927,18929, 4,18935, 5,18935, 4,18934,18939,18941, - 5,18934,18937,18945, 0, 19, 1, 18,18949,18951, 2,18953, - 3,18953, 2,18952,18957,18959, 3,18952,18955,18963, 0, 2, -11303,18967,11349,18968, 5071,18967, 5097,18972,11350,18967, 5098,18967, -11304,18967,11307,18981, 5072,18967, 5075,18985,11315,18967, 5079,18967, -13961,18967, 581,18993, 4,18992,18995,18997, 5,18992, 580,18993, -19001,19003, 5,18993, 4,18993, 483,19008,19001,19011, 483,18993, - 4,19014,19001,19017, 4,19015,19007,19021, 1181,18966, 1206,18966, - 3451,18967, 375,19029, 1967,18967, 375,19033, 567,18966, 4992,19037, - 9,19037, 4971,19040, 4971,19037, 9,19044, 1141,18966, 555,18966, - 981,18967,16129,18966,16143,19055, 9523,18967, 483,19059, 9525,19061, - 1007,18967, 1297,18966, 524,18966, 0,19069, 4,19070, 4,19069, - 0,19074, 97,18967,11067,18967, 1275,19080, 7947,19083, 1205,18967, - 571,18967,11070,18967, 7947,19091,10043,18967, 1275,19094,10041,19097, -10044,18967,10041,19101, 1206,18967, 3001,19105, 1901,19105, 30,18967, - 8165,19111, 8150,18967, 33,19115, 1181,18967, 3663,19119, 1997,19119, - 3069,19119, 1923,19119, 9769,18967, 3972,18967, 8124,18967, 9357,18967, - 9346,18967, 8782,18967, 4244,18967, 4178,18967, 9768,18967, 8804,18967, - 8245,18967, 8249,18967, 8247,18967, 6950,18967,12299,18967, 4652,18967, -10684,18967,14096,18967, 4992,18967, 203,18967,11731,19167,17771,18967, - 113,19171,14223,18967, 85,18967,11731,19177,11031,18967, 113,19181, - 107,18967,11731,19185,11699,18967, 113,19189, 8701,18967, 9293,18967, - 3933,18967, 9,19196, 8109,18967, 9,19200, 4213,18967, 9,19204, - 4147,18967, 9,19208, 8757,18967, 9,19212, 9335,18967, 9,19216, -10202,18967, 7947,19221,17637,19221, 578,18967, 4935,19227,11349,18967, -11303,19230, 5097,18967, 5071,19234, 8647,18967, 11,19239,10603,18967, - 375,19243,10427,19243,10609,19243, 7,19243,10607,19251, 9,19242, - 4625,18967, 375,19257, 75,19257, 4629,19257, 7,19257, 4627,19265, - 9,19256,11277,18967, 10,19270,11307,19273, 10,19271,11349,19277, - 483,19271, 5045,18967, 10,19282, 5075,19285, 10,19283, 5097,19289, - 483,19283, 6789,18967, 9,19294, 288,18967, 525,18967,19073,19301, -19077,19301, 1811,19301, 1877,19301, 5,19301,17563,19301, 4861,19301, - 1290,18967, 5,19317, 3721,19317, 1985,19317,17563,19317, 4861,19317, - 296,18967, 8861,19329, 12,18967, 8165,19333, 18,18967, 25,18967, - 9,19338, 8165,19341, 8165,19339, 9,19345, 7971,18967, 9,19348, - 33,19351, 33,19349, 9,19355, 47,18967,11731,19359,10107,18967, - 1275,19362, 7947,19365,17637,19365, 113,19363, 59,18967,17635,19373, -10291,18967, 165,19377, 375,18967, 510,18967, 11,18967, 8165,19385, - 9,19387, 265,19384, 9,19384, 8165,19393, 9,18967, 567,19397, - 4971,19399, 6,19397, 25,19396, 8165,19405, 7971,19396, 33,19409, - 3933,19396, 8109,19396, 4213,19396, 4147,19396, 9335,19396, 8757,19396, - 8495,19396, 6789,19396, 4625,19396,10603,19396, 4971,19396,14073,19396, - 567,19396, 4935,19437, 11,19397, 8109,19441, 3933,19441, 8495,19441, - 7971,19441, 265,19396, 8861,19451, 11,19396, 8165,19455, 483,19396, - 17,18967, 1275,19460, 4861,19463,17563,19463, 3721,19463, 1985,19463, - 15,19460, 15,18967, 9731,19474, 1011,19475, 483,19475, 17,19474, - 6515,18967, 483,19485, 6527,19487, 6557,19487, 6561,19487,14210,18967, - 17,19495, 4971,18967, 9,19498,14073,18967, 9,19502, 5921,18967, - 375,19507,10046,18967, 16,18966, 0,19513, 4,19514,19317,19517, -19463,19517, 4,19513, 0,19522,19317,19525,19463,19525, 8495,19513, -10351,19513, 4311,19513, 4329,19513, 8717,19513,10055,19513, 3785,19513, - 14,18966, 6,19545, 2,19546, 2,19545, 6,19550, 482,19545, - 17,19545, 10,18966,17777,19559, 2215,19559,11307,19559, 5075,19559, -11713,19559, 2221,19559,11087,19559,10439,19559,10665,19559, 4643,19559, -11037,19559, 2233,19559, 9195,19559,11277,19559, 5045,19559,19455,19559, -19333,19559,19393,19559,19385,19559, 9,19597, 9317,19559, 9755,19559, - 4321,19559,10171,19559, 4295,19559, 3833,19559,10603,19559, 9,19613, - 4625,19559, 9,19617, 8,18967, 11,19621, 14,18967, 9731,19625, - 17,19625, 11,18966, 8124,19631, 3972,19631, 8804,19631, 8150,19631, - 7971,19631, 9,19640, 3933,19631, 9,19644, 8109,19631, 9,19648, - 8495,19631, 9,19652, 9,19631, 8109,19656, 3933,19656, 8495,19656, - 7971,19656, 9,18966,10001,19667, 5,19669, 4,19668,19671,19673, - 4,19669, 5,19668,19677,19679, 16,18967, 7,19683, 10,18967, -11277,19686,11307,19689, 5045,19686, 5075,19693,11349,19687, 5097,19687, - 9195,19687,19656,19687,19441,19687,19631,19687, 9,19706,11277,19687, -11303,19711, 5045,19687, 5071,19715, 9,19687,19631,19718, 19,18967, - 13,18967,19631,19725,10385,18967, 101,19729, 128,19729, 9,19729, - 113,19734, 483,19729,10081,19739,11759,19739,10405,19739, 113,19729, - 9,19746, 67,18967,11613,19751,12216,19751, 9,19751,11731,19756, -11731,19751, 9,19760, 566,18967, 253,19765, 1471,19765, 53,19765, - 256,18967, 629,18967, 1413,18967, 1471,19777, 1346,18967, 340,18967, - 8165,19783, 567,18967, 4935,19787, 9,19789, 9,19786, 4935,19793, - 305,18967, 959,18967,11731,19799, 759,18967,11731,19803, 331,18967, -17635,19807, 1325,18967,17635,19811,10001,18967,10003,19815, 4,19817, - 4,19816,10007,19815, 580,19815,10006,19815, 483,19815, 4,19828, - 4,19829, 581,19815, 4,19815,10003,19836, 483,19836, 5,19815, -19819,19843,19833,19843, 4,19814,19835,19849,19823,19849,19843,19849, - 5,19814,19839,19857,19821,19857,19825,19857,19827,19857,19841,19857, -19831,19857,19837,19857, 9731,18967, 15,19872, 8495,18967, 483,19877, - 9,19876, 9195,18967, 113,19883,11731,19883, 241,18967, 7,19888, - 483,18967, 9,19892, 17,19893, 903,19897, 5,19892, 253,19901, - 1471,19901, 53,19901, 5,19893, 1505,19909, 903,18967, 7,19913, - 1275,18967,10043,19916,10041,19919,11067,19916, 7947,19923,17637,19917, -10107,19927, 0,19916, 4,19931, 0,19932,19917,19935, 7,19932, -19937,19939, 7,19931, 4,19942, 16,19931, 6,19916, 4,19949, - 6,19950,19917,19953, 1,19950,19955,19957, 1,19949, 4,19960, - 8,19916, 4,19965, 1,19966, 1,19965, 4,19970,10107,19916, - 7947,19975,17637,19975, 7947,19917,11067,19981,10107,19981, 9,19917, - 2009,19987, 3135,19987,19969,19987,19973,19987, 5231,19987,19957,19987, -19963,19987, 0,19987, 5175,19987,14065,19987, 17,19916,19525,20009, -19517,20009, 3721,20009, 1985,20009, 1,20009,19987,20019,20003,20009, - 4861,20009,17563,20009, 5,19916, 4,19917, 5,19917, 265,18967, -17635,20035, 5771,20035, 9,20035, 11,20034, 11,20035, 9,20034, - 8861,20047, 483,20035, 7,20034, 8165,20053, 7,20035, 8495,20057, - 587,18967, 7,20061, 4,20063, 4,20062, 16,20061, 17,20061, - 4,20060,20071,20073, 5,20060,20067,20077,20069,20077, 4,20061, - 7,20082,20077,20085, 5,20061,20065,20089,13947,18967, 5,20092, - 17,20095, 5,20093, 9,20099, 4,18966, 8770,20103, 8729,20103, - 8697,20103, 8784,20103, 4266,20103, 9262,20103, 2,20103, 7,20117, - 8684,20103, 8717,20121, 331,20121, 8647,20103, 8757,20126, 8757,20103, - 8647,20130, 375,20130, 4213,20103, 375,20136, 9750,20103,19687,20103, - 347,20103, 386,20103, 340,20103, 331,20149, 375,20103, 8757,20152, - 4213,20152, 9195,20152, 305,20152, 9,20103,10291,20103, 483,20165, - 59,20103, 15,20103, 9195,20103, 375,20172, 331,20103,10001,20103, - 9,20179, 305,20103, 375,20182, 7,20103, 8495,20186, 8717,20189, - 331,20189, 8495,20187, 8757,20195, 9731,20186, 265,20187, 8757,20201, - 4213,20201, 9195,20201, 305,20201, 265,20186, 331,20211, 8647,20187, - 1325,20103, 7,20102, 8495,20219,10351,20219, 4311,20219, 4329,20219, - 3785,20219,10055,20219, 8717,20219, 483,20103, 1275,20103, 265,20103, - 7,20239, 8495,20241, 375,20241, 7,20238, 331,20247, 9731,20103, - 7,20250, 8495,20103, 7,20254, 8717,20257, 331,20257, 483,20255, - 9,20255, 7,20255, 8647,20267, 375,20267, 5,18966, 9535,20273, - 9537,20273, 2,20273, 6,20278, 9559,20273, 482,20273, 9563,20273, - 9362,20273, 922,20273, 1413,20273, 19,20273, 12,20273, 8150,20273, - 8804,20273,19385,20273, 1290,20273, 9533,20305, 525,20273, 9533,20309, - 7971,20273, 9,20312, 11,20273, 9,20316, 17,20273, 1275,20320, - 9533,20323, 9,20273, 9195,20326, 11,20326, 7971,20326, 8495,20326, - 9195,20273, 9,20336, 6,20273, 5,20341, 2,20340, 5,20340, -18967,20347, 11,20341, 7,20273, 5,20353, 6,20272, 17,20357, - 7,20272, 9195,20361,11277,20361, 5045,20361, 9755,20361, 4295,20361, -10171,20361, 4321,20361, 3833,20361, 9317,20361, 483,20273, 903,20380, - 1275,20273, 17,20384, 9533,20387, 903,20273, 483,20390, 8495,20273, - 9,20394, 9731,20273, 6,20398, 7,20398, 6,20399,20403,20405, - 7,20399,20401,20409, 6,18966,19836,20413,19857,20415,19854,20413, -19871,20413,19815,20413, 4,20423,19843,20425, 4,20422,19857,20429, -19477,20413,19145,20413,19875,20413,19843,20413,19849,20438,19849,20413, -19843,20442,19718,20413,19473,20413,19483,20413,19725,20413, 19,20413, - 12,20413,19337,20413,19687,20413, 9,20460,19475,20413, 9731,20465, - 17,20465, 9,20413,19687,20470, 11,20470, 11,20413, 9,20476, - 8495,20413, 5,20413, 9,20483, 4,20413,19815,20487,19849,20489, -19815,20486,19857,20493, 5,20412, 17,20497, 7,18966,10439,20501, -11087,20501,10665,20501, 4643,20501,11307,20501, 5075,20501,17777,20501, - 2215,20501,18739,20501, 4339,20501,11713,20501, 2221,20501,11037,20501, - 2233,20501,19626,20501,19129,20501, 0,20501, 4,20534,19301,20537, -19317,20537,19463,20537,20009,20537,10036,20501,19843,20547, 8800,20501, - 8714,20501, 5045,20501,11277,20501, 4551,20501,19628,20501,19455,20501, -19393,20501,19723,20501,19333,20501, 305,20501, 8495,20570, 959,20501, -19625,20501, 9731,20576, 17,20576,10603,20501, 9,20583, 4625,20501, - 9,20587,19385,20501, 9,20591, 759,20501, 47,20501,10107,20501, - 241,20599, 265,20598,10196,20501, 11,20501, 8495,20606, 17,20501, -19625,20610, 59,20501,10291,20501, 1011,20617, 15,20501, 1325,20501, - 8495,20501, 10,20624, 10,20625, 305,20624, 11,20624,20629,20633, - 11,20625,20627,20637, 9731,20501,19625,20640, 4,20501, 7,20645, - 483,20647,18967,20649, 0,20644,19301,20653,19317,20653,19463,20653, -20009,20653,20651,20653, 7,20644,19916,20665,20653,20667, 1275,20665, -18967,20670,20653,20673,18967,20665, 1275,20676,20653,20679,10001,20644, -19843,20683, 1011,20645,10047,20645, 5,20501, 9287,20691, 331,20501, - 4,20500, 8495,20697, 4311,20697,10351,20697, 3785,20697, 4329,20697, - 8717,20697,10055,20697, 5,20500, 9195,20713,11277,20713, 5045,20713, - 4321,20713, 9755,20713, 4295,20713,10171,20713, 9317,20713, 3833,20713, - 903,20501, 265,20501,10107,20734, 9195,20501, 241,20739,10001,20501, - 4,20742,19843,20745, 5,20742,18967,20748, 4,20743,20751,20753, -19511,20753,19857,20753, 5,20743, 7,18967, 8810,20762, 8811,20762, - 2,20763, 1,20768,20483,20763, 8495,20773, 8800,20763,20273,20763, - 8495,20763, 11,20780, 8810,20763,20767,20785,10081,20763, 1011,20789, - 1010,20788,20791,20793, 1010,20789, 1011,20788,20797,20799, 566,20763, - 11,20763, 9731,20805, 8495,20805, 8495,20804, 265,20763,20482,20763, - 17,20815, 567,20763, 9195,20819, 9,20763, 8811,20763,20765,20825, - 241,20762, 265,20762, 8165,20831, 1011,20763, 375,20763, 4,20762, -20815,20839, 5,20762,11276,20842, 5044,20842,11277,20842,11276,20843, -20849,20851, 5045,20842, 5044,20843,20855,20857,20773,20843,20470,20843, -20103,20843,20413,20843, 9,20866, 9195,20843,11277,20843,20845,20873, - 5045,20843,20847,20877, 9,20843,20413,20880, 4,20763,20480,20885, - 7,20884,20843,20889, 9366,20885, 1,20885, 3,20894,20842,20896, -20843,20897,20899,20901,20889,20900,20842,20897,20843,20896,20907,20909, -20890,20897,20889,20897,20843,20914, 3,20885, 1,20918,20842,20920, -20843,20921,20923,20925,20889,20924,20842,20921,20843,20920,20931,20933, -20890,20921,20889,20921,20843,20938, 9195,20885, 483,20942,20866,20885, - 8495,20885,20413,20948, 483,20885, 9195,20952,20413,20885, 8495,20956, -20843,20956,20843,20885, 1,20962, 3,20964, 3,20962, 1,20968, - 7,20963,20897,20973,20921,20973,20967,20973,20971,20973,20413,20962, - 5,20763, 7,20985, 17,20985,20413,20989,20413,20984,20839,20993, - 17,20993, 483,20984,20839,20985, 1,21001, 3,21002, 3,21001, - 1,21006, 7,21000,21005,21011,21009,21011,20413,21001,20413,20763, - 5,21019,20885,21021, 9,21021, 5,21018,20839,21027, 17,21027, - 483,20763, 5,21032, 5,18967, 0,21037, 3,21038, 9357,21037, -20742,21037,20761,21045,20187,21037, 8495,21049,20501,21037,10001,21036, -20753,21055,20763,21037, 8495,21059,13947,21036, 17,21063, 256,21037, -20186,21037,20885,21037, 7,21071,20897,21073,20921,21073, 9,21037, - 1275,21079, 9533,21081,21041,21081, 17,21037, 9195,21087, 7971,21087, - 8495,21087, 483,21036, 253,21095, 1471,21095, 53,21095, 1275,21036, - 6,21036,20640,21105,20610,21105,21069,21105, 9731,21105,20501,21112, -20501,21105, 9731,21116, 17,21116, 17,21105,20501,21122, 7,21036, -11276,21126, 5044,21126,11277,21126,11276,21127,21133,21135, 5045,21126, - 5044,21127,21139,21141, 1,21127, 3,21144,18967,21147, 3,21127, - 1,21150,18967,21153,18967,21127,20470,21127,21049,21127,20413,21127, - 9,21162,20103,21127, 9195,21127,11277,21127,21129,21171, 5045,21127, -21131,21175, 9,21127,20413,21178, 6,21037,21149,21183,21155,21183, -20254,21183,19243,21183,19257,21183,18967,21183, 1,21183, 3,21196, -21126,21198,21127,21199,21201,21203,21126,21199,21127,21198,21207,21209, - 3,21183, 1,21212,21126,21214,21127,21215,21217,21219,21126,21215, -21127,21214,21223,21225, 8495,21183,20103,21228,19687,21183,20843,21183, -21166,21183, 11,21183,20501,21239,20103,21183, 8495,21242,21127,21242, -21127,21183,20103,21248,20763,21183, 9731,21253, 17,21253, 7,21037, -19625,21259, 15,21259,20413,21263,20103,21258,21105,21267, 241,21258, -21105,21259,20103,21273,20103,21037, 7,21277,21199,21279,21215,21279, -11277,21279, 5045,21279,21183,21279, 6,21276, 1,21291, 3,21292, -21279,21295, 3,21291, 1,21298,21279,21301, 7,21276,21105,21305, - 241,21037, 483,21309, 7,21308, 4,18967,21183,21315, 0,21314, -20309,21319, 524,21319,20273,21323,20305,21319, 1291,21319,20273,21329, -21081,21319,20323,21319,20387,21319, 11,21319, 483,21338,20273,21341, - 483,21319, 11,21344,20273,21347, 165,21315,17635,21315, 1011,21352, -17642,21315,20413,21315, 6,21359, 9,21315,20352,21315,11277,21365, - 5045,21365,20985,21315, 11,21315,10075,21315, 483,21315, 1347,21315, - 6,21314, 1,21381, 3,21382,21365,21385, 3,21381, 1,21388, -21365,21391,20273,21381, 11,21381, 7,21314, 6,21315, 17,21401, - 7,21315,21384,21404,21390,21404,21385,21405,20273,21411,21407,21411, -21391,21405,20273,21417,21409,21417,21385,21404,21384,21405,21423,21425, -21391,21404,21390,21405,21429,21431,11276,21404, 5044,21404,11276,21405, -11277,21404,21439,21441, 5044,21405, 5045,21404,21445,21447, 0,21405, - 4,21450, 4,21405, 0,21454, 8495,21405, 5045,21405,20273,21461, -21437,21461,11277,21405,20273,21467,21435,21467, 9,21405,20273,21404, -21385,21475,21391,21475,11277,21475, 5045,21475, 265,21405, 483,21405, -18967,21487,21453,21489,21457,21489,21381,21405,20273,21315, 6,21497, - 1,21499, 3,21500, 3,21499, 1,21504, 7,21496,21503,21509, -21507,21509,21385,21509,21391,21509,11277,21509, 5045,21509, 1011,21315, -17635,21522, 6,18967, 2,21526, 11,21529,20103,21527,20690,21527, - 9,21535,21259,21527, 9,21539, 17,21527, 4,21526, 11,21545, - 5,21526,20640,21549,21259,21549,20610,21549, 9731,21549,20501,21556, -20501,21549, 9731,21560, 17,21560, 17,21549,20501,21566, 4,21527, - 15,21571, 5,21527, 482,21575, 2,21575, 6,21578, 6,21575, - 2,21582, 9,21575,20501,21587,20501,21574, 9,21591,20501,21527, - 5,21595, 17,21597, 5,21594, 9,21601, 1, 3,19718,21604, -19719,21604,19402,21605,20962,21604,20973,21613,21248,21604,21272,21604, -21494,21604,20963,21604,21249,21604,21001,21604,21011,21627,21273,21604, -21495,21604,21178,21604,20880,21604,21179,21604,20881,21604,21049,21604, -20773,21604,21361,21604,15753,21605, 803,21649,14387,21605, 375,21653, - 9663,21604, 9177,21604,20351,21604,20485,21604,21360,21604, 990,21604, - 4745,21667,19685,21605,21087,21671,21156,21605,21087,21675,21317,21605, -21291,21604,21279,21681,21499,21604,21509,21685, 996,21604, 4745,21689, -21472,21604,21473,21604, 761,21605, 3419,21697, 6469,21697, 3119,21697, -21048,21604,20772,21604, 973,21604, 955,21708, 4745,21711, 9,21708, - 4745,21715, 4745,21709, 955,21719, 9,21719, 2077,21605, 7,21725, - 14,21724,21727,21729, 6,21725, 15,21724,21733,21735,20350,21604, -20484,21604, 9662,21604, 9176,21604,21380,21604,21104,21604,21126,21604, -21183,21751, 9,21751,20842,21604,20885,21757, 9,21757, 305,21604, -18967,21763, 375,21765, 955,21604, 973,21769, 4805,21771, 973,21768, - 4745,21775,17423,21769, 4745,21769, 713,21604,21404,21604,21381,21785, - 9,21785,20884,21604,21316,21605,21182,21604,20501,21795,21793,21795, -21405,21604,21381,21800, 9,21800,20885,21604,20843,21806,20890,21807, -20889,21807,20843,21812,20973,21807,21073,21807,20413,21807,20843,21807, -21757,21823,20889,21822,21183,21604,21127,21828,21279,21829,21679,21829, -20103,21829,21127,21829,21751,21839,21105,21604,21381,21604,21365,21845, -21405,21844,20413,21845,21475,21845,21405,21845,21785,21855,20273,21855, -21509,21845,20843,21604,20885,21862, 9,21862,21127,21604,21183,21868, -18967,21869,21183,21873, 9,21868, 1199,21605,13923,21604,13935,21881, - 9437,21605, 587,21885, 9439,21887, 1177,21605, 1421,21604, 668,21604, - 1,21895, 5,21896, 5,21895, 1,21900, 117,21605,11759,21605, - 1369,21906, 7971,21909,11760,21605, 7971,21913, 809,21605, 989,21605, - 9929,21605, 1369,21920, 9927,21923, 9930,21605, 9927,21927,19596,21605, - 9,21931,19556,21605,20170,21605,19707,21605, 9,21939,20956,21605, -21791,21943,21242,21605,21795,21947,20773,21605,21707,21951,21049,21605, -21705,21955,21373,21605,20464,21605,19557,21605,20499,21605,20359,21605, - 9181,21605, 9671,21605, 4145,21605, 3801,21605, 4135,21605,10101,21605, -20577,21605,19656,21605,19441,21605,19332,21605,19392,21605,19454,21605, -21059,21605,19440,21605,19657,21605, 4134,21605,10100,21605,20498,21605, -20358,21605,20142,21605, 9,22007,20576,21605,20864,21605, 9,22013, -21116,21605,21166,21605,21183,22019, 9,22019,21560,21605, 9180,21605, - 9670,21605, 3800,21605, 4144,21605,21026,21605,20839,22035,20814,21605, -20839,22039,20992,21605,20839,22043,21359,21605,21845,22047,21647,22047, -21053,21605,21795,22053,20779,21605, 8087,21605, 8091,21605, 8089,21605, -20303,21605, 9,22065,20465,21605,10786,21605,11131,21605, 4696,21605, -11970,21605,19722,21605,19333,21605,19393,21605,19455,21605,20351,21605, -21739,22087,20485,21605,21741,22091, 9663,21605,21743,22095, 9177,21605, -21745,22099,20350,21605,21661,22103,20484,21605,21663,22107, 9662,21605, -21657,22111, 9176,21605,21659,22115,10099,21605, 17,22119, 17,22118, - 4133,21605, 17,22125, 17,22124, 8251,21605, 9,22131, 3807,21605, - 9,22135, 13,21604,18967,22139, 19,21604,20501,22143, 9875,22143, - 12,21604, 8251,22149, 3807,22149,19559,22149,20501,22149, 9875,22149, - 8165,22149, 18,21604, 3799,21605, 17,22165, 17,22164, 4143,21605, - 17,22171, 17,22170, 4283,21605, 9,22177, 4279,21605, 9,22181, - 9669,21605, 17,22185, 17,22184, 9179,21605, 17,22191, 17,22190, - 9673,21605, 9,22197, 9967,21605, 9,22201,19624,21605,20501,22205, - 17,22205,19686,21605,22149,22211,19441,22211,19656,22211,21607,22211, -19631,22211, 9,22220, 9,22211,19631,22224,19559,21605,19385,22228, - 9,22231, 9,22229,19545,21605, 17,22236, 17,22237,10102,21605, - 7971,22243,17053,22243, 629,21605,21117,21605,21561,21605,20867,21605, -20885,22255,21167,21605,21183,22259,21548,21605, 17,22263,20501,22263, -21104,21605,21069,22269,21267,22269,21305,22269,21259,22269,20103,22277, - 17,22269,20501,22269,20838,21605,20985,22285,20842,21605,21865,22289, -21809,22289,21613,22289,21637,22289,21867,22289,20773,22289,20956,22289, -21863,22289,20885,22305, 9,22305,20885,22289,20413,22310,20413,22289, -20885,22314,21126,21605,21871,22319,21831,22319,21617,22319,21635,22319, -21877,22319,21049,22319,21242,22319,21869,22319,21183,22335, 9,22335, -21183,22319,20103,22340,20103,22319,21183,22344,21020,21605,20885,22349, -21278,21605,21183,22353,21052,21605,21829,22357,21127,22357,21358,21605, -21747,22363,21665,22363,21532,21605,20497,21605, 17,22371, 17,22370, -20361,21605, 9,22377,20713,21605, 9,22381,20357,21605, 17,22385, - 17,22384,21048,21605,21643,22391,20772,21605,21645,22395,21509,21605, -21381,22399,21499,22399, 9,22399,21475,21605,21381,22407, 9,22407, -21365,21605,21381,22413, 9,22413,11971,21605, 4697,21605, 8387,21605, - 9,22423,11949,21605, 11,22426, 5,22428, 6,22426, 5,22432, - 5,22426, 6,22436, 6,22437, 7,22426,22441,22443, 7,22427, -22435,22447,22439,22447,22431,22447, 14,22426,22447,22455, 6,22427, - 15,22426,22459,22461, 9,22426, 9,22427, 4669,21605, 11,22468, - 5,22470, 6,22468, 5,22474, 5,22468, 6,22478, 6,22479, - 7,22468,22483,22485, 7,22469,22477,22489,22481,22489,22473,22489, - 14,22468,22489,22497, 6,22469, 15,22468,22501,22503, 9,22468, - 9,22469,12345,21605, 5,22510, 4,22510, 12,22510, 13,22511, -22517,22519, 12,22511, 13,22510,22523,22525, 4,22511,22513,22529, - 5,22511,22515,22533, 5123,21605, 5,22536, 4,22536, 12,22536, - 13,22537,22543,22545, 12,22537, 13,22536,22549,22551, 4,22537, -22539,22555, 5,22537,22541,22559,10697,21605, 9,22562,19385,21605, -19559,22566, 9,22569, 9,22567,19559,22573,19397,21605, 6,22576, - 11,22577, 11,22576,19475,21605,20413,22584, 1406,21605, 1396,21605, - 525,21605, 903,22593, 934,21605, 9,22597, 1290,21605, 903,22601, - 669,21605,21899,22605,21903,22605, 1861,22605, 1887,22605, 4,22605, -17013,22605, 4917,22605,19687,21605,22139,22621,21609,22621, 9,22621, -20103,22620, 9,22629,19625,21605,20501,22632,19384,21605,21087,22637, -20326,22637, 9,22636,20273,22637, 9,22644, 9,22637,20273,22648, -19396,21605, 5,22652, 10,22652,19441,22657, 10,22653,19455,22661, - 11,22652,22661,22665, 11,22653,22657,22669,19474,21605,20413,22673, - 1418,21605, 4,22677, 3755,22677, 1995,22677,17013,22677, 4917,22677, - 12,21605,22139,22689,18967,22688, 18,21605,22143,22695,21252,21605, -21279,21605,21183,22701,21291,22701, 9,22701,20483,21605,20763,22708, -20187,21605,21036,22712,21069,22715,21036,22713,21049,22719,21037,22713, -21037,22712, 9,22713,20353,21605, 5,22729,21315,22729, 33,21605, - 8150,22735,17727,22735, 9,22735, 7971,22740, 7971,22735, 9,22744, -17025,22735, 8165,21605, 30,22751, 181,22751, 9,22751, 25,22756, - 25,22751, 9,22760, 145,22751, 53,21605,17049,22767,10219,21605, - 903,22771, 155,22771,10081,21605, 1369,22776, 7971,22779,17053,22779, - 257,21605, 9,22785, 1171,21605, 4722,22789, 4713,22789, 903,22792, -21315,22789, 903,22789, 4713,22798, 628,21605, 9,22803, 11,21605, - 766,22807, 767,22807,20984,22807,20762,22806,22813,22815,20985,22807, -20762,22807,22140,22807,19718,22807,19725,22807, 586,22806,22809,22829, - 5,22807,20763,22832,22815,22835,20763,22833,22821,22839, 587,22832, -22829,22843, 587,22833, 586,22807,22847,22849, 5515,22807,17043,22807, - 4825,22807,17727,22807, 8150,22807,22139,22807,18967,22862,19396,22806, -19397,22806,19396,22807,22869,22871,19397,22807,22867,22875,22653,22875, -20763,22807, 5,22880,22815,22883,19687,22807, 9,22886, 7971,22807, - 9,22890,19461,22807, 9,22807,19687,22896, 7971,22896,18967,22896, -18967,22807,22139,22904, 9,22904,20103,22905, 9,22911, 1369,22806, - 903,22806, 9,22917, 587,22807, 5,22920,22829,22923,18967,22806, -20326,22927,21087,22927, 9,22926,20273,22927, 9,22934, 9,22927, -20273,22938, 9,22806,18967,22942,20763,22806,22819,22947, 587,22806, -22811,22951, 9,22951, 17,21605,19722,22956,19723,22957,22959,22961, -19723,22956,19722,22957,22965,22967,19396,22956,19396,22957,19397,22956, -22973,22975,19545,22956,20497,22956,20357,22956, 4133,22956,10099,22956, - 3799,22956, 4143,22956, 9179,22956, 9669,22956,19475,22957,21315,22957, -19397,22957,22971,23001, 1369,22956, 1275,22956, 903,23007, 587,22957, - 903,22957, 15,21605,20103,23014,18967,23015,20501,23019, 1369,23014, - 4917,23023,17013,23023, 3755,23023, 1995,23023,18967,23014,20413,23033, - 9,21605,19631,23036,19384,23036,19384,23037,22567,23043,19385,23036, -10697,23036, 4669,23036,11949,23036, 11,23037,23047,23055,22567,23055, -18967,23055,18967,23036, 10,23062, 10,23063, 11,23062,23067,23069, - 11,23063,23065,23073, 11,23036,18967,23076, 7049,21605, 587,23081, - 7051,23083, 7055,23083, 7059,23083,17219,21605, 903,23091, 4663,21605, - 903,23095, 4745,21605, 955,23099, 9,23099, 4569,21605,17423,21605, - 955,23107, 9,23107,14625,21605, 5997,21605, 7,23114, 5,23114, - 6,23119,23117,23121, 6,23118, 6,23114, 5,23126, 7,23115, -23129,23131,23125,23131, 14,23114,23131,23137, 6,23115, 15,23114, -23141,23143,20482,21605,20762,23146,20773,23149,20762,23147,20815,23153, -20839,23147,21399,23147,19683,23147,20763,23147,20843,23163,23149,23163, -20763,23146,20839,23169,23153,23169,20186,21605,21036,23174,21049,23177, -21036,23175,21069,23181, 331,23175, 59,23175, 1325,23175, 265,23175, -20644,21605,20352,21605, 9660,21605, 8386,21605, 59,23199, 331,23199, - 1325,23199, 265,23199,21243,21605,21829,23209,20957,21605,21807,23213, -21272,21605,21631,23217,20962,21605, 9,23221,21248,21605,21625,23225, -21549,21605,20501,23228,21105,21605,20501,23232,20843,21605,21758,23237, -21623,23237,21760,23237,21641,23237,20885,23237,21757,23246,20889,23247, -21757,23237,20885,23252, 9,23252,20103,23236, 9,23259, 9,23237, -21757,23262,20885,23236, 9,23267,21127,21605,21752,23271,21625,23271, -21754,23271,21639,23271,18967,23270,21087,23281,21183,23271,21751,23284, -21751,23271,21183,23288, 9,23288,20103,23270,21183,23295, 9,23295, - 9,23271,21751,23300,21405,21605,21633,23305,21394,23305,21786,23305, -21381,23305,20273,23312,21785,23312,20326,23305,21087,23305,21695,23305, -21037,23305,21036,23304,23325,23327,21036,23305,21037,23304,23331,23333, -21788,23305,21785,23305,21381,23338, 9,23338, 9,23305,20273,23344, -21785,23344,20273,23305,21381,23350, 9,23350,21259,21605,21843,23357, -20885,21605,20763,23360, 5,23363,18967,23362, 6,23360,18967,23368, -18967,23360, 6,23372, 6,23373, 7,23360,23377,23379, 7,23361, -23365,23383, 4,23383,23363,23387,23371,23383,23375,23383,23367,23383, -21526,23360,23383,23397, 6,23361,21527,23360,23401,23403, 9,23361, -20843,23407,21791,23361,20413,23411,20413,23360,21791,23415,20843,23360, - 9,23419,21183,21605,21315,23422,21795,23425,21795,23423,20103,23429, -20103,23422,21795,23433,20763,23422,21249,21605,21617,23439,21001,21605, - 9,23443,21273,21605,21619,23447,21371,21605, 9,23451,21253,21605, - 8,21604,22363,23457,22053,23457,21983,23457,23039,23457,21985,23457, -22077,23457,22075,23457,22465,23457,22507,23457,23053,23457,23051,23457, -20501,23457,23037,23457,19631,23483,11949,23483, 4669,23483,18967,23457, - 10,21604,22870,23493,22869,23493,22867,23493,23041,23493,22583,23493, -21995,23493,22665,23493,21991,23493,19441,23493,22626,23493,21997,23493, -19656,23493,22908,23493,22902,23493,22419,23493,22421,23493,11970,23493, - 4696,23493,21987,23493,23069,23493,21989,23493,23079,23493,22643,23493, -22933,23493,22945,23493,22693,23493,22904,23493, 9,23546,22896,23493, -18967,23550,22621,23493, 9,23554,19396,23493,22807,23558, 8647,23493, -22637,23493, 9,23565,23077,23493,18967,23569,22689,23493,18967,23573, -22927,23493, 9,23577,22943,23493,18967,23581,22807,23493,19396,23584, -19396,23585,18967,23584, 9,23590, 9,23584,18967,23594,18967,23585, - 9,23598, 9,23585,18967,23602,19631,23493, 9,23606,18967,23493, -22896,23610,22807,23610, 9,23614, 9,23610,22807,23618, 9,23493, -11949,23622, 4669,23622,22621,23622,19631,23622,22904,23622,22807,23622, -18967,23634,18967,23622,22807,23638, 4669,23493, 9,23642,11949,23493, - 9,23646, 16,21604,22979,23651,21935,23651,22239,23651,22389,23651, -22375,23651,22001,23651,21999,23651,22005,23651,22003,23651,22123,23651, -22129,23651,22983,23651,22981,23651,22987,23651,22985,23651,22989,23651, -22995,23651,22993,23651,22991,23651,22169,23651,22029,23651,22027,23651, -22175,23651,22031,23651,22189,23651,22195,23651,22033,23651, 7,23651, - 3,23706, 3,23651, 7,23710, 586,23651,22957,23651,19545,23717, -20357,23717,20497,23717,10099,23717, 4133,23717, 3799,23717, 9669,23717, - 9179,23717, 4143,23717,19559,23651,20713,23651,20361,23651, 9967,23651, - 9673,23651, 4283,23651, 3807,23651, 8251,23651, 4279,23651, 14,21604, -23175,23755,23199,23755, 5,23755, 1,23760,22677,23763,23023,23763, - 1,23755, 5,23768,22677,23771,23023,23771,16381,23755,14625,23755, - 4569,23755,13325,23755, 8685,23755,19513,23755, 1369,23755, 17,23755, -20219,23755, 4063,23755,10273,23755,20697,23755, 4137,23755, 8401,23755, - 9955,23755, 3863,23755,19631,21605, 11,23808, 5,23810, 6,23808, - 5,23814, 5,23808, 6,23818, 6,23819, 7,23808,23823,23825, - 7,23809,23817,23829,23821,23829,23813,23829, 14,23808,23829,23837, - 6,23809, 15,23808,23841,23843, 9,23808,23457,23847, 9,23809, -19667,21605, 5,23852, 4,23852, 12,23852, 13,23853,23859,23861, - 12,23853, 13,23852,23865,23867, 4,23853,23855,23871, 5,23853, -23857,23875, 8,21605,23646,23879,23642,23879,23606,23879,23851,23879, -22467,23879,22509,23879,19384,23879,19631,23879,23493,23894,23493,23879, -11949,23898, 4669,23898,19631,23898,11949,23879,23493,23906, 4669,23879, -23493,23910,18967,23879, 11,23914, 11,23915,23493,23919, 11,23879, -18967,23922, 14,21605,18967,23926,20501,23929, 17,23929,18967,23927, -20413,23935, 16,21605,22241,23939,22387,23939,22373,23939,22121,23939, -22127,23939,22167,23939,22173,23939,22187,23939,22193,23939,19545,23939, -10099,23939, 4133,23939, 3799,23939, 4143,23939, 9669,23939, 9179,23939, -20357,23939,20497,23939,19625,23939,21549,23939,21105,23939, 11,21604, -23053,23983,23051,23983,23039,23983,21985,23983,22085,23983, 5,23982, - 6,23995,21983,23983,22077,23983,22075,23983,22081,23983,22083,23983, -22572,23983,23847,23983,22465,23983,22507,23983,22211,23983, 9,24017, -19396,23983,22567,23983, 9,24022, 8165,23983, 9,24027,23037,23983, -11949,24031, 4669,24031,19631,24031,19559,23983, 9,24039, 8251,23983, - 9,24043, 3807,23983, 9,24047, 9875,23983, 9,24051,20501,23983, - 9,24055, 9,23982, 8251,24059, 3807,24059,22211,24059,19559,24059, -20501,24059, 9875,24059, 8165,24059, 9,23983,22567,24074,18967,24074, -18967,23983,21183,24081,23997,24081, 375,24081, 7,24081,23995,24089, - 9,24080, 9,21604,22869,24095,23894,24095,21997,24095,21365,24095, -21475,24095,21509,24095,21405,24094,22047,24095,22357,24095,23919,24095, -21995,24095,22583,24095,23906,24095,23910,24095,21127,24094,22319,24125, -20843,24094,22289,24129,22419,24095,22421,24095,21279,24095, 973,24094, - 4745,24139,19559,24095,20361,24095,20713,24095, 9673,24095, 9967,24095, - 4283,24095, 4279,24095, 8251,24095, 3807,24095, 33,24095, 7971,24161, - 8165,24095, 25,24165, 9875,24095,20501,24095, 4745,24095,17423,24095, -21405,24095,20273,24177,21785,24177,19631,24095,23879,24182, 4669,24095, -23879,24186,11949,24095,23879,24190, 973,24095, 4805,24195,19687,24095, -23493,24199,23879,24095,19631,24202,11949,24202, 4669,24202,20413,24095, - 11,24094, 8251,24213, 3807,24213,22211,24213,19559,24213,20501,24213, - 9875,24213, 8165,24213,21127,24095,21751,24229,20843,24095,21757,24233, - 11,24095,19687,24237,23610,24237,23493,24237,18967,24242, 7971,24237, -18967,24237,23493,24248,18967,24095, 10,24252,24213,24255, 10,24253, -24237,24259, 483,24253, 10,21605,23893,24265,24020,24265,22581,24265, -22669,24265,19455,24265,23917,24265,19333,24265,23073,24265,19393,24265, -23060,24265,24092,24265,23925,24265,24078,24265,23651,24265, 9755,24265, - 9317,24265, 4321,24265, 3833,24265,10171,24265, 4295,24265,22149,24265, -18967,24307,24213,24265,18967,24311,24059,24265,18967,24315,21183,24265, -19396,24265,23983,24320,19559,24321, 922,24265, 1413,24265,19683,24265, -24074,24265,18967,24332,23055,24265,18967,24336,24080,24265, 9,24340, -20839,24265,21399,24265,19385,24265,23879,24349, 9,24349,23983,24265, -19396,24355,19396,24354,18967,24355, 9,24360, 9,24355,18967,24364, -18967,24354, 9,24368, 9,24354,18967,24372,18967,24264,19441,24377, -24213,24377,24059,24377,22149,24377,19656,24377,19631,24377, 9,24388, -23983,24377, 9,24393, 9,24377,19631,24396, 903,24265, 483,24400, - 483,24265, 903,24404,18967,24265,23055,24408,24074,24408,19559,24409, - 9,24415, 9,24408,23983,24418,19559,24419,23983,24408, 9,24424, - 9,24265,24080,24428,18967,24428,19559,24433,23983,24432,23983,24428, -18967,24438,18967,24429,19631,24443, 17,21604,21963,24447,23958,24447, -23972,24447,23974,24447,23960,24447,23962,24447,21979,24447,21977,24447, -21967,24447,21965,24447,23964,24447,23966,24447,23968,24447,23970,24447, -21971,24447,21969,24447,21975,24447,21973,24447,22807,24447,19545,24447, -23939,24486,20357,24447,23939,24490,20497,24447,23939,24494, 9669,24447, -23939,24498, 9179,24447,23939,24502, 3799,24447,23939,24506, 4143,24447, -23939,24510,10099,24447,23939,24514, 4133,24447,23939,24518,23939,24447, -19545,24522,20357,24522,20497,24522,10099,24522, 4133,24522, 3799,24522, - 9669,24522, 9179,24522, 4143,24522, 15,24446, 15,21604,23357,24545, -22713,24545,22423,24545, 8337,24545,20103,24545, 17,24544, 483,24545, - 19,21605,22163,24561,18967,24560, 13,21605,24080,24567,22149,24567, -23983,24567,18967,24572,18967,24567,23983,24576, 113,21605,10385,24581, -23879,24583, 9,24583,11731,21605, 67,24589,23879,24591, 9,24591, - 137,21605,12261,21605, 587,24599,10107,24601,11067,24601,12285,24601, - 1346,21605, 1505,24609, 256,21605, 8495,24613,10107,24613, 1486,21605, - 803,24619, 1504,21605,20029,24623,21103,24623,19781,24623, 973,21605, - 2845,24631, 4812,24631, 955,24631, 4805,24636, 2971,24631, 4814,24631, - 9,24631, 4805,24644, 4805,24631, 955,24648, 9,24648, 341,21605, - 803,24655,17049,24655,20884,21605,21820,24661,21807,24661,20413,24664, -20413,24661,21807,24668,21182,21605,21195,24673,21836,24673,21829,24673, -20103,24678,20103,24673,21829,24682,20984,21605,20839,24687,20413,24689, -20413,24686,20839,24693,21258,21605,23755,24697,21749,24697,21574,21605, - 9,24703,21404,21605,24109,24707,21803,24707,21849,24707,21621,24707, -21693,24707,21805,24707,21801,24707,21381,24721, 9,24721, 1141,21605, -17025,24727, 1447,21605,17025,24731, 253,21605,17049,24735, 1471,21605, -17049,24739,21018,21605, 5,24742,20839,24745, 5,24743,20885,24749, -21276,21605, 7,24753,20413,21605, 6,24756, 4,24759,18967,24760, -18967,24759, 4,24764, 4,24765,21314,24759,21570,24756,21571,24757, -24773,24775, 6,24757,21314,24778,21314,24779,20885,24757,24661,24785, -21571,24756,21570,24757,24789,24791,21315,24757,24783,24795,21381,24757, -20885,24756,21791,24801,19475,24756,20984,24756,20839,24807,21315,24756, -21747,24811,24781,24811,23457,24811, 5,24756,20762,24819,20762,24818, -24763,24819,24767,24819,20839,24819,21399,24819,24771,24819,19683,24819, -20763,24819,20843,24837,24823,24837,20763,24818,24821,24843,20839,24843, - 5,24757,24769,24849,20885,24849,24661,24849,20763,24756, 5,24856, -20839,24859, 5,24857,20885,24863,20103,21605,21183,24867,21127,24869, -24673,24869, 15,24866,21183,24866,21795,24877, 15,24867,19687,24866, - 9,24883,19625,24866,20843,24866, 9,24889,21549,24866,21127,24866, -21183,24895, 9,24895,21105,24866,20763,24866, 5,24903,21527,24866, - 9,24867,19687,24909,20843,24909,21127,24909, 6,24866,21036,24917, - 5,24917,18967,24920,18967,24917, 5,24924,21036,24916, 5,24916, -18967,24930,24881,24917,18967,24916, 5,24936, 7,24866,23755,24941, - 1325,24941, 331,24941, 59,24941, 265,24941, 7,24867,23929,24953, -22205,24953,24919,24953,24923,24953,24927,24953,24929,24953,24933,24953, -24939,24953,24905,24953, 4,24953,24903,24973,22269,24953,22263,24953, - 375,24953,21037,24953,24917,24983, 6,24867, 5,24986,24941,24989, -24901,24987,24893,24987,24887,24987,21037,24866,24987,24999, 7,24999, -20273,21605,21258,25004,21259,25005,25007,25009,21183,25005,21259,25004, -21258,25005,25015,25017, 375,25005, 6,25004, 7,25004, 7,25005, -25023,25027,21315,25027, 6,25005,25025,25033,20501,21605, 7,25036, - 4,25039, 4,25038,20885,25037, 7,25037,18967,25047, 5,25049, - 5,25048, 5,25047,18967,25054, 5,25046,21036,25047,21037,25037, -22269,25063,21105,25063, 16,25036, 10,25037, 803,25037, 903,25037, - 9,25037, 17,25036,19625,25036,21105,25036,21549,25036,21037,25036, -21829,25087,25059,25087,21127,25087,24095,25087,25071,25087, 11,25037, - 4,25036, 7,25100,25051,25101, 5,25036,25041,25107,18967,25106, -25099,25111, 5,25037,25103,25115,25043,25115,25087,25115, 7,25114, -25087,25123,25069,25115, 4,25037,25111,25129,25057,25129,25053,25129, -25061,25129,25079,25129, 9165,21605, 9168,25140, 9169,25141,25143,25145, - 9169,25140, 9168,25141,25149,25151, 8337,21605, 15,25155, 6,25155, - 5,25158, 7,25155, 375,25163, 6,25154,25157,25167, 7,25154, -25161,25171,23755,25171, 59,25171, 331,25171, 1325,25171, 265,25171, - 9617,21605, 9630,25184, 9631,25185,25187,25189, 9629,25185, 9631,25184, - 9630,25185,25195,25197, 375,25185, 6,25185, 7,25185, 6,25184, -25205,25207, 7,25184,25203,25211, 9875,21605, 7,25214, 4,25216, - 4,25217, 9893,25215, 16,25214, 803,25215, 9,25215, 17,25214, - 903,25215, 4,25215,25231,25235, 5,25215,25219,25239,25225,25239, - 4,25214, 7,25244,25239,25247, 5,25214,25221,25251, 843,21605, - 9,25255, 413,21605, 7,25259, 375,25259, 1530,21605, 9,25265, - 1216,21605, 7,25269,21497,21605, 7,25273,21277,21605, 7,25276, -21183,25279, 7,25277,21105,25283,21019,21605, 5,25286,20885,25289, - 5,25287,20839,25293, 265,21605, 7,25297, 7971,25299, 587,21605, - 11,25302, 9,25305, 9,25303, 11,25309, 5,25303,20501,25313, - 9875,25313, 903,21605, 9,25319, 11,25321, 11,25318, 9,25325, - 7,25319, 1141,25329, 33,25329, 1447,25329, 1011,25318, 7,25337, - 1275,21605, 9,25341, 1369,25343, 17,25340, 903,25347, 5,25340, - 1505,25351, 5,25341, 253,25355, 53,25355, 1471,25355, 1369,25340, - 9,25363, 1011,21605, 7,25367, 959,25369, 47,25369, 759,25369, - 903,25366, 7,25377, 1369,21605, 9929,25380, 9927,25383,11759,25380, - 7971,25387,17053,25381,10081,25391, 7,25380, 4,25394, 5,25395, - 7,25398,25381,25401, 0,25398,25403,25405, 4,25395, 0,25395, - 5,25410, 1,25380, 5,25415, 1,25416,25381,25419, 6,25416, -25421,25423, 6,25415, 5,25426, 14,25415, 10,25380, 5,25433, - 0,25434, 0,25433, 5,25438, 16,25380,10081,25380, 7971,25445, -17053,25445, 7971,25381,11759,25451,10081,25451, 17,25380, 11,25380, - 11,25381, 1965,25461, 3195,25461,25437,25461,25441,25461, 5197,25461, -25405,25461,25413,25461, 1,25461, 4579,25461,15899,25461, 15,25380, -23763,25483,23771,25483, 3755,25483, 1995,25483, 0,25483,25461,25493, -25477,25483, 4917,25483,17013,25483, 4,25380, 7,25502,20029,25503, -19781,25503,21103,25503, 5,25380,25409,25513, 803,25513, 4,25381, -20033,25519,25457,25519, 5,25381,25397,25525,25505,25525,25443,25525, -10219,25525, 959,25525, 47,25525, 759,25525, 1275,25380, 9,25541, - 241,21605, 9,25545, 483,25545, 7,25544, 8495,25551,10107,25551, -17571,21605, 7,25557, 4,25558, 4,25559, 16,25557, 17,25557, - 4,25556,25567,25569, 5,25556,25561,25573,25565,25573, 4,25557, - 7,25578,25573,25581, 5,25557,25563,25585,17371,21605,16711,25589, - 7,25589,14315,21605, 5,25594, 6,25596, 6,25597, 14,25594, - 15,25594, 6,25594, 5,25606, 7,25594,25601,25611, 6,25595, -25605,25615, 7,25595,25609,25619,25599,25619,25603,25619,15705,21605, - 767,25627, 483,25629, 4,25627, 483,25633,21527,21605,20103,25636, - 5,25637, 17,25641, 5,25636, 9,25645,21315,21605,21183,25648, -21795,25651,21183,25649,24673,25655,21747,25649,20413,25659,23457,25649, -20413,25663,20413,25648,23457,25667,21747,25667,21037,21605,21829,25673, -20501,25675,21127,25673,20501,25679,21105,25673, 11,25673,20501,25685, - 15,25673,20501,25672,24095,25691,21829,25691,21127,25691,20187,25672, -24095,25673,20501,25701, 6,25673, 7,25673, 6,25672,25707,25709, -20103,25709, 7,25672,21749,25715,23755,25715,25705,25715,20103,25672, - 7,25723,20763,21605,20482,25726,20839,25729,20483,25726,21183,25726, - 4,25727,23147,25737,24819,25737, 5,25727,23383,25743,20956,25743, -20773,25743,24953,25743,20885,25743,20413,25752,20413,25743,20885,25756, - 4,25726,21605,25761, 7,25763,25743,25765,24849,25761,20413,25761, - 5,25726,20839,25773,20413,25775,20413,25772,20839,25779,20413,25726, - 5,25782,20839,25785, 5,25783,20885,25789, 5,21604,25275,25793, -25003,25793,25725,25793,24755,25793,21049,25793,21242,25793,20773,25793, -20956,25793,25699,25793,22725,25793,22391,25793,24682,25793,23209,25793, -25712,25793,25733,25793,22711,25793,22395,25793,24668,25793,23213,25793, -25770,25793,25083,25793,23235,25793,22017,25793,25085,25793,23231,25793, -22025,25793,25087,25793,25691,25793,22357,25793,22047,25793,23455,25793, -15567,25793,12971,25793,13355,25793,13541,25793,22869,25793,22635,25793, -23021,25793,23894,25793,23919,25793,21997,25793,21995,25793,22583,25793, -23906,25793,23910,25793,22419,25793,22421,25793,23034,25793,19656,25793, -19441,25793,11970,25793, 4696,25793,22674,25793,22069,25793,25081,25793, -22011,25793, 9357,25793,25205,25793,25027,25793, 9356,25793,25171,25793, -24941,25793,23199,25793,23175,25793,20606,25793,25593,25793,19396,25793, -11131,25793,21059,25793,23018,25793,20501,25933,20057,25793,22633,25793, -20501,25939,21405,25793, 357,25793, 367,25793, 471,25793, 1249,25793, - 628,25793, 4569,25793,14625,25793, 4545,25793,13325,25793, 8337,25961, - 4549,25793,23229,25793,20501,25967,23233,25793,20501,25971,25706,25793, -20186,25793, 8386,25793, 9083,25793, 9484,25793, 9984,25793,20187,25793, - 8387,25793,19513,25793, 8401,25793,20219,25793, 4137,25793,10273,25793, - 4063,25793, 3863,25793,20697,25793, 9955,25793,20353,25793,25709,25793, -20103,26010,25715,25793,24673,25793,20103,26016,24697,25793,21183,25793, -20103,26022,21259,25793, 4745,25793,17423,25793, 9082,25793,22673,25793, -20413,26034,23033,25793,20413,26038,25551,25793,24613,25793,22249,25793, -20326,25793,21087,25793, 9704,25793,23879,25793,19631,26054,11949,26054, - 4669,26054,11949,25793,23879,26062, 9,26062, 4669,25793,23879,26068, - 9,26068,20805,25793,23015,25793,18967,26076,20501,26079,18967,26077, -20413,26083,19631,25793,23879,26086, 9,26086, 9377,25793, 11,26092, - 341,25793, 241,26097, 8165,25793, 256,25793, 257,25793, 11,25793, - 9195,26106,20501,26106, 587,26106, 9377,26106, 9875,26106,20763,26106, -20804,25793,10219,25793, 587,26123, 53,25793,20501,25793, 10,26128, - 10,26129, 11,26128,26133,26135, 11,26129,26131,26139,20413,25793, -20885,26142,24661,26142,25761,26142,22673,26142,23033,26142,20762,25793, -25761,25793,20413,26156,24661,25793,20413,26160,20885,25793,20413,26164, - 17,25793,20762,26168,20762,26169,20763,26169,26171,26175,20763,26168, -26173,26179, 9,25793,11949,26182, 4669,26182,19631,26182,18967,26182, -20273,26182, 9617,26182,20763,25793, 11,26196,25707,25793, 9875,25793, - 10,26202, 10,26203, 11,26202,26207,26209, 11,26203,26205,26213, - 253,25793, 6,25793,25273,26219,24753,26219,24999,26219,24953,26219, -25005,26219,25723,26219,25707,26219,25185,26219,25163,26219,25589,26219, -24081,26219, 4713,26219,16363,26219, 9195,26219, 4863,26219,13119,26219, - 8757,26219, 4213,26219,23493,26219, 8109,26219, 3933,26219, 4147,26219, - 9335,26219,20103,26219, 8337,26219,20273,26219, 8997,26219,25673,26219, - 241,26219,18967,26219, 11,26279, 11,26219, 587,26219, 8387,26219, -14653,26219,20187,26219, 7,25793, 8717,26293, 3785,26293,25673,26292, -23755,26293,10351,26293, 4311,26293, 4329,26293,10055,26293,20103,26292, - 8337,26292, 8997,26292, 15,26293,18967,26317,18967,26292, 241,26292, - 9195,25793, 11,26324, 1471,25793, 6,25792,23175,26331,25977,26331, -24941,26331,26311,26331,26299,26331,25975,26331,25715,26331,24697,26331, -26315,26331,23199,26331,25171,26331,25979,26331,26033,26331,26313,26331, -16381,26331,26323,26331,26103,26331,13325,26331, 8685,26331,26155,26331, -26321,26331,26293,26331,20103,26375,25673,26375, 8997,26375, 8337,26375, - 241,26375,18967,26375, 17,26331, 1369,26331, 4569,26331,19513,26331, - 4063,26331,10273,26331, 3863,26331,20697,26331, 9955,26331, 4137,26331, -20219,26331, 8401,26331,14625,26331, 7,25792,25987,26415,26266,26415, -26201,26415,26274,26415,26272,26415,25989,26415,25981,26415,26268,26415, -21604,26415,18967,26433,26219,26435, 8997,26415,26219,26438,26105,26415, -26276,26415, 8647,26415,19396,26415,26197,26415,26278,26415,26219,26415, -20103,26454,25673,26454, 8997,26454, 8337,26454, 241,26454,18967,26454, - 8337,26415,26219,26468,20103,26415,26219,26472, 9,26415,18967,26476, - 241,26415, 1,26481,26219,26483,26219,26480,25673,26415,26219,26488, -18967,26415, 9,26492,26219,26492, 587,25793, 11,26498, 1369,25793, -25673,25793,20501,26505, 6,26504, 7,26504,26331,26511, 6,26505, -26511,26515, 7,26505,26509,26519,26219,26519,18967,25793, 9,26524, -23015,26524,20501,26529, 483,26525, 6,26524, 7,26524,26331,26537, - 7,26525,26219,26541, 6,26525, 241,25793, 1,26547, 7,26549, -26331,26551, 7,26548,26219,26555, 7,26547, 1,26558,26219,26561, -26219,26559, 7,26546,26331,26567,20273,25793, 9,26570,14315,25793, - 8997,25793, 7,26576,26331,26579, 7,26577,26219,26583, 9617,25793, - 9,26586, 8337,25793, 7,26590,26331,26593, 483,26591, 9,26591, - 7,26591,26219,26601,20103,25793,21183,26604,24673,26604,25709,26604, - 7,26604,26331,26613, 483,26605, 9,26605, 7,26605,26219,26621, - 4,21604,21955,26625,24877,26625,23433,26625,21947,26625,21951,26625, -24801,26625,23415,26625,21943,26625,22282,26625,22251,26625,22266,26625, -22253,26625,24811,26625,25667,26625,22363,26625,22053,26625,21116,26625, -21560,26625,25735,26625,23437,26625,22699,26625,21253,26625,23930,26625, -22206,26625,24805,26625,23937,26625,22587,26625,23039,26625,23053,26625, -23051,26625,21961,26625,21981,26625,20465,26625,20576,26625,21985,26625, -21983,26625,22077,26625,22075,26625, 9573,26625, 9575,26625,23847,26625, -22465,26625,22507,26625, 3,26625, 7,26712, 9605,26625, 586,26625, - 9599,26625,19474,26625,20413,26723,20186,26625,20805,26625,22423,26625, -22713,26625,22205,26625,20501,26734,19625,26625,20501,26738,19687,26625, -23929,26625,20501,26744,23934,26625,20413,26749,22585,26625,20413,26753, - 8386,26625,23927,26625,18967,26759,20501,26761,18967,26758,20413,26765, -23037,26625,19631,26769,11949,26769, 4669,26769, 1418,26625, 9565,26777, - 669,26625, 9565,26781,22263,26625,20501,26784,22269,26625,20501,26788, -21549,26625,20501,26792,20843,26625,21105,26625,20501,26798,21127,26625, -23423,26625,20103,26805,23357,26625, 7971,26625, 1170,26625,25203,26813, -20501,26625,22269,26816,22263,26816,21105,26816,21549,26816,22205,26816, -23929,26816,19625,26816,20762,26625,26219,26833,23361,26625,20413,26837, - 11,26625, 1,26841,18967,26841, 15,26625,18967,26846,20413,26849, -18967,26847,20501,26853, 1369,26846, 9565,26857, 7,26625, 4,26861, - 3,26860, 4,26860,21605,26867,20103,26860, 8337,26860,18967,26860, -26219,26875, 1011,26860,25203,26879, 6,26625,21604,26882,20763,26883, - 6,26624,24811,26889,22053,26889,22363,26889,25667,26889,20501,26889, -25649,26889,20413,26901,18967,26889, 7,26624,24265,26907,19559,26907, - 9673,26907, 8251,26907, 3807,26907, 4283,26907,20361,26907, 4279,26907, -20713,26907, 9967,26907, 483,26625, 1369,26625, 15,26930, 9565,26933, -25649,26625,20413,26937,18967,26625, 15,26940,20413,26943,23927,26940, -20413,26947, 6,26940,21604,26950, 7,26940,26219,26955, 7,26941, -26953,26959,26885,26959,26331,26959,23755,26959, 6,26941, 1011,26625, - 7,26971,25207,26973,23197,26973, 7,26970,25203,26979,20103,26625, - 7,26982, 8337,26625, 7,26986, 9565,26625, 9617,26625, 6,26992, - 7,26992, 6,26993,26997,26999, 7,26993,26995,27003,20273,26625, - 6,27006, 7,27006, 6,27007,27011,27013, 7,27007,27009,27017, - 7,21604,25987,27021,26266,27021,22732,27021,22733,27021,25087,27021, -25691,27021,22357,27021,22047,27021,26027,27021,25989,27021,26268,27021, -20819,27021,20152,27021, 8374,27021, 8389,27021,20201,27021,20952,27021, - 1,27021, 4,27056, 4,27057, 3,27021, 4,27062, 902,27021, -19559,27021,20361,27021, 9673,27021,20713,27021, 9967,27021, 4283,27021, - 4279,27021, 8251,27021, 3807,27021,26100,27021,26106,27021,26128,27021, -26202,27021, 8647,27021,20326,27021,25239,27021,25115,27021, 8800,27021, -21087,27021, 357,27021, 367,27021, 471,27021, 1249,27021, 8086,27021, -19687,27021, 9704,27021,25742,27021,20885,27021, 483,27122, 1141,27021, - 375,27021,20103,27128, 8337,27128,25673,27021,20501,27135,26219,27021, -20103,27138, 8337,27138, 11,27139, 17,27139, 1447,27021,21127,27021, -20843,27021, 8165,27021,25793,27154, 265,27155, 33,27021, 567,27021, -22729,27021,21315,27164, 11,27021,25793,27169, 8495,27169,25793,27168, - 8495,27168,18967,27169,21037,27169,21497,27021,21277,27021,21276,27021, -21496,27021,20273,27021, 9,27190,21315,27190,20103,27021,26219,27196, - 375,27196,21037,27196,21314,27021,22729,27205,20273,27205,21036,27021, -25129,27211,20103,27211,21183,27021, 9,27021,20273,27218, 9617,27218, -21315,27021,22729,27224,20273,27224,21037,27021,20103,27230,25743,27021, - 25,27021, 7971,27236, 7971,27021, 25,27240, 9617,27021, 9,27244, - 8337,27021,26219,27248, 375,27248, 4,27021,25037,27255,25215,27255, - 3,27254, 1,27254,25727,27255, 483,27255,20691,27255, 9923,27255, -18967,27255,20103,27273,18967,27254,22729,27277,20273,27277, 5,27021, -27061,27283, 1,27283,25727,27282,18967,27283,22729,27291,20273,27291, - 17,27283,18967,27297,18967,27282,25129,27301,20103,27301,25793,27021, - 8165,27306, 11,27306,20501,27306, 9875,27306, 9731,27021, 8495,27021, - 11,27318, 4,27020, 1,27323,27283,27324,27286,27323,27289,27323, -27121,27323,24265,27323,27225,27323,27290,27323,27211,27323,27301,27323, -27283,27323, 1,27344,25727,27345,18967,27344,18967,27345,19559,27323, -18967,27323,27283,27356, 4283,27323, 9673,27323, 8251,27323, 3807,27323, -20361,27323, 9967,27323,20713,27323, 4279,27323, 5,27020,27059,27377, -27263,27377,27235,27377,27264,27377, 8647,27377,19396,27377,27231,27377, -27272,27377,27205,27377,27277,27377,27255,27377, 1,27399,25727,27398, -18967,27398,18967,27399,26219,27377, 9,27377,18967,27410,25727,27377, -27255,27414,18967,27377, 9,27418,27255,27418, 1011,27021,25727,27021, - 5,27426,27323,27429, 5,27427,27255,27433,18967,27021, 7,27437, -21605,27439, 4,27441, 4,27440, 4,27439,21605,27446, 4,27438, - 16,27437, 113,27437,11731,27437, 17,27437, 4,27436,22729,27461, -21605,27460,27459,27465,27377,27461,20273,27461, 5,27436,25129,27473, -27443,27473,27323,27473,20103,27473, 5,27437,25101,27483,23193,27483, - 7,27483,21605,27489,27461,27491,27449,27483,27445,27483,27461,27483, -27255,27483,21315,27483, 4,27437, 7,27504,27473,27505,27283,27505, -21037,27505, 483,27021,20885,27514,20501,27021, 241,27519,25793,27518, - 9875,27021, 241,27525,25793,27524,20413,27021, 6,21604,24811,27533, -25667,27533,22363,27533,22053,27533, 1,27533, 5,27542,22605,27545, -22677,27545,23023,27545,25483,27545,20644,27533,21359,27533,25793,27557, -12345,27533, 5,27561, 4,27560,27563,27565, 4,27561, 5,27560, -27569,27571, 5123,27533, 5,27575, 4,27574,27577,27579, 4,27575, - 5,27574,27583,27585,19667,27533, 5,27589, 4,27588,27591,27593, - 4,27589, 5,27588,27597,27599, 341,27533,21052,27533,25793,27605, -25649,27533,20413,27609,25673,27533,21183,27613,26861,27533, 9,27617, -26293,27533, 9,27621,17219,27533, 903,27625, 4663,27533, 903,27629, -23195,27533,21315,27633,10219,27533, 903,27637, 53,27533,25025,27533, -21315,27643,20103,27533, 9,27647,21314,27533,24795,27651,26142,27651, -20413,27651,25793,27656,25793,27651,20413,27660,21036,27533,25129,27665, -21259,27533,26625,27669, 17,27533,21315,27673,21037,27533,25793,27677, -20501,27679,20501,27676,25793,27683, 8337,27533, 9,27687, 1471,27533, - 5,27533, 6,27693, 587,27695,21605,27697, 1,27692,22605,27701, -22677,27701,23023,27701,25483,27701,27699,27701, 6,27692,25380,27713, -27701,27715, 1369,27713,21605,27718,27701,27721,21605,27713, 1369,27724, -27701,27727, 9,27693,18967,27692,25129,27733, 9935,27693,20645,27693, - 4,27533,20501,27740,26524,27741,20501,27745,25793,27741,18967,27748, -20501,27751,18967,27749,20413,27755,18967,27741,25793,27758,20501,27761, -20501,27759,25793,27765,18967,27740,26142,27769,20413,27769,25793,27772, -25793,27769,20413,27776,26940,27533,26969,27781, 253,27533, 4,27532, -24811,27787,22053,27787,22363,27787,25667,27787,20501,27787,25649,27787, -20413,27799,18967,27787, 5,27532,24941,27805,23175,27805,25715,27805, -24697,27805,25171,27805,23199,27805,26959,27805,16381,27805,13325,27805, - 8685,27805,26293,27805, 17,27805, 1369,27805, 4569,27805,19513,27805, - 4063,27805,10273,27805, 4137,27805,20219,27805, 8401,27805, 3863,27805, -14625,27805,20697,27805, 9955,27805, 241,27533,18967,27533,20486,27857, -20487,27857,20413,27857, 4,27862, 4,27863, 580,27857, 483,27857, - 4,27870, 4,27871, 581,27857, 4,27856,27861,27879,26142,27879, -27877,27879,20413,27879,25793,27886,25793,27879,20413,27890, 5,27856, -25129,27895,27859,27895,27865,27895,27869,27895,27873,27895, 5,27857, -25101,27907,27555,27907,23193,27907,27743,27907,27886,27907,27867,27907, -27875,27907,20413,27907,27879,27922,27879,27907,20413,27926, 4,27857, -20413,27930,27895,27933, 483,27930,27895,27937,27895,27931,20413,27941, - 1369,27533, 5,27945,20501,27533,21037,27949, 4,27948,27907,27953, - 5,27948,18967,27956,21037,27948,25793,27961, 4,27949,27959,27965, -27665,27965,27733,27965,27895,27965, 5,27949,27961,27975, 7,21605, - 1,27979, 2,27981, 5,27983, 5,27982, 1010,27981, 5,27981, - 2,27990, 3,27978, 9,27995, 4311,27979,10351,27979, 4329,27979, - 3785,27979,10055,27979, 8717,27979,26283,27979,26388,27979,23790,27979, -27828,27979,22143,27979,22149,27979,24213,27979,24059,27979, 331,27979, - 8337,28027,20103,28027,21036,27978,21049,28033,21242,28033,21183,28033, -20103,28038,20103,28033,21183,28042,26331,27979,20103,28047, 8337,28047, - 17,28046,21277,27978,21183,28055,27693,27979,18967,28059,25793,27979, -21127,28063,20843,28063,19687,28063, 8337,28063,20103,28063, 7971,28063, - 241,28063, 8495,27979, 241,28079, 8337,27978,26331,28083,27805,28083, - 1325,28083, 331,28083, 59,28083,23755,28083,25793,28083, 265,28083, -21037,27979,27665,28101,28033,28101, 11,28101,21315,27979, 1325,27979, - 8337,28111,20103,28111, 59,27979, 8337,28117,20103,28117,10291,27979, - 483,28123,20273,27978,27533,28127,21315,28129,20103,27978,26331,28133, -27805,28133,23755,28133, 331,28133, 1325,28133, 59,28133,25793,28133, - 265,28133,21105,27979, 11,27979,20103,28153, 8337,28153, 17,27979, -26331,28158, 8337,28159,20103,28159,27805,28158,23755,28158,27731,27979, -27692,27979, 9,28173,23755,27979,20103,28177, 8337,28177, 17,28176, -23983,27979, 9,28185, 15,27979, 3,28189,20273,28189, 9617,28189, -27805,27979,20103,28197, 8337,28197, 17,28196, 241,27978,25793,28205, - 8495,28205,10107,28205, 265,27979,20103,28213, 8337,28213, 4,27978, -27985,28219,21105,28219,21549,28219,19625,28219,28173,28219,18967,28229, - 5,27978,19397,28233,28060,28233,18966,28232,18966,28233, 9,28241, -27323,28233,23651,28233,26907,28233, 9755,28233, 9317,28233, 4321,28233, - 3833,28233,10171,28233, 4295,28233,28101,28233,21183,28233, 1413,28233, - 922,28233,27856,28233,28059,28233,18967,28272,19396,28233,28239,28277, -19683,28233,18967,28232,28235,28283,28242,28283,28241,28283, 9,28288, - 9,28283,28241,28292,27533,28233,18967,28296, 9,28233,18967,28300, -28239,28303,18967,28301,28241,28307,21399,28233,20839,28233, 483,28233, - 903,28314, 903,28233, 483,28318,18967,28233,28059,28322,28239,28323, - 9,28327,27533,28322, 9,28322,28239,28333, 4,27979,27987,28337, -27993,28337,28270,28337,28330,28337,28298,28337,27989,28337, 586,28337, - 3,28337, 7,28352, 7,28337, 3,28356,27856,28337,28233,28360, -21575,28337,28296,28337,18967,28366,27533,28337,28322,28370,18967,28370, -28233,28374,28233,28370,18967,28378,28322,28337,27533,28382,18967,28337, -28296,28386,27533,28386,28233,28390,28233,28386,27533,28394,28233,28337, -27856,28398,27533,28398,18967,28402,18967,28398,27533,28406, 5,27979, -27255,28411, 9287,28411,20885,28411,27533,28410,28219,28419,18967,28421, - 9,28419, 241,28411, 483,28427,28219,28411,27856,28431,27533,28431, -18967,28434,18967,28431,27533,28438,18967,28410,28219,28443, 17,28443, -21036,27979,21069,28449,21267,28449,21305,28449,28219,28449,21259,28449, -20103,28459, 17,28449,21037,27978,26331,28465,21749,28465,27805,28465, -23755,28465,28449,28465,25793,28465,10001,27979, 9,28479,27533,27979, -21496,28483,21277,28483,20885,28483,27931,28483, 9,28483, 9731,28483, -21037,28482,21037,28483,21315,28483,20273,28500,21036,28482,28499,28505, -21036,28483,28497,28509,20273,28483,21315,28512, 4,28483, 5,28483, -28386,28519,28337,28519,18967,28522,18967,28519,28337,28526, 17,28519, - 4,28482,28519,28533, 5,28482,28517,28537,28219,28537,18967,28541, - 9,28537, 1275,27979,20031,28547,20885,28547, 5,28547,18967,27979, -20103,28555, 5,28555,28337,28559, 9,28559, 5,28554,28219,28565, - 17,28565,21527,27979,18967,27978,28519,28573, 7,28573, 4,28576, - 4,28577,28553,28573,21605,28573, 5,28584,28581,28587, 5,28585, -28579,28591, 16,28573,28591,28595, 11,28573,20273,28573, 567,28573, - 5,28572, 4,28573, 7,28606,28591,28609,28483,28607,28547,28607, - 483,28607, 5,28573,21605,28618,28581,28621,20762,21605,20803,28625, - 7,28625, 4,28628,25743,28631, 4,28629,24687,28635,25773,28635, -21035,28625, 16,28625,25743,28643,20999,28625,20985,28625, 483,28649, - 11,28625,20273,28625, 567,28625, 4,28624,20985,28659, 5,28624, -20956,28663,20773,28663,20885,28663,20413,28668,20413,28663,20885,28672, -20482,28625,20839,28677, 4,28625, 7,28680,25743,28683,20843,28681, - 483,28681, 5,28625,21605,28690,28635,28693,20839,28691,20413,28697, -20413,28690,20839,28701,20413,28625, 5,28705,20885,28707, 5,28704, -20839,28711, 5,21605,21183,28715,18967,28716,24673,28719,21194,28715, -24673,28723,28573,28714,28581,28727,20620,28714,20621,28714, 9994,28714, - 9995,28714, 1,28715, 1,28714,26781,28741, 668,28741,26625,28745, -26777,28741, 1419,28741,26625,28751,26857,28741,26933,28741, 2,28741, - 9,28741, 587,28760,26625,28763, 587,28741, 9,28766,26625,28769, -21018,28714,20839,28773,19396,28715,22579,28777,21611,28777,19683,28715, -20413,28783,23490,28715,20413,28787,21526,28714,26816,28791,24953,28791, - 17,28791,20501,28791,26625,28798,26625,28791,20501,28802,20762,28714, -20773,28807,20956,28807,20885,28807,20413,28812,20413,28807,20885,28816, -27787,28715,18967,28821,20501,28823,18967,28820,20413,28827,27802,28715, -20413,28831,21019,28714,20885,28835,27856,28715,20413,28839,27931,28715, -20413,28843,26904,28715,20413,28847,26861,28715,18967,28851,20823,28715, -20645,28715, 9935,28715,21362,28715,21376,28715,27533,28715,18967,28865, -20501,28867,18967,28864,20413,28871, 9994,28715,28737,28875,20822,28715, -28807,28879,20763,28715,28835,28883,28816,28883,20866,28883,21021,28883, -20413,28883,28807,28892,20843,28892,28807,28883,20413,28898, 9,28899, -20843,28883,20413,28904, 9,28882,28807,28909, 803,28715, 11,28913, -27979,28715,18967,28917,20621,28715,28731,28921,20413,28714,21399,28925, -20839,28925,25737,28925,19683,28925,20763,28925,20843,28935,28807,28935, -20763,28924,20839,28941,25737,28715,20413,28945,20839,28715,20413,28949, -20620,28715,28733,28953,21399,28715,20413,28957, 483,28715,21315,28960, -26860,28715,28337,28715, 11,28967,23457,28715,18967,28970,20413,28973, -18967,28971,20501,28977, 9,28715,21315,28980,20763,28981,20763,28980, -28807,28987, 17,28715,11949,28991, 4669,28991,19631,28991,18967,28991, -20273,28991, 9617,28991, 9995,28715,28735,29005, 1275,28714, 1505,29009, -26889,28715,18967,29012,20413,29015,18967,29013,20501,29019, 1369,28714, - 803,29023, 587,28715, 1505,28715, 6,28714,26940,29031,20413,29033, -28965,29031,18967,29037,18967,29030,26816,29041,24953,29041, 17,29041, -20501,29041,26625,29048,26625,29041,20501,29052,26625,29031,18967,29056, -20413,29059,18967,29057,20501,29063,18967,29031,20413,29067,26625,29069, -26625,29066,20413,29073, 7,28714,19397,29077, 0,29077, 2,29080, -28991,29083, 2,29077, 0,29087, 0,29086,28991,29091,28999,29077, - 1,29076,29091,29097,29083,29097,29081,29097, 2,29103, 1,29077, -29089,29107, 2,29107,28852,29077, 0,29076, 2,29115,29107,29116, -29110,29115,29107,29115, 2,29122,18966,29076,18966,29077,29097,29129, -28991,29129, 9,29129,27323,29077,23651,29077,26907,29077, 9755,29077, - 9317,29077, 4321,29077, 3833,29077,10171,29077, 4295,29077,21183,29077, - 1413,29077, 922,29077,26940,29077,28851,29077,18967,29162,19396,29077, -29127,29167,19683,29077,18967,29076,29079,29173,29134,29173,29129,29173, - 9,29178, 9,29173,29129,29182,26625,29077,18967,29186,21399,29077, - 9,29077,18967,29192,29127,29195,18967,29193,29129,29199,20839,29077, - 483,29077, 903,29204, 903,29077, 483,29208,18967,29077,29115,29213, -28851,29212,29127,29213, 9,29219,26625,29212, 9,29212,29127,29225, - 6,28715,29083,29229,29097,29230,29091,29229,29097,29234,29098,29229, -29100,29229,29105,29229,29109,29229,29119,29229,29121,29229,29125,29229, -29111,29229,29115,29253,24907,29229,25639,29229,22369,29229,28600,29229, -28557,29229,28654,29229,22057,29229,29178,29229,29160,29229,19706,29229, -10737,29229,10475,29229,10979,29229,19597,29229,12137,29229,29219,29229, -29215,29229,29130,29229,29222,29229,29129,29229,29173,29294,29097,29294, -29188,29229,29097,29229,29091,29302,29083,29302,29129,29302, 1,29229, - 5,29310, 5,29229, 1,29314,29173,29229,29129,29318,19687,29229, -19631,29322,26940,29229,29077,29326,10697,29229, 8165,29331,19631,29229, -19687,29334,21575,29229,20273,29229,28573,29340,28625,29340,29186,29229, -18967,29346,19384,29229,19559,29351,28625,29229,20273,29354,28573,29229, -20273,29358, 11,29229,18967,29362,19559,29365,18967,29363,19631,29369, - 587,29229,21605,29373,29313,29375,29317,29375,26625,29229,29212,29380, -18967,29380,29077,29384,29077,29380,18967,29388,29212,29229,29127,29393, -29115,29393,26625,29392,18967,29229,29186,29400,29077,29401,29173,29405, -29097,29405,26625,29400,29077,29410, 11,29401,19687,29415, 11,29400, -19559,29419,29077,29400,29127,29423,26625,29422,29115,29423,29077,29229, -26940,29430,26625,29430,18967,29434,18967,29430,29127,29439,26625,29438, -29115,29439,18967,29431,29129,29447, 7,28715,28791,29451,29041,29451, -19625,29451,21549,29451,21105,29451,26625,29450,29031,29463,18967,29465, - 1275,29451, 903,29469,29031,29451,26940,29473,26625,29473,18967,29476, -18967,29473,26625,29480,20763,28714,28635,29485,28855,29485,20839,29485, -20413,29491,20413,29484,20839,29495, 9,29485,20762,28715,28941,29501, -29495,29501,28773,29501,20815,29501,20993,29501,21027,29501,28985,29501, -29498,29501,29485,29501,20413,29519, 9,29518,20985,29501,20413,29525, - 9,29501,29485,29528,21527,28714,29229,29533, 9,29533,26940,28715, -20413,29539, 9731,28715, 7,29543,26625,28715,20762,29547, 6,29547, - 7,29547,29400,29553,29229,29553,18967,29556,18967,29552,18967,29553, -29229,29562, 6,29546,29553,29567, 7,29546,29551,29571,29031,29571, -18967,29575,18967,29546,20413,29579,18967,29547,20501,29583, 6,29582, - 7,29582, 6,29583,29589,29591, 7,29583,29587,29595, 903,28715, - 7,29599,18967,28715,21183,29602,24673,29605,21183,29603,21795,29609, -23457,29602,20413,29613,27787,29602,20413,29617,27533,29602,20413,29621, -20413,29603,27787,29625,26889,29625,26625,29625,27533,29625,23457,29625, -26889,29602,20413,29637,26625,29602,20413,29641,21315,28715,21183,29645, -24673,29645,25709,29645, 7,29645, 483,29644, 9,29644,18967,28714, -27965,29659,27948,29659,26816,29659,26898,29659,27796,29659,24953,29659, -20119,29659,25129,29659,29653,29659,26887,29659,23480,29659,25099,29659, -21605,29659, 6,29684,29645,29687,29451,29659,28625,29691,28573,29691, -20187,29659,28625,29659,19683,29659,20839,29659,21399,29659,28573,29659, -27787,29659,20501,29708,20501,29659,27787,29712,26889,29712,26625,29712, -27533,29712,23457,29712,27533,29659,20501,29724, 17,29659, 6,29658, -26816,29731,24953,29731,29451,29731, 17,29731,20501,29731,26625,29740, -26625,29731,20501,29744, 7,29658,29697,29749,20103,29749,20186,29659, -29731,29755, 6,29659,29752,29759,24941,29759,23175,29759,29645,29759, -28133,29759,21605,29758,29645,29771,20103,29759,29749,29774,29077,29759, -29749,29759,20103,29780, 11,29759,20763,29759,26625,29787, 7,29659, -29731,29791,20103,29793,20103,29790,29731,29797,23457,29659,20501,29800, -26889,29659,20501,29804,20103,29659, 7,29809,29759,29811, 7,29808, -29731,29815,26625,29659,20501,29818, 6,29819, 7,29819, 6,29818, -29825,29827, 7,29818,29823,29831,21036,21605,27965,29835,27951,29835, -27948,29835,26816,29835,27796,29835,26898,29835,27216,29835,28151,29835, -28101,29835,26887,29835,21194,29835,24673,29857,24675,29835,21069,29835, -21267,29835,21305,29835,24953,29835,20119,29835,22723,29835,25129,29835, -25063,29835,23480,29835,21796,29835,21795,29835,20501,29882,25099,29835, -18967,29835,21183,29889,21795,29891,21183,29888,24673,29895,21259,29835, -20103,29899,21183,29835,27021,29902,18967,29902,24673,29907,20187,29835, -21127,29911,28573,29835,28625,29835,19683,29835,20839,29835,21399,29835, -27787,29835,20501,29924,27533,29835,20501,29928,27021,29835,21183,29932, -20501,29835,27787,29936,26889,29936,26625,29936,27533,29936,23457,29936, -21795,29936, 17,29835, 6,29834,26816,29953,21069,29953,21267,29953, -24953,29953,21305,29953,25063,29953,21259,29953,20103,29967, 17,29953, -20501,29953,26625,29972,26625,29953,20501,29976, 7,29834,21242,29981, -29911,29981,21049,29981,21183,29981,20103,29988,20103,29981,21183,29992, -20186,29835,29953,29997,21105,29997, 6,29835,28133,30003,21279,30003, -21166,30003,29992,30003,23175,30003,24941,30003,20103,30003,21127,30016, -29981,30016,21127,30003,20103,30022,29981,30003,20103,30026, 11,30003, -20763,30003,26625,30033, 7,29835,21105,30037,20103,30039,29953,30037, -20103,30043,20103,30036,29953,30047,21105,30047,23457,29835,20501,30052, -26889,29835,20501,30056,26625,29835,20501,30060, 6,30061, 7,30061, - 6,30060,30067,30069, 7,30060,30065,30073,20103,29835, 7,30077, -30003,30079,21183,30079, 7,30076,29953,30085,21105,30085, 4,21605, -26371,30091,26450,30091,26539,30091,26542,30091,27439,30090,27483,30101, -17048,30091,26496,30091,26452,30091,26373,30091,26466,30091,26386,30091, - 586,30091, 803,30117, 586,30090, 767,30121, 1,30091, 15,30124, - 2,30124, 7,30124,26219,30131, 7,30125,23755,30135,26331,30135, -27805,30135,25793,30135, 1,30090,26454,30145,26375,30145,26415,30145, -26219,30150,26219,30145,26415,30154,26292,30145,26331,30159,25793,30145, - 7,30162,26331,30165, 7,30163,26219,30169, 7,30145,25793,30173, -26415,30175,25793,30172,26331,30179, 3,30090, 767,30183,26454,30091, -18967,30186,26375,30091,18967,30190,28159,30091, 8684,30091, 8647,30091, -26154,30091,26331,30201,26534,30091,26541,30205,26536,30091,26331,30209, -26320,30091,26331,30213,19384,30091,20501,30217,19474,30091,20611,30091, - 9989,30091,20762,30090,20985,30227,27436,30091,20501,30231,27507,30231, -27451,30231,27453,30231,26492,30091,26219,30240,26278,30091,26415,30244, -26219,30091,26541,30248,26492,30248,26415,30248,18967,30254,18967,30248, -26415,30258,27021,30091,18967,30263,20413,30265,18967,30262,20501,30269, -21527,30091, 9,30273,21258,30091,21575,30091,20501,30279,20985,30091, -20501,30090,27907,30285,27483,30285, 340,30091, 9,30091, 483,30091, -26292,30091,26331,30297,18967,30299,18967,30296,26331,30303,20413,30091, -20763,30307,25793,30309,26197,30091,26415,30312, 375,30091,24095,30091, -18967,30319,20413,30321,18967,30318,20501,30325,24252,30091,20501,30329, - 15,30091, 1,30332,18967,30332, 11,30091,18967,30339,20413,30341, -18967,30338,20501,30345, 1369,30339, 9565,30349,28741,30349,30129,30349, -27979,30339,19631,30357,11949,30357, 4669,30357,26415,30091, 1,30365, -26219,30367,26197,30364,26278,30364,26219,30364,18967,30374,18967,30364, -26219,30378,18967,30365,26219,30383, 1369,30090,20029,30387,19781,30387, -21103,30387,26541,30091,26219,30394, 6,30090,23646,30399,23642,30399, -23606,30399,24349,30399,26086,30399,26062,30399,26068,30399,24583,30399, -24591,30399,19384,30399,24265,30419,25793,30399,19631,30422,11949,30422, - 4669,30422,11949,30399,23493,30430,25793,30430, 4669,30399,23493,30436, -25793,30436,19631,30399,23493,30442,25793,30442, 11,30399,18967,30448, -24265,30451,18967,30399, 11,30454,24265,30457, 11,30455,23493,30461, -25793,30461,23493,30399,11949,30466, 4669,30466,19631,30466, 7,30090, -21549,30475,21105,30475,19625,30475, 6,30091,26524,30483,26545,30485, -26524,30482,26541,30489, 7,30091,26525,30492,30455,30493,25793,30497, - 2,30493, 0,30500,30422,30503,25793,30503,30399,30506,30399,30503, -25793,30510, 0,30493, 2,30514,30422,30517,25793,30517,30399,30520, -30399,30517,25793,30524, 1,30492,26219,30529,18966,30493,30422,30533, -25793,30533,30399,30536,30399,30533,25793,30540, 8495,30492,21183,30493, - 8495,30493,26524,30492,26331,30551,21037,30492,25793,30492,26331,30557, -18967,30559,18967,30556,26331,30563, 265,30492, 265,30493,25793,30493, -26541,30571,30495,30571,26492,30571,26415,30571,18967,30578,18967,30571, -26415,30582,18967,30492,26219,30587,25793,30586,26331,30591,25793,30587, -26415,30595,20763,30090,26142,30599,24849,30599,25793,30599,20413,30604, -20413,30599,25793,30608,20762,30091,26219,30613,20885,30613,25793,30612, -26331,30619,25793,30613,26415,30623,26524,30091,20501,30627, 6,30626, -26541,30631, 7,30626,26331,30635, 6,30627,26537,30639,30635,30639, - 7,30627,30631,30645,26219,30645, 8495,30091, 7,30650,25793,30091, - 1,30655, 7,30656,26219,30659, 7,30657,26331,30663,20762,30654, -26331,30667,20762,30655,26197,30671,26219,30671, 6,30655, 7,30655, -26197,30679,26278,30679, 1,30678,26219,30685,26219,30679,18967,30688, -18967,30678,26219,30693,18967,30679,26219,30696, 6,30654,30679,30701, - 7,30654,26331,30705,18967,30707,30677,30705,18967,30704,26331,30713, -18967,30654,20501,30717, 6,30716, 7,30716,26331,30723, 6,30717, -30723,30727, 7,30717,30721,30731,26219,30731,18967,30655,20413,30737, - 7,30736,26219,30741, 7,30737,26331,30745, 265,30091, 0,30748, - 6,30751,21605,30752,21605,30751, 6,30756, 6,30757, 7,30748, -30755,30763,30759,30763, 7,30749,30761,30769,18967,30091,26454,30772, -26375,30772,26292,30772,26331,30779, 11,30772,20501,30783, 15,30772, -27021,30772,20501,30789,20501,30773,25793,30793,27021,30793,24095,30793, -26415,30772,26219,30800,20187,30773,25793,30805,26219,30772,26415,30808, -24095,30772,20501,30813, 6,30773,26604,30817,29645,30817,25793,30817, -20103,30822,20103,30817,25793,30826, 7,30773,26331,30831,27805,30831, -23755,30831,25793,30831, 6,30772,30831,30841, 7,30772,26219,30845, -25793,30844,26331,30849,30817,30845,25793,30845,26415,30855,25793,30772, -20501,30859, 6,30858, 7,30858,26331,30865, 6,30859,30865,30869, - 7,30859,30863,30873,26219,30873,20103,30773,26219,30879, 7,30879, -25793,30883,21037,30091, 6,30887, 7,30887, 6,30886,30891,30893, - 7,30886,30889,30897,18967,30090,27530,30901,26142,30901,26009,30901, -26270,30901,28571,30901,26454,30901,26375,30901,24210,30901,27459,30901, -26219,30901,20273,30920,26415,30920,20413,30901,25793,30926,27021,30926, -24095,30926,27021,30901,20413,30934,20985,30901,24095,30901,20413,30940, -20352,30901,25793,30945,26292,30901,26331,30949, 7,30901,25793,30953, -20273,30955,26415,30955,20273,30952,25793,30961,25793,30952,26331,30965, -26415,30901,26219,30968,20273,30901,26219,30972, 7,30972,25793,30977, -25793,30901,20413,30980, 7,30981,26219,30985, 7,30980,26331,30989, -21314,21605,27530,30993,26142,30993,26270,30993,26009,30993,26454,30993, -26375,30993,28571,30993,24795,30993,24799,30993,24210,30993,21850,30993, -21845,30993,20413,31016,27459,30993,18967,30993, 6,31023,29645,31025, -26219,30993,20273,31028,26415,31028,27021,30993,20413,31034,20413,30993, -25793,31038,27021,31038,24095,31038,21845,31038,20985,30993,24095,30993, -20413,31050,26292,30993,26331,31055,20352,30993,25793,31059, 7,30993, -25793,31063,20273,31065,26415,31065,25793,31062,26331,31071,20273,31062, -25793,31075,26415,30993,26219,31078,25793,30993,20413,31082, 7,31083, -26219,31087, 7,31082,26331,31091,20273,30993,26219,31094, 7,31094, -25793,31099, 6,21605,27347,31103,27401,31103,27378,31103,27327,31103, -27380,31103,27329,31103,27263,31103,27377,31116,27285,31103,27059,31103, -27377,31122,27194,31103,27203,31103,27215,31103,27208,31103,27228,31103, -27233,31103,27188,31103,27187,31103,27184,31103,27183,31103,27294,31103, -27275,31103,27305,31103,27280,31103,27481,31103,27470,31103,27341,31103, -27394,31103,27122,31103,27390,31103,27337,31103,26796,31103,26802,31103, -30939,31103,30229,31103,30616,31103,31049,31103,28681,31103,20843,31180, -28686,31103,22287,31103,28661,31103,28649,31103,27502,31103,27513,31103, -25030,31103,24983,31103,30283,31103,25683,31103,21058,31103,29835,31205, -21195,31103,29835,31209,25629,31103,13894,31103,13919,31103,27498,31103, -27509,31103,27930,31103,27895,31223,27857,31103, 4,31226,27895,31229, - 4,31227,27907,31233,27479,31103,27468,31103,27500,31103,27511,31103, -26941,31103, 9457,31103,30118,31103,30185,31103,30123,31103,30105,31103, -26742,31103, 9444,31103, 9435,31103, 713,31260,30751,31102,30763,31265, -30221,31103,19397,31102,28777,31271, 3119,31103, 3027,31103, 3805,31103, - 4820,31103, 6469,31103, 3419,31103,27422,31103,27359,31103,27392,31103, -27339,31103,27343,31103,27396,31103,27404,31103,27351,31103,27352,31103, -27407,31103, 9539,31103,24554,31103,29659,31102,29645,31311,17294,31103, -26843,31103,30335,31103,26845,31103,25689,31103,30337,31103,30787,31103, -24552,31103,25157,31103,24881,31103,28387,31103,28386,31102,31335,31337, -28387,31102,28386,31103,31341,31343,27287,31103,27323,31347,30127,31103, -30117,31103, 803,31352, 3,31103, 0,31356,27277,31103,20273,31360, -27377,31360,27461,31103,20273,31366,27483,31366,27377,31366,27205,31103, -20273,31374,27377,31374,27218,31103,27316,31103,27398,31103,18967,31384, -27345,31103,18967,31388, 413,31103,30292,31103,26986,31103,26982,31103, - 9287,31103,27224,31103,20273,31402,27323,31403,21276,31103,29835,31409, -21496,31103,27021,31412,27021,31413,21277,31103,27021,31418,27021,31419, -21183,31419, 6441,31103, 759,31427, 4403,31103,17075,31103,16329,31103, - 4919,31103,17099,31103, 9362,31103, 5309,31103, 4547,31103,27291,31103, -20273,31446,27323,31447,26810,31103,26990,31103, 777,31103, 824,31103, - 244,31103, 4933,31103, 5297,31103,17077,31103,13019,31103,12705,31103, -13673,31103,18391,31103,18617,31103,14597,31103,27210,31103,27323,31481, -27472,31103,27323,31485,27300,31103,27323,31489,26317,31103,26476,31103, - 9134,31103, 1216,31103,19687,31103,26625,31500,19397,31103,29659,31505, -29835,31505,22655,31505,23622,31103,27410,31103,22139,31103,22163,31103, -24543,31103,24557,31103, 305,31103,21036,31102,26816,31527,25063,31527, -31245,31527,21069,31527,21267,31527,21305,31527,24953,31527,21259,31527, -20103,31543, 17,31527,20501,31527,26625,31548,26625,31527,20501,31552, -26415,31103, 9,31556,26940,31103,29645,31103,29659,31563,27418,31103, -27255,31566,27272,31103,27377,31570,27255,31103,27483,31574,27418,31574, -27377,31574,18967,31580,18967,31574,27377,31584, 8446,31103, 155,31103, -17049,31103, 1369,31593, 8861,31103,26625,31103,21127,31598,20843,31598, -19687,31598, 8337,31598,20103,31598, 7971,31598, 9565,31598,18967,31598, - 9731,31103,27021,31616,30613,31103,20885,31620, 9617,31102,26973,31625, - 8337,31103,24545,31628,26625,31628, 9,31628, 4819,31103, 713,31636, -13857,31103, 713,31640, 4543,31103,21372,31103,21315,31103,27190,31648, -27483,31648,25027,31648,27021,31649,20273,31657,27377,31657,27021,31648, -20273,31662,27323,31663,20273,31648,27021,31668,27021,31669, 11,31648, -21037,31103,29835,31677,20103,31679,20763,31676,29835,31683,20103,31676, -29835,31687, 713,31103,13857,31690, 9435,31690, 4819,31690, 803,31690, - 25,31103, 7971,31103,26625,31702,20884,31103,29659,31707,29835,31707, -20984,31103,28659,31713,28625,31713,30227,31713,22285,31713,17233,31103, - 903,31722,30091,31103, 9,31726,20162,31103,20171,31103,25027,31103, -21315,31734,27190,31103,21315,31738,21127,31103,26625,31742,20843,31103, -26625,31746,28681,31746, 9565,31103,26625,31752, 8997,31103, 9,31756, - 766,31103, 9455,31761,30121,31761, 3803,31761, 759,31761, 9,31103, -27021,31770,30091,31770, 9195,31770, 241,31770,26415,31770, 8997,31770, -27377,31770,23493,31770, 8337,31770,20103,31770, 1011,31103, 903,31792, - 241,31103, 9,31796,27297,31103,27282,31103,27323,31803,18967,31805, -18967,31802,27323,31809, 17,31803,20103,31103,24545,31814,26625,31814, -21037,31814,29835,31821, 9,31814,21037,31815,25793,31827,20273,31103, -27224,31830,27291,31830,27205,31830,27277,31830,27461,31830,21315,31830, -27021,31842,27021,31843,27021,31830,21315,31848,27231,31103,27377,31852, - 803,31103,30117,31856, 713,31856,20885,31103,27021,31862,30613,31862, -23493,31103, 9,31868,24545,31103,20103,31872, 8337,31872, 17,31873, - 11,31103,28715,31881,19631,31883,11949,31883, 4669,31883,21315,31880, - 8451,31103,27377,31103,27059,31894,27263,31894,27205,31894,27231,31894, -27461,31894,27272,31894,27277,31894,27255,31894,18967,31910, 9,31894, -18967,31894,27255,31916, 903,31103,17233,31920, 1011,31920, 257,31103, -27483,31103,21315,31928,27461,31928,27255,31928, 4,31102,23646,31937, -23642,31937,23606,31937,24349,31937,26086,31937,26062,31937,26068,31937, -24583,31937,24591,31937,19384,31937,24265,31957,25793,31937,19631,31960, -11949,31960, 4669,31960,11949,31937,23493,31968,25793,31968, 4669,31937, -23493,31974,25793,31974,19631,31937,23493,31980,25793,31980, 11,31937, -18967,31986,24265,31989,18967,31937, 11,31992,24265,31995, 11,31993, -23493,31999,25793,31999,23493,31937,11949,32004, 4669,32004,19631,32004, - 5,31102,26940,32013,20413,32015,18967,32012,26816,32019,24953,32019, -31245,32019, 17,32019,20501,32019,26625,32028,26625,32019,20501,32032, -26625,32013,18967,32036,20413,32039,18967,32037,20501,32043,18967,32013, -20413,32047,26625,32049,26625,32046,20413,32053, 4,31103,27857,32057, -27879,32059,27857,32056,27895,32063,20763,32056,29835,32067,29659,32067, -28715,32057,29083,32073,29091,32073,19631,32073,11949,32073, 4669,32073, -29129,32073,18967,32073,29077,32087,18967,32056,23147,32091,24819,32091, -28925,32091,28715,32091,20413,32099, 5,31103,27437,32102,19397,32103, -21605,32103,20762,32108,20762,32109, 586,32108, 586,32109,31993,32103, -25793,32119, 2,32103,21605,32123, 0,32122,31960,32127,25793,32127, -31937,32130,31937,32127,25793,32134,32073,32127, 0,32103,21605,32141, - 2,32140,31960,32145,25793,32145,31937,32148,31937,32145,25793,32152, -32073,32145, 586,32140, 586,32141,21605,32102,18966,32102,18966,32103, -21605,32167, 7,32169, 9,32167,31960,32167,25793,32167,31937,32176, -31937,32167,25793,32180,32073,32167, 1,32103,32125,32187,31937,32189, - 3,32103,32143,32193,31937,32195,28573,32103,28625,32103,20843,32201, - 9195,32103,20501,32103,21183,32103,27436,32102,27323,32211, 9377,32103, - 713,32215, 9875,32103,19396,32103,32165,32221, 9,32103,18967,32224, -32165,32227,18967,32225,32167,32231,20763,32102,22285,32235,28659,32235, -28625,32235,32111,32235,30227,32235,30772,32103,20501,32247,27021,32102, -27323,32251,18967,32253,18967,32250,27323,32257, 17,32251, 1369,32103, - 903,32103, 9,32265, 587,32102, 9455,32269,32159,32269,32115,32269, - 3803,32269,30121,32269, 759,32269,25673,32103,20501,32283,20763,32103, -32113,32287,27021,32287,30613,32287, 587,32103,32161,32295,32117,32295, -30117,32295, 713,32295,27021,32103,27483,32305,32105,32305,27418,32305, -27377,32305,18967,32312,18967,32305,27377,32316,31992,32103,32163,32321, -18967,32103,32163,32325,31937,32327,32165,32325, 9,32331, 9,32324, -32165,32335,30091,32324,20501,32339,31937,32324,32163,32343,31937,32103, -18967,32346,32163,32349,30091,32103, 9,32353,18967,32352,20501,32357, -18967,32353,20413,32361,18967,32102,24953,32365,32171,32365,32107,32365, -32172,32365,32167,32365, 9,32374, 9,32365,32167,32378,27021,32364, -27323,32383,27021,32365,27377,32387,21037,31102,26604,32391,31561,32391, -31615,32391,29645,32391,25793,32391,20103,32400,20103,32391,25793,32404, -21314,31103,23147,32409,24819,32409,28925,32409,28715,32409,20413,32417, -21036,31103,25673,32421,20501,32423,25087,32421,25691,32421,22357,32421, -24953,32421,21049,32421,21242,32421,21183,32421,20103,32438,27021,32420, -27323,32443,20103,32421,21183,32446,27021,32421,27377,32451,27436,31103, - 5,32454,27323,32457, 5,32455,27255,32461, 9195,31103, 9,32464, -27021,31103,21496,32468,21277,32468,20885,32468, 9,32468, 9731,32468, -21037,32468,21315,32468,20273,32482,27323,32483,21037,32469,21315,32469, -27205,32491,21036,32468,27323,32495,32489,32495,21036,32469,27231,32501, -32481,32501,20273,32468,21315,32506, 4,32469, 5,32469,27231,32513, -27272,32513,27255,32513,18967,32518,18967,32513,27255,32522, 9,32513, - 4,32468,32513,32529, 5,32468,27323,32533,18967,32535,32511,32533, -18967,32532,27323,32541, 17,32533,18967,32468, 5,32546,27323,32549, - 5,32547,27255,32553, 587,31103,30091,32557, 803,32559, 5,32556, - 9455,32563, 3803,32563,30121,32563, 759,32563, 5,32557, 9435,32573, - 803,32573,18967,31103,32391,32579,26625,32581,27398,32578,27345,32578, -21605,32578, 7,32589, 4,32591, 4,32590, 4,32589, 7,32596, - 16,32589,27282,32578,27323,32603,26625,32578,32391,32607,27377,32578, -27255,32610,20483,32579,25793,32615,27255,32578,27377,32618,21183,32579, -26625,32623, 4,32579,26142,32627,24849,32627,21605,32627, 7,32633, -25793,32627,20413,32636,20413,32627,25793,32640, 5,32579,32593,32645, - 4,32578,24819,32649,23147,32649,28925,32649,28715,32649,20413,32657, - 5,32578,24953,32661,32595,32661,32599,32661,32635,32661,32601,32661, -27021,32660,27323,32673,27021,32661,27377,32677,27021,32578, 5,32680, -27323,32683, 5,32681,27255,32687,20763,31103,18967,32691, 5,32692, - 5,32693,21037,32690,29835,32699,29659,32691,29835,32691,21036,32691, -21037,32691,25793,32709,30091,32691,20885,32713, 4,32691,32697,32717, - 5,32691,18967,32720,28681,32721, 4,32690,32723,32727,32695,32727, -29659,32727,29835,32727,32707,32727, 5,32690,28625,32739,22285,32739, -28659,32739,30227,32739,32709,32739,18967,31102, 5,32750,26816,32753, -24953,32753,31245,32753, 17,32753,26625,32753,20501,32762,20501,32753, -26625,32766, 5,32751, 9,32771,30091,32771,20501,32775,21526,21605, - 5,32778,26816,32781,24953,32781, 17,32781,26625,32781,20501,32788, -20501,32781,26625,32792, 5,32779, 9,32797,30091,32797,20501,32801, -18967,21605,20355,32804,20354,32804,26415,32805,26219,32810,26454,32805, -26375,32805,21127,32805,21183,32818,21248,32805,21273,32805,20986,32805, -20987,32805,28109,32804,28108,32805,32831,32833,31676,32805,31527,32837, -28109,32805,28108,32804,32841,32843,20352,32805, 4,32847,22729,32849, -22731,32847,32809,32847,20486,32805,26292,32805,26331,32859,19622,32804, -19623,32805,32863,32865,19623,32804,19622,32805,32869,32871, 386,32805, - 347,32805,21396,32804,21397,32805,32879,32881,21546,32804,21547,32805, -32885,32887,21397,32804,21396,32805,32891,32893,21547,32804,21546,32805, -32897,32899,20477,32805,27673,32805,20476,32805,27672,32805,21127,32804, -21087,32911,29031,32804,31881,32805,21543,32805,21087,32805,21127,32921, -31880,32805,21542,32805,26219,32805,26415,32928,27283,32805,31103,32933, -20353,32805,32807,32937,20487,32805,21403,32804,21402,32805,32943,32945, -21573,32804,21572,32805,32949,32951,21403,32805,21402,32804,32955,32957, -21573,32805,21572,32804,32961,32963,20985,32804,32829,32967,21401,32804, -32056,32805,29450,32805,29041,32975,28791,32975,29731,32975,29659,32975, -20984,32805,21400,32805,32971,32987,32103,32805, 7,32990,32365,32993, -32057,32805,29451,32805,32915,32999,20984,32804,32827,33003,20985,32805, -31103,33007, 7,33006,33003,33011,21400,32804,21401,32805,33015,33017, -21183,32805,21127,33020,20413,32805, 4,33025, 4,33024, 11,33024, -27533,32805, 17,33032,20273,32805, 7,33037, 7,33036, 15,33037, -25793,32805, 7,33045,26219,33047, 7,33044,26331,33051,21527,32805, - 17,33054,31103,32805, 4,33059,21037,33059,32421,33063,21037,33058, -31527,33067, 4,33058, 11,33058,21037,32805,31103,33075,32391,33077, -31103,33074,31527,33081,28715,32805,29031,33085, 7,33085,29759,33089, -21527,33085,29229,33093, 7,33084,29041,33097,29731,33097,29659,33097, -28791,33097, 15,33085, 580,32805, 1170,32805, 256,32805, 629,32805, - 1413,32805, 922,32805, 581,32805, 1171,32805, 767,32805,31103,33125, - 375,32805, 305,33128, 510,32805, 18,32804, 12,32804,23493,33137, - 1291,32805, 525,32805, 13,32805,22807,33145,33137,33145, 19,32805, -33135,33151, 18,32805, 13,32804, 12,32805,33157,33159, 19,32804, -33155,33163, 16,32805,32421,33167,25743,33167,32365,33167,32661,33167, -27533,33167,21037,33167,31103,33179, 10,32805,19333,33183,33137,33183, -31648,33183,19455,33183,24237,33183,22896,33183,19393,33183,19385,33183, - 9,33199,22807,33183, 9,33202,20413,33183, 9,33183,22807,33208, -21315,33183,31103,33212,31103,33183,21315,33216, 14,32804,32847,33221, -33041,33221,24953,33221,32975,33221,33097,33221,26816,33221,33167,33221, -33111,33221, 17,33221,20501,33221,26625,33240,26625,33221,20501,33244, - 10,32804,22149,33249,19441,33249,24213,33249,24059,33249,19656,33249, - 9,33249,19631,33260,19631,33249, 9,33264,23983,33249, 9,33269, - 524,32805, 1290,32805, 11,32804,21087,33277,20326,33277,33183,33277, - 9,33283, 9,33276,23493,33287,33183,33287,23493,33277, 9,33293, -20273,33277, 9,33296, 9,33277,20273,33300, 9,32804, 11,33304, -23493,33307,33183,33307, 11,33305,24265,33313,33249,33313, 15,32804, -32937,33319,32999,33319,26142,33319,33123,33319,20413,33319,25793,33328, -20273,33319,25793,33319,20413,33334, 11,32805,24567,33339,33157,33339, -24428,33339,20413,33338,31103,33338,33260,33339,33249,33339, 9,33352, -24265,33339, 9,33356, 9,33339,24265,33360,33249,33360, 483,33338, - 9,32805,30090,33368,30090,33369,30091,33368,33373,33375, 483,33368, - 11,33369,20273,33381,30091,33369,33371,33385,20501,33385, 17,32805, -19474,33390,19475,33391,33393,33395,21314,33390,19474,33391,19475,33390, -33401,33403,21314,33391,21315,33390,33407,33409,27533,33390,21527,33390, -33319,33391, 1275,33390,21315,33391,33399,33421, 305,32805, 375,33424, - 1011,32805, 7,33428,33221,33431, 15,33429, 7,33429, 241,32805, - 7,33438, 483,32805, 4,33442, 903,33442, 9,33442, 4,33443, - 11,33442, 903,32805, 9,33455, 483,33454, 1275,32805, 17,33460, - 7,32805,20985,33464,33003,33467,20985,33465,32985,33471,25672,33465, -30772,33465,25673,33465,30773,33465,21036,33465,30090,33465,20273,33464, -33221,33487,25793,33464,26331,33491,28715,33464,29731,33495,29659,33495, -28791,33495,29041,33495,33221,33495,18967,33465, 5,33506,30091,33506, - 5,33507,33485,33513, 17,33507,21605,33465, 4,33518,33513,33521, -21037,33518, 4,33519,33509,33527,33483,33527, 11,33519,25793,33465, -26415,33535, 1011,33464,33221,33539, 241,33464, 8495,33465,32103,33465, -20273,33547,32165,33547,21037,33465,21604,33553,21605,33552,33555,33557, -21605,33553,21604,33552,33561,33563,28715,33465,20273,33567,29533,33567, -30091,33465,18967,33572,33221,33465,20273,33577,23927,33465,20273,33581, -29031,33465,20273,33585,32013,33465,20273,33589, 15,33465,29835,33465, -29659,33465,29077,33597,32102,33465, 4,33465,24687,33603,25773,33603, -21605,33602,33513,33609,31830,33603,32645,33603,29485,33603,22729,33603, -31103,33603,20273,33620,20273,33603,31103,33624, 5,33465,18967,33628, -33527,33631,31103,33628,20103,33629,31103,33637, 5,33464,33519,33641, - 7,33641,21605,33645,33603,33647,33620,33641,33547,33641,33557,33641, -33475,33641,33525,33641,33481,33641,31648,33641,20413,33641,33603,33641, -31103,33666,21315,33641,31103,33670,31103,33641,33603,33674,21315,33674, - 4,33464,33507,33681,25743,33681,33601,33681,32365,33681,32661,33681, -33635,33681,33575,33681,33477,33681,33511,33681,33479,33681,32421,33681, -33221,33681,27533,33681,33629,33681,31103,33709,21037,33681,31103,33713, -31103,33465, 5,33716,33681,33719, 5,33717,33603,33723, 6,32804, -33624,33727,33713,33727,33085,33727,29229,33733,33179,33727,21036,33727, -33681,33739,33167,33739,28714,33727,33567,33745,18967,33727, 5,33749, -33603,33751, 5,33748,33681,33755,33167,33755,20273,33727,33603,33760, -33603,33727,20273,33764,29451,33727, 17,33727, 5,33726,26816,33773, -33681,33773,24953,33773,33487,33773,33041,33773,33495,33773,33097,33773, -32847,33773,32975,33773,33167,33773,33111,33773,33539,33773,33431,33773, - 17,33773,33465,33773,20273,33803,26625,33773,20501,33806,20501,33773, -26625,33810, 5,33727,33603,33815,18967,33814,33681,33819,33167,33819, - 9,33815,33465,33815,20273,33827,30091,33815,20501,33831,33465,33727, -18967,33834, 4,33837, 4,33836,21315,33834,21314,33834, 4,33835, -33843,33847, 5,33835,33841,33851,33845,33851, 4,33834,18967,33856, -33851,33859,33851,33857, 5,33834,33839,33865,33847,33865, 5,32805, -27953,33871,27743,33871,27555,33871, 2,33870, 0,33870, 3,33870, - 1,33870,33609,33871,33521,33871,30285,33871,33485,33871,32717,33871, -25101,33871,33027,33871,33061,33871,23193,33871,33593,33871,33451,33871, -20413,33871,20885,33871,33603,33871,27533,33913,23015,33871,20501,33917, -27741,33871,20501,33921, 9,33871,30492,33871, 6,33871,33879,33929, -33881,33929,20273,33929, 7,33871,33883,33937,33885,33937,25793,33937, -32805,33936, 4,33945,21605,33937,33947,33949, 5,33949,33945,33953, -33603,33949,30091,33936,21527,33937,27533,33937,21315,33963, 7,33870, -31648,33967,20413,33967,31103,33967,21315,33972,21315,33967,31103,33976, -21315,33871,21605,33981,33929,33983,30091,33871,20501,33987, 6,33986, - 7,33986, 6,33987,33993,33995, 7,33987,33991,33999, 4,32804, -27530,34003,26142,34003,26270,34003,26009,34003,33879,34003,33929,34012, -33881,34003,33929,34016,33930,34003,33932,34003,33939,34003,33941,34003, -33506,34003,33681,34029,33683,34003,33934,34003,33943,34003,26454,34003, -26375,34003,33769,34003,32937,34003,32999,34003,33664,34003,32941,34003, -33908,34003,32997,34003,28571,34003,33970,34003,33961,34003,18967,34003, -33465,34062,33681,34065,33465,34063,33641,34069,33206,34003,33123,34003, -33121,34003,24210,34003,33413,34003,33415,34003,32903,34003,32909,34003, -33771,34003,32917,34003,32927,34003,33275,34003,33143,34003,27459,34003, -33419,34003,33463,34003,33035,34003,33057,34003,33517,34003,26219,34003, -20273,34110,26415,34110,24265,34003,28233,34003,29077,34003,33183,34003, -20413,34122,33641,34003,20413,34126,33967,34003,20413,34130,33391,34003, -27533,34135,20413,34003,25793,34138,27021,34138,33641,34138,33871,34138, -33967,34138,33183,34138,24095,34138,27021,34003,20413,34154,33929,34003, -33879,34158,33881,34158,20273,34158,20985,34003,31103,34167, 11,34003, -21605,34171,33465,34003,18967,34174,33681,34177,24095,34003,20413,34180, -26292,34003,26331,34185,20352,34003,25793,34189,33936,34003,33883,34193, -33885,34193,25793,34193, 7,34003,25793,34201,20273,34203,26415,34203, -33871,34201,33879,34209,33881,34209,20273,34209,25793,34200,26331,34217, -20273,34200,25793,34221,33871,34200,33883,34225,33885,34225,25793,34225, -26415,34003,26219,34232,20273,34003,26219,34236,33929,34236, 7,34236, -25793,34243,25793,34003,20413,34246, 7,34247,26219,34251, 7,34246, -26331,34255,33871,34003,18967,34258, 6,34261, 6,34260,21605,34259, -33929,34267,21527,34258,31103,34259,21526,34258,20413,34258, 6,34259, -34271,34279, 7,34259,34265,34283,34275,34283, 6,34258,34267,34289, -18967,34288,34283,34293,34283,34289, 7,34258,33883,34299,33885,34299, -34263,34299,34279,34299,25793,34299, 4,32805, 2,34311, 7,34313, -27669,34311,23357,34311,32468,34311,28483,34311,27978,34311,31746,34311, -31742,34311,31500,34311,20413,34310,23014,34311,31103,34310,21605,34311, - 7,34338, 7,34339,33773,34343,33221,34343, 15,34338,27021,34311, -31103,34350,28411,34311,33629,34311,20413,34357, 483,34310,31103,34311, -27021,34362,20843,34362,21127,34362,19687,34362,19687,34311,31103,34372, -20843,34311,31103,34376,21127,34311,31103,34380, 15,34311,21605,34384, - 375,34311,33727,34311, 9,34391, 7,34311,21605,34394,25793,34395, - 265,34395,31103,34395, 7,34310,33755,34405,33819,34405,33773,34405, -33739,34405,25743,34405,32661,34405,32421,34405,32365,34405,33221,34405, -27533,34405,21037,34405,33727,34427,31103,34427,21037,34311,33929,34433, -26219,34433, 7,34433,25793,34439,28715,34311,20413,34443, 5,32804, -27965,34447,27948,34447,26816,34447,27796,34447,26898,34447,20353,34447, -29451,34447,32847,34447,33487,34447,33041,34447,32975,34447,33495,34447, -33097,34447,34343,34447,34315,34447,33527,34447,33518,34447,33641,34481, -33643,34447,24953,34447,20119,34447,33706,34447,34362,34447,32727,34447, -25129,34447,34333,34447,33029,34447,34337,34447,33071,34447,32691,34447, -34424,34447,34403,34447,32067,34447,31707,34447,26887,34447,32857,34447, -32973,34447,21605,34447,33465,34522,33641,34525,33465,34523,33681,34529, -33176,34447,33111,34447,33109,34447,31505,34447,23480,34447,33347,34447, -33349,34447,32905,34447,32907,34447,32919,34447,32925,34447,33273,34447, -33141,34447,25099,34447,33539,34447,34361,34447,33445,34447,33431,34447, -33367,34447,33453,34447,33031,34447,33073,34447,33533,34447,20187,34447, -19683,34447,20839,34447,21399,34447,33167,34447,27533,34586,33681,34447, -27533,34590,34405,34447,27533,34594,28625,34447,28573,34447,33339,34447, -20413,34603, 1171,34447,27787,34447,20501,34608,27533,34447,20501,34612, -33681,34612,34405,34612,33167,34612,20501,34447,27787,34622,26889,34622, -26625,34622,27533,34622,23457,34622,34395,34447, 17,34447,33465,34447, -29077,34639,20273,34639,21605,34638,33641,34645,28233,34639,24265,34639, - 11,34639, 6,34446,26816,34655,34405,34655,33041,34655,33097,34655, -34343,34655,33681,34655,32847,34655,33487,34655,32975,34655,33495,34655, -24953,34655,33167,34655,33111,34655,33539,34655,33431,34655, 17,34655, -33465,34655,20273,34689,20501,34655,26625,34692,26625,34655,20501,34696, - 7,34446,34635,34701,34579,34701,34311,34701,20103,34701,20186,34447, -34655,34711,34394,34447,34655,34715,31103,34447,34311,34718, 6,34447, -34706,34723,34395,34723,33039,34723,33089,34723,34397,34723,34341,34723, -20273,34723,34708,34723,23175,34723,24941,34723,34325,34723,28133,34723, -33437,34723,20103,34723,34701,34750,34701,34723,34311,34754,20103,34754, - 11,34723,34311,34723,34701,34762,20763,34723,26625,34767, 7,34447, -21605,34771,34311,34773,34655,34771,34311,34777,20103,34777,20103,34770, -34655,34783,34311,34770,34655,34787,23457,34447,20501,34790,26889,34447, -20501,34794,20103,34447, 7,34799,34723,34801, 7,34798,34655,34805, -26625,34447,20501,34808, 6,34809, 7,34809, 6,34808,34815,34817, - 7,34808,34813,34821,34311,34447,21605,34824,18967,34825, 6,34828, - 6,34829,31103,34824,21527,34825,21526,34825,20413,34825, 6,34825, -18967,34842,34827,34843, 7,34825,34723,34849,25793,34849,34833,34849, - 6,34824,34849,34857,34837,34857, 7,34824,34655,34863,34845,34863, -34831,34863,34843,34863,34839,34863, 6,32805,34236,34875,34120,34875, -34433,34875,20962,34875,21001,34875,34118,34875,34355,34875,25648,34875, -21314,34874,34891,34893,25649,34875,33087,34875,21314,34875,34116,34875, -23017,34875,34335,34875,21937,34875,34170,34875,34173,34875,21959,34875, -21315,34874,34897,34917,34385,34875,34387,34875,24875,34875,33332,34875, -33435,34875,33043,34875,33107,34875,34349,34875,21605,34875,21315,34936, -34893,34939,21315,34937,34901,34943,20273,34875,34003,34946,33319,34946, -20885,34875,20843,34952,21315,34875,21605,34956,34893,34959,19475,34875, -26625,34963,24265,34875,34003,34966,29077,34875,34003,34970,28233,34875, -34003,34974,20843,34875,20885,34978, 11,34875,34003,34982,33319,34875, -20273,34986,34003,34875,29077,34990,20273,34990,28233,34990,24265,34990, - 11,34990,30993,34875,30901,34875,20984,34875,20839,35007, 5,34875, -20763,35011,20843,35013,20763,35010,20839,35017,20763,34875, 5,35020, -20839,35023, 5,35021,20885,35027, 7,32804,34736,35031,34459,35031, -34461,35031,29691,35031,29340,35031,28714,35031,33603,35043,21605,35031, - 5,35047,33681,35049,34405,35049,33167,35049, 5,35046,33603,35057, -34607,35031,34637,35031,33924,35031,34447,35031, 11,35031,32103,35031, -29835,35031,29659,35031,20273,35031,34723,35076,29229,35076,35011,35031, -34723,35031,20273,35084, 567,35031,29229,35031,20273,35090, 9,35031, -33871,35094,33871,35031, 9,35098, 4,35030, 5,35030,35083,35105, -34875,35105,35010,35031,35103,35111, 4,35031,35108,35115, 7,35114, -35049,35119,35105,35115,34875,35122,34875,35115,35105,35126, 483,35115, - 5,35031,21605,35132,33603,35135,35103,35133,34875,35139,34875,35132, -35103,35143,34875,35031,18967,35147, 4,35148, 4,35149,21315,35147, -21314,35147, 4,35147,18967,35158, 5,35147,35115,35163,35153,35163, - 4,35146,35163,35169,35155,35169, 5,35146,35103,35175,35161,35175, -35151,35175,35159,35175,35157,35175, 0, 4,14087,35187,14103,35188, - 4983,35187, 5001,35192,14104,35187, 5002,35187,14088,35187,14091,35201, - 4984,35187, 4987,35205,14093,35187, 4989,35187,28758,35187,29229,35213, -28741,35187, 2,35216,29229,35219,20501,35186,19463,35223,19317,35223, -19301,35223,20009,35223, 53,35186,19463,35233,20009,35233,19317,35233, -19053,35187, 989,35241, 1201,35187,18967,35245, 1203,35247,17673,35186, -17685,35251,21405,35186,21489,35255,19513,35186,19463,35259,20009,35259, -19317,35259,10157,35187, 17,35267,10159,35269,20343,35187,18967,35273, -20345,35275, 1179,35187, 527,35186,19301,35281,19916,35186, 4,35285, - 7,35286, 7,35285, 4,35290, 16,35285,19069,35186,19301,35297, - 1290,35186, 0,35301, 2,35302, 2,35301, 0,35306,18966,35301, -21530,35187,20501,35313, 1489,35187,16859,35187, 11,35318, 9875,35321, -21529,35187, 11,35324,20501,35327, 147,35187,16860,35187, 9875,35333, - 987,35187, 8069,35187, 11,35338, 8067,35341, 8070,35187, 8067,35345, -27519,35187,27525,35187,26322,35187,26566,35187,26102,35187,26276,35187, -26105,35187,33464,35187,29600,35187,32295,35187,31856,35187,25636,35187, -29229,35371, 9,35371,28555,35187,29229,35377, 9,35377,19301,35187, -20501,35383, 527,35383,19069,35383, 4266,35187, 8056,35187, 8147,35187, -20739,35187, 9997,35187, 8784,35187, 8622,35187, 8824,35187, 8702,35187, - 8697,35187, 8676,35187, 8635,35187,20828,35187,19772,35187,19890,35187, -19774,35187,19894,35187,19382,35187,19458,35187,32557,35187, 803,35429, -19463,35187,20501,35433, 53,35433,19513,35433,20009,35187, 53,35441, -20501,35441,19513,35441,19317,35187,20501,35449, 53,35449,19513,35449, -19914,35187,21066,35187,20575,35187,21312,35187,21270,35187, 694,35187, - 9377,35467,16920,35187, 9,35471,17621,35187, 9,35475, 4213,35187, - 375,35478, 8757,35187, 375,35482, 9530,35187, 9875,35487,16091,35487, -20501,35487,19751,35187, 53,35495, 253,35495, 117,35495, 71,35495, - 1471,35495, 1397,35187, 9592,35187,16514,35187,19380,35187,13836,35187, -20595,35187, 9911,35187, 9983,35187, 9905,35187,17566,35187,16816,35187, -17910,35187,18880,35187,14103,35187,14087,35532, 5001,35187, 4983,35536, -20597,35187,26219,35187, 241,35542, 587,35543, 8647,35187, 241,35548, - 587,35549,14073,35187, 586,35554,14091,35557, 586,35555,14103,35561, - 4971,35187, 586,35564, 4987,35567, 586,35565, 5001,35571, 1291,35187, -35305,35575,35309,35575, 1871,35575, 1889,35575, 3,35575,19667,35575, -12345,35575, 5123,35575,19067,35575,35311,35575,18967,35575, 1297,35597, -35301,35597,19917,35187,35289,35603,35293,35603,19939,35603,19945,35603, - 6,35603,19947,35603,35295,35603, 17,35603,19931,35619,35285,35619, - 1108,35187, 11,35625,22806,35187, 9,35629, 524,35187, 3,35633, - 3477,35633, 2007,35633,19051,35633,19667,35633,12345,35633, 5123,35633, -18967,35633, 555,35649, 713,35187, 1325,35187,17455,35655,10001,35187, - 1505,35659, 9513,35187, 11,35662, 9875,35665,16091,35665,20501,35665, -19396,35187, 483,35672,17455,35187,13737,35676, 803,35187,31103,35680, -31103,35187, 803,35684, 113,35187, 375,35187, 587,35691, 9195,35693, - 4213,35690, 7971,35690, 8757,35690, 587,35690, 9377,35703, 9565,35690, -18967,35690,19892,35187, 9,35710, 510,35187,18967,35714, 587,35187, - 375,35718, 9377,35721, 9377,35719, 375,35725, 483,35187,19396,35728, - 587,35729, 11,35728, 5123,35735,12345,35735, 3477,35735, 2007,35735, -19667,35735,19051,35735,18967,35735, 555,35749,18967,35728, 9,35752, - 9,35728,18967,35756, 1275,35187,16833,35760, 9,35763, 903,35761, - 9,35761,21575,35187,18967,35771,21577,35773,21581,35773,21585,35773, - 6685,35187, 7519,35187, 17,35783, 7521,35785, 7525,35785, 7529,35785, -21258,35187, 241,35792,16722,35187,32103,35187, 9,35799,10310,35187, - 8684,35187, 241,35804, 331,35805,26292,35187, 241,35810, 482,35186, - 2,35815, 0,35816,35633,35819,35735,35819, 0,35815, 2,35824, -35633,35827,35735,35827,35749,35815,35649,35815,18966,35815,35735,35837, -35633,35837, 1368,35186,25793,35843, 8495,35843,23755,35843,10055,35843, - 4329,35843, 4311,35843,26331,35843,27805,35843, 3785,35843, 8717,35843, -10351,35843, 586,35186,31761,35867,32563,35867,32269,35867, 7,35867, - 4,35874, 4,35867, 7,35878, 16,35867, 767,35867,31103,35885, - 482,35187, 587,35889, 1274,35187, 587,35186, 9262,35895, 375,35895, - 9195,35898, 7,35895, 265,35903, 9195,35905, 9195,35895, 375,35908, - 483,35895, 483,35186, 1369,35186,19463,35917,19301,35917,20009,35917, -19317,35917, 1368,35187, 7,35927, 586,35187,14073,35930,14091,35933, - 4971,35930, 4987,35937,31856,35931,32295,35931, 7971,35931,14073,35931, -14087,35947, 4971,35931, 4983,35951,31103,35931, 803,35954, 803,35931, -31103,35958, 483,35931, 1531,35187,13737,35187, 1487,35966,17455,35966, -16833,35187, 1196,35972, 1196,35973, 1197,35972,35977,35979, 1197,35973, -35975,35983, 1275,35972, 9,35987, 767,35187,31103,35991, 1487,35187, -13737,35994,16937,35187, 17,35999, 9377,36001,17573,36001,16947,36001, - 1347,35187,18967,36009, 555,36011, 251,36011, 1365,36011, 1351,36011, - 21,36011,20762,35187, 241,36022, 256,35187,25793,36026,25793,36027, - 8495,36026, 8495,36027,18967,36026,21037,36026, 972,35187, 9377,36041, - 629,35187,18967,36044, 340,35187, 9377,36049,27978,35187,28353,36053, -30003,36053,29759,36053,34723,36053,21183,36053, 2,36053,28337,36065, -28189,36065,28191,36053, 959,36053, 759,36053, 47,36053, 66,35187, - 89,35187, 7,36080, 973,35187,35895,36085,21527,35187,21605,36088, -29229,36091, 9,36091, 145,35187, 165,35187, 305,35187, 25,35187, -27533,35187, 1505,36105, 331,35187,17455,36109, 59,35187,17455,36113, -29599,35187, 7,36116,26546,35187, 7,36120, 8812,35187, 7,36124, -10291,35187, 3,36129, 3,36128, 9565,35187, 375,36134, 8495,35187, - 256,36138, 7,36139, 375,36143, 7,36138, 241,36146, 331,36147, - 241,36138, 7,36152, 7971,35187, 375,36156,25793,35187, 256,36160, - 7,36160, 241,36164, 241,36160, 7,36168,32805,35187, 7,36172, -19888,35187, 7,36176,18967,35187, 256,36180, 629,36180, 510,36180, - 375,36180, 483,36180, 9,36190, 9,36180, 483,36194, 7,36180, - 241,36198, 7,36181,25793,36203, 8495,36203, 241,36180, 7,36208, - 241,35187,26292,36212,26219,36212, 8684,36212, 8647,36212,20762,36212, -21258,36212, 7,36212,25793,36226,25793,36227, 8495,36226, 8495,36227, -18967,36226,21037,36226,25793,36212, 7,36240, 8495,36212, 7,36244, -18967,36212, 7,36248,21037,36212, 7,36252, 9,35187,19892,36256, - 1011,36256, 11,36261,18967,36256, 483,36264, 483,36256,18967,36268, - 903,35187, 7,36272, 9377,36275,19913,35187, 6,36279, 7,36279, - 6,36278,36283,36285, 7,36278,36281,36289, 15,35187,25381,36293, - 483,36293, 2,36293,28189,36299, 1011,35187,16710,36303,16711,36303, -16710,36302,36307,36309, 0,36303, 6,36312,16711,36302,36305,36317, - 9,36302, 11,36321, 1275,36302,36315,36325, 11,36303, 9,36329, - 6,36302, 3,36332, 6,36303, 0,36336,36325,36339, 7,36303, -25793,36343, 8495,36343,21605,35187,21037,36348,21105,36348,21527,36348, -29229,36355, 9,36355,21549,36348,19625,36348,21526,36348, 5,36364, - 922,36349, 918,36349, 1505,36349, 1419,36349, 668,36349, 483,36349, - 903,36378, 587,36349, 9,36382, 9,36349, 903,36386, 11,36387, - 587,36386, 15,36348, 11,36348, 9,36397, 6,36348,21036,36400, - 5,36400,18967,36404,18967,36400, 5,36408, 7,36348,30003,36413, -29759,36413,34723,36413,21183,36413, 959,36413, 47,36413, 759,36413, - 6,36349,36353,36429,36361,36429,36351,36429,36363,36429, 7,36349, -36403,36439,31527,36439,22269,36439,28791,36439,22263,36439,32781,36439, -36367,36439,21105,36439,21549,36439,29953,36439,29731,36439,34655,36439, -33773,36439,29835,36439,29659,36439,34447,36439,32753,36439,32019,36439, -29041,36439,23929,36439,22205,36439,19625,36439,33221,36439,36407,36439, -36411,36439,18967,36348, 5,36490, 6,36493,36413,36495, 6,36492, -36439,36499,36439,36493, 14,36490,36439,36505, 6,36491,36395,36509, - 6,36490, 5,36512,36439,36515, 903,36349, 7,36519, 9,36518, - 483,36518, 265,35187,17455,36527, 5843,36527, 483,36527, 587,36527, - 9,36527, 7,36526, 9377,36539, 7,36527, 11,35187, 8069,36544, - 8067,36547,16859,36544, 9875,36551,21529,36544,20501,36555,16091,36545, - 9513,36559, 7,36544, 2,36563, 7,36564,36545,36567, 1,36564, -36569,36571, 1,36563, 2,36574, 0,36544, 2,36579, 0,36580, -36545,36583, 6,36580,36585,36587, 6,36579, 2,36590, 482,36579, - 1368,36544, 2,36597, 1,36598, 1,36597, 2,36602,18966,36544, - 2,36607, 6,36608, 6,36607, 2,36612, 482,36607, 9513,36544, -20501,36619, 9875,36619,16091,36619,20501,36545,21529,36627, 9513,36627, - 9875,36545,16859,36633, 9513,36633, 1369,36545, 1989,36639, 3587,36639, -36601,36639,36605,36639, 5303,36639,36571,36639,36577,36639, 0,36639, - 4897,36639,17041,36639,18967,36545,20281,36661,20345,36661,36611,36661, -36615,36661,36587,36661,36593,36661, 7,36661,20285,36661,36595,36661, -36617,36661, 483,36661,20273,36683,36579,36683,36607,36683,21605,36544, - 9,36691, 483,36544,35819,36695,35827,36695, 3477,36695, 2007,36695, - 1,36695,36639,36705,36655,36695,19051,36695,19667,36695, 5123,36695, -12345,36695,35837,36695,18967,36695, 555,36721,35815,36721, 3,36544, - 3,36545, 375,36729,21308,35187, 7,36732,16481,35187, 7,36736, -21037,35187, 256,36740, 7,36740, 241,36744, 241,36740, 7,36748, -16531,35187, 7,36752, 1011,36753, 7,36757,18797,35187, 7,36760, -17827,35187, 7,36764,16783,35187, 7,36768, 2,35186,27138,36773, -28047,36773,26454,36773, 8770,36773,26375,36773, 8729,36773, 8697,36773, - 8784,36773,28197,36773, 4266,36773, 9262,36773,28111,36773,27128,36773, -28027,36773,28117,36773,28177,36773,31872,36773,28063,36773,31598,36773, -24545,36773,31103,36812, 8684,36773, 8717,36817, 331,36817,26292,36773, -26331,36823, 8647,36773, 8757,36826,26219,36773,27021,36830,26415,36830, -26415,36773,26219,36836, 8757,36773, 8647,36840, 375,36840, 4213,36773, - 375,36846,28153,36773,26860,36773,28213,36773,35931,36773,28159,36773, -31770,36773, 347,36773, 386,36773, 9750,36773,27978,36773,26331,36869, -27805,36869, 1325,36869, 331,36869, 59,36869,23755,36869,25793,36869, - 265,36869, 340,36773, 331,36887,31103,36773,24545,36890,26625,36890, - 9,36890, 375,36773, 8757,36898, 4213,36898, 9195,36898,27021,36898, - 305,36898, 483,36773, 9195,36773, 375,36912,10001,36773, 9,36917, - 1325,36773, 1275,36773, 331,36773,27533,36773, 9,36927, 305,36773, - 375,36930,10291,36773, 483,36935,27021,36773,26219,36938, 375,36938, - 7,36773,25793,36944,26331,36947, 8495,36944, 8717,36951, 331,36951, -25793,36945,26415,36957,27021,36957, 8495,36945, 8757,36963,26625,36944, - 9731,36944,21605,36945,24545,36971,26625,36971, 9,36971, 265,36945, - 8757,36979, 4213,36979,27021,36979, 9195,36979, 305,36979,21605,36944, -26331,36991,27805,36991,23755,36991, 59,36991, 331,36991, 1325,36991, -25793,36991, 265,36991, 265,36944, 331,37009, 8647,36945,26219,36945, - 59,36773, 7,36772,25793,37019, 8495,37019,23755,37019,10055,37019, - 4329,37019, 4311,37019, 3785,37019,27805,37019,10351,37019, 8717,37019, -26331,37019, 9,36773,31103,37042, 15,36773,31103,37047, 9731,36773, - 7,37050,21605,36773, 15,37055,31103,37057, 6,37055, 5,37060, - 7,37055,26219,37065, 375,37065, 6,37054,37057,37071, 7,37054, -26331,37075,37063,37075,27805,37075,23755,37075, 59,37075, 331,37075, - 1325,37075,25793,37075, 265,37075, 265,36773, 7,37095, 8495,37097, - 375,37097, 7,37094, 331,37103,26625,36773,31103,37106, 7,37106, - 8495,36773, 7,37112, 8717,37115, 331,37115, 9,37113, 483,37113, - 7,37113, 8647,37125, 375,37125,25793,36773, 7,37130,26331,37133, - 483,37131, 9,37131, 7,37131,26219,37141, 3,35186,20305,37145, - 9641,37145,20309,37145, 9645,37145, 4,37145, 7,37154,35603,37157, - 9719,37145, 16,37145,35603,37163,35619,37145,21081,37145,20323,37145, -20387,37145, 9701,37145,35719,37145, 524,37145,20273,37179, 9617,37179, - 1291,37145, 9617,37185,20273,37185, 305,37145, 375,37190, 386,37145, - 347,37145, 767,37145,31103,37199, 483,37145, 11,37202, 9617,37205, -20273,37205, 375,37145, 305,37210, 7,37145, 3,37215,18967,37217, -35187,37219, 4,37214,35603,37223,37221,37223, 3,37214,35187,37229, - 11,37145, 483,37232, 9617,37235,20273,37235, 6,35186,19975,37241, - 0,37241, 2,37244,35575,37247,35633,37247,35735,37247,36695,37247, -18966,37241,35735,37257,35633,37257,35575,37257,36695,37257,35749,37241, -35649,37241,36721,37241,35597,37241,19365,37241,19221,37241,19917,37241, -10107,37279, 587,37241, 3,37241, 2,37241, 6,37287, 17,37289, -35187,37291, 0,37286,35575,37295,35633,37295,35735,37295,36695,37295, -37293,37295, 6,37286,36544,37307,37295,37309, 11,37307,35187,37312, -37295,37315,35187,37307, 11,37318,37295,37321, 7,35186, 4,37325, - 3,37326, 3,37327,35927,37331, 902,37325,25525,37325, 1325,37325, -10001,37325, 903,37341, 1275,37325, 59,37325,25793,37325, 587,37349, - 8495,37325, 587,37353, 2,37325, 7,37356,37331,37359, 903,37357, -10311,37357, 3,37325, 4,37366,27533,37325, 903,37371, 331,37325, - 2,37324,25793,37377, 8495,37377,23755,37377, 4329,37377,10055,37377, -27805,37377, 3785,37377, 4311,37377,26331,37377, 8717,37377,10351,37377, -21605,37325, 903,37401, 155,37401, 265,37325, 7,35187, 5045,37408, - 805,37409, 9195,37413, 4,37408,37279,37417,19916,37417,37241,37421, - 1275,37417,18967,37424,37241,37427,18967,37417, 1275,37430,37241,37433, -26546,37408,32805,37408,29599,37408, 652,37409, 9195,37443, 8812,37408, -19888,37408,19913,37408,21308,37408,16481,37408,37285,37409,16783,37408, -17827,37408,18797,37408,26498,37409, 8796,37409, 8495,37408, 241,37468, - 331,37469,25793,37408, 241,37474,25793,37409, 241,37479, 587,37478, - 8495,37409, 241,37485, 587,37484,21037,37408, 241,37490, 88,37409, -37411,37495,16531,37408, 587,37409, 265,37500, 9195,37503,26625,37501, -25793,37501, 8495,37501,25793,37500, 8495,37500, 9731,37501, 265,37409, - 587,37518, 9195,37521, 4213,37519, 7971,37519, 8757,37519, 587,37519, - 9377,37531, 9565,37519, 89,37409, 5069,37537, 9195,37537,27021,37537, - 483,37409, 1275,37409, 9,37547,26503,37409, 8809,37409,18967,37408, - 241,37554, 241,37408,25793,37558,25793,37559, 8495,37558, 8495,37559, -18967,37558,21037,37558, 903,37408, 9377,37573,21605,37408,30003,37577, -29759,37577,34723,37577,21183,37577,37495,37577, 959,37577, 47,37577, - 759,37577, 265,37408, 9377,37595, 903,37409,31103,37598,31920,37409, -31103,37409, 903,37604, 375,37409, 2,37408,37331,37611,37495,37611, - 3,37408,14072,37616, 4970,37616,14072,37617,14073,37616,37623,37625, - 4971,37616, 4970,37617,37629,37631, 7,37617, 4,37635, 1,37616, -37537,37639, 9,37639,36773,37617,37537,37617, 7971,37617,14073,37617, -37619,37651, 4971,37617,37621,37655, 483,37617, 9,37617, 2,37409, -37369,37663,37329,37663,37637,37663, 7,37662,37617,37671,37335,37663, - 9362,37663,27218,37663,37642,37663,37639,37663, 9,37682,28189,37663, - 1,37663, 5,37688,37616,37690,37617,37691,37693,37695,37671,37694, -37616,37691,37617,37690,37701,37703,37672,37691,37671,37691,37617,37708, - 5,37663, 1,37712,37616,37714,37617,37715,37717,37719,37671,37718, -37616,37715,37617,37714,37725,37727,37672,37715,37671,37715,37617,37732, -28337,37663,37660,37663,27021,37663, 9,37740, 9195,37663, 9,37744, - 9,37663,37639,37748,27021,37748, 9195,37748,37617,37748,37241,37663, -37617,37663, 1,37760, 5,37762, 5,37760, 1,37766, 7,37761, -37691,37771,37715,37771,37765,37771,37769,37771, 9,37760, 3,37409, -37577,37783, 9,37785, 16,37783, 4,37783, 7,37790, 7,37783, - 4,37794,18967,37783,35187,37799,37789,37801,37793,37801,37797,37801, - 9,37782,37577,37809,37611,37809,37611,37783, 1,37815, 5,37816, - 5,37815, 1,37820, 7,37814,37819,37825,37823,37825, 9,37815, - 9,37409, 3,37832,37577,37835,37611,37835, 3,37833,37663,37841, - 3,35187,10104,37844,10105,37844, 0,37845, 5,37850, 4,37844, -36773,37855,10104,37845,37849,37859,10105,37845,37847,37863,36945,37845, -37855,37867,10291,37844,36944,37845, 265,37873,37663,37845, 7,37877, -37691,37879,37715,37879, 1369,37845, 11,37885, 9617,37887,37853,37887, -20273,37887, 11,37844, 6,37844, 7,37844,14072,37898, 4970,37898, -14073,37898,14072,37899,37905,37907, 4971,37898, 4970,37899,37911,37913, -35187,37899,36773,37899, 7971,37899,14073,37899,37901,37923, 4971,37899, -37903,37927, 483,37899, 6,37845,37856,37933,37855,37933,36773,37936, - 1,37933, 5,37940,37898,37942,37899,37943,37945,37947,37898,37943, -37899,37942,37951,37953, 5,37933, 1,37956,37898,37958,37899,37959, -37961,37963,37898,37959,37899,37958,37967,37969,36773,37933,37855,37972, -37899,37933, 7,37845, 265,37979,36773,37981,35187,37978, 2,37985, - 4,37979,37987,37989, 3,37989,37985,37993,37663,37989,36773,37978, - 265,37999,37897,37979,36773,37845, 4,38005,37933,38007, 7,38005, -37943,38011,37959,38011,14073,38011, 4971,38011, 6,38004, 1,38021, - 5,38022,38011,38025, 5,38021, 1,38028,38011,38031,38007,38021, - 7,38004, 265,38037,18967,37845, 4,38041,37933,38043, 256,38041, - 7,38041, 241,38048, 241,38041, 7,38052, 2,35187,29229,38057, -28741,38059,28741,38056,29229,38063, 0,38057, 0,38056,28714,38069, -37185,38069, 1290,38069,37145,38075,37179,38069, 525,38069,37145,38081, -37887,38069,37205,38069,37235,38069, 5,38069,21605,38090,21605,38069, - 5,38094, 1275,38069, 17,38098,37145,38101, 17,38069, 1275,38104, -37145,38107, 1505,38057,17455,38057, 903,38112,17494,38057, 483,38057, -37214,38057,14073,38121, 4971,38121,37783,38057, 587,38057,10373,38057, - 9,38057, 155,38057, 6,38056, 1,38137, 5,38138,38121,38141, - 5,38137, 1,38144,38121,38147,37145,38137, 587,38137, 7,38056, -37331,38155, 6,38057, 5,38158,18966,38159, 0,38159, 2,38164, - 2,38159, 0,38168, 1369,38159, 17,38159,35187,38175,38163,38177, -38167,38177,38171,38177, 7,38057,38141,38185,37145,38187,38147,38185, -37145,38191,34447,38185,28715,38185,38069,38197,38071,38185,29659,38185, -29835,38185,38093,38185,38097,38185, 4971,38185,37145,38211,14073,38185, -37145,38215,37145,38184,38141,38219,38147,38219,14073,38219, 4971,38219, -21605,38185, 903,38229,37145,38057, 4,38232, 6,38233, 1,38237, - 5,38238, 5,38237, 1,38242,38235,38237, 7,38233, 265,38249, - 7,38232,38241,38253,38245,38253,38141,38253,38147,38253,14073,38253, - 4971,38253, 903,38057,17455,38266, 6,35187, 4,38271, 1,38272, - 0,38270, 17,38277,37844,38278,37845,38279,38281,38283,37845,38278, -37844,38279,38287,38289, 1369,38271, 2,38270, 587,38295, 3,38270, - 2,38271, 1275,38301, 1, 5,35962,38304,35963,38304,37760,38304, -37771,38311,37976,38304,38002,38304,37761,38304,37977,38304,37815,38304, -37825,38323,38003,38304,37930,38304,37658,38304,37931,38304,37659,38304, - 77,38304, 3095,38337, 1917,38337, 120,38304, 3013,38343, 1897,38343, - 79,38305, 3113,38349, 125,38305, 3023,38353,35929,38305,37885,38357, -37916,38305,37885,38361,38021,38304,38011,38365,38237,38304,38253,38369, - 4597,38305, 6625,38373, 113,38304, 4696,38377, 9,38377, 4669,38380, - 4669,38377, 9,38384,37896,38304,37898,38304,37933,38391, 483,38391, -37616,38304,37663,38397, 483,38397, 59,38304,23023,38403,25483,38403, -22677,38403,27533,38304,23023,38411,22677,38411,22605,38411,25483,38411, -37663,38304,37617,38420,37672,38421,37671,38421,37617,38426,37771,38421, -37879,38421,37617,38421,38397,38435,37671,38434,37933,38304,37899,38440, -38011,38441,37899,38441,38391,38447,37897,38304,38137,38304,38121,38453, -38219,38453,38185,38453,37145,38459,38253,38453,37617,38304,37663,38464, - 483,38464,37899,38304,37933,38470, 483,38470, 979,38305,21605,38477, - 987,38479,21879,38305, 1205,38483,29229,38304,29375,38487,17105,38304, -17117,38491,23755,38304,23023,38495,22677,38495,25483,38495,26863,38305, -21605,38503,26865,38505,10091,38305, 15,38509,10093,38511, 1009,38305, - 675,38304,22605,38517, 1418,38304, 1,38521, 3,38522, 3,38521, - 1,38526,21604,38521,21895,38304,22605,38533,25380,38304, 5,38537, - 6,38538, 6,38537, 5,38542, 14,38537, 1365,38305,17573,38305, - 9,38550,10001,38553,27996,38305,27533,38557, 1203,38305,17574,38305, -10001,38563, 177,38305,27995,38305, 9,38568,27533,38571, 7963,38305, - 9,38574, 7961,38577, 7964,38305, 7961,38581, 120,38305, 77,38305, -37758,38305,37972,38305,37457,38305,37867,38305,35912,38305,35733,38305, -35732,38305,35913,38305,22605,38305,27533,38605, 675,38605,21895,38605, -36856,38305, 483,38613,37644,38305, 483,38617,37918,38305,37933,38621, - 483,38621,37177,38305, 483,38627, 4798,38305,15896,38305,23023,38305, - 59,38635,27533,38635,23755,38635,22677,38305,27533,38643, 59,38643, -23755,38643,25483,38305, 59,38651,27533,38651,23755,38651,25368,38305, -30290,38305,27127,38305,30762,38305,30566,38305, 843,38304,35187,38669, - 1531,38304, 842,38304, 1530,38304,35930,38305,38675,38679,38307,38679, - 9492,38305,10001,38685,13755,38685,27533,38685,24597,38305, 59,38693, - 331,38693, 97,38693, 141,38693, 1325,38693, 629,38305,37896,38305, -37610,38305,37783,38709,37616,38305,38467,38713,38423,38713,38311,38713, -38331,38713,38469,38713,38465,38713,37663,38725, 483,38725,37898,38305, -38473,38731,38443,38731,38315,38731,38329,38731,38475,38731,38471,38731, -37933,38743, 483,38743,37866,38305,37456,38305,17508,38305, 9257,38305, -27149,38305, 9353,38305, 9253,38305,38253,38305,38137,38763,38237,38763, - 483,38763,38219,38305,38137,38771, 483,38771,38121,38305,38137,38777, - 483,38777,15897,38305, 4799,38305,27161,38305,20187,38305, 483,38789, - 8387,38305, 483,38793, 9541,38305,15879,38305, 483,38798, 4787,38305, - 483,38802,16125,38305, 3,38806, 2,38806, 842,38806, 843,38807, -38813,38815, 842,38807, 843,38806,38819,38821, 2,38807,38809,38825, - 3,38807,38811,38829, 5121,38305, 3,38832, 2,38832, 842,38832, - 843,38833,38839,38841, 842,38833, 843,38832,38845,38847, 2,38833, -38835,38851, 3,38833,38837,38855,35729,38305, 587,38859, 587,38858, -19384,38305, 483,38865, 669,38305, 1011,38869, 1086,38305, 483,38873, - 1418,38305, 1011,38877,25381,38305,38541,38881,38545,38881,25423,38881, -25429,38881, 7,38881,25431,38881,38547,38881, 15,38881,25415,38897, -38537,38897, 1419,38305,38525,38903,38529,38903, 1801,38903, 1875,38903, - 2,38903,23983,38903,10603,38903, 4625,38903,21893,38903,38531,38903, -21605,38903, 1421,38925,38521,38925, 1108,38305, 9565,38931, 246,38305, - 483,38935, 294,38305, 8495,38939,35931,38305,38669,38943,38309,38943, - 483,38943,36773,38942, 483,38951,19396,38305,35718,38305,37885,38957, -37202,38957,37145,38957, 483,38962, 483,38957,37145,38966, 668,38305, - 2,38971, 3507,38971, 1971,38971,21783,38971,23983,38971,10603,38971, - 4625,38971,21605,38971, 713,38987,20060,38305, 483,38991, 713,38305, -16833,38995,38011,38305,37933,38999,38021,38999, 483,38999,37285,38305, -37409,39006,36945,38305,37845,39011,37845,39010, 483,39011,37215,38305, - 3,39019,38057,39019, 9377,38305, 9,39024,10001,39027,13755,39027, -27533,39027, 1471,38305,16937,39035, 9875,38305, 1011,39039, 1347,39039, - 555,38305,20763,38305, 566,39046, 566,39047, 567,39046,39051,39053, - 567,39047,39049,39057, 257,38305, 483,39061, 973,38305, 4816,39065, - 4805,39065, 1011,39068,38057,39065, 1011,39065, 4805,39074, 628,38305, - 483,39079, 1406,38305, 587,38305,23584,39085,24355,39085,37782,39085, -37408,39084,39091,39093,37783,39085,37408,39085,38670,39085, 3,39085, -37409,39102,39093,39105,37409,39103,39099,39109,38669,39085,35187,39112, -35728,39084,23493,39085,22807,39118,22807,39085,23493,39122,35729,39084, -35728,39085,39127,39129,35729,39085,39117,39133,37409,39085, 3,39136, -39093,39139, 483,39085,35187,39142,35187,39085,38669,39146, 483,39146, -36773,39147, 483,39153, 1011,39084, 483,39157, 9,39084, 4625,39161, -10603,39161, 3507,39161, 1971,39161,23983,39161,21783,39161,21605,39161, - 713,39175,18967,39084, 483,39179,35187,39084,37202,39183,37885,39183, -37145,39183, 483,39188, 483,39183,37145,39192,37409,39084,39097,39197, - 11,39084, 483,39201, 1369,38305,35964,39204,35965,39205,39207,39209, -35965,39204,35964,39205,39213,39215,35761,39205,38057,39205, 15,39204, - 1011,39223, 11,39205, 1011,39205, 11,39204, 1275,38305, 483,38305, -35895,39234, 4787,39234,15879,39234,21405,38305, 1011,39243, 483,39243, - 7535,38305, 15,39249, 7537,39251, 7541,39251, 7545,39251,28337,38305, -21605,39259,28351,39261,28355,39261,28359,39261, 6147,38305, 483,39269, -15269,38305, 483,39273,17423,38305, 1011,39277, 483,39277, 4827,38305, - 483,39283, 4745,38305, 1011,39287, 483,39287,17232,38305,30492,38305, -25793,39295, 265,39294, 4569,38305, 483,39301,14625,38305, 483,39305, - 7063,38305, 483,39309,37284,38305,37356,38305,17233,38305,30493,38305, - 483,39319,37973,38305,37759,38305,38002,38305,38327,39327,37760,38305, - 483,39331,37976,38305,38321,39335,37617,38305,38398,39339,38319,39339, -38400,39339,38335,39339,37663,39339,38397,39348,37671,39349,38397,39339, -37663,39354, 483,39354,36773,39338, 483,39361, 483,39339,38397,39364, -37663,39338, 483,39369,37899,38305,38392,39373,38321,39373,38394,39373, -38333,39373,35187,39372,37885,39383,37933,39373,38391,39386,38391,39373, -37933,39390, 483,39390,36773,39372,37933,39397, 483,39397, 483,39373, -38391,39402,38185,38305,38150,39407,38137,39407,37145,39410,37202,39407, -37885,39407, 483,39407,37145,39418,37145,39407,38137,39422, 483,39422, -37979,38305,38451,39429,37663,38305,37409,39432, 3,39435, 7,39433, -39437,39439, 2,39439,39435,39443, 483,39433,37617,39447,37241,39432, -37617,39432, 483,39453,37933,38305,36773,39456,37977,38305,38315,39461, -37815,38305, 483,39465,38003,38305,38317,39469,38127,38305, 483,39473, - 482,38304, 5,39477, 6,39478, 6,39477, 5,39482, 14,39477, - 586,38304,39122,39489,39128,39489,39127,39489,38863,39489,38601,39489, -38948,39489,38603,39489,39150,39489,39144,39489,38783,39489,38785,39489, - 3,39489, 1,39512,38971,39515,39161,39515, 1,39489, 3,39520, -38971,39523,39161,39523,39175,39489,38987,39489,21604,39489,39161,39533, -38971,39533,39146,39489, 483,39538,39142,39489,35187,39542,38943,39489, - 483,39546,35728,39489,39085,39550,22807,39489,39085,39554,26219,39489, - 8647,39489,19396,39489,39085,39489,22807,39564,35728,39564,35187,39564, - 483,39570, 483,39564,35187,39574,35895,39489, 9,39489,18967,39580, -18967,39489, 9,39584,35187,39489,39142,39588,39085,39588, 483,39592, - 483,39588,39085,39596, 483,39489,38943,39600,39146,39600,39085,39600, -35187,39606,35187,39600,39085,39610, 4787,39489,15879,39489, 1368,38304, - 3867,39619, 8277,39619, 3997,39619, 4067,39619, 9459,39619, 8953,39619, - 1274,38304,27979,39633,14625,39633, 4569,39633,16381,39633,13325,39633, -26293,39633, 8685,39633,35843,39633, 1369,39633,19513,39633, 3863,39633, -37019,39633, 9955,39633,37377,39633, 8401,39633,10273,39633,20697,39633, - 4137,39633,20219,39633, 4063,39633,35895,38305, 483,39674,35915,38305, - 3,39678, 2,39678, 842,39678, 843,39679,39685,39687, 842,39679, - 843,39678,39691,39693, 2,39679,39681,39697, 3,39679,39683,39701, - 482,38305,39616,39705,39614,39705,39578,39705,35718,39705,35895,39705, -39489,39714,39489,39705,15879,39718, 4787,39718,35895,39718,15879,39705, -39489,39726, 4787,39705,39489,39730,35187,39705, 587,39734, 587,39735, -39489,39739, 587,39705,35187,39742, 1368,38305, 587,38304,39241,39749, -39239,39749,39237,39749,38599,39749,38597,39749,38633,39749,38631,39749, -39677,39749,38801,39749,38805,39749,38679,39749, 483,39771,39235,39749, -15879,39775, 4787,39775,35895,39775, 483,39748,38679,39783, 483,38304, -38121,39787,38219,39787,38253,39787,37899,39786,38731,39795,37617,39786, -38713,39799,38011,39787,38185,39787,37145,39805,14625,39787, 4569,39787, -19396,39787,35931,39787,39489,39815,15269,39787, 4827,39787, 587,39786, -38679,39823,37899,39787,38391,39827,37617,39787,38397,39831,17423,39787, - 4745,39787, 9,39787,18967,39838,18967,39787, 9,39842, 587,39787, -39588,39847,39489,39847,35187,39850,35187,39847,39489,39854,35187,39787, - 586,39858,39823,39861, 586,39859,39847,39865, 586,38305,39713,39869, -38861,39869,39737,39869,39745,39869,38675,39869,35187,39879,39823,39869, -35187,39883,39783,39869,35187,39887, 1108,39869, 295,39869,35927,39869, -37611,39869,38155,39869,35719,39869,39705,39901,39749,39869,22807,39905, -35728,39905,35187,39905, 483,39910, 483,39905,35187,39914,35187,39868, -39823,39919,39783,39919,38675,39919,39749,39919, 483,39927, 1011,39869, - 9,39930, 9,39869, 1011,39934, 1369,38304, 1275,39938, 1275,38304, -39429,39943,23023,39943,22605,39943,25483,39943,22677,39943, 1369,39942, - 803,38305,17455,39956,13737,39957,39705,39961, 1505,38305,21605,39965, - 713,39967, 305,39967, 1489,39967, 1509,39967, 25,39967,15705,38305, - 767,39979,39705,39981,17455,38305, 15,39985, 9513,39987,16859,39987, -17469,39987, 803,39984, 154,38305, 165,39997, 374,38305, 11,40001, - 66,38305, 340,38305,30091,40006,27978,38305,39633,40011,23755,40011, -27805,40011,26331,40011,25793,40011, 8495,40011, 511,38305, 11,40025, - 935,38305, 483,40029, 1109,38305, 11,40033, 295,38305, 256,38305, - 375,40039, 9805,40039,20762,38305, 1141,40045, 1447,40045, 33,40045, - 88,38305,11251,40053, 5177,40053, 136,38305,36727,40059,37895,40059, -36079,40059, 144,38305, 113,40067, 341,38305, 113,40071,16937,40071, -27979,38305,38411,40077, 483,40077,39943,40077, 9565,40077, 113,38305, - 4727,40087, 9,40089,37662,38305,37241,40093,37932,38305,36773,40097, -37782,38305,37978,38305,39633,40103,38389,40103, 305,38305,16833,40109, - 25,38305,16833,40113,20501,38305, 1011,40117, 1347,40117, 253,38305, -16937,40123, 53,38305,16937,40127, 251,38305, 21,38305,38004,38305, - 7,40135,37241,38305, 6,40138, 2,40141,35187,40142,35187,40141, - 2,40146, 2,40147,38056,40141,37663,40138, 3,40138,40145,40157, -40149,40157,40153,40157, 3,40139,40151,40165,40093,40165,36773,38305, -37933,40171,37899,40173,37933,40170,35931,40170, 483,40179,37617,40170, - 483,40183,37899,40170,37933,40187, 483,40187,37409,40170, 3,40193, - 483,40171,35931,40197,37617,40197,37899,40197, 6,40170,37844,40205, - 3,40205,35187,40208,35187,40205, 3,40212, 7,40171,40207,40217, -40211,40217,40215,40217,40195,40217, 2,40217,40193,40227,37845,40217, -40205,40231,37845,40170, 7,40235,37325,38305, 7,40238, 2,40241, - 2,40240, 7,40239,35187,40247, 3,40249, 3,40248, 3,40247, -35187,40254, 3,40246,37844,40247, 1368,40238, 586,40239, 1369,40238, -37845,40238,40259,40269,40265,40269, 587,40239, 2,40238, 7,40276, -40251,40277, 3,40238,40243,40283,35187,40282,40275,40287, 3,40239, -40279,40291,40245,40291,40269,40291, 7,40290,40269,40299,40263,40291, - 2,40239,40287,40305,40257,40305,40253,40305,40261,40305,40267,40305, -10219,38305, 7,40316, 2,40318, 2,40319, 1368,40316, 1369,40316, - 2,40317,40327,40329, 3,40317,40321,40333,40325,40333, 2,40316, - 7,40338,40333,40341, 3,40316,40323,40345, 413,38305, 7,40349, - 375,40349, 1217,38305, 483,40355, 1216,38305, 7,40359, 412,38305, - 483,40363,36348,38305, 2,40366,36429,40369,38233,38305, 7,40373, -25296,38305, 7,40377, 265,38305,27978,40381,30492,40380, 17,40380, - 8495,40387, 6,40380, 11,40391, 7,40380,30091,40394, 7,40381, -27021,40399, 9195,40399,40391,40399,40001,40399,21605,40398, 6,40381, -40395,40411,40007,40411, 17,40411,21605,40381, 7,40418, 17,40419, - 241,40380, 483,40425,21605,40380, 7,40429,30091,40380, 7,40432, - 11,38305,18967,40436, 483,40439, 587,40436, 483,40443, 1369,40436, - 483,40437, 587,40449, 3,40436, 3,40437, 9875,40455,20501,40455, - 1011,38305, 483,40461, 587,40463, 587,40460, 483,40467, 9,40460, - 9565,40471, 7,40461, 959,40475, 759,40475, 47,40475, 903,40460, - 7,40483, 15,38305, 1369,40486, 1011,40489, 241,40486, 483,40493, - 3,40486, 165,40497, 3,40487, 253,40501, 1471,40501, 53,40501, -21605,38305,27533,40509, 15,40509,31103,40513, 1275,40509, 7,40508, -23755,40519,39633,40519,27805,40519,26331,40519,25793,40519, 8495,40519, - 7,40509,26219,40533, 305,40533, 25,40533, 713,40533, 265,40509, -31103,40543, 265,40508, 7,40547,25367,38305, 6,40551, 7,40551, - 6,40550,40555,40557, 7,40550,40553,40561, 17,38305,19917,40565, - 587,40565, 265,40564, 8495,40571, 265,40565, 8861,40575, 3,40564, - 113,40579, 3,40565,10109,40583,10108,40583,10108,40582,40585,40589, -10109,40582,40587,40593, 1141,40583, 1447,40583, 33,40583, 903,38305, - 7,40603, 1141,40605, 1447,40605, 33,40605, 1011,40602, 7,40613, -18967,38305, 1108,40617, 1072,40617, 165,40617, 1291,40617, 524,40617, - 9,40617, 1011,40628, 11,40616, 483,40633, 11,40617, 483,40636, - 483,40617, 11,40641, 1011,40640, 587,40641, 11,40640, 9,40616, - 587,40616, 483,40653, 7,40616, 1141,40657, 1447,40657, 33,40657, - 1011,40617,21183,40665, 7,40665, 483,40664, 9,40664, 241,38305, - 483,40675, 15,40674, 483,40679, 9,40675, 7,40674, 375,40685, - 9805,40685, 7,40675, 265,40691, 59,40691, 331,40691, 1325,40691, - 265,40674, 483,40701, 9,38305, 7963,40704, 7961,40707,27995,40704, -27533,40711,17573,40704,10001,40715,13755,40705, 9377,40719, 1,40704, - 3,40723, 1,40724,40705,40727, 7,40724,40729,40731, 7,40723, - 3,40734, 586,40723, 6,40704, 3,40741, 6,40742,40705,40745, - 0,40742,40747,40749, 0,40741, 3,40752,21604,40704, 3,40757, - 7,40758, 7,40757, 3,40762, 586,40757, 1274,40704, 3,40769, - 0,40770, 0,40769, 3,40774, 9377,40704,27533,40779,10001,40779, -13755,40779,10001,40705,17573,40787, 9377,40787,27533,40705,27995,40793, - 9377,40793,21605,40705,26715,40799,26865,40799,40761,40799,40765,40799, -40731,40799,40737,40799, 6,40799,26719,40799,40739,40799,40767,40799, - 587,40799,26625,40821,40723,40821,40757,40821, 1275,40705, 1991,40829, - 3621,40829,40773,40829,40777,40829, 5299,40829,40749,40829,40755,40829, - 1,40829, 4907,40829,17711,40829, 1011,40704, 9565,40851, 587,40704, -39515,40855,39523,40855, 3507,40855, 1971,40855, 0,40855,40829,40865, -40845,40855,21783,40855,23983,40855, 4625,40855,10603,40855,39533,40855, -21605,40855, 713,40881,39489,40881,18967,40704, 1011,40705,18967,40889, - 9617,40889, 2,40704,36727,40895,37895,40895,36079,40895, 3,40704, -11251,40903, 5177,40903, 2,40705,36729,40909, 3,40705,11355,40913, -30748,38305, 7,40916,17125,38305, 7,40920,30091,38305, 340,40924, - 7,40924,25793,40929, 265,40928, 1011,40925, 7,40935, 265,40925, - 7,40939, 265,40924, 7,40942,14315,38305,31103,40947, 375,40947, - 7,40947, 8495,40953,37845,38305,37897,40957, 1275,40957,36945,40956, - 6,40957, 7,40957, 6,40956,40967,40969,36773,40969, 7,40956, -38389,40975,39633,40975,40965,40975,36773,40956, 7,40983,37409,38305, -37285,40986, 113,40987, 2,40987,39313,40993,40157,40993, 3,40987, -39439,40999,40217,40999, 2,40986,38305,41005, 7,41007,40999,41009, -40165,41005,37241,41005, 3,40986, 3,38304,40375,41019,40237,41019, -40985,41019,40137,41019,40963,41019,39015,41019,38749,41019,40098,41019, -39323,41019,40972,41019,40989,41019,39009,41019,38751,41019,40094,41019, -39325,41019,41014,41019,15567,41019,12971,41019,13355,41019,13541,41019, -21049,41019,21242,41019,39127,41019,39714,41019,39739,41019,38603,41019, -38601,41019,38863,41019,39726,41019,39730,41019,20956,41019,20773,41019, -38783,41019,38785,41019,11970,41019,19441,41019,19656,41019, 4696,41019, - 5,41019, 6,41097,27169,41019,27168,41019,33465,41019,40011,41019, -30492,41019,40519,41019,39295,41019,30493,41019,40929,41019, 357,41019, - 367,41019, 471,41019, 1249,41019, 628,41019,20057,41019, 4569,41019, -14625,41019, 4545,41019,36203,41019,36343,41019,40953,41019,21183,41019, -20103,41142,13325,41019, 8337,41147, 4549,41019, 9357,41019, 9356,41019, -40966,41019,36026,41019,37558,41019,36226,41019,36944,41019, 8386,41019, -20186,41019, 9083,41019, 9484,41019,36027,41019,37559,41019,36227,41019, -36945,41019, 8387,41019,20187,41019,19513,41019,35843,41019,20219,41019, - 8401,41019,37019,41019,20697,41019, 4137,41019, 9955,41019, 3863,41019, - 4063,41019,37377,41019,10273,41019,21405,41019,20606,41019, 9984,41019, -37215,41019,40969,41019,36773,41218,40975,41019,40097,41019,36773,41224, -40103,41019,37979,41019,19396,41019,11131,41019,21059,41019, 9082,41019, -28205,41019,25551,41019,24613,41019,20326,41019,21087,41019,39705,41019, -35895,41250,15879,41250, 4787,41250,11949,41019, 9,41258, 4669,41019, - 9,41262,15879,41019,39705,41266, 4787,41019,39705,41270,20805,41019, -37501,41019,19631,41019, 9,41278,35895,41019,39705,41282, 9704,41019, -40387,41019,38939,41019,40033,41019,40571,41019,20804,41019, 341,41019, - 241,41299,27979,41019, 241,41303, 9377,41019, 11,41306, 256,41019, -35187,41310, 257,41019,35187,41315,20763,41019, 11,41318, 4745,41019, -17423,41019, 587,41019, 11,41326,37409,41326,37500,41019, 9875,41019, - 10,41334, 10,41335, 11,41334,41339,41341, 11,41335,41337,41345, - 1471,41019,37325,41019, 587,41351,37241,41019,40093,41354,41005,41354, -37408,41019, 241,41360,41005,41019,37241,41364,40093,41019,37241,41368, -20885,41019,20413,41372, 1369,41019,37409,41377,37409,41019, 241,41381, - 587,41380,40967,41019, 9195,41019, 11,41388,20413,41019,20885,41392, -10219,41019, 587,41397,20501,41019, 10,41400, 10,41401, 11,41400, -41405,41407, 11,41401,41403,41411, 253,41019, 6,41019,40373,41417, -40135,41417,40235,41417,40983,41417,40967,41417,27021,41417,40533,41417, -30091,41417, 4713,41417,16363,41417, 4863,41417,13119,41417,26415,41417, - 8757,41417,23493,41417,27377,41417, 4213,41417, 9195,41417,39489,41417, - 9335,41417, 4147,41417, 3933,41417, 8109,41417,36212,41417,36773,41417, -20103,41417, 8337,41417,37145,41417, 8997,41417,40957,41417, 241,41417, -35187,41478,18967,41417, 11,41483,35187,41417, 241,41486, 587,41487, - 587,41417, 8387,41417,20187,41417,14653,41417,36945,41417, 7,41019, -30091,41502,26331,41503, 8717,41503,23755,41503,27805,41503, 3785,41503, -40957,41502,36212,41502,39633,41503,10055,41503, 4329,41503, 4311,41503, -10351,41503,36773,41502,20103,41502, 8337,41502, 8997,41502, 1275,41503, - 15,41503,18967,41541,35187,41502, 241,41544, 241,41502,35187,41548, -27021,41019, 11,41552, 53,41019, 6,41018,41165,41559,41531,41559, -41517,41559,41157,41559,40975,41559,40103,41559,41537,41559,41169,41559, -41167,41559,41239,41559,41533,41559,41535,41559,40011,41559,27979,41559, -40519,41559,41549,41559,41311,41559,16381,41559,13325,41559,26293,41559, - 8685,41559,41361,41559,41545,41559,41503,41559,36773,41607,40957,41607, - 8997,41607,20103,41607, 8337,41607, 241,41607,35187,41607, 1369,41559, - 4569,41559,35843,41559,19513,41559, 3863,41559, 9955,41559, 4063,41559, -37377,41559,10273,41559,20697,41559, 4137,41559,37019,41559,20219,41559, - 8401,41559,14625,41559, 7,41018,41181,41653,41466,41653,41387,41653, -41476,41653,41474,41653,41185,41653,41183,41653,41171,41653,41468,41653, -41470,41653, 8997,41653,41417,41674,41315,41653,41478,41653,26219,41653, - 8647,41653,41381,41653,41486,41653,19396,41653,41417,41653,36773,41692, -40957,41692, 8997,41692,20103,41692, 8337,41692, 241,41692,35187,41692, -20103,41653,41417,41708, 8337,41653,41417,41712,36773,41653,41417,41716, - 483,41653, 9,41653,18967,41722, 241,41653, 1,41727,41417,41729, -41417,41726,18967,41653, 9,41734,40957,41653,41417,41738,35187,41653, -41417,41742, 11,41019,27021,41746, 587,41746, 9195,41746,20501,41746, - 9377,41746, 9875,41746,20763,41746, 9,41019, 4669,41762,11949,41762, -19631,41762,18967,41762,20273,41762, 9617,41762, 17,41019,20762,41776, -20762,41777,20763,41776,41781,41783,20763,41777,41779,41787,40957,41019, - 6,41790, 7,41790,41559,41795, 6,41791,41795,41799, 7,41791, -41793,41803,41417,41803, 9617,41019, 9,41808,36212,41019, 7,41812, -35187,41019, 256,41816, 7,41816, 241,41820,41559,41821, 7,41817, -41417,41827, 241,41816, 7,41830, 241,41019, 1,41835, 7,41837, -41559,41839, 7,41836,41417,41843,37408,41834, 7,41835, 1,41848, -41417,41851,41417,41849, 7,41834,41559,41857,35187,41856,35187,41834, - 7,41862,18967,41019, 483,41867, 9,41866,30091,41019, 7,41872, -14315,41019, 8997,41019, 7,41878,41559,41881, 7,41879,41417,41885, -20273,41019, 9,41888, 8337,41019, 7,41892,41559,41895, 9,41893, - 483,41893, 7,41893,41417,41903,20103,41019,21183,41906, 7,41906, -41559,41911, 9,41907, 483,41907, 7,41907,41417,41919,36773,41019, -40097,41922,40969,41922, 7,41922,41559,41929, 9,41923, 483,41923, - 7,41923,41417,41937, 2,38304,38595,41941,40177,41941,39459,41941, -38591,41941,38593,41941,40155,41941,39451,41941,38589,41941,39237,41941, -39241,41941,39239,41941,38599,41941,38597,41941,38633,41941,38631,41941, -26777,41941, 9741,41941,26781,41941, 9745,41941,39677,41941,38801,41941, -38805,41941, 5,41941, 6,41986,38881,41989, 9771,41941, 14,41941, -38881,41995,38897,41941,30349,41941,26857,41941,26933,41941, 9777,41941, -40077,41941,31598,41941,35931,41941,37519,41941,35690,41941,40651,41941, -38955,41941,40887,41941,39235,41941,35895,42025,15879,42025, 4787,42025, - 8982,41941, 668,41941,26625,42035, 9731,42035, 1419,41941, 9731,42041, -26625,42041,40471,41941,38931,41941,40037,41941,40851,41941,37617,41941, -37899,41941,39457,41941,36773,42059,39429,41941,27021,41941, 375,41941, -35187,42066,31103,41941,26625,42070, 9195,41941, 483,41941,39433,41941, -37241,42079, 587,41941, 1,42083,35187,42083, 9,42082, 9731,42089, -26625,42089, 6,41941, 2,42095,21605,42097,38305,42099, 5,42094, -38881,42103,42101,42103, 2,42094,38305,42109, 7,41940, 9459,42113, - 8953,42113, 3997,42113, 4067,42113, 8277,42113, 3867,42113, 9,41941, - 587,42126, 9731,42129,26625,42129, 17,41941, 8861,42134,26625,41941, -31103,42138, 8861,41941, 7,42143, 17,42142,35187,41941, 375,42148, - 9731,41941, 7,38304,39023,42155,41231,42155,25445,42155, 1,42155, - 2,42162, 3,42162,38903,42167,38971,42167,39161,42167,40855,42167, -18967,42167, 2,42163, 3,42163, 5,42155, 2,42182, 3,42182, - 2,42183,42187,42189, 3,42183,42185,42193,21604,42155,18967,42197, -39161,42197,38971,42197,38903,42197,40855,42197,39175,42155,38987,42155, -40881,42155,38925,42155,22779,42155,22243,42155,28063,42155,41303,42155, -31598,42155,25299,42155, 357,42155, 367,42155, 471,42155, 1249,42155, -35690,42155,37519,42155, 272,42155, 1476,42155, 280,42155, 949,42155, - 1517,42155,40387,42155,40571,42155,40033,42155,38939,42155,21087,42155, -20326,42155, 9704,42155, 9304,42155,35931,42155,40998,42155, 253,42155, - 265,42270, 375,42155,35187,42274,31103,42155,26625,42278,25381,42155, -10081,42283,41417,42155, 1369,42287,26625,42155,31103,42290, 9617,42155, - 9,42294, 53,42155, 265,42298,20273,42155, 9,42302,37899,42155, -37617,42155, 1471,42155, 265,42310, 587,42155,35187,42315,38233,42155, -38004,42155,36773,42155,37845,42322,38056,42155,39019,42327,37145,42327, -37844,42155,40305,42333,37933,42155, 483,42155,37845,42155,36773,42340, -40999,42155, 305,42155,21605,42347, 713,42155, 9195,42350,21605,42351, - 9195,42155, 713,42356, 2,42155, 1,42360, 8229,42361,40987,42361, -35187,42361,36773,42369,35187,42360,39019,42373,37145,42373, 3,42155, -42179,42379, 1,42379, 7,42379, 15,42385,38305,42387, 1,42378, -38903,42391,38971,42391,39161,42391,40855,42391,18967,42391,42389,42391, - 7,42378,40704,42405,42391,42407, 9,42405,38305,42410,42391,42413, -38305,42405, 9,42416,42391,42419,40987,42378, 1369,42379,35187,42378, -40305,42427, 25,42155,21605,42431, 2,42154, 1,42435,42379,42436, -42382,42435,42423,42435,42269,42435,42333,42435,42427,42435,42379,42435, - 1,42450,40987,42451,35187,42451, 3997,42435, 4067,42435, 9459,42435, - 8953,42435, 8277,42435, 3867,42435, 3,42154,42165,42471,42363,42471, -42345,42471,42366,42471,26219,42471, 8647,42471,42341,42471,42368,42471, -19396,42471,42361,42471, 1,42491,40987,42490,35187,42490,41417,42471, - 483,42471,18967,42471, 9,42502, 9,42471,18967,42506,40987,42471, -42361,42510,35187,42471,42361,42514,32805,42155, 265,42155, 253,42520, - 1471,42520, 53,42520,40987,42155, 3,42528,42435,42531, 3,42529, -42361,42535,35187,42155, 7,42539,38305,42541, 2,42543, 2,42542, - 2,42541,38305,42548, 2,42540, 1368,42539, 375,42538, 1369,42539, - 2,42538,39019,42561,38305,42560,42559,42565,37145,42561, 3,42538, -40305,42571,42545,42571,42435,42571, 3,42539,40277,42579,39315,42579, - 7,42579,38305,42585,42561,42587,42551,42579,42547,42579,42561,42579, -42361,42579, 2,42539, 7,42598,42571,42599,37845,42599, 9,42155, -20273,42606, 9617,42606, 6,38304,40509,42613,31103,42615,21604,42613, -40471,42613,40851,42613,40037,42613,38931,42613, 8982,42613,27979,42613, - 483,42631,41941,42631,40957,42613,37933,42637,41503,42613, 483,42641, - 8861,42613, 17,42644,17423,42613, 1011,42649, 4745,42613, 1011,42653, - 9875,42613, 1011,42657, 1471,42613,36773,42613, 483,42663,37844,42613, -40305,42667,37979,42613,41941,42671, 1369,42613,38057,42675, 331,42613, - 17,42678, 1325,42613, 17,42682, 334,42613, 1328,42613, 8337,42613, - 483,42691,20103,42613, 483,42695, 53,42613, 393,42613, 1359,42613, - 3,42613, 483,42705,35187,42704,40305,42709,10257,42705,37357,42705, - 2,42613, 62,42613, 59,42613, 17,42720,20501,42613, 1011,42725, - 253,42613, 3,42612,40975,42731,40103,42731,27979,42731,40519,42731, -40011,42731,16381,42731,13325,42731,26293,42731, 8685,42731,41503,42731, - 1369,42731, 4569,42731,35843,42731,19513,42731, 3863,42731, 9955,42731, -20697,42731, 4137,42731,37019,42731, 8401,42731,20219,42731, 4063,42731, -14625,42731,37377,42731,10273,42731,18967,42613, 165,42783, 241,42613, -35187,42613, 3,42788,40305,42791, 3,42789,40277,42795,39315,42795, - 17,42613, 8861,42800, 331,42800, 1325,42800, 59,42800, 7,38305, -25004,42810,25005,42810,25184,42810,25185,42810, 264,42811, 5,42811, - 0,42822, 3,42822, 1,42810, 4,42829,25004,42811,42815,42833, -25184,42811,42819,42837,25005,42811,42813,42841,25185,42811,42817,42845, -41493,42811,41622,42811,25367,42810,30748,42810,39650,42811,42752,42811, -38673,42811,38675,42811,39823,42811,39783,42811,27533,42811,26625,42869, - 331,42811,35187,42873,41559,42811, 1369,42876, 767,42811,18967,42881, -41019,42811,37899,42885,37617,42885,35931,42885,27021,42885,30091,42885, - 9195,42885,25793,42811,30091,42899,27021,42899,37845,42811,42667,42905, - 59,42811,35187,42909, 1325,42811,35187,42913,37897,42811,17125,42810, -30091,42810,25793,42921,41019,42921, 265,42920, 1369,42811,30091,42929, -41559,42928,20103,42929, 8337,42929,36773,42929,42731,42928,39633,42928, -42707,42811,42704,42811, 483,42947,39633,42811, 1369,42950,39749,42811, - 483,42955, 1275,42811, 265,42810,40411,42961,30091,42960,21605,42810, -26331,42967,25793,42967,23755,42967,27805,42967,39633,42967,42731,42967, -41559,42967,41019,42967, 8495,42967,42731,42811, 1369,42986, 241,42810, - 375,42991, 9805,42991,18967,42810, 1141,42997, 33,42997, 1447,42997, - 265,42811,35187,43005, 9377,43005, 9533,43005,37145,43005,21605,42811, -34311,43015,42619,43015,26625,43015,24545,43015, 9731,43015, 2,42810, - 3,42810, 0,43028,43005,43031, 295,43029, 1108,43029,35927,43029, -38155,43029,37611,43029, 9,43029, 1011,43044, 1011,43029, 9,43048, - 2,42811,42831,43053, 5,43053,42829,43057,36256,43053, 9,43053, -35187,43062,35187,43053, 9,43066, 3,42811, 5,43070,22807,43071, -37663,43071,42613,43070, 483,43079, 241,43071, 9,43083,37845,42810, -41559,43087,38389,43087,42731,43087,39633,43087,41019,43087,42613,42811, -32805,43099,37845,43098,37845,43099,37844,43098,43105,43107,37844,43099, -43103,43111, 3,43099, 1369,43115, 3,43098, 483,43119, 15,42811, -20273,43123, 9617,43123,35187,42810, 7,43129, 2,43130, 2,43131, -38305,43129, 3,43136,43135,43139, 3,43137,43133,43143, 1368,43129, -43143,43147, 59,43129, 1325,43129, 331,43129, 265,43129, 2,43129, - 7,43158,43143,43161, 3,43129,38305,43164,43135,43167,37408,38305, - 7,43171, 2,43172,40999,43175, 2,43173,40101,43179,41017,43179, - 1368,43171,40999,43185, 59,43171, 1325,43171, 331,43171, 265,43171, - 2,43170,37783,43197, 2,43171, 7,43200,40999,43203,37617,43201, - 3,43171,38305,43208,43179,43211, 3,38305,43129,43214,43135,43217, - 1,43214, 1011,43221,42041,43221, 1418,43221,41941,43227,42035,43221, - 669,43221,41941,43233,42089,43221,42129,43221, 1369,43221, 15,43240, -41941,43243, 15,43221, 1369,43246,41941,43249,11989,43215, 9,43253, -13737,43215, 9,43257,37357,43215,10257,43215,38118,43215,38132,43215, -37544,43215,37409,43215, 483,43270, 113,43215, 587,43275,37345,43215, -37241,43214,40993,43281,40993,43215,37241,43285, 9,43215,38057,43288, - 483,43215,38057,43292,37409,43292,10289,43215, 15,43214, 165,43301, - 11,43214, 9,43214,11251,43307, 5177,43307, 17,43214, 113,43313, - 11,43215, 165,43215, 7,43214, 0,43321, 4,43322, 4,43321, - 0,43326,35186,43321, 295,43321, 1108,43321,35927,43321,38155,43321, -37611,43321, 9,43321, 1011,43342, 1011,43321, 9,43346, 7,43215, -21604,43351, 1,43351, 3,43354, 3,43351, 1,43358, 15,43351, -38305,43363,43353,43365,43357,43365,43361,43365, 1011,43363,37409,43214, -43179,43375,41941,43215,37408,43379, 7,43379,35187,43382,35187,43379, - 6,43386, 7,43386, 6,43387,43391,43393, 7,43387,43389,43397, - 1011,43215,37408,43401, 7,43401,35187,43404,35187,43401, 7,43408, -38057,43215,40097,43413,40969,43413, 7,43413, 9,43412, 483,43412, -35187,43214,40305,43425,40275,43425,38305,43425, 6,43430,43413,43433, - 6,43425,38305,43436,43413,43439,41941,43425, 6,43443, 7,43443, - 6,43442,43447,43449, 7,43442,43445,43453, 1011,43425, 7,43457, -37844,38305,42336,43461,42917,43461,42905,43461,39013,43461,40305,43461, -40275,43461,37933,43461,42155,43474,42155,43461,37933,43478, 6,43460, -41941,43461, 6,43485, 7,43485, 6,43484,43489,43491, 7,43484, -43487,43495, 1011,43461, 7,43499, 2,38305,41603,43503,41686,43503, -41825,43503,41828,43503,42541,43502,42579,43513,16936,43503,36400,43503, -36439,43519,36348,43503, 6,43523,36413,43525, 6,43522,36439,43529, -36439,43523,41744,43503,41688,43503,41605,43503,41706,43503,41620,43503, - 1,43503, 1275,43544, 4,43544, 7,43544,41417,43551, 7,43545, -39633,43555,41559,43555,42731,43555,41019,43555, 1,43502,41692,43565, -41607,43565,41653,43565,41417,43570,41417,43565,41653,43574,41502,43565, -41559,43579,41019,43565, 7,43582,41559,43585, 7,43583,41417,43589, - 7,43565,41019,43593,41653,43595,41019,43592,41559,43599, 5,43502, -21605,43603,42810,43604,42811,43605,43607,43609,42811,43604,42810,43605, -43613,43615,41692,43503,35187,43618,41607,43503,35187,43622,41360,43503, -41559,43627,41820,43503,41559,43631,41544,43503,41559,43635,35760,43503, - 8315,43503,37408,43502,37783,43643,42538,43503,42601,43647,42553,43647, -42555,43647,41742,43503,41417,43654,41486,43503,41653,43658,41417,43503, -41827,43662,41742,43662,41653,43662,35187,43668,35187,43662,41653,43672, -37783,43503,37325,43502,42795,43679,42579,43679,41502,43503,41559,43685, -35187,43687,35187,43684,41559,43691,37241,43503,37409,43695,41019,43697, -41381,43503,41653,43700, 1275,43503, 1,43704,35187,43704, 9,43705, - 9731,43711,43221,43711,43549,43711,26625,43711, 587,43503,42811,43721, -35895,43723,15879,43723, 4787,43723,41653,43503, 1,43731,41417,43733, -41381,43730,41486,43730,41417,43730,35187,43740,35187,43730,41417,43744, - 9,43502,36727,43749,36079,43749,37895,43749,41827,43503,41417,43756, - 6,43502,39616,43761,39614,43761,39578,43761,39901,43761,41282,43761, -41266,43761,41270,43761,39961,43761,39981,43761,35718,43761,39869,43781, -41019,43761,35895,43784,15879,43784, 4787,43784,15879,43761,39489,43792, -41019,43792, 4787,43761,39489,43798,41019,43798,35895,43761,39489,43804, -41019,43804, 587,43761,35187,43810,39869,43813,35187,43761, 587,43816, -39869,43819, 587,43817,39489,43823,41019,43823,39489,43761,15879,43828, - 4787,43828,35895,43828, 7,43502, 6,43503,36348,43838,36439,43841, -36348,43839,36429,43845, 7,43503,41817,43848,43817,43849,41019,43853, - 4,43849, 0,43856,43784,43859,41019,43859,43761,43862,43761,43859, -41019,43866, 0,43849, 4,43870,43784,43873,41019,43873,43761,43876, -43761,43873,41019,43880, 1,43848,41417,43885,35186,43849,43784,43889, -41019,43889,43761,43892,43761,43889,41019,43896,41816,43848,41559,43901, -41019,43848,41559,43905,35187,43907,35187,43904,41559,43911,41019,43849, -41827,43915,43851,43915,41742,43915,41653,43915,35187,43922,35187,43915, -41653,43926,35187,43848,41417,43931,41019,43930,41559,43935,41019,43931, -41653,43939,37409,43502,41354,43943,40165,43943,41019,43943,37241,43948, -37241,43943,41019,43952,37408,43503,41417,43957,37663,43957,41019,43956, -41559,43963,41019,43957,41653,43967,41816,43503, 6,43970, 7,43970, -41559,43975, 6,43971,43975,43979, 7,43971,43973,43983,41417,43983, -41019,43503, 1,43989, 7,43990,41417,43993, 7,43991,41559,43997, -37408,43988,41559,44001,37408,43989,41381,44005, 7,43989,41381,44009, -41486,44009, 1,44008,41417,44015,41417,44009,35187,44018,35187,44009, -41417,44022, 7,43988,41559,44027,35187,44029,35187,44026,41559,44033, -35187,43988, 6,44036, 7,44036,41559,44041, 6,44037,44041,44045, - 7,44037,44039,44049,41417,44049,21605,43503, 7,44055, 265,44057, -35187,43503,41692,44060,41607,44060,41502,44060,41559,44067, 1275,44060, -41653,44060,41417,44072,36945,44061,41019,44077,41417,44060,41653,44080, - 6,44061,41922,44085,43413,44085,41019,44085,36773,44090,36773,44085, -41019,44094, 7,44061,41559,44099,42731,44099,39633,44099,41019,44099, - 6,44060,44099,44109, 7,44060,41417,44113,41019,44112,41559,44117, -44085,44113,41019,44113,41653,44123,41019,44060, 6,44126, 7,44126, -41559,44131, 6,44127,44131,44135, 7,44127,44129,44139,41417,44139, -36773,44061,41417,44145, 7,44145,41019,44149,35187,43502,41217,44153, -41472,44153,29229,44153,41099,44153,36429,44153,42559,44153,41417,44153, -37145,44166,37783,44153,37214,44153,41019,44173, 7,44153,41019,44177, -37145,44179,37145,44176,41019,44183,37145,44153,41417,44186, 7,44186, -41019,44191,38056,38305,41472,44195,41217,44195,41099,44195,29229,44195, -36429,44195,42559,44195,35187,44195, 6,44209,43413,44211,41417,44195, -37145,44214,37783,44195,37214,44195,41019,44221, 7,44195,41019,44225, -37145,44227,37145,44224,41019,44231,37145,44195,41417,44234, 7,44234, -41019,44239, 6,38305,42453,44243,42493,44243,42472,44243,42439,44243, -42474,44243,42441,44243,42363,44243,42471,44256,42381,44243,42165,44243, -42471,44262,42325,44243,42330,44243,42343,44243,42321,44243,42319,44243, -42371,44243,42376,44243,42568,44243,42447,44243,42484,44243,42054,44243, -42056,44243,44171,44243,43645,44243,43960,44243,44219,44243,43201,44243, -37617,44298,43206,44243,38711,44243,43199,44243,42605,44243,40231,44243, -43677,44243,40959,44243,10586,44243,10827,44243,42594,44243,42603,44243, -42577,44243,42596,44243, 6664,44243, 6243,44243, 9780,44242, 566,44242, - 566,44243, 567,44242,44337,44339,43517,44243, 9781,44242,42012,44243, -36303,44242,36303,44243,26970,44242,26971,44242,43639,44243, 4593,44243, - 6625,44358, 3113,44243, 3023,44243, 4736,44243, 6653,44243,42518,44243, - 3251,44243,42516,44243,42486,44243,42449,44243,42496,44243,42456,44243, -19257,44243,19243,44243,43425,44242,43413,44389,40511,44243,17452,44243, -42085,44243,43707,44243,42087,44243,40961,44243,43709,44243,44071,44243, -36099,44243,36098,44242,44409,44411,36099,44242,36098,44243,44415,44417, -43605,44243,43222,44242,43223,44243,44423,44425,43222,44243,43223,44242, -44429,44431,42199,44243,24081,44243,42181,44243,42383,44243,42435,44441, -42401,44243,42177,44243,43547,44243, 5,44242,42283,44451,25380,44451, -42155,44455, 1369,44451,21605,44458,42155,44461,21605,44451, 1369,44464, -42155,44467,42373,44243,37145,44470,42561,44243,37145,44474,42579,44474, -42327,44243,37145,44480,27514,44243,42490,44243,35187,44486,42451,44243, -35187,44490, 413,44243,32805,44243,42155,44496,28547,44243,42064,44243, -42138,44243,40517,44243,40543,44243,30294,44243,38004,44243,43461,44513, -38232,44243,42155,44517,38005,44243,42155,44521,30749,44243, 9780,44243, -44345,44527,26970,44243,44355,44531, 6625,44243, 4593,44534, 33,44535, - 9781,44243,44333,44541,25005,44243,26971,44243,44353,44547,25185,44243, -25589,44243,42074,44243,42152,44243,10831,44243, 77,44243, 120,44243, - 506,44243,38041,44243, 5101,44243,16989,44243,10511,44243, 4931,44243, - 5267,44243,16981,44243,13017,44243,12705,44243,13673,44243,18391,44243, -18617,44243,14599,44243, 9366,44243,36302,44243,18217,44243,42332,44243, -42435,44599,42570,44243,42435,44603,42426,44243,42435,44607,41539,44243, -41720,44243, 9132,44243, 1216,44243,36302,44242, 3,44618,44351,44621, -30748,44243,30748,44242,44525,44627,30749,44242,44625,44631,16931,44243, -35931,44243,41941,44636,39600,44243,42500,44243,18929,44243,38669,44243, -38677,44243,17019,44243,39941,44243,39955,44243,27021,44243, 483,44656, -41941,44656,37844,44242,44351,44663,41653,44243, 483,44666,43413,44243, -43425,44671,42514,44243,42361,44674,42368,44243,42471,44678,42361,44243, -42579,44682,42514,44682,42471,44682,35187,44688,35187,44682,42471,44692, -20234,44243, 8444,44243, 567,44243,44335,44701,16937,44243, 11,44705, - 1369,44705,26625,44243,41941,44710,41941,44243,37899,44714,37617,44714, -35931,44714,27021,44714,26625,44714, 9195,44714, 9731,44714,43957,44243, -37663,44730,20103,44243, 483,44734, 8337,44243, 483,44738, 9533,44243, - 4727,44243, 25,44744,10527,44243, 25,44748, 4541,44243,38128,44243, -38057,44243,42155,44757,37145,44759,37145,44756,42155,44763, 587,44756, -37845,44243,43461,44769,36773,44771,36773,44768,43461,44775, 25,44243, -10527,44778, 4727,44778, 113,44778, 9195,44243,41941,44786, 483,44786, -37782,44243,43197,44793,43643,44793,38709,44793,17451,44243, 1011,44800, -35688,44243,36910,44243,36923,44243,37899,44243,41941,44810,37617,44243, -41941,44814,43201,44814, 9731,44243,41941,44820, 8997,44243, 483,44824, - 66,44243, 33,44829, 483,44243,27021,44832,30091,44832, 241,44832, - 9195,44832,41653,44832, 8997,44832,42471,44832,39489,44832,20103,44832, - 8337,44832,36773,44832, 903,44243, 1011,44856,18967,44243, 567,44861, - 566,44860,44863,44865, 566,44861, 567,44860,44869,44871, 241,44243, - 483,44874,42425,44243,42378,44243,42435,44881,35187,44883,35187,44880, -42435,44887, 1369,44881,36773,44243,37845,44892,43461,44895, 483,44892, -37845,44893,41019,44901,37145,44243,42327,44904,42373,44904,42561,44904, -38057,44904,42155,44913,42341,44243,42471,44916,30091,44243, 483,44920, - 113,44243, 25,44924,35187,44924,17125,44243,37663,44243,43957,44932, -39489,44243, 483,44936,39943,44243, 1369,44941, 587,44243,43215,44945, -35895,44947,15879,44947, 4787,44947,38057,44944, 8449,44243,20237,44243, - 265,44242,40399,44961, 11,44961,42471,44243,42165,44966,42363,44966, -42341,44966,42368,44966,42361,44966,35187,44976, 483,44966,35187,44966, -42361,44982,20834,44243, 1011,44243,17451,44988,35187,44988, 903,44988, -20763,44988,20763,44243, 1011,44998, 257,44243,42579,44243,42561,45004, -42361,45004, 2,44242,39616,45011,39614,45011,39578,45011,39901,45011, -41282,45011,41266,45011,41270,45011,39961,45011,39981,45011,35718,45011, -39869,45031,41019,45011,35895,45034,15879,45034, 4787,45034,15879,45011, -39489,45042,41019,45042, 4787,45011,39489,45048,41019,45048,35895,45011, -39489,45054,41019,45054, 587,45011,35187,45060,39869,45063,35187,45011, - 587,45066,39869,45069, 587,45067,39489,45073,41019,45073,39489,45011, -15879,45078, 4787,45078,35895,45078, 3,44242,36302,45087,44349,45089, -35187,45086,44351,45093, 2,44243, 14,45097, 5,45097, 6,45100, - 6,45097, 5,45104,21605,45097,38305,45109,45099,45111,45103,45111, -45107,45111,43215,45097,43325,45119,43329,45119,35895,45119,15879,45119, - 4787,45119,43331,45119,35187,45119,43321,45133,35187,45096,39313,45137, -40157,45137,43281,45137,43215,45137,37241,45145, 3,44243,42539,45148, -38305,45149,37408,45152,37408,45153,45067,45149,41019,45159, 4,45149, - 0,45163,38305,45163, 0,45162,45034,45169,41019,45169,45011,45172, -45011,45169,41019,45176,45119,45169, 0,45149,38305,45183, 4,45182, -45034,45187,41019,45187,45011,45190,45011,45187,41019,45194,45119,45187, - 0,45148,38305,45148, 1,45148,45176,45205,45194,45205,45169,45205, -45011,45210,45187,45205,45011,45214,45159,45205,45011,45205,45169,45220, -45187,45220,35186,45148,35186,45149,38305,45229, 7,45231,45220,45229, -45205,45229,45011,45236,45034,45229,41019,45229,45011,45242,45011,45229, -45205,45246,41019,45246,45119,45229, 1,45149,45165,45255,45011,45257, -45167,45255,45011,45261, 5,45149,45185,45265,45011,45267,43171,45149, -37617,45271,42538,45148,42435,45275,37409,45148,38709,45279,43197,45279, -45155,45279,43643,45279,42155,45148,42435,45289,35187,45291,35187,45288, -42435,45295, 1369,45289, 1011,45149, 483,45301, 11,45148, 33,45305, -37409,45149,45157,45309,43957,45309, 11,45149, 25,45315,35187,45315, -42155,45149,42579,45321,45151,45321,42514,45321,42471,45321,35187,45328, -35187,45321,42471,45332,45066,45149,45201,45337,45203,45337,35187,45149, -45201,45343,45011,45345,45203,45343,45011,45349,45011,45342,45201,45353, -45203,45353,45011,45149,35187,45358,45201,45361,45203,45361,35187,45148, -40217,45367,45233,45367,42155,45366,42435,45373,42155,45367,42471,45377, -37845,44242,41922,45381,43413,45381,44595,45381,44993,45381,41019,45381, -36773,45390,36773,45381,41019,45394,38056,44243,39313,45399,40157,45399, -43281,45399,43215,45399,37241,45407,37844,44243,40217,45411,42155,45410, -42435,45415,42155,45411,42471,45419,42538,44243, 3,45422,42435,45425, - 3,45423,42361,45429,42155,44243,32805,45432,37845,45432,37845,45433, -37844,45432,42435,45441,45439,45441,37844,45433,42341,45447,45437,45447, - 3,45433,42341,45453,42368,45453,42361,45453,35187,45458,35187,45453, -42361,45462, 483,45453, 3,45432,42435,45469,35187,45471,35187,45468, -42435,45475, 1369,45469,35187,45432, 3,45480,42435,45483, 3,45481, -42361,45487, 11,44243, 8861,45491, 3,45490, 33,45495, 3,45491, - 113,45499, 331,45491, 1325,45491, 59,45491,35187,44243,42490,45508, -42451,45508,38305,45508, 7,45515, 2,45517, 2,45516, 2,45515, - 7,45522, 1368,45515, 1011,45508,45381,45529,42378,45508,42435,45533, -42471,45508,42361,45536,37285,45509,41019,45541,42361,45508,42471,45544, - 113,45508, 2,45509,41354,45551,40165,45551,38305,45551, 7,45557, -41019,45551,37241,45560,37241,45551,41019,45564, 3,45509,45519,45569, - 2,45508,40157,45573,39313,45573,43281,45573,43215,45573,37241,45581, - 3,45508,40217,45585,45521,45585,45525,45585,45559,45585,45527,45585, -42155,45584,42435,45597,42155,45585,42471,45601,42155,45508, 3,45604, -42435,45607, 3,45605,42361,45611,37409,44243,43503,45615,37663,45617, - 3,45615,43201,45621, 3,45614,38709,45625,43197,45625,43643,45625, -35187,44242, 3,45632,44351,45635,35187,38305,37214,45639, 2,45641, -39019,45643,39021,45641,37286,45639,35890,45638,35891,45639,45651,45653, -35891,45638,35890,45639,45657,45659,38152,45638,38153,45639,45663,45665, -38296,45638,38297,45639,45669,45671,38153,45638,38152,45639,45675,45677, -38297,45638,38296,45639,45681,45683,37283,45639,42675,45639,37282,45639, -42674,45639,37899,45638,37885,45695,38293,45639,37885,45639,37899,45701, -44945,45639,38292,45639,44944,45639,37287,45639,38173,45638,38172,45639, -45713,45715,38303,45638,38302,45639,45719,45721,38173,45639,38172,45638, -45725,45727,38303,45639,38302,45638,45731,45733,45096,45639,45149,45639, - 7,45738,45367,45741,45097,45639,37241,45639, 2,45747, 2,45746, - 587,45746,42613,45639, 1369,45754,38271,45639, 1369,45758,44243,45639, - 2,45763, 2,45762, 587,45762, 136,45639, 137,45639, 1530,45638, - 842,45638, 669,45639, 1419,45639, 843,45639,39085,45783,45777,45783, - 1531,45639,45775,45789, 1530,45639, 843,45638, 842,45639,45795,45797, - 1531,45638,45793,45801, 1368,45639,45411,45805,40999,45805,45367,45805, -45585,45805,42613,45805,37845,45805,44243,45817, 586,45639,39847,45821, -39142,45821,39085,45821, 483,45826,37241,45821, 483,45821,39085,45832, - 586,45638,38675,45837,39823,45837,39783,45837,39749,45837, 483,45845, - 1418,45639, 668,45639, 587,45638,37885,45853,37202,45853,37145,45853, - 483,45858, 483,45853,37145,45862, 587,45639,37241,45866,44243,45866, - 9,45866, 483,45639, 587,45875,37145,45877, 1369,45639,35760,45880, -35761,45881,45883,45885,35760,45881,35761,45880,45889,45891,42613,45880, -38271,45880, 15,45880, 9,45639, 2,45900, 2,45901, 587,45900, - 265,45639, 375,45909, 15,45639, 1369,45912, 7,45639,40956,45917, -44060,45917,40957,45917,44061,45917,43502,45917,37844,45917,35187,45917, - 3,45930,43503,45930, 3,45931,45927,45937, 1369,45931,38305,45917, - 2,45942,45937,45945,37845,45942, 2,45943,45933,45951,45929,45951, - 587,45943,45149,45917,37145,45959,45227,45959,37845,45917,38305,45964, -43503,45917,35187,45968, 375,45917,45148,45917, 2,45917,40101,45977, -41017,45977,38305,45976,45937,45983,44904,45977,45569,45977,43375,45977, -39019,45977,44243,45977,37145,45994,37145,45977,44243,45998, 3,45917, -35187,46002,45951,46005,44243,46002, 3,45916,45943,46011, 7,46011, -38305,46015,45977,46017,45994,46011,45959,46011,45967,46011,45919,46011, -45949,46011,45925,46011,37241,46011,45977,46011,44243,46034,44243,46011, -45977,46038, 2,45916,45931,46043,40999,46043,45975,46043,45367,46043, -45585,46043,46009,46043,45971,46043,45921,46043,45935,46043,45923,46043, -45411,46043,42613,46043,46003,46043,44243,46069,37845,46043,44243,46073, -44243,45917, 3,46076,46043,46079, 3,46077,45977,46083, 6,45638, -45998,46087,46073,46087,45817,46087,37844,46087,46043,46095,45805,46095, -35187,46087, 3,46101,45977,46103, 3,46100,46043,46107,45805,46107, -37145,46087,45977,46112,45977,46087,37145,46116, 3,46087,35187,46120, -46043,46123,45805,46123,45917,46121,37145,46129,45917,46087,35187,46132, - 2,46135, 2,46134,38057,46132,38056,46132, 2,46133,46141,46145, - 3,46133,46139,46149,46143,46149, 2,46132,35187,46154,46149,46157, -46149,46155, 3,46132,46137,46163,46145,46163, 3,45639, 5,46169, - 6,46171, 4,46168, 0,46168, 5,46168, 1,46168,45983,46169, -45945,46169,43679,46169,45927,46169,40277,46169,45749,46169,45765,46169, -39315,46169,45905,46169,37241,46169,45977,46169,42613,46203,43848,46169, - 256,46169, 6,46169,46175,46211,46177,46211,37145,46211, 7,46169, -46179,46219,46181,46219,41019,46219,45639,46218, 2,46227,38305,46219, -46229,46231, 3,46231,46227,46235,45977,46231,43503,46218, 241,46218, -38271,46219, 7,46168,37241,46247,38057,46169,38305,46251,46211,46253, -43503,46169, 6,46256, 7,46256, 6,46257,46261,46263, 7,46257, -46259,46267, 241,46169, 7,46270, 2,45638,41472,46275,41217,46275, -46175,46275,46211,46280,46177,46275,46211,46284,46212,46275,46214,46275, -46221,46275,46223,46275,46173,46275,45930,46275,46043,46299,46045,46275, -46216,46275,46225,46275,41099,46275,46032,46275,45711,46275,46200,46275, -45745,46275,46248,46275,46245,46275,35187,46275,45917,46322,46043,46325, -45917,46323,46011,46329,45830,46275,29229,46275,45773,46275,36429,46275, -45895,46275,45897,46275,45687,46275,45693,46275,45705,46275,45707,46275, -45849,46275,45779,46275,42559,46275,45899,46275,45915,46275,45757,46275, -45761,46275,45941,46275,41417,46275,37145,46368,45821,46275,37241,46372, -46011,46275,37241,46376,46247,46275,37241,46380,45881,46275,42613,46385, -37241,46275,46011,46388,46169,46388,46247,46388,45821,46388,46211,46275, -46175,46398,46177,46398,37145,46398,37783,46275,44243,46407,45917,46275, -35187,46410,46043,46413,37214,46275,41019,46417,46218,46275,46179,46421, -46181,46421,41019,46421, 7,46275,41019,46429,37145,46431,46169,46429, -46175,46435,46177,46435,37145,46435,37145,46428,41019,46443,46169,46428, -46179,46447,46181,46447,41019,46447,37145,46275,41417,46454,46211,46454, - 7,46454,41019,46461,46169,46275,35187,46464, 6,46467, 6,46466, -38305,46465,46211,46473,38271,46464,44243,46465,38270,46464,37241,46464, - 6,46465,46477,46485, 7,46465,46471,46489,46481,46489, 6,46464, -46473,46495,35187,46494,46489,46499,46489,46495, 7,46464,46179,46505, -46181,46505,46469,46505,46485,46505,41019,46505, 2,45639,42671,46517, -39429,46517,44814,46517,44810,46517,44636,46517,37241,46516,40077,46517, -44243,46516,46003,46517,37241,46535, 9,46516,44243,46517,37617,46540, -37899,46540,35931,46540,35931,46517,44243,46548,37617,46517,44243,46552, -37899,46517,44243,46556, 7,46517,44243,46561, 7,46516,46107,46565, -46123,46565,46095,46565,40999,46565,45585,46565,45411,46565,45367,46565, -42613,46565,37845,46565,46087,46583,44243,46583,37845,46517,46211,46589, -41417,46589, 7,46589,41019,46595, 3,45638,45951,46599,45942,46599, -46011,46603,46013,46599,46066,46599,46540,46599,40305,46599,46529,46599, -45751,46599,46533,46599,45767,46599,46580,46599,46563,46599,45649,46599, -45737,46599,38305,46599,45917,46630,46011,46633,45917,46631,46043,46637, -45814,46599,45771,46599,45869,46599,45871,46599,45689,46599,45691,46599, -45699,46599,45709,46599,45851,46599,45781,46599,40275,46599,46539,46599, -45903,46599,45873,46599,45907,46599,45753,46599,45769,46599,45957,46599, -45805,46599,42613,46676,46043,46599,42613,46680,46565,46599,42613,46684, -45867,46599,37241,46689,42613,46599,46043,46692,46565,46692,45805,46692, -45917,46599,38305,46700,46011,46703,46560,46599,44243,46599,46517,46708, - 7,46599,38305,46713,46517,46715,46517,46712,41941,46599, 6,46721, - 7,46721, 6,46720,46725,46727, 7,46720,46723,46731, 1011,46599, - 7,46735,46517,46599,38305,46738,35187,46739, 6,46742, 6,46743, -44243,46738,38271,46739,38270,46739,37241,46739, 6,46739,35187,46756, -46741,46757, 7,46739,41019,46763,46747,46763, 6,46738,46763,46769, -46751,46769, 7,46738,46759,46775,46745,46775,46757,46775,46753,46775, - 6,45639, 7,45638,43214,46787,45977,46789,38305,46787, 3,46793, -46043,46795,46565,46795,45805,46795, 3,46792,45977,46803, 59,46787, - 1325,46787, 331,46787, 265,46787, 2,46787, 7,46814,46795,46817, - 3,46787,38305,46820,45977,46823,46785,46787,35187,46827, 2,46828, - 2,46829,38057,46827,38056,46827, 2,46827,35187,46838, 3,46827, -46833,46843, 2,46826,46843,46847,46835,46847, 3,46826,46841,46853, -46831,46853,46839,46853,46837,46853, 0, 6,13135,46863,13169,46864, - 4871,46863, 4893,46868,13172,46863, 4894,46863,13136,46863,13143,46877, - 4872,46863, 4879,46881,13145,46863, 4881,46863,37417,46863,38056,46888, -38057,46889,46891,46893,38057,46888,38056,46889,46897,46899,17176,46863, -17380,46863,16950,46863,17058,46863,16948,46863,17056,46863,16974,46863, -17072,46863,16996,46863,17086,46863, 3348,46863,18291,46863, 7316,46863, - 8455,46863, 8343,46863, 8353,46863,13139,46863,13175,46863,13155,46863, -13517,46863,15197,46863,15485,46863,15512,46863,15595,46863,15203,46863, - 5757,46863, 5453,46863, 5471,46863, 5455,46863, 4863,46959, 5507,46863, -12569,46863,12387,46863,12551,46966,12552,46863,16995,46863,16941,46863, -16977,46974,16978,46863,17017,46862,17016,46862,19836,46863,19857,46985, -19815,46863, 4,46988,19857,46991, 4,46989,19843,46995,27930,46863, -27895,46999,27857,46863, 4,47002,27895,47005, 4,47003,27907,47009, -36303,46862,36325,47013,27128,46863, 9136,46863,27266,46863,27163,46863, -34310,46863,34447,47025,46516,46863,46599,47029,33454,46863,33368,46863, -28027,46863,28111,46863,28117,46863,26928,46863,24253,46863,30569,46863, -30316,46863,28213,46863,26525,46863, 9137,46863, 273,46863, 1477,46863, - 281,46863,17011,46863, 5043,46863,15503,46863, 8997,47066,24558,46863, -26575,46863,41877,46863, 120,46863, 77,46863,16977,46863,16941,47080, - 9262,46863,14813,46863,26605,46863,41923,46863, 8843,46863,37131,46863, -41907,46863,26591,46863,41893,46863,37113,46863,20255,46863, 9288,46863, - 8697,46863, 9275,46863, 8784,46863,19877,46863,41867,46863,20043,46863, -21376,46863,21485,46863,19787,46863,19391,46863,19299,46863,19271,46863, -19283,46863,17010,46863, 5042,46863,36518,46863,40664,46863,17017,46863, -46983,47143, 1516,46863, 948,46863,17016,46863,46981,47151,16972,46863, - 903,47154,17070,46863, 1011,47158,17175,46863, 903,47162,17379,46863, - 1011,47166, 4213,46863, 375,47170, 8757,46863, 375,47174, 4266,46863, -16865,46863,16873,46863,16867,46863,12642,46863, 8896,46863,14740,46863, - 8355,46863, 264,47193, 265,47192,47195,47197, 264,47192, 265,47193, -47201,47203,14515,46863,14517,46863,14519,46863,20201,46863,36979,46863, -20152,46863,36898,46863,20239,46863,37095,46863,21522,46863,38266,46863, -17082,46863, 903,47228,16990,46863,16943,47233, 1011,47232,35780,46863, -29644,46863,43412,46863,15628,46863, 9044,46863, 264,47247, 265,47246, -47249,47251, 264,47246, 265,47247,47255,47257,12484,46863,12486,46863, -12488,46863,12551,46863,12387,47266,12547,46863,12633,46863,12507,46863, -12497,46863,12501,46863,13381,46863,13169,46863,13135,47282, 4893,46863, - 4871,47286,12563,46863,27255,46863, 483,47292, 9287,46863, 483,47296, -13119,46863, 264,47300,13143,47303, 264,47301,13169,47307, 4863,46863, - 264,47310, 4879,47313, 264,47311, 4893,47317, 7315,46863, 413,47320, - 264,47320, 264,47321, 265,47320,47327,47329, 265,47321,47325,47333, -14653,46863, 375,47336,16875,46863,12504,46863,19478,46863,35766,46863, -20044,46863,36534,46863,12566,46863,12391,47353,33338,46863,34447,47357, -45866,46863,46599,47361,25545,46863,40675,46863, 1413,46863, 922,46863, - 1281,46863, 247,46863,36303,46863,38299,47377,37897,47377,36335,47377, -35893,47377,20035,46863, 11,47387, 11,47386,36527,46863, 587,47392, -24545,46863, 483,47396,35761,46863, 903,47400,19475,46863, 1011,47404, - 1086,46863, 934,46863, 1216,46863,17049,47412,16937,47412, 9766,46863, - 5519,46863, 8389,46863, 8861,46863, 3345,47424,12377,47424, 8337,46863, - 375,47430, 8374,46863, 8365,46863,20169,46863,36921,46863, 8453,46863, - 4863,47443,13119,47443, 9072,46863, 9105,46863, 305,46863,12377,47452, - 9731,46863, 483,47456, 8997,46863,15503,47460, 265,47460, 265,47461, - 257,47460, 264,47469, 265,47468,47471,47473, 264,47468, 265,47469, -47477,47479, 375,47460,15029,46863,12377,47484, 375,46863,27021,47488, -30091,47488, 9195,47488, 8757,47488, 4213,47488,14653,47488,20103,47488, -36773,47488, 8337,47488, 8997,47488, 241,47488, 6578,46863, 394,46863, - 828,46863, 128,46863, 299,46863, 705,46863, 101,46863,28715,46863, -21315,47526, 165,46863, 903,47530,43215,46863,38057,47534, 1505,46863, - 1011,47538,30091,46863, 375,47542, 113,46863, 25,47546, 9,47546, - 803,46863, 483,47552, 518,46863, 504,46863, 508,46863, 645,46863, - 623,46863, 659,46863, 510,46863, 241,47568, 506,46863, 9,47572, - 244,46863, 483,47576, 265,46863, 8997,47580, 5041,47580,17009,47580, - 8861,47581, 241,46863, 265,47591, 6515,47590, 375,47590, 510,47590, - 483,47590, 9,47600, 9,47590, 483,47604, 1011,46863,16990,47608, -17070,47608,17379,47608,40617,47608,16937,47608, 903,47618, 1505,47608, -17049,47608, 903,47624,21315,47608,19475,47608, 587,47608, 903,47608, -16937,47634,17049,47634, 903,46863,16937,47641,16977,47643,17082,47640, -16972,47640,17175,47640,32805,47640,36349,47640,17049,47640, 1011,47656, - 165,47640,16937,47640,16943,47663, 1011,47662,38057,47640,35761,47640, - 483,47640, 11,47640, 1011,47640,17049,47676,16937,47676,10527,47640, - 4727,47640, 6515,47640, 6564,46863, 6685,46863,35187,47690, 11,47691, - 6515,46863, 241,47696, 903,47696, 587,47697,10761,46863,10592,46863, - 4738,46863,13857,46863, 483,47710,10527,46863, 903,47714, 9,47714, - 3345,46863, 413,47720, 8861,47720, 1369,47721, 341,47721, 3747,46863, - 1369,47731, 3689,46863, 1369,47735,17000,46863,17090,46863, 2691,46863, - 2777,46863, 2793,46863, 2831,46863, 6486,46863, 4415,46863,10493,46863, -13941,46863,10901,46863, 4727,46863, 903,47760, 9,47760, 4819,46863, - 483,47766, 6703,46863, 6623,46863, 5759,46863, 7823,46863, 7813,46863, - 7761,46863, 7705,46863, 7735,46863, 7727,46863,13904,46863,10600,46863, - 4742,46863, 4822,46863, 2875,46863, 2865,46863, 2961,46863, 2949,46863, - 2919,46863, 3645,46863, 3609,46863, 3467,46863,17102,46863,17104,46863, - 1369,47815, 5041,46863, 265,47819, 265,47818, 4919,46863, 483,47824, -17100,46863,17009,46863, 265,47831, 265,47830,17099,46863, 483,47836, - 4920,46863, 6441,46863, 483,47842,17123,46863, 3353,46863, 3691,46863, -10154,46863, 3777,46863, 2847,46863, 2881,46863, 2933,46863, 2929,46863, - 2967,46863, 5271,46863, 4923,46863, 3355,46863, 3031,46863, 3121,46863, -20819,46863,37537,46863,20952,46863,37748,46863,20885,46863, 483,47884, -37663,46863, 9,47888,11529,46863, 1010,46862,23717,47895,24522,47895, -24447,47895,23939,47900,23939,47895,24447,47904,22956,47895,23651,47909, -21605,47895, 17,47913,23939,47915, 17,47912,23651,47919, 17,47895, -21605,47923,24447,47925,21605,47922,23651,47929, 264,46862,47135,47933, -47823,47933,47835,47933,47137,47933,47587,47933,47585,47933,47465,47933, -47583,47933,47019,47933,47581,47933,17009,47953, 5041,47953, 8997,47953, - 265,46862,47063,47961,47065,47961,47055,47961, 8997,47961, 5041,47961, -17009,47961, 8495,47961, 241,47961, 241,46862, 240,46863, 265,47981, - 1,47982, 0,47982, 5521,47983, 5520,47982,47989,47991, 5520,47983, - 5521,47982,47995,47997, 0,47983,47985,48001, 1,47983,47987,48005, - 264,46863,15193,48009,15475,48009,15579,48009,13119,48008,13143,48017, - 4863,48008, 4879,48021,47972,48009,47970,48009,47821,48009,47833,48009, -13507,48009,47968,48009,47467,48009, 53,48009, 1471,48009, 8997,48009, -47961,48042, 253,48009,17009,48009,47961,48048, 5041,48009,47961,48052, -15437,48009, 8997,48057,20501,48009,47961,48009,17009,48062, 5041,48062, - 8997,48062,20219,48009,37019,48009,19513,48009,35843,48009,20697,48009, -37377,48009,13119,48009,13135,48083, 4863,48009, 4871,48087,18967,48009, - 483,48091, 1369,48009, 9875,48009, 8401,48009, 9955,48009,10273,48009, - 4137,48009, 3863,48009, 4063,48009, 241,48009, 413,46863, 3345,48112, - 7315,48112,17049,48112,16937,48112,12377,46863, 8861,48122,15029,48122, - 305,48122, 713,48122, 25,48122, 587,48123,12387,48135, 11,48123, - 257,48123, 253,48123, 1471,48123, 53,48123, 1369,48123, 257,48122, - 587,48122,12391,48153, 257,46863, 9136,48156, 9137,48156, 264,48157, -48159,48163,17827,48156,48163,48167, 413,48156, 1,48170, 264,48156, - 8997,48175, 241,48175, 1,48179, 265,48157, 8997,48183,48175,48184, - 4425,48183,48161,48183,48176,48183,48175,48183, 8997,48194, 5579,48183, -17873,48183, 1791,48183,48173,48183,48181,48183, 265,48156, 8997,48208, -48163,48211,48163,48209, 8997,48215, 8997,48156, 265,48218,48163,48221, - 265,48219,48175,48225,12377,48156,36925,46863,20177,46863, 8383,46863, - 8385,46863, 88,46863, 11,48239,37409,48239, 566,46863,27021,48245, - 9195,48245,20501,48245, 9377,48245, 9875,48245, 587,48245,20763,48245, - 653,46863, 11,48261, 289,46863, 587,48265,36349,46863, 903,48268, -40617,46863, 1011,48272, 66,46863, 33,48277,20217,46863,37017,46863, -37845,46863,38057,46863, 903,48286,43215,48286, 155,48286,21315,46863, - 483,48294, 1011,48294,28715,48294, 1347,48294, 1347,46863,21315,48304, - 155,46863,38057,48308,21378,46863,38134,46863,20103,46863, 375,48316, -36773,46863, 375,48320, 713,46863,12377,48324, 25,46863, 113,48328, -12377,48328,26625,46863, 483,48334,10107,46863,38056,48338,38056,48339, -38057,48338,48343,48345,38057,48339,48341,48349, 3,48339, 3,48338, - 9195,46863, 375,48356,27021,46863, 375,48360, 19,46863, 59,48365, -32805,46863, 4,48368,34447,48371, 903,48368, 9,48368, 4,48369, -33871,48379, 11,48368,34447,48383,45639,46863, 2,48386,46599,48389, - 2,48387,46169,48393, 587,48386,46599,48397,36256,46863,35187,46863, - 6685,48402, 9,48402, 483,46863,27255,48408,26625,48408,24545,48408, - 9287,48408,21315,48408, 903,48408, 9731,48408,13857,48408, 803,48408, - 244,48408,17049,48408, 6441,48408, 4819,48408,17099,48408, 4919,48408, - 9,48408, 241,48440, 241,48408, 9,48444,20885,48408, 5,48408, -27021,48451, 9195,48451,20501,48451, 9377,48451, 9875,48451, 587,48451, -20763,48451, 9,46863,32805,48466,10527,48466, 113,48466, 506,48466, -16937,48466, 4727,48466, 483,48466, 241,48480, 241,48466, 483,48484, -37663,48466, 265,48467, 11,48491, 3,48466, 11,48495,37409,48495, -35187,48466,19917,46863,18967,48503, 5,48504, 5,48505,21036,48503, -21037,48503, 4,48503,48509,48515, 5,48503,18967,48518, 4,48502, -48521,48523,48507,48523,48511,48523, 5,48502,48513,48531, 587,46863, -12377,48535,12551,48537,45639,48535,46275,48541,12377,48534,12391,48545, -36527,48534,45639,48534,46599,48551, 265,48535,17827,48555, 1011,48534, - 11,46863,32805,48561,34003,48563,20035,48560,32805,48560,34447,48569, - 903,48560, 1275,48561, 9,48575, 3,48560, 33,48579, 3,48561, - 113,48583,16937,46863, 1216,48586, 413,48586,21036,48586,21037,48586, -21036,48587,48595,48597,21037,48587,48593,48601, 903,48587,16941,48605, - 1011,48586, 903,48608, 903,48586,16943,48613, 1011,48612, 9,48586, -17049,46863, 1216,48620, 413,48620, 903,48620, 1011,48626, 1011,48620, - 903,48630, 483,48620, 2,48620, 3,48620, 1369,48639, 2,48621, - 3,48621, 483,48645, 2,46862, 6,48649, 4,48651, 5,48649, - 9,48655,21604,48657,21604,48656,21605,48657,48661,48663,21605,48656, -48659,48667, 5,48648,23717,48671,24522,48671,24447,48671,23939,48676, -23939,48671,24447,48680,22956,48671,23651,48685, 17,48671,21605,48689, -24447,48691,21605,48688,23651,48695,21605,48671, 17,48699,23939,48701, - 17,48698,23651,48705, 19,48649, 12,48649, 9,48649, 11,48712, - 11,48649, 9,48716,21605,48649,48652,48720,48653,48721,48723,48725, -48653,48720,48652,48721,48729,48731, 3,46862, 5,48735, 4,46862, -19975,48739,19365,48739,19221,48739,19917,48739,10107,48747, 587,48739, - 5,46862,25451,48753,42283,48753,19739,48753, 0,48753, 3,48761, -25380,48753, 7971,48765,42155,48765, 164,48753,48353,48771,20763,48753, - 1011,48775, 1010,48774,48777,48779, 1010,48775, 1011,48774,48783,48785, - 2,48753, 17,48788,48353,48791, 2,48752,23717,48795,24522,48795, -23939,48795,24447,48800,24447,48795,23939,48804,22956,48795,23651,48809, -21605,48795, 17,48813,23939,48815, 17,48812,23651,48819, 17,48795, -21605,48823,24447,48825,21605,48822,23651,48829, 1369,48753,21605,48832, - 7971,48835,42155,48835,21605,48753, 1369,48840,42155,48843, 7971,48843, - 17,48753,37844,48848,48762,48848,48763,48849,48853,48855,37844,48849, -48763,48848,48762,48849,48861,48863,37845,48848,48859,48867,37845,48849, -48851,48871, 2,48849,48355,48875,47853,48875, 2,48848,48353,48881, - 5,46863, 374,48884, 374,48885, 375,48884,48889,48891,19381,48885, -19380,48884,48895,48897,19381,48884,19380,48885,48901,48903,20812,48884, -20813,48884,20812,48885,48909,48911, 1197,48885,21604,48915,21604,48914, -21605,48915,48919,48921,21605,48914,48917,48925, 375,48885,48887,48929, -20813,48885,48907,48933,20501,48885, 1011,48937,27021,48885, 483,48941, - 9195,48885, 483,48945, 9377,48885, 483,48949, 9875,48885, 1011,48953, - 587,48885, 483,48957, 1369,48885, 1011,48961,38057,48961,20763,48885, - 483,48967, 903,48885, 375,48971, 483,48884,27021,48975, 9195,48975, -20501,48975, 9377,48975, 9875,48975, 587,48975,20763,48975,18967,48885, - 483,48991, 165,48991, 2,48884,48961,48997, 3,48884,13118,49000, - 4862,49000,13118,49001,13119,49000,49007,49009, 4863,49000, 4862,49001, -49013,49015,15193,49001,15475,49001,15579,49001,13507,49001,20501,49001, - 253,49001,15437,49001, 8997,49031,20219,49001,37019,49001,19513,49001, -35843,49001,20697,49001,37377,49001,13119,49001,49003,49047, 4863,49001, -49005,49051, 241,49001, 9875,49001, 53,49001, 1471,49001, 8401,49001, - 9955,49001,10273,49001, 4137,49001, 3863,49001, 4063,49001, 1369,49001, -18967,49001, 483,49077, 2,48885, 1,49081, 7,49082,49000,49084, -49001,49085,49087,49089,49000,49085,49001,49084,49093,49095, 7,49081, - 1,49098,49000,49100,49001,49101,49103,49105,49000,49101,49001,49100, -49109,49111, 1,49080, 7,49115, 7,49080,49001,49119, 0,49080, -49083,49123, 7,49125,49001,49127, 0,49081,49116,49131,49001,49133, - 7,49131,49115,49136,49001,49139,49001,49137,49115,49143,49115,49131, - 7,49146,49001,49149,49001,49081, 3,48885,37357,49155, 165,49155, -10257,49155, 483,49155,35187,48885, 375,49165, 9,48885, 1,49168, - 3,49171,46863,49172,46863,49171, 3,49176, 3,49177,37845,49169, -37845,49168,37844,49168,49183,49187,37844,49169,49185,49191, 2,49168, -49175,49195,49179,49195, 2,49169,49181,49201, 3,46863,49171,49204, -49195,49207, 6,49205, 11,49211, 0,49205, 0,49204,40704,49217, -38305,49217, 9,49220, 9,49217,38305,49224, 6,49204,40705,49229, -49217,49231,49219,49229,18967,49229, 4,49236, 5,49236, 5,49237, - 4,49237,46863,49244,49241,49247,46863,49237, 4,49250,49241,49253, - 4,49251,49243,49257,49227,49229, 17,49229,49223,49229,37325,49205, - 903,49267,10107,49204,48875,49271,10219,49205, 903,49275,17049,49204, - 1369,49279, 11,49205, 25,49283, 9,49283, 17,49205, 903,49289, -21315,49289,37409,49205, 9,49295, 1011,49205, 375,49299, 9,49204, - 11,49303,37409,49303, 11,49204, 33,49309,35187,49205, 1505,49313, - 4,49204,49289,49317, 5,49204,13118,49320, 4862,49320,13118,49321, -13119,49320,49327,49329, 4863,49320, 4862,49321,49333,49335,15193,49321, -15475,49321,15579,49321,13507,49321,20501,49321, 253,49321,15437,49321, - 8997,49351,37019,49321,20219,49321,35843,49321,19513,49321,37377,49321, -20697,49321,13119,49321,49323,49367, 4863,49321,49325,49371, 241,49321, - 9875,49321, 1471,49321, 53,49321, 8401,49321,10273,49321, 9955,49321, - 4137,49321, 4063,49321, 3863,49321, 1369,49321,18967,49321, 483,49397, - 4,49205, 1,49401, 7,49402,49320,49404,49321,49405,49407,49409, -49320,49405,49321,49404,49413,49415, 7,49401, 1,49418,49320,49420, -49321,49421,49423,49425,49320,49421,49321,49420,49429,49431, 1,49400, - 7,49435, 7,49400,49321,49439, 0,49400,49403,49443, 7,49445, -49321,49447, 0,49401,49436,49451,49321,49453, 7,49451,49435,49456, -49321,49459,49321,49457,49435,49463,49435,49451, 7,49466,49321,49469, -49321,49401, 5,49205,20645,49475, 1505,49475, 9935,49475,18967,49205, - 7,49483, 4,49484, 4,49485, 16,49483, 17,49483, 4,49482, -49493,49495, 5,49482,49487,49499,49491,49499, 4,49483, 7,49504, -49499,49507, 5,49483,49489,49511, 2,46863, 6,49515, 17,49517, -35187,49519, 0,49515,38305,49523, 15,49525, 0,49514,36545,49529, -49521,49529, 15,49529, 6,49514,49531,49537,36544,49537,49529,49541, -49527,49537, 11,49537,35187,49546,49529,49549,35187,49537, 11,49552, -49529,49555,45639,49514,46599,49559,45639,49515,46275,49563,17125,49515, - 16,49567, 16,49566, 17,49567,49571,49573, 17,49566,49569,49577, -17049,49514, 4,49514, 7,49583, 1,49585, 265,49583, 1,49588, - 0,49588,49587,49589,49586,49588,49595,49597,49587,49588,49586,49589, -49601,49603, 0,49589,49591,49607, 1,49589,49593,49611, 4,49515, - 1011,49615, 1,49617, 0,49617, 1,49616,49621,49623, 0,49616, -49619,49627, 4,46863,27857,49630,27895,49633,19815,49630,19857,49637, -49237,49631,49239,49641,49237,49630,49241,49645,32805,49630,34447,49649, -32805,49631,34003,49653,27857,49631,27879,49657,19815,49631,19849,49661, - 2,49630, 7,49665, 1,49667, 265,49665, 1,49670, 0,49670, -49669,49671,49668,49670,49677,49679,49669,49670,49668,49671,49683,49685, - 0,49671,49673,49689, 1,49671,49675,49693, 2,49631, 903,49697, - 1,49699, 0,49699, 1,49698,49703,49705, 0,49698,49701,49709, - 1, 7, 377,49713,48110,49712,48111,49712,49152,49712,49472,49712, -49153,49712,49473,49712,49374,49712,49054,49712,49375,49712,49055,49712, - 704,49712, 100,49712,26502,49712,41376,49712, 8808,49712,47622,49713, -47660,49713,47146,49713,47148,49713,49059,49713,49379,49713,49158,49713, -49478,49713,49061,49713,49381,49713,48998,49713,49318,49713,47224,49713, -47226,49713,48041,49713,48039,49713,47058,49713,47060,49713,47220,49713, -47222,49713,48047,49713,47056,49713,47442,49713,49349,49713,49029,49713, -49121,49713,49441,49713,47628,49713,47668,49713,48962,49713,49290,49713, -22798,49713,39074,49713,31498,49713,44616,49713,31392,49713,44494,49713, -47540,49713,47532,49713,31794,49713,44858,49713,48298,49713,48288,49713, -31924,49713,44994,49713, 8652,49713, 8535,49713,13252,49713,43989,49712, -41417,49843,30655,49712,26219,49847,26503,49712,41377,49712, 8809,49712, -26547,49712,26219,49857,41835,49712,41417,49861, 273,49712,12897,49865, - 8813,49712, 8647,49869, 376,49713, 705,49712, 101,49712, 803,49712, - 483,49879,30091,49712,26219,49883, 113,49712, 9,49887,43503,49712, -41417,49891,43215,49712, 483,49895,43214,49712, 112,49712, 802,49712, -49320,49712,49401,49905, 241,49905,49000,49712,49081,49911, 241,49911, -49081,49712,49001,49916,49001,49917,49911,49921,49401,49712,49321,49924, -49321,49925,49905,49929,49001,49712,49081,49932, 241,49932,49321,49712, -49401,49938, 241,49938, 414,49713,18391,49945, 420,49713,18391,49949, - 449,49713,18391,49953, 8808,49713,49855,49957, 8453,49713,46863,49960, -20239,49713,46863,49964,37095,49713,46863,49968,47976,49713,47593,49713, -26502,49713,49851,49977,31921,49713,47592,49713, 8495,49983, 828,49713, -49903,49987, 128,49713,49901,49991, 705,49713,49737,49995, 101,49713, -49739,49999,47977,49713, 8495,50003,47488,49713,48122,49713,48480,49713, -48440,49713,47568,49713, 1344,49713, 1482,49713, 64,49713, 1484,49713, - 336,49713, 1480,49713, 254,49713, 1342,49713, 338,49713, 1123,49713, - 931,49713, 665,49713, 1417,49713, 1429,49713, 1301,49713, 1127,49713, - 941,49713, 523,49713, 1283,49713, 939,49713, 1103,49713, 171,49713, - 1525,49713, 407,49713, 1517,49713, 949,49713, 280,49713, 1476,49713, - 272,49713, 1017,49713, 1077,49713, 1047,49713, 1113,49713, 1245,49713, - 1237,49713, 501,49713, 433,49713, 929,49713, 591,49713, 915,49713, - 681,49713, 1555,49713, 911,49713, 1545,49713, 855,49713,41376,49713, -49853,50107, 4900,49713,14622,49713,48113,49713, 8997,50115, 1382,49713, - 695,49713,48286,49713, 903,50122,48294,49713, 1011,50126,26503,49713, -49741,50131,47530,49713, 903,50134,47538,49713, 1011,50138,49289,49713, -49317,50142, 903,50142,48961,49713,48997,50148, 1011,50148,21522,49713, -46863,50154,38266,49713,46863,50158, 394,49713, 299,49713,31792,49713, - 903,50166,44856,49713, 1011,50170,22789,49713, 903,50174,39065,49713, - 1011,50178, 1386,49713, 545,49713,41377,49713,49743,50187, 413,49712, - 8647,50191,18062,50191,17993,50191, 251,50196, 251,50191,17993,50200, -46863,50191, 412,49712,48008,49713,50207,50209,49717,50209, 341,50209, -40381,49713, 17,50217, 913,49713, 483,50221, 289,49713, 8809,49713, -49745,50227,49000,49713,49935,50231,49919,50231,49721,50231,49731,50231, -49937,50231,49933,50231,49081,50243, 241,50243,49320,49713,49941,50249, -49927,50249,49723,50249,49729,50249,49943,50249,49939,50249,49401,50261, - 241,50261, 1374,49713, 8672,49713,12534,49713,12921,49713, 264,50273, - 265,50272,50275,50277, 264,50272, 265,50273,50281,50283, 8605,49713, -26097,49713,41299,49713,26277,49713,41479,49713,26104,49713,41314,49713, - 1477,49713,46863,50300, 281,49713,46863,50304, 1516,49713,46863,50308, - 948,49713,46863,50312,44988,49713, 903,50316,31920,49713, 1011,50320, -43293,49713,49895,50325,15156,49713, 264,50329, 265,50328,50331,50333, - 264,50328, 265,50329,50337,50339, 8916,49713,14623,49713, 8495,50345, - 4901,49713, 8495,50349,14611,49713, 241,50352, 4899,49713, 241,50356, -15219,49713, 412,50360, 413,50361,50363,50365, 412,50361, 413,50360, -50369,50371, 5119,49713, 412,50374, 413,50375,50377,50379, 412,50375, - 413,50374,50383,50385,13177,49713, 413,50388, 264,50388, 264,50389, - 265,50388,50395,50397, 265,50389,50393,50401, 5313,49713,12377,50404, -47591,49713, 265,50409, 8861,50411, 265,50408, 8495,50415,47641,49713, -43292,49713,49899,50421,15158,49713,39228,49713,23012,49713,40676,49713, -25546,49713, 500,49713,18391,50435, 432,49713,18391,50439, 1244,49713, -18617,50443, 1236,49713,18617,50447, 1109,49713, 903,50451, 1412,49713, - 305,50455,44832,49713,31770,49713,25545,49713, 9,50462,40675,49713, - 483,50466, 935,49713, 483,50471, 1087,49713, 9,50475, 1413,49713, - 295,49713, 1290,49713, 903,50483, 1304,49713, 9,50487,48009,49713, -50191,50491,49719,50491, 241,50491,22957,49713, 903,50498,39205,49713, - 1011,50502,47608,49713, 1505,50506,21315,50506,47640,49713, 165,50512, -38057,50512, 510,49713,46863,50518, 922,49713, 1108,49713, 1280,49713, - 9,50527, 246,49713, 483,50531, 412,49713,47460,50535, 483,50535, - 9,50535, 8997,50535,46863,50542,46863,50535, 8997,50546, 1216,49713, -44243,50550,31103,50550, 483,50550,18617,50557, 9,50550,18617,50561, - 8677,49713, 305,49713, 241,50567,16163,50567, 8647,50566, 8495,49713, - 257,50574, 1141,49713,16531,50579, 253,49713, 59,50582, 1325,50582, - 331,50582, 265,50582, 8634,49713, 8611,49713,41349,49713,26127,49713, - 273,49713,12705,50601,13673,50601,18391,50601, 2923,50601,46863,50600, - 331,49713, 53,50612, 1471,50612, 253,50612, 1369,50612, 8861,49713, - 241,50623, 375,50625, 375,50622, 251,49713, 413,50631,17993,50633, - 413,50630,18391,50637,15029,50630, 264,50641, 265,50640,50643,50645, - 264,50640, 265,50641,50649,50651,39204,49713, 257,49713, 265,50657, -26625,50657,25793,50657,41019,50657, 8495,50657, 9731,50657,25793,50656, -41019,50656, 8495,50656, 265,50656, 4863,50677,12377,49713,46863,50680, - 5313,50680, 341,49713, 241,50687, 298,49713, 4863,50691, 704,49713, -49875,50695, 9195,50695, 100,49713,49877,50701, 395,49713, 829,49713, -49879,50707, 9195,50707, 129,49713,49887,50713, 89,49713,48884,50716, -48884,50717,48885,50717,50719,50723,48885,50716,50721,50727, 11,50716, - 567,49713,42155,50733,41941,50733, 7971,50733, 9565,50733, 587,50733, - 9377,50743, 587,50732, 9195,50747,38057,49713,47640,50750,46863,50750, - 903,50754, 903,50750,46863,50758,21315,49713,47608,50762,46863,50762, - 1011,50766, 1011,50762,46863,50770, 628,49713, 1396,49713, 241,50777, - 288,49713, 7971,50781, 265,49713,23584,50785,39564,50785,24355,50785, -39905,50785, 5520,50785, 256,50784,50795,50797, 5521,50785, 256,50785, -50204,50785, 10,50784, 1,50785, 257,50808,50797,50811, 257,50809, -50803,50815, 10,50785,50191,50785,46863,50820,47590,50784,23493,50785, -22807,50826,39489,50785,39085,50830,22807,50785,23493,50834,39085,50785, -39489,50838, 1087,50785, 935,50785,47591,50784, 8495,50847,47590,50785, -50847,50851, 4213,50785, 8757,50785,26415,50785,41653,50785,27377,50785, - 9335,50785,42471,50785, 8109,50785, 4147,50785, 3933,50785, 53,50784, - 1471,50784, 253,50784,47591,50785,50825,50881, 257,50785, 1,50884, -50797,50887,50797,50885, 4827,50885, 305,50785, 8861,50895, 8495,50785, - 331,50899,46863,50785,50191,50902, 241,50902, 241,50785,46863,50908, - 8337,50909,46863,50913, 1369,50784, 305,50917, 11,50785,50807,50921, - 8165,50921, 1369,50921, 241,50784,47460,50929, 483,50929, 9,50929, - 8997,50929,46863,50936,46863,50929, 8997,50940, 257,50784,50801,50945, -50803,50945, 4863,50945, 11,50784,50819,50953, 7971,50953, 1011,49713, -31920,50958,48294,50958,44856,50958,47538,50958,48961,50958,39065,50958, -21315,50958,46863,50972,31103,50958, 903,50976, 1505,50958,46863,50980, -44243,50958, 903,50984,39205,50958, 9,50958, 903,50958,31103,50992, -44243,50992,46863,50958,21315,50998, 1505,50998, 903,49713,44988,51004, -48286,51004,31792,51004,47530,51004,49289,51004,22789,51004,38057,51004, -46863,51018,44243,51004, 1011,51022, 165,51004,46863,51026,31103,51004, - 1011,51030,22957,51004, 483,51004, 1011,51004,44243,51038,31103,51038, -46863,51004,38057,51044, 165,51044, 241,49713,47961,51050, 4899,51050, -14611,51050, 375,51050,12377,51051, 375,51061, 8997,51051, 375,51065, - 265,51065,46863,51069, 1275,51050, 9,51073, 15,51050, 483,51077, - 265,51050,47460,51081, 483,51081, 9,51081, 8997,51081,46863,51088, -46863,51081, 8997,51092, 8647,49713, 413,51096, 305,51097, 11,51097, - 1369,51097, 341,51097, 305,51096,41417,49713, 11,51111, 1369,51111, -26219,49713, 11,51117, 1369,51117,32102,49713,27021,51123,45148,49713, - 11,51127, 1369,51127,31857,49713,44925,49713,32294,49713,45314,49713, -17565,49713,32103,49713, 241,51143, 587,51142,45149,49713, 11,51148, -49317,49713,49289,51152,48997,49713,48961,51156,49001,49713,49912,51161, -49725,51161,49914,51161,49735,51161,49081,51161,49911,51170,49911,51161, -49081,51174, 241,51174, 241,51161,49911,51180,49321,49713,49906,51185, -49727,51185,49908,51185,49733,51185,49401,51185,49905,51194,49905,51185, -49401,51198, 241,51198, 241,51185,49905,51204,49475,49713, 1505,51208, -49155,49713, 165,51212, 240,49712,51059,51217,50163,51217,50165,51217, -51051,51217, 375,51225, 264,49712,49715,51229,50838,51229,50834,51229, -50850,51229,50847,51229,50945,51229,49983,51229,50415,51229,50677,51229, -50691,51229,50496,51229,50003,51229,50906,51229,50910,51229,50345,51229, -50349,51229, 8374,51229, 8389,51229,50705,51229,20152,51229,36898,51229, -20201,51229,36979,51229,50902,51229, 241,51276,50908,51229,46863,51280, -50491,51229, 241,51284,47590,51229,50785,51288,22807,51229,50785,51292, -39085,51229,50785,51296,26219,51229,41417,51229,14524,51229,35690,51229, -50733,51229,37519,51229,50781,51229,50953,51229,50455,51229,50917,51229, -19396,51229, 8647,51229,20103,51229, 375,51324,36773,51229, 375,51328, - 8337,51229, 375,51332,50785,51229,39085,51336,22807,51336,47590,51336, -46863,51336, 241,51344, 241,51336,46863,51348,47488,51229,47961,51229, - 9,51229,18967,51356, 483,51229,35187,51229, 375,51362,18967,51229, - 9,51366,46863,51229,50908,51370,50785,51370, 241,51374, 241,51370, -50785,51378, 375,51370, 241,51229,50491,51384,50902,51384,50785,51384, -46863,51390,46863,51384,50785,51394, 375,51229, 8337,51398,20103,51398, -36773,51398,14315,51398,35187,51398,46863,51398,14315,51229, 375,51412, - 4899,51229,14611,51229, 1010,49712, 3867,51421, 8277,51421, 4067,51421, - 3997,51421, 8953,51421, 9459,51421, 902,49712,50321,51435,51031,51435, -24265,51435,28233,51435,29077,51435,51005,51435,31103,51447,19559,51435, - 4283,51435, 9673,51435, 4279,51435, 3807,51435,20361,51435,20713,51435, - 9967,51435, 8251,51435,47961,49713, 241,51468,47979,49713, 412,51472, - 413,51473,51475,51477, 412,51473, 413,51472,51481,51483, 240,49713, - 340,51487,51398,51487,51418,51487,51416,51487,51354,51487,47974,51487, -47589,51487, 8590,51487,12537,51487,14620,51487, 375,51487,51229,51508, - 7,51487, 265,51512, 265,51513,51229,51517,47580,51487, 8861,51521, -47961,51487,51229,51524, 8495,51524,51229,51487, 375,51530,14611,51530, - 4899,51530,47961,51530, 8495,51487, 4899,51540,47961,51540,14611,51540, -14611,51487,51229,51548, 8495,51548, 4899,51487,51229,51554, 8495,51554, -46863,51487, 265,51560, 8861,51563, 265,51561, 8495,51567,51229,51567, - 265,51487, 7,51572,15309,51573,15308,51572,51577,51579,15308,51573, -15309,51572,51583,51585,46863,51572, 8861,51589, 902,49713,31103,51593, -43053,51593,46863,51593, 1010,49713, 1505,51601, 918,51601, 9,51601, - 903,51606, 903,51601, 9,51610, 265,49712,49873,51615,50165,51615, -51059,51615,51057,51615,51055,51615,51053,51615,49975,51615,49973,51615, -50113,51615,50111,51615,50163,51615,51471,51615,50355,51615,50359,51615, -50209,51615, 241,51645, 8948,51615,50225,51615,50479,51615, 331,51615, - 8861,51654, 8861,51615, 331,51658, 4827,51615,15269,51615,51051,51615, - 375,51667,14611,51667, 4899,51667,47961,51667, 241,51614,50209,51677, - 241,49712,18300,51681, 8605,51681, 8916,51681,50945,51681,49321,51680, -50249,51691,49001,51680,50231,51695,50705,51681, 8374,51681,51508,51681, -50691,51681,47443,51681, 8389,51681,50677,51681,51517,51681, 8861,51681, - 375,51714,26219,51681,41417,51681, 305,51681,48009,51681,51229,51725, - 8647,51681, 8452,51681,46863,51731, 713,51681, 25,51681,18257,51681, - 375,51738, 8337,51681, 375,51742, 265,51742,46863,51747, 375,51681, -18257,51750, 8861,51750, 8337,51750,51487,51750,51487,51681, 375,51760, - 265,51680,50209,51765,49321,51681,49905,51769,49001,51681,49911,51773, - 265,51681,51370,51777,51229,51777,46863,51780,46863,51777,51229,51784, - 8337,51776,46863,51789,46863,51681, 264,51792,51765,51795, 264,51793, -51777,51799, 264,49713,51489,51803,51515,51803,51575,51803,51521,51803, -50411,51803,50659,51803,51563,51803, 8471,51803, 8397,51803, 8371,51803, -20149,51803,36887,51803,20211,51803,37009,51803,20247,51803,37103,51803, -51589,51803,50207,51803,46863,51839,51765,51803,46863,51843,51677,51803, -46863,51847,36773,51803,46863,51851,20103,51803,46863,51855, 8337,51803, -46863,51859, 4613,51803,12571,51803,36539,51803,37595,51803,36049,51803, -47581,51803,51487,51873,51615,51803,39085,51877,22807,51877,47590,51877, -46863,51877, 241,51884, 241,51877,46863,51888,46863,51802,51765,51893, -51677,51893,50207,51893,51615,51893, 241,51901, 341,51893, 1369,51803, - 341,51803,51487,51909, 8337,51909,20103,51909,36773,51909,35187,51909, -14315,51909,46863,51909,12377,51803, 375,51925, 1011,49712,26219,51929, -41417,51929, 8647,51929, 903,49712,49981,51937,51594,51937, 375,51937, -31103,51937,51593,51944,51593,51937,31103,51948,15269,51937, 4827,51937, - 1217,49713, 483,51957, 9,51957, 413,49713, 8647,51962,13177,51962, - 251,51962,18391,51969, 375,51962,18391,51973,44243,51962,31103,51962, -18391,51963, 251,51981, 483,51962,18391,51985, 9,51962,18391,51989, - 375,49713, 5,51992,51615,51995, 413,51993,17993,51999, 413,51992, -18391,52003, 241,51993,51487,52007,46863,51992, 241,51992,51217,52013, -51615,52013, 8861,51992,12377,51993,51487,52021,15029,51992,14315,49713, - 341,52027,51487,52029,15029,49713, 266,52032, 267,52032, 264,52033, -52035,52039, 465,52032,52039,52043, 413,52032, 6,52046, 264,52032, - 251,52051, 241,52051, 6,52055, 265,52033, 251,52059,52051,52060, - 8841,52059,52037,52059,52052,52059,52051,52059, 251,52070,15363,52059, -15055,52059,15061,52059,52049,52059,52057,52059, 265,52032, 251,52084, -52039,52087,52039,52085, 251,52091, 251,52032, 265,52094,52039,52097, - 265,52095,52051,52101, 375,52032, 8639,49713, 8643,49713,26217,49713, -41415,49713, 164,49713,51593,52115, 903,52115, 1504,49713,51601,52121, - 144,49713, 113,52125, 802,49713,49880,52129,49879,52129, 483,52132, - 9366,52129, 9195,52129, 483,52138, 483,52129,49879,52142, 9195,52142, -31103,52129, 112,49713,49888,52151,49887,52151, 9,52154, 9,52151, -49887,52158,44243,52151, 1486,49713, 803,52165,43214,49713,49896,52169, -49895,52169, 483,52172, 483,52169,49895,52176, 1073,49713, 903,52181, - 525,49713, 903,52185, 669,49713, 483,52189, 566,49713,51929,52193, -51615,52193,10107,52193,21036,49713, 17,52201, 88,49713,37611,52205, -36083,52205,38155,52205,35927,52205, 1346,49713, 1505,52215, 154,49713, - 483,52219,26329,49713,41557,49713, 165,49713,49155,52226,47640,52226, -46863,52226, 903,52232, 903,52226,46863,52236,43215,52226, 1505,49713, -49475,52242,47608,52242,46863,52242, 1011,52248, 1011,52242,46863,52252, -28715,52242, 803,49713,49903,52259, 483,52261, 483,52258,49903,52265, - 113,49713,49901,52269, 9,52271, 9,52268,49901,52275,28715,49713, - 1505,52278,43215,49713,49899,52283, 483,52285, 483,52282,49899,52289, - 165,52282,29028,49713,43318,49713,25793,49713, 257,52298, 713,49713, - 241,52303,16163,52303,41019,49713, 257,52308, 25,49713, 241,52313, -16163,52313, 1447,49713,16531,52319, 33,49713,16531,52323, 1471,49713, - 59,52326, 1325,52326, 331,52326, 265,52326, 53,49713, 1325,52336, - 59,52336, 331,52336, 265,52336, 1325,49713, 53,52346, 1471,52346, - 253,52346, 1369,52346, 59,49713, 1471,52356, 53,52356, 253,52356, - 1369,52356,48466,49713, 483,52366,48408,49713, 9,52370, 843,49713, - 9,52375, 1530,49713, 9,52379,40436,49713, 113,52383, 587,49713, -28714,52387,36212,52387,30091,52387, 567,52386, 9195,52395, 11,52386, -32103,52386,35187,52387, 241,52402, 241,52387,35187,52406, 4,52386, - 9366,52411, 9195,52411, 483,52414, 483,52411, 9195,52418,31103,52411, - 5,52387,21605,52424, 9195,52425,27021,52425,21605,52387, 11,52433, - 5,52432, 11,49713,32805,52439,19888,52439,19913,52439, 265,52439, -51803,52447,43503,52439, 1275,52438, 9,52453, 89,52438, 587,52438, - 265,52438,51229,52461, 7971,52461,45149,52438,18967,52439, 241,52468, - 241,52439,18967,52472, 2,52438, 9,52477,44243,52477, 3,52439, - 7971,52483,42155,52483, 2,52439,52205,52489,38305,52439, 265,52493, -38305,52438, 113,52497, 1369,49713, 331,52500, 59,52500,40674,52501, -38305,52501, 265,52509, 241,52508, 241,52501,38305,52514, 1325,52500, - 265,52500,51229,52521, 305,52521, 17,52500, 241,52527,38305,52500, -35187,52501, 265,52501, 331,52535,51803,52535, 4,52500,51601,52541, - 5,52500, 803,52545, 5,52501, 959,52549, 47,52549, 759,52549, - 4,52501, 1275,52500, 9,52559, 17,49713, 1275,52562, 903,52565, - 1369,52562, 241,52569, 2,52562, 903,52573,51593,52573, 3,52562, - 113,52579, 3,52563, 1141,52583, 1447,52583, 33,52583, 2,52563, - 265,52591,51803,52591,38305,49713, 1369,52596, 3,52596, 3,52597, - 8165,52603,20501,52603, 9875,52603, 11,52603, 11,52596, 113,52613, - 15,49713, 1010,52617, 1010,52616, 1011,52616,52619,52623, 1011,52617, -52621,52627, 241,52616, 483,52631, 3,52616, 483,52635, 3,52617, - 1369,52639, 1275,49713, 17,52642, 903,52645, 11,52642, 9,52649, - 241,52642, 9,52653, 9,52643, 1369,52657, 11,52657, 5,52642, - 1505,52663, 5,52643, 53,52667, 1471,52667, 253,52667, 1369,52642, - 9,52675,18967,49713, 241,52679, 9,52681, 5,52678, 17,52685, - 5,52679, 9,52689, 483,49713, 803,52693,52129,52695,43215,52693, -52169,52699, 1216,52693,18759,52703, 413,52693,17993,52707, 803,52692, -49903,52711,48466,52692,43215,52692,49899,52717,40675,52692, 1216,52692, -18617,52723, 413,52692,18391,52727,44243,52692,38305,52693,46169,52733, - 9,52692,46863,52736, 903,52692, 5,52692,10107,52743,51929,52743, -51615,52743, 5,52693,46863,52692, 9,52752, 9,49713, 113,52757, -52151,52759, 4,52756, 7,52763, 2,52765, 2,52764, 2,52763, - 7,52770, 1368,52763, 1216,52757,18759,52777, 413,52757,17993,52781, - 113,52756,49901,52785,48408,52756,25545,52756, 1216,52756,18617,52793, - 413,52756,18391,52797,31103,52756, 483,52756,46863,52802, 1011,52756, - 3,52756,52769,52809,52773,52809,37611,52809,38155,52809,35927,52809, -52489,52809,52775,52809, 3,52757,52767,52825,52151,52825,37663,52825, -52477,52825,31103,52825,46863,52756, 483,52836,31103,49713, 1216,52840, - 413,52840,21036,52840,21037,52840,21037,52841,52847,52851, 903,52841, -51593,52855, 1011,52840, 903,52858,21036,52841,52849,52863, 903,52840, -51435,52867, 1011,52866, 9,52840, 5,52840,27021,52875,44243,49713, - 1216,52878, 413,52878, 903,52878, 1011,52884, 1011,52878, 903,52888, - 483,52878, 3,52878, 11,52895, 1369,52895, 3,52879, 483,52901, -49205,49713, 5,52905,48885,49713, 113,52909, 3,52909, 3,49712, -20819,52915,50945,52915,51508,52915,37537,52915,36898,52915,20152,52915, - 8374,52915,50695,52915,50701,52915,50707,52915,50713,52915,50691,52915, -50705,52915,37748,52915,20952,52915,52395,52915,52457,52915,52142,52915, -52158,52915, 8389,52915,50677,52915,51517,52915,50747,52915,50731,52915, -52418,52915,52478,52915,36979,52915,20201,52915,26219,52915,26106,52915, -52129,52915, 483,52976,52411,52915, 483,52980,51123,52915,32103,52915, -52875,52915,31770,52915,42885,52915,20885,52915, 483,52994,40399,52915, -44714,52915, 357,52915, 367,52915, 471,52915, 1249,52915, 8800,52915, - 8647,52915,47488,52915, 8086,52915,19687,52915,19559,52915,20361,52915, - 9673,52915,20713,52915, 9967,52915, 4283,52915, 4279,52915, 3807,52915, - 8251,52915,41746,52915,41417,52915,44832,52915, 9704,52915,20326,52915, -21087,52915,52906,52915,48245,52915,48975,52915,48451,52915,52151,52915, - 9,53058,52477,52915, 9,53062,51487,52915, 375,53066,50785,52915, - 8165,52915, 265,53073, 1447,52915,38305,53077,21127,52915,20843,52915, -52425,52915,37663,52915, 9,53086, 1141,52915,38305,53091, 566,52915, - 567,52915,46863,53097,44243,52915,41941,53100, 483,53100, 375,52915, -51487,53106,20103,53106, 8337,53106,36773,53106,46863,53106,41941,52915, -44243,53118, 33,52915,38305,53123, 9617,52915, 9,53126, 8337,52915, - 375,53130,48884,52915, 1011,52915,48885,52915, 483,53139,52907,52915, - 25,52915, 7971,53144,41019,52915, 11,53148, 305,52915, 8495,52915, - 11,53154,20103,52915, 375,53158,20273,52915, 9,53162, 4,52915, -28411,53167,31103,53167,48408,53167,52905,53167, 483,53167,46863,53176, -20691,53167, 9923,53167,46863,53167, 483,53184, 5,52915,52905,53188, - 17,53189,18967,53193,46863,53188, 483,53188,25793,52915, 11,53200, - 713,52915, 7971,52915, 25,53206,36773,52915, 375,53210, 4,52914, -53191,53215,53051,53215,24265,53215,28233,53215,29077,53215,53135,53215, -53197,53215,53189,53215,52905,53231,46863,53231,19559,53215, 9673,53215, - 4283,53215,20361,53215, 9967,53215,20713,53215, 8251,53215, 4279,53215, - 3807,53215, 5,52914,53143,53255,53174,53255,50785,53255,53139,53255, -53184,53255,50733,53255,19396,53255,53167,53255,52905,53270,46863,53270, - 8647,53255,41417,53255,26219,53255, 9,53255,18967,53282, 483,53255, -18967,53255, 9,53288,52905,53255,53167,53292,46863,53255,53167,53296, - 11,52915,25793,53301,25793,53300, 8495,53301, 8495,53300,18967,53301, -41019,53301,41019,53300,21037,53301, 9,52915,52151,53318,37663,53318, -52477,53318,31103,53318,20273,53318, 9617,53318,52905,52915, 5,53332, -53215,53335, 5,53333,53167,53339, 9875,52915,35187,53343, 241,53343, -46863,52915, 375,53348, 5,53348,53215,53353, 5,53349,53167,53357, - 483,52915,52129,53360,20885,53360,52411,53360,44243,53360, 5,53361, - 5,53360,18967,52915,11731,53375, 113,53375,31103,52915, 9,53380, -20501,52915,35187,53385, 241,53385, 2,49712,52711,53391,52785,53391, -51059,53391,50165,53391,49995,53391,49999,53391,49987,53391,49991,53391, -50163,53391,52013,53391,52265,53391,52275,53391,17609,53391, 4904,53391, -17586,53391,52259,53391, 483,53423, 272,53391, 1476,53391, 280,53391, - 949,53391, 1517,53391,52269,53391, 9,53437, 9484,53391,51803,53391, -51051,53391, 375,53445, 4903,53391, 9,53448,17579,53391, 9,53452, -42991,53391,40039,53391,40685,53391, 1197,53391, 265,53391, 253,53464, - 1471,53464, 53,53464, 53,53391, 265,53472, 253,53391, 265,53476, - 5,53391, 1471,53391, 265,53482, 5,53390, 8953,53487, 9459,53487, - 4067,53487, 3997,53487, 8277,53487, 3867,53487, 11,53391, 9377,53500, - 9,53391, 4903,53504,17579,53504, 9377,53391, 11,53510, 5,53511, - 5,49712,48765,53517,48835,53517,48843,53517,25445,53517,22779,53517, -22243,53517, 7,53517, 2,53531,28063,53517,25299,53517,31598,53517, -53152,53517,50733,53517,35690,53517,37519,53517,50781,53517,52461,53517, -50953,53517, 272,53517, 1476,53517, 280,53517, 949,53517, 1517,53517, - 357,53517, 367,53517, 471,53517, 1249,53517, 9304,53517,53204,53517, -53144,53517,35931,53517,52912,53517,20326,53517,21087,53517,20273,53517, - 9,53586,50785,53517, 1369,53591,53391,53591,25381,53517,48753,53597, -10081,53597, 9704,53517, 53,53517, 265,53604,37899,53517,37617,53517, -52483,53517, 9617,53517, 9,53614, 253,53517, 265,53618,31103,53517, -26625,53622, 375,53517,35187,53626,26625,53517,31103,53630, 1471,53517, - 265,53634, 265,53517, 253,53638, 1471,53638, 53,53638,49204,53517, -49205,53517,52913,53517, 713,53517, 9195,53652,52915,53652,21605,53653, - 305,53517,52915,53660,21605,53661, 2,53517, 8229,53667,52909,53667, -46863,53667, 3,53517,52909,53674,53391,53675, 1369,53675,46863,53674, -52915,53517, 305,53684, 713,53684, 25,53684, 25,53517,52915,53692, -21605,53693, 9195,53517, 713,53698, 2,53516,53677,53703,53581,53703, -53647,53703,53683,53703,53675,53703,52909,53713,46863,53713, 4067,53703, - 3997,53703, 8953,53703, 9459,53703, 8277,53703, 3867,53703, 3,53516, -53651,53731,53670,53731,50785,53731,50733,53731,53649,53731,53672,53731, -19396,53731,53667,53731,52909,53746,46863,53746, 8647,53731,26219,53731, -41417,53731, 483,53731,18967,53731, 9,53760, 9,53731,18967,53764, -52909,53731,53667,53768,46863,53731,53667,53772, 587,53517,35187,53777, - 483,53517,52909,53517, 3,53782,53703,53785, 3,53783,53667,53789, -46863,53517, 3,53792,53703,53795, 3,53793,53667,53799, 9,53517, -20273,53802, 9617,53802,35187,53517, 375,53808, 4,49712,48747,53813, -37279,53813,19981,53813,24601,53813, 7,53813,21605,53823,53071,53813, -52743,53813,52193,53813,50225,53813, 8306,53813, 545,53813, 695,53813, - 1382,53813, 1374,53813, 1386,53813,51906,53813,53442,53813,53199,53813, -53373,53813,53095,53813,51803,53813, 1369,53856,53391,53856, 9992,53813, -20734,53813,19916,53813,48739,53867,37241,53867, 7947,53867,28205,53813, -24613,53813,25551,53813,53189,53813, 483,53881, 33,53813, 9875,53813, - 265,53886, 241,53887,20501,53813, 265,53892, 241,53893, 1141,53813, - 154,53813, 483,53901, 1447,53813, 331,53813, 1369,53906, 265,53813, - 8165,53910, 9875,53910,20501,53910, 1011,53813, 59,53813, 1369,53920, - 3,53813, 8241,53925, 15,53924, 483,53929,53391,53813,51803,53932, - 1325,53813, 1369,53936, 3,53812,24265,53941,28233,53941,29077,53941, - 9673,53941,19559,53941, 4283,53941,20361,53941, 8251,53941, 3807,53941, - 9967,53941,20713,53941, 4279,53941, 1369,53813, 331,53966, 1325,53966, - 59,53966,51803,53966,18967,53813, 1275,53976,48739,53979,37241,53979, - 7947,53979, 113,53977, 1275,53813,18967,53988,48739,53991, 7947,53991, -37241,53991, 8165,53813, 265,53998,46863,53813,38056,54002,38056,54003, -38057,54002,54007,54009,38057,54003,54005,54013, 15,53813, 3,54017, - 1369,54019, 3,54016, 483,54023, 5,49713, 375,54026,51615,54029, - 1368,54027, 7,54027, 2,54034, 2,54035,32805,54027,31103,54041, -20035,54027, 375,54045, 341,54027,18967,54049,12377,54027, 375,54053, -52915,54027,31103,54057,27021,54027,31103,54061,30091,54027,31103,54065, -31103,54026,27021,54069,52915,54069,18967,54027,47608,54075,46863,54075, - 1011,54078, 1011,54075,46863,54082,53924,54027,53825,54087, 483,54087, -51929,54027, 483,54093,51615,54027, 375,54097, 483,54097, 1369,54026, - 803,54103, 483,54026,53813,54107,10107,54107,51929,54107,51615,54107, - 1275,54026, 1505,54117,18967,54026, 17,54121, 1369,54027,51601,54125, - 2,54026,54078,54129,54075,54129,46863,54132,52541,54129, 1505,54129, - 918,54129,52121,54129,54125,54129, 903,54129, 9,54146, 9,54129, - 903,54150,46863,54129,54075,54154, 3,54026,54033,54159,54037,54159, -53966,54159,12571,54159, 4613,54159,51615,54159, 8337,54159,46863,54173, -52591,54159,53932,54159,53391,54159,53813,54180,53813,54159, 1369,54184, -53391,54184,36773,54159,46863,54191,20103,54159,46863,54195, 1369,54159, -53813,54198, 2,54027, 0,54202,54159,54205,46863,54207, 7,54202, -54159,54211, 265,54203, 9,54215,54159,54203, 9,54219,46863,54219, - 3,54027,48286,54225,54039,54225,54150,54225,52573,54225,52115,54225, -38057,54225,46863,54236,53813,54224,53825,54241, 483,54241, 9,54225, -54129,54246, 483,54225,53813,54251,54154,54225,46863,54225,38057,54256, -54129,54256,54129,54225, 9,54262,46863,54262,10107,54027, 483,54269, -53813,54027, 483,54273, 3,54273, 1369,54277,53391,54277, 3,54272, -53825,54283, 483,54283, 17,54027,20273,54289, 9617,54289, 3,49713, -16722,54295,16530,54294,54297,54299,16723,54295,16531,54294,54303,54305, -16530,54295, 1,54295,35187,54311, 17,54313, 7,54295,16531,54316, -54299,54319,16531,54317,54309,54323, 15,54317,38305,54327, 1,54294, -40705,54331,54329,54331, 17,54331, 7,54294,54333,54339,40704,54339, -54331,54343,49713,54339, 4,54346, 4,54339,49713,54350,54315,54339, - 9,54339,38305,54356,54331,54359,38305,54339, 9,54362,54331,54365, -52489,54295, 9,54369,36527,54295, 375,54373, 341,54295,12377,54295, - 9,54379,16531,54295, 7,54382,54299,54385,37611,54295, 9,54389, - 8321,54295,35927,54295, 9,54395,38155,54295, 9,54399,43503,54295, -44243,54403, 113,54295,38305,54406,40086,54295, 8241,54295,44243,54294, - 11,54415, 1369,54415, 1486,54295,35187,54295,47640,54423,46863,54423, - 903,54426, 903,54423,46863,54430,53480,54295,11731,54295,51615,54295, - 241,54295, 17,54294, 113,54443,38305,54294, 9,54294,37611,54449, -38155,54449,35927,54449,52489,54449, 15,54294, 483,54459, 11,54295, -44243,54463,38305,54295, 113,54466,38057,54295, 7,54471, 375,54471, - 4,54294,54426,54477,54423,54477,46863,54480,52573,54477,54377,54477, -52115,54477,43053,54477,46863,54477,54423,54492, 5,54294,54473,54497, - 6,54497,54471,54501,53966,54497,12571,54497, 4613,54497,51615,54497, - 8337,54497,46863,54513,52591,54497,53932,54497,53813,54497, 1369,54520, -53391,54520,53391,54497,53813,54526,20103,54497,46863,54531,36773,54497, -46863,54535, 1369,54497,53813,54538, 4,54295, 0,54542,54497,54545, -46863,54547, 5,54295,48294,54551,21315,54551,46863,54554,53391,54550, - 1369,54550,46863,54551,21315,54562,53391,54295, 5,54567,53813,54569, - 5,54566, 1369,54295, 9893,54575,52129,54575,54353,54575,54349,54575, -20885,54575,52411,54575,44243,54575, 5,54574, 5,54575,53813,54593, - 2,49713,53227,54597,53262,54597,53355,54597,53358,54597,53298,54597, -53264,54597,53229,54597,53274,54597,53234,54597,49168,54597, 1,54597, - 7,54597, 567,54621,52915,54623, 4,54621,54575,54627,53360,54627, -52915,54627, 483,54632, 483,54627,52915,54636, 9,54621, 1,54596, -36544,54643,35187,54643, 11,54646, 11,54643,35187,54650, 7,54596, -36545,54655,54643,54657,54645,54655,21605,54655,54653,54655,54649,54655, - 15,54655,53270,54597,46863,54670,53231,54597,46863,54674,49169,54597, -54097,54597,53134,54597,53215,54683,53352,54597,53215,54687,53196,54597, -53215,54691, 8311,54597,48884,54596,54617,54697,53731,54597,53881,54597, -54283,54597,54241,54597,54087,54597,36256,54597,53296,54597,53167,54712, -53184,54597,53255,54716,53167,54597,53357,54720,53296,54720,53255,54720, -46863,54726,46863,54720,53255,54730,48885,54597, 9,54734,54697,54737, -54697,54735, 9,54741,35187,54597, 9,54744, 9,54597,48885,54748, -54697,54751,48885,54749,35187,54748, 11,54749,52915,54759,53188,54597, -53215,54763,46863,54765,46863,54762,53215,54769,53813,54763,53139,54597, -53255,54774,44243,54597, 11,54779,54225,54597,53813,54783,51229,54597, - 265,54597,54027,54789,47961,54791,14611,54791, 4899,54791, 375,54791, - 17,54596, 903,54801,51593,54801,54477,54801,54225,54801, 11,54596, -53318,54811,52825,54811,52915,54811, 9,54816, 9,54811,52915,54820, -44243,54811,53255,54597,53139,54826,53184,54826,53167,54826,46863,54832, -46863,54826,53167,54836,53357,54597,53167,54840, 4,54596,51418,54845, -51416,54845,51398,54845,51354,54845,51909,54845, 340,54845,51803,54857, -51873,54845,47974,54845,47589,54845, 8590,54845,14620,54845,12537,54845, -52021,54845,52029,54845,53106,54845, 375,54845,51229,54878,52915,54878, - 0,54845, 6,54885, 7,54845, 265,54888,51803,54891, 265,54889, -51229,54895,52915,54895,47580,54845,51803,54901, 8861,54901, 8495,54845, -47961,54906, 4899,54906,14611,54906,52915,54845, 375,54914,14611,54845, -51229,54918, 8495,54918, 4899,54845,51229,54924, 8495,54924,47961,54845, -51229,54930, 8495,54930, 265,54845, 7,54936,51803,54939,54887,54937, -54886,54936,54943,54945,54887,54936,54886,54937,54949,54951,46863,54936, - 8861,54955,51803,54955,46863,54845, 265,54960,51803,54963, 8861,54963, - 265,54961,51229,54969, 8495,54969,51229,54845, 375,54974,14611,54974, - 4899,54974,47961,54974, 5,54596, 1505,54985, 918,54985,52541,54985, -52121,54985,54125,54985, 903,54985, 9,54996, 9,54985, 903,55000, - 5,54597,54889,55005,52915,55007,53349,55004, 6,55005,54914,55013, -52915,55013,54845,55016,54845,55013,52915,55020, 53,55005, 1471,55005, - 253,55005,52557,55005,53348,55004,53215,55033, 241,55005, 9,55037, -52915,55004,53215,55041,46863,55043,46863,55040,53215,55047,53813,55041, - 17,55005,35187,55053,52915,55005,53357,55057,55011,55057,53296,55057, -53255,55057,46863,55064,46863,55057,53255,55068,46863,55004,52915,55072, -53215,55075,52915,55073,53255,55079,48885,54596,54679,55083, 9,55083, -48884,54597,54755,55089,55086,55089,55083,55089, 9,55094,52915,55088, -53215,55099,52915,55089,53255,55103, 9,55089,55083,55106,53348,54597, - 5,55110,53215,55113, 5,55111,53167,55117,52915,54597,48884,55120, -53215,55123,48884,55121,53139,55127, 5,55121,53139,55131,53184,55131, -53167,55131,46863,55136,46863,55131,53167,55140, 5,55120,53215,55145, -46863,55147,46863,55144,53215,55151,53813,55145,46863,55120, 5,55156, -53215,55159, 5,55157,53167,55163,21605,54597,54027,55167,31103,55169, -46863,54597,53270,55172,53231,55172,53188,55172,53215,55179,53255,55172, -53167,55182,53167,55172,53255,55186, 5,55172,52915,55190,53215,55193, -52915,55191,53255,55197,52915,55172, 5,55200,53215,55203, 5,55201, -53167,55207, 4,49713,51398,55211, 375,55211,51229,55214,53709,55211, -53740,55211,51909,55211,53797,55211,53800,55211, 340,55211,51803,55229, -54339,55210,54575,55233,53774,55211,53742,55211,53711,55211,53750,55211, -53716,55211,54663,55211,53533,55211, 1368,55211,52205,55251,54449,55251, -52809,55251,54295,55251, 9,55259, 7,55211, 265,55263,51229,55265, - 89,55263,52915,55269, 265,55262,51803,55273, 2,55262,52205,55277, -52809,55277,54449,55277,54295,55277, 9,55285, 2,55263,52825,55289, -53318,55289, 9,55289,52915,55294,52915,55289, 9,55298,53746,55211, -46863,55302,53713,55211,46863,55306,31796,55211,25037,55211,25215,55211, -42338,55211,42076,55211,43053,55211,42959,55211,54575,55211,54339,55325, -54786,55211,51360,55211,53780,55211,52751,55211, 8148,55211, 9594,55211, -54377,55211,54439,55211,53758,55211,54700,55211,54826,55211,53286,55211, -53646,55211,53703,55353,53794,55211,53703,55357,53682,55211,53703,55361, -53371,55211, 842,55211, 9377,55367,54591,55211,54421,55211,54561,55211, -53681,55211,53255,55211,54597,55378, 483,55378,53679,55211,54573,55211, -55131,55211,54559,55211,54435,55211,19892,55211,53772,55211,53667,55396, -53672,55211,53731,55400,53667,55211,53799,55404,53772,55404,53731,55404, -46863,55410,46863,55404,53731,55414, 935,55211,20733,55211, 9991,55211, -41941,55211, 483,55424, 9565,55211, 483,55428, 1487,55211,54597,55211, -51229,55434, 53,55435, 1471,55435, 253,55435,53731,55434,53255,55434, -47546,55211, 66,55211, 1369,55451, 241,55211,31103,55454,18967,55211, - 483,55458, 483,55211,42155,55462,41941,55462,51229,55462,53517,55462, - 7971,55462, 9565,55462,53731,55462,53255,55462, 587,55462, 9377,55481, -18967,55462, 587,55463, 9195,55487,52915,55487,53674,55211,53703,55493, -46863,55495, 1369,55493,46863,55492,53703,55501,53391,55493,53649,55211, -53731,55506,31103,55211, 241,55510, 587,55511, 113,55211,46863,55516, -17455,55211,54551,55211, 1369,55523,53391,55523,51229,55211, 375,55528, -54597,55528, 483,55528, 1011,55211, 8165,55537, 9875,55537,20501,55537, - 11,55537, 265,55211, 7,55546,51803,55549,54295,55547,47961,55553, -14611,55553, 4899,55553, 375,55553, 1369,55210,54985,55563,51601,55563, -54129,55563, 587,55210, 9366,55571,54575,55571,53360,55571, 9195,55571, - 483,55578,52915,55571, 483,55582, 483,55571, 9195,55586,52915,55586, -31103,55571,53731,55211,53649,55594,53672,55594,53667,55594,46863,55600, - 483,55594,54597,55594,46863,55594,53667,55608, 587,55211, 9377,55613, - 483,55615, 483,55612, 9377,55619,21605,55211,21526,55622, 6,55623, -21527,55622,55627,55629, 7,55622, 7,55623,55625,55635, 6,55622, -18967,55638,55635,55641,18967,55622, 6,55645,55633,55647, 6,55644, -55635,55651, 1347,55211, 1369,55655,53799,55211,53667,55658, 2,55210, -51418,55663,51416,55663,51398,55663,51354,55663,51909,55663, 340,55663, -51803,55675,51873,55663,47974,55663,47589,55663, 8590,55663,14620,55663, -12537,55663,52021,55663,52029,55663,53106,55663, 375,55663,51229,55696, -52915,55696, 0,55663, 6,55703, 7,55663, 265,55706,51803,55709, - 265,55707,51229,55713,52915,55713,47580,55663,51803,55719, 8861,55719, - 8495,55663,47961,55724, 4899,55724,14611,55724,52915,55663, 375,55732, -14611,55663,51229,55736, 8495,55736, 4899,55663,51229,55742, 8495,55742, -47961,55663,51229,55748, 8495,55748, 265,55663, 7,55754,51803,55757, -55705,55755,55704,55754,55761,55763,55705,55754,55704,55755,55767,55769, -46863,55754, 8861,55773,51803,55773,46863,55663, 265,55778,51803,55781, - 8861,55781, 265,55779,51229,55787, 8495,55787,51229,55663, 375,55792, -14611,55792, 4899,55792,47961,55792, 3,55210,54801,55803,52573,55803, -52115,55803,43053,55803,46863,55803, 2,55211, 7,55814,52205,55817, -52809,55817,54449,55817,54295,55817, 9,55825,54295,55815,54501,55829, - 7,55829,54497,55833, 375,55829, 3,55211,55707,55839,52915,55841, -55706,55839,53793,55838,55779,55839, 6,55839,55732,55851,52915,55851, -55663,55854,55663,55851,52915,55858, 0,55851,55829,55851, 0,55850, -55663,55867, 0,55839, 6,55870,55663,55873, 0,55838,49713,55838, -55845,55879, 1,55838,55868,55883,55874,55883,55867,55883,55663,55888, -55873,55883,55663,55892,55849,55883,55663,55883,55867,55898,55873,55898, -46862,55839,55898,55905,55883,55905,55663,55908,55663,55905,55883,55912, - 1,55839,55863,55917,55663,55919, 7,55839,55663,55922,55879,55925, -55879,55923,55663,55929,52591,55839,53792,55838,53703,55935,43027,55839, -43837,55839,39747,55839,53517,55838,53703,55945,46863,55947, 1369,55945, -46863,55944,53703,55953,53391,55945, 1369,55839,18967,55959, 11,55838, - 1369,55963,18967,55839,46863,55967, 11,55839,46863,55971,53517,55839, -53799,55975,55847,55975,53772,55975,53731,55975,46863,55982,46863,55975, -53731,55986,55778,55839,55877,55991,46863,55839,55877,55995,55663,55997, -55663,55994,55877,56001,55663,55839, 7,56004,55879,56007,46863,56004, -55877,56011,46863,55838,53517,56014,53703,56017,53517,56015,53731,56021, -49204,55211,53517,56024,53703,56027,53517,56025,53731,56031,53792,55211, - 3,56034,53703,56037, 3,56035,53667,56041, 7971,55211, 483,56044, -42155,55211, 483,56048,53517,55211, 483,56052,49204,56052,53703,56057, -49204,56053,53649,56061, 3,56053,53649,56065,53672,56065,53667,56065, -46863,56070, 483,56065,54597,56065,46863,56065,53667,56078, 3,56052, -53703,56083,46863,56085, 1369,56083,46863,56082,53703,56091,53391,56083, -46863,56052, 3,56096,53703,56099, 3,56097,53667,56103, 11,55211, - 3,56106, 1369,56109, 3,56107, 483,56113,46863,55211,53746,56116, -53713,56116,53674,56116,53703,56123,53731,56116,53667,56126,53667,56116, -53731,56130, 113,56116, 3,56116,53517,56136,53703,56139,53517,56137, -53731,56143,53517,56116, 3,56146,53703,56149, 3,56147,53667,56153, -46863,49713,47982,56156,47983,56157,56159,56161,47983,56156,47982,56157, -56165,56167,49588,56156,49589,56157,56171,56173,49670,56156,49671,56157, -56177,56179,49589,56156,49588,56157,56183,56185,49671,56156,49670,56157, -56189,56191, 8453,56156, 273,56156,21522,56156,38266,56156, 1516,56156, - 948,56156,20239,56156,37095,56156, 1477,56156, 281,56156,49617,56156, -49616,56157,56215,56217,49699,56156,49698,56157,56221,56223,49617,56157, -49616,56156,56227,56229,49699,56157,49698,56156,56233,56235, 1216,56156, - 412,56156,12377,56156, 375,56156, 510,56156,38057,56156, 903,56248, - 165,56156, 903,56252,21315,56156, 1011,56256, 1505,56156, 1011,56260, - 413,56157,50785,56265,56241,56265, 1217,56157,56239,56271, 1216,56157, - 413,56156, 412,56157,56277,56279, 1217,56156,56275,56283, 264,56157, -51777,56287,50908,56287,50785,56287, 241,56292, 241,56287,50785,56296, - 375,56287, 264,56156,50207,56303,51765,56303,51677,56303,51615,56303, - 241,56311, 341,56303, 1011,56156, 1505,56316,21315,56316, 903,56156, - 165,56322,38057,56322, 483,56156, 9,56328, 9,56156, 483,56332, - 5,56157, 4,56156,56337,56339,46863,56340, 2,56343, 2,56342, -49515,56340,49514,56340, 2,56341,56349,56353, 3,56341,56347,56357, -56351,56357, 2,56340,46863,56362,56357,56365,56357,56363, 3,56340, -56345,56371,56353,56371, 3,56157, 375,56377, 2,56156,56337,56381, - 1,56383, 0,56382,56385,56387, 0,56383, 1,56382,56391,56393, -56377,56381,46863,56396, 4,56399, 4,56398,49631,56396,49630,56396, - 4,56397,56405,56409, 5,56397,56403,56413,56407,56413, 4,56396, -46863,56418,56413,56421,56413,56419, 5,56396,56401,56427,56409,56427, - 2,56157, 3,56156,56337,56435, 7,56437, 6,56436,56439,56441, - 6,56437, 7,56436,56445,56447,56433,56435,46863,56451, 4,56452, - 4,56453,49631,56451,49630,56451, 4,56451,46863,56462, 5,56451, -56457,56467, 4,56450,56467,56471,56459,56471, 5,56450,56465,56477, -56455,56477,56463,56477,56461,56477, 4,56157,56435,56487, 1,56489, - 0,56488,56491,56493, 0,56489, 1,56488,56497,56499,56381,56487, - 7,56503, 6,56502,56505,56507, 6,56503, 7,56502,56511,56513, - 5,56156,56487,56517,46863,56519, 2,56520, 2,56521,49515,56519, -49514,56519, 2,56519,46863,56530, 3,56519,56525,56535, 2,56518, -56535,56539,56527,56539, 3,56518,56533,56545,56523,56545,56531,56545, -56529,56545, 1, 2,11709,56555,11632,56555,11035,56555,10468,56555, -17775,56555,11788,56555,12226,56555,11816,56555,11770,56555,44558,56555, -42181,56555,44243,56576,44438,56555,10856,56555, 3447,56555, 375,56584, - 3448,56555,11705,56555,11033,56555,10516,56555,17773,56555,18735,56555, -10427,56555,10831,56600,10836,56555,10855,56555,16623,56555,16711,56555, - 9533,56610,16718,56555, 3555,56555, 5882,56555, 9261,56555, 483,56621, - 3699,56555, 15,56625, 6,56624,56627,56629, 14,56625, 7,56624, -56633,56635, 1999,56555, 15,56639, 6,56638,56641,56643, 14,56639, - 7,56638,56647,56649,29450,56555,29731,56653,29659,56653,28791,56653, -29041,56653,38067,56555, 5,56663,38185,56665,42155,56554,44243,56669, -42471,56670,44966,56669,42471,56669,44243,56676, 1471,56554,36639,56681, -15390,56555,15383,56685,28715,56555,21527,56689,29229,56691, 7,56689, -29759,56695, 7,56688,28791,56699,29041,56699,29731,56699,29659,56699, - 1005,56555,16877,56554,16893,56711, 9925,56555, 1369,56715, 9927,56717, -35336,56555, 989,56721,35278,56555, 1177,56725, 987,56555,35187,56728, - 989,56731,36563,56554,36639,56735, 671,56554,36597,56554,36639,56741, - 1418,56554, 1,56745, 4,56746, 4,56745, 1,56750, 147,56555, -35187,56754, 53,56757,17637,56555, 587,56760,10107,56763,35316,56555, - 1471,56767,35330,56555, 53,56771,17638,56555,10107,56775, 1489,56555, -35187,56778, 1471,56781, 1179,56555,35187,56784, 1177,56787,37229,56555, -35187,56790,37223,56793, 9441,56555, 587,56796, 9439,56799,37230,56555, -37223,56803, 9442,56555, 9439,56807,45432,56555,42435,56811, 30,56555, -11731,56814,45433,56555,56669,56819,43099,56555,52259,56555, 483,56825, -44742,56555,44904,56555,52613,56555,52383,56555,52497,56555,39231,56555, -40447,56555,39083,56555,38797,56555,39019,56555,39301,56555,39429,56555, -39305,56555, 386,56555, 347,56555,54492,56555,45508,56555,56116,56555, -55812,56555,40987,56555,52909,56555,51598,56555,50419,56555,56332,56555, -52836,56555,52366,56555,36639,56555, 1471,56881,36563,56881,36597,56881, - 181,56555,11731,56888,50579,56555,52319,56555,52323,56555,54436,56555, -54406,56555,52532,56555,52514,56555,55520,56555,44930,56555,39317,56555, -51141,56555,40123,56555,39228,56555,40676,56555,47366,56555,40682,56555, -52599,56555,50655,56555,52531,56555,36538,56555,36048,56555,37594,56555, -42918,56555,40922,56555,39292,56555,11111,56555,11113,56555,11187,56555, -17508,56555,17180,56555, 3280,56555, 3574,56555, 3568,56555,12216,56555, - 25,56958,11613,56555, 25,56962,48406,56555,48400,56555,48500,56555, -43292,56555,47534,56555,17494,56555,39065,56555,48961,56555,49162,56555, -17496,56555,11179,56555,47892,56555,11546,56555,11207,56555, 5878,56555, -52446,56555,35506,56555,39035,56555,40087,56555, 9,57003,10513,56555, - 9,57006,36102,56555, 253,57011, 53,57011, 117,57011, 1471,57011, - 7968,56555,53813,57021,10107,57021,11067,57021,37282,56555,53813,57029, -37417,57029,10107,57029,35652,56555, 253,57037, 1471,57037, 809,57037, - 53,57037,38293,56555,53813,57047,37417,57047,38275,57047,10107,57047, - 1397,56555,35187,57056,52439,56555, 265,57060,40127,56555,43318,56555, -48750,56555,53813,57069,10107,57069,36100,56555, 253,57075, 53,57075, - 1471,57075, 9404,56555, 483,57083, 8053,56555, 9,57087,10465,56555, - 9,57090,11936,56555,10119,56555,10185,56555,53885,56555,10117,56555, -45490,56555, 33,57105, 8212,56555, 9,57109,11812,56555, 9,57112, -53899,56555, 6719,56555, 11,57119, 5,57120, 6,57119, 5,57124, - 5,57119, 6,57128, 6,57129, 7,57119,57133,57135, 15,57119, - 6,57118,57139,57141, 14,57119, 7,57118,57131,57147,57127,57147, -57123,57147,57145,57147, 6787,56555, 5,57157, 4,57157, 12,57157, - 13,57156,57163,57165, 13,57157, 12,57156,57169,57171, 5,57156, -57161,57175, 4,57156,57159,57179,10831,56555, 375,57182,44243,57182, -10427,57182, 9,57183,11529,56555,46863,57192, 483,57192,17640,56555, -39226,56555,48572,56555,47410,56555,40568,56555,47374,56555,47674,56555, -17656,56555,47676,56555,47634,56555,48112,56555,47412,56555, 5814,56555, - 918,56555,36256,56555,46863,57226,48466,56555,49713,57230,35187,57230, - 11,57231,47608,56555, 903,57238,52756,56555,46863,57242,48620,56555, - 247,56555,46863,57248, 1419,56555,56749,57253,56753,57253,25519,57253, - 1841,57253, 1883,57253,22679,57253, 5,57253,22677,57267,14065,57253, - 5175,57253,40565,56555, 587,57274, 922,56555,51593,56555,46863,57280, -47640,56555, 11,57285, 1011,57284, 11,57284,35718,56555, 9439,57293, -37223,57293, 9381,57293,37157,57293,35877,57293,35881,57293, 9383,57293, -37163,57293,35883,57293, 17,57293,37145,57313, 9377,57313,35867,57313, -51051,56555, 375,57321,50959,56555, 9,57325,39205,56555, 10,57329, - 10,57328, 11,57329,57333,57335, 1011,57328, 11,57328,57331,57341, -48402,56555, 9,57344,48560,56555, 903,57348,36544,56555, 6,57353, -36661,57355,36675,57353, 8067,57353, 7979,57353, 7981,57353,39747,57353, -43837,57353,43027,57353, 1369,57353, 7971,57373, 934,56555,46863,57376, - 668,56555, 5,57381,22605,57383,22615,57381, 3135,57381, 2009,57381, -14065,57381, 5175,57381,53905,56555,55432,56555,10303,56555,42661,56555, - 25,56555,11613,57404,12216,57404, 9,57404,11731,57410,35187,57404, - 253,57415, 53,57415, 117,57415, 1471,57415,11731,57404, 9,57424, - 8165,56555, 67,57428, 9,57431, 7947,56555, 587,57434,53813,57437, -10107,57437,11067,57437,17049,56555,46863,57444, 165,56555,43215,57448, - 113,56555,54295,57452, 767,56555, 483,57457, 9377,57459, 9377,57456, - 483,57463, 803,56555,17455,57466, 375,56555,10831,57470, 3447,57470, - 305,57470,17125,57470, 510,56555, 11,56555, 33,57483,44243,57485, -44243,57482, 33,57489,39205,57482,47640,57482,46863,57482, 903,57496, -35187,57482,43027,57501,43837,57501, 8067,57501, 7979,57501,39747,57501, - 7981,57501, 1369,57501, 7971,57515, 903,57482,46863,57518, 9,56555, -10465,57522,11812,57522,10513,57522, 25,57522,11731,57530,56156,57522, -40675,57522, 3565,57522, 3573,57522, 3273,57522,11731,57522, 25,57544, -48402,57522,17455,57522, 5843,57522, 11,57523,46863,57555,49713,57522, -46863,57558, 903,57522,35187,57522,46863,57564,46863,57522,49713,57568, -35187,57568, 11,57569, 587,57522, 5175,57577,14065,57577, 3135,57577, - 2009,57577, 483,57522,55839,56555, 483,57589, 5771,56555, 903,57592, - 6705,56555, 1369,57597, 6707,57599, 6711,57599, 6715,57599, 3697,56555, - 16,57607, 16,57606, 17,57607,57611,57613, 17,57606,57609,57617, - 3709,56555, 8075,56555, 9,57623, 3273,56555, 9,57626, 3423,56555, - 16,57631, 16,57630, 17,57631,57635,57637, 17,57630,57633,57641, - 3661,56555, 16,57645, 16,57644, 17,57645,57649,57651, 17,57644, -57647,57655, 3681,56555, 3357,56555,53675,56555, 9,57663,42379,56555, - 9,57667, 3573,56555, 9,57670, 3565,56555, 9,57674,52878,56555, -15436,56555, 375,57681,54550,56555,17232,56555,38305,57686, 4935,56555, - 6,57691, 5,57692, 7,57691, 5,57691, 6,57698, 6,57699, -57697,57703, 6,57690, 15,57691,57707,57709, 7,57690,57695,57713, -57701,57713, 14,57691,57713,57719,55803,56555,46863,57722,16127,56555, - 6,57727, 5,57728, 7,57727, 5,57727, 6,57734, 6,57735, -57733,57739, 6,57726, 15,57727,57743,57745, 7,57726,57731,57749, -57737,57749, 14,57727,57749,57755,54477,56555,46863,57758,49155,56555, - 483,57762, 5843,56555, 955,57766, 9,57766, 5313,56555, 9802,56555, -48736,56555, 9434,56555, 483,57779,15309,56555, 413,57782,15383,57785, - 413,57783,15335,57789, 8,56554, 4,57793, 1,57794,57381,57797, -57577,57797, 1,57793, 4,57802,57381,57805,57577,57805, 10,56554, - 7,57811, 2,57812,57353,57815,57501,57815, 2,57811, 7,57820, -57353,57823,57501,57823,57515,57811,57373,57811, 1368,57811,57501,57833, -57353,57833, 3867,57811, 8277,57811, 3997,57811, 4067,57811, 9459,57811, - 8953,57811,57483,57811, 9,57811, 14,56555,38881,57855, 11,56554, -44778,57859,44243,57859, 25,57862,47640,57859, 25,57859,44243,57868, -48466,57859, 903,57859,46863,57874,46863,57859, 903,57878, 9,57878, - 9,57859,46863,57884, 9,56554,40903,57889,40053,57889,43307,57889, - 5019,57889,12361,57889, 16,56555,19625,57901,21105,57901,21549,57901, -17591,57901, 17,56554,36639,57911, 10,56555,57859,57915,11731,56555, - 30,57918, 181,57918,54295,57918, 9,57918, 25,57926, 145,57918, - 25,57918, 9,57932, 67,56555, 9,57937, 8165,57939, 8165,57936, - 9,57943,17635,56555, 155,57946, 903,57946, 145,56555,11731,57952, -17695,56555, 1369,57957, 7971,57959,53517,57959,17053,57959,17699,57959, -42155,57959, 155,56555,17635,57970,10305,56555,42699,56555,10307,56555, - 566,56555,53813,57981,10107,57981, 256,56555,42810,56555,17125,57988, - 1170,56555, 629,56555, 1413,56555,37408,56555,25793,57999,41019,57999, - 8495,57999, 265,57998, 1346,56555,48884,56555,27021,58011,52915,58011, - 9195,58011,20763,58011, 340,56555, 331,58021,35187,58020,38270,56555, - 766,56555,25519,58029, 802,56555, 9366,58033, 9195,58033, 483,58036, - 483,58033, 9195,58040,31103,58033,42729,56555, 257,56555,44243,58048, - 1487,56555,55211,58052,44243,56555,10831,58056,42181,58056,42155,58057, -42471,58063,42155,58056,42435,58067, 9533,58056,37145,58056, 11,58057, - 25,58075,35187,58056,17125,58056, 11,58056, 33,58083,49713,58056, - 257,58056,55211,56555,46863,58090,17455,58090, 1487,58090, 1197,56555, - 4,58099, 5,58098,58101,58103, 5,58099, 4,58098,58107,58109, - 1505,56555,45002,56555,42155,56555,42435,58117,44243,58119,44243,58116, -42435,58123, 305,56555, 375,58126,35187,58126, 253,58131, 1471,58131, - 53,58131, 713,56555,35187,58138, 253,58141, 1471,58141, 809,58141, - 53,58141,37241,56555, 587,58150,53813,58153,37417,58153,10107,58153, - 955,56555, 5843,58160,48739,56555, 587,58164,53813,58167,10107,58167, -40461,56555, 9,58173,52501,56555,35187,58176, 241,58176, 9801,56555, - 17,58182, 4,58183,58185,58187, 5,58183,57901,58191, 4,58182, - 7,58194,58191,58197, 5,58182,48735,56555, 17,58202, 4,58203, -58205,58207, 5,58203,57901,58211, 4,58202, 7,58214,58211,58217, - 5,58202, 9533,56555,16711,58222,44243,58222,37145,56555,44243,58228, - 8861,56555, 5,58233, 6,58235, 6,58234, 14,58233, 15,58233, - 6,58233, 5,58244, 7,58233,58237,58249, 6,58232,58243,58253, - 7,58232,58239,58257,58247,58257,58241,58257, 9377,56555, 767,58264, - 483,58267, 4,58264, 483,58271, 1217,56555, 483,58275, 413,56555, -15309,58278,15383,58281,15309,58279,15363,58285,46863,58278, 412,56555, - 483,58291, 1216,56555,46863,58294,56156,56555, 9,58298, 1011,56555, -39205,58302,47640,58302,46863,58302, 903,58308, 7,58302, 903,58302, -46863,58314,43215,58302, 7,58319,38305,56555,17232,58322, 7,58322, -17125,58326,17125,58322, 7,58330,49713,56555,48466,58334, 9,58334, -46863,58338,44243,58334,46863,58334, 9,58344, 241,56555,52501,58348, - 7,58348, 7,58349, 265,58355, 265,58348, 483,58359, 483,56555, -40675,58362,43215,58362,49155,58362,11529,58362, 903,58362, 9,58362, - 5,58362,53813,58377,10107,58377, 5,58363,55211,58383,40675,56555, - 7,58387, 9,58386, 483,58386,46863,58386,35187,56555,37229,58396, -37223,58399, 1177,58397, 1179,58403, 989,58397, 987,58407, 1179,58396, - 1177,58411, 987,58396, 989,58415, 1489,58396, 1471,58419, 147,58396, - 53,58423, 117,58397, 25,58427, 809,58397, 713,58431, 2,58396, - 7,58435, 2,58436,58397,58439, 5,58436,58441,58443, 5,58435, - 7,58446, 10,58435, 4,58396, 7,58453, 4,58454,58397,58457, - 3,58454,58459,58461, 3,58453, 7,58464, 586,58453, 1368,58396, - 7,58471, 5,58472, 5,58471, 7,58476, 10,58471, 16,58396, - 7,58483, 3,58484, 3,58483, 7,58488, 586,58483,44243,58396, -52501,58396, 340,58396,48466,58396, 1397,58396, 25,58396, 1471,58505, - 253,58505, 53,58505, 117,58505, 713,58396, 53,58515, 253,58515, - 1471,58515, 809,58515, 53,58397, 147,58525, 305,58525, 713,58525, - 25,58525, 1471,58397, 1489,58535, 305,58535, 25,58535, 713,58535, - 305,58396, 253,58545, 1471,58545, 53,58545, 253,58397, 305,58553, - 25,58553, 713,58553, 9,58396,46863,58560, 1369,58397, 9891,58565, - 9927,58565,58475,58565,58479,58565,58443,58565,58449,58565, 4,58565, - 9895,58565,19687,58565,20843,58565,21127,58565,58451,58565,58481,58565, - 11,58565, 9875,58593,58435,58593,58471,58593, 17,58397,10111,58601, -10159,58601,58487,58601,58491,58601,36729,58601,58461,58601,58467,58601, - 2,58601,10113,58601,58469,58601,58493,58601, 587,58601,10107,58625, -58453,58625,58483,58625,46863,58396, 9,58632, 11,58396,57815,58637, -57823,58637, 8067,58637, 7979,58637, 3,58637,58601,58647,58617,58637, - 7981,58637,39747,58637,43027,58637,43837,58637,57833,58637, 1369,58637, - 7971,58663,57811,58663, 587,58396,35877,58669,35881,58669, 9439,58669, - 9381,58669, 5,58669,58565,58679,58579,58669,37223,58669,37157,58669, - 9383,58669,37163,58669,35883,58669, 17,58669, 9377,58695,37145,58695, -35867,58695, 6,58396, 7,58396,25793,58705,41019,58705, 8495,58705, - 265,58704, 6,58397,36661,58715,58705,58715,57999,58715, 7,58397, -58703,58723,58027,58723, 265,58396, 6,58728, 7,58728, 6,58729, -58733,58735, 7,58729,58731,58739, 903,56555,17455,58742,17635,58742, -47608,58742, 5771,58742,48560,58742, 11,58743,46863,58755, 9,58742, - 483,58742,46863,58742, 11,58763, 1011,58762, 11,58762, 11,58742, -46863,58770, 7,58743, 8165,58775, 1011,58742,46863,58778,46863,56555, -21036,58782,21036,58783,21037,58782,58787,58789,21037,58783,58785,58793, -54477,58782,55211,58782,55803,58782,52756,58782,51593,58782,40675,58782, -43215,58782,36256,58782,11529,58782, 934,58782, 247,58782, 1216,58782, - 413,58782,17049,58782, 11,58783, 903,58825, 9,58825, 9,58782, -49713,58830,35187,58830, 11,58831, 1011,58782, 903,58838,35187,58782, - 9,58842, 903,58782, 11,58847, 1011,58846, 11,58846, 11,58782, - 903,58854, 5,58782,27021,58859,52915,58859, 9195,58859,20763,58859, -49713,58782, 9,58868, 1275,56555, 17,58872, 4,58872, 7,58876, - 5,58872, 4,58873,58875,58883, 5,58873,58879,58887,57901,58887, - 265,56555,37408,58892,52439,58892, 7,58892, 331,58899,35187,58898, - 7,58893, 375,58905, 241,58892, 483,58909,38305,58893, 375,58913, -35187,58892, 6,58916, 7,58916, 6,58917,58921,58923, 7,58917, -58919,58927, 587,56555, 9441,58930, 9439,58933,17637,58930,10107,58937, -37417,58931,37241,58941,11067,58931, 7947,58945, 7,58930, 4,58949, - 7,58950,58931,58953, 0,58950,58955,58957, 0,58949, 4,58960, -35186,58949, 1,58930, 4,58967, 1,58968,58931,58971, 6,58968, -58973,58975, 6,58967, 4,58978, 8,58967, 16,58930, 4,58985, - 0,58986, 0,58985, 4,58990,35186,58985,22807,58931,37241,58930, -10107,58999,53813,58999,37417,58999, 7947,58930,53813,59007,10107,59007, -11067,59007,10107,58931,17637,59015,48739,59015,37241,59015, 7947,59015, -48739,58930,53813,59025,10107,59025,53813,58931,48739,59031,37241,59031, - 7947,59031,40565,58930, 17,58931, 1985,59041, 3721,59041,58989,59041, -58993,59041, 5299,59041,58957,59041,58963,59041, 1,59041,35233,59041, -35917,59041, 4861,59041,17563,59041,58965,59041,58995,59041,35187,59041, - 53,59071,58949,59071,58985,59071,35187,58930,35881,59079,35877,59079, -37223,59079,37157,59079, 6,59079, 9439,59079, 9381,59079,37163,59079, - 9383,59079,35883,59079, 17,59079,37145,59101, 9377,59101,35867,59101, - 9,58930,57797,59109,57805,59109, 3135,59109, 2009,59109, 0,59109, -59041,59119,59057,59109, 5175,59109,14065,59109, 4,58930, 9366,59129, - 9195,59129, 483,59132, 483,59129, 9195,59136,31103,59129, 5,58930, -25519,59143, 5,58931,25503,59147,24623,59147,30387,59147,58565,59147, -22605,59147,36526,56555, 6,59158, 7,59158, 6,59159,59163,59165, - 7,59159,59161,59169,40920,56555, 7,59172,43400,56555, 7,59177, -16065,56555, 5,59181, 7,59182, 7,59183,56555,59186, 6,59182, -59189,59191, 6,59183,56555,59183, 7,59196,59191,59199, 7,59197, -59195,59203,15029,56555, 5,59206, 6,59209, 6,59208, 14,59206, - 15,59206, 6,59206, 5,59218, 7,59206,59211,59223, 375,59223, - 6,59207,59217,59229, 7,59207,59221,59233,59213,59233, 59,59233, -59215,59233, 331,59233, 1325,59233, 265,59233,43215,56555, 9,59249, - 483,59248,46863,59248, 165,59248, 1011,59248, 7,59259,17125,56555, - 4,59262, 7,59265, 1011,59266, 1011,59265, 7,59270, 7,59271, - 1170,59265, 5,59263,57993,59279,58313,59279,17129,59279,42811,59263, -42811,59262,44243,59262,42810,59262,59287,59293,42810,59263,59289,59297, - 375,59262, 6,59262,59269,59303,59273,59303,59277,59303, 7,59262, -38305,59310, 6,59263,59275,59315,59311,59315, 7,59263,59303,59321, -38305,59262, 7,59324,54295,56555,11731,59328, 113,59328, 5,59328, - 5,59329,57901,59337,17455,56555, 7,59341, 4,59342, 4,59343, - 16,59341, 17,59341,55211,59340, 803,59340, 903,59340, 9,59340, - 4,59340,59351,59361, 5,59340,59345,59365,59349,59365, 4,59341, - 7,59370,59365,59373, 5,59341,59347,59377, 4,56554,26454,59381, -26375,59381, 8672,59381, 8743,59381,41692,59381,41607,59381, 8770,59381, - 8729,59381, 3795,59381,47953,59381,48062,59381,47961,59381,48009,59404, -48009,59381,47961,59408,26219,59381,26415,59412,41417,59381,41653,59416, -44832,59381,31770,59381, 8757,59381, 8647,59424,41653,59381,41417,59428, -26415,59381,26219,59432, 8647,59381, 305,59436, 8757,59436, 8605,59381, -47580,59381,47933,59445, 8684,59381, 8717,59449, 8916,59381,44243,59381, - 483,59454,41502,59381,41559,59459, 340,59381, 8717,59463, 3785,59463, - 8495,59463, 375,59381, 8861,59470,46863,59470,47488,59381,26292,59381, -26331,59479, 9,59381,31103,59482, 305,59381, 8647,59486, 7,59381, - 1,59491, 264,59492, 264,59493,25793,59491,26415,59499,41019,59491, -41653,59503, 8495,59491, 305,59507, 8757,59507, 8495,59490, 8717,59513, -41019,59490,41559,59517, 265,59491,59497,59521, 8861,59521,46863,59521, -25793,59490,26331,59529, 265,59490, 8717,59533,59495,59533, 3785,59533, - 8495,59533,31103,59381, 9,59542, 483,59381,44243,59546,46863,59381, - 265,59551,48009,59553, 265,59550,47933,59557, 375,59550,41019,59381, - 7,59563,41417,59565, 7,59562,41559,59569, 265,59381,46863,59573, -47961,59575,46863,59572,47933,59579, 7,59573, 8647,59583, 7,59572, - 8717,59587, 3785,59587, 8495,59587,25793,59381, 7,59595,26219,59597, - 7,59594,26331,59601, 8495,59381, 7,59604, 8717,59607, 7,59605, - 8647,59611, 8861,59381, 375,59614, 5,56554,26777,59619, 9741,59619, - 9745,59619,26781,59619,30349,59619,26857,59619,26933,59619, 2,59619, - 7,59634,57353,59637,57501,59637,58637,59637, 6,59635, 9777,59619, - 1368,59619,57501,59649,57353,59649,58637,59649,57515,59619,57373,59619, -58663,59619, 9771,59619,40077,59619,31598,59619,55462,59619,50733,59619, -37519,59619,35690,59619, 8982,59619,55211,59619, 483,59678, 668,59619, - 9731,59683,26625,59683, 1419,59619, 9731,59689,26625,59689, 17,59619, - 8861,59694, 9,59619, 587,59698, 9731,59701,26625,59701, 375,59619, -35187,59706, 6,59619, 7,59619, 5,59713, 2,59712,57353,59717, -57501,59717,58637,59717, 5,59712,58396,59725,59717,59727,35187,59725, -56555,59730,59717,59733,56555,59725,35187,59736,59717,59739, 7,59618, - 3867,59743, 8277,59743, 3997,59743, 4067,59743, 9459,59743, 8953,59743, -31103,59619,26625,59756, 483,59619,55211,59760, 587,59619, 9,59764, - 9731,59767,26625,59767,35187,59619, 375,59772,26625,59619,31103,59776, - 8861,59619, 7,59781, 17,59780, 6,56554,36633,59787,36627,59787, - 1,59787, 4,59792,57253,59795,57381,59795,57577,59795,59109,59795, - 5,59792,38304,59787,39987,59787,36544,59787, 9875,59811,20501,59811, - 11,59787,35187,59816,20501,59819, 9875,59819, 5,59787, 1,59824, - 4,59787, 6,59829, 1369,59831,56555,59833, 1,59828,57253,59837, -57381,59837,57577,59837,59109,59837,59835,59837, 6,59828,58930,59849, -59837,59851, 587,59849,56555,59854,59837,59857,56555,59849, 587,59860, -59837,59863,35187,59787, 11,59866,20501,59869, 9875,59869, 7,56554, - 4904,59875,17586,59875,17609,59875,40685,59875,40039,59875,42991,59875, - 9484,59875, 272,59875, 1476,59875, 280,59875, 949,59875, 1517,59875, - 1197,59875, 4903,59875, 9,59902,17579,59875, 9,59906, 11,59875, - 9377,59910, 9,59875, 4903,59914,17579,59914, 253,59875, 265,59920, - 53,59875, 265,59924, 1471,59875, 265,59928, 5,59874, 3867,59933, - 8277,59933, 4067,59933, 3997,59933, 8953,59933, 9459,59933, 265,59875, - 253,59946, 1471,59946, 53,59946, 9377,59875, 11,59954, 5,59955, - 7,56555,59826,59960,59827,59961,59963,59965,59827,59960,59826,59961, -59969,59971,59804,59960,59805,59961,59975,59977,59805,59960,59804,59961, -59981,59983,21036,59960,14072,59960,14073,59960,14072,59961,59991,59993, -59183,59960,59191,59997,59183,59961,59185,60001, 4970,59960, 4971,59960, - 4970,59961,60007,60009,16169,59961, 9617,60013,39786,59961,59807,59961, -59806,59961,28715,59960,28791,60023,29731,60023,29659,60023,29041,60023, -21036,59961,21037,59960,60033,60035,38304,59961,59787,60038, 483,60038, -38304,59960,60019,60045,59787,60045, 483,60045,18967,59961, 5,60053, - 5,60052, 2,59961, 0,60059,56555,60061, 5,60063,59961,60065, - 7,60064,60067,60069,59960,60065, 6,60064,60073,60075, 1,59961, - 3,60079, 5,60081,56555,60082,56555,60081, 5,60086, 5,60087, - 1011,60079,56555,60093, 5,60079, 1,59960,21036,60099, 3,60099, -56555,60103, 5,60105, 5,60104, 5,60103,56555,60110, 5,60099, -18967,60114,18967,60099, 5,60118, 5,60119, 2,59960,59811,60125, -36545,60125,59787,60129,59819,60125,59869,60125, 15,60125,29659,59961, -29077,60139,39787,59961,60045,60143,32103,59961,41746,59961,26106,59961, - 8800,59961,36526,59960,40920,59960, 1163,59961,41019,59961, 11,60160, -35187,60161,59619,59961, 4971,59961,60005,60169,14073,59961,59989,60173, - 4555,59961, 559,59961, 39,59961, 8495,59961,35187,60183, 11,60182, -15029,59960, 375,60189,17125,59960,38305,60192, 11,59961,41019,60196, -25793,60196, 8495,60196, 265,59961, 3447,60205,10831,60205, 305,60205, -17125,60205,11731,60205, 567,59961,46863,60217, 15,59961, 3651,60221, - 1993,60221, 4903,60221,17579,60221, 241,59960,38305,59960,60017,60233, -60021,60233,60041,60233,60043,60233,60039,60233,59787,60243, 483,60243, -17125,60232, 1011,59960,59279,60251,21037,59961,59987,60255, 11,60255, -28715,59961,29533,60261,20273,60261, 9617,60261,35187,59960,25793,60269, -41019,60269, 8495,60269,58715,60269, 265,60268, 265,59960, 331,60281, -35187,60280,38305,59961,37845,60287,37844,60286,60289,60291,37844,60287, -37845,60286,60295,60297,60048,60287,59787,60287,60045,60302,60050,60287, -60045,60287,59787,60308, 483,60308, 483,60287,60045,60314, 1011,59961, -25793,59961,35187,60321, 11,60320, 4,59960,60091,60327,60107,60327, -60033,60327,60101,60327,59337,60327,58191,60327,58211,60327,60057,60327, -60117,60327,60121,60327,21549,60327,21105,60327,19625,60327,58887,60327, -17591,60327, 5,59960, 1,60359, 3,60361,60205,60363,60255,60359, - 4,59961,60085,60369,60089,60369,60113,60369,60109,60369,57685,60369, -59335,60369,58201,60369,58221,60369,57775,60369,57777,60369,60095,60369, -60055,60369,60123,60369,31103,60369,21575,60369,58881,60369,58009,60369, -17579,60369, 4903,60369,48408,60369,46863,60369, 483,60410, 483,60369, -46863,60414, 5,59961,18967,60418,60327,60421, 1368,60419, 2,60419, - 7,60426, 7,60419, 2,60430,59787,59961,38304,60435,60287,60437, -38304,60434,60233,60441, 483,59961,38304,60445,60287,60447,38304,60444, -60233,60451, 5,56555,60081,60454,60369,60457,60103,60454,60369,60461, - 1,60455, 3,60464, 1,60454,59491,60469,59490,60469,59381,60469, - 7,60474, 7,60475, 5,60469,59961,60481, 6,60468,60473,60485, -60477,60485, 7,60468,60471,60491,59381,60491, 6,60469,59381,60497, -60491,60498,60479,60497,60494,60497,60491,60497,59381,60506, 7,60469, -59381,60510,60485,60513,60485,60511,59381,60517, 2,60454,60261,60521, -60483,60521,53813,60455, 483,60527,52915,60455,46863,60531,59875,60455, - 9801,60454,60369,60537,48735,60454,60369,60541,10107,60455, 483,60545, - 9195,60455,46863,60549,54295,60454,60369,60553, 587,60455,17455,60557, -11731,60557, 9,60455, 8861,60563, 17,60455, 587,60567,26625,60569, - 9731,60569,60467,60569, 483,60454,53813,60577,10107,60577,20763,60455, -46863,60583,46863,60454,27021,60587,52915,60587, 9195,60587,20763,60587, - 1275,60454,60369,60597, 587,60454,25519,60601,27021,60455,46863,60605, - 6,60454,38881,60609,59381,60455,30091,60455,31103,60615, 4,56555, - 2,60619, 0,60621,56555,60623, 5,60625, 7,60621,60627,60629, - 1,60618,59689,60633, 1418,60633,59619,60637,59683,60633, 669,60633, -59619,60643,60569,60633,59701,60633,59767,60633, 15,60633, 1369,60652, -59619,60655, 1369,60633, 15,60658,59619,60661, 842,60619, 9377,60665, -59787,60619, 9377,60618, 483,60671, 587,60619, 483,60674, 9377,60677, - 9377,60675, 483,60681,21527,60619, 9,60685,31103,60619, 587,60689, - 587,60618, 9366,60693, 9195,60693, 483,60696, 483,60693, 9195,60700, -31103,60693, 483,60619, 587,60706, 9377,60709, 9377,60707, 587,60707, - 9195,60715, 7,60618,59337,60719,58191,60719,58211,60719,21105,60719, -21549,60719,19625,60719,58887,60719,17591,60719, 6,60619, 1,60737, - 4,60738, 4,60737, 1,60742, 1369,60737,56555,60747,60741,60749, -60745,60749, 7,60619, 2,60755,21183,60755, 9377,60755,59619,60619, -38305,60619, 3,60764, 2,60764,56555,60765, 6,60770,60769,60773, - 6,60765,56555,60776,60769,60779, 1011,60619,46862,60782,46862,60783, -46863,60783,60785,60789,46863,60782,60787,60793, 6,56555,36303,60797, -36302,60796,60799,60801,36303,60796,36302,60797,60805,60807,40946,60796, -40946,60797,60765,60796,60769,60815, 2,60797, 0,60818,40947,60796, -60813,60823,40947,60797,60811,60827,60765,60797,60767,60831,59381,60797, - 17,60797,35187,60837,20501,60839,60125,60839,60821,60839, 9875,60839, -35187,60796,58723,60849, 5,60796,38881,60853, 0, 3, 8169,60857, - 8028,60857, 8173,60857, 8214,60857, 8167,60857, 8154,60857, 8026,60857, - 8054,60857,17728,60857,60210,60857,60283,60857,58128,60857,58023,60857, -57476,60857,56854,60857,56856,60857,58901,60857,58906,60857,58122,60857, -58066,60857,56810,60857,56822,60857,16743,60857,16696,60857, 4810,60857, -16745,60857,16729,60857,16714,60857, 6648,60857, 2079,60857, 375,60916, - 2086,60857,16733,60857,16565,60857,16683,60924,16692,60857,16735,60857, -16739,60857,51942,60857,44534,60857,42383,60857,44243,60938,44440,60857, -16747,60857, 75,60857, 6625,60946, 6632,60857, 6645,60857,60079,60857, - 5,60955,60327,60957, 5,60954,60369,60961,60096,60857,60369,60965, - 1325,60856,40829,60969, 1173,60857,17591,60856,17603,60975,10039,60857, - 1275,60979,10041,60981,38560,60857, 1205,60985, 1203,60857,38305,60988, - 1205,60991,38514,60857, 1007,60995,40741,60856,40829,60999, 531,60856, - 1290,60856, 0,61005, 5,61006, 5,61005, 0,61010,40769,60856, -40829,61015,38548,60857, 1325,61019, 177,60857,38305,61022, 59,61025, -17053,60857, 483,61028,10081,61031, 1009,60857,38305,61034, 1007,61037, - 1365,60857,38305,61040, 1325,61043,38566,60857, 59,61047,17054,60857, -10081,61051,42109,60857,38305,61054,42103,61057, 9527,60857, 483,61060, - 9525,61063,42110,60857,42103,61067, 9528,60857, 9525,61071, 386,60857, -56555,61074, 8150,60857, 113,61078, 347,60857,56555,61082,58905,60857, - 375,61086,45432,60857,56555,61090,43099,60857,56555,61094,40829,60857, - 1325,61099,40741,61099,40769,61099,60535,60857, 9,61107,57916,60857, - 9,61111,57851,60857, 9,61115,17727,60857, 113,61118,57060,60857, - 8309,60857,60230,60857,57986,60857,57998,60857,60268,60857,58352,60857, -58704,60857,13820,60857,13772,60857,57994,60857,58056,60857,42155,61144, -36101,60857, 375,61149,37407,60857,47392,60857,36532,60857,36536,60857, -57284,60857,58760,60857,58762,60857,58846,60857,58372,60857,57278,60857, -57996,60857,57470,60857, 305,61174,60205,60857, 305,61178,58374,60857, -58830,60857,57586,60857,57480,60857,57230,60857,57568,60857,40684,60857, -36542,60857, 375,61197,42990,60857,40038,60857,37498,60857,36754,60857, -35796,60857, 8225,60857, 8242,60857, 128,60857, 7971,61214, 101,60857, - 7971,61218,37362,60857,48122,60857,12526,60857, 6698,60857,47690,60857, -38704,60857,11943,60857, 9,61235,12343,60857, 5,61239, 4,61238, -61241,61243, 4,61239, 5,61238,61247,61249,40132,60857, 331,61253, - 59,61253, 97,61253, 1325,61253, 8148,60857,48753,61263,10081,61263, -11759,61263,39044,60857, 331,61271, 1325,61271, 571,61271, 59,61271, -42338,60857,48753,61281,44451,61281,10081,61281,42959,60857,48753,61289, -44451,61289,42825,61289,10081,61289, 629,60857,56555,61298,38305,61298, - 289,60857, 587,61305,10287,60857,17660,60857,10262,60857,40130,60857, - 331,61315, 59,61315, 1325,61315,53780,60857,48753,61323,10081,61323, -60668,60857, 9,61329, 8213,60857, 9,61332,11813,60857, 9,61337, -17030,60857, 8211,60857, 8301,60857, 8209,60857,38110,60857, 8052,60857, - 9,61350,10464,60857, 9,61355,10527,60857, 9,61359, 4727,60857, - 9,61363,11989,60857, 11,61367, 5,61368, 6,61367, 5,61372, - 5,61367, 6,61376, 6,61377, 7,61367,61381,61383, 15,61367, - 6,61366,61387,61389, 14,61367, 7,61366,61379,61395,61375,61395, -61371,61395,61393,61395,12371,60857, 5,61405, 4,61405, 12,61405, - 13,61404,61411,61413, 13,61405, 12,61404,61417,61419, 5,61404, -61409,61423, 4,61404,61407,61427, 6625,60857,44243,61430, 375,61430, - 75,61430, 9,61431, 6685,60857, 483,61440,46863,61440,17060,60857, -35768,60857,50524,60857,52806,60857,50480,60857,36296,60857,50990,60857, - 510,60857,56555,61460,47608,60857,36293,60857, 483,61466, 295,60857, -49713,61470, 1291,60857,61009,61475,61013,61475,20033,61475, 1831,61475, - 1881,61475,19319,61475, 4,61475,19317,61489,15899,61475, 4579,61475, -48561,60857, 9,61497, 922,60857,56555,61500,51937,60857, 375,61504, -57915,60857,57859,61508, 9,61511,39234,60857,60853,61515,60609,61515, - 9525,61515,42103,61515, 9517,61515,41989,61515,39485,61515,39481,61515, -57855,61515, 9519,61515,41995,61515,39487,61515, 15,61515, 9513,61541, -41941,61541,39477,61541,50958,60857, 9,61548,35761,60857, 9,61552, -35719,60857, 375,61557,57482,60857,57852,61561,57811,61561, 9,61564, - 9,61561,57811,61568,57522,60857, 483,61572,46863,61572, 1072,60857, - 1108,60857,49713,61580, 524,60857, 4,61585,19301,61587,19311,61585, - 3195,61585, 1965,61585,15899,61585, 4579,61585,40704,60857, 7,61601, -40799,61603,40813,61601, 7961,61601, 7951,61601, 7953,61601,35893,61601, -37897,61601,38299,61601, 1275,61601, 7947,61621,52756,60857, 1011,61624, -10245,60857,37339,60857, 33,60857,10385,61632, 9,61635, 7971,60857, - 101,61638, 128,61638, 9,61638, 113,61644, 483,61638,48753,61649, -10081,61649,11759,61649, 113,61638, 9,61656, 21,60857,38305,61660, - 331,61663, 59,61663, 97,61663, 1325,61663,47640,60857,56555,61672, -17635,60857,12377,61676,11731,60857,13737,61680, 567,60857,46863,61685, -55211,60857,44243,60857, 6625,61690,42383,61690,58116,61690,42155,61690, -56555,61698,56555,61690,42155,61702, 1505,60857,38057,61706, 288,60857, -46863,61711,48466,60857,56555,61714, 11,60857, 340,61719, 341,61719, - 264,61718,61721,61725, 7,61719, 265,61728,61725,61731, 265,61729, - 264,61719,61735,61737,56555,61719,57859,61741, 9,61743, 483,61718, - 4579,61747,15899,61747, 3195,61747, 1965,61747, 265,61719, 7,61756, -61725,61759,56555,61718,57852,61763,57811,61763, 9,61766, 9,61763, -57811,61770, 265,61718,61723,61775,46863,61775, 9,60857, 8213,61780, - 8052,61780, 7971,61780, 113,61786,36527,61780,58782,61780,58362,61780, - 8241,61780, 113,61780, 7971,61798,35761,61780,50958,61780, 483,61780, -56555,61806, 1011,61780,49713,61810,38305,61780,38299,61815,37897,61815, - 7961,61815, 7951,61815,35893,61815, 7953,61815, 1275,61815, 7947,61829, -49713,61780, 1011,61832,56555,61780,46863,61836, 483,61836,46863,61780, -56555,61842, 7563,60857, 1275,61847, 7565,61849, 7569,61849, 7573,61849, - 7065,60857,35187,61857,10089,60857, 16,61861, 16,61860, 17,61861, -61865,61867, 17,61860,61863,61871,10257,60857, 903,61874, 8241,60857, - 9,61878, 3255,60857, 9,61883,48789,60857, 16,61887, 16,61886, - 17,61887,61891,61893, 17,61886,61889,61897,37357,60857, 903,61900, - 3499,60857, 9,61905, 3445,60857, 9,61909,38184,60857, 375,61913, -16722,60857,16543,61917,16679,61917,16537,61917,35187,61916,13922,60857, -13753,61927, 4805,60857, 375,61930,16683,60857,16565,61934, 375,61934, - 6515,60857, 9,61941,59824,60857,60369,61945, 9,61945, 9520,60857, - 9,61951,16711,60857,16659,61954, 8,60856, 3,61959, 6,61960, -61601,61963,61815,61963, 6,61959, 3,61968,61601,61971,61815,61971, -61829,61959,61621,61959, 1274,61959,61815,61981,61601,61981, 16,60856, - 10,60856, 5,61989, 0,61990,61585,61993,61747,61993, 0,61989, - 5,61998,61585,62001,61747,62001,57811,61989,59933,61989,59743,61989, - 8093,61989, 3837,61989,39619,61989,51421,61989,53703,61989,42435,61989, - 4287,61989, 4303,61989,53487,61989,42113,61989, 9839,61989, 9579,61989, - 9,61989, 113,62036, 128,61989, 101,61989, 113,61989, 9,62044, -57859,60857,57915,62048, 9,62051, 9,62049,57915,62055, 11,60856, - 483,62059, 9,60856,57889,62063, 5185,62063,11243,62063,12557,62063, -11251,62063, 5177,62063, 16,60857,57293,62077,35603,62077,58669,62077, -59079,62077,55005,62077, 17,60856,61685,62089, 483,62089, 15,60856, -40829,62095, 10,60857,21183,62099, 759,62099, 47,62099, 959,62099, - 203,62099, 107,62099, 85,62099, 67,62099, 9,62115, 113,60857, - 8150,62118,17727,62118,13737,62118, 9,62118, 7971,62126,17025,62118, - 7971,62118, 9,62132,10385,60857, 9,62137, 33,62139, 33,62136, - 9,62143, 165,60857,17049,62146,17025,60857, 1275,62151, 7947,62153, -48739,62153,17637,62153,17029,62153,37241,62153, 113,62150,17049,60857, - 165,62166,10247,60857,37347,60857,10249,60857,16659,60857,16711,62176, -37408,60857,56555,62180,16531,62180, 340,60857,51803,62187, 331,62187, - 1325,62187, 59,62187,52439,60857,56555,62196,52563,60857, 265,62201, - 1413,60857,56555,62204, 256,60857,56555,62208,38305,62208, 566,60857, -61987,62215, 9377,62215,37325,62215,10219,62215, 959,62215, 47,62215, - 759,62215, 587,62215,20763,62215,42810,60857,43073,62235,42827,62235, -58703,62235,60849,62235,58027,62235,42821,62235, 1325,62235, 59,62235, - 331,62235, 265,62235,42613,62235,56555,62257, 241,62234, 580,60857, -20033,62263,59143,62263,60601,62263,58029,62263,55210,60857,31103,62273, -37375,60857, 1347,60857,37409,60857, 375,62280, 375,60857,58905,62284, -16683,62284, 4805,62284,58126,62284, 6625,62284, 2079,62284,51937,62284, - 305,62284,56555,62300,56555,62284, 305,62304,37409,62284, 803,60857, -37608,60857, 305,60857,60205,62314,57470,62314, 375,62314,56555,62320, -56555,62314, 375,62324,58116,60857,44243,62328,58126,60857, 375,62332, -42155,60857,58056,62336,44243,62336,56555,62340, 483,62336,48753,62345, -44451,62345,10081,62345,56555,62336,44243,62352,53517,60857, 483,62356, -48753,62359,10081,62359, 251,60857,38305,62364, 331,62367, 1325,62367, - 59,62367, 555,60857,38305,62374, 331,62377, 1325,62377, 571,62377, - 59,62377,60612,60857, 7,62387,36273,60857, 7,62391,59787,60857, -60619,62394, 9,62397, 5,62394,60369,62401, 9,62401, 5,62395, -60327,62407,60719,62407,57901,62407, 17,62407,59381,60857,60455,62416, - 7,62419, 9513,60857, 5,62423, 17,62425, 5,62422, 9,62429, -58362,60857, 903,62432, 9,62432,58348,60857, 7,62438,58782,60857, - 903,62442, 9,62442,58396,60857, 7,62448,58742,60857, 9,62453, - 483,62452,46863,62452,60763,60857, 7,62461, 903,60857,58782,62464, -58362,62464,37357,62464,10257,62464, 483,62464,56555,62474,46863,62464, -56555,62478,56555,62464, 9,62483,46863,62482, 483,62482,38057,62464, - 7,62491, 265,60857,46863,62495, 11,62497, 11,62494,46863,62501, - 7,62494,51803,62505, 331,62505, 1325,62505, 59,62505, 7,62495, - 375,62515,35187,60857,59960,62518,16722,62518, 7,62518,56555,62524, -16531,62524,56555,62518, 7,62530,16531,62518, 7,62534,46863,60857, -36527,62538,58742,62538,57522,62538,12377,62538, 6685,62538, 1011,62538, - 903,62538,56555,62552, 9,62538,56555,62556,56555,62538, 903,62560, - 9,62560,36527,60857, 7,62567, 331,62569, 9,62566,46863,62566, - 483,62566, 7,62566, 375,62579,38305,60857,42109,62582,42103,62585, - 1205,62583, 1203,62589, 1007,62583, 1009,62593, 1203,62582, 1205,62597, - 1009,62582, 1007,62601, 177,62582, 59,62605, 1365,62582, 1325,62609, - 571,62583, 555,62613, 97,62583, 21,62617, 5,62582, 6,62621, - 5,62622,62583,62625, 2,62622,62627,62629, 2,62621, 6,62632, - 482,62621, 3,62582, 6,62639, 3,62640,62583,62643, 4,62640, -62645,62647, 4,62639, 6,62650, 8,62639, 14,62582, 6,62657, - 2,62658, 2,62657, 6,62662, 482,62657, 1274,62582, 6,62669, - 4,62670, 4,62669, 6,62674, 8,62669, 256,62582, 629,62582, - 555,62582, 59,62685, 331,62685, 1325,62685, 571,62685, 21,62582, - 1325,62695, 331,62695, 59,62695, 97,62695, 1325,62583, 1365,62705, - 251,62705, 21,62705, 555,62705, 59,62583, 177,62715, 251,62715, - 555,62715, 21,62715, 251,62582, 331,62725, 59,62725, 1325,62725, - 331,62583, 251,62733, 555,62733, 21,62733, 15,62583,10085,62741, -10093,62741,62661,62741,62665,62741,40909,62741,62629,62741,62635,62741, - 3,62741,10087,62741,62637,62741,62667,62741, 483,62741,10081,62765, -62621,62765,62657,62765, 1275,62583,10005,62773,10041,62773,62673,62773, -62677,62773,62647,62773,62653,62773, 5,62773,10009,62773,23879,62773, -31937,62773,30399,62773,62655,62773,62679,62773, 9,62773,10001,62801, -62639,62801,62669,62801, 483,62582,39485,62809,39481,62809, 9525,62809, - 9517,62809, 4,62809,62773,62819,62787,62809,42103,62809,41989,62809, - 9519,62809,41995,62809,57855,62809,60853,62809,60609,62809,39487,62809, - 15,62809, 9513,62841,41941,62841,39477,62841, 9,62582,61971,62849, -61963,62849, 7961,62849, 7951,62849, 2,62849,62741,62859,62757,62849, - 7953,62849,35893,62849,38299,62849,37897,62849,61981,62849, 1275,62849, - 7947,62875,61959,62875, 6,62582, 7,62582,58703,62883,58027,62883, -60849,62883, 59,62883, 1325,62883, 331,62883, 265,62883,42613,62883, -56555,62899, 241,62882, 7,62583,58715,62905,58056,62905,40799,62905, - 375,62905,56555,62905,44243,62914,44243,62905,56555,62918, 265,62583, - 375,62923,62881,62923, 241,62582, 6,62928, 7,62928, 6,62929, -62933,62935, 7,62929,62931,62939, 1011,60857,52756,62942,46863,62942, - 483,62942, 9,62942,49713,62950,49713,62942, 9,62954, 7,62943, -10107,62959,53813,62959,49713,60857,22807,62965, 1108,62964, 295,62964, - 9,62964, 1011,62972, 1011,62964, 9,62976, 4,62964,31103,62981, - 241,60857,59960,62984,42810,62984, 7,62984,56555,62990,38305,62990, -56555,62984, 7,62996,38305,62984, 6,63000, 7,63000, 6,63001, -63005,63007, 7,63001,63003,63011, 483,60857, 9527,63014, 9525,63017, -17053,63014,10081,63021,11759,63015, 7971,63025,44451,63015,42155,63029, - 0,63014, 5,63033, 0,63034,63015,63037, 7,63034,63039,63041, - 7,63033, 5,63044, 10,63033, 6,63014, 5,63051, 6,63052, -63015,63055, 1,63052,63057,63059, 1,63051, 5,63062,38304,63051, - 14,63014, 5,63069, 1,63070, 1,63069, 5,63074,38304,63069, -36527,63014,58742,63014,57522,63014,12377,63014, 6685,63014, 7971,63014, -48753,63091,10081,63091,11759,63091,42155,63014,10081,63099,48753,63099, -44451,63099,10081,63015,17053,63107,53517,63107,42155,63107, 7971,63107, -53517,63014,48753,63117,10081,63117,48753,63015,53517,63123, 7971,63123, -42155,63123,36293,63014, 17,63015, 11,63015, 9,63014,56555,63136, - 15,63015, 1995,63141, 3755,63141,63073,63141,63077,63141, 5303,63141, -63059,63141,63065,63141, 0,63141,38403,63141,39943,63141, 4917,63141, -17013,63141,63067,63141,63079,63141,38305,63141, 59,63171,63051,63171, -63069,63171, 903,63014,56555,63178, 1011,63014, 11,63014,61993,63185, -62001,63185, 3195,63185, 1965,63185, 1,63185,63141,63195,63157,63185, - 4579,63185,15899,63185,38305,63014,39481,63205,39485,63205,42103,63205, -41989,63205, 7,63205, 9525,63205, 9517,63205,41995,63205, 9519,63205, -57855,63205,60609,63205,60853,63205,39487,63205, 15,63205,41941,63233, - 9513,63233,39477,63233, 4,63014,20033,63241,59143,63241,60601,63241, -58029,63241,63133,63241, 5,63014,61987,63253, 9377,63253,37325,63253, -10219,63253, 959,63253, 47,63253, 759,63253, 587,63253,20763,63253, - 4,63015, 7,63272,63253,63275,20029,63273,59147,63273,21103,63273, -19781,63273,19301,63273,62773,63273, 5,63015, 803,63291,56555,63014, - 903,63294, 9,63294,40674,60857, 6,63300, 7,63300, 6,63301, -63305,63307, 7,63301,63303,63311,38266,60857, 7,63315,36752,60857, - 7,63318,16937,60857, 580,63322, 483,63322, 4,63327, 4,63326, -49631,63322,49630,63322, 581,63322, 4,63322, 483,63338,46863,63338, - 5,63322,63329,63345, 4,63323,63333,63349,63337,63349, 5,63323, -63335,63355,63325,63355,63331,63355,63341,63355,63343,63355,46863,63322, - 4,63366,63355,63369, 4,63367,63345,63373,38057,60857, 5,63376, - 6,63379, 6,63378, 14,63376, 15,63376, 1505,63376, 6,63376, - 5,63390, 7,63376,63381,63395, 375,63395, 6,63377,63387,63401, - 7,63377,63393,63405,63383,63405,38161,63405, 59,63405,63385,63405, - 331,63405, 1325,63405, 265,63405, 903,63376, 7,63423,16531,60857, - 1275,63427,16711,63429,37408,63426, 7,63426,16543,63435,16679,63435, -16537,63435,35187,63434, 7,63427,16565,63445,35187,63426, 7,63448, -12377,60857, 9,63453,46863,63452, 483,63452,17635,63452,13737,60857, - 113,63462,11731,63462, 5,63462,13753,63469, 5,63463,13751,63473, -13917,63473,13743,63473,60619,60857,59787,63480, 9,63483,60455,60857, -59381,63486, 7,63489, 5,60856,45491,63493,42800,63493,59694,63493, -10374,63493,60563,63493, 9606,63493,42134,63493, 629,63493, 705,63493, - 101,63493, 299,63493, 828,63493, 128,63493, 394,63493,48122,63493, - 803,63493, 483,63524,42613,63493, 17,63528,51992,63493, 375,63493, - 241,63534,49713,63534,10291,63493, 17,63540, 256,63493, 113,63493, - 9,63546, 17,63493,42613,63550,10291,63550,59619,63550, 9565,63550, -41941,63550, 9,63493, 113,63562, 7,63493,21605,63567, 241,63566, - 7,63492,59933,63573,59743,63573,57811,63573, 8093,63573, 3837,63573, -53703,63573, 4287,63573,42435,63573, 4303,63573,53487,63573, 9839,63573, -42113,63573, 9579,63573,39619,63573,51421,63573,31103,63493,46863,63493, -12377,63606, 483,63493, 803,63610,49713,63493, 375,63614,56555,63493, - 5,63619, 6,63621, 6,63620, 14,63619, 15,63619, 6,63618, -63629,63631, 7,63618,63625,63635,63627,63635, 7,63619,63623,63641, - 6,63619, 5,63644,63635,63647, 241,63493, 375,63650, 7,63650, -59619,63493, 7,63657, 17,63656,12377,63493,46863,63662, 9565,63493, - 7,63667, 17,63666,41941,63493, 7,63673, 17,63672, 4,60856, -20305,63679, 9641,63679, 9645,63679,20309,63679,21081,63679,20323,63679, -20387,63679, 3,63679, 6,63694,61601,63697,61815,63697,62849,63697, - 6,63695, 9701,63679, 1274,63679,61815,63709,61601,63709,62849,63709, -61829,63679,61621,63679,62875,63679, 9719,63679,43005,63679,58056,63679, - 386,63679, 347,63679, 767,63679,31103,63733, 524,63679, 9617,63737, -20273,63737, 1291,63679, 9617,63743,20273,63743, 305,63679, 375,63748, - 375,63679, 305,63752,44243,63679,56555,63756, 11,63679, 483,63760, - 9617,63763,20273,63763, 7,63679,38305,63769,56555,63771, 6,63679, - 4,63775, 3,63774,61601,63779,61815,63779,62849,63779, 4,63774, -62582,63787,63779,63789,38305,63787,60857,63792,63779,63795,60857,63787, -38305,63798,63779,63801, 7,63678,63253,63805,62215,63805, 483,63679, - 11,63810, 9617,63813,20273,63813,56555,63679,44243,63818, 7,60856, -40787,63823,40793,63823, 0,63823, 5,63828,61475,63831,61585,63831, -61747,63831,63185,63831,36001,63823,26106,63823,32103,63823,41746,63823, -43005,63823, 8800,63823,59910,63823,36539,63823,37595,63823,36049,63823, -63253,63823,62215,63823,61305,63823,48975,63823,48245,63823,48451,63823, -60707,63823, 386,63823, 347,63823, 510,63823,60755,63823, 9852,63823, -53500,63823,36041,63823,37573,63823,36275,63823, 375,63823, 305,63892, - 273,63823, 281,63823, 1477,63823, 1516,63823, 948,63823,40704,63823, -10001,63907,27533,63907, 8495,63823, 11,63912,48885,63823, 483,63917, -41019,63823, 11,63920, 567,63823,63493,63925, 165,63823, 903,63928, - 11,63823,25793,63932,41019,63932, 8495,63932,59875,63932, 9805,63932, -53391,63932,60618,63823, 483,63947, 9,63823, 483,63950,38305,63950, -27533,63955,10001,63955, 1505,63823, 1011,63960, 305,63823, 375,63964, - 4,63823,63610,63969,63291,63969,63493,63969, 483,63974, 483,63969, -63493,63978,56555,63968, 483,63983, 5,63823, 7,63987, 1275,63989, -60857,63991, 0,63986,61475,63995,61585,63995,61747,63995,63185,63995, -63993,63995, 7,63986,63014,64007,63995,64009, 483,64007,60857,64012, -63995,64015,60857,64007, 483,64018,63995,64021, 4,63822,63253,64025, -62215,64025, 5,63822,59743,64031,59933,64031,57811,64031, 8093,64031, - 3837,64031,42435,64031, 4303,64031,53703,64031, 4287,64031,42113,64031, - 9579,64031,53487,64031, 9839,64031,51421,64031,39619,64031,25793,63823, - 11,64062, 903,63823, 165,64066,38305,63823, 9,64070,27533,64073, -10001,64073, 1011,63823, 1505,64078,56555,63823, 4,64082, 483,64085, - 483,63823, 9,64088,59875,63823, 11,64092, 5,64093, 9805,63823, - 11,64098, 5,64099,53391,63823, 11,64104, 5,64105, 6,60856, -60454,64111,60369,64113, 5,64111,56555,64116,60369,64119,56555,64111, - 17,64122, 4,64122, 7,64126, 5,64122,60369,64131, 5,64123, -60327,64135,60719,64135,64129,64135,57901,64135, 4,64123,64125,64145, - 7,60857,16539,64149,16683,64151, 264,64149, 264,64148, 3,64149, -16530,64158,16530,64159, 1,64158,58396,64148,58348,64148,36527,64148, - 375,64171,40674,64148,36752,64148, 331,64149, 1325,64149, 59,64149, -38057,64148, 375,64185,16531,64148,64161,64189,16543,64189,16679,64189, -16537,64189,35187,64188, 17,64149, 241,64201,38305,64149,42383,64205, - 6625,64205,58116,64205,42155,64205,56555,64212,56555,64205,42155,64216, -16531,64149,64163,64221,16659,64221,48885,64149,56555,64227, 15,64149, - 483,64231,38305,64231,27533,64235,64165,64235,10001,64235,35187,64148, -56555,64242,16531,64242, 265,64148,64155,64249,51803,64249, 331,64249, - 1325,64249, 59,64249, 241,64148,56555,64260,38305,64260,38305,64148, -58703,64267,58027,64267,60849,64267, 59,64267, 1325,64267, 331,64267, - 265,64267,42613,64267,56555,64283, 241,64266, 265,64149,64157,64289, -41941,64289,51229,64289, 4213,64289, 8757,64289, 9565,64289,59619,64289, - 305,64289, 713,64289, 25,64289, 8165,64289, 9617,64289,20273,64289, - 4,64148,57293,64317,35603,64317,58669,64317,59079,64317,55005,64317, - 5,64148, 3,64329, 1,64331,64205,64333,21183,64329, 759,64329, - 47,64329, 959,64329, 4,64149,43053,64345,54985,64345,54129,64345, -51601,64345,58782,64345,46863,64345,56555,64356,56555,64345,46863,64360, - 5,64149, 803,64365, 1275,64149, 9,64369,56555,64148,25793,64373, - 8495,64373,41019,64373,35187,64372, 241,64372,59960,60857,25793,64385, -41019,64385, 8495,64385, 241,64384,35187,64384, 5,60857,60079,64396, -60369,64399, 0,64396,63743,64403, 1290,64403,63679,64407,63737,64403, - 525,64403,63679,64413,63763,64403,63813,64403, 17,64403, 1275,64420, -63679,64423, 1275,64403, 17,64426,63679,64429, 3,64396, 6,64433, - 759,64397, 483,64437,64025,64397, 483,64441,63823,64397, 483,64445, - 9377,64397, 483,64449, 9513,64396, 9,64453, 959,64397, 483,64457, -37325,64397, 483,64461, 47,64397, 483,64465,10219,64397, 483,64469, -59787,64396,60369,64473, 9,64473,13737,64396,13753,64479,49713,64397, -61987,64397, 483,64485, 9,64397,42613,64489,59619,64489,10291,64489, - 9565,64489,41941,64489, 17,64397, 113,64501,63805,64397, 483,64505, -20763,64397, 483,64509, 483,64396,64025,64513,63823,64513,61987,64513, -63805,64513, 9377,64513,37325,64513,10219,64513, 959,64513, 47,64513, - 759,64513, 587,64513,20763,64513, 587,64397, 483,64539, 7,64396, -21183,64543, 759,64543, 47,64543, 959,64543, 6,64397,56555,64553, - 4,64554, 5,64554, 5,64555,64557,64561, 4,64555,64559,64565, - 7,64397, 0,64569, 5,64570, 5,64569, 0,64574,21105,64569, -21549,64569,19625,64569, 1275,64569,60857,64585,64573,64587,64577,64587, -63679,64397,63705,64593,64435,64593,31103,64593, 375,64593, 7,64593, -64433,64603, 903,64397, 375,64607, 7,64607,35187,64397,60796,64612, -60797,64612,31103,64613,60797,64613,64615,64621, 375,64613,60796,64613, -64617,64627,56555,64397,59787,64631, 9,64633,56555,64396,59914,64637, -60221,64637,59875,64637, 9,64642,60369,64637, 9,64637,59875,64648, -60454,60857,59914,64653,60221,64653,59875,64653, 9,64658,60369,64653, - 9,64653,59875,64664, 4,60857, 8743,64669, 8605,64669, 8672,64669, - 8647,64669, 305,64676, 3795,64669,10025,64669,27603,64669,31524,64669, -31690,64669,31700,64669,63569,64669,46862,64669, 0,64669, 2,64696, - 6,64696, 6,64697,63604,64669,24655,64669,63534,64669, 8916,64669, -62092,64669,63133,64669,48408,64669, 713,64669,31103,64718, 305,64669, - 8647,64722,31103,64722, 25,64669,31103,64728, 340,64669, 8717,64733, - 3785,64733, 8495,64733, 483,64669,62089,64740,46863,64740, 375,64669, -63493,64746, 8861,64746,62089,64669, 483,64752, 15,64669, 483,64757, -20273,64759, 9617,64759,64403,64759,64699,64759,31103,64669, 305,64768, - 713,64768, 25,64768,63493,64768,49713,64769, 483,64668,20033,64781, -59143,64781,58029,64781,60601,64781,49713,64668,31103,64791,46863,64669, - 483,64794, 6,64668,64795,64799, 2,64801, 3,64800,64803,64805, - 3,64801, 2,64800,64809,64811, 7,64668,57293,64815,64695,64815, - 2,64819, 3,64818,64821,64823, 3,64819, 2,64818,64827,64829, -64701,64815, 2,64833, 3,64832,64835,64837, 3,64833, 2,64832, -64841,64843,35603,64815,59079,64815,58669,64815,55005,64815, 6,64669, - 0,64854,64815,64857, 2,64859, 3,64858,64861,64863, 3,64859, - 2,64858,64867,64869, 7,64669,60857,64873, 264,64874, 264,64875, - 1,64873, 264,64880, 264,64881,64703,64873, 2,64887, 3,64886, -64889,64891, 3,64887, 2,64886,64895,64897,25793,64873,41019,64873, - 8495,64873, 305,64905,59875,64873,53391,64873, 9805,64873,38305,64873, - 483,64915, 265,64872, 8717,64919,64883,64919,64877,64919, 3785,64919, - 8495,64919, 265,64873,64885,64931,64879,64931,63493,64931, 8861,64931, -46863,64931, 8861,64669, 375,64942,63493,64669,31103,64946, 375,64946, - 265,64669, 7,64952, 8717,64955, 3785,64955, 8495,64955, 7,64953, - 8647,64963,56555,64669,59381,64967, 7,64969,56555,64668,31103,64973, - 375,64973,59712,64973, 7,64973, 265,64981,59619,64980,59619,64973, - 7,64986,60618,60857,31103,64991, 375,64991,59712,64991, 7,64991, - 265,64999,59619,64998,59619,64991, 7,65004, 6,60857, 264,65009, -64746,65011, 375,65011,64669,65014,64931,65011,64669,65011, 375,65020, - 264,65008,64733,65025, 341,65025,64669,65029,64955,65025,64919,65025, - 3,65008, 341,65037,64669,65039,63907,65037,40705,65037,63823,65045, -64235,65037,63955,65037,64073,65037, 17,65037,64953,65009, 375,65057, - 4,65009, 1274,65061, 3,65061, 6,65064, 6,65061, 3,65068, -56555,65008,60796,60857,56555,60857, 386,65076,45432,65076, 347,65076, -43099,65076,60418,65077,60327,65087,59961,65077, 5,65091,60369,65093, - 5,65090,60327,65097, 18,65076, 12,65076, 1291,65076,48561,65076, - 525,65076,49630,65076, 580,65076, 1170,65076,37408,65076, 256,65076, -52439,65076, 629,65076, 1413,65076,47640,65076, 922,65076,49631,65076, - 581,65076, 1171,65076,44243,65076,42155,65136, 375,65076, 305,65140, -48466,65076, 510,65076, 13,65077,65103,65149, 19,65077,65101,65153, - 13,65076, 18,65077, 19,65076,65159,65161, 12,65077,65157,65165, -57915,65165, 14,65077,57901,65171,60719,65171,60327,65171,65115,65171, - 17,65171, 10,65077, 9,65183, 16,65076,65171,65187, 10,65076, -65165,65191,48560,65076, 524,65076, 1290,65076, 11,65076,65149,65201, -57852,65201,65184,65201,65183,65201, 9,65208,57811,65201, 9,65212, - 9,65201,65183,65216,57811,65216,46863,65200, 483,65200, 9,65076, - 483,65226,46863,65226, 17,65076, 1275,65232, 11,65077,65191,65237, - 9,65239,57915,65237, 9,65243, 9,65236,65191,65247,57915,65247, - 9,65077, 11,65253,65183,65255,57811,65255, 11,65252,65191,65261, -57915,65261, 15,65077,65233,65267,65135,65267, 305,65076, 375,65272, -42155,65076,44243,65276, 1011,65076, 7,65281, 7,65280,65171,65285, - 15,65281, 241,65076, 7,65290, 483,65076, 4,65295, 4,65294, - 903,65294, 9,65294, 11,65294, 903,65076, 9,65307,46863,65306, - 483,65306,35187,65076, 7,65314, 1275,65076, 17,65318,46863,65076, - 4,65323, 4,65322, 903,65322, 9,65322, 11,65322, 7,65077, - 9,65335, 11,65335, 567,65335, 4,65335, 483,65343, 5,65335, - 5,65334,65343,65349, 4,65334,65347,65353, 6,65076,65350,65357, -65355,65357,65289,65357,65349,65357,65343,65364,65343,65357,65349,65368, - 11,65357,65346,65357,65353,65375, 5,65357,65335,65379,65349,65381, -65335,65378,65353,65385,65335,65357, 4,65389, 5,65389,65343,65393, - 4,65388,65393,65397, 5,65388,65391,65401,65353,65401, 5,65077, -60629,65407,59960,65406,59960,65407,38185,65407,57993,65407,65115,65407, -65113,65407,65111,65407,59961,65406,65413,65425,60327,65425,65197,65407, -65195,65407,65105,65407,60251,65407,58313,65407,65299,65407,65327,65407, -65285,65407,65225,65407,65223,65407,65305,65407,65333,65407,56555,65407, - 7,65454, 7,65455,59961,65407,60359,65461,65411,65461, 11,65461, - 1171,65407,65335,65469,65335,65407,65187,65407,57901,65407,60327,65407, -60719,65407, 17,65407,65335,65483,59875,65483,64385,65407,64373,65407, - 6,65407,65459,65493,60755,65493,65283,65493, 11,65493, 7,65407, -56555,65502, 7,65406,65461,65507,65493,65507, 6,65406,65505,65513, -65457,65513,60719,65513,65413,65513,60327,65513,57901,65513,65187,65513, -65115,65513,65285,65513,65503,65513, 17,65513, 4,65076, 2,65537, - 7,65539,65407,65541,65510,65537,65533,65537,65507,65537,65493,65548, -31103,65537,65493,65537,65507,65554, 483,65536,65407,65559,46863,65536, -65407,65563, 375,65537, 15,65537,65357,65569, 7,65536,65513,65573, -65171,65573,65407,65573,59712,65537,65502,65537,65513,65583, 7,65537, -65493,65587,65407,65587,65507,65591, 265,65587,59619,65586,65407,65586, -65513,65599,59619,65537, 7,65602,65407,65537, 6,65607, 7,65607, -65493,65611, 6,65606,65611,65615, 7,65606,65609,65619,65513,65619, - 4,65077,65135,65625,65133,65625,65131,65625,65372,65625,65199,65625, -65109,65625,65107,65625,65235,65625,65321,65625, 11,65625,65357,65644, -65233,65625,65357,65625, 11,65650,65075,65625,65073,65625, 7,65625, -60455,65625, 7,65661, 5,65076, 2,65664,65625,65667, 1,65664, - 3,65664, 0,65664,65625,65675,59914,65665,60221,65665,65336,65665, -65297,65665,65325,65665,59875,65665, 9,65688,65659,65665,65667,65693, -65675,65693,60369,65665, 9,65665,65335,65700,59875,65700,65335,65665, - 9,65706,65658,65665,65671,65711,65673,65711, 6,65665,65668,65717, -65676,65717,65667,65717,65625,65722,65675,65717,65625,65726,65625,65717, -65667,65730,65675,65730, 7,65665,65671,65737,65625,65739,65673,65737, -65625,65743,65625,65736,65671,65747,65673,65747,65625,65665, 6,65753, - 7,65753, 6,65752,65757,65759, 7,65752,65671,65763,65673,65763, -65755,65763, 6,65077,60619,65771, 9,65773, 17,65771,65625,65777, -65537,65771, 9,65781, 5,65771,60369,65785, 9,65785, 5,65770, -65573,65791,60327,65791,60719,65791,57901,65791,65187,65791,65115,65791, -65285,65791, 17,65791, 7,65076,25793,65809,41019,65809, 8495,65809, - 1011,65808,65513,65817,65791,65817,65407,65817,65171,65817, 241,65808, -35187,65808, 15,65809,65665,65831,65407,65809, 11,65835, 4,65808, -65791,65839,65513,65839,65171,65839,65407,65839, 4,65809,65785,65849, -65665,65849,65771,65809, 4,65855, 5,65855, 4,65854,65859,65861, - 5,65854,65857,65865, 1, 4,49284,65869,49311,65869,48330,65869, -48279,65869,47548,65869,47076,65869,47078,65869,48581,65869,48584,65869, -54254,65869,54260,65869,54266,65869,54222,65869, 8672,65869, 8743,65869, - 3795,65869, 8605,65869, 8647,65869, 305,65904,27021,65868,31103,65909, -27377,65910,31894,65909,27377,65909,31103,65916, 21,65868,57577,65921, -59109,65921,19987,65921,57381,65921,59787,65868,57577,65931,57381,65931, -57253,65931,59109,65931,15390,65869,15383,65941,44768,65869,44663,65945, -48284,65869,37897,65949,44243,65869,37845,65953,45411,65955,37845,65952, -44663,65959,37845,65869,44243,65963,45381,65965,44243,65962,44663,65969, -46863,65962,37897,65973, 1175,65869,56555,65977, 1177,65979,49215,65869, - 9,65983,49229,65985,56709,65869, 1009,65989,54641,65869,54643,65993, -60737,65868,60749,65997,11355,65868,11495,66001,57793,65868,57577,66005, -57381,66005,59109,66005,59715,65869,56555,66013,59717,66015, 7959,65869, - 9,66019, 7961,66021,49534,65869,49537,66025,19086,65869, 1203,66029, -49529,65869, 15,66032,49537,66035,19064,65869, 1009,66039,54668,65869, -54643,66043, 1205,65869,18967,66046, 1203,66049,19949,65868,19987,66053, - 1425,65868,57253,66057, 668,65868, 1,66061, 2,66062, 2,66061, - 1,66066,56554,66061,58930,65868, 4,66073, 6,66074, 6,66073, - 4,66078, 8,66073,19965,65868,19987,66085,56745,65868,57253,66089, -60136,65869,59787,66093, 571,65869,18967,66096, 555,66099,16091,65869, - 15,66102, 9513,66105,19078,65869, 21,66109,54655,65869, 15,66112, -54643,66115, 1007,65869,18967,66118, 1009,66121,60125,65869, 15,66124, -59787,66127,19088,65869, 555,66131,16092,65869, 9513,66135, 97,65869, -18967,66138, 21,66141,20347,65869,18967,66144,20345,66147,10095,65869, - 15,66150,10093,66153,20348,65869,20345,66157,10096,65869,10093,66161, -32468,65869,27323,66165,33442,65869,48368,65869,32469,65869,65909,66173, -28483,65869,28479,65869,63604,65869,31690,65869,31700,65869,31524,65869, -31596,65869,32464,65869,53380,65869,25037,65869,24655,65869,25457,65869, -23005,65869,27603,65869,22591,65869,23105,65869,23357,65869,23113,65869, - 120,65869,46863,66212, 77,65869,46863,66216,54154,65869,54225,66220, -56328,65869,58298,65869,58868,65869,52752,65869,52370,65869,58344,65869, -57253,65869,59787,66237, 1425,66237,56745,66237,19987,65869, 21,66245, -19949,66245,19965,66245,25215,65869,48583,65869, 113,66254,25459,65869, -31920,65869,32263,65869,23099,65869,23107,65869,24631,65869,22915,65869, -22589,65869,65294,65869,65322,65869,63534,65869,54256,65869,54129,66280, -25305,65869,32295,65869,31796,65869,62092,65869,63133,65869,22785,65869, -22803,65869,22951,65869,24735,65869,23012,65869,25546,65869,47364,65869, -25548,65869,62442,65869,63294,65869,62432,65869,62560,65869,57577,65869, - 21,66319,59787,66319,57793,66319,57381,65869,59787,66327, 21,66327, -57793,66327,59109,65869, 21,66335,59787,66335,57793,66335,48578,65869, - 33,66343,48276,65869, 33,66347,49308,65869, 33,66351,59340,65869, -63135,65869,61464,65869,61580,65869,61578,65869,62946,65869,62950,65869, -62550,65869,61810,65869,63182,65869,62948,65869,57660,65869,57766,65869, -62060,65869,57772,65869,22767,65869,19810,65869, 251,66387, 555,66387, - 1365,66387, 21,66387, 9994,65869, 9513,66397,16859,66397,59787,66397, -20620,65869,59787,66405,21529,66405, 9513,66405,19372,65869, 251,66413, - 21,66413, 177,66413, 555,66413,20823,65869,59787,66423,21529,66423, -20771,66423, 9513,66423,57971,65869, 21,66433, 251,66433, 177,66433, - 159,66433, 555,66433,25303,65869, 11,66445,24739,65869,29028,65869, -57658,65869,57620,65869,48328,65869, 113,66456,19806,65869, 251,66461, - 555,66461, 21,66461, 8916,65869,54262,65869,46863,66470,54219,65869, -46863,66474,32556,65869, 759,66479, 7061,65869, 3,66483, 2,66483, - 842,66483, 843,66482,66489,66491, 843,66483, 842,66482,66495,66497, - 3,66482,66487,66501, 2,66482,66485,66505,47546,65869, 25,66508, -49283,65869, 25,66512,47600,65869,48444,65869,47572,65869,62146,65869, -17476,65869,23010,65869,63184,65869,61584,65869,48558,65869,47408,65869, -25460,65869,61474,65869,47372,65869,61746,65869,47632,65869,17538,65869, -47634,65869,47676,65869,48112,65869,47412,65869, 5886,65869,48095,65869, - 1072,65869,60857,66560,48408,65869,49713,66564, 241,66564, 587,66565, - 903,66564,48420,65869,61780,65869, 1011,66576,47640,65869, 1011,66580, - 483,66580,47590,65869, 483,66586,47672,65869,47368,65869, 1413,65869, -46863,66594,52692,65869,46863,66598,47370,65869, 922,65869,46863,66604, -49075,65869,49395,65869,48586,65869,10025,65869, 1281,65869,46863,66616, - 1291,65869,60857,66620, 669,65869,66065,66625,66069,66625,40909,66625, - 1821,66625, 1879,66625,38973,66625, 3,66625,38971,66639,57911,66625, -17041,66625, 4897,66625,56739,66625,66071,66625,56555,66625, 671,66653, -66061,66653,25381,65869, 11,66659, 11,66658,58931,65869,66077,66665, -66081,66665,58715,66665,58975,66665,58981,66665,59089,66665, 7,66665, -59079,66679,23879,66665,30399,66665,31937,66665,58983,66665,66083,66665, - 9,66665,58967,66693,66073,66693,58782,65869,49713,66698,60857,66698, - 11,66699, 1108,65869,60857,66706,62089,65869, 483,66710, 4802,65869, - 5314,65869,17670,65869,17693,65869,62059,65869, 483,66722,47608,65869, -60857,66726, 903,66726, 11,66727, 587,66726,19474,65869,10093,66737, -20345,66737,10085,66737,20281,66737,19549,66737,19553,66737,10087,66737, -20285,66737,19555,66737, 483,66737,20273,66757,10081,66757,19545,66757, -61718,65869, 483,66764,22957,65869, 903,66768, 587,66768,62538,65869, -56555,66774, 1011,66774, 288,65869, 9,66781,19916,65869, 7,66785, -35603,66787,35613,66785,10041,66785,10005,66785,10009,66785,23879,66785, -30399,66785,31937,66785, 9,66785,10001,66805,63014,65869,56555,66808, - 11,66809, 587,66809, 1011,66808, 11,66808,48534,65869, 1011,66820, - 1418,65869, 3,66825,38903,66827,38913,66825, 3587,66825, 1989,66825, -56681,66825,57911,66825,17041,66825, 4897,66825,56555,66825, 1471,66845, - 1086,65869,46863,66848, 524,65869,60857,66852, 1304,65869, 9,66857, - 1530,65869, 9,66861, 9195,65869,31103,66864,10031,65869,27641,65869, - 713,65869,31103,66872, 1447,65869,13737,66877, 9875,65869, 15,66880, - 9513,66883,16859,66883,59787,66883, 803,66881, 1325,65869,18967,66892, - 251,66895, 555,66895, 1365,66895, 21,66895,16937,65869,46863,66904, - 1505,65869,28715,66908, 5438,65869,49162,65869, 113,65869,48583,66916, -48328,66916, 25,66916,46863,66922,46863,66916, 25,66926, 375,65869, -63493,66930, 8861,66930,58334,65869,46863,66936,58362,65869,60857,66940, - 506,65869,46863,66944, 587,65869, 759,66949,31103,66951,31103,66948, - 759,66955,22957,66948,47608,66948,46863,66948, 1011,66962, 1011,66948, -46863,66966, 1369,65869, 15,66970, 4897,66973,17041,66973, 3587,66973, - 1989,66973,57911,66973,56681,66973,56555,66973, 1471,66987, 1275,66970, - 9,66991, 1275,65869,18967,66994,31937,66997,30399,66997,10041,66997, -10005,66997,23879,66997,10009,66997, 9,66997,10001,67011, 11,66994, - 9,67015, 9,66995, 11,67019, 1369,67019, 1369,66994, 9,67025, - 483,65869,32805,67028,56156,67028,65076,67028,25545,67028,62089,67028, -62942,67028,62059,67028,47590,67028,47640,67028,17669,67028, 5313,67028, - 4801,67028, 587,67029,46863,67055,61718,67028,49713,67028,46863,67060, - 1011,67028,60857,67064, 903,67028,46863,67068,46863,67028,49713,67072, - 587,67073, 241,67072, 903,67072,60857,67028,56555,67082, 587,67083, - 11,67083, 1011,67082, 11,67082, 11,67028,60857,67094, 5325,67028, -56555,67028,60857,67100, 241,67028,46863,67104, 4593,67028,11985,67028, - 5843,67028,49155,67028, 5876,65869,49155,65869, 483,67118, 6267,65869, - 9,67123, 6367,67125, 6403,67125, 6407,67125,60419,65869,56555,67133, -60425,67135,60429,67135,60433,67135, 5325,65869, 483,67142,55005,65869, - 9,67147, 5843,65869,56555,67150, 1011,67150, 483,67150,12023,65869, -11986,65869, 4608,65869,11985,65869, 483,67164, 3681,65869,56555,67168, - 3709,65869,56555,67172, 3357,65869,56555,67176,52840,65869, 4593,65869, - 483,67182,54202,65869,54159,67187,46863,67189, 4801,65869, 483,67192, -54129,65869,54256,67196,46863,67196,54225,67200,54225,67196,46863,67204, -17669,65869, 483,67208, 5313,65869,56555,67212, 483,67212,15309,65869, - 413,67218,15383,67221, 413,67219,15335,67225,54225,65869,54154,67228, -46863,67228,54129,67232,54129,67228,46863,67236, 1274,65868, 6,67241, - 4,67242,66785,67245,66997,67245, 4,67241, 6,67250,66785,67253, -66997,67253,67011,67241,66805,67241, 8,67241,66997,67263,66785,67263, - 1368,65868, 1,67269, 2,67270,66825,67273,66973,67273, 2,67269, - 1,67278,66825,67281,66973,67281,66987,67269,66845,67269,56554,67269, -66973,67291,66825,67291, 586,65868,24265,67297,28233,67297,29077,67297, -19559,67297, 8251,67297,20361,67297, 9673,67297,20713,67297, 4283,67297, - 9967,67297, 4279,67297, 3807,67297, 482,65869, 903,67323, 1,67325, - 0,67325, 1,67324,67329,67331, 0,67324,67327,67335, 587,65868, -31690,67339,31103,67339, 713,67342, 713,67339,31103,67346,48408,67339, -46863,67339, 483,67352, 483,67339,46863,67356, 483,65868,57577,67361, -57253,67361,19987,67361,59109,67361,57381,67361, 1369,65868, 1275,65868, -47953,67375,48062,67375,47961,67375,48009,67380,48009,67375,47961,67384, -47580,67375,47933,67389,46863,67375, 265,67393,48009,67395, 265,67392, -47933,67399, 265,67375,46863,67403,47961,67405,46863,67402,47933,67409, - 1368,65869,48009,67413,49321,67413,49001,67413, 265,67413,46863,67421, - 586,65869,58056,67425,58601,67425,40799,67425,44243,67425,56555,67432, -35927,67425,38155,67425,37611,67425, 375,67425, 510,67425, 9,67425, - 483,67446,56555,67425,44243,67450, 483,67425, 9,67454, 843,65869, - 9,67459,15705,65869, 9,67463,10001,67465,13755,67465,15733,67465, -27533,67465,17455,65869,56555,67474, 1347,67474, 1011,67474, 767,65869, -56555,67483, 1471,67485, 253,67485, 809,67485, 771,67485, 53,67485, - 1347,65869,17455,67496, 567,65869, 9,67501,10033,65869,27691,65869, -10035,65869,27978,65869,26331,67511,23755,67511,27805,67511, 256,65869, -25793,67519,59875,67519,41019,67519, 8495,67519,53391,67519, 9805,67519, - 972,65869,25793,67533,41019,67533, 8495,67533,20762,65869,58715,67541, - 375,67541, 154,65869,40909,67547,49204,65869, 11,67550, 33,67553, - 11,67551, 25,67557, 1369,67551,37409,67551, 340,65869,25793,67565, -41019,67565, 8717,67565, 8495,67565, 3785,67565,49514,65869, 66,65869, - 33,67579,46863,67581,46863,67578, 33,67585, 112,65869,44243,67589, -27785,65869, 257,65869,67373,67595,31103,67594,31103,65869,27021,67601, -27377,67603,27021,67600,27323,67607, 25,67600, 713,67600, 305,67600, -63493,67600, 8861,67600, 9195,67600,52915,67600, 1369,67601, 587,67601, - 713,67627, 903,67600, 241,67600, 587,67600, 759,67635,49713,67600, - 257,67600, 165,65869,60857,67642,31926,65869,27021,65869,27323,67649, -31103,67651,31103,67648,27323,67655,52915,65869,31103,67658, 305,65869, - 8647,67662,31103,67662, 25,65869,49283,67668,47546,67668,31103,67668, - 113,67668,46863,67676,46863,67668, 113,67680,20501,65869, 15,67684, -59787,67687,21529,67687, 9513,67687, 803,67685, 1141,65869,13737,67697, - 33,65869,13737,67701, 331,65869,18967,67704, 251,67707, 21,67707, - 555,67707, 59,65869,18967,67714, 251,67717, 21,67717, 177,67717, - 555,67717, 8861,65869,60796,67727,60797,67727,60796,67726,67731,67733, -31103,67726,60797,67726,67729,67739, 375,67726,63493,65869,60796,67745, -60797,67745,31103,67744,60797,67744,67747,67753,60796,67744,67749,67757, - 375,67744, 413,65869,15309,67762,15383,67765,15309,67763,15363,67769, -46863,67762,32805,65869, 9,67775, 483,67774,46863,67774, 1216,65869, -46863,67782,65076,65869, 9,67787, 483,67786,46863,67786,56156,65869, - 483,67794,56555,67794,56555,65869,56156,67800,63014,67800,62538,67800, - 3357,67800,17455,67800, 5313,67800, 5843,67800, 3681,67800, 3709,67800, -46863,67800,49713,67820,60857,67820, 11,67821,49713,67800,46863,67828, - 483,67800,60857,67832, 11,67801,46863,67837,60857,67800, 9,67841, - 483,67840,46863,67840,15029,67800, 7,67849, 903,65869,31103,67852, -22957,67852,47608,67852,48408,67852,46863,67852, 1011,67862, 483,67862, - 483,67852,46863,67868, 7,67852,25793,67873,41019,67873, 8495,67873, - 1011,67852,46863,67880,28715,67852, 7,67885,21605,65869, 15,67889, -31103,67891, 7,67888,26331,67895,23755,67895,27805,67895, 7,67889, -26219,67903,49713,65869,58782,67906,48408,67906, 483,67906,46863,67912, -31103,67906,56555,67906,46863,67918, 3,67907,31103,67923,46863,67906, - 483,67926,56555,67926, 241,65869,31103,67932,48408,67932,46863,67932, - 483,67938, 483,67932,46863,67942, 7,67932,25793,67947,59875,67947, -41019,67947, 8495,67947,53391,67947, 9805,67947,56555,67933, 7,67961, - 9,65869,25545,67964,62942,67964,60857,67964, 1011,67970, 1011,67964, -60857,67974,25545,65869, 7,67979, 483,67978, 9,67978,46863,67978, -46863,65869,37844,67988,37896,67989,37844,67989, 6,67994,37845,67988, -67993,67999,67997,67999,67995,67999,37897,67999,54262,67988,54219,67988, - 120,67988, 77,67988, 6,67989,37844,68017,37844,68016,67999,68021, -32805,67988,37845,67989,68019,68027,67991,68027,37899,68027,37897,67989, -67991,68035,54129,67988,54225,68038,52692,67988,58334,67988,65076,67988, -54225,67988,54129,68048,25545,67988, 66,67988, 33,68055,62942,67988, - 25,67988, 113,68060, 113,67988, 25,68064, 506,67988, 1086,67988, - 1281,67988, 1216,67988, 413,67988, 922,67988, 1413,67988,16937,67988, - 587,67989, 483,68085, 483,67988,49713,68088, 241,68088, 587,68089, - 903,68088, 241,67988, 483,68098, 903,67988, 1011,68102, 483,68102, - 1275,67989,56555,67988,49713,68110,60857,68110, 11,68111,60857,67988, -56555,68118, 1011,68118, 1011,67988,60857,68124, 903,68124, 11,68125, - 587,68124, 587,67988, 1011,68134, 2,67988, 3,67988, 11,68140, - 33,68143, 11,68141, 25,68147, 1369,68141,37409,68141, 2,67989, - 3,67989, 483,68157,49713,67988,56555,68160, 483,68160, 11,67988, - 3,68166, 33,68169, 3,68167, 113,68173, 15,65869,10095,68176, -10093,68179,54643,68177,54655,68183,49537,68177,49529,68187,54655,68176, -54643,68191,49529,68176,49537,68195,16091,68176, 9513,68199,60125,68176, -59787,68203,16859,68177, 9875,68207,21529,68177,20501,68211, 1,68176, - 2,68215, 1,68216,68177,68219, 7,68216,68221,68223, 7,68215, - 2,68226, 1368,68215, 6,68176, 2,68233, 6,68234,68177,68237, - 0,68234,68239,68241, 0,68233, 2,68244,18966,68233,56554,68176, - 2,68251, 7,68252, 7,68251, 2,68256, 1368,68251, 482,68176, - 2,68263, 0,68264, 0,68263, 2,68268,18966,68263,20501,68176, - 9513,68275,59787,68275,21529,68275, 9875,68176,59787,68283, 9513,68283, -16859,68283,59787,68177,60125,68291, 9875,68291,20501,68291, 9513,68177, -16091,68299,20501,68299, 9875,68299, 483,68177, 2007,68307, 3477,68307, -68267,68307,68271,68307, 5197,68307,68241,68307,68247,68307, 1,68307, -19051,68307,19667,68307, 5123,68307,12345,68307,68249,68307,68273,68307, -18967,68307, 555,68337,68233,68337,68263,68337,56555,68177,59637,68345, -59717,68345,68255,68345,68259,68345,68223,68345,68229,68345, 6,68345, -59649,68345,39747,68345,43837,68345,43027,68345,68231,68345,68261,68345, - 1369,68345,59619,68373,68215,68373,68251,68373,18967,68176,19553,68381, -19549,68381,20345,68381,20281,68381, 7,68381,68345,68391,68359,68381, -10093,68381,10085,68381,20285,68381,10087,68381,19555,68381, 483,68381, -20273,68407,10081,68407,19545,68407, 1369,68176,67281,68415,67273,68415, - 3587,68415, 1989,68415, 0,68415,68307,68425,68323,68415,56681,68415, -57911,68415, 4897,68415,17041,68415,67291,68415,56555,68415, 1471,68441, -67269,68441, 3,68176,40909,68447, 3,68177,40895,68451,40059,68451, -43749,68451,38903,68451,18967,65869,20347,68460,20345,68463, 1203,68461, - 1205,68467, 1009,68461, 1007,68471, 1205,68460, 1203,68475, 1007,68460, - 1009,68479, 97,68460, 21,68483, 571,68460, 555,68487, 177,68461, - 59,68491, 1365,68461, 1325,68495, 2,68460, 6,68499, 2,68500, -68461,68503, 5,68500,68505,68507, 5,68499, 6,68510, 14,68499, - 4,68460, 6,68517, 4,68518,68461,68521, 3,68518,68523,68525, - 3,68517, 6,68528, 1274,68517, 482,68460, 6,68535, 5,68536, - 5,68535, 6,68540, 14,68535, 8,68460, 6,68547, 3,68548, - 3,68547, 6,68552, 1274,68547, 256,68461, 629,68461, 1325,68460, - 21,68563, 251,68563, 555,68563, 1365,68563, 59,68460, 555,68573, - 251,68573, 21,68573, 177,68573, 555,68461, 571,68583, 331,68583, - 59,68583, 1325,68583, 21,68461, 97,68593, 331,68593, 1325,68593, - 59,68593, 331,68460, 251,68603, 555,68603, 21,68603, 251,68461, - 331,68611, 59,68611, 1325,68611, 9,68461, 7951,68619, 7961,68619, -68551,68619,68555,68619,68451,68619,68525,68619,68531,68619, 2,68619, - 7953,68619,35893,68619,38299,68619,37897,68619,68533,68619,68557,68619, - 1275,68619, 7947,68649,68517,68649,68547,68649, 483,68461, 9517,68657, - 9525,68657,68539,68657,68543,68657,20033,68657,68507,68657,68513,68657, - 4,68657, 9519,68657,57855,68657,60853,68657,60609,68657,68515,68657, -68545,68657, 15,68657, 9513,68687,68499,68687,68535,68687, 1275,68460, -67245,68695,67253,68695,10041,68695,10005,68695, 5,68695,68657,68705, -68673,68695,10009,68695,23879,68695,31937,68695,30399,68695,67263,68695, - 9,68695,10001,68721,67241,68721, 15,68460,19549,68727,19553,68727, -10093,68727,10085,68727, 3,68727,68619,68737,68635,68727,20345,68727, -20281,68727,10087,68727,20285,68727,19555,68727, 483,68727,10081,68753, -20273,68753,19545,68753, 7,68460,58715,68761, 375,68761, 7,68461, -58703,68767,58027,68767,60849,68767,68345,68767,35603,68767, 59,68767, - 1325,68767, 331,68767, 265,68767, 241,68766, 241,68461, 6,68789, - 7,68789, 6,68788,68793,68795, 7,68788,68791,68799, 265,68460, - 375,68803, 1011,65869,59960,68807,61780,68806,63014,68806,62538,68806, -17455,68806,47640,68806, 5843,68806,48534,68806, 483,68806,60857,68824, - 9,68806,60857,68828,46863,68806,60857,68832, 903,68832, 11,68833, - 587,68832, 587,68806,46863,68842, 11,68807,46863,68847, 7,68807, -56555,68850,63823,68851, 9377,68851, 903,68806,46863,68858,56555,68807, - 6,68863, 7,68863, 6,68862,68867,68869, 7,68862,68865,68873, -60857,68806, 7,68877, 483,68876,46863,68876, 9,68876,62942,65869, - 7,68887,46863,68886, 9,68886, 483,68886,60857,65869,58782,68896, -58362,68896,47608,68896, 1108,68896, 1072,68896, 165,68896, 524,68896, - 1291,68896, 11,68897, 483,68915, 9,68896, 1011,68918, 587,68897, - 483,68923,46863,68896,56555,68926, 1011,68926, 483,68896,56555,68932, - 587,68933, 11,68933, 1011,68932, 11,68932, 11,68896, 483,68944, - 7,68897, 1141,68949, 1447,68949, 33,68949,56555,68896, 9,68957, -46863,68956, 483,68956, 1011,68896, 7,68965, 9,68964, 483,68964, -46863,68964, 265,65869,16710,68974,44242,68974,16711,68974,16710,68975, -68981,68983,45086,68975,44242,68975, 3,68988,44243,68974,68987,68993, -68991,68993,60797,68975,60796,68974,68999,69001,60796,68975,60797,68974, -69005,69007, 3,68975,44242,69011,44242,69010,68993,69015, 6,69010, - 1274,68975,44243,68975,69013,69023,45087,68975,68979,69027,16711,68975, -68977,69031, 1275,68975, 4899,69035,14611,69035,47961,69035, 11,68974, - 9,69043,46863,68974,69019,69047,69021,69047, 9,68975, 11,69053, - 6,68974, 0,69056,69035,69059, 7,68974,25793,69063,41019,69063, - 8717,69063, 8495,69063, 3785,69063, 6,68975, 3,69074,69047,69077, - 7,68975, 8647,69081,21605,68975, 375,69085,18967,68974, 375,69089, - 11,65869,39085,69093,49204,69092, 33,69097, 803,69093,63014,69092, -25381,69092, 265,69092, 9,69107,60857,69092, 483,69110, 483,69092, -60857,69114, 1275,69092, 9,69119, 2,69092,44243,69123, 3,69092, - 33,69127,46863,69129,46863,69126, 33,69133, 3,69093,49283,69137, -47546,69137, 113,69137,46863,69142,46863,69137, 113,69146,46863,69092, - 3,69150, 33,69153, 3,69151, 113,69157,20034,65869, 375,69161, -48560,65869, 3,69164, 33,69167, 3,69165, 113,69171,59206,65869, - 7,69175,29598,65869, 7,69179,60455,65869, 256,69183, 375,69183, - 7,69183, 241,69188, 241,69183, 7,69192,15029,65869,56555,69196, - 7,69199,28715,65869, 256,69203, 1505,69202, 7,69203, 241,69208, - 241,69203, 7,69212, 903,69202, 7,69217,54027,65869, 375,69221, - 2,69220,54159,69225,46863,69227, 2,69221,54256,69231,46863,69231, -54225,69234,54225,69231,46863,69238,17635,65869, 7,69243, 2,69244, - 2,69245, 1368,69243, 1369,69243, 2,69242,69253,69255, 3,69242, -69247,69259,69251,69259, 2,69243, 7,69264,69259,69267, 3,69243, -69249,69271, 2,65868,41692,69275,41607,69275, 8672,69275, 8743,69275, -26454,69275,26375,69275, 8770,69275, 8729,69275, 3795,69275,47953,69275, -48062,69275,47961,69275,48009,69298,48009,69275,47961,69302,41417,69275, -41653,69306,26219,69275,26415,69310,31770,69275,44832,69275, 8757,69275, - 8647,69318,26415,69275,26219,69322,41653,69275,41417,69326, 8647,69275, - 305,69330, 8757,69330, 8605,69275,47580,69275,47933,69339, 8684,69275, - 8717,69343, 8916,69275,31103,69275, 9,69348,26292,69275,26331,69353, - 340,69275, 8717,69357, 3785,69357, 8495,69357, 375,69275, 8861,69364, -46863,69364,47488,69275,41502,69275,41559,69373, 483,69275,44243,69376, - 305,69275, 8647,69380, 7,69275, 1,69385, 264,69386, 264,69387, -41019,69385,41653,69393,25793,69385,26415,69397, 8495,69385, 305,69401, - 8757,69401, 8495,69384, 8717,69407,25793,69384,26331,69411, 265,69385, -69391,69415, 8861,69415,46863,69415,41019,69384,41559,69423, 265,69384, - 8717,69427,69389,69427, 3785,69427, 8495,69427,44243,69275, 483,69436, - 9,69275,31103,69440,46863,69275, 265,69445,48009,69447, 265,69444, -47933,69451, 375,69444,25793,69275, 7,69457,26219,69459, 7,69456, -26331,69463, 265,69275,46863,69467,47961,69469,46863,69466,47933,69473, - 7,69467, 8647,69477, 7,69466, 8717,69481, 3785,69481, 8495,69481, -41019,69275, 7,69489,41417,69491, 7,69488,41559,69495, 8495,69275, - 7,69498, 8717,69501, 7,69499, 8647,69505, 8861,69275, 375,69508, - 3,65868,21116,69513,21253,69513,21560,69513,20465,69513,20576,69513, -59683,69513,42035,69513, 9573,69513,59689,69513, 9575,69513,42041,69513, -43711,69513,42089,69513,42129,69513, 1,69513, 6,69543,68974,69544, -68975,69545,69547,69549,68974,69545,68975,69544,69553,69555, 4,69513, - 6,69558,66665,69561,66785,69561,66997,69561,68695,69561, 9599,69513, - 8,69513,66997,69573,66785,69573,66665,69573,68695,69573,67011,69513, -66805,69513,68721,69513,66693,69513,60569,69513,59701,69513,59767,69513, - 9605,69513,32468,69513,28483,69513,19625,69513,20501,69602,43015,69513, -44714,69513,19474,69513,20413,69611,20805,69513,20186,69513,21549,69513, -20501,69618,21105,69513,20501,69622, 1418,69513,59619,69627, 9565,69627, -41941,69627, 669,69513, 9565,69635,59619,69635,41941,69635,37501,69513, -31103,69513,27021,69644, 8386,69513,50657,69513,36944,69513,48408,69513, - 1369,69513, 15,69656, 9565,69659,41941,69659,59619,69659, 483,69513, -46863,69666,20501,69513,21105,69670,21549,69670,19625,69670, 6,69513, - 3,69679,56555,69681,65869,69683, 4,69678,66665,69687,66785,69687, -66997,69687,68695,69687,69685,69687, 3,69678,68460,69699,69687,69701, -18967,69699,65869,69704,69687,69707,65869,69699,18967,69710,69687,69713, - 7,69513,20103,69716, 8337,69716,36773,69716,27021,69513,31103,69724, - 7,69512,24265,69729,28233,69729,29077,69729,20361,69729, 9673,69729, - 4279,69729, 9967,69729,19559,69729, 4283,69729,20713,69729, 3807,69729, - 8251,69729,44243,69513,41941,69754,46863,69513, 483,69758, 15,69513, -18967,69763,20501,69765,18967,69762,20413,69769, 1369,69762, 9565,69773, -41941,69773,59619,69773, 8337,69513, 7,69780,18967,69513, 15,69784, -20413,69787, 1011,69513,44242,69790,44242,69791,44243,69790,69795,69797, -44243,69791,69793,69801,28715,69513, 7,69805,36773,69513, 7,69808, -41941,69513,44243,69812,20103,69513, 7,69816,20273,69513, 6,69820, - 7,69820, 6,69821,69825,69827, 7,69821,69823,69831, 9617,69513, - 6,69834, 7,69834, 6,69835,69839,69841, 7,69835,69837,69845, - 6,65868, 1,69849, 3,69850, 4,69849, 3,69855,67988,69856, -67989,69857,69859,69861,67988,69857,67989,69856,69865,69867,21604,69849, - 3,69849, 1,69872, 7,65868,59007,69877,58999,69877,59025,69877, -19981,69877,48747,69877,37279,69877,57047,69877,57029,69877,58153,69877, - 1,69877, 2,69896,66625,69899,66825,69899,66973,69899,68415,69899, -58167,69877,56554,69877,66973,69911,66825,69911,66625,69911,68415,69911, -66987,69877,66845,69877,68441,69877,66653,69877,24601,69877,57437,69877, -57021,69877,57069,69877,54107,69877,52743,69877,52193,69877,20734,69877, -25551,69877,24613,69877,28205,69877,20501,69877, 265,69950, 241,69951, - 1141,69877,56555,69957,60577,69877,62959,69877,58377,69877,57981,69877, -19916,69877, 7947,69969,48739,69969,37241,69969,58931,69877,48739,69977, - 7947,69977,37241,69977, 8306,69877, 33,69877,56555,69987, 1447,69877, -56555,69991, 9875,69877, 241,69995, 265,69994, 9992,69877, 545,69877, - 695,69877, 1382,69877, 1374,69877, 1386,69877, 154,69877, 483,70013, -60455,69877, 483,70017, 1369,69877, 331,70020, 1325,70020, 59,70020, - 1325,69877, 1369,70028, 1275,69877,18967,70032,48739,70035,37241,70035, - 7947,70035, 59,69877, 1369,70042, 2,69877, 7,70047, 9,70049, -65869,70051, 1,70046,66625,70055,66825,70055,66973,70055,68415,70055, -70053,70055, 7,70046,68176,70067,70055,70069, 15,70067,65869,70072, -70055,70075,65869,70067, 15,70078,70055,70081, 3,69877, 8241,70085, - 15,70084, 483,70089, 331,69877, 1369,70092, 3,69876,24265,70097, -28233,70097,29077,70097,19559,70097,20713,70097, 4283,70097,20361,70097, - 9673,70097, 4279,70097, 9967,70097, 8251,70097, 3807,70097,18967,69877, - 1275,70122,48739,70125,37241,70125, 7947,70125, 113,70123, 1011,69877, - 265,69877,20501,70136, 8165,70136, 9875,70136,46863,69877,38056,70144, -38056,70145,38057,70144,70149,70151,38057,70145,70147,70155, 15,69877, - 3,70159, 1369,70161, 3,70158, 483,70165,54027,69877, 483,70169, - 8165,69877, 265,70172, 7,65869,69874,70176,69875,70177,70179,70181, -69875,70176,69874,70177,70185,70187,69852,70176,69853,70177,70191,70193, -69853,70176,69852,70177,70197,70199,11276,70176,11277,70176,11276,70177, -70205,70207, 5044,70176, 5045,70176, 5044,70177,70213,70215,40583,70177, -40583,70176,40582,70176,70219,70223,40582,70177,70221,70227,24094,70177, -69871,70177,69870,70177,21604,70177,69849,70236, 9,70236,21604,70176, -70233,70243,69849,70243, 9,70243, 4,70177, 0,70250, 1,70177, - 264,70254, 264,70255,24095,70177,70243,70261,45149,70177,26498,70177, -41326,70177, 8796,70177,27533,70177, 9,70273,25793,70177,27021,70277, - 587,70276, 241,70277, 5045,70177,70211,70285,11277,70177,70203,70289, - 4551,70177,10001,70177, 9,70295, 8495,70177, 305,70299, 587,70298, - 241,70299, 88,70177, 1369,70307, 587,70177,25793,70310,41019,70310, - 8495,70310, 1369,70177,20103,70319,36773,70319, 8337,70319, 265,70177, -70259,70327,63493,70327, 8861,70327,46863,70327, 89,70177,46863,70337, - 483,70177,18967,70341,37241,70343,48739,70343,70253,70343, 7947,70343, - 1275,70177,44243,70353,21605,70176,70231,70357,70235,70357,70239,70357, -70241,70357,70237,70357,69849,70367, 9,70367,26331,70357,23755,70357, -27805,70357, 241,70176,25793,70379,59875,70379,41019,70379, 8495,70379, - 9805,70379,53391,70379, 903,70176,25793,70393, 8495,70393,41019,70393, -18967,70176,58715,70401, 375,70401, 265,70176,70257,70407,25793,70407, -41019,70407, 8717,70407, 8495,70407, 3785,70407,21605,70177,70246,70421, -69849,70421,70243,70424,70248,70421,70243,70421,69849,70430, 9,70430, -24545,70421, 9,70421,70243,70438, 903,70421, 241,70177,51487,70445, - 375,70177, 1369,70449,41019,70177, 587,70452, 241,70453, 2,70176, -48009,70459, 265,70459,46863,70463,49321,70459,49001,70459, 3,70176, -58056,70471,58601,70471,40799,70471,44243,70471,56555,70478,35927,70471, - 375,70471, 510,70471, 483,70471, 9,70488,38155,70471,37611,70471, -56555,70471,44243,70496, 9,70471, 483,70500, 2,70177,44243,70505, -48466,70505,47640,70505,46863,70505, 9,70512, 903,70512, 903,70505, -46863,70518, 9,70505,46863,70522,49155,70505, 3,70177, 1369,70529, - 9,70531,37663,70529, 9,70528, 1369,70537,18967,70529,44243,70541, -69849,70177,21604,70545,70421,70547,21604,70544,70357,70551, 9,70177, -21604,70555,70421,70557,21604,70554,70357,70561, 3,70554, 1369,70565, - 3,70555, 483,70569, 3,65869,60078,70572,60079,70572,13748,70573, -13736,70572,70579,70581,13736,70573,13737,70572,13749,70573,70587,70589, - 1,70573, 5,70592, 1,70572,69385,70597,69384,70597,69275,70597, - 7,70602, 7,70603,59961,70597, 6,70596,70601,70611,70605,70611, - 7,70596,70599,70617,69275,70617, 6,70597,69275,70623,70617,70624, -70607,70623,70620,70623,70617,70623,69275,70632,56555,70623, 7,70597, -69275,70638,70611,70641,70611,70639,69275,70645,48560,70572, 33,70649, -60230,70573,57986,70573,58352,70573, 8309,70573,13737,70573, 7,70660, -70581,70663,59960,70573,70575,70667,70611,70667, 241,70666, 256,70573, -56555,70674, 11,70573,48583,70679,48328,70679, 25,70679,46863,70684, -46863,70679, 25,70688,59961,70573,70577,70693, 483,70573, 15,70697, -41941,70699, 9565,70699,70595,70699,59619,70699, 1369,70573,46863,70709, -37409,70573,46863,70713,46863,70572, 11,70716, 33,70719, 1369,70717, - 11,70717, 25,70725,37409,70717, 15,70572,40909,70731, 11,70572, - 33,70735,46863,70737,46863,70734, 33,70741, 6,70572, 1,70744, -70667,70747, 5,70744, 7,70572,70609,70753,58056,70753,70636,70753, -70623,70753,56555,70760,40799,70753,58601,70753,44243,70753,56555,70768, -35927,70753, 375,70753, 510,70753, 483,70753, 9,70778,38155,70753, -37611,70753, 9,70753, 483,70786,56555,70753,70623,70790,44243,70790, - 6,70573,70731,70797,56555,70797, 7,70573,13737,70802,70581,70805, -13737,70803,70585,70809,70611,70803,56555,70813,70747,70803,56555,70817, -70751,70803,42613,70803,56555,70823,54497,70803,54159,70803,51803,70803, -58348,70802,10291,70803,56555,70835, 59,70803, 1325,70803, 331,70803, - 1275,70803, 9,70845,56555,70802,70611,70849,70747,70849, 241,70848, - 241,70802,56555,70856, 15,70803, 483,70861,69275,70573,58348,70573, - 7,70866,38057,70573, 7,70871,43503,70573,44243,70875,56555,70573, - 256,70878, 7,70878,70611,70883,70747,70883, 241,70882, 7,70879, -70623,70891, 241,70878, 7,70894, 241,70573,44242,70899,44242,70898, -44243,70899,70903,70905,59960,70898,44243,70898,70901,70911, 7,70898, -56555,70914,56555,70898, 7,70918, 2,65869, 1,70922,69635,70925, - 668,70925,69513,70929,69627,70925, 1419,70925,69513,70935,70699,70925, -69659,70925,69773,70925, 587,70925, 9,70944,69513,70947, 9,70925, - 587,70950,69513,70953,54027,70922,54159,70957,46863,70959,54027,70923, -54154,70963,46863,70963,54129,70966,54129,70963,46863,70970,44243,70923, - 11,70975,46863,70922, 11,70922,44243,70981, 6,70922, 0,70985, - 5,70986, 5,70985, 0,70991, 0,70990, 1,70984,70995,70997, -70989,70997,70987,70997, 5,71003, 1,70985,70993,71007, 5,71007, - 0,70984, 5,71013,71007,71014,71010,71013,71007,71013, 5,71020, - 903,70985, 1,71025, 0,71025, 1,71024,71029,71031, 0,71024, -71027,71035, 7,70922,48009,71039, 265,71039,46863,71043,49321,71039, -49001,71039, 7,70923,70989,71051,70997,71052,70995,71051,70997,71056, -70998,71051,71000,71051,71005,71051,71009,71051,71017,71051,71019,71051, -71023,71051,71011,71051,71013,71075,14219,71051,14013,71051,14267,71051, -16151,71051,70997,71051,70995,71086,70989,71086,56554,71051, 1,71051, - 2,71094, 2,71051, 1,71098,14211,71051, 9165,71103, 9,71051, -65869,71107,71093,71109,71097,71109,71101,71109,70985,71051,69513,70923, - 903,70923,46862,71120,46862,71121,46863,71121,71123,71127,46863,71120, -71125,71131, 6,65869, 1,71134,70803,71137,56555,71139, 4,71134, -69977,71143,58930,71143,69877,71147,69969,71143,19917,71143,69877,71153, -70343,71143,70035,71143,70125,71143, 587,71143,56555,71162,69877,71165, -56555,71143, 587,71168,69877,71171, 2,71134, 903,71175, 1,71177, - 0,71177, 1,71176,71181,71183, 0,71176,71179,71187, 2,71135, - 265,71191, 0,71192, 1,71192, 0,71193,71197,71199, 1,71193, -71195,71203, 3,71135, 8,71207, 4,71207, 6,71210, 6,71207, - 4,71214,56555,71207,65869,71219,71209,71221,71213,71221,71217,71221, - 0, 5,59619,71229,59961,71230,60166,71229, 1207,71228,19105,71237, - 1180,71228,19119,71241,60158,71228,60180,71228,60178,71228,60318,71228, -60167,71229, 1197,71228,59875,71255,53391,71255, 9805,71255,60159,71228, -60181,71228,60179,71228,38158,71229,44195,71269, 1196,71228,60319,71228, -28739,71229, 2,71277,29229,71279, 59,71228,60221,71283,63823,71228, -61747,71287,61585,71287,61475,71287,63185,71287, 39,71228,56555,71297, - 15,71299, 6,71298,71301,71303, 14,71299, 7,71298,71307,71309, - 1163,71228,19119,71313, 25,71228,61747,71317,63185,71317,25461,71317, -61585,71317,70985,71228,71086,71327,70997,71327,71051,71330,71051,71327, -70997,71334,38057,71229, 6,71338,44195,71341,60973,71229, 1179,71345, -49213,71229,49217,71349,54619,71229, 11,71353,54655,71355, 1003,71229, -60857,71359, 1007,71361,11995,71228,12025,71365,64569,71228,64587,71369, -61989,71228,61747,71373,63185,71373,61585,71373, 8065,71229, 11,71381, - 8067,71383,63777,71229,60857,71387,63779,71389,21918,71229, 987,71393, -54336,71229,54339,71397, 989,71229,21605,71400, 987,71403,21890,71229, - 1179,71407,49262,71229,49217,71411,54331,71229, 17,71414,54339,71417, -25395,71228,25461,71421, 1293,71228,61475,71425,25433,71228,25461,71429, -61005,71228,61475,71433,63014,71228, 5,71437, 7,71438, 7,71437, - 5,71442, 10,71437, 524,71228, 0,71449, 3,71450, 3,71449, - 0,71454,60856,71449,21904,71229, 25,71461, 809,71229,21605,71464, - 713,71467,13755,71229, 17,71470, 9377,71473,65054,71229,63823,71477, - 117,71229,21605,71480, 25,71483,21916,71229, 713,71487,13764,71229, - 9377,71491,65037,71229, 17,71494,63823,71497, 1177,71229,21605,71500, - 1179,71503,49229,71229, 17,71506,49217,71509,26867,71229,21605,71512, -26865,71515,10161,71229, 17,71518,10159,71521,26868,71229,26865,71525, -10162,71229,10159,71529, 1180,71229, 2975,71533, 1903,71533,19025,71533, -33464,71229,34655,71541,34447,71541,33221,71541,33773,71541, 1207,71229, -19027,71551, 3567,71551, 1973,71551, 3041,71551, 1921,71551,19049,71551, - 9824,71229,71273,71565,53462,71229,71273,71569,59900,71229,71273,71573, -60319,71229,71251,71577,60159,71229,71245,71581,60178,71229,71267,71585, -59901,71229,71255,71589,60158,71229,71263,71593,60180,71229,71265,71597, -25461,71229, 25,71601,25395,71601,25433,71601,61475,71229,63823,71609, - 1293,71609,61005,71609,65808,71229,65513,71617,65791,71617,65407,71617, -65171,71617,60835,71229,60318,71229,71275,71629, 9617,71629,19797,71229, - 375,71635,20735,71229,47386,71229,20040,71229,20050,71229,61747,71229, -63823,71647, 25,71647,61989,71647,63185,71229, 25,71655,63823,71655, -61989,71655,61585,71229,63823,71663, 25,71663,61989,71663,20056,71229, - 375,71671, 9825,71229,71255,71675,53463,71229,71255,71679,57562,71229, -58846,71229,58372,71229,58758,71229,58762,71229,57224,71229,57284,71229, -57278,71229,58760,71229,20686,71229,24738,71229, 305,71703, 713,71703, - 1489,71703, 25,71703,10074,71229, 9377,71713,17573,71713,63823,71713, -22766,71229, 305,71721, 25,71721, 147,71721, 713,71721,27672,71229, -63823,71731,27995,71731, 9377,71731,62147,71229, 25,71739, 305,71739, - 147,71739, 169,71739, 713,71739,31881,71229,63823,71751,27995,71751, -31359,71751, 9377,71751,60221,71229, 59,71761, 653,71229, 11,71765, - 9993,71229,17542,71229, 9936,71229,24734,71229, 305,71775, 713,71775, - 25,71775,60834,71229,21350,71229,16129,71229, 3,71787, 2,71787, - 842,71787, 843,71786,71793,71795, 843,71787, 842,71786,71799,71801, - 3,71786,71791,71805, 2,71786,71789,71809,16966,71229,19480,71229, -50522,71229,52740,71229,57380,71229,59108,71229,50478,71229,57252,71229, -19986,71229,51036,71229,57576,71229,58112,71229,58362,71229, 903,71836, -47640,71229,56555,71840,60179,71229,71249,71845,60181,71229,71247,71849, -63015,71229,71441,71853,71445,71853,62905,71853,63041,71853,63047,71853, -63215,71853, 6,71853,63205,71867,19687,71853,21127,71853,20843,71853, -63049,71853,71447,71853, 11,71853,63033,71881,71437,71881,19917,71229, - 9,71886, 525,71229,71453,71891,71457,71891,36729,71891, 1851,71891, - 1885,71891,35635,71891, 2,71891,35633,71905,62095,71891,17711,71891, - 4907,71891,61003,71891,71459,71891,60857,71891, 531,71919,71449,71919, - 1413,71229, 331,71925,49713,71924, 1419,71229,56555,71930,58782,71229, - 903,71934, 296,71229, 8861,71939, 1106,71229,18967,71943, 9617,71943, -24095,71229,46863,71949,57522,71229, 11,71953, 903,71952, 587,71952, -51004,71229, 483,71960,22956,71229,70471,71965,70753,71965,10159,71965, -26865,71965,10111,71965,26715,71965,23709,71965,23713,71965,67425,71965, -10113,71965,26719,71965,23715,71965, 587,71965,10107,71991,26625,71991, -23651,71991,19475,71229, 483,71998, 918,71229,56555,72002, 922,71229, -56555,72006,49713,72006, 668,71229,56555,72012, 1290,71229, 2,72017, -35575,72019,35585,72017, 3621,72017, 1991,72017,60969,72017,62095,72017, -17711,72017, 4907,72017,60857,72017, 1325,72037,58930,71229, 9,72040, -52692,71229, 903,72044,25380,71229, 6,72049,38881,72051,38891,72049, - 9927,72049, 9891,72049, 9895,72049,19687,72049,21127,72049,20843,72049, - 11,72049, 9875,72069, 1447,71229,15705,72073, 9917,71229,20615,71229, - 759,71229,17455,72081, 9195,71229, 1487,72085, 1471,71229,21605,72088, - 305,72091, 713,72091, 1489,72091, 25,72091, 9805,71229, 1197,72101, - 1275,72101, 9,72105, 1197,72100,71273,72109,10001,71229, 17,72112, - 9377,72115,17573,72115,63823,72115,17455,71229,12377,72122,59961,71229, -59619,72126, 1011,72126, 9617,72131, 1011,72127, 9565,72135,59619,72135, - 89,71229,17455,72141,60797,71229,59381,72144, 165,71229,21315,72148, - 587,71229,66971,72153,17455,72153,57522,72152, 9,72152,56555,72160, -56555,72152, 9,72164,60857,72153, 9,72169, 1369,71229,39085,72173, -21605,72172,20843,72177,21127,72177, 9927,72177, 9891,72177,19687,72177, - 9895,72177, 11,72177, 9875,72191, 1275,71229, 17,72194, 4907,72197, -17711,72197, 3621,72197, 1991,72197,62095,72197,60969,72197,60857,72197, - 1325,72211, 483,71229,20035,72214,58742,72214,19475,72214,51004,72214, -56555,72214, 903,72224, 903,72214,56555,72228,49713,72228,49713,72214, - 903,72234,55839,71229,46863,72239,65061,71229,60857,72243,65063,72245, -65067,72245,65071,72245, 7065,71229,18967,72253, 6789,71229, 11,72257, - 6843,72259, 6885,72259, 6889,72259,11277,71229,46863,72267, 9935,71229, - 1011,72270,20645,71229, 1011,72274, 3445,71229, 375,72279, 5045,71229, -46863,72283,17104,71229,48643,72287,12614,71229, 375,72291,69872,71229, -68155,72295,71116,71229,71013,72299,70985,71229,71013,72303,71051,72305, -71051,72302,71013,72309,71051,71229,70985,72313,70997,72315,70985,72312, -71013,72319, 482,71228,23717,72323,24522,72323,24447,72323,23939,72328, -23939,72323,24447,72332,22956,72323,23651,72337,21605,72323, 17,72341, -23939,72343, 17,72340,23651,72347, 17,72323,21605,72351,24447,72353, -21605,72350,23651,72357, 1368,71228, 7,72361, 5,72362,72049,72365, -72177,72365, 5,72361, 7,72370,72049,72373,72177,72373,72191,72361, -72069,72361, 10,72361,72177,72383,72049,72383,27021,72361,24095,72361, - 9195,72361,52915,72361,23651,72361,51435,72361,21605,72361, 9,72401, -67297,72361,70097,72361,69729,72361,11277,72361, 5045,72361,10171,72361, -53941,72361, 9755,72361,26907,72361, 4321,72361,27323,72361, 3833,72361, - 9317,72361, 4295,72361,53215,72361, 1274,71228, 3,72435, 0,72436, -72017,72439,72197,72439, 0,72435, 3,72444,72017,72447,72197,72447, -72211,72435,72037,72435,60856,72435,72197,72457,72017,72457, 586,71228, -39619,72463,51421,72463,57811,72463,59933,72463,59743,72463, 8093,72463, - 3837,72463,42435,72463, 4287,72463,53703,72463, 4303,72463,42113,72463, - 9839,72463,53487,72463, 9579,72463, 483,72463, 803,72494, 828,72463, - 705,72463, 803,72463, 483,72502, 482,71229,66737,72507,36661,72507, -62741,72507,68727,72507,68381,72507, 1274,71229, 587,71228,61747,72521, -25461,72521,61475,72521,63185,72521,61585,72521, 483,71228,56555,72533, - 6,72535, 5,72536, 7,72535, 5,72535, 6,72542, 6,72543, -72541,72547, 6,72534, 15,72535,72551,72553, 7,72534,72545,72557, -72539,72557, 14,72535,72557,72563, 1368,71229,55839,72567,51803,72567, -54159,72567,54497,72567, 265,72567, 1275,71228,59914,72579,60221,72579, -18708,72579, 9856,72579,53504,72579, 9805,72579, 9,72590,53391,72579, - 9,72594,59875,72579, 9,72598,18693,72579, 9,72602,60369,72579, - 9,72579,18693,72608, 9805,72608,59875,72608,53391,72608, 586,71229, - 33,72619, 1447,72619, 1141,72619, 889,72619, 795,72619, 787,72619, - 767,72619, 483,72633, 1505,71229,16937,72636,56555,72636, 581,71229, -60857,72643, 1325,72645, 331,72645, 571,72645, 585,72645, 59,72645, -16937,71229, 1505,72656,13947,71229, 2,72661,14217,72663, 11,72661, - 9875,72667,16091,72667,13955,72667,20501,72667, 9919,71229,20623,71229, - 9921,71229, 1196,71229,72103,72683,71256,72683,71258,72683,71260,72683, -71255,72683,59875,72692,53391,72692, 9805,72692,59875,72683,71255,72700, - 9805,72683,71255,72704,53391,72683,71255,72708, 154,71229,64148,71229, - 1325,72715, 59,72715, 331,72715, 265,72715,52501,71229, 265,72725, - 297,71229,18967,72729, 1107,71229,59960,71229,21105,72735,65513,72735, -65791,72735,65407,72735,21549,72735,19625,72735,65171,72735,59619,72735, - 15,72735, 88,71229,70177,72755,70176,72754,72757,72759,70176,72755, -70177,72754,72763,72765, 1141,72755, 1447,72755, 33,72755, 11,72755, -37409,72755, 972,71229, 59,72779, 1325,72779, 331,72779,27978,71229, -60796,71229,59381,72789,31102,71229,62905,72793,68761,72793,70401,72793, -67541,72793, 164,71229,36729,72803,68447,72803,70731,72803,67547,72803, -54596,71229,44243,72813,20695,71229, 155,71229,20763,71229, 375,72820, - 1197,71229,71273,72825,59875,72827, 9805,72827,53391,72827,53391,72824, -71273,72835, 9805,72824,71273,72839,59875,72824,71273,72843, 375,71229, -20763,72846,20836,71229, 1141,71229,15705,72853, 33,71229,15705,72857, -27021,71229, 1487,72861, 959,71229,17455,72865,52915,71229, 1487,72869, - 47,71229,17455,72873,59875,71229, 1197,72877,72683,72879, 1275,72877, - 9,72883, 1197,72876,71273,72887, 253,71229,21605,72890, 305,72893, - 25,72893, 713,72893,53391,71229, 1197,72901,72683,72903, 1275,72901, - 9,72907, 1197,72900,71273,72911, 53,71229,21605,72914, 305,72917, - 25,72917, 147,72917, 713,72917,27533,71229, 17,72926,63823,72929, -27995,72929, 9377,72929,30749,71229, 7,72937,26970,71229, 7,72941, -70864,71229, 7,72945,69849,71229, 3,72948,68155,72951, 3,72949, -67577,72955,68139,72955,70979,72955,69275,71229,70573,72962, 7,72965, -69513,71229, 1011,72968, 7,72971, 9780,71229, 7,72975,59381,71229, - 2,72979,72789,72981,60797,72978, 6,72978,56555,72986,72981,72989, -26625,71229, 1011,72992, 7,72995, 9731,71229, 1011,72998, 7,73001, -69790,71229, 7,73005, 13,71229,32805,71229, 7,73010,33221,73013, -34655,73013,33773,73013,34447,73013, 15,73011,34875,73023, 7,73011, -34723,73027, 19,71229, 59,73031, 18,71229,65076,71229, 7,73037, -65493,73039, 7,73036,65171,73043,65791,73043,65513,73043,65407,73043, - 15,73037,65357,73053, 12,71229,68974,71229, 375,73059,71119,71229, - 7,73063, 1011,71229,52387,73067,20762,73067,59961,73066, 9617,73073, -20645,73066, 9935,73066, 17,73066,18967,73081, 9617,73081, 6,73066, - 7,73067,18967,73088,26625,73066, 7,73093,18967,73067, 7,73096, - 17,73097, 9731,73066, 7,73103,69513,73066, 7,73107,21315,73066, - 7,73111, 15,71229,18967,73115, 17,73117, 3,73114, 3,73115, -72567,73123, 17,73114, 265,71229, 9,73128, 8861,73131,60857,73129, - 9,73135,65869,73128, 375,73139, 11,71229,60857,73143, 9,73145, - 1275,73143, 9,73149, 9,73142,60857,71229, 7,73154, 59,73157, - 1325,73157, 331,73157, 265,73157, 7,73155, 375,73167, 265,73155, - 375,73171,12377,73154, 7,73175,18967,71229, 7,73179,25793,73181, -41019,73181, 8495,73181,46863,71229,20035,73188,58742,73188, 903,73188, -56555,73194,56555,73188, 903,73198,20035,71229,21183,73203, 7,73203, - 331,73207, 483,73202,46863,73202, 9,73202, 7,73202, 375,73217, -49713,71229,39085,73221, 136,73220, 1197,73220, 137,73220, 922,73220, - 1413,73220, 1011,73220, 6,73234, 483,73220, 903,73238, 903,73220, - 483,73242, 2,73220, 9,73246,44243,73247, 3,73220, 5,73253, - 6,73255, 9,73253, 2,73221,73257,73261,73229,73261,73258,73261, -29229,73261,72683,73261,73237,73261,73087,73261, 9,73261,73253,73276, -73253,73261, 9,73280, 3,73221,73225,73285,73249,73285,73227,73285, -73247,73285, 9,73293, 9,73220, 2,73296,73285,73299, 2,73297, -73253,73303, 17,71229,10161,73306,10159,73309,54339,73307,54331,73313, -49217,73307,49229,73317,54331,73306,54339,73321,49229,73306,49217,73325, -65037,73306,63823,73329,13755,73306, 9377,73333,27995,73307,27533,73337, -17573,73307,10001,73341, 7,73306, 3,73345, 7,73346,73307,73349, - 1,73346,73351,73353, 1,73345, 3,73356,21604,73345, 0,73306, - 3,73363, 0,73364,73307,73367, 6,73364,73369,73371, 6,73363, - 3,73374, 1274,73363, 586,73306, 3,73381, 1,73382, 1,73381, - 3,73386,21604,73381,60856,73306, 3,73393, 6,73394, 6,73393, - 3,73398, 1274,73393,10001,73306,63823,73405, 9377,73405,17573,73405, -27533,73306, 9377,73413,63823,73413,27995,73413, 9377,73307,13755,73421, -27533,73421,10001,73421,63823,73307,65037,73429,10001,73429,27533,73429, -60857,73307,63697,73437,63779,73437,73397,73437,73401,73437,73371,73437, -73377,73437, 7,73437,63709,73437,35893,73437,37897,73437,38299,73437, -73379,73437,73403,73437, 1275,73437,63679,73465,73363,73465,73393,73465, - 587,73307, 1971,73473, 3507,73473,73385,73473,73389,73473, 5231,73473, -73353,73473,73359,73473, 0,73473,21783,73473,23983,73473, 4625,73473, -10603,73473,73361,73473,73391,73473,21605,73473, 713,73503,73345,73503, -73381,73503, 1011,73306,18967,73511, 9617,73511, 1275,73306,72439,73517, -72447,73517, 3621,73517, 1991,73517, 1,73517,73473,73527,73489,73517, -60969,73517,62095,73517, 4907,73517,17711,73517,72457,73517,60857,73517, - 1325,73543,72435,73543,21605,73306,23713,73549,23709,73549,26865,73549, -26715,73549, 6,73549,73437,73559,73451,73549,10159,73549,10111,73549, -26719,73549,10113,73549,67425,73549,70753,73549,70471,73549,23715,73549, - 587,73549,26625,73581,10107,73581,23651,73581, 1011,73307, 9565,73589, - 2,73306,36729,73593,68447,73593,67547,73593,70731,73593, 2,73307, -36727,73603,68451,73603,37895,73603,36079,73603,35575,73603, 15,73306, -21605,71229,26867,73616,26865,73619, 1179,73617, 1177,73623, 987,73617, - 989,73627, 1177,73616, 1179,73631, 989,73616, 987,73635, 809,73616, - 713,73639, 117,73616, 25,73643, 1489,73617, 1471,73647, 147,73617, - 53,73651,26219,73617, 5,73616, 7,73657, 5,73658,73617,73661, - 2,73658,73663,73665, 2,73657, 7,73668, 1368,73657, 3,73616, - 7,73675, 3,73676,73617,73679, 4,73676,73681,73683, 4,73675, - 7,73686, 16,73675, 10,73616, 7,73693, 2,73694, 2,73693, - 7,73698, 1368,73693, 586,73616, 7,73705, 4,73706, 4,73705, - 7,73710, 16,73705,44243,73617,48466,73617, 340,73617, 1397,73617, - 53,73616, 713,73725, 305,73725, 25,73725, 147,73725, 1471,73616, - 25,73735, 305,73735, 713,73735, 1489,73735, 25,73617, 117,73745, - 253,73745, 1471,73745, 53,73745, 713,73617, 809,73755, 253,73755, - 53,73755, 1471,73755, 253,73616, 305,73765, 25,73765, 713,73765, - 305,73617, 253,73773, 1471,73773, 53,73773, 9,73617,46863,73780, - 587,73617, 9381,73785, 9439,73785,73709,73785,73713,73785,25519,73785, -73683,73785,73689,73785, 5,73785, 9383,73785,62077,73785,64317,73785, -64815,73785,73691,73785,73715,73785, 17,73785, 9377,73815,73675,73815, -73705,73815, 11,73617, 7979,73823, 8067,73823,73697,73823,73701,73823, -73603,73823,73665,73823,73671,73823, 3,73823, 7981,73823,39747,73823, -43027,73823,43837,73823,73673,73823,73703,73823, 1369,73823, 7971,73853, -73657,73853,73693,73853, 17,73616,23709,73861,23713,73861,10159,73861, -10111,73861, 2,73861,73823,73871,73839,73861,26865,73861,26715,73861, -10113,73861,26719,73861,67425,73861,70471,73861,70753,73861,23715,73861, - 587,73861,10107,73893,26625,73893,23651,73893, 1369,73616,72365,73901, -72373,73901, 9927,73901, 9891,73901, 4,73901,73785,73911,73801,73901, - 9895,73901,19687,73901,20843,73901,21127,73901,72383,73901, 11,73901, - 9875,73927,72361,73927,46863,73617, 9,73932, 6,73616,62905,73937, -68761,73937,70401,73937,67541,73937, 7,73616, 6,73617,62883,73949, -68767,73949,64267,73949,62235,73949,38881,73949,73437,73949,73947,73949, -72787,73949, 7,73617,25793,73967,41019,73967, 8495,73967,73937,73967, -72793,73967, 265,73966, 265,73617, 6,73981, 7,73981, 6,73980, -73985,73987, 7,73980,73983,73991, 903,71229,64148,73995,57522,73994, -58782,73994,58362,73994,52501,73995,52692,73994,46863,73994,56555,74008, - 9,73994,56555,74012, 483,73994,56555,74016,49713,74016,49713,73994, - 483,74022, 15,73995, 483,74027, 7,73994, 59,74031, 1325,74031, - 331,74031, 7,73995,60857,74038,59875,74039, 375,74039, 9805,74039, -53391,74039,60857,73995, 6,74051, 7,74051, 6,74050,74055,74057, - 7,74050,74053,74061,56555,73994, 7,74065,46863,74064, 483,74064, - 9,74064,58742,71229, 7,74075, 9,74074,46863,74074, 483,74074, -56555,71229,43502,74085,21036,74085, 6,74089, 6,74088,43503,74085, - 6,74095, 6,74094,21037,74085,59634,74085,59635,74085, 6,74105, - 6,74104,21104,74085,59645,74085,43838,74085,21548,74085,21526,74085, - 5,74118,59644,74085,19624,74085,18967,74085, 5,74126, 6,74128, - 6,74129, 6,74126, 5,74134, 6,74127, 14,74126,38305,74085, - 2,74142,59619,74085, 2,74146, 5,74085,59961,74151, 6,74151, -21526,74150, 6,74150,18967,74158,18967,74150, 6,74162, 6,74163, - 2,74085,59619,74168,38305,74168, 14,74085,18967,74174,21527,74085, -74155,74179, 9,74179,19625,74085,21549,74085,43839,74085,21105,74085, -47640,74084, 922,74084, 918,74084, 1505,74084, 668,74084, 1419,74084, - 483,74084, 903,74204, 11,74085, 9,74209, 15,74085,74139,74213, -46863,74084, 903,74216, 9,74084, 11,74221, 903,74220, 587,74220, - 587,74084, 9,74228, 6,74084,74191,74233,74189,74233,74187,74233, -74113,74233,74087,74233,74101,74233,74103,74233,74171,74233,74169,74233, -59619,74251,74149,74233,72981,74233,74185,74233,74145,74233,74173,74233, -74213,74233,59381,74233, 7,74084,74093,74269,74099,74269,74123,74269, -74109,74269,74159,74269,74089,74269,74095,74269,74105,74269,74151,74269, -74111,74269,74115,74269,74117,74269,74157,74269,74121,74269,21105,74269, -21549,74269,65513,74269,65791,74269,65407,74269,74125,74269,19625,74269, -65171,74269,74175,74269,74131,74269,74129,74269,74137,74269,74177,74269, -74161,74269,74165,74269,74163,74269,74141,74269,59619,74269, 15,74269, - 6,74085,21036,74336,74269,74339,43503,74336,74269,74343,59635,74336, -74269,74347, 5,74336,74269,74351,18967,74350,74269,74355,18967,74336, - 5,74358,74269,74361, 7,74085,74091,74365,74097,74365,74107,74365, -74155,74365,21183,74365,65493,74365,74133,74365,74167,74365, 9,74365, - 959,74365, 47,74365, 759,74365, 903,74084, 7,74391, 483,74390, - 9,74390,46863,74390, 9,71229,20035,74400,58742,74400,58930,74400, -19917,74400, 903,74400,56555,74410, 265,74400, 8861,74415, 587,74400, -56555,74418,56555,74400, 11,74423, 903,74422, 587,74422, 265,74401, - 8495,74431, 11,74431, 3,74400,70177,74437,70176,74436,74439,74441, -70176,74437,70177,74436,74445,74447, 1141,74437, 1447,74437, 33,74437, - 11,74437,37409,74437, 3,74401, 113,74461, 11,74400,21522,71229, - 7,74467,63452,71229, 7,74471,13673,71229, 7,74475,17049,71229, - 3,74478,48643,74481, 2,74479, 3,74479,48637,74487,49581,74487, -47813,74487,21315,71229, 165,74494, 1011,74494, 7,74499,16163,71229, - 2,74503,72683,74505,73087,74505,16171,74505, 375,74503,64669,71229, - 7,74515, 265,74517,12377,71229, 256,74521,17455,74520, 7,74520, - 375,74527, 7,74521, 241,74530, 331,74531,60857,74520, 7,74537, - 241,74521, 7,74540,10385,71229, 375,74545,70899,71229, 7,74549, -18391,71229, 7,74553,18617,71229, 7,74557,12705,71229, 7,74561, -70573,71229,69275,74564, 7,74567, 3,71228,74332,74571,72750,74571, -71253,74571,72985,74571,72147,74571,71783,74571,71577,74571,67600,74571, -45491,74571,42800,74571,59710,74571,74365,74593,74269,74571,59619,74596, -72735,74571,59619,74600,59694,74571,60563,74571, 629,74571, 101,74571, - 705,74571, 299,74571, 128,74571, 828,74571, 394,74571,48122,74571, -70327,74571,66930,74571, 9606,74571,10374,74571, 113,74571, 9,74632, -74465,74571,73153,74571,73031,74571,73057,74571,73131,74571,71939,74571, -72733,74571,74415,74571,72145,74571,59381,74653,42134,74571,10291,74571, - 17,74658,51992,74571, 375,74571, 241,74664,65869,74664,49713,74664, -60796,74571,74213,74673, 256,74571, 803,74571, 483,74678, 483,74571, - 803,74682,31103,74571,65869,74686, 6,74571,59619,74690,74365,74693, -56555,74690,74213,74697, 7,74571, 241,74700, 7,74570,57811,74705, -59933,74705,59743,74705, 9839,74705, 9579,74705,39619,74705,51421,74705, - 4287,74705, 4303,74705, 8093,74705, 3837,74705,53487,74705,42113,74705, -42435,74705,53703,74705,42613,74571, 17,74736,46863,74571,12377,74740, - 9,74571, 113,74744,49713,74571, 375,74748, 17,74571,42613,74752, -59619,74752,10291,74752, 9565,74752,41941,74752, 9565,74571, 7,74765, - 17,74764,65869,74571,60796,74771,60797,74771,31103,74770,60797,74770, -74773,74779,60796,74770,74775,74783, 375,74770, 241,74571, 375,74788, - 7,74788,56555,74571, 5,74795,74269,74797,72735,74797, 6,74797, -74365,74803, 6,74796,74269,74807,72735,74807, 14,74795,72735,74813, -74269,74813, 15,74795, 6,74795, 5,74820,74269,74823,72735,74823, - 7,74795,74803,74829, 6,74794,74213,74833,74819,74833, 7,74794, -74807,74839,74823,74839,71229,74838,74807,74845,74823,74845,74797,74845, -74813,74845,74813,74839,12377,74571,46863,74856,41941,74571, 7,74861, - 17,74860,59619,74571,74269,74866,72735,74866, 6,74866,74365,74873, - 6,74867,74269,74877,72735,74877, 7,74867, 17,74866, 2,71228, -71233,74887,56555,74887,72129,74887,72127,74887,59619,74895,71235,74887, -72790,74887,71627,74887,74153,74887,74155,74887,74365,74906,74372,74887, -74158,74887,74269,74913,74279,74887,74350,74887,74269,74919,74353,74887, -74266,74887,74150,74887, 6,74927,74365,74929, 6,74926,74269,74933, -74269,74927,74287,74887,74336,74887, 5,74940,74269,74943,60261,74887, -71629,74887,63737,74887,37179,74887, 9535,74887,63743,74887, 9537,74887, -37185,74887,74264,74887,74174,74887,74269,74965,74315,74887,73073,74887, -37887,74887,37205,74887,37235,74887,74085,74887, 5,74978, 6,74981, -74365,74983, 6,74980,74269,74987,74269,74981, 6,74978, 5,74992, -74269,74995, 6,74979,74213,74999, 14,74978,74269,75003, 5,74887, -74336,75006,74269,75009,74085,75006, 6,75013,74365,75015, 6,75012, -74269,75019,74269,75013,74085,75007,74233,75025, 6,75006,72735,75029, -74085,75028,74269,75033,74269,75029,74085,75029,74233,75039, 7,75006, -71853,75043,72049,75043,72177,75043,73901,75043, 6,75007,74365,75053, - 7,75007,72131,74887,72753,74887,74335,74887, 9563,74887,74382,74887, - 10,74887,72177,75069,72049,75069,71853,75069,73901,75069, 14,74887, -74085,75079,74233,75081,74085,75078,74269,75085,72735,75079,74269,75079, -72191,74887,72069,74887,73927,74887,71881,74887,64759,74887,63763,74887, -63813,74887, 9559,74887,74213,74887,74233,75108,74365,74887,74155,75112, - 9,75112,43123,74887,42606,74887,53318,74887, 9362,74887,27218,74887, -28189,74887,74233,74887,59381,75130,74213,75130,72789,74887,59381,75136, -64289,74887,26182,74887,28991,74887, 8804,74887,54289,74887,53802,74887, - 8150,74887, 1290,74887,63679,75155, 9533,75155,37145,75155, 525,74887, - 9533,75163,63679,75163,37145,75163, 922,74887, 1413,74887,73615,74887, -73127,74887,73009,74887,73035,74887,73081,74887,71943,74887,72729,74887, -73511,74887,41762,74887, 7971,74887, 9,75192,53517,74887, 9,75196, - 483,74887, 903,75200, 9195,74887, 9,75204, 1275,74887, 17,75208, - 9533,75211,37145,75211,63679,75211,27021,74887, 9,75218, 7,74887, - 2,75223,60857,75225,71229,75227, 5,75222,71853,75231,72049,75231, -72177,75231,73901,75231,75229,75231, 2,75222,73616,75243,75231,75245, -21605,75243,71229,75248,75231,75251,71229,75243,21605,75254,75231,75257, - 6,74887,74150,75260,74269,75263,74085,75260, 5,75266,74269,75269, -56555,75261,71229,75272,74085,75261,74155,75277, 9,75277, 5,75260, -72735,75283,74085,75282,74269,75287,74269,75283,74085,75283,74233,75293, -75275,75283, 11,75261,21604,75299,21604,75298,21605,75299,75303,75305, -21605,75298,75301,75309,52915,74887, 9,75312, 6,74886,23717,75317, -24522,75317,24447,75317,23939,75322,23939,75317,24447,75326,22956,75317, -23651,75331, 17,75317,21605,75335,24447,75337,21605,75334,23651,75341, -21605,75317, 17,75345,23939,75347, 17,75344,23651,75351, 7,74886, -27021,75355,24095,75355, 9195,75355,52915,75355,21605,75355, 9,75365, -67297,75355,26907,75355, 9755,75355, 9317,75355, 3833,75355,23651,75355, -51435,75355,27323,75355, 4321,75355,69729,75355,53215,75355, 4295,75355, -70097,75355,53941,75355,10171,75355, 5045,75355,11277,75355,42155,74887, - 9,75402, 19,74887, 12,74887, 11,74887, 9,75410, 9,74887, -74365,75414,42155,75414,27021,75414,52915,75414, 9195,75414,25793,75414, -53517,75414, 7971,75414, 8495,75414,41019,75414, 11,75414, 17,74887, - 1275,75438, 9533,75441,37145,75441,63679,75441, 8495,74887, 9,75448, - 903,74887, 483,75452,21605,74887,26219,75457,42810,75456,75056,75456, -75057,75457,75463,75465,75053,75457,42810,75457,75057,75456,75056,75457, -75473,75475,42811,75456,75471,75479,42811,75457,75461,75483,44243,75457, - 375,75457, 6,75457, 7,75457,25793,75493, 6,75456,75493,75497, - 7,75456,75491,75501,41019,74887, 9,75504,59381,74887,72789,75508, -74233,75508,25793,74887, 9,75514,26625,74887, 6,75518, 7,75518, - 6,75519,75523,75525, 7,75519,75521,75529, 9731,74887, 6,75532, - 7,75532, 6,75533,75537,75539, 7,75533,75535,75543,69513,74887, - 6,75546, 7,75546, 6,75547,75551,75553, 7,75547,75549,75557, - 7,71228,73276,75561,27306,75561,73261,75561, 9,75566,24095,75561, -52603,75561,53910,75561,55537,75561,20053,75561,20831,75561,19783,75561, -64289,75561,27021,75561,25793,75586, 265,75587, 959,75561,60857,75593, -58775,75561, 5045,75561,11277,75561, 4551,75561,70136,75561,10196,75561, - 273,75561, 1477,75561, 281,75561, 948,75561, 1516,75561, 922,75561, - 1413,75561,52915,75561, 265,75623, 47,75561,60857,75627,25793,75561, -27021,75630, 9195,75561, 265,75635, 759,75561,60857,75639, 89,75561, - 5019,75643,60857,75643, 1505,75561, 1011,75648, 587,75561,60857,75653, -70573,75653, 1369,75561,43503,75659, 483,75561, 903,75662, 165,75561, - 903,75666, 1141,75561,18967,75671, 1447,75561,18967,75675, 2,75561, -61780,75679, 9,75679,60857,75682,54295,75679,70085,75679,53925,75679, -10155,75679,11529,75679,60857,75679, 9,75696, 3,75561,73221,75701, - 9,75703, 8063,75701,53667,75701,42361,75701, 33,75561,18967,75713, - 2,75560,27021,75717,24095,75717, 9195,75717,52915,75717,21605,75717, - 9,75727,67297,75717,23651,75717,51435,75717,27323,75717, 4321,75717, - 9755,75717,26907,75717, 9317,75717, 3833,75717,69729,75717,53941,75717, -10171,75717,70097,75717,53215,75717, 4295,75717, 5045,75717,11277,75717, - 3,75560,57811,75765,59933,75765,59743,75765,39619,75765,51421,75765, - 4287,75765, 4303,75765, 9839,75765, 9579,75765, 8093,75765, 3837,75765, -42113,75765,53487,75765,42435,75765,53703,75765, 265,75561,53813,75796, -69877,75796,10107,75796, 1011,75561, 1505,75804,54597,75805,21605,75561, - 9,75811, 145,75811, 903,75561, 165,75816, 483,75816,54295,75817, - 9,75561,73261,75824,69877,75561, 265,75828,10107,75561, 265,75832, -53813,75561, 265,75836, 6,71228,63091,75841,63099,75841,63117,75841, -25451,75841,53597,75841,42283,75841,61289,75841,61281,75841,62345,75841, - 0,75841, 3,75860,71891,75863,72017,75863,72197,75863,73517,75863, - 3,75861,62359,75841,60856,75841,72197,75877,72017,75877,71891,75877, -73517,75877,72211,75841,72037,75841,73543,75841,71919,75841,19739,75841, -61649,75841,61263,75841,61323,75841,20763,75841, 1011,75903, 1010,75902, -75905,75907, 1010,75903, 1011,75902,75911,75913,25380,75841, 7971,75917, -53517,75917,42155,75917,63015,75841,53517,75925, 7971,75925,42155,75925, - 1369,75841,21605,75932,53517,75935,42155,75935, 7971,75935, 3,75841, - 6,75943, 11,75945,71229,75947, 0,75942,71891,75951,72017,75951, -72197,75951,73517,75951,75949,75951, 6,75942,73306,75963,75951,75965, - 17,75963,71229,75968,75951,75971,71229,75963, 17,75974,75951,75977, - 2,75841,60857,75981, 16,75983, 16,75982, 17,75983,75987,75989, - 17,75982,75985,75993, 2,75840,23717,75997,24522,75997,23939,75997, -24447,76002,24447,75997,23939,76006,22956,75997,23651,76011,21605,75997, - 17,76015,23939,76017, 17,76014,23651,76021, 17,75997,21605,76025, -24447,76027,21605,76024,23651,76031,21605,75841, 1369,76034,53517,76037, -42155,76037, 7971,76037, 17,75841,37844,76044,75872,76044,75873,76045, -76049,76051,37844,76045,75873,76044,75872,76045,76057,76059,37845,76044, -76055,76063,37845,76045,76047,76067, 7,71229,74797,76071,74829,76073, - 264,76071, 5,76071, 3,76078, 3,76079, 5,76070,75925,76085, -63014,76085,75841,76089,75917,76085,25381,76085,75841,76095,75935,76085, -76037,76085, 483,76085,60857,76102,75841,76105,60857,76085, 483,76108, -75841,76111,32805,76070,34655,76115,33773,76115,34447,76115,33221,76115, -32805,76071,34003,76125,33319,76125,34447,76071,35031,76131,65407,76071, -65335,76135,65076,76070,65513,76139,65791,76139,65407,76139,65171,76139, -65076,76071,65625,76149,65267,76149,20035,76070, 375,76155,74794,76071, -59381,76159,74819,76159,74571,76071,56555,76165,59619,76167,56555,76164, -59381,76171,12377,76070, 375,76175,49204,76071, 1369,76071, 241,76181, -56555,76071,74571,76184,59381,76187,59381,76185,74571,76191,49205,76071, -65869,76195, 1275,76071, 903,76199,60857,76070, 59,76203, 1325,76203, - 331,76203, 265,76203, 903,76070, 59,76213, 1325,76213, 331,76213, -56555,76070,74877,76221,74866,76221,65513,76221,65791,76221,65407,76221, -74807,76221,74823,76221,74797,76221,21105,76221,75029,76221,75283,76221, -21549,76221,19625,76221,65171,76221,75079,76221,74813,76221,59619,76221, -74571,76254,74571,76221,59619,76258, 15,76221,74887,76263,21605,76070, -73949,76267, 265,76071,63823,76271,63679,76271,72619,76271, 9377,76271, - 9533,76271,37145,76271, 2,76070,76077,76285,76081,76285,55839,76285, -54159,76285,54497,76285,51803,76285,73123,76285,76179,76285,65869,76301, - 265,76285, 3,76070,76196,76307,67988,76307, 33,76307, 1447,76307, - 1141,76307,76271,76307,76195,76307,65869,76320, 9,76307,46863,76307, -65869,76326,65869,76307,76195,76330,46863,76330, 2,76071,76310,76337, -76328,76337,76334,76337,76083,76337, 10,76337, 5,76337, 7,76348, - 7,76337, 5,76352,55803,76337,54225,76337,54477,76337,51593,76337, -67988,76337,76307,76364,64345,76337,76324,76337,73121,76337,72713,76337, -76326,76337,65869,76376, 9,76337,76307,76380,60857,76337,71229,76385, -76347,76387,76351,76387,76355,76387, 903,76337,46863,76337,76330,76396, -65869,76396,76307,76400,76307,76396,65869,76404,76330,76337,46863,76408, -65869,76337,76326,76412,46863,76412,76307,76416,76307,76412,46863,76420, -76307,76337,67988,76424, 9,76424,46863,76424,65869,76430,65869,76424, -46863,76434, 3,76071, 5,76438,76285,76441, 113,76439,46863,76438, -76285,76447,65869,76449,76285,76439,67988,76453, 9,76453,46863,76453, -65869,76458,65869,76453,46863,76462, 15,76071,74485,76467,73261,76467, -46863,76071, 3,76472,76285,76475,65869,76477, 3,76473,76412,76481, -65869,76481,76337,76484,76337,76481,65869,76488,65869,76070, 375,76493, -70176,71229, 375,76497, 3,71229,70554,76500, 5,76501, 1,76505, -71229,76507, 2,76509,59961,76505,74887,76513, 6,76505,76511,76517, -73261,76517, 0,76500,75163,76523, 524,76523,74887,76527,75155,76523, - 1291,76523,74887,76533,75211,76523,75441,76523, 483,76523, 11,76540, -74887,76543, 11,76523, 483,76546,74887,76549, 33,76501, 9,76553, - 8147,76501,42315,76501,53777,76501,70555,76500,70176,76500, 9,76565, -43848,76501,70177,76501,76563,76571,76566,76571, 9,76571,76565,76576, -76565,76571, 9,76580, 1141,76501, 9,76585, 1447,76501, 9,76589, -69849,76500,68155,76593,17049,76500,48643,76597, 1369,76501, 803,76601, - 15,76500,76337,76605,37409,76501, 9,76609, 9,76500,70177,76613, -76565,76615,70177,76612, 1141,76613, 1447,76613, 33,76613, 11,76613, -37409,76613, 11,76501, 9,76631, 6,76500, 7,76500, 33,76637, - 1447,76637, 1141,76637,76271,76637, 6,76501,60856,76647, 0,76647, - 3,76650, 3,76647, 0,76654, 11,76647,71229,76659,76649,76661, -76653,76661,76657,76661, 7,76501,43503,76668,70177,76500, 9,76672, -70176,76501,76619,76677,76503,76677,76675,76677,76673,76677, 9,76685, -43503,76501, 7,76688, 17,76689, 1011,76501, 375,76695, 7,76695, -18967,76501, 4,76700, 5,76700,76071,76705, 6,76704, 6,76705, -76070,76701,76709,76713,76705,76713, 14,76700,76713,76719,71229,76701, - 7,76723,76711,76725, 7,76722,76709,76729,76705,76729,76719,76729, - 15,76723,76071,76701,76703,76739, 15,76700,76739,76743, 6,76700, - 5,76746,76729,76749,76713,76749, 7,76700,76707,76755,76711,76755, - 6,76701,76743,76761,76737,76761, 7,76701,76749,76767,76709,76767, -71229,76766,76749,76773,76709,76773,76705,76773,76719,76773,76719,76767, -65869,76500,68155,76785,68109,76785, 256,76785, 7,76785, 241,76792, - 241,76785, 7,76796,70572,71229,68155,76801,68109,76801, 256,76801, - 7,76801, 241,76808, 241,76801, 7,76812, 2,71229, 0,76817, - 4,76818, 0,76816, 2,76823, 5,76816,62284,76817,62186,76817, -64248,76817,62504,76817,64205,76817,61690,76817,52501,76817,70021,76817, -17496,76817,11179,76817,10187,76817,53967,76817,17455,76817, 9,76852, -16065,76817, 16,76857, 16,76856, 17,76857,76861,76863, 17,76856, -76859,76867,70802,76817, 340,76817,60857,76872,64148,76817, 265,76876, - 9,76817,17455,76880, 375,76817,60857,76884, 587,76817, 17,76889, -37145,76891, 9533,76891,76523,76891,76821,76891,63679,76891,44243,76817, -60857,76902,49713,76903, 17,76816,36729,76909,68447,76909,67547,76909, -70731,76909,49713,76816,44243,76919,54295,76817, 9,76923, 6,76816, -66737,76927,36661,76927,62741,76927,68381,76927,68727,76927, 7,76816, -54497,76939,55839,76939,54159,76939,51803,76939,73123,76939, 265,76939, - 7,76817,62494,76952,70573,76952, 265,76952,60857,76958,60857,76952, - 265,76962, 265,76953,60857,76967,62494,76817, 7,76970,43215,76817, - 9,76975, 265,76817,64148,76978, 483,76979, 7,76978,60857,76984, -60857,76978, 7,76988,60857,76817,42810,76993,42810,76992,42811,76993, -76997,76999, 375,76992, 340,76992,42811,76992,76995,77007,44243,76992, - 6,76992, 7,76992, 265,77014, 6,76993,77015,77019, 7,76993, -77013,77023, 265,76993, 7,77027, 265,76992, 7,77030,65869,76817, -69275,77035, 7,77037,70573,76817, 6,77041, 7,77041, 6,77040, -77045,77047, 7,77040,77043,77051,65869,76816,69716,77055, 7,77055, -69513,77058,69513,77055, 7,77062,70922,71229,69716,77067, 7,77067, -69513,77070,69513,77067, 7,77074, 6,71229,74890,77079,59619,77081, -38056,77078, 5,77084,76825,77079,76827,77089,55814,77078,55815,77079, -77093,77095,55815,77078,55814,77079,77099,77101, 1346,77078, 1346,77079, - 1347,77078,77107,77109,17126,77079,17125,77079, 2,77114,17127,77079, - 9565,77119,74169,77079,59619,77123,60621,77079,59619,77127,38056,77079, -38057,77078,44195,77133,58303,77079, 1010,77079, 1010,77078,77119,77141, -35187,77079, 2,77144, 0,77079, 4,77149, 2,77151,71229,77152, -71229,77151, 2,77156, 2,77157,76816,77151, 1011,77149,71229,77165, - 5,77079, 1,77168, 5,77078,38056,77173,77133,77175, 2,77172, -58302,77079,77141,77181, 9565,77181,59619,77181,20501,77079, 1011,77189, - 1010,77188,77191,77193, 1010,77189, 1011,77188,77197,77199, 567,77079, -21604,77203,21604,77202,21605,77203,77207,77209,21605,77202,77205,77213, - 1347,77079,77105,77217,74887,77079,56555,77220,59619,77223,56555,77221, -59381,77227, 9875,77079, 1011,77231, 1010,77230,77233,77235, 1010,77231, - 1011,77230,77239,77241,56555,77079,74887,77244,59619,77247,59619,77245, -74887,77251, 1011,77244, 9565,77255,77141,77255,59619,77255, 1011,77245, - 9617,77263,77139,77263,74887,77263, 587,77079,21605,77271,42155,77273, -53517,77273,76085,77273,77171,77273, 7971,77273, 1011,77078,77113,77285, -77117,77285,74505,77285,77131,77285,77137,77285,77147,77285,73261,77285, -38057,77079,77179,77301,77087,77301,41941,77301,76827,77301, 9565,77301, -59619,77301,77141,77301,56555,77078,72981,77317,75508,77317,74887,77317, -59381,77322,59381,77317,74887,77326,21605,77078,62905,77331,68761,77331, -67541,77331,70401,77331,73967,77331, 1011,77079,56555,77343,59381,77345, -56555,77342,59619,77349,77141,77349, 9565,77349, 2,77078,66737,77357, - 5,77356,77301,77361,62741,77357,36661,77357,68727,77357,68381,77357, - 3,77078,77161,77373, 2,77079,17125,77376,77285,77379,35187,77376, -77285,77383, 3,77079,77155,77387,77159,77387,77163,77387,77167,77387, - 11,77079,37844,77397,37844,77396,37845,77397,77401,77403,37845,77396, -77399,77407,65869,71229, 1530,77410, 842,77410,48535,77410, 669,77410, - 1419,77410,49514,77410, 136,77410,49515,77410, 137,77410, 843,77411, -77415,77431, 1531,77411,77413,77435, 843,77410, 1530,77411, 1531,77410, -77441,77443, 842,77411,77439,77447, 1418,77410,48534,77410, 668,77410, - 587,77410,46863,77456, 9,77456, 1369,77410, 15,77462, 9,77410, - 2,77467, 2,77466, 587,77466, 265,77410, 375,77475, 15,77410, - 1369,77478,46863,77410, 2,77483, 2,77482, 587,77482, 7,77411, - 59,77491, 1325,77491, 331,77491, 265,77491, 6,77410,77491,77501, - 2,77503, 3,77503, 2,77502,77507,77509, 3,77502,77505,77513, - 3,77411,67577,77517,77425,77517,77423,77517,68139,77517,70979,77517, -77455,77517,77453,77517,77421,77517,77471,77517,77487,77517,77461,77517, -77459,77517,77473,77517,77489,77517, 7,77517, 1011,77517, 7,77549, - 2,77410, 9,77552,77517,77555,46863,77552,77517,77559,69716,77553, -77546,77553, 7,77553,69513,77566,77517,77566,69513,77553, 7,77572, -77517,77553, 6,77577, 7,77577, 6,77576,77581,77583, 7,77576, -77579,77587, 2,77411,76517,77591,29229,77591,72789,77591,77429,77591, -77427,77591,72683,77591,74233,77591,77317,77591,77451,77591,77419,77591, -77417,77591,77285,77591,73087,77591,77465,77591,77481,77591, 7,77591, -70573,77591, 7,77625, 3,77410, 4,77628,77591,77631, 1,77628, - 5,77628, 0,77628,77591,77639, 5,77629, 6,77643,77591,77645, -68155,77629,77469,77629,77485,77629,68109,77629,77623,77629,77631,77657, -77639,77657, 256,77629,77622,77629,77635,77665,77637,77665, 6,77629, -77632,77671,77640,77671,77631,77671,77591,77676,77639,77671,77591,77680, -77591,77671,77631,77684,77639,77684, 7,77629,77635,77691,77591,77693, -77637,77691,77591,77697, 241,77690,77591,77690,77635,77703,77637,77703, - 241,77629, 7,77708,77591,77629, 6,77713, 7,77713, 6,77712, -77717,77719, 7,77712,77635,77723,77637,77723,77715,77723, 6,77411, - 7,77410, 375,77733,77731,77733, 2,77737, 3,77737, 2,77736, -77741,77743, 3,77736,77739,77747, 1, 6,18363,77751, 4389,77751, -18362,77751, 4388,77751,70572,77750,70667,77761,70849,77761,70803,77761, -56555,77767,70883,77761, 272,77751, 8997,77773, 4425,77773, 8452,77751, - 251,77779, 8841,77779, 8453,77751, 273,77751, 4139,77751, 8429,77751, - 4138,77751, 8428,77751,70879,77751,70797,77797,18257,77751, 465,77801, - 445,77751,17827,77805, 4371,77751, 265,77808,18339,77751, 265,77812, -64953,77751, 375,77817,14888,77751, 375,77821,13569,77751, 375,77825, - 4137,77751, 265,77828, 8401,77751, 265,77832, 413,77750,77835,77837, -77831,77837,77795,77837,77793,77837,77815,77837,77811,77837,77757,77837, -77759,77837, 241,77837, 1217,77750, 412,77750, 8401,77859, 4137,77859, -18339,77859, 4371,77859,77791,77859,77789,77859,77753,77859,77755,77859, - 1216,77750,40461,77751, 9,77879,59573,77751, 375,77883,69467,77751, - 375,77887, 7047,77751, 412,77891, 413,77890,77893,77895, 413,77891, - 412,77890,77899,77901,12615,77751, 375,77905,45880,77751,46275,77909, -33390,77751,34003,77913,77462,77751,77591,77917,65232,77751,65625,77921, - 923,77751,16481,77925,16783,77925,18797,77925,25367,77751, 9,77933, -68975,77751, 375,77937,62984,77751, 9,77941, 1412,77751,17827,77945, - 412,77751,77837,77949, 1216,77751, 9137,77751, 375,77955, 253,77751, - 9136,77959, 9137,77959,17826,77959, 1,77959, 413,77966,17827,77959, - 413,77959, 1,77972, 265,77958, 8997,77977, 4425,77977,77963,77977, -77965,77977,77969,77977,77975,77977, 265,77959, 8997,77990, 8997,77959, - 265,77994, 265,77995,12377,77959, 8337,77751, 266,78003, 267,78003, - 464,78003, 6,78003, 413,78010, 465,78003, 413,78003, 6,78016, - 265,78002, 251,78021, 8841,78021,78007,78021,78009,78021,78013,78021, -78019,78021, 265,78003, 251,78034, 251,78003, 265,78038, 265,78039, - 375,78003,38057,77751, 265,77751,18339,78048,77837,78051, 4371,78048, -77837,78055, 253,78048, 8997,78059, 4425,78059, 8337,78048, 251,78065, - 8841,78065,77837,78049, 8401,78071, 4137,78071,18339,78071, 4371,78071, - 4137,78048,77837,78081, 8401,78048,77837,78085, 241,78049, 8401,78089, - 4137,78089, 1369,78048,17827,78095, 241,78048, 1011,77751,56555,78101, -60369,78103, 241,77751, 413,78107,14315,78106, 375,78111,57522,78107, -67028,78107, 265,78107,60857,78106, 9,78121,56555,78107, 9,78124, -65869,78107, 483,78128, 483,78107,65869,78132, 9,78107,56555,78136, - 265,78106, 8685,77751, 375,78143, 264,77750,78066,78147,78060,78147, -78091,78147,78093,78147,18339,78147, 4371,78147,17911,78147,13433,78147, -13411,78147,13635,78147,77978,78147,78022,78147,77999,78147,78043,78147, -77774,78147,77780,78147,64733,78147,64955,78147,78021,78147, 251,78184, -77977,78147, 8997,78188,78065,78147, 251,78192,78059,78147, 8997,78196, -77779,78147, 251,78200,77773,78147, 8997,78204, 9139,78147, 9123,78147, - 9065,78147,14935,78147,64919,78147,59463,78147,69357,78147,59533,78147, -69427,78147,59587,78147,69481,78147,78088,78147, 8401,78231, 4137,78231, - 8997,78147,78059,78236,77977,78236,77773,78236, 251,78147,78065,78244, -78021,78244,77779,78244,27979,78147,26293,78147,41503,78147, 8685,78147, -78141,78147,77949,78147,78099,78147,78049,78147, 8337,78267, 251,78269, - 253,78267, 8997,78273, 241,78266, 8401,78277, 4137,78277, 241,78267, - 1369,78147, 241,78147, 6,78287,78065,78289,78021,78289,77779,78289, - 1,78287,78059,78297,77977,78297,77773,78297,78049,78286, 8401,78305, - 4137,78305,16381,78147,19513,78147,35843,78147,13325,78147,70407,78147, -69063,78147,67565,78147, 341,78147,64669,78325, 8997,78325,59381,78325, -69275,78325,65869,78325, 241,78325, 471,78147, 367,78147, 357,78147, - 8401,78147, 4137,78147,37019,78147, 4063,78147,20219,78147, 3863,78147, -20697,78147,37377,78147, 9955,78147,10273,78147,14625,78147, 4569,78147, - 265,77750,77785,78369, 251,78371,77787,78369, 8997,78375, 253,78369, - 8997,78379, 8337,78369, 251,78383, 241,78368, 8401,78387, 4137,78387, -77791,78387,77789,78387, 241,78369, 241,77750, 8428,78399,78147,78401, - 4138,78399,78147,78405, 4137,78399, 265,78409, 265,78408,78147,78413, - 8401,78399, 265,78417, 265,78416,78147,78421, 265,78398, 8401,78425, - 4137,78425,77791,78425,77789,78425, 265,78399, 8401,78434,78147,78437, - 4137,78434,78147,78441,78147,78435, 8401,78445, 4137,78445, 240,77751, - 265,78451, 1010,77751,28337,78455, 264,77751,78426,78459,78428,78459, -78419,78459,78411,78459,78388,78459,78390,78459,77860,78459,77862,78459, -77864,78459,77866,78459,18339,78459,77859,78480, 4371,78459,77859,78484, -78381,78459,78385,78459,13381,78459,77961,78459,78005,78459,77993,78459, -78037,78459,77997,78459,78041,78459,78015,78459,77971,78459,77807,78459, -77803,78459,64746,78459,78382,78459, 251,78517,78378,78459, 8997,78521, -78035,78459, 251,78525,77991,78459, 8997,78529, 9072,78459, 9105,78459, -59470,78459,69364,78459,59521,78459,69415,78459,64931,78459, 413,78459, -77859,78459, 8401,78548, 4137,78548,18339,78548, 4371,78548,78425,78459, - 8401,78558, 4137,78558,78387,78459, 8401,78564, 4137,78564, 8401,78459, -78425,78570,78387,78570,77859,78570, 4137,78459,78425,78578,78387,78578, -77859,78578, 8337,78459,78369,78586, 251,78589, 253,78459,78369,78592, - 8997,78595,78396,78459,78119,78459,78369,78459, 8337,78602, 251,78605, - 253,78602, 8997,78609, 241,78603, 8401,78613, 4137,78613, 241,78602, -69275,78459, 375,78620,59381,78459, 375,78624, 8997,78459, 375,78628, -64669,78459, 375,78632,70327,78459,65869,78459, 375,78638,66930,78459, - 375,78459,64669,78644, 8997,78644,59381,78644,69275,78644,65869,78644, - 241,78644, 241,78459,78369,78658, 375,78658, 394,78459, 299,78459, - 1217,77751, 413,77751,77859,78671,78369,78671, 375,78671,14315,77751, - 241,78678, 375,78681, 375,78679, 341,77751,12377,78687, 257,77751, - 375,78691,70572,77751,70693,78695,70800,78695,70797,78695,56555,78700, -56555,78695,70797,78704, 1346,77751, 9,78709, 1061,77751, 9,78713, - 525,77751, 9,78717,64396,77751, 9,78721,38056,77751,29229,78725, - 9,78725, 137,77751,56555,78731, 5,78733, 4,78732,78735,78737, - 4,78733, 5,78732,78741,78743,20103,77751, 375,78747, 1471,77751, -12377,78751,36773,77751, 375,78755, 53,77751,12377,78759,45639,77751, - 1369,78762,46275,78765,32805,77751, 17,78768,34003,78771,77410,77751, - 1369,78774,77591,78777,65076,77751, 17,78780,65625,78783, 1275,77751, - 5,78786, 9,78789, 5,78787, 17,78793,35187,77751, 1196,78797, - 6,78797, 1011,78800, 137,78797, 136,78797, 1197,78797, 1413,78797, - 922,78797, 1011,78797, 6,78814, 903,78797, 483,78818, 483,78797, - 903,78822, 2,78796,78805,78827,29229,78827,78799,78827,78817,78827, -78803,78827, 9,78827, 3,78796,78807,78841,78809,78841, 2,78797, -78841,78847, 9,78849, 9,78846,78841,78853, 3,78797, 5,78857, - 6,78859,78827,78861,78838,78857, 9,78857,78827,78866,78827,78857, - 9,78870, 9,78797, 2,78875,78857,78877, 3,78875, 2,78874, -78841,78883, 3,78874, 17,77751,65076,78889,65407,78891,32805,78889, -34447,78895,20035,78889,58742,78889,65076,78888,65625,78903,32805,78888, -34003,78907, 903,78889,56555,78910,56555,78889, 903,78914,65869,78889, - 2,78919, 3,78919, 2,78918, 3,78918,18967,77751, 295,78929, - 1108,78929, 1011,78929, 9,78934, 9,78929, 1011,78938, 483,78929, -18967,78943, 5,78944, 5,78945,21036,78943,21037,78943, 4,78943, -78949,78955, 5,78943,18967,78958, 4,78942,78961,78963,78947,78963, -78951,78963, 5,78942,78953,78971, 1369,77751,12376,78974,12376,78975, -12377,78974,78979,78981,77410,78975,77517,78985,45639,78975,46599,78989, -12377,78975,78977,78993,36527,78975,68806,78975,77410,78974,77591,79001, -45639,78974,46275,79005, 1011,78975,65869,79008,65869,78975, 1011,79012, - 265,78974,17827,79017,56555,78975, 4,79021, 5,79021, 4,79020, - 5,79020,60857,77751, 241,79030, 9,79033, 5,79030, 9,79037, - 5,79031, 17,79041,70177,77751,38056,79045,38056,79044,38057,79045, -79049,79051,38057,79044,79047,79055, 375,79045,27979,77751, 375,79061, - 2,77750,68283,79065,68275,79065,36633,79065,36627,79065,39987,79065, -66423,79065,66883,79065,66405,79065,66397,79065,67687,79065,78047,79065, - 9,79087,36544,79065, 9875,79091,20501,79091,68177,79065, 9875,79097, -20501,79097,64396,79065, 9,79103, 5,79065,60857,79106, 9,79109, -35187,79065, 11,79112,20501,79115, 9875,79115, 11,79065,35187,79120, - 9875,79123,20501,79123,60857,79065, 5,79129, 17,79131, 5,79128, - 9,79135, 3,77750,40779,79139,63907,79139,73421,79139,73429,79139, -64235,79139,67465,79139,63955,79139,39027,79139,38685,79139,64073,79139, - 6,79139, 4,79161,78728,79139,78838,79139,78827,79139, 9,79168, -78725,79139, 9,79172, 9934,79139,20644,79139, 4663,79139, 903,79181, -17219,79139, 903,79185,12345,79139, 5,79189, 4,79188,79191,79193, - 4,79189, 5,79188,79197,79199, 5123,79139, 5,79203, 4,79202, -79205,79207, 4,79203, 5,79202,79211,79213,19667,79139, 5,79217, - 4,79216,79219,79221, 4,79217, 5,79216,79225,79227,73306,79139, - 9377,79231,63823,79231,40705,79139, 9377,79237,63823,79237,21036,79139, -70177,79139, 9,79245, 341,79139,64669,79249,65869,79249, 253,79139, -65869,79255, 8337,79139, 9,79259, 241,79139, 1471,79139,65869,79265, -37325,79139, 903,79269,20103,79139, 9,79273,10219,79139, 903,79277, - 4,79139,20501,79280, 9875,79280, 5,79139, 6,79287,78827,79289, -78725,79289,18967,79286, 9935,79287,20645,79287,36773,79139, 9,79301, - 53,79139,65869,79305, 5,79138,27979,79309, 8685,79309,41503,79309, -26293,79309, 1369,79309,16381,79309,13325,79309,35843,79309,19513,79309, - 8401,79309, 4137,79309,14625,79309, 4569,79309,37019,79309, 4063,79309, - 3863,79309,37377,79309,20219,79309,10273,79309, 9955,79309,20697,79309, - 9,79139,78725,79352,78827,79352,35187,79139, 1505,79359, 17,79139, -71229,79362, 9377,79365,63823,79365,21315,79363,71229,79139, 17,79372, -63823,79375, 9377,79375,18967,79139,20413,79381, 4,79383, 4,79382, -20487,79381,20486,79381,79161,79381, 4,79393, 4,79392,79163,79381, - 580,79381,49630,79381,79162,79381,46863,79381, 4,79406, 4,79407, - 483,79381, 4,79412, 4,79413,49631,79381, 581,79381, 4,79381, -20413,79422,79161,79422,46863,79422, 483,79422, 5,79381,79385,79433, -79179,79433,79283,79433,79395,79433,79411,79433,79417,79433,20413,79433, - 4,79380,79389,79449,79446,79449,79421,79449,79419,79449,79399,79449, -79433,79449,20413,79460,20413,79449,79433,79464, 5,79380,79425,79469, -79387,79469,79391,79469,79427,79469,79397,79469,79401,79469,79403,79469, -79405,79469,79429,79469,79409,79469,79431,79469,79415,79469,79423,79469, -20413,79495, 1369,79139, 5,79499,27979,79139,65869,79503, 9,79503, -20501,79139, 4,79508,79433,79511, 5,79508,18967,79514,21037,79508, - 4,79509,79517,79521,79243,79521,79295,79521,79469,79521, 5,79509, -79519,79531, 9875,79139, 4,79534, 5,79534, 4,79535, 5,79535, - 4,77750, 3,79545, 5,77750,10256,79549,37356,79549, 4745,79549, - 1011,79555,17423,79549, 1011,79559,63550,79549,64489,79549,63493,79549, - 17,79566,70803,79549,56555,79571,74752,79549, 8982,79549,74571,79549, - 17,79578, 8861,79549, 17,79582,37844,79549,27979,79549, 483,79589, - 253,79549,56555,79593, 8337,79549, 483,79597, 241,79549, 1325,79549, - 17,79602, 331,79549, 17,79606, 1328,79549, 334,79549, 53,79549, -56555,79615,20501,79549, 1011,79619,36773,79549, 483,79623, 9875,79549, - 1011,79627, 1359,79549, 393,79549, 2,79549,37325,79634,10219,79634, - 3,79549, 483,79641,35187,79640,10257,79641,37357,79641, 62,79549, - 59,79549, 17,79652,20103,79549, 483,79657, 1471,79549,56555,79661, - 3,79548,27979,79665, 8685,79665,26293,79665,41503,79665, 1369,79665, -16381,79665,13325,79665,19513,79665,35843,79665, 8401,79665, 4137,79665, -14625,79665, 4569,79665,20219,79665, 3863,79665, 4063,79665,20697,79665, -37019,79665, 9955,79665,10273,79665,37377,79665,18967,79549, 165,79709, - 1369,79549,38057,79713,35187,79549, 3,79717, 3,79716, 17,79549, -63493,79722,74571,79722, 8861,79722, 1325,79722, 331,79722, 59,79722, -37325,79549, 2,79736, 3,79736, 2,79737, 3,79737,10219,79549, - 2,79746, 3,79746, 2,79747, 3,79747, 5,77751, 1196,79756, - 1196,79757, 1197,79756,79761,79763,21604,79757, 6,79757, 587,79769, -21605,79771, 1,79757, 3,79774, 3,79775,18967,79775, 483,79781, - 1,79756,25381,79785,63014,79785,79773,79785,60857,79785, 483,79792, - 483,79785,60857,79796, 6,79756,79787,79801,63015,79801,79785,79805, -25380,79801,79785,79809,79789,79801,79783,79801,79799,79801, 1369,79801, -21605,79818,79785,79821,79795,79801,21605,79801, 1369,79826,79785,79829, - 1216,79757, 413,79757, 1197,79757,79759,79837,79546,79757, 903,79757, -20735,79757, 9993,79757, 1275,79756, 9,79849,60857,79756, 9,79853, -56555,79757, 1505,79856,21605,79757,21376,79757, 483,79757,21315,79864, -58112,79757,21315,79757, 483,79870, 1505,79757,56555,79874, 2,79756, -79767,79879, 7,79881, 6,79880,79883,79885, 6,79881, 7,79880, -79889,79891,79777,79879, 7,79895, 6,79894,79897,79899, 6,79895, - 7,79894,79903,79905,28337,79879, 3,79756,79861,79911, 7,79913, - 6,79912,79915,79917, 6,79913, 7,79912,79921,79923, 2,79757, -79779,79927, 7,79929, 6,79928,79931,79933, 6,79929, 7,79928, -79937,79939, 3,79757, 1,79942,79879,79945, 7,79947, 6,79946, -79949,79951, 6,79947, 7,79946,79955,79957,79545,79942,79545,79757, - 2,79963, 3,79963, 2,79962, 3,79962, 9,79757,63493,79973, -74571,79973, 8861,79973, 1325,79973, 331,79973, 59,79973, 3,77751, -79112,79987, 9,79989,78847,79987, 9,79993, 1216,79987,12371,79987, - 5,79999, 4,79998,80001,80003, 4,79999, 5,79998,80007,80009, - 413,79987, 375,79987,60454,79987,60369,80017, 566,79987,35187,79987, -79065,80022, 9,80025,79106,79987, 1011,79987,37407,79987,10287,79987, -65869,79987, 165,80036,38132,79987, 9,79987,38057,80042,67642,79987, -38057,79987, 9,80048, 165,79987,65869,80052, 5,79986, 4,79987, - 5,79987,79065,80060,56555,80060,60369,80065, 483,80060,79065,79987, -35187,80070, 9,80073, 4,80071, 5,80071, 4,80070, 5,80070, -56555,79987,49630,80084,46863,80084, 4,80089, 4,80088, 581,80084, - 580,80084,49631,80084, 4,80084,46863,80100, 483,80100, 5,80084, -60369,80107,80091,80107, 4,80085,80095,80113,80099,80113, 5,80085, -60327,80119,60719,80119,80097,80119,80087,80119,57901,80119,80093,80119, -80103,80119,80105,80119, 483,80084, 4,80136,80119,80139, 4,80137, -80107,80143, 483,79987, 5,80146, 2,77751,79538,80151,79541,80153, -79514,80151,79521,80157,79024,80151,79027,80161,78958,80151,78963,80165, -79021,80151, 5,80168,79027,80171, 5,80169,79023,80175,78943,80151, - 5,80178,78963,80181, 5,80179,78955,80185, 1,80151, 7,80189, - 4,80191, 4,80190, 16,80189, 4,80189, 7,80198,28714,80151, - 17,80203,79286,80151,79541,80207,79521,80207,35187,80150,79289,80213, -29229,80213,79352,80213, 9,80213,79139,80220,79139,80213, 9,80224, - 9,80151, 4,80150, 265,80231, 5,80150,80193,80235,28337,80235, - 4,80151, 1011,80241, 5,80151,80195,80245,80201,80245,79534,80245, -79543,80251,79508,80245,79531,80255,79021,80244,79027,80259,78943,80244, -78963,80263,79021,80245,79029,80267,78943,80245,78971,80271,80197,80245, -28219,80245,30475,80245,23939,80245,79139,80244,79541,80283,79521,80283, -21605,80244, 17,80289,79139,80151,35187,80293, 9,80295, 4,80293, - 5,80293,79537,80301,79511,80301,79177,80301,79179,80301,79285,80301, -79283,80301, 4,80292,80301,80315, 5,80292,79541,80319,79521,80319, -80299,80319,21605,80151, 5,80326, 17,80329, 5,80327, 9,80333, - 4,77751,79750,80337,79753,80339,79740,80337,79743,80343,78922,80337, -78925,80347,78880,80337,78883,80351,78919,80337, 3,80354,78925,80357, - 3,80355,78921,80361,78875,80337, 3,80364,78883,80367, 3,80365, -78877,80371, 6,80337, 1369,80375,56555,80377, 1,80337,60857,80381, - 1275,80383, 1,80336,58931,80387,19916,80387,80379,80387,18967,80387, - 1275,80394, 1275,80387,18967,80398, 6,80336,19917,80403,80387,80405, -80389,80403,80391,80403,58930,80403,80387,80413,80385,80403,80401,80403, - 587,80403,56555,80420,80387,80423,80397,80403,56555,80403, 587,80428, -80387,80431,43214,80337,79640,80337,79753,80437,79743,80437, 2,80336, - 265,80443, 2,80337, 903,80447, 3,80337,67988,80450,67988,80451, -67989,80450,80455,80457,79746,80451,79755,80461,79736,80451,79745,80465, -78919,80450,78925,80469,78875,80450,78883,80473,78919,80451,78927,80477, -78875,80451,78887,80481,67989,80451,80453,80485,79549,80450,79753,80489, -79743,80489,38305,80450,79549,80337, 2,80497, 3,80497,79749,80501, -79739,80501,79551,80501,79553,80501,79639,80501,79637,80501, 2,80496, -80501,80515, 3,80496,79753,80519,79743,80519,80499,80519,38305,80337, - 3,80526, 3,80527, 0, 7, 1517,80532, 2575,80535, 949,80532, - 2599,80539, 1476,80532, 2269,80543, 280,80532, 2289,80547, 272,80532, - 4437,80551, 121,80532,38343,80555, 3075,80555, 1913,80555, 76,80532, - 3005,80563, 1899,80563,38337,80563, 123,80533, 3061,80571, 81,80533, - 2997,80575, 367,80532, 7627,80579, 357,80532, 1927,80583, 397,80532, - 7895,80587, 1516,80532, 948,80532, 107,80532, 2221,80595, 203,80532, - 2215,80599, 215,80532, 4339,80603, 91,80532, 5045,80607, 1477,80532, - 281,80532, 273,80532, 317,80532,14469,80617, 67,80532,11087,80621, - 4643,80621, 2233,80621, 4625,80621, 9,80629, 53,80532, 2289,80633, - 1471,80532, 2269,80637,80012,80533,77949,80641,79834,80533,77949,80645, -79996,80533,78669,80649,79832,80533,78669,80653,78546,80533,77949,80657, -78108,80533,78141,80661,77949,80661,77855,80533,77949,80667, 416,80533, -17993,80671, 418,80533,17993,80675, 447,80533,17993,80679, 295,80532, - 294,80532, 76,80533,38587,80687,26285,80533,26390,80533,26106,80533, - 121,80533,38585,80697,26502,80533,32269,80533,31761,80533,32563,80533, -31921,80533,31591,80533,78287,80533,78141,80713,78099,80713,77949,80713, -23788,80533,27830,80533,27947,80533,41746,80533,26216,80533,41414,80533, -26126,80533,41348,80533,26328,80533,41556,80533,29029,80533,43319,80533, - 203,80533, 2211,80745,60857,80745, 85,80533, 4593,80751, 2229,80751, -60857,80751,80229,80533,39823,80533,23013,80533,39229,80533,39783,80533, -38673,80533,38675,80533, 107,80533, 5019,80773, 2219,80773,60857,80773, -80228,80533,40956,80533,45411,80783,37899,80783,41493,80533, 1517,80533, - 2573,80791,80591,80791, 949,80533, 2593,80797,80593,80797, 280,80533, - 2287,80803,80613,80803, 1476,80533, 2267,80809,80611,80809, 272,80533, - 4457,80815,80615,80815, 8673,80533, 8681,80533, 8800,80533, 8742,80533, -41622,80533, 8740,80533, 8610,80533, 8642,80533, 8638,80533,39650,80533, -42752,80533, 8717,80533, 413,80843, 1369,80842, 341,80842, 3785,80533, - 413,80851, 1369,80850, 341,80850, 413,80532, 8717,80859, 3785,80859, -13443,80859, 7627,80859, 7287,80859, 7895,80859,12755,80859, 1689,80859, - 2701,80859, 1705,80859,77859,80859,78459,80880,78548,80859,78048,80859, -77837,80887,78071,80859,18454,80859,78147,80859,78459,80859,77859,80896, - 265,80859,77751,80900,77837,80903,77751,80901,77859,80907,18391,80859, - 331,80910, 331,80859,18391,80914, 8495,80859,77751,80859, 265,80920, -77837,80923,12745,80859, 375,80927, 457,80927, 375,80859,13977,80533, -80021,80533,13767,80533, 4347,80533, 2213,80533, 2225,80533, 2231,80533, -10079,80533,79501,80533,18715,80533,18579,80533,14313,80533,80149,80533, -13945,80533, 4987,80533,14091,80533, 4619,80533,80069,80533,13913,80533, - 4555,80533,16635,80533,16301,80533, 2575,80533, 2599,80533, 2289,80533, - 2269,80533, 4437,80533, 7549,80533, 7589,80533,13785,80533,80015,80533, -23755,80533, 1369,80996,39633,80533, 1369,81000,78284,80533, 7205,80533, - 2561,80533, 2261,80533, 4423,80533, 2307,80533,79318,80533,10058,80533, -79674,80533,26331,80533, 1369,81022,41559,80533, 1369,81026, 4329,80533, - 1369,81030, 4311,80533, 1369,81034,10354,80533, 3786,80533, 4330,80533, -27805,80533, 1369,81044,42731,80533, 1369,81048,10055,80533, 1369,81052, -10351,80533, 1369,81056, 4312,80533,78645,80533,78324,80533,78458,80533, - 375,81067, 3794,80533,78147,80533, 413,81073, 1369,81072, 341,81072, - 215,80533, 4345,81081,60857,81081,79309,80533, 1369,81086,79665,80533, - 1369,81090, 1477,80533,80543,81095, 281,80533,80547,81099, 1516,80533, -80535,81103, 948,80533,80539,81107,13443,80533,16669,80533,43293,80533, -26104,80533,41314,80533,26277,80533,41479,80533,13027,80533, 264,81124, - 264,81125, 413,81125, 265,81124,81129,81133, 265,81125,81127,81137, - 5127,80533, 264,81140, 264,81141, 413,81141, 265,81140,81145,81149, - 265,81141,81143,81153,15309,80533, 412,81157, 413,81156,81159,81161, - 413,81157, 412,81156,81165,81167,32294,80533,45314,80533,31857,80533, -44925,80533,14053,80533,22897,80533,39143,80533,78107,80533, 413,81184, -78141,81187,77949,81187, 413,81185,77859,81193, 1276,80533,17993,81197, - 438,80533,17993,81201, 1278,80533,18759,81205, 1242,80533,18759,81209, -22806,80533, 903,81213, 9,81213,39084,80533, 483,81219,39204,80533, -41941,81223,22956,80533,26625,81227, 1109,80533,35187,81231, 294,80533, -80683,81235,35187,81235, 1413,80533, 1471,81241, 295,80533,80685,81245, -39749,80533, 483,81249,24095,80533,35187,81253, 11,81252,39787,80533, - 241,81259, 903,81259, 587,81258,24236,80533,39846,80533,78459,80533, - 413,81270,77949,81273, 413,81271,77859,81277,39232,80533,46169,81281, - 510,80533, 11,81285, 1108,80533, 11,81289, 1216,80533,79987,81292, -78669,81295,79757,81292,78669,81299, 1275,81292,18759,81303, 15,81292, -18759,81307, 8808,80533,41376,80533, 7195,80533, 1141,80533,14315,81317, - 959,80533,17125,81321, 253,80533,25793,81324,41019,81324, 8495,81324, - 317,80533,15661,81333,14991,81333,17993,81333, 2899,81333, 273,80533, -80551,81343, 8634,80533, 8677,80533, 331,80533, 413,81351,18391,81353, - 413,81350,17993,81357, 8861,81351,63493,81351,74571,81351,15029,81351, - 8495,80533, 586,81368, 586,81369, 587,81368,81373,81375, 11,81368, - 253,81368, 1471,81368, 53,81368, 587,81369,81371,81387, 305,81369, - 713,81369, 25,81369, 1369,81368, 257,81369, 257,81368,14011,80533, - 257,80533,25793,81404,41019,81404, 8495,81404, 973,80533,20103,81413, - 8337,81413,36773,81413, 341,80533,30091,81421, 8717,81420,20103,81421, -36773,81421, 8337,81421, 3785,81420,78147,81420, 89,80533,10831,81437, -10903,81437, 5019,81437,60857,81437,17125,81437, 567,80533,63493,81449, -74571,81449, 8861,81449, 652,80533,60857,81457, 288,80533, 8861,81461, - 265,80533,78670,81465,77859,81467, 413,81465,77751,81471,77837,81473, -77751,81470,77859,81477,73154,81465,62059,81465,78107,81465,15029,81465, - 4593,81465,11985,81465,78459,81465,80057,81465,79911,81465, 8861,81465, -63493,81465,74571,81465,72152,81465,61718,81465,77751,81465, 413,81508, -77859,81511, 413,81509,77949,81515, 17,81464,35187,81519, 11,81465, -60857,81522, 587,81465,71229,81526,71229,81465,60857,81530, 11,81531, - 587,81530,60857,81465, 10,81539, 10,81538, 305,81539, 11,81539, -81543,81547,71229,81538, 11,81538,81541,81553, 587,81464,60857,81557, - 11,81464, 8861,81561, 1011,80533,50785,81565, 9,81564, 11,81569, - 11,81565, 9,81573,71229,81565,77387,81577, 903,80533,50959,81581, -45149,80533,35187,81585, 11,81584,32103,80533,27021,81591, 241,81591, - 903,81591, 587,81590, 7333,80533, 483,81601, 6789,80533, 9,81605, - 903,81605,14073,80533, 241,81611, 903,81611, 587,81610,11277,80533, -35187,81619, 11,81618,42707,80533, 3445,80533, 375,81627,10313,80533, -79643,80533, 2621,80533,14229,80533,11571,80533, 5045,80533,35187,81641, - 11,81640, 4971,80533, 241,81647, 903,81647, 587,81646, 7009,80533, - 7497,80533, 7287,80533, 7845,80533, 7925,80533, 7895,80533, 7685,80533, - 7671,80533, 7627,80533,14102,80533,11348,80533, 5096,80533, 5000,80533, - 7533,80533, 4617,80533, 483,81683,13907,80533, 483,81687, 7563,80533, - 264,81691, 264,81690, 265,81691,81695,81697, 265,81690,81693,81701, - 7531,80533, 483,81705,79634,80533,80501,81709,79719,81709,79640,80533, - 483,81715,42716,80533,42795,81719,42704,80533, 483,81723,10308,80533, -36131,81727,10310,80533, 483,81731, 5227,80533, 5009,80533, 3461,80533, - 2981,80533, 3049,80533,80061,80533, 483,81745, 240,80532,77859,81749, -78459,81750,78089,81749,78147,81755,78305,81749,78231,81749,78277,81749, -78445,81749,78564,81749,78613,81749,78558,81749,78548,81749,78071,81749, -78387,81749,78459,81776,78425,81749,78459,81780,78434,81749,78147,81785, -13103,81749, 5161,81749,13074,81749, 5150,81749,13057,81749,13051,81796, - 5141,81749, 5137,81800,13051,81749,13057,81804, 5137,81749, 5141,81808, -13092,81749,13045,81813, 5154,81749, 5133,81817,78048,81749,77837,81821, -78459,81749,78387,81824,78425,81824,77859,81824,25793,81749,41019,81749, - 8495,81749,78147,81749,48009,81749,49321,81749,49001,81749,78399,81749, - 265,81847,78459,81849, 265,81846,78147,81853, 265,81749,13027,81856, -13045,81859, 5127,81856, 5133,81863,13027,81857,13057,81867, 5127,81857, - 5141,81871,78399,81856,78147,81875,77751,81856,77837,81879,77751,81857, -78387,81883,78425,81883,77859,81883,77751,81749, 265,81890,77837,81893, -23755,81749,39633,81749, 3785,81749, 8717,81749,79309,81749,79665,81749, -10055,81749,10351,81749,27805,81749,42731,81749,26331,81749, 4329,81749, -41559,81749, 4311,81749, 5127,81749, 265,81925, 5137,81927, 265,81924, - 5133,81931,13027,81749, 265,81935,13051,81937, 265,81934,13045,81941, - 1010,80532,27021,81945,24095,81945,52915,81945, 9195,81945,81565,81945, - 9,81955,81569,81945,23651,81945,67297,81945,81289,81945,21605,81945, - 9,81967,51435,81945, 4321,81945, 9755,81945,11277,81945, 5045,81945, - 4295,81945, 3833,81945,69729,81945,26907,81945,70097,81945,27323,81945, -53941,81945,53215,81945,10171,81945, 9317,81945, 264,80532,51421,82001, -39619,82001,57811,82001,59743,82001,59933,82001, 8093,82001, 3837,82001, -53703,82001, 4303,82001,42435,82001, 4287,82001,53487,82001, 9579,82001, -42113,82001, 9839,82001, 241,82001, 375,82032, 394,82001, 299,82001, - 375,82001, 241,82040,78399,80533, 264,82044, 264,82045, 413,82045, - 265,82044,82049,82053, 265,82045,82047,82057, 240,80533,78397,82061, -78459,82063,78099,82061,78147,82066,78264,82061,78283,82061,78260,82061, -78262,82061,78661,82061,78599,82061,78619,82061,78601,82061,78675,82061, -77837,82061,77949,82088,78673,82061,77950,82061,78118,82061,78459,82097, -78670,82061,77859,82101,77949,82061,78147,82104,77837,82104,78141,82061, -78147,82110, 413,82061,77751,82115,77837,82117,77751,82114,77859,82121, -78147,82061,78099,82124,78141,82124,77949,82124,78107,82061, 265,82132, -78459,82135, 265,82133,78147,82139,77751,82061, 413,82142,77859,82145, - 413,82143,77949,82149, 265,82061,78107,82152,78459,82155,78107,82153, -78141,82159, 902,80533,37663,82163,37599,82163, 265,80532,25793,82169, -41019,82169,39787,82169,23755,82169,39633,82169, 8495,82169,78147,82169, - 8717,82169, 3785,82169,79309,82169,79665,82169,27805,82169,42731,82169, -10055,82169,10351,82169,26331,82169,41559,82169, 4329,82169, 4311,82169, - 4555,82169,14073,82169, 4971,82169,21605,82169,65869,82215,38305,82169, -56555,82219, 483,82219, 241,80532, 4437,82225, 7,82225, 265,82229, -39787,82225,51615,82225, 4613,82225,12571,82225,14073,82225, 4971,82225, - 375,82225, 510,82225,51937,82225,16683,82225, 4805,82225, 9,82225, - 483,82254, 483,82225, 9,82258,38305,82225, 483,82263, 1010,80533, -55211,82267,64345,82267,36256,82267,35187,82267, 9,82274, 9,82267, -35187,82278, 1011,80532,10001,82283, 903,82285,27533,82283, 903,82289, -79139,82283, 903,82293,82267,82283, 9,82296,82278,82283,81231,82283, -21605,82283, 903,82305, 9,82283,82267,82308, 903,80532, 3549,82313, - 2001,82313,21769,82313,10291,82313, 1011,82321,42613,82313, 1011,82325, -79549,82313, 1011,82329,24095,82313,25793,82313, 8495,82313, 5045,82313, -11277,82313,39787,82313,14073,82313, 4971,82313,21605,82313, 955,82349, - 9,82349,65869,82349,38305,82313, 1011,82357, 483,82357,41019,82313, - 264,80533, 53,82365, 1471,82365, 253,82365,72567,82365,76285,82365, -76939,82365,77751,82364, 375,82379, 471,82365, 367,82365, 357,82365, - 341,82365, 241,82389, 241,82365, 9,82393, 483,82393, 413,80533, -78106,82398,78107,82399,82401,82403,78459,82403,78106,82399,78107,82398, -82409,82411,78141,82411,77949,82411,79987,82398,77949,82419,79757,82398, -77949,82423,78459,82398,77949,82427, 331,82398,17993,82431, 261,82398, -17993,82435,77949,82399,78459,82439,17993,82399, 331,82443, 1275,82398, -17993,82447, 15,82398,17993,82451, 375,80533, 53,82455, 1471,82455, - 253,82455, 1369,82455, 11,82455, 261,80533, 413,82467,18391,82469, - 413,82466,17993,82473,15029,82467, 264,82477, 265,82476,82479,82481, - 264,82476, 265,82477,82485,82487,16531,80533, 483,82491,12745,80533, - 264,82495,13129,82495, 413,82495,13119,82501,15503,82495,50535,82495, -50929,82495,51081,82495,82231,82495,13171,82495,13133,82495, 264,82494, - 265,82495,82519,82521, 265,82494,82497,82525, 375,82495, 257,82495, - 264,82531, 265,82530,82533,82535, 264,82530, 265,82531,82539,82541, - 566,80533, 53,82545, 253,82545, 1471,82545, 88,80533, 1369,82553, - 1346,80533,55211,82557,28714,80533,28337,82561,60618,80533,60757,82565, - 3,82565,60755,82569, 154,80533,37663,82573,43214,80533,43053,82577, - 483,82577,43502,80533,80531,82583,46169,82583, 67,80533,11529,82589, -11569,82589, 4610,82589,61780,82589, 9,82589, 4593,82598,60857,82598, -60857,82589, 9,82604, 4593,82589, 9,82608,37845,80533,38305,82612, -45411,82615,37899,82615,79926,80533,79987,82621, 4,82623, 5,82622, -82625,82627, 5,82623, 4,82622,82631,82633,80058,80533,79757,82637, - 2,82639, 3,82638,82641,82643, 3,82639, 2,82638,82647,82649, -80244,80533, 17,82653, 1447,80533,14315,82657, 33,80533,14315,82661, - 759,80533,17125,82665, 47,80533,17125,82669, 1471,80533,41019,82672, -25793,82672, 8495,82672, 53,80533,25793,82680,41019,82680, 8495,82680, -25793,80533, 586,82688, 586,82689, 11,82688, 1369,82688, 587,82688, -82693,82699, 253,82688, 53,82688, 1471,82688, 587,82689,82691,82709, - 25,82689, 713,82689, 305,82689, 257,82688, 257,82689, 1325,80533, -74571,82723,63493,82723, 8861,82723,15029,82723,41019,80533, 586,82732, - 586,82733, 587,82732,82737,82739, 11,82732, 253,82732, 1471,82732, - 53,82732, 713,82733, 25,82733, 305,82733, 587,82733,82735,82757, - 257,82732, 1369,82732, 257,82733, 59,80533,63493,82767,74571,82767, - 8861,82767,15029,82767,79139,80533,80244,82777,80245,82777,80293,82777, - 4,82782,80319,82785, 4,82783,80301,82789,80298,82777,80319,82793, -21036,82777,21037,82777, 1216,82777, 413,82777,80245,82776,82779,82805, - 1011,82777, 903,82808,21037,82776,82797,82813,80244,82776,82781,82817, -21036,82776,82799,82821,65869,82777, 9,82777, 903,82777, 1011,82828, - 4,82777,80293,82833,80315,82835,80293,82832,80319,82839,79549,80533, -80450,82843,80451,82843,80497,82843, 2,82848,80519,82851, 2,82849, -80501,82855,80498,82843,80519,82859, 1216,82843, 413,82843,80451,82842, -82845,82867, 903,82843, 1011,82870,80450,82842,82847,82875,56555,82843, - 483,82843, 1011,82843, 903,82882, 2,82842,80501,82887,79719,82887, - 3,82842,80337,82892, 483,82893, 3,82843,82867,82899, 1369,82899, - 2,82843,82875,82905,82895,82905,80497,82905,80515,82911,80497,82904, -80519,82915,80519,82905,80437,82905,80489,82905,79587,82905,79721,82905, -79645,82905,80337,82842, 3,82930,82905,82933, 3,82931,82887,82937, -27533,80533, 1216,82941, 413,82941,21036,82941,21037,82941, 1011,82941, - 903,82950,21037,82940,82947,82955,21036,82940,82949,82959, 9,82941, -65869,82941, 903,82941, 1011,82966,42613,80533, 1216,82971, 413,82971, - 903,82971, 1011,82976, 483,82971,56555,82971, 1011,82971, 903,82984, - 2,82971,42667,82989,42791,82989,42709,82989, 3,82971, 1369,82997, - 2,82970,42795,83001, 3,82970, 483,83005,10001,80533, 1216,83009, - 413,83009,21036,83009,21037,83009,21036,83008,83017,83019, 1011,83009, - 903,83022,21037,83008,83015,83027,65869,83009, 9,83009, 903,83009, - 1011,83034,10291,80533, 1216,83039, 413,83039, 903,83039, 1011,83044, -56555,83039, 483,83039, 1011,83039, 903,83052, 2,83039,37871,83057, -36133,83057,35803,83057, 3,83039, 1369,83065, 2,83038,36131,83069, - 3,83038, 483,83073, 1369,80533,26331,83076,25793,83076,23755,83076, -27805,83076,40381,83077,41559,83076, 8717,83076,21036,83077,39633,83076, -78147,83076,79309,83076,10055,83076,42731,83076, 3785,83076,79665,83076, - 4329,83076,10351,83076, 4311,83076,38305,83076,41941,83115,41019,83076, - 8495,83076,38305,83077,41019,83123, 5,83077,18967,83126,18967,83077, - 11,83131, 5,83130, 17,80533,25367,83137,62984,83137,60857,83137, - 265,83143, 241,83142, 241,83137,60857,83148,21605,83136,26625,83153, - 265,83136,35187,83157,21605,83137,25793,83161,35187,83137, 265,83165, - 587,80533,62984,83169,62518,83169,68807,83169,36526,83169,17125,83169, - 265,83169,35187,83180,35187,83169,60857,83184, 265,83184,32103,83168, -38305,83168, 483,83193,39787,83168,14073,83168, 4971,83168, 265,83168, -60857,83203, 241,83169,60857,83206,60857,83169, 241,83210,35187,83210, - 11,80533,25793,83216,41019,83216, 8495,83216, 265,83217, 8495,83225, -45149,83216,21605,83216, 903,83231, 9,83231,24095,83216,11277,83216, - 5045,83216, 265,83216, 8861,83243, 3,83217, 375,83247,38305,80533, -76424,83251,54262,83251,54219,83251,76453,83251,42185,83251,42193,83260, -42194,83251,42191,83251,42193,83251,42185,83268,80450,83251,37844,83251, -37845,83251,44663,83277,38707,83277,43483,83277,37897,83277,80451,83251, -80450,83250,83287,83289, 120,83251, 77,83251,32805,83251,54225,83251, -54129,83298,76337,83251,76307,83302,76307,83251,76337,83306,54129,83251, -54225,83310, 113,83251, 25,83314, 506,83251, 1216,83251, 413,83251, - 1413,83251,37845,83250,45411,83327,83275,83327,37899,83327,37897,83250, -83275,83335,65076,83251,37844,83250, 6,83340,83277,83343,83277,83341, -80451,83250,83273,83349, 66,83251, 33,83353, 25,83251, 113,83356, - 1281,83251, 1086,83251, 922,83251, 483,83251, 241,83366, 587,83367, - 903,83366, 241,83251, 483,83374, 903,83251, 1011,83378, 483,83378, - 1369,83250,41941,83385, 587,83250, 483,83389, 587,83251, 1011,83392, - 1011,83251, 903,83396, 11,83397, 587,83396, 1275,83250,46169,83405, -60857,83251,56555,83408,56555,83251, 11,83413,60857,83412, 2,83250, -80531,83419,46169,83419, 3,83250,43053,83425, 483,83425, 2,83251, -80435,83431,80495,83431,43461,83431,80529,83431,46599,83431,43425,83431, - 3,83251,43837,83445,43027,83445, 11,83445, 25,83451,39747,83445, - 11,83444, 33,83457, 1369,83445, 11,83251, 3,83463, 113,83465, - 3,83462, 33,83469, 15,80533, 1216,83473,18617,83475, 413,83473, -18391,83479,25545,83473,62942,83473, 1216,83472,18759,83487, 413,83472, -17993,83491,60857,83473, 1011,83494,18967,83473, 17,83499, 1011,83473, -60857,83502, 3,83472,37663,83507, 3,83473,37611,83511,38155,83511, -35927,83511,21605,80533,27065,83519,27261,83519,21036,83519,21037,83519, -27067,83519,27255,83519,73221,83519,55211,83519,36256,83519,51593,83519, -55803,83519,64345,83519,54477,83519, 1216,83519, 413,83519,21037,83518, -83525,83551,21036,83518,83527,83555, 247,83519, 934,83519, 9,83519, -35187,83562, 11,83563, 1011,83519, 903,83568, 17,83518,26625,83573, - 11,83518, 903,83577, 9,83577, 11,83519, 903,83582, 903,83519, -27021,83587, 1011,83586, 11,83587, 11,83586,35187,83519, 9,83596, -65869,83519, 5,83518,28337,83603, 5,83519,27021,83607,52915,83607, - 9195,83607,20501,83607, 9875,83607,30475,83607,28219,83607,23939,83607, - 1275,80533,43214,83624,43214,83625,43215,83624,83629,83631, 1216,83625, -18617,83635, 413,83625,18391,83639,43215,83625,83627,83643,40675,83625, -73994,83625, 1216,83624,18759,83651, 413,83624,17993,83655,71229,83625, - 903,83658, 903,83625,71229,83662,38305,83624,46169,83667, 5,83624, -55211,83671, 5,83625,53813,83675,10107,83675,69877,83675, 483,80533, - 241,83683, 9,83685, 9,83682, 11,83689, 17,83683, 903,83693, - 11,83683, 9,83697, 5,83682, 53,83701, 253,83701, 1471,83701, - 5,83683, 1505,83709, 9,80533,80151,83712, 1011,83713,82267,83717, - 241,83713, 483,83721, 483,83712, 11,83725, 1011,83712,81945,83729, - 11,83729, 3,83712, 1369,83735, 3,83713, 483,83739,17025,80533, - 5,83742, 2,83745, 17,83746, 17,83745, 2,83750, 2,83751, - 164,83745,38057,83743,38057,83742,38056,83742,83759,83763,38056,83743, -83761,83767, 3,83742,83749,83771,83753,83771,83757,83771, 3,83743, -83755,83779,13737,80533, 375,83783,80151,80533, 9,83786,35187,83787, - 9,83791, 5,83787, 9,83795, 5,83786, 17,83799,79987,80533, - 413,83802,77949,83805, 413,83803,77859,83809, 1216,83802,78669,83813, - 1216,83803,77857,83817, 4,83803,79549,83821, 2,83823, 3,83822, -83825,83827, 3,83823, 2,83822,83831,83833, 4,83802,79757,83837, - 2,83839, 3,83838,83841,83843, 3,83839, 2,83838,83847,83849, -79757,80533, 413,83852,77949,83855, 413,83853,77859,83859, 1216,83852, -78669,83863, 1216,83853,77857,83867, 2,83853,79139,83871, 4,83873, - 5,83872,83875,83877, 5,83873, 4,83872,83881,83883, 2,83852, -79987,83887, 4,83889, 5,83888,83891,83893, 5,83889, 4,83888, -83897,83899, 3,80532,79231,83903,79237,83903,79365,83903,79375,83903, -73413,83903,73405,83903,40793,83903,40787,83903,71751,83903,36001,83903, -71731,83903,72115,83903,72929,83903,71713,83903, 7,83903, 4,83933, -83519,83935,32103,83903,26106,83903,41746,83903,43005,83903, 8800,83903, -64513,83903,63253,83903,62215,83903,59910,83903,41019,83903, 11,83956, -60755,83903,60707,83903, 9852,83903,48975,83903,48245,83903,48451,83903, -76271,83903,82267,83903, 9,83974,82278,83903,83157,83903,81231,83903, -81235,83903,81519,83903, 386,83903, 347,83903, 510,83903, 273,83903, - 281,83903, 1477,83903, 1516,83903, 948,83903, 165,83903, 903,84004, -40704,83903,79139,84009,27533,84009,10001,84009,73307,83903,79139,84017, -27533,84017,10001,84017,53500,83903,37595,83903,36049,83903,36539,83903, -68851,83903,36041,83903,37573,83903,36275,83903, 1505,83903, 1011,84040, -25793,83903, 11,84044,64397,83903, 483,84049, 8495,83903, 11,84052, -60618,83903, 483,84057, 375,83903, 305,84060, 903,83903, 165,84064, - 1011,83903, 1505,84068, 305,83903, 375,84072, 4,83903,56555,84076, - 483,84079, 5,83902,57811,84083,59743,84083,59933,84083, 9579,84083, - 9839,84083,51421,84083,39619,84083, 4303,84083, 4287,84083, 8093,84083, - 3837,84083,42113,84083,53487,84083,53703,84083,42435,84083,48885,83903, - 483,84115, 11,83903,25793,84118,41019,84118, 8495,84118,59875,84118, - 9805,84118,53391,84118, 9,83903,82267,84132, 483,84132,38305,84132, -79139,84139,10001,84139,27533,84139,38305,83903, 9,84146,79139,84149, -27533,84149,10001,84149, 9805,83903, 11,84156, 5,84157, 483,83903, - 9,84162,56555,83903, 4,84166, 483,84169,53391,83903, 11,84172, - 5,84173,59875,83903, 11,84178, 5,84179, 2,80532,11087,84185, -11307,84185,11713,84185,10439,84185, 2221,84185,10665,84185,11037,84185, - 2233,84185,17777,84185, 2215,84185,18739,84185, 4339,84185,79091,84185, -79097,84185, 5075,84185, 4643,84185,79115,84185,79123,84185,59811,84185, -36619,84185,68291,84185,68299,84185,24213,84185,24059,84185,22149,84185, -22143,84185,72667,84185,60839,84185,35665,84185,59819,84185,59869,84185, -35487,84185, 7,84185, 4,84251,27306,84185,24095,84185,53910,84185, -55537,84185,79280,84185,80301,84263,83607,84185,40455,84185,25313,84185, - 8714,84185,32103,84185,26106,84185, 8800,84185,41746,84185,81569,84185, -48009,84185,49001,84185,49321,84185, 4551,84185,81531,84185,81289,84185, -81245,84185,83729,84185,10196,84185,70136,84185,10603,84185, 9,84305, - 4625,84185, 9,84309,81565,84185, 9,84313,23983,84185, 9,84317, -76501,84185,68176,84185,79065,84323,59787,84323, 9513,84323,36545,84185, -79065,84331,59787,84331, 9513,84331, 759,84185,35187,84339,10107,84185, - 265,84342, 241,84343,69877,84185, 265,84348, 241,84349, 305,84185, - 8495,84354, 959,84185,35187,84359,28714,84185,77079,84185, 1011,84365, - 1010,84364,84367,84369, 1010,84365, 1011,84364,84373,84375, 47,84185, -35187,84379,48245,84185,48975,84185,48451,84185,11277,84185, 5045,84185, -52603,84185, 8495,84185, 10,84394, 10,84395, 305,84394, 11,84394, -84399,84403, 11,84395,84397,84407, 331,84185,71229,84411,79549,84185, - 1011,84415, 265,84185,53813,84418,71229,84419,10107,84418,69877,84418, -79757,84419, 903,84185,55211,84431,10291,84185, 1011,84435,25793,84185, - 10,84438, 10,84439,27021,84438, 11,84438,84443,84447, 11,84439, -84441,84451,42613,84185, 1011,84455, 1325,84185,71229,84459, 5,84185, -27255,84463, 9287,84463,53167,84463,21605,84462, 4,84185,79139,84472, -80301,84475,49475,84473,73066,84473,28715,84473, 1011,84473,71229,84484, -71229,84473, 1011,84488,27693,84473,10047,84473,79287,84473,41019,84185, - 10,84498, 10,84499, 11,84498,84503,84505, 11,84499,84501,84509, - 59,84185,71229,84513, 4,84184, 8495,84517,41019,84517,25793,84517, -49001,84517,49321,84517,48009,84517, 265,84517,78147,84517,23755,84517, -39633,84517, 3785,84517, 8717,84517,41559,84517, 4311,84517,79665,84517, -10351,84517,26331,84517,42731,84517, 4329,84517,79309,84517,27805,84517, -10055,84517, 5,84184,27021,84563,24095,84563, 9195,84563,52915,84563, -21605,84563, 9,84573,23651,84563, 9755,84563,51435,84563,67297,84563, - 4321,84563,69729,84563,26907,84563, 9317,84563,53215,84563,27323,84563, -53941,84563, 3833,84563,10171,84563,70097,84563, 4295,84563, 5045,84563, -11277,84563,53813,84185, 265,84610, 241,84611,48885,84185, 1011,84617, - 11,84185,25793,84620, 8495,84620,41019,84620, 17,84185,30091,84629, -65869,84185, 15,84632,79065,84635,59787,84635, 9513,84635, 803,84633, -38305,84185, 1011,84645, 1347,84645, 15,84185,28714,84650,28714,84651, -65869,84650,79065,84657, 9513,84657,59787,84657,28715,84650,84655,84665, -28715,84651,84653,84669, 9195,84185, 241,84673,35187,84673,21605,84185, -27255,84679, 7,84678, 4,84682, 4,84683,84253,84679, 16,84678, -55211,84679, 803,84679, 9,84679, 17,84678, 903,84679,65869,84679, - 4,84679,84699,84705, 5,84679,84685,84709,84691,84709,27021,84709, - 4,84678, 7,84716,84709,84719, 5,84678,84687,84723,52915,84185, -35187,84727, 241,84727,27021,84185,35187,84733, 241,84733,25793,84732, -79139,84185,80245,84740, 4,84740,80301,84745, 5,84740,80151,84748, - 4,84741,80319,84753,84751,84753,80207,84753,80283,84753, 5,84741, -84743,84763, 5,80532,80759,84767, 7,84767, 2,84770, 3,84770, -83251,84775, 2,84771,84776,84779,84775,84779,83251,84782,83251,84779, -84775,84786, 3,84771,84773,84791,83251,84793,27306,84767,24095,84767, -52603,84767,53910,84767,55537,84767,84438,84767,84394,84767,84498,84767, -81539,84767,25793,84767,27021,84814,84185,84814,64289,84767,84060,84767, -81569,84767,83729,84767,81245,84767,81289,84767,70136,84767,10196,84767, - 273,84767, 1477,84767, 281,84767, 948,84767, 1516,84767,81565,84767, - 9,84847, 1505,84767, 1011,84850, 5045,84767,11277,84767, 4551,84767, - 922,84767, 1413,84767,20831,84767,19783,84767,20053,84767,58775,84767, - 9195,84767, 265,84873, 47,84767,60857,84877, 165,84767, 903,84880, -41019,84767,84185,84884,27021,84767,25793,84888, 265,84889, 8495,84767, -84185,84894, 959,84767,60857,84899, 89,84767, 5019,84903,60857,84903, - 375,84767,83903,84908, 759,84767,60857,84913, 265,84767,53813,84916, -69877,84916,10107,84916, 1011,84767, 1505,84924,54597,84925, 903,84767, - 165,84930, 483,84930,54295,84931, 1447,84767,18967,84939, 1141,84767, -18967,84943, 2,84767,61780,84947, 9,84947,60857,84950,54295,84947, -70085,84947,11529,84947,10155,84947,53925,84947,60857,84947, 9,84964, - 3,84767, 8063,84969,42361,84969,53667,84969,84185,84767,41019,84976, - 8495,84976,25793,84976,83903,84767, 375,84984, 33,84767,18967,84989, - 2,84766,27021,84993,24095,84993, 9195,84993,52915,84993,21605,84993, - 9,85003,67297,84993, 9755,84993,51435,84993,23651,84993, 4321,84993, -26907,84993,69729,84993,10171,84993,53941,84993,70097,84993,53215,84993, - 9317,84993, 4295,84993,27323,84993, 3833,84993, 5045,84993,11277,84993, - 3,84766,57811,85041,59743,85041,59933,85041,51421,85041,39619,85041, - 4303,85041, 4287,85041, 9579,85041, 9839,85041, 8093,85041, 3837,85041, -53487,85041,42113,85041,53703,85041,42435,85041,52915,84767, 265,85073, - 587,84767,60857,85077,70573,85077, 1369,84767,43503,85083, 483,84767, - 903,85086,21605,84767, 9,85091, 145,85091,10107,84767, 265,85096, - 9,84767,53813,84767, 265,85102,69877,84767, 265,85106, 4,80532, -83715,85111,80781,85111,83789,85111, 7,85111, 2,85118,83511,85121, - 2,85119,82163,85125,83507,85125,82573,85125, 1368,85111,83511,85133, -25525,85111,84498,85111,84438,85111,84709,85111,79634,85111,80501,85145, -84394,85111,64513,85111,63253,85111,62215,85111,81539,85111,64397,85111, - 483,85159,83787,85111, 9,85163,43214,85111, 8495,85111,84185,85168, - 587,85169, 331,85111,60857,85175,79139,85111, 903,85179, 265,85111, -60857,85183,79987,85183,10001,85111, 903,85189,41019,85111,84185,85192, - 587,85193,27533,85111, 903,85199, 59,85111,60857,85203, 3,85111, - 4,85206,85125,85209,38305,85206, 2,85111, 7,85214,83511,85217, -79549,85214,80501,85221,49155,85215,62464,85215,43215,85215, 903,85215, -60857,85230,60857,85215, 903,85234,42705,85215,10311,85215,79641,85215, -84185,85111,25793,85244,41019,85244, 8495,85244,25793,85111,84185,85252, - 587,85253, 1325,85111,60857,85259, 2,85110, 8495,85263,25793,85263, -41019,85263,49321,85263,49001,85263,48009,85263, 265,85263,78147,85263, -39633,85263,23755,85263, 3785,85263, 8717,85263,26331,85263, 4329,85263, -79309,85263,10055,85263,41559,85263,27805,85263, 4311,85263,79665,85263, -42731,85263,10351,85263,49205,85111, 903,85309,21605,85111, 903,85313, - 155,85313, 1275,85111,43215,85319,77751,85111,38305,85111, 7,85324, - 2,85326, 2,85327, 1368,85324, 1369,85324, 2,85325,85335,85337, - 3,85325,85329,85341,85333,85341,84185,85341, 2,85324, 7,85348, -85341,85351, 3,85324,85331,85355,79549,85111,80451,85358, 2,85358, -80501,85363, 3,85358,80337,85366, 2,85359,80519,85371,85369,85371, -80437,85371,80489,85371, 3,85359,85361,85381, 5,80533,83932,85385, -83933,85385,64148,85385,64149,85385, 0,85385,56555,85395, 1369,85397, - 7,85385,83903,85400,60857,85400, 265,85401,83903,85407, 1275,85401, -60857,85411, 0,85384,63015,85415,25380,85415,85413,85415,21605,85415, - 1369,85422, 1369,85415,21605,85426, 7,85384,85417,85431,25381,85431, -85415,85435,63014,85431,85415,85439,85419,85431,85399,85431,85429,85431, -85425,85431, 483,85431,60857,85450,85415,85453,60857,85431, 483,85456, -85415,85459,54440,85385,83903,85385, 7,85464,27425,85385,53137,85385, - 9365,85385, 803,85385,60857,85474,62310,85385,85206,85385,85125,85481, - 241,85385, 483,85485,54295,85484,54295,85385, 241,85490, 483,85384, - 53,85495, 253,85495, 1471,85495, 1275,85384,55211,85503,21605,85384, -28337,85507, 1369,85385, 1011,85511,60857,85385, 7,85514, 803,85514, - 2,85384,85389,85521,85393,85521,55211,85521,64345,85521,84132,85521, -36256,85521,83903,85521, 9,85534, 9,85521,83903,85538,35187,85538, -35187,85521, 9,85544, 3,85384,85467,85549,85387,85549,85403,85549, -85401,85549,83903,85557,85391,85549,85517,85549,85405,85549, 53,85549, - 1471,85549, 253,85549,76285,85549,76939,85549,72567,85549, 241,85549, - 483,85579, 9,85579, 2,85385, 3,85385, 165,85587, 1108,85587, - 1072,85587,76337,85587, 1011,85587, 483,85596, 9,85596,85111,85586, -85125,85603, 9,85587, 1011,85606, 483,85587, 1011,85610,80151,85384, - 17,85615,85111,85385, 1368,85618, 7,85618, 2,85623, 2,85622, - 1369,85618, 2,85619,85629,85631, 3,85619,85627,85635,85121,85635, -85217,85635,85621,85635,85133,85635, 2,85618, 7,85646,85635,85649, - 3,85618,85625,85653,85125,85653,55211,85385, 265,85659, 17,85385, - 3,80533,73221,85665, 9,85667,78796,85665, 9,85671, 8139,85665, -53639,85665,42521,85665,85322,85665, 9,85681,55004,85665,85111,85665, -77751,85686, 9,85689,42613,85664, 483,85693,10291,85664, 483,85697, -79549,85664, 483,85701,85585,85665, 9,85705, 9,85664, 1369,85709, - 15,85664,37663,85713,85125,85713,38305,85664,43053,85719, 483,85719, - 17,85665, 903,85725,35187,85665,77751,85728, 9,85731, 4,85664, -85125,85735,37663,85735, 5,85664,76939,85741, 1471,85741, 53,85741, - 253,85741,76285,85741,72567,85741, 241,85741, 9,85755, 483,85755, - 5,85665, 1505,85761, 922,85761, 918,85761,54597,85760, 903,85761, - 9,85770, 483,85770, 483,85761, 903,85776, 9,85761, 903,85780, -77751,85760, 9,85785,79756,85665, 9,85789,84185,85665, 16,85792, - 7,85792, 4,85797, 4,85796, 17,85792, 4,85793,85803,85805, - 483,85805, 5,85793,85801,85811,85797,85811,85795,85811, 4,85792, - 7,85818,85811,85821, 5,85792,85799,85825,54597,85665, 11,85829, - 5,85828, 1369,85665, 9,85835,18967,85665, 4,85839, 483,85841, -77751,85665,35187,85844, 9,85847, 9,85845,85111,85851,85111,85844, - 9,85855, 5,85845, 17,85859, 5,85844, 9,85863,77751,85664, - 375,85867,79986,80533, 375,85871, 2,80533,80080,85875,80079,85877, -80298,85875,80319,85881,80293,85875, 4,85884,80319,85887, 4,85885, -80301,85891,11727,85875,11047,85875,17787,85875,18737,85875,78670,85875, -77859,85903,10874,85875,77952,85875,77857,85909, 7,85874,83903,85913, -85167,85875,85355,85875,85213,85875, 1216,85875,77751,85923,77877,85925, -77751,85922,77857,85929,62310,85875,64483,85875,68896,85875,62464,85875, -61780,85875,61688,85875,85159,85875,10831,85875, 9,85946, 413,85875, -77751,85951,77837,85953,77751,85950,77859,85957,74571,85875,17178,85875, -50959,85875,43400,85875,11177,85875,84077,85875,85913,85971,40675,85875, -55546,85875,54440,85875,69196,85875,17125,85875, 9,85982,15029,85875, -65869,85986,52169,85875,49155,85875,40453,85875,43305,85875,40005,85875, -84767,85875,77751,86001, 9,86003,73994,85875,42613,85874,42795,86009, -10291,85874,36131,86013,70135,85875,53919,85875,10195,85875,79842,85875, -79757,85875, 903,86024,63493,85875, 8861,85875,80058,85875,80079,86033, -54422,85875,11529,85875,54447,85875,52601,85875, 145,85875,35187,86044, -36096,85875,79601,85875,79549,85874,80501,86053,79719,86053,64396,85875, -85111,86059, 1011,85875,43215,86062, 241,85875,54295,86066,65869,85875, -60857,86070,15029,86070, 9,85875,10831,86076,60857,86076,17125,86076, -84076,85875, 483,86085, 803,85875,60857,86088, 903,85875,53813,86093, -60857,86092,10107,86093,69877,86093,79757,86092,71229,86092, 265,85875, -55211,86106,10371,85875,42787,85875,55211,85875,60857,86114, 265,86114, -38305,85874,46169,86121,80531,86121,72818,85875, 11,85875,43215,86128, -43316,85875,35187,85875,54295,86134, 145,86134,71229,85875, 903,86140, - 155,86140,43215,85875, 10,86147, 10,86146,85111,86147, 1011,86146, -84767,86147, 11,86147,86151,86159, 11,86146,86149,86163, 155,85875, -71229,86166, 5,85874,55211,86171,64345,86171,84132,86171,36256,86171, -83903,86171, 9,86180, 9,86171,83903,86184,35187,86184,35187,86171, - 9,86190, 4,85875,80070,86195,80077,86197,80293,86195,80315,86201, -80293,86194,80319,86205, 483,86195,83903,86209,80533,86194, 3,86213, - 7,86195,86215,86217, 2,86217,86213,86221,79987,86194,80079,86225, -83903,86194, 483,86229,77751,86195,79545,86233, 3,86235, 2,86234, -86237,86239, 2,86235, 3,86234,86243,86245,77751,86194,79549,86249, - 3,86251, 2,86250,86253,86255, 2,86251, 3,86250,86259,86261, - 5,85875,85914,86265,85913,86265,83903,86268,49713,86265,49712,86264, -86273,86275,49712,86265,49713,86264,86279,86281,53813,86265,64317,86265, -64815,86265,62077,86265,10107,86265,69877,86265, 17,86265,83903,86297, -35187,86297,60857,86264,85111,86303,65869,86265, 9,86307, 587,86265, -60857,86311,83903,86265,85913,86314,79757,85874,79987,86319, 4,86321, - 5,86320,86323,86325, 5,86321, 4,86320,86329,86331,80336,85875, -79549,86335, 3,86337, 2,86336,86339,86341, 2,86337, 3,86336, -86345,86347,83903,85875, 16,86351, 7,86351,86265,86355, 4,86354, - 4,86355, 17,86351, 4,86351, 7,86364, 5,86351,86361,86369, - 4,86350,86363,86373, 483,86373, 5,86350,86359,86379,86367,86379, -86355,86379,86353,86379,54295,85875, 241,86388,35187,86388,60857,85875, - 7,86395, 4,86396, 4,86397,86265,86397, 16,86395, 17,86395, - 803,86394,55211,86394, 903,86394,65869,86394, 9,86394, 4,86394, -86407,86419, 5,86394,86399,86423,86405,86423,85111,86423, 4,86395, - 7,86430,86423,86433, 5,86395,86401,86437,77751,85875, 413,86440, -77859,86443, 413,86441,77949,86447, 1216,86440,77857,86451, 1216,86441, -78669,86455, 4,86441,79757,86459, 3,86461, 2,86460,86463,86465, - 2,86461, 3,86460,86469,86471, 4,86440,79549,86475, 3,86477, - 2,86476,86479,86481, 2,86477, 3,86476,86485,86487,79987,85875, -80244,86491,80245,86491,80151,86491, 5,86496, 5,86497, 4,86491, -80083,86503,80029,86503,80063,86503,86501,86503, 5,86491,80151,86512, - 4,86490,80079,86517,86513,86517,86493,86517,86515,86517,86499,86517, - 5,86490,86495,86529,86503,86529,77751,85874,86529,86535,86503,86536, -86532,86535,86521,86535,86512,86535,86517,86545,86503,86535,86529,86548, -86491,86535, 5,86552,86517,86555, 5,86553,86503,86559,85663,86535, -85100,86535, 9,86535,84767,86566,84767,86535, 9,86570, 5,86535, -86491,86574,86517,86577,86491,86575,86529,86581,80150,80533,80315,86585, -80301,86586,80298,86585,80319,86591,80301,86585,80315,86594,80316,86585, -80325,86585,80293,86585, 4,86602,80319,86605, 4,86603,80301,86609, -85663,86585,85100,86585, 9,86585,84767,86616,84767,86585, 9,86620, - 4,86585,80293,86625,80315,86627,80293,86624,80319,86631, 4,80533, -79968,86635,79967,86637,80498,86635,80519,86641,80497,86635, 2,86644, -80519,86647, 2,86645,80501,86651,78670,86635,77859,86655,77952,86635, -77857,86659, 0,86635,21605,86663, 587,86665, 7,86635, 483,86669, -18967,86671, 0,86634,19917,86675,58930,86675,86673,86675,56555,86675, - 587,86682, 587,86675,56555,86686, 7,86634,58931,86691,86675,86693, -86677,86691,86679,86691,19916,86691,86675,86701,86265,86691,86667,86691, -86689,86691,86685,86691, 1275,86691,18967,86712,86675,86715,18967,86691, - 1275,86718,86675,86721,29023,86635,25513,86635,24619,86635,84363,86635, -84723,86635,84471,86635, 1216,86635,77751,86737,77877,86739,77751,86736, -77857,86743,63610,86635,63291,86635,84321,86635,86028,86635,86030,86635, -85960,86635,86437,86635,76631,86635,76601,86635,74682,86635, 8974,86635, - 413,86635,77751,86769,77837,86771,77751,86768,77859,86775,63493,86635, - 483,86778,85875,86778,29598,86635,25545,86635,59206,86635,15029,86635, -56555,86790,62942,86635,80030,86635,79987,86635, 1011,86798,74571,86635, -85875,86802, 483,86802, 8861,86635,85875,86808, 483,86808,79926,86635, -79967,86815,85875,86635, 8861,86818,63493,86818,74571,86818,79263,86635, -76816,86635,77387,86829,76500,86635,84185,86833, 11,86833, 903,86635, -28715,86838,56555,86635,15029,86842, 483,86635,63493,86846,74571,86846, - 8861,86846, 1011,86635,79987,86854,60857,86854,10073,86635,27855,86635, -62278,86635, 587,86635,28715,86866,29026,86635,60857,86635, 1011,86872, - 1347,86872,28715,86635, 11,86879,84185,86879, 903,86878, 587,86878, - 1347,86635,60857,86888, 2,86634, 4,86893, 7,86895, 3,86634, -85125,86899,37663,86899, 2,86635,79962,86905,79965,86907,80497,86905, -80515,86911,80497,86904,80519,86915,79757,86904,79967,86919,71229,86904, -77387,86923,77751,86905,79065,86927, 5,86929, 4,86928,86931,86933, - 4,86929, 5,86928,86937,86939,77751,86904,79139,86943, 5,86945, - 4,86944,86947,86949, 4,86945, 5,86944,86953,86955, 3,86635, -85217,86959,85121,86959,86897,86959,86217,86959,85133,86959, 6,86959, - 6,86958, 7,86958,86971,86975, 7,86959,86973,86979,60755,86959, -35927,86959,38155,86959,37611,86959,71229,86958,84185,86991, 11,86991, -79987,86634,79757,86997, 2,86999, 3,86998,87001,87003, 3,86999, - 2,86998,87007,87009,80150,86635,79139,87013, 5,87015, 4,87014, -87017,87019, 4,87015, 5,87014,87023,87025,84767,86635, 1368,87029, - 7,87029, 2,87032, 2,87033, 1369,87029, 2,87029, 7,87040, - 3,87029,87037,87045, 2,87028,87039,87049, 3,87028,87035,87053, -87043,87053,87031,87053,71229,86635, 7,87061, 2,87062, 2,87063, - 1368,87061, 1369,87061, 2,87060,77387,87073,87071,87073, 3,87060, -87065,87079,87069,87079,84185,87079, 11,87079, 2,87061,77373,87089, -76635,87089, 7,87088,87079,87095,72519,87089, 3,87061,87067,87101, -85875,87101,77751,86635, 413,87106,77859,87109, 413,87107,77949,87113, - 1216,87106,77857,87117, 1216,87107,78669,87121, 2,87107,79987,87125, - 5,87127, 4,87126,87129,87131, 4,87127, 5,87126,87135,87137, - 2,87106,79139,87141, 5,87143, 4,87142,87145,87147, 4,87143, - 5,87142,87151,87153,79757,86635,80450,87157,80451,87157,80337,87157, - 3,87162, 3,87163, 2,87157,79971,87169,79841,87169,79961,87169, -87167,87169, 3,87157,80337,87178, 2,87156,79967,87183,87179,87183, -87159,87183,87181,87183,87165,87183, 3,87156,87161,87195,87169,87195, -77751,86634,87195,87201,87169,87202,87198,87201,87187,87201,87178,87201, -87183,87211,87169,87201,87195,87214,87157,87201, 3,87218,87183,87221, - 3,87219,87169,87225, 3,87201,87157,87228,87183,87231,87157,87229, -87195,87235,80336,80533,80515,87239,80501,87240,80498,87239,80519,87245, -80501,87239,80515,87248,80516,87239,80525,87239,80497,87239, 2,87256, -80519,87259, 2,87257,80501,87263, 2,87239,80497,87267,80515,87269, -80497,87266,80519,87273,77751,80533,79962,87277, 2,87279,79971,87281, - 2,87278,79967,87285,80070,87277, 4,87289,80083,87291, 4,87288, -80079,87295,79968,87277,79967,87299,80080,87277,80079,87303,80498,87277, -80519,87307,80298,87277,80319,87311,80497,87277, 2,87314,80519,87317, - 2,87315,80501,87321,80293,87277, 4,87324,80319,87327, 4,87325, -80301,87331,81857,87277,78453,87277,80233,87277,80445,87277, 8453,87277, - 273,87277,84484,87277,85230,87277,84531,87277,85277,87277,21522,87277, - 1516,87277,38266,87277, 948,87277,20239,87277, 1477,87277,37095,87277, - 281,87277,84473,87277, 1011,87370,85215,87277, 903,87374,80242,87277, -80448,87277,80447,87277, 903,87382,80241,87277, 1011,87386,38057,87277, - 903,87390, 165,87277, 903,87394,21315,87277, 1011,87398, 1505,87277, - 1011,87402, 1216,87276, 412,87276, 413,87277,87409,87411, 1217,87277, -87407,87415, 413,87276, 1216,87277, 1217,87276,87421,87423, 412,87277, -87419,87427,12377,87277, 375,87277,57522,87277,67028,87277,67800,87277, - 510,87277, 240,87277, 265,87443,77750,87445,77751,87444,87447,87449, -77751,87445,77750,87444,87453,87455, 264,87277,84517,87459,85263,87459, -81749,87459, 341,87459, 264,87276, 375,87469, 241,87277,81464,87472, -81465,87473,87475,87477,81464,87473,81465,87472,87481,87483, 1011,87277, -84473,87486,80241,87486, 1505,87486,21315,87486, 903,87277,85215,87496, -80447,87496, 165,87496,38057,87496, 483,87277,65869,87506, 9,87506, - 9,87277,56555,87512, 483,87512,56555,87277, 9,87518,65869,87518, -65869,87277, 483,87524,56555,87524, 5,87277,84185,87531, 1011,87533, - 2,87531,80532,87536, 3,87531,85215,87541, 3,87530,87539,87545, -85263,87545,84517,87545,81749,87545, 2,87530,87533,87555, 4,87276, -87531,87559, 2,87561, 3,87561, 2,87560,87565,87567, 3,87560, -87563,87571, 3,87277,85111,87575, 903,87577,87559,87575, 0,87581, - 1,87580,87583,87585, 1,87581, 0,87580,87589,87591, 4,87575, -80532,87594, 5,87575,84473,87599, 5,87574,87597,87603,84517,87603, -85263,87603,81749,87603, 4,87574,87577,87613, 2,87276,85663,87617, -85100,87617, 9,87617,84767,87622,84767,87617, 9,87626,87575,87617, - 4,87631, 5,87631, 4,87630,87635,87637, 5,87630,87633,87641, - 2,87277,79962,87645,79965,87647,80497,87645,80515,87651,80497,87644, -80519,87655,79962,87644,79967,87659,87559,87645, 7,87663, 6,87662, -87665,87667, 6,87663, 7,87662,87671,87673, 4,87645, 1011,87677, -77751,87679,77750,87678,87681,87683,77750,87679,77751,87678,87687,87689, - 4,87644, 265,87693,77750,87695,77751,87694,87697,87699,77751,87695, -77750,87694,87703,87705, 3,87276, 375,87709,87645,87709, 4,87713, - 5,87713, 4,87712,87717,87719, 5,87712,87715,87723, 4,87277, -80070,87727,80077,87729,80293,87727,80315,87733,80293,87726,80319,87737, -80070,87726,80079,87741, 2,87727, 903,87745,77751,87747,77750,87746, -87749,87751,77750,87747,77751,87746,87755,87757, 2,87726, 265,87761, -77750,87763,77751,87762,87765,87767,77751,87763,77750,87762,87771,87773, - 5,87276,87575,87777, 7,87779, 6,87778,87781,87783, 6,87779, - 7,87778,87787,87789,87645,87777, 0,87793, 1,87792,87795,87797, - 1,87793, 0,87792,87801,87803,87727,87777, 2,87807, 3,87807, - 2,87806,87811,87813, 3,87806,87809,87817 -}; - -const int s_nDataSize2 = 24772; -unsigned int s_Data2[24772] = { - 3, 9, 5, 6, 119, 796, 636, 113, 449, 235, 239, 105, - 789, 96, 439, 624, 630, 230, 111, 110, 787, 786, 628, 627, - 116, 115, 436, 435, 227, 226, 93, 92, 792, 791, 100, 99, - 443, 442, 633, 632, 128, 183, 234, 178, 233, 85, 762, 203, - 32, 742, 356, 169, 152, 12, 672, 741, 127, 168, 671, 740, - 50, 352, 149, 64, 414, 197, 276, 751, 722, 396, 275, 434, - 721, 785, 274, 795, 720, 448, 273, 719, 474, 758, 718, 392, - 269, 748, 715, 400, 118, 794, 635, 81, 76, 750, 747, 597, - 595, 91, 433, 225, 74, 745, 680, 565, 268, 476, 271, 761, - 350, 678, 345, 567, 757, 471, 470, 563, 469, 561, 551, 461, - 465, 706, 650, 714, 261, 332, 641, 708, 676, 542, 260, 458, - 755, 314, 325, 658, 288, 349, 760, 654, 656, 564, 562, 644, - 552, 642, 550, 259, 252, 254, 322, 311, 329, 109, 784, 626, - 43, 395, 182, 55, 399, 186, 104, 447, 238, 41, 389, 173, - 175, 193, 485, 580, 579, 734, 25, 733, 528, 548, 310, 546, - 344, 526, 308, 560, 342, 525, 556, 558, 523, 524, 522, 520, - 307, 622, 623, 431, 618, 620, 429, 617, 305, 615, 519, 518, - 516, 778, 304, 250, 302, 776, 216, 218, 774, 215, 301, 300, - 514, 771, 513, 541, 298, 512, 297, 535, 321, 508, 510, 319, - 538, 539, 533, 507, 509, 296, 146, 705, 531, 537, 317, 557, - 341, 143, 697, 555, 544, 339, 613, 426, 217, 773, 619, 428, - 221, 780, 611, 610, 424, 609, 769, 423, 422, 768, 213, 625, - 783, 670, 732, 782, 578, 577, 731, 484, 387, 668, 669, 171, - 172, 375, 191, 575, 729, 482, 446, 667, 237, 574, 728, 481, - 398, 666, 185, 573, 727, 480, 394, 665, 181, 572, 695, 694, - 140, 738, 372, 246, 690, 689, 136, 244, 369, 767, 212, 766, - 702, 701, 367, 257, 700, 315, 726, 382, 59, 407, 190, 52, - 366, 157, 65, 417, 201, 63, 413, 194, 686, 692, 243, 248, - 699, 256, 150, 354, 365, 364, 353, 156, 685, 348, 242, 661, - 192, 409, 376, 378, 411, 164, 569, 717, 473, 391, 660, 177, - 189, 406, 374, 371, 405, 162, 200, 416, 363, 362, 415, 155, - 313, 324, 361, 360, 331, 312, 328, 381, 316, 330, 359, 323, - 4596,24359,41366,41344, 4857,37718, 4594,24357, 4846,37706, 4678,26650, - 4592,24355, 4844,37704, 4591,24354, 4843,37703, 8816,41900,22056,15422, - 7473, 8464,42932, 8814,41898, 6804,20483,12853, 8462,42930, 8809,42808, -21978,15306, 7385, 8456,42895, 8807,41327,21965,15246,15293, 7372, 8454, -42893, 3212,20457,36983, 3516, 6187, 6184,20453,29352,10563,10421, 2593, -20452, 6183, 5637, 2589, 6182, 2645, 2619, 2283,26212,20199, 2269,12513, - 2614, 2661,18113, 2288, 4777,35226, 4775, 4774, 4773,42536, 2198,32674, -32753, 8833, 8780,40027,43084,39938,43445, 8548, 8831,24157,26148,31156, -29057, 8503, 8771, 8777,24156,26147,36425,33823,40025,43073,43081,39936, -43443,22500,18803, 8829, 8770,40023,43072,39934,43438, 8546, 8827,24155, -26146,31154,29044, 8501, 8765,24153,26140,36424,33800,33820,40022,43066, -39933,43435,22498,18801,43065,40020,43434,39931,18800,22493, 8764, 8499, -26128,24151,33799,36411, 8826, 8544,26120,24146,29025,31141, 8762, 8824, -43063,40019,43432,39929, 2287, 2286,21235,26865,13688,26627,13207,20826, - 2106, 2073, 4667, 4378, 1966, 4054,13206,20825, 2159, 2168,18699,39853, -10355,39675, 2167,39852,13205,18520, 2158,39674,20824,20823,42653,42280, -18519,10116,21390,13926, 2032,42279, 1932,42652, 2166, 2157,42651, 5184, -42278, 5035, 2070,21389,20822, 4377,13925,13204, 5034, 5183,13924,21388, - 5033, 5182,39673,42650,39851,42277, 4221, 5142,18518,21387,18698,20821, - 4220, 4982,10115,13923,10354,13203,39850,42276,39672,42649,20820,18697, -42648,39671,42275,39849,18517,21386, 4376, 5032,13202,10353,13922,10114, - 4375, 5181,20819,18696,21385,18516, 4981, 5141,42274,39848,42647,39670, - 5031, 5180,42646, 5140,42273, 4980, 4219,21384,20818, 4374,13921,13201, - 5135, 5174,39653,42257,39831,42630, 5172, 5133,24141,26112,31138,29023, - 5026, 4969, 4975,24140,26111,36408,33796,39651,42249,42254,39829,42628, -21363,18686, 5139, 5179,39669,42272,39847,42645, 5178, 5138,18515,20817, -18695,21383, 5030, 4979,10113,13200,10352,13920,39668,42271,39846,42644, -21382,18694, 5170,24183, 5169,36516, 5168,39992, 5167,22753, 5166,21404, - 5165,39867, 5164,21361, 4045,26846, 4044,21215, 5162,39827, 5191,21359, - 5190,39825, 5189, 5160, 5159, 4043, 5157, 5024, 1891,42248, 1847,42621, - 4193, 4341,18472,20750, 1681,21357,10093,13145,13869, 2660, 7371, 2659, - 2658,13144,20749, 1846, 1890,39824,18682,39649,10344, 1872,39823,18507, -13143, 1889,39648,20748,20747,42620,42247,10107,18506,21356,13868, 1871, -42246, 1843,42619, 2205,26240,26211, 2200,24249,24232, 2478, 2517,36625, -34562,31491,29570, 2507, 2558,34076,37229,29433,31635, 8704, 8600,35491, -38460,30352,32396,28999, 8171, 8335,38314,35364,32268,30297,30134, 8698, - 8591,35488,38453,30345,32384,32389, 8166, 8333,38305,35357,32255,30292, - 2285, 7325, 1898,14098, 1896, 1895, 1894,39359,24288,41706,41800,20017, -37217,39357,36575,18022,26236,20013,24246,39355,39925,18013,18779,20001, -22482,39395,20196,39397,20208,40017,39923,20064,42324,12370,42658,19065, -18776,41387,41382, 9904,21392,10687,10412,41365,41360,18055,18053,39685, -20893,39857,18775,43056,43431,42334,18524,42660,22479,40016,39922,14502, -15946,39376,39374,20062,20060,21649,22478,39380,39378,12368,18702,43055, -43430,18057,39680, 9906,39855,39991,21351,22752,39816,39990,39815,22751, -21350,39639,39814,33754,42230,28989,42602,18468,18677,24118,26056,31087, -28988,10090,10312,10318,24117,26055,36340,33753,39637,20700,20705,39812, -18675,42228,42600,42219,42225,18464,42598,21348,39635,39810,13101,13106, -13844,26054,24116,33752,36339,20699,21346,26053,24115,28987,31086,42218, -42595,36338,39633,31085,39808,39667,39845,39666,39844,39665,39843,18693, -18692,10351,10350,18514,39842,13199,13198,10112,39664,20816,20815,10111, -18513,42270,42643,13919,21381,13918,42269,21380,42642,39806,21403,21344, -39866,39805,39865,21343,21402,39804,21342,21175,26830,39802,21173,26826, -21340,39346,24061,39338,32626,39333, 9843,39332,39331, 9814,39328,15936, -39183,11746,19744,25614,39182,39181,39180,19836,42268,11903,42641,17932, -17931,40961,40960, 9771,21379, 9770, 9769,40959,40958,17930,17929,39663, -20814,39841,17928,40957,40956,42267,18512,42640,19835,39179,39178,11902, -11901,39177,39176,19834,19833,19832,19831,39175,39174,11900,18691,40955, -40954,17927,39662, 9768,39840,39173,19830,11899,17926,40953,13197, 9767, -40952,20813, 9766,17925,40951,11898,19829,39172,11897,42266,19828,19827, -42639,11896,40950,21378,13917,39171,39170,39169,39168,14088, 3310, 3309, -35263, 2276,26305, 5245, 6267, 5248, 5445,10636,10624, 5401, 7751, 5390, - 5674, 2548, 5410, 3350, 3931, 3971, 3960, 6123,28071,22800, 8025,27598, -16338, 7478,22061,15427, 3847, 3840, 3822, 5835,26825,21172, 7148,26571, -13617, 6808,20693,13100, 3469, 3729, 3618, 6021,27993,22666, 7965,27534, -16152,16158, 7368,21963,15285,15291, 3513, 3757, 3655, 6026,28010,22688, - 7970,27539,16193, 7376,21969,15297, 3722, 3611,27986,22657,22659,16147, - 3608, 3610,25575,25569,25573,25568, 2720, 2722,23945,23941,23943,23940, - 3606,26233,26200, 2718,24244,24224, 3603,22654,16143, 2716,22466,15931, - 8720, 2547, 2499, 2498,35234, 8719,35524, 7050,35233, 6181,20028, 5622, -20027, 5610, 7023,23939,24648,23938,24484, 5952, 7920,22462,25567,27390, -15928,25566,27757, 5620, 7027,36388,33781,31116,29009, 5970, 7936,33795, -36407,29022,31137, 5612, 7025,24121,24653,24129,24494, 5960, 7922,26081, -27412,26074,27796, 5601, 7014, 6501, 5946,27753,22458, 7917,27387,15926, - 4317, 7284,21850,15156, 5825, 5940, 5824, 5794, 7123, 6732, 6038,28015, -22709, 7982,27551,16225, 7395,21983,15311, 8718, 5673, 7049, 8717,35523, -23937,21560,14272,15352,40871,22739,16272,23936,22733,16263,14776,40870, -21558,14265,23935,21474,14087,15148,40869,22445,15906,23934,41714,40868, -34075,23933,34079,40867,41730,23932,41537,31827,37396,23931,41448, 4494, -23930,41503,23929,26451,38349,32305,23928,24323,23927,40866,31785,37351, -23925,40858, 4472,23924,40862,23923,40853,38197,23920,23919,38475,23914, -23913,38152,23908,40840,28843,38481,23905,23904,23903,23902,23901,23900, -23899,23898,23897,23896,40839,40838,23895,23894,40837,40836,23893,40835, -23892,23891,40834,40833,23890,40832,23889,23888,40831,40830,23887,40829, -23886,23885,40828,40827,23884,23882,40823,40826,40822,23879,23878,40819, -40818,23877,23876,23922,23875,23874,32490,32499,23873,23872,32793,23871, -17197,23870,23869,29043,33819,24320,40817,29655,38507,24317,24309,28839, -33590,23867,23868,23865,40816,25558,25555,23866,40815,23860,23864,21472, -14085,40814,22439,15900,25548,23863,40812,23859,23856,40811,40805,40808, -23858,33581,33583,23854,23881,33580,33592,23853,23852,19635,33579,40804, -23848,23844,33560,33558,35258,40795,23843,33557,33556,35255,25392,23842, -33555,33554,23841,24131,24133,23789,17857,23787,18134,25390,26230,23785, -25387,26229,26199,23783,23782,23781,23780,23779,23778,24120,24128,23777, -17845,23775,27731,25366,18759,23762,23761,23760,23759,23758,23757,23851, -23847,40801,40803,23850,33457,33578,35260,23849,33572,23756,33456,23755, -25328,18750,10402,24219,24218,24217,24239,41600,41620,24216,24215,24238, -29171,33958,24221,24241,24214,24237,24213,24236,24223,24243,24231,24248, -24235,24212,41619,41599,24580,24740,24486,24650,24479,24643,24493,24652, -24536,24696,24535,24695,24534,24694,24533,24693,24640,40701,30096,38438, -24638,24477,35149,24692,24532,24054,24053,24052,24051,24050,23803,17878, -23801,25476,23799,23798,23797,33549, 3281, 2981,35267, 2427, 2429, 2425, - 2424, 2495, 7047, 7649, 2423,21521,14156, 2422,35247,23754,40705,23741, -40684,40700,23725, 4338,40674,23724,40673, 7842, 7748, 7750, 7746, 7745, - 7744, 7761, 7758, 7769, 7651, 7653, 7648, 7647, 7646, 7645,21520,14155, - 6300,21670,14601, 7644,35246, 8354,35392, 7811, 7809, 7813,37284,31745, - 7771,36483,31210, 7788, 7802,36473,31194, 4186, 4465, 4184,13064, 4181, - 4180, 4236, 4246,23721,39799,39630,23720,18459,23719,10083,18671,39628, -33435,13819,10309,39797,28701,21329,36039,30815,42588,42206,25299,25298, -13062,42586,20667,20672,42197,42203,23718,21332,13824,33434,42590,28700, -42208,30814,36038,25297,20676,13069,39022,22404,15866,17830,43413,13837, - 9689,43025,21338, 9687,17828,40683,11384,19518,39000,11387,42593,21639, -19521,42214,14460,40699,20689,13087,24049,24531,24691, 4190,23717,22449, -15912,25296,20692,13099,23753,22427,15895,25337,20666,13060,23716,22403, -15865,25288,20665,13059,13584, 4199, 4197,23711,19508,11363,25282,20745, -13140, 9063, 9396, 9184, 9168, 9338,38785,32799, 9254,23359,17393, 9336, -38782,32791, 9247,23353,17357, 9344,38793,32809, 9282,23387,17431, 9456, -38858,32878, 9094,23244,17141,23710,21540,14212,15278,40657,22649,16130, - 2758,21538,14208, 3347, 5771, 1853, 5082, 1788, 4966,42481,42234, 1708, -26963,42233,26591,42480, 1852, 3346, 3345,42479,37847, 1851,37846, 1835, -13635,42478,42232,37845,26590, 1785,10346, 1834,35043, 1833,37844,13634, - 6891,27206, 6890,42477, 6889,37843, 5951, 5949,22464,27759, 5930, 5929, -22774,28067, 5928, 5927,20495,26455, 5926, 5925,26249,26192, 5924,26307, - 5934, 5932,27724,22402, 5923, 6119, 5922, 7262,27717, 5920, 6917, 6277, - 5918, 5917, 5916, 5915, 5914, 5954, 6118, 6927,27234, 6888,42759,27205, -29027,43024,42739, 8746,29048, 8768,43069, 6886, 6887,27204,42738,28699, -43023, 8745, 8742,43021, 8741,43020, 8740,43019, 8784,43196, 8739,43018, - 8767,43068, 8523, 8744, 4957,42196, 5672,42195, 4956,42194,24230,42193, -33939,33938,24127,42192,33769,35199,24492,42191,35198,33768,24688,20662, -24528,20661,24048,41181, 4990, 4842,42304,37700, 5671, 5670,42303,37699, - 2546, 2545,37881,42519, 5669, 5668,37880,42518, 2544, 5667, 5666, 4137, - 5106, 5104, 5072, 5070, 5074, 5076, 5068, 5067, 5066, 5065, 5064, 5063, - 5100, 5096, 5095, 5094, 5084, 5062, 4634, 5061,42190,28698,42457,26562, - 4635, 5091,42302,26982,42517,26626, 4666, 5090,37879, 4989,13687,42301, -42516,37878,26981, 4665,10365, 4136,35060, 5089,42515, 4988,26625,42300, -42514,26624,26980, 4664,42299, 4135,26979, 5088, 4134, 4987, 4663,42298, -42513, 2163,37877,13686, 2162,42512, 2150,26623,37876,10364,35059,13685, - 2161,42297, 2142,37875, 2140,42511, 2149,42296, 5087, 4986, 1917,26978, -42295,26622,42510, 2148, 4848, 4862, 4827, 4826, 4841,37698, 4882,13463, -42509,42294,37697,26621, 4840,10189, 4881,34876, 4839,37696, 4880,13462, -37874,13684, 5086,37695, 4985,13461,42293,42508,37694,26977, 4838,10188, - 4879,34875,23729,34834,40698,40656,23709,34880,40655,41381,24211,34827, -41560,41559, 4874,34826, 4876,34861, 4892,34905, 4878,37693,13460, 4898, -37778,13508, 8353,35391, 8390,35436, 8581, 8534, 8602,38462, 8683,38525, -15448, 8641,38478, 8579,15277,38435,15138,33431,16652,33730,33429,34560, -29423,29381,40645,41866,33391,26227,33910,40643,18131,33513,11326,11531, -33511,28664,40769,33510,40787,33508,28642,40785,33751,18774,41232,27772, -33679,28943,12118,40634,40633,33677,28941,40629,40632,40628,33675,28936, -41598,41618,33605,33597,33360,33359,33358,33357,33787,39161,39321,39320, -36288,34527,26330,41849,18165,34522,26325,33349,34055,41845,18161,34536, -39160,38969,23693,41793,39327,39626,32091,42030,33307,32090, 4703,33453, -28723,25230,25229,33306,28623,26436,26446,33608,33305,40807,35522,19640, -33304,40825,35232,19645,33303,34053,33301,34044,34048,33298,41691,33296, -41683,41686,33295,33536,33540,33535,33292,33287,33282,33286,33935,33933, -33279,40631,33711,41180,33709,41173,35230,19918,33708,41172,35520,19917, -33707,41171,33577,28797,33278,28611,33892,29148,33886,29144,33277,28610, -33276,28609,33275,28608,33274,28607,33291,28620,33273,28606,43071,33822, -43437,35917,33272,28605,36118,33548,30917,35916,33484,35981,35979,30906, -28760,30775,33546,36116,33383,36083,28645,33367,28749,33482,33271,35915, -36081,30729,33270,28604,39412,30728,39470,35914,33309,33311,39410,39456, -18196,25216,28625,35913,39468,39505,20324,25215,30734,41748,35944,41830, -23695,23697,28638,39458,33331,39507,25232,25234,30736,33269,41797,41832, -18192,23675,35964,35966,41701,41752,20319,23674,35912,30727,41697,28603, -41792,33268,33267,28602,36620,34558,31487,35911,33425,33427,36622,28601, -37113,31476,28689,35910,31489,33266,34471,37010,34556,30813,36021,36023, -29384,34420,37214,28675,33409,33411,31478,37012,30791,33265,29426,35909, -37115,34422,36005,36007,34066,30726,34473,29386,35908,30725,34068,37210, -29428,33264,39067,39069,23701,30724,23703,35907,23673,39065,33386,25214, -23672,39063,28670,25213,36000,30777,40776,40768,25250,25252,33263,40764, -28600,40762,33262,28599,43013,30723,43400,35906,23671,21636,22383,25212, -14454,15824,15837,33740,28975,43052,33261,43429,36320,33739,28974,43051, -31074,43428,36319,24075,31084,21648,28986,22477,26012,36329,14493,33749, -15945,43398,43011,22377,15823,14439,21634,26052,24114,33366,33365,28644, -33480,28747,36111,33529,30902,36079,33473,33260,33259,33972,33258,33553, -33285,28618,41597,41617,33284,33970,33294,33539,33528,28778,11448,40591, -40590,33526,33525,33524,33523,39058,39057,23835,30901,23815,36110,33479, -25517,28746,25494,40753,40752,33538,28787,40610,40608,33522,33780,40589, -42861,23670,33778,35362,33256,35344,33254,33463,34043,29414,41685,41783, -34041,29411,26400,26365,34040,41682,34039,34052,29420,34038,29410,34037, -29409,34065,34064,29425,34036,29408,39406,31565,39466,37204,34456,39450, -18188,26395,37101,39499,20313,26360,41742,41824,24283,24274,29519,34552, -31485,41780,36616,41681,34035,29407,36615,34551,31484,37203,34455,29376, -37100,31472,34411,37003,34047,29418,41695,41790,34046,34050,34034,34073, -34032,33930,33941,29158,33932,29155,33929,29153,33798,41083,18043,35223, -35283,35285,35154,35225,35169,30109,40588,40587,35146,30088,22376,15822, -35144,30086,22374,15820,35142,30084,22372,15818,39529,39623,35148,35209, -39159,35167,39318,35262,30208,40586,40585,35254,30204,41614,41595,35257, -30206,40794,40799,35162,40709,18758,34825,35269,35266,10793,10619,35245, -10783,10561,35251,35243,35242,33724,33728,33722,33721,33968,34685,29738, -40704,40703,34727,29780,41380,41359,34710,29763,20739,40561,13138,40560, -34684,29737,20657,40559,13052,40558,33851,27196, 9902,42736,26993,36435, -42547,42321,12366,27711,36437,43010,33439,42468, 9680,42735, 9685,36043, -11382,33445,11374,42216,36041,43009,33849,37911, 9900,42734,35066,36431, -37907,33847,12364,27710,36433,43008,35081,12602,37746,35083,35007,31772, -37338,35022,35015,35047,35005,35004,35003,35002,35001,35000,10302,35071, -10368,35013,35012,35011,34999,10301,13577,37817,34998,42180,10300,28558, -17770,37820,19393,34996,13579,42450,37818,26546,35045,35058,42292,10363, -26976,10362,37873,13683,35057,13682,42507,37872,26620,35056,37692,10361, -13459,34874,37871,37691,35055,13681,10187,37870,34873,35054,37869,10360, -13680,35053,37868,33660,25733, 9805,40999,26975,36216,42506,42291,11876, -25732,36215,40998,33659,42505, 9804,40997, 9803,36214,11875,33658,11874, -42290,36213,40996,33657,37867, 9802,40995,35052,36212,37866,33656,11873, -25731,36211,40994,33655,37690, 9801,40993,34872,36210,37689,33654,11872, -25730,36209,40992,33496,34824,18484,18433,34860,34891,18526,34871,42289, -10186,26974,10185,37688,13458,34870,13457,42504,37687,26619,34869,37686, -10184,13456,34868,37685,34922,37771,10204,13501,34915,37764,35355,41246, -40557,24074,35361,40556,41290,23645,35390,35394,35388,35387,35423,35431, -35421,35420,35419,34424,34430,29390,34410,29375,34409,29374,34408,29373, -43003,34454,43397,37099,34419,34418,29383,34554,25244,41863,17813,34550, -27709, 2281,26243,26215, 2280, 2279,26242,26806,26214,26542,23643,17768, - 9617,19682,25590, 9615,11631,25602,17766,11650,19701,23641,24043,17975, - 9857,19915,25886, 9855,12116,25884,17973,12114,19913,24041,24525,18827, -24685,10438,18963,10587,18825,10436,24523,10585,24683,18961, 2443, 2442, -18824,26805,10435,26541, 2441,21154,13576, 9256,38787,32802, 9246,38781, -32790, 9253,38784,32798, 6490, 6682,39661,39839, 6676, 6675, 6674, 6673, - 6672,39158, 6697,23640, 6775, 6783,36532,31231, 6580, 6579,18960,26804, -10584,26540, 6578,21153,13575, 6857,38536,32501, 6867,38538,32503, 6855, -38534,32498, 6822,20490,12860, 7477,22060,15426, 6814,20485,12855, 7472, -22055,15421, 8988,38813,32831, 8677,38488, 8239,38346, 6280,21655, 6279, -21654, 6320,23639,23638,23637,23636,40555,23635, 6274, 6315,38953, 8751, - 8823, 6245,23632,23631,14039,20651,37335,31769,15808,34822,24166,24163, -37375,31808,23727,25314,39344,39342,23630,14031,25171,15799, 6241,42999, - 8753,42998, 6240,42997, 6239,42996, 6238, 7605, 7603,21633,24145,14431, -24150,23743,21632,14430, 7577, 7576,21645,23768,14481,23764, 6237, 6236, -21631,42614,14429,42241, 6235,21630,14428,24073,24072,24071,24070,41264, -24069,24066,24065,37331,31766,24064,26009,24063,21647,14491, 8775,43079, - 8774,43078, 8737,42995, 7643,21669,14595,23622,21711,14828, 7827, 7826, -21710,23621,14827,23620, 7824,21709,14826, 6347, 6349, 6351,38519,32485, - 6362,38530,32492, 6364,38532,32494, 6358,38528,32489,18365,24583,18606, -18598,18597,18596,42444,37811,24657,24497,24634,24469,35138,24040,24039, -24522,24682,24681,24521,24578,24738,39405,39465,41680,20283,41779,18147, -18187,41741,20312,39449,41823,39498,24520,24680,24679,24519,24038,24037, -39157,39156,40949,19826,40948,17924,23619,23846,24202,35241,41126,33720, -25977,35386,41125,33719,25976,33718,41124,24482,24646,23834,23814,19058, -10678,43037,36075,43422,30854,19057,10677,42994,35892,43396,30674,15796, -22352,24144,24149,23613,23612,19134,10762,42990,37248,43394,31694,18444, -10075,18466,10092,18432,10073,18431,10072,18552,10124,18550,10122,23611, -23610,24036,24035,24518,24678,24677,24517,18454,10080,23609,23608,22370, -22368,15817,18448,25149,25148,18744,18741,10391,20660,23752,23751,22426, -22425,15894,18430,25336,25335,18757,18756,10405,20648,24161,24159,22349, -22348,15794,18522,26155,26150,18733,18732,10388,20880,35161,40708,34821, -25334,18505,10106,18494,10104,23607,23606,19397,19395,11212,18488,25147, -25146,17776,17773, 9620,20742,18381,38855,18383,23136,18385,38407,17765, -38850,17764,23121,17763,38405,17762,43195,17839,43034,17985,42989,17984, -42731,28965,42744,31065,17998,28977,19979,31082,42988,19997,43054,18379, -37275,17761,42173,28551,26945,42439,42170,28550,26539,30673,42436,42437, -19380,26536,26537,17760,42307,28549,30672,19379,42537,17759,42176,28548, -26948,37814,17758,34994,19378,30671,42446,19377,37812,17757,42746,28547, -30670,19376,43059,18265,10019,18264,10018,42987,20311,43393,18186,18921, -18906,18919,18915,18807,18731,38831,18730,23104,18729,38403,18869,18878, -18890,18823, 1666, 1701, 1613,22346,27707, 5904,15787,15792,27365, 7899, -15124,15129,21836, 7255, 1669, 1704, 1616,22339,27700, 5897,15785,27358, - 7892,15122,21829, 7248, 1664, 1699, 1611,22772,28065, 6116,16309,27593, - 8020,15404,22040, 7459, 1663, 1698, 1610,21183,26835, 5820,13632,26587, - 7143,13137,20738, 6799, 1829, 1839,37855,42487, 1838, 1828,42486,37854, - 2028, 2063, 1963,40545,40543, 2030, 2065, 1965, 2026, 2061, 1961, 2025, - 2060, 1960, 2154, 2146,37897,42535, 2153, 2145,37896,42534, 1827, 1837, -37853,42485, 1662, 1697,21182,26834, 1622, 4117, 7502, 7272, 7274,27373, -27378,27730,27742,17756,17854, 7245,27355,27697,18094, 7287,27392,27763, - 6313, 7244,27354,27696, 6266, 7243,27353,27695, 6311, 7242,28038,27694, - 7421, 7241,27352,27693, 6335, 7267, 7266, 7265, 7494,23605,23604,25145, -25144,23603,25143, 7324, 7323, 7322, 7321, 7320,20812,13196, 7319, 7318, -21377,13916, 7317, 4373, 7238,26225,26196, 8973,23120,16979, 8991,23130, -16996, 7361, 7359,33574,27527,28795,27980,30929,36127,23669,25203,23595, -25135,23750,25342, 8946,23103,16963,18369,38399,17755,38397,18727,38395, -39660, 8200,39838, 8199, 8198, 8197, 8196,39155, 8195, 8452,38335,42884, - 8140, 8431,38284,42842, 8238, 8459,38345,42916,17754,17853,18767,18068, - 4795, 4925,37367,42056, 4484, 4737,42533,37895, 4794, 4924,37366,42055, - 4483, 4736,37894,42532, 5148, 4829,39792,26808, 5188, 4825,39864,26903, -39989,27146, 4804,37381, 4788,37328, 4856,37595, 4824,37717, 5146, 4855, -39788,26801, 6299,27264,27094, 4457, 7316, 4456,27091,27262, 6297, 4299, - 4454,27752,27386, 7280, 4453,27978,27525, 7357, 4452,28047,27577, 7432, - 4451,27140,27285, 6329, 4450,27692,27351, 7237,13569, 4475,27089,27259, - 6295, 6696,21031,13404,34709,29762, 4560,34755,29808, 4581,34683,29736, - 4540,33871,35166,33467,24062,23862,25554,23594,25134,23714,23713,25286, - 4462, 4464, 4447, 4446, 4445, 4444, 4443, 4442, 4441, 4490, 4488, 4440, - 4439,34673,29726, 4521,33234, 4460, 4438, 4471, 4714, 4116, 4473, 4716, - 4119, 4497, 4755, 4167, 4493, 4495, 4753, 4165, 4466, 4711, 4111, 6367, -21723,14912, 6860,21744,15033, 9259,23362,17407,23593, 6328,21692,14780, - 6339,21695,14794, 6324,21690,14774, 4486, 4739, 4149, 4482, 4735, 4147, -14023, 4480, 4733, 4145, 4479, 4732, 4144, 4793, 4923,37365,42054, 4807, -37432, 4864,37753, 4806, 4936,37431,42088, 7907,23592,42849,23591,42851, -23590,42847, 8458,42915, 4918, 4916, 4911, 4910, 4909, 4933, 4932, 4931, - 4908, 4907, 4914,33979,42019,18138,33978,33765,42018,18021,35195,35194, -42017,18787,33764, 4922, 4792,42053,37364, 4747,26177, 4701,26259, 4705, - 4704, 4700, 4699, 4698, 4724, 4726, 4741, 4152, 4707, 4109, 4697, 4101, - 4696, 4100, 4695, 4099, 4694, 4098, 4693, 4097, 4745, 4156, 4749, 4162, - 4751,25133,24475,35152,24229,33977,24126,33763,24491,35193,34428,29388, -37024,34477,31481,37194,37023,31480,42016,37193,42435,34476,18270,10027, -26730,20331,26939,18213,20344,12777,42015,18212,42434,20330,18798,10416, -26729,20025,26938,18796,21497,14105,42014,18038,42433,21501,18025, 9892, -26728,21500,26937,18037,20021,12308,42013,18795,42432,20024, 4927,42065, - 4906,42012, 4935,42087, 4159, 4161, 4096, 4095, 5108,35087, 5099,35070, - 5057,34992, 4094, 5661, 4092, 5336,14586,14141,11159,11144, 4091, 5658, - 4090, 5522,14874,14302,14990,14331, 5862, 8892,17350,17552, 4089, 4088, - 4087, 5339, 4103, 5225,14403,14016, 5549,35329,26162,10521,41333,26658, -38425,42315,42540,15112,26160,38424,41335,33653,25729, 9800,40991,26618, -36208,42288,42503,11871,25728,36207,40990, 4791, 4921,37363,42052, 4478, - 4731,21062,26749, 4143, 4142,37893,42531, 4053, 4052,21234,26864, 4790, - 4920,37362,42051, 4477, 4730,21061,26748, 2152, 2144,37892,42530, 2059, - 2024,21233,26863, 4141, 4051, 1959, 4140,35970,21026,19466,37325,19470, -37594,35973,20647,36795,37324,20288,21025,20446,20646,37216,37593,36757, -37592,20286,20645,20426,21024,37208,37323,36392,41275,36391,41274,36390, -41273,36562,26297,36140,27688,36146,27687,37256,36530,36566,21023,20236, -37322,20194,37591,36542,20644,36570,37273,38249,36136,30938,42243,33227, -42616,33585,35886,30656,42245,33587,42618,33226,35885,30655,43077,28533, -43442,33225,36062,30839,43032,28725,43420,33455,35884,30654,42323,28532, -42657,33224,35963,40621,35883,30653,28530,41592,37231,31646,37228,31634, -37227,31633,37226,31632,37225,31631,36387,31115,36386,31114,36385,31113, -36384,31112,36134,40810,36142,40821,36071,40723,42984,38423,38141,32157, -38140,32156,38139,32155,38149,27088,38109,42750,38108,42749,38107,42748, -38187,27117,38186,27116,38100,42743,38088,27686,38247,38185,27115,38191, -27124,38214,27132,38159,27072,38158,32171,38157,32170,38156,32169,38228, -27110,38222,32183,38091,32101,38138,27063,36315,41193,31056,36314,41192, -31055,36313,41191,31054,36317,41195,31058,36312,31053,36311,31052,36310, -31051,36488,36486,36503,36501,37279,38775,37277,23368,37238,21750,37281, -21729,38738,38749,38748,38747,38746,38867,37264,27685,37262,31730,42983, -29628,43392,34603,37271,21705,37267,27297,37266,21703,37261,21701,36206, -40989,40988,36205,36204,40987,11870,25727,37684,13455,36203,40986,11869, -25726,37865,13677,36202,40985,11868,36078,42982,36077,40791,11447,37590, -37321,37589,37320,37588,37319,37587,37318,37601,37727,37586,37585,38474, -27258,38427,42992,38441,43041,42981,38422,38491,38421,40661,15111,25290, -37828,13590,37018,41853,37017,41852,37016,41851,37014,41847,37022,41855, -36427,41329,37904,42542,20055,26153,42839,38280,36037,40659,42464,37830, -19498,25285,42838,38279,36429,41331,27347,21820,20057,26158,42837,38278, -37832,42467,37810,42431,37809,42430,37825,31965,37834,31981,37808,31952, -37807,31951,37806,31950,37805,31949,37804,31948,37917,37915,37803,37802, -37901,37900,37801,42429,37800,42428,37799,42427,37910,42544,37909,32040, -37903,32034,37891,42529,37361,42050,21232,26862,21060,26747,37890,42528, -42049,37360,21231,26861,26746,21059,37889,42527,21230,26860,37888,42526, -21229,26859,36250,41019,31021,36249,41018,31020,36248,41017,31019,40536, -36252,41021,31023,36246,41015,37359,42048,19815,25716,41014,36245,36244, -41013,42047,37358,19814,25715,41012,36243,36242,41011,37887,42525,19813, -25714,41010,36241,36240,41009,42524,37886,19812,25713,41008,36239,36238, -41007,25712,19811,19810,25711,41006,36237,38303,27404,38277,32219,32089, -31946,38295,32233,38293,32229,38301,32251,38313,32267,38312,32266,38311, -32265,38310,32264,38316,32270,38322,27497,38321,32275,38320,32274,38319, -32273,38348,32304,37330,37597,39790,37599,37315,37576,39863,37575,39988, -37574,37314,37380,21016,21068,20643,20887,37573,37716,37379,37715,39787, -37714,37313,37312,37393,37311,31761,37371,31804,37429,31832,37334,37333, -31768,37340,31774,37317,31763,37373,31806,37310,31760,37309,31759,37308, -31758,37307,31757,37306,31756,37305,31755,37342,31782,37304,31754,37395, -31826,37357,42046,21058,26745,37356,42045,21057,26744,37384,21073,20905, -37725,37383,42080,21072,26757,36539,31236,42240,33909,42613,33908,36552, -36554,41277,27230,41843,41861,41231,32116,41230,41229,41228,40619,41868, -26318,41870,26320,40616,41138,41136,41859,41151,41140,40535,21494,14101, -23589,22490,15957,40534,22327,15761,11105,12188,25952,21433,14012,41188, -42876,41187,42788,41186,41198,41197,41185,41184,41183,41190,22326,15760, -25107,21432,14011,40532,21476,14091,25705,22469,15935,40531,22471,15939, -25961,21478,14093,40530,40528,40529,40526,40524,40522,40521,40546,40520, -40525,40519,40517,40518,40515,40513,40511,40510,40516,40509,40544,40508, -40527,40507,41533,40506,41451,40505,41499,40504,26449,40503,25565,42936, -22325,41892,27294,40502,40500,40501,40498,40497,22354,40496,27209,40495, -40494,40493,40492,40491,40490,40489,40488,40487,40486,40485,40484,40483, -40482,40481,40480,40479,40478,40477,40476,40475,40474,40473,40472,40471, -40470,40844,40873,40842,40469,40468,40467,40731,40727,40726,41525,41516, -41491,41482,41440,41413,41439,41412,41515,41524,41481,41490,43735,22324, -15759,16624,28157,21431,14010,43733,32591,21430,14009,28150,22323,15758, -43855,22322,43755,43758,43761,43764,43754,43757,43760,43763,43720,43719, -43718,43717,43716,43715,40425,40428,21429,14008,23586,22321,15757,40421, -40427,40420,40539,21428,14007,25691,22320,15756,40538,40419,41106,41105, -41104,41103,41102,41101,41100,41099,41098,41097,41096,41095,41094,41093, -41092,41091,41624,41622,41170,41169,41155,41150,41149,25938,40466,41386, -41364,41377,41358,41385,41363,41376,41357,41362,41384,41356,41375,40682, -40681,40697,40696,40680,40695,42655,42309,42637,42264,42636,42263,42635, -42262,42612,42239,41840,41839,40760,40781,40751,40750,40749,40748,40747, -40746,40745,40744,40743,19610,11499,40767,40742,19609,11498,40922,40921, -40920,40919,19824,11893,40806,19637,40824,19642,43451,43494,43383,43382, -43381,43426,43425,43403,43406,43493,42869,43492,41082,43497,25564,43543, -26448,43380,27232,43418,27208,41130,41128,41123,41122,41121,19910,41120, -19909,41119,21668,14585,25832,19949,12173,41118,21519,14140,25831,19948, -12172,40717,21471,14084,25676,22424,15893,40716,21470,14083,23749,22423, -15892,40715,21469,14082,25333,20638,13037,40714,40713,21468,21467,14081, -18429,25332,25331,18755,18754,10404,20637,43096,43094,43089,43552,43379, -43378,43391,43377,43405,43402,43376,43412,43411,43410,43050,27771,43049, -27770,43154,43150,43147,43146,42787,42875,42786,42791,42879,42790,42878, -42785,42874,42784,42873,42783,42872,42797,42800,42887,42799,42886,42804, -42889,42806,42891,42796,42883,42795,42882,42794,42881,42756,42863,42773, -42771,42766,42151,26932,42150,26931,42149,42148,42147,43496,43152,43542, -43214,43417,43030,42146,42578,43375,42972,42145,26304,42144, 8714,42143, - 4292,42142,41168,42213,26958,42212,26957,42211,42592,19520,28500,11386, -33192,42172,26944,42175,26947,41865,40982,40981,36199,25725,40980,33652, -36198,41589,38420,41594,26258,28531,41575,30651,28499,28529,30616,41573, -28498,26256,41591,41588,26253,29448,41570,31341,29251,41587,37002,26222, -41569,34280,36861,41579,41583,42426,42003,42441,42021,42422,42001,42421, -42000,42420,41999,42419,41998,42418,41997,42549,42554,42417,42416,42415, -42414,42413,42461,42460,42466,42035,42463,42033,42157,42424,42141,42412, -40979,40978,25668,42855,26110,42918,25092,42853,42871,42934,22317,42082, -25091,41996,26252,41995,41994,42037,43149,43093,42770,43091,42768,42068, -26182,43088,42765,42067,41993,41992,41991,41990,41989,41988,41090,42493, -42031,42411,42455,41986,42410,42058,35228,41985,33976,41984,33762,41983, -35192,41982,42064,26720,26751,42079,26756,41556,41555,41554,41553,41552, -41551,41550,41549,41548,41547,28954,36303,29445,28595,30719,28949,31037, -31036,28948,29138,29146,42040,18503,28890,11603,42085,18546,29136,12591, -28992,34983,33191,33607,28497,28496,28495,30615,28494,30614,28598,30722, -28597,30721,28493,40722,28492,43040,28938,33362,33190,28940,28933,33521, -28882,33189,28885,28491,33576,28490,28489,34058,28488,43036,30613,28487, -33738,43048,30612,28486,33188,33589,30951,30611,36138,35850,37007,33187, -34415,37109,35849,34465,37206,33186,33354,35968,35848,34061,36115,33185, -33364,35978,35847,33545,36598,33184,33281,35919,35846,33986,37009,33183, -34417,37112,35845,34470,37005,33182,34413,37103,35844,34460,36002,33181, -33988,36600,35843,33389,36004,33180,34063,37213,35842,33408,35921,33179, -33533,36113,35841,33289,29190,34982,29185,31274,29184,33907,37001,33984, -34407,37098,36596,34453,37212,33407,18346,19496,28643,33544,28617,28614, -28485,28484,28483,28673,28481,28479,29406,31544,29413,33178,34458,29378, -33352,37000,34029,34406,37097,37202,34452,29424,33406,34469,29382,29417, -29281,29422,29317,29405,29250,28838,28836,37849,42483,28814,30940,28478, -28477,37842,42476,28476,30606,28475,28474,38452,43058,28473,30605,28472, -28471,42453,37823,28739,28734,38419,42971,29679,43208,29678,43207,31729, -29627,33177,43206,31728,29626,29677,29650,43205,38505,28776,28775,42970, -36999,33520,34405,37096,36109,34451,35977,33543,17815,19590,28786,28783, -28774,28772,28771,30898,28770,28769,42474,37840,29623,12817,34588,34600, -31712,31658,37250,37234,37236,37269,29630,29589,34609,34590,33919,33906, -33913,33905,42969,31273,29183,33904,31235,36538,33925,31246,36556,36588, -29160,33943,37105,34462,18195,20323,37111,34468,18199,20327,37192,34475, -34981,37798,37021,34427,37199,34486,34447,37041,37036,34442,37198,34485, -34446,37040,37035,34441,37197,34484,34445,37039,37034,34440,37196,34483, -34444,37038,37033,34439,29372,42968,31543,29404,33981,31196,30367,30203, -30366,41981,18427,30356,14108,42029,18442,30336,14049,43491,18868,41980, -32456,32455,30380,30282,32249,32248,37303,10546,37572,14501,20624,30273, -35009,30290,34980,30280,30107,30279,30106,42967,38418,34593,34595,19025, -34597,19027,34592,19023,35427,30962,17897,28470,17732,38480,19333,35429, -19649,30604,38482,28844,35458,30603,17731,29656,18373,38508,20466,35444, -19332,31721,38493,28469,35460,31660,18367,29663,18375,38516,20472,35448, -20459,31725,38495,29587,28963,35440,31716,18371,30078,18726,38490,21427, -35454,20463,32088,38502,29646,29661,38512,29659,38510,34979,37797,17730, -19331,34977,37793,37795,35338,30602,17729,30097,18746,38439,21463,35336, -19330,32099,38437,28468,29180,29178,35416,31261,18112,29162,38477,20192, -35434,31268,18127,29166,38486,20217,35328,31264,18119,29164,38417,20198, -35327,31092,18019,30124,18785,38416,21482,35326,20004,32123,38415,28995, -34436,37030,18144,20280,34399,36995,29581,31652,29460,31502,31466,29366, -29003,31106,30139,30601,32132,28467,30142,30600,32143,28466,31130,29012, -34426,37020,17728,19329,34393,36989,28465,30597,29451,31497,31451,29356, -29455,29447,31340,30077,32087,31494,29249,30178,30202,30177,30299,30201, -30200,34404,36998,18725,21426,34279,36860,29360,30138,38134,36982,29363, -30425,38670,36988,29362,36987,29359,36981,29848,31780,31779,37302,10167, -37571,13097,20623,29838,31753,31752,37378,10150,37713,13026,20886,29854, -29837,29836,29887,36236,41005,31801,32030,31800,32029,41004,36235,37355, -42044,31799,32028,31798,32027,29877,29972,42043,37354,31797,32026,31796, -32025,29876,29971,37885,42523,31795,32024,31794,32023,29875,29970,42522, -37884,31793,32022,31792,32021,29874,29969,29873,29968,31791,32020,31790, -32019,29872,29967,37442,31835,31838,29892,20945,13294,37758,10198,37441, -42091,31834,32051,31837,32054,29891,29979,29963,29965,29961,29949,29948, -29947,29946,29945,29976,29975,29974,29956,31972,31971,41977,33975,31945, -33761,31944,31943,35191,29944,31942,31941,42063,42090,32050,32053,29978, -37353,42042,31017,31016,31015,31014,28924,28923,37883,42521,31013,31012, -31011,31010,28922,28921,36234,41003,31009,31008,28920,31007,31006,28919, -36573,36559,30749,41750,39927,27061,36085,28663,39519,26343,39521,26345, -39517,38971,39061,30955,30953,28834,28832,26597, 9597,20771, 9596,30942, -28812,13649,13159,36568,29087,20211,36550,30974,39555,30976,31207,31202, -39566,31213,39568,31215,32332,32324,14975,14864,32331,30971, 9587,30784, -30885,11334,11536,31035,28947,31034,28946,31033,28945,31032,30680,30682, -31027,43145,27971,38105,36361,38104,36360,38103,36359,38102,36358,30596, -30904,30595,30731,30594,30858,30593,30922,30592,31569,30591,31279,41602, -28464,40779,28463,40729,28462,30788,30920,30787,30919,30589,32108,30587, -30851,40741,31218,31282,31217,33158,31244,33923,33157,31281,31243,33922, -31223,31649,31222,33156,34481,31229,33155,31648,34480,31228,31103,41708, -30586,41705,30751,34057,30585,34060,30837,33551,31227,34479,33921,31242, -30584,33388,31238,33912,30583,33405,34467,30582,30581,34464,31590,33351, -33917,31240,31277,33471,30580,33542,30579,35822,28461,24137,33154,24135, -30578,35821,28460,20315,33153,18190,30577,35820,28459,20322,33152,18194, -40766,40775,28458,28669,33151,33385,31272,30897,33903,31234,31271,34450, -33902,31233,31270,36595,29182,20310,33983,18185,30576,35819,28457,20059, -33150,18701,40773,28667,42406,40772,30889,33149,30856,33148,31111,42577, -31110,31109,12307,41976,20622,30843,33147,31877,31865,31864,31875,38137, -37570,31904,31542,30896,31541,34449,31540,37201,29403,20309,34026,18184, -31630,42576,31629,31628,12776,41975,20621,31903,43374,33146,31108,31627, -33356,33519,31045,33145,43156,38484,28456,28455,38443,43045,28454,28453, -31152,30572,38414,42966,29040,29047,43204,38501,29676,29645,30895,36108, -28768,23808,33518,23827,31710,42921,31727,29625,36586,36582,36581,36580, -36579,36584,40740,29152,33928,31288,36607,29197,20336,33993,18262,31287, -36606,29196,20335,33992,18261,31286,36605,29195,23570,33991,23569,31284, -36603,29194,20334,33990,18260,37259,22029,43144,27970,32398,33816,32358, -33967,32372,33144,32371,32472,32357,32356,32355,32375,32377,32470,33143, -32469,32454,31940,32488,14328,32491,14344,32497,14301,32500,14308,39361, -26101,32247,10545,39782,26792,32246,31751,14500,13025,32238,39552,32227, -32323,32235,32231,32312,42580,32225,14040,42025,20652,32253,32263,42575, -32262,32261,14104,41974,20620,32260,32259,32300,32243,41593,28452,30571, -31099,41604,28451,30570,28450,30569,28449,41607,29090,41606,29089,30841, -28727,31733,29666,31732,29665,31225,31499,31220,31266,30568,31496,30567, -31263,30566,32131,30565,31105,30564,31091,30563,32122,30562,28448,42539, -28447,37827,28446,32197,32191,32196,32190,31097,31096,31095,38514,20470, -31258,31251,33142,31249,33223,31256,31255,31254,30650,30561,41572,26255, -41586,29175,31260,32084,31062,28962,32185,25060,43143,27969,32154,32153, -32152,32151,21506,32150,21505,37792,38136,43087,27905,42764,27245,41135, -25798,38184,32179,32181,32177,32114,32083,31493,32129,32128,32127,41585, -29248,31771,10157,39784,26794,31750,10149,39862,26902,39987,27145,31749, -31778,13024,13096,31777,10166,39781,26791,33466,43424,35165,40725,33880, -43390,32468,43373,32475,32374,33139,32354,31789,32018,31005,31004,31788, -32017,31787,32016,31830,13286,31829,32048,32045,25059,31976,25310,31939, -26251,31947,31983,31938,31937,32043,12475,31936,14107,31974,14074,31959, -35141,31935,33974,31934,33760,31933,35190,31932,13023,32258,14103,31931, -13022,31930,13021,32223,14038,32221,32257,32014,32013,31992,11595,31990, -31988,31986,31985,31963,31929,37791,29943,21499,34974,18036,29942,34973, -31928,18794,37790,20023,31927,37789,29941,20329,34972,18211,31926,31970, -32047,31003,32903,32767,32894,32750,32590,32608,16656,32623,12282,11039, -32630,32627,16680,32582,16581,32576,32615,32614,32573,32572,32570,32568, -32651,32665,32650,33138,32656,33896,33137,32664,32655,33895,32654,33894, -34023,32564,32563,33517,32562,41669,32828,32827,17502,17501,32745,32744, -16798,16797,32825,17495,32917,17319,32824,32850,17318,32849,32783,17544, -32797,17565,32561,32560,32658,32646,32926,32914,32913,32559,32558,32690, -32795,17563,17381,32684,32777,17541,17317,32672,17200,32670,17194,32669, -32741,16962,32740,32739,32738,32789,32923,32737,32736,32766,32755,10229, -10284,10239,10165,10237,10159,10228,10148,10227,10147,10226,10283, 9863, - 9748,40145,10048,40165,10050,40167,32291,31050,30365,28953,30176,28952, -28951,30343,30129,32290,32168,30364,30175,30174,30363,30199,30379, 9665, -21011,36541,36756,35972,36365,20445, 9752, 9582, 9750, 9581, 9627, 9634, - 9580, 9579, 9578,11036, 9648,11282, 9577,11035, 9667,34545,34581,35202, -33772, 9889, 9885, 9884, 9883,17877,17837,17713,17879,18133,17856,17712, -18096,17858,18098,18135,17711, 9949, 9955, 9953, 9952, 9951,18129,18093, -10037, 9640,23566,23565, 9646,23564,20220,33136,41616, 9694, 9697,23563, -19433,33135,40607,23562,24496,33134,35221,24699,33133,24539,33132,24046, -41177,10234,10296,10225,10282, 9726,21010, 9717, 9716, 9715, 9714, 9713, -11524, 9728,17865,24209,33927,10733,10730,23561,19623,33131,40798,23560, -24148,33130,33815,10024,21009,23559,20317,33129,41789,23694,20321,33330, -41796,40707,35160,25330,18753,34859,10070,18483,13378,34808,10099,18426, -13436,34909,10126,18555,13494,10794,10495,10784,10441,10782,10434,10796, -10498,10799,10512,10801,10515,10281,10224,10280,10223,10290,10231,35069, -34971,10279,26303,10278,10277,24228,33937,24125,24490,33767,35197,24673, -13015,24513,13014,24030,41167,10777,10431,10306,10236,34976,10768,10408, -10359,10183,10358,10182, 9797, 9796, 9795, 9799, 9794, 9793,10191,10196, -10146,10145,34402,34382,34392,34391,34390,34389,17710,18023,26235,26237, -26202,26204,18125,18089,18105,18118,17709,18100,18018,17708,18784,18778, -17707,18012,18092,26221,26195,18091,18724,18111,37836,42470,21174,26829, -37838,42472,21177,26832,37857,42495, 9576, 9575,21216,26848,11031,11030, -36545,41564,20204,26213, 9574,11029,36549,41567,20210,26218,41566,26217, -10511,10644,10497,10634,10420,10555,10514,10653,10508,10637,10403,34807, -14078,18425,36535,41546,20191,26194,10473,10618,10430,10580,10480,10623, -10491,10625,30183,10532,40102,10560,10582,10554,10579,32289,32272,10562, -10590,10628,10770,10617,10776,10620,10632,10550,10549,10548,10655,10630, -10616, 9860, 9852, 9851, 9854,10530,20618, 5566,20617, 9573,20885, 9712, -20616, 4291, 4290, 4289, 4288, 4287, 4286, 4356, 4355, 4354,41343,41339, -40665, 6669, 6709,20614,13010, 6821,20611,13007, 7470,22053,15419, 6720, -21548,14238,30101,35158,15891,22422,29753,34700,13136,20737, 4549, 4518, -29770,34717, 4565,29796,34743, 4572,29734,34681, 4535,41611,18173,41613, -33786,35208,34535,18103, 4285,42625,32907,32906,32195,32189,32188,32194, - 4993,42313, 4949,42140,42312,20607,20879,42139,10304,20606,13058,42138, -10729,20605,16109,42137,42448,42178,10276,42491,42136,42490, 4948,42489, -10286,42409, 4954,42443,36593,42135, 4284,42134,10029,42133, 9940,20935, - 9939,23558,12616,42351,23557,20934,33126,42350, 9183, 4283,10121,18549, - 4282,40459, 4281, 4280,20604,42634,13003,42261, 4279,20603,13002, 5137, - 4978,20602,42260,13001,42633,42632,42259,20601,20600,13000,12999,18690, -10349,20599,20598,12998,18689, 4278,20597,12997,18511,10110,20596,20595, -12996,18510,40918,20594,12995,17923, 9765,40917,20593,40916,17922,40692, -40691,40690,40689, 4320, 4322,40418,40417, 4306,40416,42585,42574, 4973, -42252, 4972,42405,42201,20670,42404,42200,10316,20703,13104,42223,10315, -42403,10097,18481,20592,20591,18478,12994,13134,20735,18415,18413,20734, -10063, 4277,20590,12993, 4335,20733,13133,35135,30076,22307,15748, 4399, - 4401, 4276, 4275, 4274, 4273, 4272, 4271,29721,34668, 4515, 4304,40712, -21466,14080,23748,22421,15890,40415,40514,41545,41544, 6668, 8194,33785, -35207,34534,40424,21425,14006,23588,22306,15747,40423,40414,40413,21439, -14026,23556,22334,15779, 4372, 4369, 4368, 4367,35151,30093,22413,15879, -35150, 4709,42027,20654,31957,13047, 4743, 4692,42062,20878,31969,13057, -32452,16107,32464,32480,32369,18743,24473,20658,26549,18117,24227,20589, -26528,18017,24124,20588,26527,18783,24489,20587,26526,40412,10275,20877, -12992,42311,41973,20586,31925,12991,30092,30275,29355,29432,30137,30296, -29002,29008, 4318,17706,23555,20691,26570,40411,25557, 6570, 4334,29718, -34665,12990,20585, 8185, 4333,34541,40410,21144,13573,23554,21321,13811, - 4337, 4332, 4331,17775,23649,20740,26589,18110,24208,20732,26586, 4339, -17705,23553,20744,26593,10094,18475,20584,20583,18473,12989,13156,20767, -18411,18408,20766,10060, 4269,20582,12988, 4346,20765,13155,23552,23551, -20958,20950,18569,13299,10132,18561,20957,23550,18568,23549,10131,18560, -23548,20949,23547,13298,10128,18557,20955,20947,18566,13296,23546,20967, -13309, 4426, 4425,20966,23545,13308,23544, 4422,20964,13306,18123,20907, -18736,26927,18735,20656,18116,20581,18016,20580,18782,20579,18072,27682, -18077,20932,18075,26926,18074,20930,18070,20923, 7374,21967,15295, 6806, -20578,12987, 7475,22058,15424, 7355,21955,15281, 6829,20897,13255, 7482, -22065,15432,17704,26941,39072,22305,15746,25553,21424,14005, 4345, 4344, -20764,39836,13154,39658, 4330, 4329,20731,26878,13132,26640, 5176, 5028, -20763,39657,13153,39835, 4328, 4672,20730,26639,13131,26877,39834,39656, -20762,20761,13152,13151,26876,26638,20729,20728,13130,13129, 4343,21375, -13913, 4327,21249,13704,39129,20760,13150,25661,20727,13128, 4364,20803, -13187, 4385,20846,13227, 4366,17904,26925,17903,20775,18109,20759, 4352, - 4363,17703,20773, 7224,21817,15106, 7278,21845,15151, 6793,20758,13149, - 7453,22033,15389, 4419, 4418,18063,20916,18723,20909, 4414, 4413,17702, -20911, 7222,21815,15104, 7399,21987,15317, 7350,21950,15275, 4312, 4362, -17701,20681, 7220,21813,15100,23543, 7430,22016,15356, 7436,22020,15361, - 7409,22000,15333, 7391,21981,15309, 9607, 9609,20868,26645,26883, 9571, -21254, 9570, 9569, 9568,20862,26642,26881, 9605,21252, 9603, 9711, 9710, -20845,26634,26872, 9709,21244, 9708,32149,17742,27675,18764,26633,17850, -27739, 7293,27674,27803, 7219, 7264,27723,27722, 7263,17700,27691, 7218, -27690,27673, 7233, 4397, 4384, 4387, 4383,10544,26524,14097,37564,10164, -26523,13611,37563,37712,26522,26665,37562, 4854,37711, 4819,37561,10169, -26582,13623,37610,37603,26564, 4833,37657,23542,26552,23747,26521,10144, -26664,13559,37710,24179,26684, 4622,26520, 4642,26575, 4621, 4680,26519, -26657, 4620, 4010, 4619, 4009, 4618, 4008, 4617, 4007, 4616, 4006, 4615, - 4005, 4614, 4004, 4613, 4003, 4612, 4002, 4651, 4042, 4650, 4041, 4649, - 4040,17699,42365, 4999,42364,42338,26673,42337,26672,17698,26694,10370, -26693, 9943,26689, 9942,26688, 4611,26518, 4610,42500, 4609,37862, 4608, -26517,42499,26516,37861,26515, 4984,42285,42284,26514,10357,26513, 4837, -37681,37680,26512,10181,26511,40976,36197,36196,40975, 9792,26510, 4627, - 4019, 4677, 4066, 4629, 4023, 4679,26656, 9567,17697,26655,26157,26889, -26152, 9850,17972,26509,25868,26789,25867, 5989, 4001, 5982, 4017, 9724, - 9832, 9821, 4068, 4021, 4025, 4000, 3999, 3998, 3997, 3996, 3995, 3994, - 3993, 3992,18079,18763,17849,17696, 5676, 3991, 5978, 4076, 9819, 4640, - 4639,26788,26573,26828,26827, 4655, 4607,26604,26847,26850,26787, 4653, - 4606,26845,26508,26844,26786, 4072, 4071, 4070, 9601, 9599,13239,13706, - 9566, 9565,13247,13710, 9707, 9706,13224,13694,32148,17740,27672,18762, -26869,17848,27738,17695,27802,26341,38967,25052,26190,25051,26188,25050, -12633,25049,12628,25048,26338,25047,12682,25046,26280,25045,12771,26095, -26329,25111,12672,25228,25044,25043,25042,25041,25040,25039,25038,25037, -25270,25269,25980,25979,25036,25035,25034,25033,25032,25295,25294,25293, -25292,26167,26172,26166,26171,26165,26170,26164,26169,25309,25308,25307, -26176,26181,26175,26180,26174,26179,25031,25030,25029,25028,25027,25026, -25025,25024,25023,25022,25021,25020,25019,25018,25017,25016,25015,25014, -25013,25012,25011,25010,25009,25008,25238,25236,25264,25266,25543,25542, -25537,25539,26316,26327,26091,25226,26059,26061,26058,32176,38181,25804, -25806,25802,25801,26108,20020,26093,20015,25242,19468,26336,20349,26335, -20348,26334,20347,26332,20343,26323,20340,25391,25370,29835,25369,34970, -26099,31094,32126,31253,35415,38473,36287,38148,36286,36285,25935,27057, -25934,26098,25933,26374,25963,27671,27340,25960,25932,27255,27085,25931, -25959,27050,26097,25967,26186,26184,33117,33965,33116,28439,29173,33964, -29435,34082,33115,28438,33114,34081,26377,26419,25260,33911,33531,28780, -28785,33537,33915,25007,25006,25005,33469,33960,29416,34045,33300,28622, -33283,28616,29170,33957,33350,34056,26369,26402,25004,26005,25003,25341, -29168,33955,34022,33954,26394,26357,28189,22298,28165,28167,33113,33899, -33112,28437,29150,33898,28123,33901,33516,28767,28122,28121,25552,40394, -25551,25550,28436,28435,28641,29402,29401,34021,26373,34969,26372,25248, -19474,11313,19927,25892,12124,28434,28433,25826,25825,26224,25828,26930, -26924,25830,25824,26967,41117,19947,12165,25389,26063,26083,27025,21441, -27190,21629,27108,27071,27244,32175,38180,27074,27070,27069,27076,27059, -21496,27027,27670,27047,34611,35085,27135,27056,34968,27055,38179,35414, -38472,38147,38146,27084,27254,27083,27253,27052,27222,31101,36363,26296, -26288,26271,26287,26283,20247,26285,26264,26290,26273,26294,26277,26293, -26276,26292,26275,25344,28055,28057,27828,27726,27784,27403,27783,27402, -27715,29840,27669,29881,29192,42830,42130,43047,27769,42402,37788,43086, -42763,41134,27668,42752,41279,41836,28023,27667,27737,29834,27736,27904, -27496,27903,27495,38178,32174,28432,28862,29400,29399,29247,27982,27966, -27515,38471,32426,38145,32163,36284,31043,27984,36120,40793,28431,28430, -29046,29039,27762,35413,38470,27243,27242,27068,28429,28880,29398,27126, -27270,27100,26923,27010,27012,26951,26961,26969,26954,26922,26921,26920, -26919,26918,42210,42129,30264,27000,42552,37919,29189,28991,30289,26917, -42459,37899,26956,42401,37787,43142,26916,41838,27054,26915,26914,27261, -27093,27122,27137,27139,27143,26929,27252,27082,26987,26986,26985,26984, -26965,27045,42306,26262,26269,26268,25864,25862,19907,12099,25861,21133, -13558,26232,25284,21158,13589,36233,41002,41001,36232,25459,25467,25466, -25439,25438,25437,25463,25462,25478,25436,25435,25434,25433,25432,25431, -25430,25429,25448,26797,26913,25450,25428,26630,26868,25427,25455,19572, -11451,19575,25453,11454,25425,19564,11435,25422,25421,34547,36611,29498, -31483,40783,36087,27782,27902,27499,27501,27494,27493,27401,27721,27720, -27719,27519,27514,27513,27512,26737,26742,26739,26717,26716,26715,26714, -26713,26735,26734,26733,36534,41543,26558,22395,26507,22420,26675,22296, -26506,20726,26578,20695,26505,20577,20876,26654,30266,30082,29431,29354, -30295,30136,29007,29001,26504,26785,26503,26784,26502,26783,26501,26782, -26653,20576,26803,26818,26810,26781,26780,26779,26778,26777,26905,26776, -26775,26774,26773,26772,26814,27666,26771,27735,27975,27749,28027,28044, -28037,26796,26770,26831,21179,21176,13621,13619,26843,21132,13557,26822, -26821,26820,25684,19793,25679,19791,25660,19781,25659,26261,25658,32147, -25657,26231,25656,25655,25654,27734,25653,25682,27665,27767,25704,27766, -27664,25703,25707,25652,27718,20178,20182,19439,11301,19435,11297,19999, -12305,20245,12674,20249,12676,20253,12680,20252,12679,20251,12678,26247, -21597,21596,21595,21594,30157,35219,33813,29037,29457,34543,40385,40384, -40383,40625,19655,20477,20475,42960,43367,42673,42571,42959,43366,19653, -28426,33105,28425,33104,19651,28424,33103,41111,41110,41108,31886,28423, -28422,28421,28420,19639,11546,19644,11548,19622,19115,41179,41153,19536, -11398,21323,21148,37369,37702,31765,21152,21314,21131,37377,37709,31776, -21130,32245,21129,21313,21128,21312,21127,21311,21126,21401,21305,37295, -37560,31748,21304,21374,13912,20757,20756,13148,21373,21241,13693,20725, -20724,13127,21240,21372,13911,21371,19612,11504,28419,40382,40381,19823, -11892,39128,20755,39127,19822,19780,11781,25651,20723,25650,19779,19821, -11891,19820,19819,11890,11889,19818,41089,41088,19437,11299,19540,11402, -19531,11393,20034,12310,20037,12329,15739,22295,20036,12328,20290,12758, -20300,12769,20299,12768,20298,12767,32458,40797,41132,40630,41662,41707, -41690,41785,41661,41774,41660,41773,41700,41699,41795,41684,41688,41659, -41727,41811,41725,41657,28418,28417,20229,12982,20228,20575,20225,12655, -20222,12653,28416,26302,42400,37786,22294,15738,22293,15737,22292,15736, -22291,15735,22290,15734,22289,15733,22288,15732,22287,15731,34719,29772, -35227,30162,29728,34675,35140,30081,34689,29742,35134,30075,29774,34721, -35133,30074,35253,30198,35132,30073,28931,33671,35130,30071,22286,35177, -22285,22284,22353,22283,31910,29115,29113,31879,28415,28414,22438,15899, -22282,15730,22746,21563,37294,37559,31747,21562,22748,16285,22750,16288, -22415,15884,22281,15729,22280,15728,22392,15849,22463,15930,34658,29711, -35157,30100,29710,34657,35156,30099,22419,15889,31863,29036,29035,22651, -16133,22653,16140,22658,16151,19922,19920,19906,40380,19905,19904,41087, -41116,19968,12203,19966,12201,19946,12164,19945,12163,38940,25109,21310, -21125,20232,12661,20234,12663,20240,12667,20239,12666,20238,12665,20242, -12669,20305,12687,20304,12686,20303,12685,20307,12689,20176,12631,20175, -12630,20180,12635,32140,31127,32139,31126,32138,31125,32137,31124,20351, -20346,31463,31462,31456,31448,31447,31446,31445,31862,32146,31924,41972, -21504,21503,21578,21577,21576,21575,27661,21437,21457,21455,32173,21534, -21532,21530,27660,41713,41802,42860,42754,41724,41810,21525,14160,21523, -14158,21518,14134,21517,14133,21542,14214,22955,23406,23405,23404,23403, -22986,21686,14735,21651,14505,41289,41281,42958,43365,40371,40370,43076, -43441,21638,14457,21657,14512,21674,14605,21672,14603,21667,14579,21666, -14578,19579,11459,19601,11477,25419,25417,19561,35438,30308,41723,41809, -27202,27033,21034,27713,21008,27733,25368,21007,27659,21075,22411,15877, -34878,29879,41558,41577,40612,40614,41693,41787,22278,15727,34907,29889, -26560,26816,22277,15726,26551,26812,22394,15852,22364,15806,34804,29833, -26500,26769,22363,15805,21481,20207,22481,20203,20213,20206,20202,26499, -26768,20201,20270,12650,20269,41342,41338,41337,41341,40664,40663,41562, -41581,20573,12980,29751,34698,34655,29708,34696,29749,34653,29706,41610, -20570,20569,34533,35206,33784,20568,18102,20567,12979,42624,42623,23537, -23536,20566,12978,20565,12977,41086,41085,36592,12658,20564,41808,41374, -41353,41373,41352,41372,41351,41371,40369,40368,40367,40366,40365,40364, -42597,42570,42569,42627,20664,13056,20563,12976,20800,13184,20754,20753, -13147,20799,20842,13223,20722,20721,13126,20841,20798,13183,20797,20650, -13049,20562,12975,20561,12974,20560,12973,20559,12972,41979,31961,42023, -42061,41971,31968,41970,32451,41969,40363,20875,13250,31923,42060,26496, -26767,21448,14037,20720,13125,20719,13124,25860,25859,20718,20717,25966, -25556,20796,13182,20927,13282,20929,13284,20809,13192,20795,13181,20866, -13243,20840,13222,20852,13232,20839,13221,21150,21156,21136,21124,21123, -21122,21121,21120,21278,27658,21119,25367,27732,21118,28025,21138,21117, -13556,21116,13555,21115,13554,21114,13553,21263,21262,21261,25415,25413, -12352,14223,12821,14281,12823,14284,11140,14523,11132,16013,16393,16380, -14985,14869,16399,16386,15015,14892,11966,11104,10996,14459,11321,11539, -11466,10995,11332,11472,11534,10994,11346,16643,10993,16653,11530,11520, -11433,12281,12285,11348,11345,40140,39228,11990,14113,11989,15240,11988, -21492,20011,21491,20010,21490,20009,21489,20008,21488,20007,21512,20042, -34803,29832,23535,23699,24207,21511,20041,33102,11672,22276,35218,11555, -11551,41176,11366,35137,40362,33101,40361,40523,41542,21487,21370,35188, -33950,13910,33100,40360,40499,41541,21486,20006,35187,33949,11888,43364, -33099,43363,12766,42568,18668,12657,36591,33098,32353,11080,12046,12039, -12010,12036,12014,11189,11191,37683,42287,11099,11101,37864,42502,11089, -11091,11066,11068,11117,36201,40984,12614,42348,27657,22275,42347,37744, -12613,12600,42346,37743,12538,12537,33097,13266,23526,27656,22272,12536, -12510,15773,14398,15722,33962,15721,26417,15720,26663,40355,15797,15719, -15718,33946,33830,33433,15717,15716,15715,26691,16233,33096,33095,15713, -33094,37344,33868,37388,33875,20474,32309,33833,33437,33837,17996,33093, -33092,15709,15706,15921,40354,33812,23525,20040,15834,32487,32496,32776, -40353,40352,33091,33811,33810,33809,37293,33808,33807,33806,33805,32299, -32474,32388,33090,32352,17684,23524,27756,22461,27655,22255,17843,23772, -17841,23746,27728,22418,26585,20716,15700,15099,15888,26495,26494,20558, -27029,21447,27036,21462,16104,14669,17900,16103,12971,40351,31922,32450, -25572,19660,17683,23523,26493,20557,16102,15274,26492,20556,12088,12087, -12086,41166,23522,12131,12085,42128,12084,40627,35975,37785,42399,12082, -12113,12079,12078,12077,12076,42498,37860,12075,12074,42283,37679,12073, -12072,40974,36195,12071,12123,41772,41771,41770,41769,41782,36891,41799, -36967,41768,36859,41807,12968,41806,36986,41805,36985,41767,36858,41766, -12517,12514,37751,12606,37749,12604,11378,42546,37906,11431,11430,11429, -11446,11450,11428,11427,11426,21537,12242,20215,20189,20274,21113,20200, -20268,20272,22254,20265,20555,20264,20794,20263,20262,21369,20261,20260, -22253,20257,20715,20267,24168,23521,41348,40350,24206,41540,22356,21036, -22362,21005,21070,22252,21510,21004,21146,22251,21140,22330,21435,21317, -13366,18487,13365,15909,18447,15816,21112,22361,15804,18405,15803,13364, -14077,13363,13435,13809,13572,15699,13492,18554,15698,36471,36498,36547, -15137,14053,16177,14484,40139,39954,15239,14112,15238,14111,15697,15887, -15864,40711,21465,20752,15098,20937,15326,36469,20468,15273,14182,20554, -15272,16100,14326,14299,15021,14896,15013,14890,14961,14960,14959,14958, -14853,14768,14231,14499,14426,14030,14767,14665,14705,14195,14692,14187, -14663,14180,14730,14577,14729,14132,14728,12159,14727,14726,43440,43362, -18059,34607,17682,34605,18720,34602,34903,14772,14786,14269,15355,14267, -14784,16269,15351,16265,14868,14852,14851,14850,14849,14957,14889,25722, -33651,14576,14575,14574,26973,14573,35051,14572,26612,14571,34867,14570, -14569,14096,13552,23520,14062,23519,39795,23518,21316,22250,39531,20793, -14004,39655,14003,21368,14002,39833,14001,14000,13999,39126,19817,40119, -40138,14280,14283,14228,20553,21485,20792,21484,14237,33758,33757,39753, -14240,39752,33089,14247,34800,14246,33088,21111,21451,14222,14207,26584, -15097,16099,14131,25721,33650,14130,14129,14128,26972,14127,35050,14126, -26611,14125,34866,14124,14123,14052,12157,12155,12153,12182,12152,12151, -12150,26971,12149,35049,12148,26610,12147,34865,33649,25720,13454,12146, -16900,17343,16912,17380,16619,16568,23517,16689,16566,24234,16564,22248, -16724,24188,16723,33085,16729,33890,33084,24187,23516,33889,16728,33888, -34012,16559,23826,33515,41648,16558,17067,17181,16557,26220,18087,16720, -16810,16773,16772,20552,17681,16771,16556,18719,16956,16955,17537,17300, -17536,17299,17535,17534,17297,17295,17293,17292,17291,17290,17533,17388, -17377,12965,12964,13095,12963,41609,18172,34532,35205,33783,15477,15532, -17101,12962,32905,32193,32187,16767,12961,13055,41347,13067,12960,18502, -12959,12958,18545,12957,17199,14073,18441,14048,32032,31967,31921,21110, -21446,14036,18404,14035,17680,23511,18740,24471,13163,13660,26601,20777, -18115,24226,18015,24123,18781,24488,12956,13551,26652,20874,40347,13054, -13588,26487,20551,40346,40512,41539,33756,35186,33948,13180,19648,25562, -20465,26438,30161,30303,21450,27031,29353,29430,30135,30294,29000,29006, -21461,27035,36984,41804,12955,13550,37747,42357,12954,13549,40345,25560, -26486,13123,33952,13122,13121,25965,25559,15460,15514,17055,17772,23647, -17679,23510,18108,24205,18121,17678,18738,18114,18014,18780,12953,26651, -18061,18085,17677,18083,18718,18081,15279,16126,15095,15694,17676,17906, -18107,15149,15902,13263,15344,16259,15353,16267,15187,15955,15289,16156, -15127,15790,15093,15692,13548,13610,13596,23508,22329,23745,22417,15809, -34823,15691,34863,22242,24181,15690,15886,20714,13547,40796,35139,33827, -33803,15828,15687,41794,13546,42222,13545,13544,13587,16239,34799,16238, -33082,13543,13578,42408,37794,37816,42445,13657,42127,13656,13655,13654, -42398,37782,13764,42369,17675,42368,13763,42367,13761,17674,13760,15683, -13728,13727,13542,13541,13540,42497,13539,37859,13538,42282,13537,13536, -37678,13535,40973,36194,13534,15680,14206,14568,14122,13667,13586,20550, -13585,11809,11819,11779,11817,12121,11775,11797, 9551,34857,33081,33079, - 1870,10340, 1763,21210, 1607,32011, 1803,35041,30536,30534,19291,31901, -17673,29870,28404,28402, 1820,37989, 1577,29932, 1748,18661, 1887,13864, -35765,35763,10964,37629, 9549,34854,33077,33074, 1867,10337, 1760,21207, - 1604,32008, 1800,35038,30532,30529,19289,31898,17671,29867,28400,28397, - 1817,37986, 1574,29929, 1745,18658, 1884,13861,35761,35758,10962,37626, - 9546,33071,33068,33066,19054,18717,14385,19286,38275,38056,30331,33064, -30526,30524,19282,30522,17667,28391,28388,28386,32215,35749,35477,35586, -10674,17664,21625,22234,35746,35744,10957,35742, 9542,33055,33053,33050, -19051,18714,14382,19279,38272,38053,30328,33047,30516,30513,19277,30510, -17661,28384,28382,28379,32212,35739,35474,35583,10671,17657,21622,22231, -35737,35734,10955,35731,17797,34167,33045,33043,36731,34323,33345,31399, -18340,31381,19447,34342,35958,30508,19267,31584,17649,29534,33325,28371, -17808,36906,20409,29311,35939,29295,34185,36925,35717,35715,19461,36750, -17796,34166,33029,33027,36730,34322,33344,31398,18339,31380,19446,34341, -35957,30500,19259,31583,17641,29533,33324,28368,17807,36905,20408,29310, -35938,29294,34184,36924,35713,35711,19460,36749,43358,33025,33022,33020, - 7205,40213, 6413,24632, 7559,39912, 6227,33018,42727,30498,27180,30496, -24775,28366,40212,28363, 7556,35709, 6226,43355, 7202,27333, 6412,42724, -35706,35704,39911,35702,43361,33015,33058,33061, 7208,40209, 6409,24630, - 7562,39908, 6223,33013,42730,30519,27183,30493,24778,28361,40216,28394, - 7555,35699, 6230,43354, 7201,27332, 6416,42723,35755,35752,39915,35697, -17638,10331,34848,35032,30491, 1811,33011, 1568, 9531, 1739,19256, 1878, -35695,32002,21053,21201,18613,18652,33008,29923,17635, 1861,10944, 1754, -35692, 1598,28359, 1794,37620,37980,19253,13855,17632,34202,33647,33633, -36770,34359,33005,31436,18359,31419,19250,34375,35689,30992,19768,31615, -17920,29549,33004,28918,17631,36945,20439,29346,35688,29330,34219,36962, -36230,36193,19249,36789,17630,33377,33646,33632,36229,33003,30991,17919, -30769,19248,35687,19767,28655,28917,35994,36192,17889,10746,35613,35557, -30927, 8803,33565, 5749, 9746, 8073,19628, 8560,36125,32295,22558,21685, -18903,19091,33570,30376,17895, 8844,11544, 6969,36132, 6014,28802, 8448, -38196,38333,19633,14689,17888,10745,35612,35556,30926, 8802,33564, 5748, - 9745, 8072,19627, 8559,36124,32294,22557,21684,18902,19090,33569,30375, -17894, 8843,11543, 6968,36131, 6013,28801, 8447,38195,38332,19632,14688, -17887,17628,35611,35555,30925,30488,33563,33001, 9744, 9528,19626,19246, -36123,35685,22556,21683,18901,19089,33568,32999,17893,17626,11542,10941, -36130,35683,28800,28356,38194,38331,19631,19244,39563,10143,34967,34798, -30660,42077,33233,26992,33856,42320,31186,31181,39684,31861,24419,21003, -26998,18587,42331,29831,29068,29085,36449,39689,35890,24423,28540,39559, -37950,37553,42072,13360,33862,18638,33197,33201,35065,37723,32038,34797, -31175,18619,33846,21002,30630,37949,31192,19345,29074,17746,28509,34966, -36467,18586,29079,21066,29936,37552,38021,34889,35855,35859,36462,21109, -33210,18637,33451,33444,35020,37608,31979,34796,30643,18604,33205,21001, -30835,37948,30639,19516,28522,17835,28711,34965,35868,18585,28517,21046, -29911,37551,37970,34832,36049,36060,35864,21108,18010,35175,33221,33215, -31081,18584,33736,21859,37947,37550,29904,35353,36327,30648,19351,32120, -17752,30423,33747,28527,31920,38450,34964,34795,36337,18946,28984,21000, -35874,35879,19988,38641,17823,18358,28697,29563,30809,31435,33401,34358, -38685,38468,31614,31418,36017,36769,11343,12750, 9663,10013,33421,34218, -32162,32425,36788,36944,36033,36961,28685,29329,30799,31601,19492,20438, -17822,18357,28696,29562,30808,31434,33400,34357,38467,38684,31613,31417, -36016,36768,11342,12749, 9662,10012,33420,34217,32424,32161,36787,36943, -36032,36960,28684,29328,30798,31600,19491,20437,17821,18356,33685,33684, -30807,31433,33399,34356,36258,36257,31612,31416,36015,36767,19976,19975, -17962,17961,33419,34216,31042,31041,36786,36942,36031,36959,28683,29327, -36265,36264,19490,20436,10003,34321,34165,34340,17795,32160,11309,35238, -35956,35937,28636,34183,31582,38466,20424,31397,18329,29293,29532,35383, -30747,36729,33323,33343, 9657,38683,19459,30427,36748,36904,12740,36923, -10002,34320,34164,34339,17794,32423,11308,35382,35955,35936,28635,34182, -31581,38682,20423,31396,18328,29292,29531,35237,30746,36728,33322,33342, - 9656,38465,19458,30305,36747,36903,12739,36922,33683,34319,34163,34338, -17793,31040,19974,33715,35954,35935,33682,34181,31580,36256,31048,31395, -28956,29291,29530,33714,36263,36727,33321,33341,17960,36255,19457,28928, -36746,36902,36262,36921,43340,17624,32997,32995, 7188,40208, 6408,32993, - 7542,39907, 6222,24772,42710,35681,27167,19242,24766,17621,40196,32990, - 7554,27177, 6210,43353, 7200,35678, 6396,42722,35675,35673,39895,19240, -34525,23507,32987, 7309,32975, 7308,24977,23337,17054,17288,23183,40340, -24975,23336,17053,17287,23182,40338,40336,23181,17052,24973,23335,17286, -38810,32821,40605,39392,25222,38772,40603,39389,25224,32726,38771,32725, -40601,40599,23180,39383,17051,39386,25220,25218,23334,24199,17285,24192, -25279,25281,38770,38769,38961,32820,32724,32723,38959,38809,40652,40654, -38955,38957,41224,17050,25995,23333,41226,23179,25993,17284,23681,23679, -32973,39048,40641,13960,23505,13952,23503,13969,23500,23498,39722,23496, -39746,23493,39745,40067,31682,40070,31685,40072,31687,40066,31681,40065, -31680,40055,31673,39721, 9923,39744, 9934,39743, 9933,16510,32971, 2826, -28343, 2824,40334,40332,40331,40329,40327,40325,40323,40321, 6294,22565, -16042, 6271,22626,16092, 4266,22625,16091,10919,19223, 6624,10911,24964, - 7087,19217,24960, 5724, 2709, 3037, 3181, 4265,22622,16089, 4298,22620, -16087, 7349,21949,15271, 7347,21947,15269, 7345,21945,15267, 3206, 5752, -10899,17800,34171,33121,33125,36735,34327,33348,31403,18344,31385,19450, -34346,35961,30552,19305,31588,17694,29538,33328,28443,17811,36910,20413, -29315,35942,29299,34189,36929,35807,35803,19464,36754,17799,34170,33120, -33124,36734,34326,33347,31402,18343,31384,19449,34345,35960,30551,19304, -31587,17693,29537,33327,28442,17810,36909,20412,29314,35941,29298,34188, -36928,35806,35802,19463,36753,18636,34169,33119,33123,36733,34325,34794, -31401,18342,31383,20999,34344,37946,30550,19303,31586,17692,29536,34963, -28441,18583,36908,20411,29313,37549,29297,34187,36927,35805,35801,21107, -36752,34520,23692,17727,34206,33644,33630,36773,34362,33170,31439,18362, -31423,19328,34379,35834,30989,19765,31619,17917,29553,33166,28915,17723, -36949,20442,29350,35830,29333,34222,36965,36227,36190,19324,36793,17726, -34205,33423,33403,37945,34793,33169,31860,18635,31422,19327,34378,35833, -30811,19494,31618,17825,29552,33165,28687,17722,36948,21106,29349,35829, -29830,34962,37548,36019,36035,19323,36792,17725,34204,34961,34792,36772, -34361,33168,31438,18361,31421,19326,34377,35832,31859,21105,31617,18634, -29551,33164,29829,17721,36947,20441,29348,35828,29332,34221,36964,37944, -37547,19322,36791,17719,33381,33643,33629,36226,33162,30988,17916,30773, -19320,35826,19764,28659,28914,35998,36189,17718,33380,33494,33506,37943, -34791,33161,31858,18633,30772,19319,33379,35825,30915,19588,30771,17875, -28658,33160,28758,17717,35997,21104,28657,35824,29828,34960,37546,36106, -36096,19318,35996,34201,17619,33398,33418,34790,37942,31857,32969,31415, -18632,34374,19209,30806,35662,31611,19489,29548,17820,28682,32964,36941, -17615,29345,21103,29827,35647,37538,34959,36030,36014,36785,19204,38965, -38827,38964,38402,38963,38394,30483,30481,30479,30197,30173,30172,37558, -37533,33232,26991,33855,42319,26997,31853,42071,34785,30663,10141,42330, -20996,31185,37937,30659,42076,28539,39558,29067,34954,39683,18580,28536, -13358,39562,37532,24418,29823,36448,39688,35889,24422,37708,37640,36827, -41765,29940,37091,37531,38132,37530,29954,29939,29952,29938,18047,17687, -18179,17690,37648,36442,36300,26727,26710,26725,26709,36053,36296,36454, - 8812, 5812, 8435, 8792, 4905,43814,43311,43002,43286,42582,42845,42928, -42841,17738,17994,17736,17882,37784,37852,36298,36308,42834,26708,42866, -42924,42836,41896, 4061, 5984, 5996, 3392, 6655, 3665, 5991, 2355,11822, -11824,12297,12293,41271,41244, 9823, 9825,28555,30678,23629,25170,28972, -31072,24113,26051,28716,30818,23740,25326,28544,30669,23602,25142, 9678, - 9673,12176,11804, 6292,22567,16044,14145,14590, 2539, 5657,14143,14588, -14164,14610, 2549, 5675, 1621, 5475, 1922, 5500, 3097, 5374, 5384, 3103, - 1927, 5218, 5216, 1912, 5230, 1907, 5228, 1909, 1924, 5240, 1920, 5242, - 5251, 1915,16600,16633,10970,11111,10966,11285,11116,12195,12208,11050, -24332,28819,28826,30947,37995,11048,37653,24461,38605,24787,38432,11046, -28807,30934,11044,43887,43853,43884,43850,43879,43845,43876,43842,14147, -14592,11113,12199,17610,19104,17607,19103,35640,28333, 8578, 8135, 4818, - 4785, 8230, 8669, 8667, 8228, 8584, 8161, 8176, 8596, 8576, 8133, 6923, - 6164,36294, 8790,36293, 6921, 6162, 6901, 6157, 4816, 4783, 8178, 8598, - 6925, 6166, 8586, 8163, 6903, 6159,24751,12788,39418,38649,38634,36069, -38630,37529,39997,39585,40148,40037,40013,40113,39995,39678,40109,39587, -39677,39544,39583,40111,39582,38677,35816,35815,38676,38692,38648,32845, -30554,32330,30665,31742,31199,32322,32317,10868,10865,28325,28322,28318, -28315,18253,11572,11569,37502,37165,35655,35652,35793,36302,36292,18631, -34162,32968,32963,36726,34318,34789,31394,18338,31379,20998,34337,37941, -30485,19208,31579,17614,29529,34958,28341,18582,36901,20407,29309,37537, -29290,34180,36920,35646,35661,21102,36745,18630,18355,32967,32962,31856, -31432,34788,34355,34200,34373,31610,31414,37940,36766,19207,19203,17613, -17618,34957,34215,29547,29344,36784,36940,37536,36958,29826,29326,35645, -35660,21101,20435,18629,17873,32966,32961,31855,30913,34787,33504,33376, -33375,30768,30767,37939,36104,19206,19202,17612,17617,34956,33492,28654, -28653,35993,35992,37535,36094,29825,28756,35644,35659,21100,19586,35799, - 9353, 9466, 9351, 8511, 8467, 9356, 9355,38382,28878,28873,28860,28855, -36282,36277,35797,18255,27821, 2597,18244,18243, 2456, 2596,18258,20185, -18251,18250,18248, 2639,37181,37178,37131,37164,37190,37163,37162,37161, - 2628, 2484,37160,37130,37159,37189,37158,37107,35671,28353,30196,28348, -30171,28352,28351,30211,28330,32980,32985,32978,32983,28346,28350,28329, -32887,32733,36647,36641,39425,39436,39434,17467,17466,17465,11252,11231, -11249,11228,28577,30701,28571,30695,17464,36512,36527,32681,33885, 2803, -29143, 2801,33883, 2815,29141, 2814,17283,36510,23099, 8940,16953, 8939, -24190,24197,17374,36514,23332, 9222,17282, 9221,24186,24195,16899,36509, -17342,36508,16716,36507,23331, 9220,17281, 9219,23513,23515,16898,35774, -16770,35773,35812,32912, 9413, 9412,38826,38825,32843,32842,36520,32749, -36525,32722,36524,32765, 9315, 9314,38768,38767,32721,32720,36523,32902, -36522,32643,11922,11919,17550,32854,17500,32826,17196,32891,17326,32918, -14566,13036,13033,13045, 9827,20640,20632, 5980,21627, 6232,20630, 4294, -28502,30618, 3072, 3390, 3308, 3501, 3294, 3479, 3296, 3485, 3291, 3474, -24393,42188,24390,42185,10400,38621,10397,38618,38600,37957,38597,37954, - 3369, 3053, 2347, 2474, 2341, 2468, 3497, 3306, 3387, 3070, 3372, 3056, - 3462, 3288, 3460, 3286, 3367, 3051, 6898, 5577, 6896, 5575, 6912, 5608, - 3262,38172,27114, 3033,38221,27106, 3031, 2490,38144,27081, 2488, 9523, -38143,27080, 9895, 3361, 3413, 3411, 2340, 2338,19193,20045, 3436,16188, - 7760,16186,16190,16166, 7755,27548, 7979,27546, 7977,27554, 7985,27371, - 7905,27369, 7903,10218,34894,29094,29104,23572,40849,33705,33700, 5477, - 3365, 5504, 2343, 5409, 3495, 5442, 3385, 5436, 3375, 5376, 3454, 5430, - 3363, 5327, 2345, 5283, 2367,32622,30556,30756,31026,32607,30558,30783, -30872,30884, 6085, 1558, 5512, 1532, 5502, 1551, 6098, 1541,16642,32605, -32620,16677,16631,16675,14167,14613,10974,10972, 5387, 3106,12007,12006, -19884,19883,27888,27479,25821,25820,22532,21907,15995,15226,13355,13354, -20992,20991,27887,27478,16175,22682, 3640,22681, 3639,28006, 3745,36150, -14722,16168,31028,14779,14262, 5486, 3092,14788,14271, 5514, 2300,14739, -14218, 5444, 3337, 3130, 5407,14202,14718, 3108, 5389,14190,14695, 3105, - 5386,14188,14693,14733,14211, 5433, 3328, 3090, 5367,14184,14674, 2302, - 5285,14115,14519, 2320, 5325,14137,14582,10976,10978, 2315, 5308,14118, -14556,12287,16679,12187,12185,12167,12213,12211,12145,12210,12220,12171, -12005,19882,25918,25819,19938,12144,13353,20990,25795,12218,12143,11787, -16647,11802,11800,11791,11789,12169,12012,11287,12142,12004,11785,11783, -32625,32624,16645,11772,16644,11535,11333,11771,11770,11769,11768,37781, -39432,42704,17745,19044,28513,30325,30629,32526,33196,35580,33861,33845, -31191,31174,35858,38269,11123,14378, 9612,10668,33200,35471,29073,29078, -36461,36466,35854,38050,28508,30067,30634,32209,19344,21619,17744,37488, -28512,29885,30628,32037,33195,35064,33860,33844,31190,37929,35857,37722, -11122,29816, 9611,31846,33199,34888,29072,34947,36460,36465,35853,38020, -28507,29935,30633,31908,19343,34770,42124,18618,28511,29884,30627,39579, -33194,35063,33859,39542,31189,31173,41965,37721,26764,13467,24372,10194, -39541,34887,29071,29077,36459,41964,35852,38019,28506,42123,30632,31907, -39578,21065,35579,33450,33204,33209,10667, 9684,21618,19515,32208,30827, -35470,33443,30642,30638,32525,30834,30066,28710,28516,28521,38268,36059, -30324,28721,19043,17834,14377,11391,35867,35863,38049,36048,35019,33449, -33203,33208,31845, 9683,34769,19514,31883,30826,34831,33442,37928,30637, -31978,30833,29910,28709,34946,28520,37607,36058,29852,28720,37487,17833, -29815,11390,35866,35862,37969,36047,35018,33448,39540,33207,10162,24371, -21045,39577,31882,30825,34830,39539,30641,30636,39576,30832,42122,28708, -28515,28519,37606,41963,29851,28719,18603,42121,13429,26763,41962,35861, -37968,36046,18009,35174,33220,33214,31080,10542,33735,21858, 9872,32383, -19996,35352,36326,30647,19350,32119,17751,30422,33746,28526,18003,38449, -12303,30287,36336,18945,28983,15177,35873,35878,19987,38640,18008,35578, -33219,33213,31079,10666,33734,21857, 9871,32382,19995,35469,36325,30646, -19349,32524,17750,30421,33745,28525,18002,38448,12302,30323,36335,19042, -28982,15176,35872,35877,19986,38639,18007,35173,33218,39538,31078,10541, -39575,21856,24379,32381,39537,35351,36324,30645,19348,39574,17749,42120, -33744,28524,41961,38447,26910,30286,42119,18944,28981,15175,35871,41960, -19985,38638,18006,35172,33217,33212,31077,31844,33733,34768, 9870,32380, -19994,35350,36323,37927,19347,32118,17748,30420,33743,34945,18001,38446, -12301,30285,36334,37486,28980,29814,35870,35876,19984,38637,35881,43188, -19019,43115,19000,43043,18937,42904,19125,40860,41464,40864,41531,40856, -41497,27449,27858,26485,26484,18893,35399,18905,18871,36637, 8640,43490, - 8638, 8636, 8632,43488, 8630,27913, 6309,27643, 6199,27650, 6201,27648, -27317,15071,21781,27319,36291,30114,30113,18035,18034,18843,27630, 6194, -27198,26411,27628,27627,27626,17953,18752,18873,18877, 6850,14325,14323, -13562,27200,27195,26544,26498,35410,18842,18840, 7945, 4605,36290,29959, -29958,18839,26754,26753,18838,30779,28661,28542,28311,32951,38593,37485, -26198,38808,32719,26208,26206,26210,28413,12590,18544,11602,18501,10103, -18493,11601,18500, 7875, 7873,27185,26532,26483,27409,27411,26491,27792, -26530,26719,26489,26712,12815,27808,26482,27790,27795,27794,26070,27380, -30341,10472,28732,29134,29567,29569,30349,30351,29019,29021,27745,26481, -26480,25346,25339,25355,38807,32718,26068,26073,25349,25351,25348, 2714, -26479,25856,26478,25855,26477,25854,26067,26078,32125,19191,26065,26076, -26476,26475,26072,26080,26131,26136,32145,10040,37484,37483, 4063, 5977, -22224,15675,18722,38647,38592,36537,38591,26410,26474,26473,26416,26683, -27293,27228,26245,26662,35635,28328,28327,43141, 8634, 3698, 3417,43138, - 8621, 3713, 3441, 4213, 6544, 4218, 6524,40309,21826,15119,24933,20136, -12548,31819,24935,29131,37427,37426,37408,38126,37407,24931,24929,17280, -35772,17341,35771, 8954, 8953, 8972, 8971,32782,38780,32780, 9335,38778, - 9333,35811,32911,35810,32910,35809,32909, 9436, 9435, 9450, 9449, 8407, - 8256,38629, 8415, 8264, 8255, 8406, 8263, 8414,35185,30123,35217,30156, -35214,30153,35789,40137,14174,32950,32949,32948,32953,35923,39167,35925, -38697,30195,42782,38646,27407,27788,27787, 8189,35791,12362,12359,11671, -11668, 8208,38343, 8206,38341, 8147,38291, 8145,38289, 8143,38287,10851, -27142,10850,27121,10849,27044, 6334, 1523,11177,11175,15347,23665,25199, -23667,25201,41325,41317,41322,41314,12358,23576,40851,37545,38125,37544, -37543,37541,41764,40304,28309,28308,28307,43105,18991,28306,28304,28884, -35642,42567,41159, 9349,33613, 2854,28895, 2849,33611, 2852,28893, 2847, -13527,26472,11550,36307, 9348,13526,18492,33879,41480,33867,41510,41496, -41445,41530,41535,43810,43282,43307,37913,41501,41463,13758,43028,41495, -43007,41529,12582,18534,26682,12589,18543,33877,41478,33870,41514, 4208, - 6553, 4263,22580,16060,11642,19693, 6603,11623,25597, 7060,19674,25585, - 5684, 2676, 3005, 3140, 4055, 5988, 4207, 6550,20547, 5987,19189,20546, - 9831,13525,20545, 9723,40302,40300,40298,38633,31123,25354,25357,40313, -40315,40312,40311,19187, 2935, 2932, 2975, 2972, 2931, 2389, 2392, 2388, -38391,12812,38367,38390,38360,10845,23489, 9521,23488,23541,23486,10861, -35182,30120,10858,12326,35220,30158,12323, 3320, 3318, 3083, 2317,41305, -27826,27824,27810,30339,28303,30476,21529,28302,30475,21527,28301,30474, -35418,30472,24979,41370,28299,40542,28298,40374,28297,41301,28504,41303, -28296,40378,28295,40389, 9517,22223, 9515,22222,28294,30471,15673,28293, -30470,26087,23485,26085,23484,26089,23634,26143,23482,28291,30468,35840, -25163,24068,33717,30467,33713,31149,36306,36274,36305,33668,36280,36279, -33666,41175,33726,30753, 8805, 9754,35271,35600,11567,11566, 8646,35602, -11561, 8644,40541,43812,40373,43309,40377,40376,43284,40388, 5853,40387, -35409,30466, 8193,35407,30465, 8192,35381,30464, 8184,35379,30463,35570, -30461,43352,28290,30460,27624,28289,30459,28287,30457,39372,30625,39369, -30622,38899,31715,39351,30456,39349,30978,39353,31089,29622,31709,38885, -31720,38884,30455, 8191,38882,30961,39786,30454,31739,35838,35795, 9519, -24942,24946,10856,10860,36345,36353,36344,36355,36343,36351,27406,35181, -30119,35281,30226, 8360, 8356, 8330, 8358,39348,32112,36349,36348,36347, -35184,30122,28764,41298,25054,40688,35240,30453, 8794,35249,30966,28852, -35594,28858,28857,35592,35385,30452, 4903,35397,30969,11554,35412,30451, -24989,41350,37156,36374,38124,38073,32589,11073,42118,18242,16618,38061, -11079,42117,17959,36254,33491,33503,36103,33681,30912,17872,30766,19973, -36261,19585,31039,28755,35991,36093,33703,33698,37155,38123,36373,18241, -37154, 9818,20884,14498,26409,27227,26106,41758,37129,18218,12026,42159, -18240,12035,42116,35785,38881,32098,33691,33693,33689,22218,12043,13218, -10294,10292,12028,30542,30450,30538,30449,31151,30448,31161,30447,31163, -31165,10883,22217, 5329,42155,42974, 8736,42153, 4951,41300,31460,30446, -31458,30544,31450,30445,30548,30444,30546,30443,30850,30442,31129,30441, -31171,30440,31177,31167,35657,35781, 5119, 5121,43484,18837,42822,32959, -28339,32957,28337,10890,10889,35180,30118,10888,35116,30009,32955,28335, -32956,28336,10886,32142,30439,32107,30438,33826,29060,33828,29062,30848, -31159,32105,31158,18239,12112,42115,40294,22797,16335,11611,19666,23481, -11704,19724,23480,11710,19727,23478,11634,19685,23477,11722,19733,23476, -40292,21574,14298,14322,21593,40290,11726,19737,23475,11202,19384,23474, -11677,19713,23473,11674,11673,19710,23534,11205,19387,23472,11208,19390, -23471,11353,19502,23470,11011,19312,23469,11649,19700,23468,12449,20095, -23467,11007,19309,23466,11630,19681,23465,12445,20092,23464,16116,10909, -19216, 6507,10843,19185, 7796, 5508, 1553, 6102, 1544,11201,19383, 7799, -10841,19183, 6769,10917,10916,19222, 6757, 1919, 5507, 5506, 2337,11200, -19382, 7798, 3099, 5379, 5378, 3456,11204,19386, 7743, 3078, 5354,14173, -14650,11010,19311, 6602,10930,19231, 7795,10927,10929,19230, 7724,10926, -19228, 7741, 5302, 2336,11207,19389, 7616,10838,19181,41258,11641,19692, -41257,10836,19179,41256,16649,22930,25272,11033,19314,25535,11323,19482, -25545,11004,19307,25874,11315,19476,25895,12442,20090,25866,11468,19595, -25469,11456,19577,25457,32610,32609,16651,22932,25274,30785,30886,11537, -11335,11325,19484,25547,25471,19597,11470,16682,12289,16681,25058,22939, -16691,12141,11331,16598,30781,11329,11767,11766,11320,19480,25541,12003, -12140,11319,19479,41255,17819,18627,28695,29901,30805,31851,33397,34784, -34199,34372,31609,31413,36013,37935,11341,13776, 9661,10272,33417,34953, -29546,29343,36783,36939,36029,37525,28681,29821,30797,31919,19488,21087, -17818,18651,28694,29922,30804,31892,33396,34847,34198,34371,31608,31412, -36012,37979,11340,13854, 9660,10330,33416,35031,29545,29342,36782,36938, -36028,37619,28680,29861,30796,32001,19487,21199,35953,18354,28693,29561, -30803,31431,33395,34354,34197,34370,35934,31411,36011,36765,28634,12748, -30745,10011,33415,34214,33340,29341,36781,36937,36027,36957,28679,29325, -30795,31599,33320,20434,35951,18353,28692,29560,30802,31430,33394,34353, -34196,34369,35932,31410,36010,36764,28632,12747,30743,10010,33414,34213, -33338,29340,36780,36936,36026,36956,28678,29324,30794,31598,33318,20433, -18163,34524,18170,34539,38973,41703,29442,14761,14765,14758,14451,13068, -10317,20704,13105,42224,24299,30412,43809,43281,43306,38235,27349, 7889, -14291,14320,14307,14275,27292,32314,26432, 8142,38286, 8205,38340,32311, -26426,27542, 7973,24301,30414,29621,31708,38245, 2898,34620, 3233,38243, - 2890,34618, 3225,38241, 2909,34616, 3245, 2476, 2353,29613,31699,38239, - 2333,34614, 2311,38232, 2959,32947, 2997,38230, 2957,33238, 2995,32946, - 2920, 3256,38218,33236, 2918, 3254,38216,32945, 2913, 3249,38211,33141, - 2911, 3247,38209, 3284, 3458,28841,30957,38225, 2952,33595, 2990,32944, - 2906, 3242,38205,33111, 2889, 3224,38171,26471,33619, 2904, 3240,38203, -33617, 2902, 3238,38201,33615, 2900, 3236,38199, 9347,33603, 2896, 3231, -38189,33601, 2888, 3223,38170,33599, 2908, 3244,38207,40288, 5473,19177, - 6077,19175, 6083,40286, 5510,20671,42202,28668,40774,28870,35518,28876, -28875,35516, 3026, 2497,12321,35396,30968,43080, 8776,42253, 4974, 9563, -35780, 9562,35779, 9561,35778, 9560,35777,35621,35776,43187,43525,33087, -28410, 8381,40344, 6063,40349, 5471, 8656, 8665,35769,35619,43193,43529, -24924,24922,19170, 6052,40280, 5460,19169, 6094,40279, 5498,40284, 6048, -40278, 5456,35768, 9554,35767, 9553,42816,42903,33083,28406, 8214, 8219, -42821,42908,35276,30221,10834,40283, 5465,19173, 6057,40282, 5484,19172, - 6072, 4604,35480, 8688,38151, 7004,35486, 8696,38161, 7021,35484, 8694, -38154, 7019,11715,11706,15672,11667,11713,11702,15669,11664,11699,11717, -11708, 5397, 3116,14777,14260, 5481, 3113, 5447, 3389,14741,14220, 5446, - 3339, 5412, 3500, 3132, 5411,14204,14721, 7329,21927,15249, 5494, 2352, - 5372, 3448, 3101, 5382,14186,14691, 2327, 5344,14162,14608, 3077, 5353, -14172,14646,11648,19699, 6601,35482, 8692,38166, 7017, 5392, 3473, 3110, - 5391,14192,14699,23463,43692,43694,24920,38951,22867,16482,33249,28118, -16479,28586,28115,22864,30710,35901,40584,16114,11661,23661,38948,22861, -16476,43690,33246,28112,16473,43689,28583,28109,22858,30707,35898,40581, -25195,23462,43789,43767,24919,23461,43688,43686,24918,16464,28568,30692, -28588,33251,30712,24853,35903,24812,28590,33253,30714,24855,35905,24814, -28576,30700,28575,30699,28574,30698,28594,30718,28593,30717,28592,30716, -23460,26117,23459,26125,25062,24917,25064,24916,23615,26119,23618,26127, -24915,25159,24914,25161,23458,25068,23457,25070,25378,24913,25384,24912, -23580,24911,23578,24910,25380,25086,25386,25084,23456,23455,43698,43696, -43702,43700,24909,24908,23454,28127,23453,28131,28125,24907,28129,24906, -23452,25073,23451,25076,27214,24905,27040,24904,23584,24903,23582,24902, -27216,25090,27042,25088, 9897,23617,27212,23825,27038,23807,25508,25507, -25485,25484,38076,32635,24060,43752,24059,43747,43751,25989,43746,25988, -16663,38064,23708,23707,28163,28162,28160,28159,25277,25276,33688,11488, -11501,33695,11465,19593,41254,23833,23813,24901,25514,24900,25491,25516, -25493,23824,23806,25376,25506,25382,25483,25505,25482,23840,23819,25258, -25524,25255,25501,25521,25498,16662,40650,40648,12139,16661,17475,16660, -17494,16708,32634,16655,11765,16654,16668,16665,17463,25268,22928,16640, -16658,12002,16657,41253,22927,16639,27274,27104, 8615, 2949, 8724, 2967, -24899,24898, 5711, 3168,27087,27257,39591,39593,39778,39780,24897,24896, -25305,41442,41415,24895,24981,41405,41436,24894,40670,21283,13733,25304, -20144,12556,40669,23178,17049,25303,23330,17279,40668,22082,15459,25302, -21736,14943,40667,22103,15510,25301,21714,14841,31816,38978,12457,20101, -23723,12456,20100,23722,12455,20099,25853,25930,41147,41165,24893,25153, -25151,41527,41493,41518,41484,24892,24891,24985,24983,41512,41476,41523, -41489,24890,24889,29127,37418,38081,38944,38942,25926,25928,41143,41145, -41161,41163,24888,24887,25157,24316,25155,24308,26445,24886,26435,24885, -31153,30573, 8606,27241, 8708,27067,24884,11397,24883,19535, 5633,40721, - 8611,27268, 8716,27098,24882,13815,24881,21327,27278,27119,15862, 8485, -22401, 8532,24880,24879,27266,27096,13813, 5014,21325, 5150,24878,24877, -24305,25080,24314,25078,24876,26430,24875,26443,38381,12808,38372, 9614, -33240,28553,30852,30588,23810,25510,23829,25487,24874,25489,24873,25512, -28730,32109,30590, 8604,27239, 8706,27065,25072,11400,25075,19538,23818, -25523,23839,25500,25257,25497,25254,25520,25114,41379,26145,23677,25211, -24077,36418,36416,36452,21509,20039,35274,30219,12320,35212,30151,33801, -29031,33802,29032,12319,12317,12316,12325,33814,29038,29030,31148,29029, -31147,33804,29034,31169,31146,33818,29042,23805,25504,23823,25481,26115, -25480,26123,25503,25094,40694,30575,35818,25066,41355,14455,13070,10319, -20706,13107,42226,34316,10000,34335,34160,17805,17791,20405,11306,35931, -35950,34178,28631,31377,31577,31392,20421,29288,18326,29307,29527,36724, -30742,33337,33317,18336, 9654,19444,19455,36899,36743,36918,12737,34315, - 9999,34334,34159,17804,17790,20404,11305,35930,35949,34177,28630,31376, -31576,31391,20420,29287,18325,29306,29526,36723,30741,33336,33316,18335, - 9653,19443,19454,36898,36742,36917,12736,34314, 9998,34333,34158,34388, -36806,31455,29578,35929,35948,34387,28629,31375,31575,31644,20419,29577, -18324,29305,29525,36980,30740,33335,33315,29358,31643,36979,34229,36897, -36741,36916,12735,34530,23691,34519,23690,34518,23689,37417,37349,37500, -37481,37567,37337,37555,33628,33624,33374,33373, 9760, 9764,19763,19759, -31002,30998,33638,33642,30765,30764,30983,30987,28913,28909,28652,28651, -36225,36221,28904,28900,17915,17911,11887,11883,35990,35989,36188,36184, -34783,33502,33372,33371,10271, 9735,21086,19584,31918,30877,34952,33490, -30763,30762,31850,30911,29820,28754,28650,28649,37934,36102,29900,28792, -18626,17871,13775,11515,35988,35987,37524,36092,34846,33501,33370,33369, -10329, 9734,21198,19583,32000,30876,35030,33489,30761,30760,31891,30910, -29860,28753,28648,28647,37978,36101,29921,28791,18650,17870,13853,11514, -35986,35985,37618,36091,33500,33499,38464,38679, 9733, 9732,19582,19581, -30875,30874,33488,33487,30759,30758,30909,30908,28752,28751,32408,32159, -36100,36099,28790,28789,17869,17868,11513,11512,35984,35983,36090,36089, -20673,42204,28671,40777,43082, 8778,35236,31145,42255, 4976,12467,15666, -12584,18536,15665,18529,11600,18499,43684,43683,43682,43681,41521,41506, -41487,41472,28106,28105,41520,41486,41505,41471,28104,28103,12588,18542, -35566,30397,17734,29615,31701,29620,31707,11594,11580,11593,11592,13438, -40317,40319, 2675,11660,19708,41252, 6693,40409,12569,20157,40408,40672, -12563,20151,40276,40403,40406,12618,42353,20165,42669,40402,40405,40550, -40548,12621,42356,20168,42672,40274,40272,40554,40552,35279,30224,34631, -29684,40270,43213,40268,43541,40400,40397,24303,34628,29681,40399,43210, -40396,43538,32283,11690, 3331,32281,11697,11696,11695,11694,19722, 2733, -11692,19720, 2731, 6695, 6692,34708,29761,20865,13242,11180,11183,11179, -11182, 2831,15192,39417,31625,18280,19041,29473,30322,31309,32523,34248, -35577,34246,34106,31307,31515,36671,38267,12696,14376, 9964,10665,34104, -35468,29216,29471,36826,36669,36824,38048,29214,30065,31513,32207,20360, -21617,18318,37584,29511,29813,31361,31913,34295,34944,34300,34148,31356, -37965,36713,37480,12727,29846, 9992,31873,34152,34767,29271,34991,36876, -36717,36881,37926,29266,29895,31557,31843,20395,34820,42168,18576,29518, -29812,31369,39620,34308,34943,34307,39550,31368,31564,42011,37479,26800, -13352,24374,10138,39549,34766,29279,29517,36889,42010,36888,37925,29278, -42167,31563,31842,39619,20989,18315,18575,34990,34819,31355,31912,34299, -34942,34294,34151,31360,31556,36716,37478,21142,21022,18640,18594,34147, -34765,29265,29510,36880,36712,36875,37924,29270,29894,37964,37583,20398, -20988,39536,10155,34989,34818,31354,41959,34298,26909,34293,42114,31359, -31555,39573,31872,24378,21021,26908,18593,42113,29845,29264,29509,36879, -39572,36874,24377,29269,39535,37963,37582,41958,13391,39547,10137,34941, -34764,31365,42007,34304,26936,34303,42164,31364,31560,39617,31841,24384, -20987,26935,18574,42163,29811,29275,29514,36885,39616,36884,24383,29274, -39546,37923,37477,42006,13351,38766,32717,41738,39446,26352,38806,41818, -39493,26389,32819,38805,32818,38804,32817,41744,39452,26362,38765,41826, -39501,26397,32716,38764,32715,41740,41820,23329,39495,17278,39448,26391, -26354,23177,24271,17048,24282,41746,41828,23176,39503,17047,39454,26399, -26364,23328,24276,17277,24285,24278,26367,18312,19039,29506,30320,31351, -32521,34285,35575,34290,34140,31346,31552,36705,38265,12724,14374, 9989, -10663,34144,35466,29261,29502,36866,36709,36871,38046,29256,30063,31548, -32205,20392,21615,18311,37476,29505,29843,31350,31955,34284,34987,34289, -34139,31345,37922,36704,37580,12723,29810, 9988,31840,34143,34816,29260, -34940,36865,36708,36870,37961,29255,29907,31547,31870,20391,34763,42112, -18591,29504,29842,31349,39571,34283,34986,34288,39534,31344,31551,41957, -37579,26762,13389,24370,10153,39533,34815,29259,29501,36864,41956,36869, -37960,29254,42111,31546,31869,39570,21019,18310,18590,34939,34762,31348, -31954,34282,34985,34287,34138,31343,31550,36703,37578,21080,20986,18621, -18573,34142,34814,29258,29500,36863,36707,36868,37959,29253,29906,37921, -37475,20390,21018,39491,41816,18351,18625,29558,29899,31428,31849,34351, -34782,34367,34194,31408,31606,36762,37933,12745,13774,10008,10270,34211, -34951,29338,29543,36934,36778,36954,37523,29322,29819,31596,31917,20431, -21085,18350,18649,29557,29920,31427,31890,34350,34845,34366,34193,31407, -31605,36761,37977,12744,13852,10007,10328,34210,35029,29337,29542,36933, -36777,36953,37617,29321,29859,31595,31999,20430,21197,39509,41834,39497, -41822,39416,39422,36636,26312,40618,12761, 9997,34313,34157,34332,17789, -17803,11304,20403,35947,35928,28628,34176,31574,31374,20418,31390,18323, -29286,29524,29304,30739,36722,33314,33334, 9652,18334,19453,19442,36740, -36896,12734,36915, 9996,34312,34156,34331,17788,17802,11303,20402,35946, -35927,28627,34175,31573,31373,20417,31389,18322,29285,29523,29303,30738, -36721,33313,33333, 9651,18333,19452,19441,36739,36895,12733,36914,26314, -40623,12765,40108,39363,34244,18711,34242,34102, 9962,32204,20358,35465, -31511,10662,34100,21614,31305,38045,31303,20356,29212,18278,29210,35574, -36667,19038,29469,14373,18276,38264,12694,30319,36822,36665,36820,22228, -34292,18709,34297,34146, 9991,32202,20394,35463,31554,10660,34150,21612, -31353,38043,31358,20397,29263,18314,29268,35572,36711,19036,29508,14371, -18317,38262,12726,30317,36873,36715,36878,22226,26350,24269,27187,27023, -34349,33623,34365,34192,10006, 9763,20429,19758,31594,30997,34209,33641, -31406,31604,31426,30986,29320,28908,29336,29541,36760,36220,29556,28899, -18349,17910,12743,11882,36932,36776,36952,36183,34348,33627,34364,34191, -10005, 9759,20428,19762,31593,31001,34208,33637,31405,31603,31425,30982, -29319,28912,29335,29540,36759,36224,29555,28903,18348,17914,12742,11886, -36931,36775,36951,36187,34330,18612,34311,34174, 9995,31998,20416,35028, -31572,10327,34155,21196,31388,37616,31372,20401,29302,18332,29284,34844, -36738,18648,29522,13851,18321,37976,12732,29919,36913,36720,36894,21052, -34329,18579,34310,34173, 9994,31916,20415,34950,31571,10269,34154,21084, -31387,37522,31371,20400,29301,18331,29283,34781,36737,18624,29521,13773, -18320,37932,12731,29898,36912,36719,36893,20995,39415,36635,36645,36634, -18150,32346,18876,18918,24312,24295,43680,43679,43678,43677,26441,26422, -24311,28102,24294,28101,28100,26440,28099,26421,29619,31706,35564,30395, -24748,12785,38909,17715,34572,32943,34565,32942,33109,32941,33107,32940, -33462,32939,33464,33255,33791,32938,33839,32937,26996,33854,42329,33231, - 4860,26990, 4869,42075, 4812,31180, 4889,42318,30662,30658,42070,31184, -42110,29066,28535,28538, 4851,41955, 4868,29084, 4811,42109, 4886,26761, -41954,35888,26760,36447,33841,33229, 6909, 6154,33836,33460,36639,34574, -33128,35369,32936,35343,32935,35345,33257, 4929, 4853, 4801, 8174, 8594, -26661,35341,33835,20883, 4403,27646,33832,36456,29081,34567,33172,36633, -33793,33174,35371,33176,20032, 6170,31135, 7934,31122,21877,36400,15196, -38669,38458,32136,32394,36405, 8854,12314, 8759,21876, 7933,32393,31121, -38668,12313,36399,36404,32135, 8758,15195, 8853,38457,31134,20031, 7031, -27226,35360,33777, 6907, 6152,27545, 7976,27376, 7910,25374, 5783,40720, - 5590,40719,27247, 8608,27078, 8710,11395,25577,19533,25579,25372,34570, -33459,36372,38122,40107,18793,26105,38657, 5299, 6951, 5277, 6942, 5207, -35783,36420,35787,36422,35213,30152,35211,30150,35122,30023, 8388, 8378, - 8328,24307, 8365,36415,36414,35216,30155,26359,24273, 8422, 8428, 5279, - 6944, 5209,32415,39946, 7623, 5315,32412,39943, 7620, 5312,18875,32509, -16150, 2984,35426,30960,32517,16139,30869,11425,25477,25461,30880,11462, -30866,11422,39427,30599,35836,36440,36444,10217,34885,14438,42333,10393, -20892,14503,42335,10413,20894,10266,34883,20882, 5976,26660, 7452,40393, -22765,40392,42558,17686,24994,24996,38675,37474,26104,38673,37292,41297, -41296, 5257,41295,42384,35378,31144, 7315,41309,22694,41308,42557,18046, -26133,26138,42926,17689,25000,24998,26707,26706,11659,19707,23731,16164, -22675, 3628,22673, 3626,27999, 3736,16172,22678, 3635,22677, 3634,28001, - 3741,36160,14714,11656,36158,14704,11128,11130,11151,11166,11150,11165, -18238,11137,11136,11156,11171,11139,11158,11173,43676,43675,40426,40422, -23861,43674,43673,25549,11054,28809,30936,11052,11058,24334,28821,28828, -30949,37997,11056,37655,19527,24456,19529,24467,17847,28737,30847,28736, -30846,17852,24463,38607,24789,38434,22436,24452,22433,24449,18761,32104, -30104,18766, 9511,24629,23450,22216,19145,21808, 9502,24823, 9509,24627, - 9506,24624,23447,22213,10827,22210,19142,10825,27623,21805, 9499,24821, -12241,24413,11978,11977,24351,37674,12240,38014,12239,24346,11976,11975, -24408,38009,12238,37669,36177,23963,36172,23958,34838,10321,34735,29788, -34724,29777,29106,29096,34761,10289,12275,18486,39272,17971,34802,10265, -12256,24403,12237,12236,24341,37664,12254,38004,12252,24339,12235,12234, -24401,38002,12250,37662,36165,23951,36167,23953,34650,29703,34652,29705, -25917,25916,25915,25914,25913,25912,12270,24399,12269,12268,24337,37660, -12267,38000,36163,23949,34648,29701,39271,39270,39269,39268,39614, 9840, -39611, 9837,39311,39313,15815,18446,15664,18407,25958,25957,39326,39325, -15938,18403,11852,24415,11851,11850,24353,37676,11849,38016,11848,24410, -11847,11846,24348,37671,11845,38011,36179,23965,36174,23960,23948,36162, -34737,29790,34726,29779,23955,36169,25637,25636,25635,25634,39114,39113, -39112,39111,39110,39109,25665,25663,12587,18541,11879,18498,14047,18440, -25702,25701,39166,39165,14090,18402,39108,17936,11844,24405,11843,11842, -24343,37666,11841,38006,34806,10216,34670,29723,34760,10233,11867,24398, -11866,11865,24336,37659,11864,37999,34647,29700,10477, 2940,32467,16149, -32466,16148,22209,30149,27815,22206,30146,27818,21516,30358,29052,42781, - 5262,29055, 5650,32406,39962, 7642, 5292,32403,39959, 7639, 5289,30355, -31454,31143,27276,27113,15961, 8496,22495, 8542,26122,26114, 9817, 9816, -40359,40358,40357,38632,36068,38628,36066,25364, 5587,25362, 5585,27744, -35164,27741,32167,30182,43039, 8749,28286,30437,28285,30436,28557,30676, -23626,25167,28284,30435,15392,38911,22203,15663,28480,30608,28283,30434, -13472,38888,38891, 9556, 9558,32073,17462,28408,30540,28282,30433,28281, -30432,28546,30667,23599,25139,28280,30431,32743,17461,17460,16952,32742, -32889,17532,32841,17492,32823,28445,30560,26002,23327,17046,17276,23175, -41237,32840,32328,32320,26000,23174,17275,17045,23326,41235,16461,22851, -41251,16456,22848,41249,14757,14744,14494,14440,28961,31061,24084,26022, - 9874, 9881,41268,41241,15171,24103,26041,24102,26040,24101,26039,24100, -26038,24099,26037,41261,24098,26036,24096,26034,24095,26033,24094,26032, -28970,31070,24093,26031,17457,14547, 9868, 9879, 9866, 9877,28967,31067, -24111,26049,15173,41263,24108,26046,39341,22202,15662,28964,31064,24106, -26044,28960,31060,24082,26020, 9865, 9876,32852,17456,17548,32851,17455, -32816,32785,32916,17531,17044, 9586, 9584,32333,32325, 9591, 9589, 9595, - 9593,28279,30430,12843,38913,22201,15661,28482,30610,40679,23173,17043, -25319,23325,17274,40677,23324,17273,25317,23172,17042,32839,32327,32319, -13094,11464,19592,25465,14477,13090,14461,13088,11377,11369,28713,30829, -23737,25323,13425,39016,38994,39015,38993,39014,38992,39013,38991,39012, -38990, 9676, 9671,17454,28706,30823,28704,30821,11381,11373,13427,25313, -22200,15660,11379,11371,11376,11368,28703,30820,28278,30429,36332,17990, -14546,14542,14497,14496,22199,15659,17992,36342,13093,13092,22198,15658, -36055, 2866, 2829, 3638, 3744, 3499, 3633, 3740, 3484,11658, 3631, 3738, - 3477,11670,11655, 5719, 3176, 5341, 4133, 4211, 6542, 5449, 3341, 6652, - 3662, 3115, 5396,14196,14706, 3112, 5394,14194,14701,42953, 8732,11657, -19706, 7754, 3118, 5400, 5399, 3481,11676,19712, 7757,11654,19704, 7752, - 5403, 3483, 3120, 5402,14198,14713,27282,27129,15657, 8469,22197, 8525, -25605,25607, 5438, 3330, 5347, 2330, 4205, 6539, 4204, 6536, 4216, 6535, -18237,30015, 5335,42108, 5656,42107, 5334, 4130, 4202, 6534, 9809, 9807, -12024,12022,26008,26705,31206,13483,12498,43672,43671,41432,41401,28098, -41431,41400,28097,12417,12474,37392,41411,10446,37390,41407,43005,41462, -12490,13482,12473,13478,12472, 4325,13891,13909,41113,11025,11027,11024, -41934,41909,41932,41907,41930,41905,43557,43224,41928,41903,25633,26470, -39107,22052,15418,25818,26704,10264,10263,10262,10261, 9791, 9790, 2808, -12838,12830, 2417, 2470, 2512,26469,25852,26468,26467,26466,26465,12840, -41950,41925,41947,41922,41942,41917,41939,41914,15417,22051, 7469,12848, -12847,12835,26703,26702,26701,26700,26699,25611,31367,29516,42166, 4823, -42009, 4867,26799, 4810, 4873,34306,36887,42106,26907,41953,31562,29277, -34302,26934,42162, 4821,42005, 4866,31559, 4809, 4871,31363,29273,42105, -29513,41952,26759,36883,13383,12952,13474,12951,13042,12950,13020,12949, -14487,15161,13350,13349,20985,20984,27892,27483,13348,20983,25782,13347, -20982,25206,12948,12947,20544, 4262,12946,12945,26464,14072,26566,26463, -14046,26580,26462,18439, 4603,14071,13524,14070,18453,18438,17861, 4657, -26461,17863,13626,18471,14057, 4633,13523,14045,22196,21308,39164,39106, -39324,34716,29769,10260,10259,10258,10257,10256,10255,13793,13786,13790, -13783,10254,10253,10252,10251,42104, 9370,42103, 4943,42102, 8891,42101, - 4942,42100, 5521,42099, 4941,42098, 4940,42097, 5861,42096, 5548,42095, - 4939,42094, 4938,42093, 5224,39607, 6179,39604, 6176,39600, 5011,39597, - 5008,32103,30103,11072,11078,12111,13800,13797,39315,12034,12944,13018, -26606,13076,13075,13600,32387,18401,26557,32345,32365,14060,26556,14059, -26555,34072,34074,35363,33779,32386,32385,32344,32363,14015,13566,18400, -18399,32343,32360,41729,41726,14014,13565,32342,31867,18491,10102,13908, -18497,32463,16138,39646,39105,39267,39266,39104, 8395,38401, 6355,41721, - 2806,14942,14940,15509, 2419, 2472, 2515,15507,38567,30014,30070, 6192, -21609,14364,18236,30013, 5520, 4129,14974,15523,13346,13345,13381,13344, -13040,13343,14489,15163,24034,23979,13415,25700,25956,25911,18771,18770, -14056,10057,10087,17950,18452,18437,18457,10079,14044,17955,25910,25632, -25631,30112,25667,14089,14069,15937,24022,15654,15908,17948,18398,18397, -32341,15653,30111,12274,11878,12266,12265,12264,12263,11863,11862,11861, -11860,11840,11839,11838,11837,11836,11835,11834,11833,11974,11973,12233, -12232,11832,11831,11830,11829,12231,12230,11972,11971,12229,12228,12248, -12246,12260,12258,12227,12226,32071,25909,12471,23983,23975,13362,39031, -39034,23974,23973,24018,13370,24017,25987,23323,17041,17272,23171,41218, -41216,23170,17040,25985,23322,17271,16688,16705,41214,41212,41210,43228, -43561,41208,41207,43742,19608,11484,16702,22946,41206,41222,23193,17068, -25991,23345,17302,41220,32632,32631,32629,32628,24058,43750,43745,25983, -24057,43749,43744,25982,16694,16693,16711,11413,41203,43739,19605,11481, -16698,22943,41202,11444,12020,11198,11196, 2533, 5649,11154,11169,19364, -19373,23443,23442,25123,25132,17605,17604, 9495, 9494,11149,11164,19361, -19370,23441,23439,25120,25129,17603,17601, 9493, 9491,11276,19424,25193, -11263,28096,22842,19411,28093,16450,25186,22839,16447,14152,14598,14154, -14600,40573,43670,43669,40565,11273,19421,25190,11260,28090,22836,19408, -28087,16444,25183,22833,16441,40575,40567,11622,11639,19673,19690,23659, -23654,25584,25596,17786,17781, 9645, 9639,40577,40569,11148,11163,19360, -19369,23657,23652,25119,25128,17784,17779, 9643, 9637,11628,11646,19679, -19697,23437,23436,25589,25601,17599,17598, 9489, 9488,25173,21913,15232, -25175,22538,16001,12943,12942,20543,20542,27895,27486,11632,11651,19683, -19702,23644,23642,25591,25603,17769,17767, 9618, 9616,11621,11638,19672, -19689,23435,23433,25583,25595,17597,17595, 9487, 9485,24843,24802,27885, -27476,24840,24799,27882,27473,11280,11267,19428,19415,24847,24806,11243, -11222,11278,11265,19426,19413,24845,24804,11247,11226,11246,11225,11245, -11224, 9633, 9626, 9631, 9624, 9630, 9623, 9629,22193,22192, 9622,11609, -19664, 6702,11613,19668, 6646,11653,10814,19162, 2877,11724,19735, 6704, -11720,19731, 6648,12357,10807,19156, 2750,35666,14645,35664,14654,14724, -11679,19715, 6691,35668,14649,10928,10937,12356,22619, 3566,27955, 3703, -22617, 3564,27953, 3701, 3642, 3747, 3503, 3652, 3754, 3510, 3650, 3752, - 3508,12361,10908,19215, 2747,10907,19214, 2708,10905,19212, 2706,12355, -22624, 3568,27957, 3705, 3648, 3750, 3506,10913,19219, 2711,36153,14644, - 3409, 2351,16161,22670, 3623,22669, 3622,27996, 3733, 3621, 3732, 3472, -36155,14698, 5721, 3178,11637,11620,19688,19671,25594,25582, 6644, 2752, - 7104, 3068, 5757, 3211,22609, 3556,27948, 3691, 3647, 3749, 3505,11625, -19676, 2678,14720,14712,14697,12350,20053, 6708,10920,10912,19224,19218, -24965,24961, 6625, 2710, 7088, 3038, 5725, 3182,14643,11645,11627,19696, -19678,25600,25588, 6598, 2670, 7057, 3002, 5681, 3137,11643,11624,19694, -19675,25598,25586, 6604, 2677, 7061, 3006, 5685, 3141, 6665,11636,11619, -19687,19670,25593,25581, 6597, 2669, 7056, 3001, 5680, 3136, 7420, 8000, - 6079,22010,27569, 1609,15345,28036, 1696,16260,22730, 1661, 5493, 1546, - 6090, 1536,14782,14264, 5488, 3076,11352,19501, 6767,11351,19500, 6759, - 7423, 8002, 6081,22012,27571, 1593,15349,28040, 1694,16262,22732, 1659, -11360,11358, 4196, 6563, 4559, 2510, 5632, 6430, 6983, 5538, 5417, 3315, - 2532, 5648, 6454, 6991, 5552, 7418, 7998, 6076,22006,27567, 1615,15341, -28034, 1703,16258,22728, 1668, 7429, 8005, 6096,22015,27574, 1945,15354, -28043, 2010,16268,22736, 2045,11018, 7431, 8007, 6100,22017,27576, 1943, -15357,28046, 2008,16271,22738, 2043, 7354, 7956, 6008,21954,27522, 3450, -15280,27974, 3718,16127,22646, 3599,11022, 7356, 7958, 6010,21956,27524, - 3452,15282,27977, 3720,16129,22648, 3601, 3219, 5763, 3215, 5759, 3217, - 5761,12345, 7373,21966,15294,12347, 7375, 7969, 6025,21968,27538, 3512, -15296,28009, 3756,16192,22687, 3654, 6020, 3468, 7964, 3728,27533,27992, - 7367, 3617,21962,22665,15290,16157,11605,11607, 6022, 3470, 7966, 3730, -27535,27994, 7369, 3619,21964,22667,15292,16159, 7212, 7880, 5884,21812, -27338, 1956,15096,27654, 2021,15695,22246, 2056,15652, 7176, 7863, 5878, -21771,27307, 1958,15057,27622, 2023,15651,22191, 2058, 5882, 1979, 7878, - 2086,27336,27652, 7210, 2119,21810,22244,15094,15693,15650, 5877, 1981, - 7862, 2088,27306,27621, 7175, 2121,21770,22190,15056,15649, 5903, 1972, - 7898, 2079,27364,27706, 7254, 2112,21835,22345,15128,15791, 5905, 1970, - 7900, 2077,27366,27708, 7256, 2110,21837,22347,15130,15793, 7277, 7914, - 5937,21844,27383, 1947,15150,27748, 2012,15903,22442, 2047, 7279, 7916, - 5939,21846,27385, 1942,15152,27751, 2007,15905,22444, 2042,11579,15682, -15954,15648, 7174, 7861, 5876,21769,27305, 1951,15055,27620, 2016,15647, -22189, 2051, 7225, 7887, 5893,21818,27346, 1941,15107,27681, 2006,15745, -22304, 2041, 5965, 1995, 7927, 2103,27417,27801, 7292, 2136,21871,22489, -15188,15956, 5967, 1997, 7929, 2105,27419,27805, 7295, 2138,21873,22492, -15190,15959,15725,15646, 5875, 1974, 7860, 2081,27304,27619, 7173, 2114, -21768,22188,15054,15645, 5898, 1969, 7893, 2076,27359,27701, 7249, 2109, -21830,22340,15123,15786, 5963, 1993, 7925, 2101,27415,27799, 7290, 2134, -21869,22487,15186,15953, 5975, 2335, 1930, 5492, 3095, 5371, 1929, 5238, - 4396, 6018, 3466, 7962, 3726,27531,27990, 7365, 3615,21960,22663,15288, -16155,15644, 5874, 1989, 7859, 2097,27303,27618, 7172, 2130,21767,22187, -15053,15643, 5896, 1991, 7891, 2099,27357,27699, 7247, 2132,21828,22338, -15121,15784, 5901, 1987, 7896, 2095,27362,27704, 7252, 2128,21833,22343, -15126,15789,40964,40969,11764,11763,12001,12000,19881,19880,27891,27482, -25817,25816,22535,21910,15998,15229,11762,11761,19755,19754,27894,27485, -25630,25629,22537,21912,16000,15231,40905,40903, 9789, 9788,40901,40899, -40897,40896,40966,40971,40909,40907,40895,40894, 6556, 2584,10923,19227, - 7632, 5986, 2350, 6894, 5573, 5343, 2349, 6532, 2574, 6531, 2573,11135, - 5333, 2323, 6530, 2572, 6538, 2576, 6558, 2586, 6548, 2579, 6523, 2567, - 6552, 2581,42955,43330,42965,43372,42963,43370,43386,42977,43388,42979, -43328,42952,27399,27780,18424,10069,27918,27458,27867,27441,27850,27237, -18451,10078,26723,26534,25881,26460,25851,25613,25872,25850,25533,33674, -28935,33476,28743,34646,29699,15642,22186,10387,20541,25975,33672,28932, -25970,25973,25724, 6489, 6488,22185,16713,32639,32637,35179,30117,23822, -35131,30072,15714,22269,15641,22184,15819,22373,15848,22391,12098,15640, -22183,22249,16565,32569,32571, 9719,33478,28745,23832,25719,25969,25718, -34680,29733,14043,18436,14466,14392,25879,25878,39323,17980,39257,17970, -39317,17978,26434,29669,40064,43549,26428,39091,17935,39163,17943,39090, -17934,39625,18600,34033,34028,34031,32368,15883,33670,28930,41658,41677, -41679,39052,40789,10443,20697,10475,20687, 6684, 6686,10479,20540, 6681, - 6680,18396,10056,14100,18395,32340,15639,21550,16438,32542,32541,22717, -16437,32540,32539,15638,22182,35542,14642, 7787, 7786,10643,19009,10642, -24512,19008,24672,12068,19901,24016, 6774, 6773,15637,22181,34007,34006, -41647,41646,27847,27438,26554, 9787, 9786, 9785, 9784,43226,43559,43555, -43222,25849,25610,26004,26007,15109,14390,26698,25609,10775,34837,15977, -15208,22514,21889,27846,27437,15976,15207,27398,27397,21864,21863,22513, -21888,27779,27778,15181,15180,27845,27436,22476,22475,15944,15943,24033, -24032,23978,23977,27844,27435,22564,22563,16041,16040,27843,27434,21895, -21894,15214,15213,27842,27433,22520,22519,15983,15982,15206,21887,15205, -27865,21886,27456,27841,27432,21015,21014,13387,13386,27840,27431,20628, -20627,13030,13029,15204,21885,25773,12104,12103,11744,11743,12094,12096, -10779,34810, 9700,23972,23971,27861,27452,20981,20980,13342,13341,11739, -11738, 7942, 7940,10724,10721,23970,23969,23982,24015,23968,23967,24014, -23981,24013,24025,24027,24012,12070,27864,27455,22512,22511,15975,15974, -27863,27454,20636,20634,13035,13032,24511,24671,19132,19131,10760,10759, -10732,10735,24516,24676,19106,19108,10731,10734,24510,24670,19113,19112, -10741,10740,24509,24669,19062,19061,10684,10683,10781,34759,15212,21893, -25753, 7947,10429,10571,18816,18957,24508,24668,10426,10568,24505,18813, -18954,24665,27870,27461,21901,21898,15220,15217,27873,27464,22526,22523, -15989,15986,10439,10588,18828,18964,24526,24686,10437,10586,24524,18826, -18962,24684,11737,11736,11945,11944,10596,10595,11735,11734, 9849, 9848, -12067,12066,14142,14587, 9783, 9782,12065,12063,19900,19898,25848,25846, -24011,24009,17969,17967, 9847, 9845,27876,27467,20539,20538,12941,12940, -15223,21904,25776,12061,12060,14139,14584,12117,12115,19916,19914,25887, -25885,24044,24042,17976,17974, 9858, 9856,11432,19557,25411,28147,22914, -16602,41080,11934,19847,25742,28084,22830,16436,12222,12284,16672,12217, -12215,41025,43668,11931,19844,25739,28081,22827,16433,11412,41027,11312, -19473,25900,25247,19933,12130,41029,11109,19341,25898,25106,19931,12128, -12154,19940,25920,28156,22923,16635,12183,19958,25945,25943,19956,12181, -12158,19944,25924,25951,19964,12197,11798,19788,25675,25673,19786,11796, -11776,19772,25641,25639,19770,11774,24992,20537,12939,12938,20536,25208, -12059,11760,19753,25628,25627,19752,11759,11818,19804,25696,25688,19797, -11808,11820,19806,25698,25690,19799,11810,40597,40758,40595,40594,11733, -11449,11453,19574,25452,28145,22912,16597,12058,11816,19802,25694,25686, -19795,11806,40639,41075,40637,11758,16629,11108,12193,11999,19879,25908, -25815,19937,12138,12206,12205,12038,11757,19751,25785,25626,19870,11960, -12937,20535,25784,25002,20534,12936,12057,43728,43725,32603,11411,19550, -25402,28149,22917,16605,23999,25793,23996,25790,11938,19851,24003,11913, -11936,19849,24001,11917,11916,11915,12045,12042,13120,15165,12156,19942, -25922,25823,19886,12009,12122,19926,25891,25643,19774,11778,12125,19928, -25893,25625,19750,11756,11815,32602,30882,43667,40537,12120,19924,25889, -25693,19801,11814,11107,12033,12192,19962,25949,28154,22921,16628,12191, -19961,25948,12190,19960,25947,25839,19892,12032,12296,19991,26015,12292, -27396,21862,19981,27777,15179,26011,22474,15942,15399,12056,12846,12547, -17076,15466,12055,15522,39256,39255,39254,39253,39252,39251,39263,39265, -39250,39249,39248,39247,41047,41046,41059,41061,41051,41045,41043,41042, -41041,41040,41039,41038,41037,41036,41035,25752,22562,16039,25751,22518, -15981,25750,21013,13385,25749,20626,13028,13044,20642,25772,11943,12102, -11742,12092,41054,41053,41056,12137,41034,14685,12136,11996,25761,20979, -13340,11732,12162,25907,17091,15471,15526,39246,19972,12273,12354,17039, -15458,15506,25771,22510,15973,24007,19896,12053,12090,24029,19903,12089, -24006,19895,12052,24005,19894,12051,15407,12851,41065,41064,41063,41070, -41068,41049,12119,41032,25779,22529,15992,11924,12041,41078,41073,11731, -11311,19472,25246,28144,22911,16596,12050,25764,20533,12935,12049,12100, -19908,25863,12189,12110,11106,19340,25105,28153,22920,16627,12109,19912, -25883,12262,11859,17316,14861,11730,14973,14817,11729,12834,12408,39101, -39103,39089,39088,39087,39086,39093,39095,39085,39084,39125,39121,39124, -39120,40887,40886,40885,40884,40883,40882,40927,40893,40881,40880,40879, -11755,40878,14710,14683,11754,11753,25624,25623,14807,12832,39083,20489, -12859,39082,20052,12349,39081,21547,14236,39080,39079,43776,43805,39078, -40447,43732,17270,14840,14939,17396,14901,15027,12225,12244,40915,40914, -40913, 9781, 9780,11077,40876,40925,40891,40889,40936,40934,39151,39147, -39150,39146,11813,11812,40932,40930,40938,14394,11970,12224,40944,40943, -40942,11828,11827,40940,11826,40911,40947,39308,39307,39140,39139,11752, -19749,25622,25621,19748,11751,14389,39077,39076, 9722, 9721,12135,19936, -25814,25906,19878,11995,12934,13377,12967,13339,39117,39116,39149,39145, -39154,39153, 9830, 9829,13375,12933,13338,12970,40737,40739,40734,17453, -16185,16111,14676,12161,12134,12133,19935,25905,25813,19877,11994,12179, -11794,11750,11749,16595,11439,11438,19567,25441,15755,17269,15754,15753, -25531,25446,25408,19555,11420,25620,26459,25475,25474,25473,19599,11474, -25445,25444,19570,11442,25406,19553,11418,25399,19547,11408,16959,17482, -13265,13337,15636,39056,22178,15634,28773,30900,39099,39097,39119,39123, -39075,39074, 9703, 9705,17452,28766,30894,28763,30892,28762,30891,12175, -19951,25937,25837,19890,12018,40756,16626,11529,39135,39137,14641,11793, -19784,25671,11748,19747,25619,12932,20532,25424,12048,11528,11522,11747, -19746,25618,11780,19776,25645,12178,19954,25941,11436,19565,25426,11993, -11992,19876,19875,27860,27451,25812,25811,22516,21891,15979,15210,25844, -30888,11476,30863,11415,25810,12017,12016,19889,19888,27839,27430,25836, -25835,22509,21884,15972,15203,25834,25940,19953,25939,19544,25396,25395, -25617,19745,25616,19562,25420,25418,25647,19778,25649,19560,25416,25414, -25670,19783,25669,19543,25394,25393,34715,29768, 1823, 1805,12576,24366, - 1065, 1012,24432,38030,12599,37738,35076,34899,38032,37740,24173,22266, -24434,21419,27315,26681,20922,13278,20920,13276,29112,20926,13281, 1859, - 1842, 1150, 1140, 9932,39742, 9931,39741,24819,39740,34742,29795,13907, -18540, 1482, 1476,12573,24363,12596,37734, 1062, 1009,24428,38026,12611, -42344,12595,37733,35078,34901,38034,37742,24175,22274,24436,21423, 9930, -39739, 9929,39738, 9926,39729, 9925,39728,24831,39727,29130,37421,29129, -37420,29099,29109, 1469,36495,37425,37424,37423,12586,18539,12624,42360, -20171,42676, 1479, 1473,12626,20173,42362, 1481,42678, 1475, 8054, 9922, -39720,29125,37415,38037, 1149, 1139, 1152, 1142,12620,20167,42355, 1145, -42671, 1135,35453,39526,38500,38702,24594,22314,41882,29647,27291,27290, -27617,27314,27289,12795,30387,38366,30408,38358,38363,38365, 2930,38357, - 2387,37255,29642,37254,29641,37253,29640,19022,43201,30416,38370,27663, -37246,36144,37245,38299,40063,31679,40062,31678,31738,31737,31705,35446, -31723,24604,15633,41888,29654, 8044,31735,38376, 2386,35443,31719,35442, -31718,32516,16284,32479,16283,35456,39528,38504,38704,24596,22316,41884, -29649,24601,29658,41890,15385,37241,37244, 1421,40058,31676,40057,31675, -38385,12811,24756,12793,29602,30390,38389,38388,29600,29596,29618,31704, -34636, 1433,29689, 1438,43219,43551,24599,29653,41887,15383,24598,29652, -41886,15382, 1285, 1418, 8050,38379,12806,24754,12791,24750,12787,38378, -38384,12810,38375,38387, 1306, 1294, 1303, 1291,29617,31703,29612,31698, -34634, 1429,29687, 1436,43217,43548,34630, 1300,29683, 1288,43212,43540, -30964, 3798, 3778, 3800, 3780,35425,30959,32462,16137,32461,16136,36652, -34579,34586,36650,34577,34584,34085,29464,31470,29585,31656,31506,29370, -29462,31468,29583,31654,31504,29368,36644,21875, 7932,32392, 5254,31444, -20450,38667,12312,36398,36403,31443,31624,36800, 8757,12755, 8518,15194, - 8852,38456, 8493,31120,31133,36972,36799,36971,12754,32134,20030,31623, - 6169,20449, 7030, 8702, 8337,38763, 9313,41293, 8934,36480, 8701,43062, - 8761,18031, 8593, 8173,38803,36371,36370,36369,18030,18029,18028,27225, -41287,29017,38339, 8204,38308, 8169,34386,32391,34385,34228,31132, 7931, -33774, 8517,31642, 8756,34227, 5253,36397,31641,38666,35366,35201,38455, -33771,29576,36805, 6168,29575, 8492,36402, 8851,29015, 7029,36978,36804, -36977,30301, 8061,41292, 7297,38121,38120,36368,18792,38119,36491,38118, -38117,38116,31119,31118,41283,18027,41285,18033,27911,27641,42858,42857, -26103,35204, 5619,36383, 5616,36380,24771, 7553,40207, 6407,31301,24617, -34240,40205,34238,34098,31299,39906,36663, 7199,39905, 6221,43351, 7551, -34096, 6406,29208,43349,36818,36661,36816,42721,29206,27330,42720, 7197, -27172, 6220,24769, 7550,40204, 6404,31297,24616,34236,40203,34234,34094, -31295,39903,36659, 7196,39901, 6218,43348, 7549,34092, 6402,29204,43347, -36814,36657,36812,42718,29202,27329,42716, 7195,27170, 6216,34504,30404, -34501,30401,18155,41645, 6885, 6148,41642, 7307,41673,41778,22311,41672, -22818,41641,22547,41640,22332,41639,26348,26380,22545,41668,18159,41675, -38227, 2955,34005, 2993, 2916,38213,34004, 3252, 2894,38183,34025, 3229, - 2887,38169,34020, 3222, 2627, 2643,38824, 9409,41720, 9218,36476, 2626, -41719, 2595, 2647, 2634,23169,18235,22102,18234,18217,21766,22081,18233, -37188,18232,18231,18230,18216,21765,21923,18229,18215,36632,14274,35340, -34569,20455, 2653,31640,31453,36976,12760,36803, 2617, 8060, 8540, 8244, -38393, 6849,41718, 6440, 2625,36148, 8149,38297,41717, 3792,18228,18227, - 6920, 6161,18226,18225,18224,18223,21921,18222,18221,41757,26415,41756, -26414,20448, 2591,31622,31442,36970,12753,36798, 2464,18210,26408,26407, -41754,34549,35325,41666, 7314,41665,41776,22693,41664, 6432,42556,18178, -26697,26356,26393,34087,38762, 9312,41711, 8933,36479, 2483,41710, 2455, -38802,37153,37152,37151,18209,18208,21763,18207,29565,21760,37224, 2557, -18220,37221, 2554,36643,20333,36602,39439,31285,36604,39484,24264,40237, -40132,40235,40130,39442,31290,36609,41735,39478,24258,40093,40186,40088, -40181,18143,34398,34435,37029,20279,36994,18145,34400,34437,37031,20281, -36996,39483,24263,39482,24262,39486,24266,40091,40184,40086,40179,40083, -40176,40081,40174,40241,40136,40239,40134,34758,10627,34757,10559,39303, -39305,34812,10557,37291,38086,37290,38094,37289,38080,38614,37288,38662, -37287,38664,37301,38656,37473,38655,30133,20531,10622,20530,10525,18394, -10055,18422,10067,18393,10054,26458,26696,10410,13522,15751,22319,25877, -34645,29698,34644,29697,34660,29713,38660,37435,37440,34753,29806,34751, -29804,34672,29725,34643,29696,34642,29695,34656,29709,34662,29715,34730, -29783,34732,29785,34677,29730,34641,29694,34640,29693,34667,29720,34666, -29719,37327,38096,20808,13191,18392,18391,10053,20807,20851,13231,18390, -18389,10052,20850,20857,13235,18421,18419,10066,20855,18410,10062,18477, -10096,20791,13179,18409,18412,10061,20790,14025,18388,13571,18387,20836, -13215,18414,18417,10064,20835,13521,18416,34836,10553,34691,29744,13625, -18470,13520,18480,39295,39298,12931,20529,20572,10615,12981,20574,12930, -20528,12929,20527,12928,20526,32453,16108,27288,18450,10077, 5631,37822, - 5630,42452,42565,18490,10101,13290,20941,13178,20789,13214,20834,34706, -29759,34699,29752,13177,18474,20788,20787,18476,10095,13213,18479,20833, -20832,18482,10098,13176,18538,13175,18496,32478,16282,32460,16135,13212, -20831,13174,20786,13220,20838,13190,20806,13230,20849,32339,15631,32362, -15847,32337,15629,39186,39188,15802,22360,25843,39259,39261,15628,22173, -25858,39245,39244,12083,12081,10274,39719,40156,40256,40155,40255,24386, -15813,24636,13407,30271,30269, 6595, 6594,34679,29732,14042,18435, 6251, - 6249,13292,20943,34704,29757,34702,29755,34701,29754,13119,13118,18533, -32482,16287,10342,39718,40154,40254,40153,40253,24396,13488,24439,13440, -30194,30193,34714,29767,38659,37400,37405, 8700,30362,30361,30170,30169, -37413,34739,29792,39737,10247,30192,30191,34741,29794,13117,37729,13629, -42340,24441,13487,24438,13490,39736,10215,39748,10210,39731,10209,39726, -10220,39735,10208,39725,10245,39733,10222,39717,10213,20954,10594,10379, -39764,10378,39763,39762,10528,40246,40143,40245,40142,40220,40105,40219, -40104,18564,10135,20952,13301,18563,18571,10134,20960,10373,39756,18559, -10130,20948,13297,18558,18567,10129,20956,10205,34916,34923,37772,13502, -37765,10203,34914,34921,37770,13500,37763,39761,10377,40172,40079,40170, -40077,40152,40252,40151,40251,39766,10523,40161,40261,40160,40260,40233, -40128,40231,40126,34851, 9960,34232,34090,10334, 1864,21204, 1757,32005, - 1601,35035, 1797,31293,31509,31895,20354,29864,18274,29200,29467,37983, - 1814,29926, 1571,18655, 1742,13858, 1881,36810,36655,37623,12692,34934, -34778,34003, 7306,34002,29395,34001,34498,34011,34508,34000,34497,40229, -34492,41761,34931,34775,41968,34018,34514,40243,34516,42397, 1037,41633, - 1031,41632, 1048,42392, 1022,41635, 1050,42394, 1024,41760,41631, 1046, -42390, 1020,41629, 2954,41628, 2992,41627, 2915,41626, 3251,41650, 2892, -41652, 3227,41656, 2886,41654, 3221,34263, 9979,34254,34121, 9970, 936, -20366, 931,31521, 926,34112, 921,31315,31530,31324,20375,29222,18286, -29231,29479,36686, 916,29488, 911,18294, 906,12712, 901,36842,36677, -36833,12703,34381,31639,34224, 2650,34226, 2616,31621, 2599, 2652,36975, -34384,36802,29572,36797,29574,36969, 2482, 6384,37645,37150,37149,39645, -37635,37644,37632,37148,37147,37146,37145,37144,27910, 2624, 8314, 6262, -41716,37187,38260,37297,37347,42609,32086,38078,37639,34016, 7313,34015, -29397,34014,34512,37090, 2481, 2480, 2630, 2637, 2505, 6421,37518,37128, -37399,37127,37495,37126,37469,37124,37468,37513,37142,37123,37511,37462, -37299,37756,37434,37122,37141,37121,37140,39431,36631,37412,37404,37498, -37494,37472,10043,37461,37460,37467,10039,37458,37457,37647,37138,37137, -37120,37510,37517,37520,37174,37505,37439,29444,37119,37136,37135,37172, -37170,37118,37117, 2641, 2632,39414,26406,26405,27640,42564, 2623,37566, -37286,31638,12764,12757,41733, 2622, 2621,37527,37402,37492,10045,37455, -37454,37465,37185,37508,37437,37184,37183,26413,27645,42561,20297, 2612, -20295, 2610,35114, 2608,35112, 2606,12763,37557,39421,18930,22264,27005, -21417,13951,24817,38564,38257,38562,37452,38560,30007,38068,32735,32711, -38761,32710, 9311,38760, 9310,38072,32709,38071,32901,38070,32764,17268, -23321,24825, 9217,24780, 9216,17267,38060,16897,38059,17340,38058,17530, -38066,27635,27312, 7608,38801,32708,27786,32093,30095,22171,15627,38645, -30126,38644,38643, 5247, 5530,32815,38800,32814, 9381,38799, 9380,38075, -32813,27684,30333,18707,35295,27162,27153,35405,22170,39882,38555,24446, -22351,39919,38609,24465,35332,27193,35291,27160,27150,35403,42950, 8731, -42949, 8730,42948, 8729,42947, 8728,35377,32076,40005, 8482,40002, 8479, -35541,14640,35540,14639,14313,27249,27251,17038,23168,24827, 9024,24782, - 9023,17037,38063,27021,16563,38690,23265,21508,37451,38084,32336,32515, -15626,32520,15625,32511,15677,32508,15624,32529,16280,38571, 5200,32335, -15623,35539,14638,14662,14637,35552,14666, 8626, 8629,14668,14708,18932, -22271,27007,21421,13942,24829,30360,42780,35108,30005, 5647,35143,30085, - 5665,22165,18820, 5605, 5604,35347,32111,32506,15929, 6955, 5331,40061, -43546,42762,18769, 6937, 5272, 6936, 5271, 6935, 5270, 6933, 5268, 5629, -22268, 6939, 5274,22180,22164, 6946, 5281,25809,32240,18748, 8323, 8156, - 8316, 8158, 8320, 8153, 5580,35374,32097,35335,32096,35334,32095,32513, -15882,32367,15881,38759, 9309,43061, 8932,36478, 8059,38798,38115,38114, -38113,18791,18790,18789,30347,37642,37515,37450,38130,37755,38112,38111, -27909,27639,37569,38128, 3646,22685,16184, 6338, 1522,12640,12645,15371, - 6342, 1510,12642,12647,15373, 6782, 6781,14798,21699, 6344,14796,21697, - 6341, 7801, 1555, 7440,12375, 7443, 8012, 6107,22026,27582, 1592,15367, -28052, 1693,16277,22744, 1658, 1489, 7435,12373, 7437, 8010, 6105,22021, -27580, 1940,15362,28050, 2005,16275,22742, 2040, 7442,22025,15366, 7439, -22023,15364, 7426, 1562,12340,12333,12338,12331, 5804, 3214,12342,12335, - 6027, 3514, 7971, 3758,27540,28011, 7377, 3656,21970,22689,15298,16194, -15505,12533,15504,14938,16379,14982,16012,12532, 6752, 1497, 6749, 1494, -41395,41428,41393,41426,41397,41430, 7673, 2785,12396, 3807, 8862,12509, -12436,12393, 5370, 3094,12439,12401, 5365, 3088,14737,14216, 5440, 3335, - 3128, 5405,14200,14716, 3087, 5364,14181,14664, 7871,12398, 4411, 4409, -12435,20087, 6593, 3074, 5351,14171,14636,12448,20094, 6591,12546,15118, -21825, 7236,12545,20135, 6451,12407,12544,12406,12388,12506, 3804, 8859, -12522,12505, 7664, 2776, 7671, 2783, 7717, 2884,41403,41434, 6017, 3465, - 7961, 3725,27530,27989, 7364, 3614,21959,22662,15287,16154,15051,21757, - 7169,12568,20156, 6382,14937,21735, 6848,41461,41460,12427,20084, 2755, -31205,31204,16392,12489,12488,12426, 4417,13481, 2225, 7635, 2415,15621, - 7167, 7858, 5873,21755,27302, 2239,15049,27613, 2245,15620,22163, 2261, - 7304, 7938, 5973,21879,27421, 2241,15198,27830, 2247,15967,22504, 2264, - 7251, 7895, 5900,21832,27361, 2237,15125,27703, 2243,15788,22342, 2257, -16032,12416,20081, 7526,31201,12415,12414,15686,15952, 2667,15619, 7166, - 7857, 5872,21754,27301, 1949,15048,27612, 2014,15618,22162, 2049,12423, - 7223, 7885, 5891,21816,27344, 1939,15105,27679, 2004,15743,22302, 2039, -12404, 7351, 7953, 6005,21951,27517, 3446,15276,27968, 3715,16106,22638, - 3587, 2256,21296,12567,13748,20155, 2235, 2255,21295,12566,13747,20154, - 2234,12560,20148, 6450,41459,15243, 3788,41450,15617,41420,41458,12425, -20083, 2209,31821,12497,12496,15117,21824, 7235,12562,20150, 6449, 2227, - 2223,12487,20114, 4245,12485,20112, 4243,12875,20501, 4242,14245,41418, -41456,12559,20147, 2220, 6016, 3464, 7960, 3724,27529,27988, 7363, 3613, -21958,22661,15286,16153,12500,12432, 7405, 7990, 6044,21993,27559, 1591, -15324,28021, 1692,16231,22715, 1657,15316,41467, 2217,12430, 7400, 7988, - 6042,21988,27557, 1938,15318,28019, 2003,16229,22713, 2038, 7404,21992, -15323, 7402,21990,15321, 1457,21287,12552,13738,20140, 1453,41444,15320, -41469, 1463,15615,15612,16030,12413,20080, 1444,12412,20079, 1443,31824, -31818,12565,20153, 2233,12484,32070,12483,12482,13480,13746,21294, 2254, -12481,20111, 4241,12480,20110, 4240,12492,20116, 6512,12479,20109, 6380, - 2268,22161,15610,15609,22160, 2259,15966,22503, 2263,12420,12419,15685, -22239, 2251,12495,12558,20146, 2219,12554,20142, 1460,15103, 2216,41454, -12422,41409,41438,15245, 3790,41453,11020,40855,30973,11578,11577,11591, -11575,11589, 4564,11583,11582, 2666,11586,11585,12828,12826, 5829, 3832, -12874,12870,20498, 3812,12869,20497, 3811, 3831, 5828, 3830, 5827, 3834, - 5831,12877,12879,12873, 7468,22050,15416, 2531, 5823, 3818, 3836, 3843, -12884,20506, 3875, 3905, 5843, 3898, 5839, 3900, 5841,12888, 7474,22057, -15423,12890, 7476, 8024, 6122,22059,27597, 3926,15425,28070, 3966,16337, -22799, 3955, 6117, 1968, 8021, 2075,27594,28066, 7460, 2108,22041,22773, -15405,16310, 7454, 8017, 6112,22034,27590, 1937,15390,28062, 2002,16302, -22767, 2037, 6115, 1983, 8019, 2091,27592,28064, 7456, 2124,22037,22769, -15401,16306, 7450, 8015, 6110,22032,27588, 1954,15388,28060, 2019,16293, -22756, 2054, 6109, 1977, 8014, 2084,27587,28059, 7449, 2117,22031,22755, -15387,16292,12895, 7488, 8031, 6129,22071,27604, 1590,15438,28077, 1691, -16344,22806, 1656, 3810, 3826, 3829,12893, 7483, 8029, 6127,22066,27602, - 1936,15433,28075, 2001,16342,22804, 2036, 7487,22070,15437, 7485,22068, -15435, 5838, 3897, 3886, 3910, 3915, 3877, 3891, 3902, 3874, 3889, 3896, - 3873, 3888, 3895, 3879, 3893, 3904, 6124, 3932, 8026, 3972,27599,28072, - 7479, 3961,22062,22801,15428,16339, 3884, 3908, 3913, 3809, 3825, 3828, -12865,43305,43632,43303,43630,43300,43627,43299,43626,14287,43298,43625, -43296,43623,14936,21734, 6847,22080,14935,22079,19102,22101,19101,14934, -43294,14933,43621,14932,14931,15462,15475,15457,15456,14956,14950, 6852, - 6846, 6845,15485,14333,14993,14992,14981,15007,15006,15005,15022,15014, -15010,15009,15004,15025,14351,15024,15483,15020,14349,15012, 5524, 1639, -14997,14337,14991,14332,14980,14979,14978,14995,14335,14984, 5519, 1906, -14339,15000,14999,43316,43637,15003,15479,14306,43314,43635,15041,14354, -15040,15493,15044,14356,15043,15495, 6866,14914,21725, 6369,14916,21727, - 6371,12858,20488, 6820,12872,20500, 3817, 3953,22796,16334,12883,20505, - 3872, 3952,22795,16333, 3951,22794,16332, 3865,22785,16323,19032,19100, -38551,19030,19099,38548,30001,29999, 6915, 4625, 4602,35104,29997,15608, -22159,15607,22158,15821,22375, 3127, 3334,35145,30087, 3314, 3325,15606, -27585, 4632,15846,22390,40060,43545, 2385, 2530, 2543,40009,43415, 2964, -38234,30168,30190,40054,43537,30277,23167,19097,40033,43462,38797,32707, - 2929,30189,40458,23320,17266,25101,23166,17036,40446,23349,17310,25097, -23198,17075,38926,38925,38924,38923,39028,39026,38922,38921,38920,38919, -39041,39043,40452,40462,40454,40445,40444,40442,40449,32588,32587,32586, -40456,23339,17294,25099,23187,17062,32922,32788,16896,17339,32594,40441, -16617,25096,16879,23055,40439,16911,23063,40438,40437,23400,17527,16871, -23049,40436,40435,22906,16587,40434,22905,16586,16585,22904,40433,40432, -22903,16584,16868,23046,40465,16590,22909,40464,16609,16607,16594,43731, -43730,40431,40430,39039,39038,39037,39036,16616,38937,38936,39243,39241, -38935,38934,39292,39288,17173,16615,16752,16614,16613,16612,16744,16611, -16789,39239,39238,16852,17211,32900,32763,16623,16621,11076,11075,39237, -39236,39278,39277,39276,39275,11952,19862,25769,25748,19855,11942,32899, -32762,17499,17451,17325,25842,21445,14034,17484,16791,25870,23275,17187, -25841,23273,17185,25876,23263,17165,11948,19858,25763,13414,13413,39216, -39215,39197,39196,39291,39287,12478,12477,13373,13336,13335,13368,12031, -12030,39235,39234,12108,12107,39284,39283,11941,11940,19854,19853,27900, -27491,25747,25746,22542,21917,16005,15236,39233,39232,39203,39201,27879, -27470,27855,27446,27838,27429,25904,25903,25745,25955,25902,18666,42563, -25759,25755,25998,27775,25808,27637,27015,27615,41158,41157,27836,27427, -27049,27611,39207,39211,11951,11950,19861,19860,27835,27426,25768,25767, -22508,21883,15971,15202,25766,11956,11954,19866,19864,27875,27466,25778, -25775,22528,21903,15991,15222,39221,39219,39224,39223,39290,39286,39231, -39230,39281,39280,14930,14929,14847,14954,14316,21588, 3816,14319,21591, - 3882,14318,21590, 2882,14948,14946,14294,21570, 893,14296,21572, 964, - 8262, 8413, 8261, 8412, 8253, 8404, 3081, 5860, 3167, 5859, 3175, 8260, - 8411, 1395, 1411, 1414,21584,14311,14347,21606, 1403,14305,21581, 1409, -14342,21602, 3815, 8259, 8410, 8258, 8409, 8252, 8403, 1406, 1393, 1111, - 1117,14703,14648,14660, 8187, 8350, 3080, 2322, 5710, 3166, 5718, 3174, -11162,11147,19368,19359,25127,25118, 6642, 2749, 7102, 3062, 5755, 3209, -11161,11146,19367,19358,25126,25117, 6623, 2705, 7086, 3036, 5723, 3180, -14635,11168,11153,19372,19363,25131,25122, 6590, 2665, 7054, 2999, 5678, - 3134,11160,11145,19366,19357,25125,25116, 6600, 2674, 7059, 3004, 5683, - 3139,14894,16401,15605,15603,14362,15842,14927,16368,43326,42946,43324, -42944,43321,42941,42939,43319,43255,43588,43263,43596,43262,43595,14473, -21643, 6260,30231,32200,38696,30229,38545,30262,30167,38588,30018,30166, -30012, 3276, 3434,43569,43236,43566,43233,16329,22791, 6234,16050,22573, - 6247, 7829, 7736, 7585, 7869, 7600, 6756, 7794, 7740, 6576,14475, 6583, - 7597, 4175,14479, 4170,15601,22157, 6792,15140,15600,22156, 7261,14360, - 2881, 2805, 5527, 2986, 2945, 2937, 2928, 2927, 2384, 2977,38654,30261, - 8287, 8126, 8281, 8116, 830, 8286, 8125, 8285, 8124, 824, 827, 8303, - 8131, 8302, 8123, 8307, 8101, 8300, 8301, 8120, 8121, 8299, 8119, 8297, - 8118, 8295, 8104, 8292, 8129, 8306, 8103, 8308, 8106,30038,30035,38259, -30315, 8425, 8427,32057,14884,13417,15599,22155, 6511,15656,22195, 7821, - 6331, 6427,15712, 6424, 7414,15705,22257, 6844, 5887, 5799,16243,14926, -21733, 6841,15598,15965, 6473,22154,15597,15868,15596,15840,22386, 6843, -14445, 5911, 5635,14453,14444,14448,15830,15844,22388, 6840, 5913, 5628, -15833,15827,15826,14839, 7575,15595, 2872, 2741,14925,21732, 6839,15594, -22153, 2833,15593,22152, 2835,15592,22151, 2438,15591,22150, 2432, 2664, -15875,22409, 2445, 2717,15589,22148, 7839,16355,16374,15782,22336, 7823, -16357,22809, 7240,16207,22702, 7765,14756,14227,14755,14226,14754,14225, -16218,16217,43513,43174,43510,43171,16224, 6719,21546,14235,16216,22706, - 6725,14763,14230,16220,15588,22147, 7390,15933,22467, 7388,43505,43166, -43502,43163,16209,22704, 7767,15811,22366, 7394,16146,22656, 7387,16145, - 3605,22655,16144,15587,22146, 7231,15855,16035,15854,16034, 2839,15860, -22399, 2838,15859,22398, 7229,15586,22145, 7501,30128,38653,30132,38652, -38681,38651,30131,13334,16069,22590,16078, 6270,22599, 6269,16181,12927, -27932, 6914, 6960, 5414, 8057, 5957, 6506, 6505,18941,18940,10538,10537, -16179,13333,16170,13332,16388,15017, 7588, 6306, 5236, 5811, 5851, 5869, - 6740, 7127, 5798, 6468, 6996, 5564,14405,14018,14404,14017,15770, 6466, - 6994, 5562,14450,14447,15769,15768,15767,16373,22815, 7228,14407,14020, -15772,16122,22643, 7227,14409,14022,14443, 5547, 5223,32069,27917,16038, -22561,16037, 6291,22560, 6288,27915,15874,22408, 4435,15801,22359, 4459, - 6574,22144,15585, 6562,22358,15800, 6582,22406,15872,16011, 5655, 4128, -15584,22143, 4437, 5660, 4093,14634,14633,14632,14631,43483,18998,16048, -22571, 6258,43478,43131,43475,43128, 6707,21367,13906,16183,22684, 4239, -14678, 6689,21336,13835,14680,16124,13331, 5770, 5919,14672,14671, 5768, - 5868, 5766, 5907, 6561, 4189,15911,22448, 6838, 5943, 5627, 6442, 6987, - 5542,15703, 5594, 5416, 5598, 6075, 7011, 7997,28033,27566, 6496, 7417, -22727,22005,16257,15340,15583, 5600, 5867, 7013, 7854,27610,27300, 6498, - 7163,22142,21753,15582,15047, 5945, 5645, 6724, 7116, 5787, 5602, 5947, - 7015, 7918,27754,27388, 6502, 7285,22459,21851,15927,15157, 5597, 5962, - 7010, 7924,27798,27414, 6495, 7289,22486,21868,15951,15185,15455,16352, -15503,16351,16350,15513,22106, 7835,14844,21717, 7820,14886,21720, 7819, -15410,22044, 7818,14825,21708, 7817,14824,21707, 7816,16199,22692, 7815, -14883,14823,43587,43254,43586,43253, 7825, 2663,16362,22811, 1398,16367, -16366,43289,43616,43594,43261, 2414,16372,22814, 1155,16371,22813, 2421, -16359,43280,43613,43252,43585,14838,16365,16364,43278,43611,43275,43608, -43273,43606,43291,43618,15447,38524, 8682,15449,38526, 8684,43271,43604, -43270,43603,43598,43265,43259,43592,16370,43269,43602,43017,43408,15858, - 3596,22642,16121,15857,22397, 2837,14234,21545, 6718, 5782,14743,21688, - 6318,16198,16215,16304,16214,16197,16213,16206,22701, 7764,16205,22700, - 7763, 6717,21544,14233,16291,16212, 5810,43103,43458,40124,14170,40123, -14169,30188,30187,38695,30186,38694,30185,32066,32060,14630,14629,14628, - 3343, 7680,39970,32449, 5425, 7677,39967,32446, 5422, 8440, 8451, 3712, - 3440, 3696, 3415, 3589, 3585, 3711, 3439,14244,43101,43456, 6671,21079, -13519,15581,16237,43099,43454,43111,18997, 3710, 3438,43109,18995,43123, -43470,43120,43467,16101,22636, 3583,15932, 3604,16312,16142,14805, 5765, - 5233,43113,43460,16120, 3595,16119,22641, 3594,16118,22640, 3593,14803, -16047,22570, 3522,16046,22569, 3521, 6706,20785,13173, 6447,21556,14255, - 6445,22725,16252, 6333, 6444,14418,14028,14442,15337, 5596, 6067, 7009, - 7995,28031,27564, 6494, 7412,22724,22003,16251,15336, 6435,21554,14253, - 6438,22722,16249, 6434, 7416,14753,14387, 5540, 6065, 6985, 7993,28029, -27562, 6437, 7410,22721,22001,16248,15334,15301,21973, 7380, 6030, 5803, - 6029, 5775, 6743, 7129, 5801, 6731, 7122, 5793, 6727, 7118, 5789,14760, - 6032, 5777,14746, 7386,21979,15307, 5781, 5452, 6034, 5779, 6723, 7115, - 5786, 5795, 6039, 7124, 7983,28016,27552, 6733, 7396,22710,21984,16226, -15312,14752,14748, 5791, 6037, 7120, 7981,28014,27550, 6729, 7392,22708, -21982,16222,15310,43027,14465,21641, 6257,16327,22789, 6256,32237,15002, -14464,14463, 6589, 6484,21453,14051,16246,14469,14468,15689,15950, 6254, -15580, 5571, 5866, 7001, 7853,27609,27299, 6481, 7162,22141,21752,15579, -15046,14751,14471, 5569, 5889, 6999, 7883,27677,27342, 6479, 7221,22300, -21814,15741,15101,16326,22788, 3938,43577,43244,43574,43241, 6819,21366, -13905, 6818,20784,13172,16331,22793, 4238, 5813, 3987, 6796,21319,13807, - 5817, 4015, 5809, 4012, 6805,20713,13116, 6807, 7147, 5834,20783,26609, - 3845,13171,26853, 3838,13666,21222, 3820, 6790, 7138, 5808,20805,26616, - 1953,13189,26857, 2018,13674,21227, 2053, 5807, 1976, 7137, 2083,26636, -26874, 6789, 2116,20848,21247,13229,13701, 5821, 1967, 7144, 2074,26629, -26867, 6800, 2107,20830,21239,13211,13692, 6794, 7140, 5815,20782,26608, - 1935,13170,26852, 2000,13665,21221, 2035, 5819, 1985, 7142, 2093,26647, -26885, 6798, 2126,20870,21256,13245,13708,16325,22787, 3937, 3940, 3946, - 3921, 3959, 3970, 3930, 3950, 3964, 3924, 3936, 3944, 3919, 3949, 3963, - 3923, 3957, 3968, 3928, 6835, 7154, 5848,20903,26670, 1589,13261,26895, - 1690,13717,21268, 1655, 3935, 3943, 3918, 6830, 7152, 5846,20898,26668, - 1934,13256,26893, 1999,13715,21266, 2034, 6834,20902,13260, 6832,20900, -13258,16315,22777, 3856, 3855, 3861, 3850, 5836, 3848, 7149, 3841,26628, -26866, 6809, 3823,20829,21238,13210,13691, 3934, 3942, 3917,14837,21713, - 6353,22100,14836,14835,14846, 6851,21738,14952, 6837,21731,14924,15502, -15501,15516,15528,15540,14882,15536, 5864, 1638,16378, 5858, 4127, 5857, - 1905, 6854,21740,14967,14881,15534,14878,14906,15544,15546, 6862,21746, -15035, 6864,21748,15037,14867,14908,14897,14891,14888,14899,14875,14880, -16098,16095,22634,22631, 3578, 3575,22629, 3573,27960, 3708,22608, 3555, -27947, 3688,22606, 3553,27945, 3686,40118,14110,30165,38687,30164,32068, - 3274, 3432, 3268, 3426,27965,27963,14626, 5349,27940,35536,14625,35538, -14627,35535,14624,35534,14623, 6664, 6663, 4303,21444,14033, 6560,21443, -14032, 5738, 3196, 2528, 2527, 5644, 7042, 8345, 8183, 2526, 3323, 3317, - 5640, 7038, 6931, 5266, 5641, 7039, 2524, 3313, 7732,39979,32435, 5362, - 7729,39976,32432, 5359,22612, 3559,27951, 3694,22611, 3558,27950, 3693, - 7630,39953,32422, 5322, 7627,39950,32419, 5319,35533,14622,35532,14621, -35531,14620,35545,14653,35530,14619,35544,14652,10716,10713,10708,10705, -35527,14616,35529,14618,10710,10707,10593,10592, 2702, 2690,18867,18855, -10470,10458, 5741, 3199, 7099, 3049,24735,24575, 5733, 3191, 3272, 3430, - 5735, 3193, 5734, 3192, 7096, 3046,24732,24572, 5731, 3189, 7094, 3044, -24730,24570, 5728, 3186, 7091, 3041,24727,24567, 5715, 3172, 7083, 3029, -24724,24564, 3270, 3428, 2700, 2688,18865,18853,10468,10456,43482,18834, - 5709, 3165, 5704, 3161, 5626, 4113, 5855, 4085, 5662, 3986, 5701, 3158, - 5693, 3150, 7077, 3022, 7069, 3014,24716,24556,24708,24548, 6620, 2699, - 6612, 2687,18985,18864,18977,18852,10613,10467,10605,10455, 5697, 3154, - 5689, 3146, 7073, 3018,22604, 7065, 3010,24712,24552, 3551,24704,24544, - 6616, 2694, 6608, 2682,27943,18981,18859,18973,18847, 3684,10609,10462, -10601,10450,22603, 3550,27942, 3683, 2696, 2684,18861,18849,10464,10452, - 5698, 3155, 5690, 3147, 7074, 3019, 7066, 3011,24713,24553,24705,24545, - 6617, 2695, 6609, 2683,18982,18860,18974,18848,10610,10463,10602,10451, -28004, 3126, 3060, 3379, 3125, 3123, 3122, 3333, 3066, 3383, 3065, 3382, -10507,18914,10506, 2875,18913, 2874, 3304, 3493, 3302, 3491, 3301, 3490, - 2746, 2745,18889,18888,10490,10489, 2744, 2743,18887,18886,10488,10487, -14522, 5654, 2538,15766,15765,14397, 8138, 8310, 5559, 5546, 5545, 5222, - 5707, 5221, 5717, 5544, 5220,16422,16417,16419,43666,43661,43664,43659, -43656,43654,43652,43650,43643,43648,43641,43646, 1721, 7573, 1718, 7570, - 7711, 2859, 7706, 2844,16494, 7690, 2800, 7688, 2798, 7687, 2797, 7709, - 2857, 7704, 2842,16484, 7694, 2813,16502, 7685, 2795, 7714, 2864, 7684, - 2794,16491,16490, 7693, 2812, 7683, 2793,16534,16541,16532,16539,16547, -16552,16489,16551,32547,16545,32549,16550,16549,32544,16488,32584,32596, -16580,22899,28140,32583,38724,43714,22901,28142,38722,43712,16582,32581, -16671,16593,16569,16412,16411,16410, 7682, 2792, 7692, 2811,16524,16526, -16408,16407,16430,16406,16509,16506, 3645,22871,16497,16427,16426,22823, - 4558,16425,22822, 4556,16592,16500,16511,16465,16469,16467, 7701, 2822, - 7699, 2820, 7697, 2818,16504,16951,23098, 8930,32714,16751,16750, 4324, -16746,32898,32761, 9180,23289,17210, 6722,23032,16851,17209,23288, 9179, -17215,23293, 9187,16839,16989, 6471,23037,16857,16836,16987,16831,16984, -43775,43804, 4361, 9178,17191,23279, 9156,17164,23262, 9137,17189,23277, - 9154,16785,17184,23272, 9152,17183,23271, 9151,17163,23261, 9136,16793, -17260,23314, 9210,17259,23313, 9209,17258,17257,17256,17540,17520,16895, -16894,17384,16916,17373,17084,23204, 9040,17546, 4126, 8890, 8929,23097, -16950,16949,23096, 8928,16948,23095, 8927,16947,43871,43830,43869,43828, -17472, 6376,22977,16757,16765,22969, 7161,17449,16799,17459,32713,16749, -16748,17470,17447, 8952, 8951,16830,23015, 7448,16850,23031, 6788,32760, -17208,23287, 9177, 8970, 8969,16809,22996, 4555,16808,22995, 6317,16849, -23030, 7159,16829,23014, 6374,16848,23029, 7446,16828,23013, 6786,17207, -23286, 9176,16782,16847,23028, 7215,16827,23012, 6419,16779,17480,32732, -32754,32731,16784,17182,16768, 9189,43807,43778, 4268,17176,17161,43867, -43826,17160,43865,43824, 9208,23312,17030,17255,23160, 9017, 9207,23311, -17029,17254,23159, 9016, 9226,23343,17066,17298,23191, 9030,17028,17253, - 9206,23310,17252, 9205,23309,17251,17027,23158, 9015,17250,23308, 9204, -17026,23157, 9014,17249,23307, 9203,17248,23306, 9202,17025,23156, 9013, -17247,16867,17519,16893,16892,16891,16890,16902,16865,23045, 6470,16873, -16870,23048, 6378, 6190,23395,17522,16864,23044, 4525,16883,23059, 4509, -16914,23065, 4508, 9201,23305,17246, 9249,23355,17360,17420,23377, 9272, -17138,23241, 9091, 5871, 7856, 7524, 7165, 8042, 6140,16927,17143,23076, -23246, 7522, 9096,28180,28208, 8040, 9120, 6138, 8876,17436,23391, 9286, -17592,28242, 9307,23430,28276, 8912, 7520, 8038, 6136,17136,23239, 9089, -17430,23386, 9281,17586,28237, 9302,23425,28271, 8907, 7518, 8036, 6134, - 9269,23374,16924,17140,17417,23073,23243, 7516, 9093,28177,28205, 8034, - 9117, 6132, 8873,17372,16889, 9229,23348,17074,17309,23197, 9034,17073, -23196, 9033,16881,23057, 4517,16670,16574,22893,28134,32575,38716,43706, -22895,28136,38718,43708,16576,32577,32601,16573,22892,28133,16625,22919, -28152,16946,23094, 8925,16945,23093, 8924,38796,32704,17444,17443,17498, -17477,17504,17488,17490,17442,17441,16795, 3581,22981,16775,16774,22980, - 4507, 3580,23011,16826, 8943,23102,17179,16957,23268, 9147,32748,32893, - 3864,22994,16807,16806,22993, 4539, 2179,23010,16825,17509,16846,23027, - 2193, 2184,23020,16838,16855,23035, 2197, 2182,23018,16834,16811,22998, - 4506,16813,23000, 4524,16982,16819,43800,43771, 9166, 1673, 9200,23304, -17024,17245,23155, 9012, 9228,23347,17072,17308,23195, 9032, 9224,23341, -17064,17296,23189, 9028,32759,32897,17214,23292, 9186,17206,23285, 9175, - 3948,23026,16845, 3644,23025,16844,43803,43774, 9174, 2192,17159,23260, - 9135, 9134,23259,17158,17440,17514,17512,16860,23040, 2191,17000,23134, - 8995,16998,23132, 8993, 3591,23024,16843,17222,16994, 9192,23296,17218, - 9194,23298,17220,17507,16992,23127, 8987,16862,23042, 1328,23154,17244, -17023,17474,17243,17022,17497,17021,17486,17439,17496,17057,17093,17020, -17019,17117,17352,17371,17370,17376,17369,17390,17379,17392,17109, 8894, - 1637,17338, 8889, 1904,17356,17103,17438,17401,17126,17403,17128,17409, -23364, 9261,17411,23366, 9263, 8923,23092,16944, 8922,23091,16943, 9133, - 2862, 9144, 2791, 9142, 2810, 838,22973,16764,16761,22976, 840, 9131, - 2790,16736,16734,17324, 8978,16842,23023, 3814, 9107,23257,17154,17107, -23220, 9070, 9076,23226,17115, 8968, 8967,23119,16978,16803,22990, 3881, -16802,22989, 2880,32747,16805,22992, 1327,16816,23003, 1334, 9165, 8962, - 8961, 1344, 9163, 8966,23118,16977, 8964,23116,16975,17217,23295, 9191, - 9011,23153,17018,17017,23152, 9010,17120,23229, 9079,17082,23202, 9038, - 9062,23213,17099,32758,32757, 8984, 8982, 8977, 8976, 2171, 2170, 2178, -23009,16824,43802,43773, 9173, 2190, 9199,23303,17016,17242,23151, 9009, - 9198,23302,17015,17241,23150, 9008, 9196,23300,17239,23148,17238,17237, -17236,17235,17234,17233,17232,17231,17518,17517,17172,17337,17336,17335, -17334,17345,17205,32896,17333,32921,28257, 9056,43837, 9245, 9395,28250, - 9329,43796, 9392,28197, 9326,43902,28224, 9053,43895, 9242,43834, 9049, -28254, 9238, 9388,43793, 9322,28247, 9385,43899, 9319,28194,43892, 9046, -28221, 9235, 9232,23352,17089,17323,23207, 9043,17321,17320,32773,32680, -32679,32772,32685,32778,32683,32775,32792,32688,38823,32771,17516,17539, -17543,17204,23284, 9172,17013,23147,17012, 9006,23146, 9005,17011,17010, -23145,23144, 9004, 9003,17009,17007,23143,23141, 9002, 9000,17081,17080, -23201,23200, 9037, 9036,38830, 9416,32848, 9415,32847,38829, 9215,23319, -17035,17265,23165, 9022, 9213,23317,17033,17263,23163, 9020,17203,23283, - 9171,16878,23054, 2188,17529,23402, 1325,17526,23399, 9170,16876,23052, - 1324,17525,23398, 2187, 1177, 1188, 1160, 1185, 1167, 1170,32806,32697, - 1220, 1215, 1246, 1202, 1250, 1232,32811,32702,17134,23237, 9087,17427, -17583,23383,23422,28234,28268, 9278, 1184, 9299, 1187, 8904, 1176,16926, -23075, 1159,17142,28179, 1166,23245,28207, 1169, 9095, 9119, 8875, 9275, -23380,17423, 9277,23382,17426,17148,16931,23251,23080,28212,28184, 9101, - 1236, 9124, 1240, 8880, 1226,32808,32699,38792,38755,43819,43784, 9280, - 1245, 9301, 1249, 8906, 1231,23385,23083,28236,28187, 9343, 1254, 9363, - 1256, 8883, 1210,38860,38757,43860,43786, 9458, 1260, 9471, 1262, 8911, - 1219,17429,16934,28215,28270, 9127, 1208, 9376, 1258,32880,32701,43821, -43907, 9306, 1214, 9480, 1264,28241,28275, 9365, 1222, 9378, 1242,43862, -43909, 9473, 1228, 9482, 1252,17153,17585,23256,23424, 9106, 1197,32810, -32931,38794,38872, 9285, 1201,23390,23429, 9345, 1204,38864,38874, 9462, - 1206,17435,17591,32884,32933,17434,17590,23389,23428,28240,28274, 9284, - 1200, 9305, 1213, 8910, 1218,17433,17589,23388,23427,28239,28273, 9283, - 1199, 9304, 1212, 8909, 1217,17147,16930,23250,23079, 9100, 1235,28211, -28183, 9123, 1239, 8879, 1225,16933,23082, 1244,17152,28186, 1248,23255, -28214, 1230, 9105, 9126, 8882,17145,23248, 9098,17151,23254,17150, 9104, -23253, 9103,38863, 9461,32883, 9460,32882,38862, 1316, 1319, 1337, 1313, - 1340, 1322,17098,23212,17097, 9061,23211, 9060,38834, 9427,32857, 9426, -32856,38833,17367,17366,17365,17364,17363,16908,32794,32925,17425,17582, - 9448, 9447, 1380,17560,23409, 1373,38849, 9446,32872, 9444,32870,38847, -38841, 9434,32864, 9432,32862,38839,38837, 9430,32860, 9429,32859,38836, -32691,32796,17106,17105,23219,23218, 9069, 9068,38844, 9439,32867, 9438, -32866,38843, 1370, 1378, 1348, 1375, 1356, 1362,16910,23062, 2186, 1385, -23412,17568, 9252,23358,17387, 1382, 1390, 1353, 1387, 1359, 1365,32693, -32800,17114,23225,17113, 9075,23224, 9074,38853, 9453,32875, 9452,32874, -38852,17332,17331,17330,17329,16888,32787,32920,17432,17588,17358,17556, -17351,17553,17389,17570,17378,17562,17382,17564,17394,17572,17362,17558, - 9442, 9441, 9424, 9423, 1368, 1108,13330,13329,13400,13397,17078,17315, -17071,17307,15133,13770,13518,14434,15468,14972,15521,14863,13769,14436, -15135,13517,13768,14811,15395,13516,13767,14420,15116,13515,15518,14860, -15465,14965,13805,14816,15398,13568,17124,17405,17070,17314,15369,14792, -14790,15359,14821,15430,15491,14910,14770,15314,12926,13328,15520,14971, -13327,12925,13326,12924,13325,12923,15542,15031,13469,13253,14815,15397, -15464,14859,17349,16906,17347,16904,14873,16397,14871,16395,14532,13324, -14527,13323,14525,13393,14530,12922,14535,12984,14537,12921,14517,12920, -16382,14987,16384,14989,16022,13322,16017,13321,16015,13395,16020,12919, -16025,12986,16027,12918,16008,12917,15775,15777,14402,14400,17398,14510, -14903,14858,14508,14424,14819,16961,17305,14412,14855,13876,13883,13881, -13873,14422,14414,14416,14809,13946,13944,13878,13889,13887,15029,14923, -13451,14963,13840,13900,13831,13803,13842,13981,13779,13829,13959,13950, -13971,13964,13962,13967,16068,22589,16077, 4261,22598, 4260,16066,22587, -16075, 4259,22596, 4257,15256,21934,15263, 7336,21941, 7343,15254,21932, -15261, 7334,21939, 7341,12916,20525, 4255,13079,20683, 4314,12915,20524, - 4254,12914,20523, 4253,13081,20685, 4316,13320,20978, 4434,13419,21040, - 4468,13319,20977, 4433,13318,20976, 4432,13317,20975, 4431,12913,20522, - 4252,12912,20521, 4251,12911,20520, 4250, 4301,22781,16319,15412,22046, - 7464,12910,20519, 6816,12909,20518, 6634,12908,20517, 6661,12907,20516, - 6459,12906,20515, 6453,12905,20514, 6802,13316,20974, 6632,13315,20973, - 6637,13314,20972, 6628,13313,20971, 6457,16321,22783, 4249,16308,22771, - 4248,16203,22698, 6715,15914,22451, 6492,15305,21977, 7384,15303,21975, - 7382,15155,21849, 7283,15414,22048, 7466,13006,20610, 6813,15403,22039, - 7458,13009,20613, 6659,16201,22696, 6713,13403,21030, 6639, 8092, 8571, - 8574, 8095,38612,37449,38626,37448,38624,37446,38541,37444,14814,17313, -17312,12904,12903,12902,12901,13083,13012, 7107, 5350,42779,42777, 4169, - 4393,14834,14922, 4390, 4349, 4424, 4270, 4347,18969,43135,27930,27928, -27921, 4601, 4600, 4598,27511,27509,27504, 7785, 6772, 6679, 6487, 6688, - 8090, 8569,30259,35323,30254,35317,30252,35315, 8089, 8568,18967,43133, -30251,35314,30244,35307,30257,35321,30249,35312,15087,21797, 4505, 4504, - 4512, 4579, 4577, 4514,29692,34639,29691,34638,29707,34654,29717,34664, -29799,34746,29801,34748,29740,34687,13958, 6932, 5267, 6930, 5265, 4503, - 4502, 4501, 4520, 4519, 4551, 8363, 2934, 2926, 2974, 2970, 8370, 2925, - 2383, 2391, 2382, 8368, 8347,30250,35313, 8343, 7722, 7720,19096,19094, -10709,10706, 4500,22238,15684, 4499,22236,15681,13514,21078, 7566,12900, -20513, 6779,12899,20512, 6826,12898,20511, 6737,17122,23231, 9081, 9066, -23216,17102,17111,23222, 9072, 9026,23185,17056,17095,23209, 9058,12897, -20510, 7806,15550,22120, 7851, 7507,22090,15478,15533,22114, 7845,15538, -22116, 7847, 7499,22084,15461,15530,22111, 7841,15711,22261, 6742,15708, -22259, 7774, 7581,22380,15829,15836,22382, 7583,15923,22457, 7564, 7593, -22241,15688,15442,22075, 7492,15489,22096, 7513,15481,22092, 7509, 7837, -22108,15515,17005,23139, 8998, 8997,23138,17004,15500,22099, 7832, 7497, -22078,15454,15453,22077, 7496, 7831,22098,15499,15473,22087, 7504, 4529, -22140,15578,13822,15577, 4527,22139,15576,13817,15575,15724,13513,15574, -22138, 4179,15573,13583,14251,15710,15572,22137, 7776,14257,15571,16242, -15707,15570,22136, 6745,16254,15569,15832,15835,15702,15922,15568,22135, - 6500,15567,15925, 4188, 4538,22455,15920, 4537,22454,15919, 7591,22453, -15918,15917,13613,15916, 7595,22134,15566,14065,15565,17228,14833, 4173, -13188,20804, 4365,13228,20847, 4386,17227,13237,20859, 4389,13169,20781, - 4360,14099,13827, 4534,13603,21164, 7590,14068,14024,13570,13209,20828, - 4382,13512,13412,13411,17003,17226,15452,14832,15498,14921,17328,16887, -14866,16391,14521,13410,16377,14977,16010,13409,14396,13941,13885,13074, -20679, 4310,13073,20678, 4309, 4308,22776,16314,15300,21972, 7379,13072, - 4531,15564,22133, 6475,15870,15563,15825,13599,13511,15764, 6771, 6670, - 6678, 6486, 7784,13448,13897, 3266, 3424,42761,42776, 6929, 5264, 2924, - 2381,18833,43481, 8713, 2380, 2379, 2962,19078,42868,18806,43450, 2923, - 1016, 1058,35100,29992, 1044,35096,29988,15561,22131,35097,29989, 1040, - 2404, 1034, 1042, 1054, 1028, 5115, 5117,16064,22585,16073, 4297,22594, - 4296,27926, 4624, 6948, 5294,15252,21930,15259, 7332,21937, 7339,27507, - 8352,14813,14857,14970,14969,42775,13447,13896,13446,13895, 7110, 5369, - 2980, 8377, 7739, 7738,19111,19110,10739,10738,18987,43158, 2942, 8712, - 4563,13639,21187, 4554,13904, 4195, 4381,15070,21780, 4533,13903,14067, -13957,16938,16937,42132,42573,17002,17225,15451,14920,15497,14831,14919, -15409,22043, 7462,13305,20963, 6811,13304,20962, 6657,16196,22691, 6711, -13303,13986,13985,13984,17224,14918,14830,42689,42380,42688,42379, 4429, -13311,20969, 4428,13977,16936,13307,20965, 4423,13509,37779, 4899,13507, -37777, 4897,13983,42687,42378,42373,42682,13988,42377,42686,42691,42382, - 9078,23228,17119, 7511,22094,15487,15440,22073, 7490,13115,20712, 6824, -42802, 8376, 8375, 7849,22118,15548,13826,13445,13894,13114,13628, 2232, -21214,13743,13651,21291, 2250, 6477,21167,15144,13606,21841, 7270,13956, -21399, 2214, 2231,21355,13867,15143,21840, 7269, 6483,21334,13833,13955, - 4574,13113,13949, 4571, 4570,13731,21281, 4553,13168,13737,21286, 2230, -13742,21290, 2249,13954,21398, 2213,13948,21396, 2229,13112,20711, 6735, -13940,15265,21943,15066,21776,15085,21795,30243,35306,15560,22130, 4548, -29765,34712,29750,34697, 2378, 5130, 5127,43480,18832, 2377,35094,29986, - 2376,35090,29982,15558,22128,35091,29983, 2403,15077,21787,30235,35299, -30246,35309, 8342,13111,20710, 6777,13110,20709, 7804, 4550,13208,20827, - 4380,18680,42605, 4379,13646,18934,42986, 8312, 1778,42238,42611,13167, -20780, 4359, 7035, 5307,42741, 1710, 1626, 8327, 8326, 2375, 8340, 8325, - 7615, 7612,19074,19071,10696,10693, 4562,13166, 8224, 8659,19004,43178, -15330,21997, 8664, 8226, 2922, 2374, 8223, 8658, 5467, 955, 6059, 953, - 5464, 959, 6056, 957, 8661, 8663, 8218, 8221,14243,14242,16236,16235, -32298,32297, 8076, 6069,42820,42819, 8383,10641,19007,10640, 6755,19006, - 6754,15343,22008, 7135, 5491,42828, 2373, 8387, 8386, 7793, 7792,19130, -19129,10758,10757,19123,42907,43185,43523,42818,42906, 8672, 8675, 1503, - 6071, 5483, 1507,32302, 7134, 5490, 8080, 6089,19017,43192,43191,43528, -43190,43527,42827,42913, 8385, 7791, 7790,19128,19127,10756,10755,10651, -19016,10648, 6766,19013, 6763, 8233, 8236,42911,42825, 5497, 1549, 6093, - 1539, 5496, 1548, 6092, 1538,15069,21779,15332,21999,15083,21793,15090, -21800,15088,21798,15674,22221,15557,22127,15556,22126,15559,22129,15555, -22125,15078,21788,15080,21790,15076,21786,15554,22124,15562,22132,15553, -22123,15552,22122,15074,21784,15073,21783,15184,21867,15949,22485,15948, -22484,15988,15219,22525,21900,27872,27463,15985,15216,27869,22522,21897, -27460,27857,27448,27849,27440,25615,27633,27608,21778,15068,27834,27425, -27765,27606,15970,15201,22507,21882,27833,27424,15969,15200,27899,27898, -22541,22540,22506,21881,27490,27489,16004,16003,27832,27423,21916,21915, -15235,15234,27897,27488 -}; - - -const int s_nDataSize3 = 24772; -unsigned int s_Data3[24772] = { -//Output priorities (total = 24772): -10, 9, 12, 6, 11, 14, 4, 1, 7, 5, 2, 3, 13, 8, 0, -0, 1, 2, 219, 218, 76, 217, 216, 77, 1, 0, 74, 78, 79, 75, -70, 71, 72, 68, 73, 69, 310, 299, 296, 331, 297, 332, 114, 26, 298, -340, 330, 336, 338, 339, 62, 112, 328, 334, 329, 335, 113, 337, 327, 333, -115, 60, 27, 61, 63, 273, 215, 36, 213, 31, 35, 39, 319, 312, 320, -323, 324, 343, 157, 345, 28, 178, 32, 59, 269, 58, 309, 305, 275, 271, -308, 304, 34, 117, 181, 129, 154, 211, 30, 38, 177, 193, 55, 130, 268, -33, 303, 174, 29, 37, 119, 212, 143, 188, 66, 270, 141, 183, 194, 179, -126, 261, 190, 267, 344, 346, 272, 189, 173, 274, 51, 322, 321, 342, 315, -214, 311, 14, 57, 223, 348, 125, 176, 192, 317, 280, 314, 165, 160, 175, -326, 127, 17, 247, 172, 262, 5, 231, 99, 138, 124, 54, 301, 325, 167, -15, 43, 205, 47, 122, 147, 292, 295, 83, 106, 86, 87, 220, 131, 347, -293, 150, 209, 233, 67, 116, 148, 156, 171, 180, 191, 256, 195, 341, 128, -277, 291, 281, 289, 294, 313, 102, 46, 103, 207, 229, 236, 240, 224, 227, -249, 170, 49, 251, 258, 318, 133, 197, 278, 2, 56, 252, 265, 254, 20, -142, 151, 316, 164, 121, 162, 41, 107, 139, 203, 288, 302, 48, 52, 110, -53, 64, 4, 16, 284, 135, 307, 3, 40, 155, 202, 23, 93, 22, 92, -290, 65, 210, 50, 98, 208, 94, 123, 137, 187, 225, 7, 10, 120, 109, -263, 287, 186, 108, 152, 264, 90, 253, 96, 97, 136, 200, 118, 140, 300, -306, 185, 6, 11, 89, 259, 85, 101, 132, 196, 24, 45, 260, 244, 91, -18, 104, 232, 19, 44, 105, 184, 21, 84, 226, 250, 283, 279, 286, 158, -248, 257, 255, 80, 169, 13, 100, 81, 168, 199, 238, 9, 12, 82, 182, -201, 266, 146, 204, 230, 239, 241, 159, 221, 285, 134, 88, 242, 246, 8, -144, 222, 149, 161, 228, 237, 276, 95, 206, 282, 163, 198, 243, 235, 245, -42, 166, 25, 111, 145, 153, 234, 13, 0, 1, 8, 3, 11, 7, 9, -2, 12, 4, 6, 5, 10, 0, 61, 62, 0, 2, 3, 5, 6, 8, -15, 17, 1, 4, 7, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, -21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, -51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 63, 64, 65, 66, 67, -68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 4, 5, -2, 0, 1, 3, 7, 10, 8, 11, 6, 9, 97, 100, 22, 123, 124, -125, 98, 101, 40, 39, 66, 72, 75, 69, 68, 74, 21, 41, 67, 73, -77, 30, 71, 23, 106, 36, 54, 55, 63, 96, 32, 99, 58, 59, 65, -38, 107, 27, 17, 56, 57, 64, 70, 76, 29, 15, 31, 122, 102, 25, -48, 49, 50, 51, 52, 53, 26, 28, 103, 37, 127, 104, 120, 121, 24, -33, 46, 47, 62, 112, 113, 116, 105, 20, 13, 126, 128, 35, 34, 19, -42, 43, 44, 45, 60, 61, 18, 79, 84, 91, 16, 14, 82, 89, 94, -85, 119, 83, 88, 95, 118, 78, 90, 81, 86, 93, 12, 80, 87, 92, -108, 109, 110, 111, 114, 115, 117, 148, 542, 149, 147, 303, 531, 555, 573, -574, 532, 556, 150, 153, 155, 578, 304, 560, 536, 151, 154, 157, 534, 558, -576, 533, 538, 557, 575, 547, 551, 570, 305, 568, 306, 540, 541, 544, 546, -550, 553, 562, 564, 565, 571, 552, 554, 572, 535, 559, 577, 537, 561, 569, -539, 543, 545, 548, 549, 563, 566, 567, 308, 307, 152, 156, 158, 382, 144, -128, 145, 438, 446, 450, 458, 462, 470, 474, 482, 492, 500, 504, 510, 516, -522, 530, 204, 394, 528, 381, 397, 480, 498, 396, 400, 436, 444, 448, 456, -460, 468, 472, 490, 502, 508, 514, 520, 286, 388, 393, 294, 403, 273, 384, -385, 387, 391, 399, 408, 313, 317, 347, 354, 414, 419, 426, 25, 88, 127, -130, 198, 275, 336, 483, 126, 281, 283, 341, 432, 299, 325, 390, 402, 415, -416, 417, 418, 427, 428, 116, 124, 134, 142, 221, 229, 298, 479, 486, 497, -527, 24, 87, 227, 311, 315, 329, 353, 506, 512, 518, 30, 34, 41, 196, -300, 484, 48, 104, 186, 191, 264, 335, 343, 363, 234, 276, 441, 443, 453, -455, 465, 467, 477, 495, 525, 222, 269, 476, 494, 524, 395, 89, 140, 413, -420, 425, 481, 499, 505, 511, 517, 529, 200, 257, 327, 398, 401, 440, 445, -452, 457, 464, 469, 32, 36, 42, 47, 345, 365, 435, 442, 447, 454, 459, -466, 471, 478, 489, 496, 501, 507, 513, 519, 526, 202, 323, 146, 170, 177, -179, 248, 255, 368, 380, 206, 122, 132, 258, 279, 288, 296, 349, 375, 434, -46, 114, 165, 180, 201, 219, 243, 250, 297, 405, 429, 33, 38, 43, 172, -203, 208, 346, 392, 404, 410, 485, 488, 183, 216, 261, 348, 386, 430, 20, -26, 65, 100, 131, 162, 167, 174, 182, 188, 189, 194, 210, 218, 240, 252, -260, 266, 272, 284, 360, 372, 383, 423, 12, 17, 57, 92, 99, 129, 213, -215, 230, 231, 278, 291, 293, 339, 389, 406, 411, 422, 15, 60, 62, 97, -117, 119, 135, 199, 224, 225, 236, 245, 267, 302, 321, 326, 377, 407, 102, -137, 175, 274, 431, 412, 421, 424, 173, 238, 246, 251, 253, 262, 270, 282, -366, 370, 378, 437, 439, 449, 451, 461, 463, 473, 475, 491, 493, 503, 509, -515, 521, 523, 0, 1, 81, 82, 106, 160, 168, 184, 185, 192, 193, 263, -271, 277, 322, 358, 22, 28, 31, 40, 67, 98, 103, 105, 138, 254, 316, -319, 355, 328, 10, 14, 49, 52, 59, 70, 73, 90, 112, 133, 220, 228, -232, 233, 301, 309, 314, 331, 333, 337, 344, 351, 35, 37, 44, 163, 342, -409, 433, 487, 259, 27, 29, 39, 50, 161, 164, 176, 178, 181, 187, 190, -197, 205, 239, 241, 242, 324, 332, 359, 361, 362, 371, 373, 374, 6, 7, -45, 55, 56, 75, 77, 79, 80, 108, 109, 159, 166, 169, 171, 195, 217, -237, 247, 249, 256, 265, 268, 280, 334, 340, 350, 357, 367, 369, 379, 2, -3, 9, 18, 19, 21, 23, 53, 63, 64, 66, 68, 72, 76, 83, 84, -93, 95, 96, 101, 107, 111, 120, 121, 123, 125, 139, 141, 143, 212, 244, -290, 295, 310, 312, 318, 320, 330, 338, 352, 356, 4, 5, 8, 11, 13, -51, 54, 58, 61, 69, 71, 74, 78, 85, 86, 94, 110, 113, 115, 136, -207, 209, 211, 214, 223, 226, 235, 285, 287, 289, 292, 364, 376, 16, 91, -118, 0, 3, 19, 149, 96, 20, 150, 5, 1, 6, 4, 2, 147, 93, -91, 145, 148, 95, 146, 85, 55, 66, 76, 59, 73, 81, 51, 61, 64, -54, 58, 92, 94, 63, 173, 62, 86, 65, 75, 60, 74, 82, 56, 52, -53, 57, 171, 167, 160, 159, 170, 72, 141, 162, 172, 28, 68, 29, 140, -168, 27, 70, 126, 139, 69, 163, 89, 137, 166, 71, 169, 129, 142, 164, -116, 135, 143, 90, 67, 113, 121, 165, 161, 131, 123, 125, 133, 30, 7, -138, 10, 117, 119, 11, 120, 127, 134, 130, 132, 115, 124, 114, 136, 9, -118, 33, 77, 157, 158, 8, 12, 88, 155, 156, 34, 78, 99, 97, 128, -36, 44, 87, 35, 43, 15, 13, 17, 122, 21, 23, 25, 144, 37, 45, -47, 103, 32, 42, 80, 39, 49, 83, 108, 40, 50, 84, 38, 46, 48, -31, 41, 79, 18, 98, 22, 24, 26, 14, 16, 105, 107, 100, 152, 111, -109, 104, 101, 110, 112, 106, 153, 102, 151, 154, 0, 1, 3, 4, 2, -12, 13, 10, 11, 14, 9, 6, 5, 7, 8, 21, 24, 23, 22, 20, -19, 15, 16, 17, 18, 0, 1, 3, 2, 108, 109, 139, 153, 122, 96, -178, 97, 126, 95, 101, 100, 94, 174, 140, 172, 175, 173, 5, 36, 154, -88, 83, 80, 35, 161, 151, 19, 11, 6, 147, 143, 34, 176, 123, 37, -169, 170, 171, 163, 164, 165, 166, 167, 168, 155, 156, 157, 158, 159, 160, -82, 162, 177, 152, 81, 111, 7, 12, 20, 128, 4, 93, 21, 64, 13, -148, 60, 62, 118, 10, 18, 33, 144, 30, 48, 135, 149, 86, 114, 99, -124, 129, 130, 131, 61, 63, 65, 8, 14, 16, 22, 24, 26, 28, 73, -75, 77, 90, 56, 72, 74, 76, 78, 51, 53, 55, 57, 59, 67, 69, -71, 79, 89, 91, 50, 52, 54, 58, 66, 68, 70, 92, 107, 39, 41, -43, 45, 47, 110, 103, 105, 120, 145, 127, 38, 40, 42, 44, 46, 137, -102, 104, 106, 31, 32, 49, 9, 15, 17, 23, 29, 87, 25, 27, 150, -141, 142, 84, 85, 146, 98, 116, 119, 133, 115, 121, 136, 132, 125, 117, -112, 113, 138, 134, 2, 0, 1, 3, 8, 6, 7, 4, 5, 9, 10, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 2, 1, 4, 8, 7, 9, 6, 0, 5, 3, 10, 109, 107, -108, 97, 105, 28, 30, 21, 81, 26, 32, 106, 20, 24, 35, 22, 34, -96, 104, 62, 27, 111, 11, 18, 23, 36, 83, 37, 12, 95, 17, 46, -56, 25, 40, 42, 87, 89, 14, 16, 13, 29, 103, 82, 110, 15, 19, -31, 33, 102, 38, 66, 67, 68, 69, 70, 71, 72, 85, 41, 115, 117, -91, 93, 94, 99, 101, 43, 73, 86, 88, 114, 116, 50, 52, 74, 76, -77, 78, 79, 39, 113, 44, 45, 47, 48, 49, 51, 53, 54, 55, 57, -58, 59, 60, 61, 63, 64, 65, 75, 80, 84, 90, 92, 98, 100, 112, -0, 1, 20, 17, 18, 12, 19, 16, 21, 15, 23, 14, 22, 13, 0, -6, 5, 11, 3, 9, 2, 8, 1, 7, 4, 10, 3, 4, 11, 14, -17, 32, 0, 1, 2, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, -18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, -34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 2, 3, 0, 1, -15, 13, 17, 21, 77, 76, 33, 30, 34, 110, 105, 114, 118, 31, 32, -35, 101, 100, 16, 131, 12, 14, 130, 135, 132, 112, 120, 116, 111, 115, -119, 79, 117, 113, 121, 20, 133, 80, 134, 78, 81, 44, 109, 49, 47, -124, 46, 28, 48, 126, 26, 87, 89, 90, 88, 6, 5, 7, 9, 11, -19, 36, 38, 40, 42, 86, 91, 18, 4, 10, 39, 8, 37, 41, 43, -45, 60, 127, 27, 61, 106, 129, 59, 108, 128, 53, 54, 57, 58, 62, -50, 29, 56, 63, 52, 55, 107, 122, 123, 125, 51, 64, 65, 66, 67, -68, 69, 70, 71, 72, 73, 74, 75, 82, 83, 84, 85, 92, 93, 94, -95, 96, 97, 98, 99, 102, 103, 104, 23, 25, 24, 22, 175, 174, 176, -162, 158, 165, 124, 166, 15, 155, 126, 160, 120, 121, 122, 123, 125, 127, -128, 129, 153, 157, 171, 152, 163, 170, 96, 97, 108, 0, 3, 6, 9, -12, 66, 69, 72, 75, 78, 81, 130, 131, 150, 151, 156, 159, 161, 168, -169, 173, 177, 154, 164, 167, 172, 1, 2, 4, 5, 7, 8, 10, 11, -13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, -29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -59, 60, 61, 62, 63, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, -79, 80, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, -95, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 109, 110, 111, 112, -113, 114, 115, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 138, 139, -140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 178, 179, 0, 1, 2, -8, 6, 7, 3, 5, 4, 0, 1305, 1308, 540, 545, 558, 563, 564, 569, -570, 575, 576, 581, 582, 587, 588, 593, 594, 599, 600, 605, 606, 611, 612, -617, 618, 623, 624, 629, 630, 635, 636, 641, 642, 647, 648, 653, 654, 657, -662, 663, 668, 669, 672, 677, 678, 681, 684, 687, 690, 0, 1, 2, 3, -4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, -19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, -49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, -109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, -124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, -139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, -154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, -169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, -184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, -199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, -214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, -229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, -244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, -259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, -289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, -304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, -349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, -364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, -394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, -409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, -439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, -454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, -469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, -484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, -514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, -529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 541, 542, 543, 544, -546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 559, 560, 561, -562, 565, 566, 567, 568, 571, 572, 573, 574, 577, 578, 579, 580, 583, 584, -585, 586, 589, 590, 591, 592, 595, 596, 597, 598, 601, 602, 603, 604, 607, -608, 609, 610, 613, 614, 615, 616, 619, 620, 621, 622, 625, 626, 627, 628, -631, 632, 633, 634, 637, 638, 639, 640, 643, 644, 645, 646, 649, 650, 651, -652, 655, 656, 658, 659, 660, 661, 664, 665, 666, 667, 670, 671, 673, 674, -675, 676, 679, 680, 682, 683, 685, 686, 688, 689, 691, 692, 693, 694, 695, -696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, -711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, -726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, -741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, -756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, -771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, -786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, -801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, -816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, -831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, -846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, -861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, -876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, -891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, -906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, -921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, -936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, -951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, -966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, -981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, -996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, -1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, -1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, -1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, -1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, -1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, -1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, -1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, -1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, -1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, -1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, -1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, -1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, -1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, -1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, -1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, -1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, -1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, -1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, -1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, -1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1306, 1307, 1309, 1310, 158, 161, -164, 167, 170, 173, 74, 77, 86, 89, 0, 3, 12, 15, 24, 27, 36, -39, 48, 51, 60, 63, 110, 113, 122, 125, 134, 137, 146, 149, 76, 88, -156, 160, 162, 165, 169, 171, 2, 132, 175, 26, 38, 50, 62, 72, 83, -84, 95, 108, 120, 78, 90, 96, 104, 174, 14, 144, 176, 9, 21, 33, -45, 57, 69, 79, 81, 91, 93, 98, 106, 119, 131, 143, 155, 59, 71, -157, 159, 163, 166, 168, 172, 99, 101, 103, 105, 11, 35, 47, 73, 75, -80, 82, 85, 87, 92, 94, 97, 100, 102, 107, 117, 129, 141, 8, 20, -23, 32, 44, 56, 68, 114, 126, 138, 150, 153, 179, 186, 191, 198, 180, -192, 1, 4, 5, 6, 7, 10, 13, 16, 17, 18, 19, 22, 25, 28, -29, 30, 31, 34, 37, 40, 41, 42, 43, 46, 49, 52, 53, 54, 55, -58, 61, 64, 65, 66, 67, 70, 109, 111, 112, 115, 116, 118, 121, 123, -124, 127, 128, 130, 133, 135, 136, 139, 140, 142, 145, 147, 148, 151, 152, -154, 213, 214, 215, 216, 177, 189, 184, 196, 221, 222, 223, 224, 178, 181, -182, 183, 185, 187, 188, 190, 193, 194, 195, 197, 199, 200, 201, 202, 203, -204, 205, 206, 207, 208, 209, 210, 211, 212, 217, 218, 219, 220, 2, 4, -6, 8, 10, 12, 32, 34, 36, 46, 48, 52, 54, 56, 58, 60, 62, -64, 86, 87, 88, 105, 106, 107, 108, 109, 112, 113, 115, 117, 121, 1, -3, 5, 7, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, -25, 26, 27, 28, 29, 30, 31, 33, 35, 37, 38, 39, 40, 41, 42, -43, 44, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 66, 67, -68, 71, 73, 75, 76, 78, 79, 80, 82, 83, 84, 92, 93, 94, 96, -97, 98, 99, 100, 101, 102, 103, 104, 110, 111, 114, 116, 118, 119, 120, -122, 124, 126, 127, 129, 131, 141, 143, 145, 146, 148, 150, 152, 153, 156, -166, 167, 170, 173, 174, 176, 180, 182, 184, 186, 0, 22, 24, 50, 69, -70, 72, 74, 77, 81, 85, 89, 90, 91, 95, 123, 125, 128, 130, 132, -133, 134, 135, 136, 137, 138, 139, 140, 142, 144, 147, 149, 151, 154, 155, -157, 158, 159, 160, 161, 162, 163, 164, 165, 168, 169, 171, 172, 175, 177, -178, 179, 181, 183, 185, 122, 85, 89, 92, 106, 118, 136, 148, 156, 164, -27, 35, 37, 38, 52, 57, 62, 67, 71, 83, 55, 65, 68, 121, 26, -53, 63, 66, 80, 82, 105, 114, 119, 123, 137, 143, 14, 25, 30, 31, -100, 28, 117, 108, 134, 3, 12, 34, 36, 39, 40, 45, 46, 51, 59, -60, 61, 73, 74, 75, 76, 77, 78, 84, 86, 87, 88, 90, 91, 93, -94, 95, 110, 112, 115, 116, 120, 127, 128, 130, 132, 141, 142, 152, 175, -58, 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 29, 32, 33, 41, 42, 43, 44, -47, 48, 49, 50, 54, 56, 64, 69, 70, 72, 79, 81, 96, 97, 98, -99, 101, 102, 103, 104, 107, 109, 111, 113, 124, 125, 126, 129, 131, 133, -135, 138, 139, 140, 144, 145, 146, 147, 149, 150, 151, 153, 154, 155, 157, -158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 169, 170, 171, 172, 173, -174, 176, 177, 23, 29, 5, 24, 25, 26, 27, 28, 30, 31, 0, 1, -2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -18, 19, 20, 21, 22, 32, 83, 84, 96, 99, 100, 16, 85, 98, 18, -26, 27, 37, 40, 49, 52, 17, 51, 55, 57, 97, 8, 3, 19, 9, -50, 56, 58, 10, 53, 72, 82, 87, 89, 91, 14, 118, 129, 12, 81, -86, 88, 90, 130, 11, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, -32, 33, 34, 35, 36, 43, 67, 68, 69, 93, 95, 41, 45, 47, 4, -5, 6, 13, 38, 117, 128, 71, 0, 1, 2, 15, 39, 92, 94, 65, -70, 122, 123, 127, 7, 42, 44, 46, 48, 54, 59, 60, 61, 62, 63, -64, 66, 105, 106, 109, 110, 111, 112, 113, 114, 121, 124, 126, 73, 74, -75, 76, 77, 78, 79, 80, 101, 102, 103, 104, 107, 108, 115, 116, 119, -120, 125, 18, 24, 5, 7, 9, 13, 0, 1, 2, 3, 4, 6, 8, -10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 23, 25, 26, 27, -28, 29, 30, 38, 37, 3, 2, 39, 4, 40, 5, 109, 110, 111, 99, -107, 97, 105, 140, 141, 142, 0, 98, 106, 1, 100, 108, 34, 35, 36, -10, 11, 42, 46, 50, 54, 58, 62, 66, 70, 13, 17, 21, 30, 6, -88, 90, 96, 102, 113, 115, 121, 123, 125, 135, 137, 139, 9, 14, 18, -22, 33, 44, 48, 52, 56, 60, 64, 68, 72, 116, 126, 130, 43, 47, -51, 55, 59, 63, 67, 71, 85, 91, 93, 103, 80, 82, 83, 73, 75, -76, 119, 129, 133, 12, 16, 20, 31, 7, 41, 45, 49, 53, 57, 61, -65, 69, 117, 127, 131, 87, 89, 95, 101, 112, 114, 120, 122, 124, 134, -136, 138, 86, 92, 94, 104, 118, 128, 132, 79, 81, 84, 74, 77, 78, -8, 15, 19, 23, 32, 24, 25, 28, 26, 27, 29, 0, 1, 2, 3, -4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, -19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, -49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, -109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, -124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, -139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, -154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 34, 5, 6, 7, -8, 9, 10, 11, 12, 33, 47, 2, 4, 19, 20, 21, 36, 37, 38, -40, 41, 0, 1, 3, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, -26, 27, 28, 29, 30, 31, 32, 35, 39, 42, 43, 44, 45, 46, 48, -49, 50, 144, 145, 0, 141, 142, 143, 155, 154, 139, 140, 146, 147, 150, -151, 76, 82, 83, 84, 85, 86, 87, 158, 131, 77, 132, 159, 23, 24, -25, 26, 27, 28, 32, 33, 73, 79, 91, 95, 1, 3, 5, 12, 13, -14, 15, 16, 17, 18, 19, 20, 21, 22, 29, 30, 31, 34, 102, 104, -106, 108, 112, 113, 114, 115, 116, 117, 118, 119, 138, 37, 39, 41, 43, -48, 50, 52, 54, 2, 4, 6, 7, 8, 9, 10, 11, 36, 38, 40, -42, 44, 45, 46, 47, 56, 57, 58, 59, 60, 62, 64, 66, 68, 70, -72, 74, 75, 78, 80, 81, 88, 89, 90, 92, 93, 94, 96, 97, 98, -100, 103, 105, 107, 109, 137, 160, 161, 162, 35, 49, 51, 53, 55, 61, -63, 65, 67, 69, 71, 99, 101, 110, 111, 120, 121, 122, 123, 124, 125, -126, 127, 128, 129, 130, 133, 134, 135, 136, 148, 149, 152, 153, 156, 157, -4, 11, 5, 6, 7, 8, 10, 9, 12, 17, 18, 19, 21, 2, 3, -0, 1, 13, 14, 15, 16, 20, 28, 32, 34, 38, 40, 22, 23, 24, -25, 26, 27, 29, 30, 31, 33, 35, 36, 37, 39, 41, 73, 69, 95, -11, 72, 14, 12, 13, 93, 71, 74, 94, 87, 81, 86, 79, 60, 96, -98, 88, 59, 82, 97, 44, 46, 54, 68, 92, 100, 45, 53, 67, 43, -91, 99, 80, 89, 77, 1, 3, 9, 5, 6, 7, 8, 70, 28, 83, -22, 34, 42, 49, 51, 57, 17, 23, 29, 37, 63, 19, 25, 31, 39, -48, 50, 52, 56, 58, 62, 64, 66, 84, 76, 90, 78, 75, 85, 4, -0, 2, 10, 20, 26, 32, 36, 40, 15, 61, 16, 18, 24, 30, 35, -38, 47, 55, 65, 21, 27, 33, 41, 0, 1, 2, 3, 4, 5, 6, -7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, -22, 23, 24, 25, 26, 40, 42, 3, 1, 51, 5, 49, 48, 22, 24, -4, 2, 52, 50, 76, 78, 80, 94, 96, 98, 23, 47, 26, 27, 63, -64, 65, 70, 71, 21, 77, 79, 81, 17, 20, 33, 37, 41, 43, 57, -55, 56, 58, 59, 60, 61, 62, 18, 19, 25, 32, 36, 95, 97, 99, -0, 38, 39, 54, 67, 69, 73, 75, 85, 87, 91, 93, 53, 66, 84, -86, 90, 89, 6, 7, 11, 12, 13, 82, 83, 68, 72, 74, 92, 8, -9, 10, 14, 15, 16, 28, 29, 30, 31, 34, 35, 44, 45, 46, 88, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, -30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, -45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, -60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, -90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, -105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -120, 121, 122, 123, 124, 125, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, -84, 85, 86, 87, 88, 89, 90, 91, 92, 0, 1, 2, 3, 4, 5, -6, 7, 8, 1, 3, 43, 0, 2, 4, 5, 6, 7, 8, 9, 10, -11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, -41, 42, 44, 45, 46, 89, 90, 0, 1, 2, 3, 4, 5, 6, 7, -8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, -38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, -68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, -83, 84, 85, 86, 87, 88, 91, 92, 93, 94, 95, 96, 97, 98, 99, -100, 101, 102, 103, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 186, 189, 174, -185, 179, 180, 177, 181, 188, 191, 60, 63, 175, 183, 176, 184, 64, 61, -62, 65, 178, 182, 187, 190, 130, 142, 154, 166, 104, 110, 116, 13, 24, -36, 78, 122, 136, 148, 160, 172, 7, 18, 30, 84, 102, 108, 114, 105, -111, 117, 120, 123, 74, 86, 98, 107, 113, 119, 125, 1, 9, 20, 32, -44, 45, 55, 75, 99, 103, 109, 115, 0, 6, 19, 31, 42, 43, 54, -72, 73, 85, 96, 97, 137, 149, 161, 173, 2, 46, 47, 56, 76, 77, -100, 101, 127, 133, 139, 145, 151, 157, 163, 169, 8, 21, 33, 87, 106, -112, 118, 121, 124, 128, 129, 140, 141, 152, 153, 3, 4, 15, 26, 38, -48, 49, 50, 51, 57, 58, 66, 67, 68, 69, 80, 90, 91, 92, 93, -126, 131, 134, 138, 143, 146, 150, 155, 158, 162, 167, 170, 10, 11, 22, -23, 34, 35, 88, 89, 135, 147, 159, 171, 5, 12, 14, 16, 17, 25, -27, 28, 29, 37, 39, 40, 41, 52, 53, 59, 70, 71, 79, 81, 82, -83, 94, 95, 132, 144, 156, 164, 165, 168, 756, 759, 761, 104, 105, 640, -647, 700, 107, 757, 760, 102, 222, 224, 310, 420, 431, 441, 460, 468, 491, -494, 501, 558, 571, 654, 666, 683, 722, 7, 10, 31, 34, 60, 65, 162, -165, 178, 434, 467, 477, 480, 550, 569, 657, 671, 682, 718, 751, 13, 37, -54, 175, 181, 262, 265, 313, 385, 465, 551, 563, 641, 645, 701, 719, 253, -316, 333, 339, 364, 365, 369, 371, 436, 439, 461, 496, 499, 505, 514, 520, -522, 577, 585, 588, 598, 601, 608, 617, 622, 685, 727, 733, 223, 240, 191, -709, 92, 115, 144, 199, 248, 252, 290, 307, 338, 372, 382, 410, 475, 508, -513, 515, 527, 547, 566, 567, 572, 580, 587, 590, 595, 604, 606, 615, 619, -688, 716, 725, 730, 735, 739, 747, 11, 16, 22, 23, 35, 40, 46, 47, -52, 53, 59, 64, 88, 89, 94, 103, 118, 121, 124, 138, 143, 149, 163, -164, 179, 184, 190, 202, 205, 208, 225, 244, 245, 250, 259, 268, 280, 281, -284, 285, 291, 322, 328, 332, 340, 373, 379, 388, 400, 401, 404, 405, 411, -421, 426, 428, 429, 437, 442, 450, 455, 457, 469, 478, 481, 488, 497, 502, -529, 530, 536, 537, 540, 553, 564, 570, 625, 626, 630, 635, 637, 643, 655, -656, 668, 670, 678, 681, 691, 692, 699, 703, 704, 724, 738, 749, 750, 753, -560, 574, 723, 85, 331, 470, 101, 217, 633, 642, 697, 742, 745, 754, 19, -43, 48, 187, 324, 97, 218, 296, 416, 130, 137, 166, 226, 241, 271, 279, -319, 327, 391, 399, 440, 482, 142, 283, 325, 403, 443, 453, 485, 758, 0, -24, 67, 298, 336, 346, 464, 489, 504, 507, 510, 516, 518, 521, 523, 524, -535, 552, 559, 573, 576, 579, 582, 583, 591, 592, 594, 599, 602, 603, 607, -611, 614, 616, 620, 623, 632, 644, 649, 651, 661, 663, 667, 669, 684, 687, -696, 708, 720, 726, 729, 732, 736, 1, 2, 3, 4, 5, 6, 8, 9, -12, 14, 15, 17, 18, 20, 21, 25, 26, 27, 28, 29, 30, 32, 33, -36, 38, 39, 41, 42, 44, 45, 49, 50, 51, 55, 56, 57, 58, 61, -62, 63, 66, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, -80, 81, 82, 83, 84, 86, 87, 90, 91, 93, 95, 96, 98, 99, 100, -106, 108, 109, 110, 111, 112, 113, 114, 116, 117, 119, 120, 122, 123, 125, -126, 127, 128, 129, 131, 132, 133, 134, 135, 136, 139, 140, 141, 145, 146, -147, 148, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 167, -168, 169, 170, 171, 172, 173, 174, 176, 177, 180, 182, 183, 185, 186, 188, -189, 192, 193, 194, 195, 196, 197, 198, 200, 201, 203, 204, 206, 207, 209, -210, 211, 212, 213, 214, 215, 216, 219, 220, 221, 227, 228, 229, 230, 231, -232, 233, 234, 235, 236, 237, 238, 239, 242, 243, 246, 247, 249, 251, 254, -255, 256, 257, 258, 260, 261, 263, 264, 266, 267, 269, 270, 272, 273, 274, -275, 276, 277, 278, 282, 286, 287, 288, 289, 292, 293, 294, 295, 297, 299, -300, 301, 302, 303, 304, 305, 306, 308, 309, 311, 312, 314, 315, 317, 318, -320, 321, 323, 326, 329, 330, 334, 335, 337, 341, 342, 343, 344, 345, 347, -348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, -363, 366, 367, 368, 370, 374, 375, 376, 377, 378, 380, 381, 383, 384, 386, -387, 389, 390, 392, 393, 394, 395, 396, 397, 398, 402, 406, 407, 408, 409, -412, 413, 414, 415, 417, 418, 419, 422, 423, 424, 425, 427, 430, 432, 433, -435, 438, 444, 445, 446, 447, 448, 449, 451, 452, 454, 456, 458, 459, 462, -463, 466, 471, 472, 473, 474, 476, 479, 483, 484, 486, 487, 490, 492, 493, -495, 498, 500, 503, 506, 509, 511, 512, 517, 519, 525, 526, 528, 531, 532, -533, 534, 538, 539, 541, 542, 543, 544, 545, 546, 548, 549, 554, 555, 556, -557, 561, 562, 565, 568, 575, 578, 581, 584, 586, 589, 593, 596, 597, 600, -605, 609, 610, 612, 613, 618, 621, 624, 627, 628, 629, 631, 634, 636, 638, -639, 646, 648, 650, 652, 653, 658, 659, 660, 662, 664, 665, 672, 673, 674, -675, 676, 677, 679, 680, 686, 689, 690, 693, 694, 695, 698, 702, 705, 706, -707, 710, 711, 712, 713, 714, 715, 717, 721, 728, 731, 734, 737, 740, 741, -743, 744, 746, 748, 752, 755, 325, 326, 324, 15, 258, 103, 123, 3, 9, -124, 331, 14, 259, 16, 2, 8, 337, 102, 335, 340, 4, 10, 17, 120, -246, 247, 276, 333, 334, 33, 72, 128, 338, 5, 11, 76, 105, 127, 0, -13, 74, 73, 122, 1, 75, 7, 300, 336, 364, 6, 12, 228, 235, 263, -265, 270, 280, 291, 106, 297, 77, 135, 162, 169, 192, 199, 201, 214, 216, -225, 260, 262, 104, 306, 316, 339, 170, 200, 223, 341, 137, 160, 190, 203, -215, 218, 141, 150, 157, 171, 180, 187, 312, 313, 317, 39, 125, 143, 148, -158, 173, 178, 188, 308, 318, 107, 322, 362, 35, 91, 97, 109, 299, 230, -272, 293, 244, 256, 289, 323, 367, 38, 121, 302, 303, 311, 327, 245, 257, -261, 290, 305, 234, 264, 279, 34, 36, 79, 85, 115, 126, 298, 307, 309, -319, 328, 57, 63, 69, 198, 229, 271, 292, 82, 88, 90, 96, 108, 118, -304, 320, 329, 37, 41, 80, 86, 116, 301, 332, 139, 159, 164, 168, 189, -194, 205, 213, 217, 220, 222, 40, 136, 145, 167, 177, 197, 202, 212, 227, -18, 27, 48, 363, 237, 267, 282, 196, 240, 241, 252, 253, 285, 286, 142, -147, 152, 155, 156, 172, 175, 182, 185, 186, 310, 321, 330, 346, 347, 348, -355, 138, 163, 165, 193, 195, 204, 210, 219, 226, 131, 132, 208, 250, 251, -278, 314, 315, 357, 365, 140, 146, 179, 206, 211, 20, 29, 50, 161, 166, -191, 221, 224, 269, 368, 26, 44, 47, 58, 64, 70, 81, 87, 117, 144, -151, 153, 174, 181, 183, 93, 99, 111, 232, 274, 295, 59, 65, 71, 133, -134, 149, 154, 176, 184, 209, 350, 361, 239, 242, 254, 284, 287, 268, 56, -62, 68, 78, 84, 94, 100, 112, 114, 92, 98, 110, 238, 283, 55, 61, -67, 349, 236, 243, 255, 266, 281, 288, 19, 24, 28, 42, 45, 49, 129, -130, 207, 248, 249, 277, 354, 359, 360, 233, 275, 296, 352, 353, 22, 31, -52, 54, 60, 66, 83, 89, 95, 101, 113, 119, 342, 345, 366, 231, 273, -294, 25, 43, 46, 23, 32, 53, 343, 351, 358, 21, 30, 51, 344, 356, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, -30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, -45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, -60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, -90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, -105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, -135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, -150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, -165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, -180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, -195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, -210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, -225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, -240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, -255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, -270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, -285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, -300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, -315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, -330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, -345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, -360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, -375, 376, 377, 19, 29, 33, 45, 86, 88, 90, 92, 18, 27, 31, 47, -82, 103, 37, 41, 55, 87, 11, 35, 39, 43, 49, 51, 53, 57, 61, -63, 89, 91, 105, 109, 114, 20, 9, 13, 107, 28, 30, 32, 34, 46, -48, 78, 84, 133, 135, 93, 112, 134, 136, 36, 40, 62, 66, 80, 38, -42, 44, 50, 52, 54, 56, 58, 64, 127, 131, 137, 1, 15, 16, 21, -22, 102, 111, 113, 128, 132, 138, 23, 25, 59, 68, 70, 94, 69, 3, -4, 6, 7, 10, 104, 106, 108, 110, 121, 123, 67, 24, 26, 60, 122, -124, 72, 76, 81, 96, 85, 74, 98, 129, 83, 125, 0, 2, 5, 8, -12, 14, 17, 71, 73, 75, 77, 79, 95, 97, 99, 100, 126, 65, 130, -101, 118, 116, 120, 115, 117, 119, 219, 220, 221, 127, 131, 135, 139, 228, -229, 230, 231, 232, 233, 234, 235, 222, 223, 224, 225, 226, 227, 236, 237, -238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, -253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 275, -276, 277, 278, 9, 13, 17, 21, 25, 29, 36, 40, 44, 48, 49, 56, -60, 64, 68, 72, 76, 80, 84, 171, 176, 180, 184, 0, 1, 2, 3, -4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 22, -23, 24, 26, 27, 28, 30, 31, 32, 33, 34, 35, 37, 38, 39, 41, -42, 43, 45, 46, 47, 50, 51, 52, 53, 54, 55, 57, 58, 59, 61, -62, 63, 65, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 79, 81, -82, 83, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, -113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, -129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 143, 144, 145, 146, -147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 173, 174, 175, 177, 178, -179, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, -196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, -211, 212, 213, 214, 215, 216, 217, 218, 267, 268, 269, 270, 271, 272, 273, -274, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 1, 2, -3, 4, 0, 8, 12, 11, 102, 127, 6, 5, 101, 7, 128, 4, 3, -10, 1, 2, 0, 9, 92, 90, 97, 114, 94, 95, 99, 112, 111, 123, -116, 118, 120, 121, 125, 98, 89, 91, 96, 93, 100, 113, 24, 34, 16, -36, 14, 22, 13, 21, 33, 18, 26, 30, 115, 117, 124, 119, 122, 126, -17, 25, 29, 104, 19, 27, 31, 106, 28, 20, 32, 15, 23, 35, 54, -56, 110, 51, 72, 88, 38, 40, 49, 58, 60, 64, 66, 74, 81, 105, -107, 37, 39, 50, 52, 57, 59, 63, 65, 71, 73, 82, 87, 42, 43, -45, 48, 61, 67, 70, 76, 77, 79, 83, 86, 53, 55, 41, 44, 46, -47, 62, 68, 69, 75, 78, 80, 84, 85, 109, 103, 108, 7, 8, 6, -9, 17, 10, 28, 26, 24, 50, 68, 4, 34, 5, 0, 23, 46, 2, -18, 33, 1, 85, 19, 58, 62, 70, 29, 31, 35, 3, 25, 27, 47, -48, 49, 51, 11, 90, 30, 32, 36, 40, 41, 42, 43, 44, 45, 12, -13, 14, 15, 16, 20, 21, 22, 37, 38, 39, 52, 53, 54, 55, 56, -57, 59, 60, 61, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, -76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 88, 125, -101, 103, 124, 127, 134, 135, 25, 29, 37, 45, 165, 177, 163, 180, 138, -142, 113, 24, 28, 36, 40, 41, 44, 48, 49, 58, 59, 60, 61, 66, -67, 68, 69, 70, 71, 72, 73, 89, 92, 93, 145, 148, 149, 94, 105, -109, 151, 154, 161, 173, 96, 99, 100, 102, 104, 107, 108, 111, 114, 115, -116, 118, 119, 120, 122, 123, 126, 132, 133, 136, 137, 140, 141, 155, 156, -159, 160, 164, 169, 171, 172, 175, 176, 179, 181, 182, 183, 0, 1, 2, -3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -18, 19, 20, 21, 22, 23, 26, 27, 30, 31, 32, 33, 34, 35, 38, -39, 42, 43, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 62, 63, -64, 65, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, -87, 90, 91, 95, 97, 98, 106, 110, 112, 117, 121, 128, 129, 130, 131, -139, 143, 144, 146, 147, 150, 152, 153, 157, 158, 162, 166, 167, 168, 170, -174, 178, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, 1, 2, 3, -4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, -19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, -49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, -109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, -124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, -139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, -154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, -169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, -184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, -199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, -214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, -229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, -244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, -259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, -289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, -304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, -349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, -364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, -394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, -409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, -439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, -454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, -469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, -484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, -514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, -529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, -544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, -559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, -574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, -589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, -604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, -619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, -634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, -649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, -664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, -679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, -694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, -709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, -724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, -739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, -754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, -769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, -784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, -799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, -814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, -829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, -844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, -859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, -874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, -889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, -904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, -919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, -934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, -949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, -964, 965, 966, 967, 968, 969, 970, 971, 306, 146, 158, 174, 216, 233, 27, -29, 121, 123, 125, 127, 144, 150, 152, 173, 188, 218, 295, 299, 307, 0, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 30, 31, 32, -33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, -78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 122, 124, -126, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, -142, 143, 145, 147, 148, 149, 151, 153, 154, 155, 156, 157, 159, 160, 161, -162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 175, 176, 177, 178, -179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, -195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, -210, 211, 212, 213, 214, 215, 217, 219, 220, 221, 222, 223, 224, 225, 226, -227, 228, 229, 230, 231, 232, 234, 235, 236, 237, 238, 239, 240, 241, 242, -243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, -258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, -273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, -288, 289, 290, 291, 292, 293, 294, 296, 297, 298, 300, 301, 302, 303, 304, -305, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, -322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, -337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, -352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -367, 368, 369, 370, 371, 372, 373, 374, 76, 106, 77, 107, 125, 115, 126, -60, 61, 71, 59, 96, 99, 110, 89, 70, 58, 25, 27, 33, 35, 86, -87, 72, 75, 79, 94, 112, 95, 100, 73, 74, 78, 101, 102, 105, 109, -88, 26, 32, 34, 103, 104, 108, 24, 97, 98, 113, 114, 44, 64, 69, -36, 38, 41, 43, 47, 54, 57, 63, 66, 111, 37, 39, 40, 42, 45, -46, 55, 56, 62, 65, 67, 68, 90, 92, 5, 11, 9, 84, 8, 4, -10, 2, 48, 50, 52, 81, 82, 0, 6, 12, 14, 85, 80, 83, 49, -51, 53, 91, 93, 118, 121, 124, 3, 17, 18, 21, 22, 29, 30, 1, -7, 13, 15, 116, 119, 122, 129, 16, 19, 20, 23, 28, 31, 117, 120, -123, 127, 128, 130, 3, 4, 5, 6, 25, 26, 27, 28, 29, 33, 41, -54, 61, 62, 99, 101, 105, 106, 107, 108, 133, 134, 0, 7, 30, 83, -86, 87, 88, 90, 91, 92, 93, 135, 136, 137, 1, 2, 31, 32, 34, -100, 102, 103, 104, 119, 132, 138, 139, 140, 16, 21, 22, 23, 24, 44, -51, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 8, 9, 10, -11, 12, 13, 14, 15, 35, 36, 42, 43, 46, 48, 49, 50, 52, 60, -63, 77, 78, 79, 80, 81, 82, 85, 89, 94, 95, 96, 97, 98, 109, -110, 111, 112, 113, 114, 115, 120, 121, 17, 18, 19, 20, 37, 38, 39, -40, 45, 47, 53, 55, 56, 57, 58, 59, 68, 70, 84, 116, 117, 118, -122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 141, 142, 143, 144, 145, -146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, -176, 177, 178, 179, 180, 181, 182, 49, 18, 16, 17, 42, 45, 15, 8, -46, 39, 6, 48, 7, 9, 10, 41, 44, 5, 40, 43, 30, 47, 51, -52, 25, 19, 20, 21, 22, 23, 24, 3, 4, 29, 31, 32, 33, 34, -35, 36, 37, 38, 71, 73, 11, 12, 13, 14, 50, 70, 0, 1, 2, -26, 27, 28, 60, 62, 69, 61, 63, 64, 65, 72, 75, 76, 54, 55, -56, 57, 58, 59, 66, 68, 81, 82, 83, 84, 86, 74, 53, 67, 77, -78, 79, 80, 85, 87, 88, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, -84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, -99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, -114, 115, 116, 117, 118, 119, 120, 121, 122, 0, 1, 2, 3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -21, 100, 31, 35, 41, 33, 30, 34, 40, 82, 81, 103, 47, 32, 15, -99, 46, 9, 21, 8, 69, 65, 67, 14, 62, 57, 58, 60, 80, 56, -20, 11, 97, 10, 85, 86, 1, 22, 26, 36, 16, 17, 78, 79, 105, -108, 5, 24, 28, 38, 44, 45, 59, 61, 63, 70, 109, 111, 0, 4, -25, 29, 39, 50, 51, 54, 55, 71, 72, 73, 74, 75, 76, 77, 95, -96, 101, 102, 104, 110, 98, 18, 19, 83, 84, 89, 23, 27, 37, 42, -43, 48, 113, 2, 3, 6, 7, 12, 13, 49, 52, 53, 87, 88, 90, -91, 92, 93, 94, 106, 107, 112, 64, 66, 68, 5, 4, 0, 39, 48, -17, 8, 6, 7, 77, 78, 75, 76, 79, 80, 16, 15, 73, 56, 55, -74, 40, 41, 42, 60, 9, 10, 11, 12, 13, 14, 59, 43, 62, 1, -2, 3, 44, 61, 58, 68, 22, 23, 28, 35, 36, 45, 46, 47, 57, -67, 69, 70, 71, 19, 18, 20, 21, 24, 25, 26, 27, 29, 30, 31, -32, 33, 34, 37, 38, 49, 50, 51, 52, 53, 54, 63, 64, 65, 66, -72, 81, 82, 83, 84, 34, 44, 71, 32, 43, 30, 35, 72, 33, 11, -10, 39, 37, 13, 38, 42, 36, 12, 41, 31, 8, 9, 40, 50, 69, -55, 20, 24, 28, 135, 1, 5, 15, 136, 70, 46, 51, 114, 115, 45, -3, 7, 17, 113, 116, 54, 128, 129, 134, 138, 0, 4, 14, 26, 19, -23, 27, 48, 62, 63, 68, 123, 124, 125, 126, 131, 132, 29, 49, 59, -60, 66, 127, 130, 133, 86, 110, 119, 57, 58, 65, 83, 87, 103, 111, -122, 18, 22, 82, 102, 61, 64, 67, 21, 25, 52, 2, 6, 16, 75, -76, 85, 90, 95, 99, 100, 109, 120, 56, 73, 74, 77, 78, 79, 80, -81, 84, 88, 89, 91, 92, 93, 94, 96, 97, 98, 101, 104, 105, 106, -107, 108, 112, 117, 118, 121, 137, 47, 53, 4, 5, 0, 1, 2, 3, -7, 8, 6, 9, 10, 20, 25, 27, 18, 19, 21, 23, 24, 26, 28, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 17, 22, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, -40, 41, 76, 96, 112, 109, 110, 94, 95, 49, 73, 56, 61, 65, 68, -102, 30, 37, 38, 40, 41, 44, 45, 47, 48, 55, 57, 59, 60, 79, -82, 88, 89, 90, 91, 92, 98, 100, 105, 108, 111, 0, 1, 2, 3, -4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, -19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34, -35, 36, 39, 42, 43, 46, 50, 51, 52, 53, 54, 58, 62, 63, 64, -66, 67, 69, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84, 85, -86, 87, 93, 97, 99, 101, 103, 104, 106, 107, 113, 91, 42, 46, 77, -26, 8, 78, 41, 43, 44, 47, 68, 5, 30, 45, 89, 90, 48, 49, -50, 51, 25, 76, 93, 14, 70, 88, 4, 23, 24, 29, 59, 63, 75, -79, 92, 97, 0, 1, 2, 6, 7, 15, 16, 17, 20, 21, 27, 31, -32, 33, 34, 35, 36, 62, 64, 67, 72, 61, 66, 71, 86, 94, 12, -74, 55, 58, 60, 81, 83, 3, 9, 10, 11, 13, 18, 19, 22, 28, -37, 38, 39, 40, 53, 56, 65, 69, 73, 82, 84, 85, 52, 54, 57, -80, 87, 95, 96, 1, 8, 10, 13, 12, 6, 2, 0, 11, 9, 5, -25, 7, 19, 43, 44, 45, 32, 33, 34, 50, 51, 52, 26, 22, 23, -3, 4, 28, 15, 36, 37, 49, 30, 31, 29, 14, 20, 21, 24, 27, -17, 39, 46, 16, 35, 53, 38, 40, 41, 42, 18, 47, 48, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, -47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, -77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, -92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, -107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, -122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 49, 310, 312, -314, 269, 271, 273, 275, 277, 279, 281, 297, 299, 0, 1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, -20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, -51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, -66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, -81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, -96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, -126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, -141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, -156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, -171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, -186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, -216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, -231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, -246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, -261, 262, 263, 264, 265, 266, 267, 268, 270, 272, 274, 276, 278, 280, 282, -283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, -300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 311, 313, 315, 316, 317, -318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, -333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, -348, 349, 350, 351, 352, 353, 354, 355, 179, 200, 161, 175, 243, 100, 104, -196, 198, 223, 227, 176, 203, 212, 215, 162, 163, 247, 160, 174, 216, 218, -158, 172, 96, 157, 166, 170, 197, 199, 217, 219, 159, 173, 178, 201, 99, -101, 103, 105, 177, 202, 213, 214, 98, 102, 92, 108, 112, 116, 120, 124, -128, 132, 184, 192, 208, 180, 188, 204, 239, 249, 221, 225, 154, 165, 169, -51, 53, 55, 57, 59, 63, 67, 71, 75, 79, 83, 87, 95, 119, 123, -127, 131, 138, 142, 146, 150, 183, 191, 207, 236, 241, 245, 250, 61, 65, -69, 73, 77, 81, 85, 89, 93, 109, 113, 117, 140, 144, 148, 152, 8, -9, 14, 15, 20, 21, 50, 52, 54, 56, 91, 107, 111, 115, 121, 125, -129, 133, 134, 135, 136, 137, 141, 145, 149, 153, 155, 164, 168, 181, 187, -189, 195, 205, 211, 58, 62, 66, 70, 74, 78, 82, 86, 118, 122, 126, -130, 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 16, 17, -18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, -60, 64, 68, 72, 76, 80, 84, 88, 139, 143, 147, 151, 186, 194, 210, -222, 226, 238, 242, 246, 248, 94, 97, 156, 167, 171, 228, 230, 90, 106, -110, 114, 220, 224, 237, 240, 244, 251, 182, 185, 190, 193, 206, 209, 229, -231, 232, 233, 234, 235, 24, 51, 54, 111, 25, 52, 55, 112, 13, 31, -34, 37, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 27, 28, 29, 30, -32, 33, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, -49, 50, 53, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, -68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, -83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 113, 114, -115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, -130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 0, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -16, 17, 8, 16, 18, 7, 26, 30, 34, 104, 14, 15, 17, 19, 22, -48, 68, 73, 75, 79, 11, 1, 6, 20, 28, 32, 36, 38, 40, 44, -98, 102, 103, 105, 106, 115, 2, 13, 21, 23, 49, 53, 54, 55, 56, -57, 58, 60, 61, 64, 66, 67, 69, 76, 83, 85, 95, 100, 10, 0, -3, 4, 5, 9, 12, 24, 25, 27, 29, 31, 33, 35, 37, 39, 41, -42, 43, 45, 46, 47, 50, 51, 52, 59, 62, 63, 65, 70, 71, 72, -74, 77, 78, 80, 81, 82, 84, 86, 87, 88, 89, 90, 91, 92, 93, -94, 96, 97, 99, 101, 107, 108, 109, 110, 111, 112, 113, 114, 116, 117, -118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 121, 120, 103, 101, 102, -86, 111, 124, 27, 44, 100, 10, 13, 82, 92, 98, 78, 88, 94, 42, -40, 9, 11, 12, 14, 80, 84, 90, 96, 45, 119, 122, 46, 48, 50, -52, 104, 106, 109, 110, 1, 4, 18, 25, 29, 32, 19, 34, 22, 5, -8, 38, 107, 39, 16, 17, 21, 26, 30, 33, 43, 87, 125, 41, 83, -93, 99, 2, 24, 28, 31, 35, 53, 55, 81, 91, 97, 105, 0, 3, -7, 6, 15, 20, 23, 36, 37, 47, 49, 51, 54, 56, 57, 58, 59, -60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -75, 76, 77, 79, 85, 89, 95, 108, 112, 113, 114, 115, 116, 117, 118, -123, 161, 57, 60, 95, 169, 165, 171, 0, 160, 40, 168, 164, 39, 58, -59, 96, 1, 2, 50, 55, 64, 75, 85, 92, 97, 71, 77, 81, 87, -6, 16, 30, 44, 181, 170, 49, 56, 63, 76, 86, 91, 98, 174, 180, -5, 15, 29, 43, 72, 78, 82, 88, 113, 126, 194, 195, 198, 158, 159, -162, 163, 114, 125, 144, 145, 166, 167, 192, 193, 156, 47, 48, 51, 52, -53, 54, 61, 62, 65, 66, 83, 84, 89, 90, 93, 94, 99, 100, 101, -102, 103, 104, 130, 131, 132, 133, 134, 135, 152, 175, 176, 177, 67, 69, -73, 79, 105, 3, 4, 7, 8, 13, 14, 17, 18, 19, 20, 25, 26, -27, 28, 31, 32, 33, 34, 37, 38, 41, 42, 45, 46, 68, 70, 74, -80, 106, 117, 118, 142, 143, 178, 179, 138, 9, 140, 147, 148, 107, 109, -111, 139, 141, 146, 149, 182, 183, 184, 185, 190, 191, 115, 119, 121, 123, -137, 155, 157, 187, 189, 197, 10, 11, 12, 21, 22, 23, 24, 35, 36, -108, 110, 112, 116, 120, 122, 124, 127, 128, 129, 136, 150, 151, 153, 154, -173, 186, 188, 196, 172, 37, 36, 33, 32, 35, 34, 4, 2, 6, 0, -44, 45, 47, 46, 42, 43, 39, 41, 40, 38, 5, 7, 3, 1, 51, -17, 11, 15, 19, 9, 13, 10, 14, 18, 16, 23, 24, 27, 28, 31, -8, 12, 20, 22, 21, 25, 26, 29, 30, 49, 48, 50, 179, 176, 165, -178, 171, 175, 174, 177, 162, 168, 190, 188, 202, 200, 33, 75, 93, 51, -81, 87, 173, 164, 157, 114, 3, 6, 156, 15, 21, 27, 170, 167, 123, -63, 69, 39, 45, 57, 199, 211, 172, 208, 205, 214, 181, 184, 203, 196, -169, 198, 201, 160, 161, 137, 163, 125, 209, 119, 183, 215, 166, 207, 204, -213, 197, 191, 206, 210, 182, 212, 187, 185, 53, 83, 89, 192, 186, 193, -136, 180, 194, 130, 142, 154, 155, 148, 149, 131, 143, 116, 32, 74, 92, -122, 101, 107, 110, 113, 98, 104, 71, 65, 41, 47, 59, 2, 11, 14, -20, 26, 195, 189, 147, 150, 151, 145, 133, 127, 139, 126, 138, 132, 144, -117, 159, 52, 82, 88, 158, 120, 96, 102, 108, 99, 105, 111, 30, 72, -90, 8, 5, 9, 0, 124, 97, 103, 109, 12, 18, 24, 48, 78, 84, -66, 60, 70, 62, 35, 77, 95, 68, 42, 50, 80, 86, 17, 23, 29, -36, 54, 38, 44, 56, 152, 153, 64, 40, 58, 46, 128, 140, 129, 134, -135, 141, 146, 106, 100, 112, 121, 7, 4, 115, 118, 34, 61, 76, 94, -16, 22, 28, 37, 43, 55, 49, 79, 85, 67, 1, 13, 19, 25, 31, -73, 91, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, -72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, -87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, -102, 103, 104, 105, 106, 107, 108, 109, 110, 2, 5, 8, 11, 14, 17, -20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, -65, 68, 0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, -19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34, 36, 37, 39, 40, -42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 61, 63, -64, 66, 67, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -53, 52, 72, 71, 73, 70, 97, 98, 96, 99, 68, 80, 82, 74, 77, -78, 5, 22, 25, 41, 49, 1, 9, 17, 95, 103, 102, 104, 75, 76, -79, 66, 69, 93, 67, 94, 81, 83, 84, 85, 86, 87, 88, 89, 90, -91, 106, 107, 92, 100, 101, 105, 32, 34, 38, 12, 15, 54, 58, 62, -39, 14, 36, 57, 61, 65, 31, 35, 47, 29, 45, 42, 28, 44, 30, -46, 18, 16, 55, 59, 63, 40, 21, 26, 50, 3, 7, 11, 19, 0, -4, 8, 33, 37, 20, 23, 24, 27, 43, 48, 51, 2, 6, 10, 13, -56, 60, 64, 0, 2, 1, 11, 5, 6, 12, 3, 4, 9, 10, 14, -7, 8, 13, 21, 36, 18, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 37, 15, 16, 22, 17, 19, 20, 0, 1, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 48, 5, 34, 63, -4, 62, 50, 47, 49, 33, 35, 36, 29, 3, 6, 61, 64, 54, 58, -45, 32, 51, 56, 60, 70, 57, 40, 46, 11, 55, 59, 44, 53, 65, -72, 14, 15, 17, 20, 22, 27, 66, 68, 69, 71, 26, 19, 67, 1, -9, 12, 7, 25, 24, 28, 30, 31, 10, 8, 16, 18, 21, 23, 52, -0, 2, 41, 42, 43, 13, 37, 38, 39, 107, 15, 97, 100, 101, 105, -99, 33, 81, 79, 80, 34, 92, 95, 86, 48, 118, 41, 43, 119, 35, -36, 37, 75, 102, 103, 104, 23, 24, 25, 26, 31, 4, 17, 19, 21, -22, 27, 38, 39, 52, 56, 58, 64, 70, 72, 82, 47, 87, 51, 55, -57, 77, 78, 98, 116, 117, 28, 29, 30, 32, 40, 42, 5, 7, 9, -93, 96, 1, 2, 3, 6, 8, 10, 12, 54, 59, 65, 66, 68, 69, -71, 73, 74, 76, 83, 84, 89, 90, 106, 109, 111, 112, 114, 44, 45, -46, 49, 50, 11, 53, 16, 18, 20, 0, 13, 14, 60, 61, 62, 63, -67, 85, 88, 91, 94, 108, 110, 113, 115, 13, 4, 46, 47, 2, 6, -37, 38, 43, 51, 54, 55, 58, 67, 69, 0, 1, 3, 5, 7, 8, -9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 39, 40, 41, -42, 44, 45, 48, 49, 50, 52, 53, 56, 57, 59, 60, 61, 62, 63, -64, 65, 66, 68, 70, 71, 72, 73, 74, 75, 7, 4, 6, 5, 2, -3, 9, 8, 0, 1, 23, 22, 24, 25, 14, 26, 30, 34, 10, 11, -12, 13, 15, 16, 17, 18, 19, 20, 21, 27, 28, 29, 31, 32, 33, -35, 36, 37, 0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, -40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, -55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, -70, 71, 72, 73, 0, 1, 2, 3, 4, 4, 0, 1, 2, 3, 5, -6, 7, 8, 0, 1, 2, 3, 4, 5, 323, 139, 149, 165, 207, 234, -320, 296, 300, 20, 44, 45, 52, 138, 147, 189, 191, 192, 193, 210, 213, -215, 217, 226, 232, 236, 238, 293, 322, 325, 74, 122, 306, 150, 264, 4, -5, 197, 201, 117, 172, 188, 195, 203, 222, 244, 245, 265, 271, 291, 292, -332, 2, 18, 19, 22, 34, 46, 57, 82, 84, 85, 88, 89, 120, 130, -133, 134, 136, 137, 140, 142, 143, 145, 146, 148, 153, 159, 160, 161, 162, -166, 169, 173, 184, 185, 209, 211, 219, 228, 229, 231, 237, 240, 242, 243, -246, 247, 248, 251, 253, 254, 257, 286, 294, 298, 324, 335, 33, 98, 118, -200, 204, 303, 305, 327, 100, 196, 205, 275, 123, 126, 282, 0, 1, 3, -6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 21, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, -42, 43, 47, 48, 49, 50, 51, 53, 54, 55, 56, 58, 59, 60, 61, -62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, -78, 79, 80, 81, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, -99, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, -115, 116, 119, 121, 124, 125, 127, 128, 129, 131, 132, 135, 141, 144, 151, -152, 154, 155, 156, 157, 158, 163, 164, 167, 168, 170, 171, 174, 175, 176, -177, 178, 179, 180, 181, 182, 183, 186, 187, 190, 194, 198, 199, 202, 206, -208, 212, 214, 216, 218, 220, 221, 223, 224, 225, 227, 230, 233, 235, 239, -241, 249, 250, 252, 255, 256, 258, 259, 260, 261, 262, 263, 266, 267, 268, -269, 270, 272, 273, 274, 276, 277, 278, 279, 280, 281, 283, 284, 285, 287, -288, 289, 290, 295, 297, 299, 301, 302, 304, 307, 308, 309, 310, 311, 312, -313, 314, 315, 316, 317, 318, 319, 321, 326, 328, 329, 330, 331, 333, 334, -336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, -351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, -47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, -77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, -92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, -107, 108, 109, 4, 5, 18, 20, 0, 1, 2, 3, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 22, 23, 24, 25, 26, -0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, -40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, -55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, -70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, -85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, -100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, -115, 116, 117, 118, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, -41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, -56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, -71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, -86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -101, 102, 103, 104, 105, 106, 107, 38, 40, 39, 65, 63, 66, 26, 28, -11, 20, 24, 32, 108, 8, 47, 45, 48, 49, 105, 109, 139, 75, 124, -18, 22, 30, 34, 111, 102, 114, 118, 77, 123, 133, 1, 5, 17, 46, -69, 73, 81, 29, 78, 101, 37, 50, 64, 9, 51, 55, 61, 76, 68, -72, 84, 2, 6, 14, 19, 23, 35, 67, 71, 79, 83, 107, 113, 115, -117, 137, 147, 36, 10, 27, 53, 57, 59, 135, 13, 103, 104, 126, 3, -7, 15, 41, 44, 54, 58, 60, 70, 74, 80, 82, 0, 4, 12, 16, -21, 25, 31, 33, 42, 43, 52, 56, 62, 85, 88, 91, 94, 106, 110, -112, 116, 119, 120, 121, 122, 125, 127, 128, 129, 130, 131, 132, 134, 136, -138, 140, 141, 142, 143, 144, 145, 146, 148, 89, 86, 87, 90, 92, 93, -95, 96, 97, 98, 99, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 1, 2, 4, 32, 36, 38, 3, 34, 28, 31, 35, -37, 6, 12, 14, 19, 20, 22, 33, 39, 43, 53, 54, 55, 56, 57, -61, 67, 69, 70, 71, 30, 0, 5, 7, 8, 9, 10, 11, 13, 15, -16, 17, 18, 21, 23, 24, 25, 26, 27, 29, 40, 41, 42, 44, 45, -46, 47, 48, 49, 50, 51, 52, 58, 59, 60, 62, 63, 64, 65, 66, -68, 72, 16, 28, 34, 38, 42, 2, 14, 15, 18, 19, 26, 29, 30, -31, 32, 33, 40, 43, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, -11, 12, 13, 17, 20, 21, 22, 23, 24, 25, 27, 35, 36, 37, 39, -41, 2, 0, 7, 1, 86, 5, 74, 21, 89, 85, 88, 3, 4, 6, -51, 23, 111, 70, 56, 90, 98, 27, 78, 53, 68, 80, 87, 116, 12, -25, 109, 114, 103, 108, 110, 9, 57, 62, 65, 91, 96, 99, 69, 71, -72, 73, 81, 49, 50, 52, 93, 101, 36, 55, 64, 125, 19, 20, 22, -106, 41, 8, 11, 13, 29, 34, 37, 54, 102, 107, 118, 123, 126, 14, -15, 16, 18, 82, 83, 84, 92, 97, 100, 104, 112, 17, 32, 121, 94, -24, 113, 76, 77, 79, 10, 61, 95, 26, 28, 30, 31, 35, 38, 39, -40, 46, 58, 59, 60, 63, 66, 67, 75, 105, 115, 117, 119, 120, 124, -127, 128, 33, 42, 43, 44, 45, 47, 48, 122, 0, 1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, -20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2, 0, 1, 3, 4, -5, 6, 7, 8, 82, 11, 26, 19, 75, 6, 9, 47, 54, 66, 73, -80, 87, 0, 3, 4, 5, 18, 23, 24, 25, 44, 53, 62, 63, 65, -67, 68, 69, 70, 72, 76, 77, 86, 88, 89, 90, 91, 92, 93, 22, -10, 15, 21, 49, 58, 50, 59, 83, 1, 2, 7, 8, 12, 13, 14, -16, 17, 20, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -39, 40, 41, 42, 43, 45, 46, 48, 51, 52, 55, 56, 57, 60, 61, -64, 71, 74, 78, 79, 81, 84, 85, 0, 1, 0, 1, 34, 2, 12, -13, 32, 37, 76, 3, 10, 11, 19, 20, 21, 22, 23, 27, 28, 29, -30, 35, 53, 55, 78, 4, 16, 17, 5, 6, 7, 8, 9, 14, 15, -18, 24, 25, 26, 31, 33, 36, 38, 39, 40, 41, 42, 43, 44, 45, -46, 47, 48, 49, 50, 51, 52, 54, 56, 57, 58, 59, 60, 61, 62, -63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 79, -80, 81, 82, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -12, 13, 14, 15, 5, 30, 31, 0, 1, 2, 3, 4, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 59, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 63, -64, 65, 36, 61, 20, 1, 19, 126, 127, 60, 56, 33, 34, 35, 21, -22, 52, 59, 67, 71, 72, 63, 65, 66, 32, 45, 57, 84, 91, 114, -125, 64, 0, 2, 3, 68, 70, 73, 26, 46, 53, 54, 55, 58, 115, -131, 74, 12, 96, 97, 99, 41, 42, 44, 49, 50, 75, 80, 83, 85, -103, 106, 107, 108, 109, 110, 111, 112, 113, 116, 117, 118, 119, 120, 124, -13, 62, 76, 77, 78, 86, 128, 129, 94, 23, 24, 25, 27, 28, 29, -30, 31, 37, 38, 39, 40, 43, 47, 48, 51, 4, 5, 6, 7, 8, -9, 10, 11, 14, 15, 16, 17, 18, 69, 79, 81, 82, 87, 88, 89, -90, 92, 93, 95, 98, 100, 101, 102, 104, 105, 121, 122, 123, 130, 132, -3, 2, 10, 11, 1, 4, 6, 8, 5, 7, 9, 0, 31, 30, 15, -43, 49, 53, 57, 45, 12, 13, 16, 18, 32, 34, 36, 14, 33, 35, -37, 21, 23, 17, 19, 20, 22, 24, 25, 26, 27, 28, 29, 42, 48, -52, 56, 38, 41, 44, 46, 50, 54, 39, 40, 47, 51, 55, 35, 36, -3, 5, 7, 9, 11, 2, 17, 30, 34, 14, 20, 23, 4, 6, 13, -16, 18, 19, 22, 24, 25, 31, 32, 33, 8, 10, 12, 15, 21, 0, -1, 26, 27, 28, 29, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, -40, 41, 42, 43, 44, 45, 46, 47, 5, 4, 6, 21, 0, 3, 18, -16, 15, 17, 9, 12, 20, 7, 14, 19, 8, 10, 11, 13, 1, 2, -167, 168, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, -88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, -103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, -133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, -148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, -163, 164, 165, 166, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, -2, 3, 7, 6, 8, 9, 16, 2, 18, 19, 28, 27, 24, 25, 26, -17, 3, 20, 22, 21, 23, 13, 0, 4, 14, 1, 5, 12, 10, 11, -15, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 12, 13, -14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -69, 70, 71, 72, 73, 18, 22, 28, 35, 53, 54, 57, 59, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 19, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, -36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, -51, 52, 55, 56, 58, 9, 13, 4, 6, 11, 15, 8, 12, 5, 7, -10, 14, 2, 3, 0, 1, 0, 3, 4, 7, 1, 2, 5, 6, 8, -9, 10, 0, 1, 2, 65, 64, 66, 52, 46, 49, 53, 59, 44, 48, -45, 57, 34, 25, 26, 27, 36, 56, 24, 43, 47, 0, 1, 2, 3, -4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, -19, 20, 21, 22, 23, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, -40, 41, 42, 50, 51, 54, 55, 58, 60, 61, 62, 63, 0, 1, 2, -3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, -78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -108, 109, 110, 111, 112, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, -40, 41, 42, 43, 44, 45, 46, 47, 48, 0, 1, 2, 3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -21, 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, -84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, -99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, -114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, -144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, -174, 175, 84, 86, 5, 16, 18, 21, 81, 82, 3, 6, 10, 12, 14, -22, 24, 26, 29, 39, 41, 42, 54, 56, 58, 60, 62, 75, 0, 1, -2, 4, 7, 8, 9, 11, 13, 15, 17, 19, 20, 23, 25, 27, 28, -30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 43, 44, 45, 46, 47, -48, 49, 50, 51, 52, 53, 55, 57, 59, 61, 63, 64, 65, 66, 67, -68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 80, 83, 85, 0, -2, 4, 6, 14, 16, 18, 20, 8, 31, 10, 11, 24, 25, 28, 29, -32, 33, 36, 38, 40, 41, 44, 45, 9, 30, 1, 3, 5, 7, 12, -13, 15, 17, 19, 21, 22, 23, 26, 27, 34, 35, 37, 39, 42, 43, -46, 47, 27, 28, 35, 36, 45, 46, 13, 14, 59, 60, 0, 1, 2, -3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, -20, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 37, 38, -39, 40, 41, 42, 43, 44, 47, 48, 49, 50, 51, 52, 53, 54, 55, -56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, -88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, -103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, -133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, -148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, -163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, -178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, -193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, -208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, -223, 224, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -13, 14, 15, 16, 17, 0, 4, 1, 2, 3, 7, 5, 9, 6, 8, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, -30, 31, 32, 33, 34, 35, 36, 37, 8, 11, 9, 10, 0, 1, 4, -5, 2, 3, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, -72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, -87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, -102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, -132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, -147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, -177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, -207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, -222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, -237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, -252, 253, 254, 255, 256, 257, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -35, 1, 2, 20, 29, 32, 33, 34, 0, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, -25, 26, 27, 28, 30, 31, 36, 37, 38, 39, 40, 41, 42, 43, 44, -45, 46, 47, 48, 49, 50, 51, 52, 53, 0, 1, 2, 3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -36, 37, 38, 39, 40, 0, 1, 0, 1, 2, 3, 4, 5, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, -47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, -77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, -92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, -107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, -122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, -152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, -167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, -182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, -197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, -212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, -227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, -242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, -257, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, -29, 0, 1, 4, 27, 19, 21, 5, 18, 6, 8, 10, 11, 12, 14, -15, 16, 17, 20, 0, 1, 2, 3, 7, 9, 13, 22, 23, 24, 25, -26, 28, 29, 30, 31, 32, 33, 34, 35, 0, 1, 2, 3, 4, 0, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -16, 17, 18, 19, 112, 110, 113, 111, 29, 37, 18, 93, 96, 97, 99, -98, 92, 100, 104, 105, 108, 101, 61, 62, 69, 77, 86, 70, 78, 85, -68, 76, 87, 60, 54, 55, 59, 30, 38, 73, 81, 90, 94, 19, 14, -16, 71, 79, 84, 50, 51, 57, 0, 2, 4, 6, 8, 10, 12, 20, -26, 34, 44, 64, 72, 80, 91, 40, 63, 13, 5, 7, 9, 11, 15, -1, 3, 39, 21, 48, 49, 56, 95, 74, 82, 89, 31, 25, 33, 45, -65, 43, 103, 106, 107, 109, 17, 52, 53, 58, 28, 36, 41, 23, 27, -35, 47, 42, 66, 22, 24, 32, 46, 67, 75, 83, 88, 102, 6, 7, -0, 1, 3, 5, 2, 4, 50, 48, 52, 54, 56, 2, 6, 14, 18, -22, 26, 30, 34, 49, 53, 55, 57, 58, 59, 60, 0, 1, 3, 4, -5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 19, 20, 21, 23, -24, 25, 27, 28, 29, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, -42, 43, 44, 45, 46, 47, 51, 23, 24, 25, 26, 16, 18, 20, 22, -15, 17, 19, 21, 6, 8, 10, 12, 14, 0, 2, 1, 3, 4, 5, -11, 7, 9, 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, -41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, -56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, -71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, -86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, -116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1, 0, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, -47, 48, 49, 50, 51, 52, 53, 54, 55, 0, 1, 2, 3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 112, 114, 19, 61, 70, -18, 111, 3, 5, 6, 66, 82, 109, 110, 113, 58, 102, 104, 31, 35, -36, 37, 38, 71, 77, 86, 93, 95, 96, 108, 47, 25, 45, 46, 53, -55, 75, 40, 41, 42, 52, 60, 83, 84, 24, 26, 11, 12, 22, 23, -28, 30, 57, 63, 65, 69, 81, 90, 106, 32, 33, 34, 49, 50, 51, -72, 73, 78, 79, 87, 88, 94, 4, 7, 8, 9, 10, 20, 21, 29, -39, 43, 44, 48, 54, 56, 59, 62, 64, 67, 68, 74, 76, 80, 89, -91, 92, 100, 101, 115, 116, 16, 99, 13, 14, 15, 17, 27, 85, 97, -98, 103, 105, 107, 117, 7, 10, 19, 0, 1, 2, 3, 4, 5, 6, -8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 0, 1, 2, 3, 4, -5, 7, 17, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, -13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 0, 1, 0, 7, 11, -5, 6, 10, 3, 4, 1, 2, 8, 9, 12, 0, 1, 2, 3, 4, -0, 1, 2, 3, 4, 1, 3, 0, 2, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, -20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -35, 36, 0, 1, 75, 78, 76, 15, 79, 77, 8, 85, 14, 0, 4, -10, 81, 83, 84, 87, 12, 80, 82, 11, 9, 2, 6, 86, 36, 38, -37, 13, 1, 5, 3, 7, 49, 22, 24, 28, 32, 50, 58, 63, 66, -71, 23, 25, 29, 33, 47, 48, 51, 52, 53, 54, 46, 17, 19, 16, -20, 21, 26, 27, 30, 31, 34, 35, 39, 40, 41, 42, 43, 44, 45, -55, 56, 57, 59, 60, 61, 62, 64, 65, 67, 68, 69, 70, 72, 73, -74, 18, 11, 22, 1, 3, 5, 7, 9, 10, 13, 15, 16, 18, 20, -26, 28, 0, 2, 4, 6, 8, 12, 14, 17, 19, 21, 23, 24, 25, -27, 29, 47, 45, 43, 48, 42, 44, 49, 46, 33, 11, 27, 31, 37, -38, 63, 17, 18, 21, 23, 25, 29, 32, 35, 77, 83, 97, 0, 5, -9, 15, 16, 19, 39, 41, 53, 69, 20, 22, 24, 26, 28, 30, 34, -36, 76, 82, 96, 102, 103, 1, 3, 7, 13, 40, 51, 57, 61, 67, -71, 73, 75, 81, 87, 95, 101, 106, 107, 70, 2, 4, 6, 8, 10, -12, 14, 50, 52, 54, 55, 56, 58, 59, 60, 62, 64, 65, 66, 68, -72, 74, 78, 79, 80, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, -98, 99, 100, 104, 105, 108, 109, 0, 1, 46, 43, 47, 42, 3, 44, -5, 20, 4, 18, 24, 26, 30, 38, 34, 36, 7, 9, 22, 2, 45, -21, 40, 19, 35, 37, 39, 32, 12, 14, 28, 10, 16, 41, 25, 27, -31, 6, 8, 23, 33, 11, 17, 13, 15, 29, 52, 50, 53, 48, 49, -51, 0, 1, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, -51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, -66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, -81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, -96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, -126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, -141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, -156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, -171, 172, 173, 174, 175, 176, 177, 178, 179, 0, 1, 2, 3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, -51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, -66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, -81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, -96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -111, 112, 113, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -27, 28, 29, 30, 31, 32, 33, 34, 35, 5, 15, 19, 27, 31, 35, -39, 43, 96, 104, 120, 121, 131, 0, 1, 2, 10, 12, 24, 25, 46, -47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 76, 77, 78, 79, 80, -81, 82, 83, 84, 85, 86, 87, 88, 90, 91, 93, 95, 97, 99, 101, -103, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, -119, 122, 123, 124, 125, 126, 127, 128, 129, 130, 132, 133, 134, 135, 136, -137, 138, 140, 144, 148, 152, 156, 160, 164, 3, 4, 6, 7, 8, 9, -11, 13, 14, 16, 17, 18, 20, 21, 22, 23, 26, 28, 29, 30, 32, -33, 34, 36, 37, 38, 40, 41, 42, 44, 45, 57, 58, 59, 60, 61, -62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 89, -92, 94, 98, 100, 102, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, -153, 154, 155, 157, 158, 159, 161, 162, 163, 165, 166, 36, 57, 60, 65, -68, 114, 135, 156, 161, 162, 165, 170, 176, 179, 182, 183, 188, 191, 194, -197, 198, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, -44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 58, 59, -61, 62, 63, 64, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, -78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -108, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, -124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 136, 137, 138, 139, -140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, -155, 157, 158, 159, 160, 163, 164, 166, 167, 168, 169, 171, 172, 173, 174, -175, 177, 178, 180, 181, 184, 185, 186, 187, 189, 190, 192, 193, 195, 196, -199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, -214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, -229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, -244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, -259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, -289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, -304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, -349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, -364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, -394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, -409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, -439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, -454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, -469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, -484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -499, 500, 501, 502, 503, 504, 505, 506, 0, 1, 2, 3, 4, 5, 6, -7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, -40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, -55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, -70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, -85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, -100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, -115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, -130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, -145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, -160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, -175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, -190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, -205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, -235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, -250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, -265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, -280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, -295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, -310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, -325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, -340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, -355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, -370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, -385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, -400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, -415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, -430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, -445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, -460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, -475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, -490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, -505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, -520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, -535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, -550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, -565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, -580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, -595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, -610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, -625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, -640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, -655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 5, 6, 7, -8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, -38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, -68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, -83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, -113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, -128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, -143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, -158, 159, 160, 161, 162, 163, 164, 165, 166, 0, 1, 2, 3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, 2, 3, 4, 5, -0, 3, 5, 10, 16, 18, 94, 4, 6, 7, 8, 17, 37, 44, 48, -51, 56, 66, 69, 75, 79, 82, 84, 88, 98, 99, 102, 1, 2, 9, -11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, -29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 45, -46, 47, 49, 50, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, -64, 65, 67, 68, 70, 71, 72, 73, 74, 76, 77, 78, 80, 81, 83, -85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 100, 101, 103, 104, -105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, -135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, -150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, -165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, -180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, -81, 18, 24, 33, 69, 83, 19, 25, 35, 71, 0, 1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, -22, 23, 26, 27, 28, 29, 30, 31, 32, 34, 36, 37, 38, 39, 40, -41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, -56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 72, -73, 74, 75, 76, 77, 78, 79, 80, 82, 84, 85, 86, 87, 88, 89, -90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, -105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, -135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, -150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, -165, 166, 167, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -12, 13, 14, 15, 16, 17, 4, 5, 6, 31, 32, 39, 40, 41, 0, -1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, -19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, -36, 37, 38, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, -84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, -99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, -114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -129, 130, 131, 132, 133, 134, 135, 136, 0, 1, 3, 22, 23, 26, 34, -0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 30, 31, 32, 33, -35, 36, 37, 38, 39, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, -31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, -46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, -61, 62, 63, 64, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -25, 26, 27, 28, 29, 30, 31, 32, 33, 51, 0, 1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, -20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, -50, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, -66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 0, 1, 2, -3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, -47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, -77, 74, 75, 92, 93, 116, 143, 144, 149, 14, 15, 34, 35, 36, 37, -68, 69, 98, 99, 104, 105, 110, 111, 154, 155, 156, 157, 166, 167, 168, -169, 178, 179, 180, 181, 4, 5, 6, 7, 22, 23, 24, 25, 46, 47, -50, 51, 56, 57, 60, 61, 80, 82, 85, 87, 121, 122, 123, 124, 133, -134, 135, 136, 190, 191, 194, 197, 202, 203, 206, 207, 212, 213, 216, 217, -0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, -21, 26, 27, 28, 29, 30, 31, 32, 33, 38, 39, 40, 41, 42, 43, -44, 45, 48, 49, 52, 53, 54, 55, 58, 59, 62, 63, 64, 65, 66, -67, 70, 71, 72, 73, 76, 77, 78, 79, 81, 83, 84, 86, 88, 89, -90, 91, 94, 95, 96, 97, 100, 101, 102, 103, 106, 107, 108, 109, 112, -113, 114, 115, 117, 118, 119, 120, 125, 126, 127, 128, 129, 130, 131, 132, -137, 138, 139, 140, 141, 142, 145, 146, 147, 148, 150, 151, 152, 153, 158, -159, 160, 161, 162, 163, 164, 165, 170, 171, 172, 173, 174, 175, 176, 177, -182, 183, 184, 185, 186, 187, 188, 189, 192, 193, 195, 196, 198, 199, 200, -201, 204, 205, 208, 209, 210, 211, 214, 215, 218, 219, 220, 221, 0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 1, 2, -3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, -78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, -123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, -138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, -153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, -168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, -183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, -213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, -228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, -243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, -258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, -273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, -288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, -303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, -318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, -333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, -348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, -363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, -30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, -45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 0, 1, 2, 3, -4, 5, 6, 7, 0, 1, 14, 15, 16, 17, 2, 3, 4, 5, 8, -9, 10, 11, 12, 13, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -28, 29, 30, 31, 32, 33, 11, 2, 5, 10, 8, 4, 9, 1, 7, -3, 0, 6, 42, 45, 36, 39, 12, 16, 18, 22, 38, 41, 44, 47, -37, 40, 43, 46, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, 13, 14, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, -30, 31, 32, 33, 34, 35, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, -84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, -99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, -114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, -144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, -174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, -189, 190, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, -88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, -103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 4, 5, -6, 8, 1, 3, 0, 2, 7, 9, 0, 1, 2, 3, 4, 5, 6, -7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, -22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, -37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, -67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, -82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, -97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, -112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, -127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, -142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, -157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, -187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, -202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, -232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, -247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, -262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, -277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, -307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, -322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, -337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, -352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, -382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, -397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, -427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, -442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, -457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, -472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, -487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, -502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, -517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, -532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, -547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, -562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, -577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, -592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, -607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, -622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, -637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, -652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, -667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, -682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, -697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, -712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, -727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, -742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, -757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, -772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, -787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, -802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, -817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, -832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, -847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, -862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, -877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, -892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, -907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, -922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, -937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, -952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, -967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, -982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, -997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, -1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, -1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, -1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, -1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, -1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, -1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, -1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, -1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, -1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, -1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, -1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, -1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, -1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, -1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, -1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, -1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, -1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, -1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, -1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, -1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, -1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, -1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, -1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, -1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, -1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, -1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, -1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, -1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, -1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, -1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, -1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, -1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, -1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, -1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, -1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, -1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, -1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, -1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, -1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, -1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, -1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, -1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, -1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, -1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, -1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, -1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, -1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, -1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, -1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, -1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, -1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, -1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, -1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, -1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, -1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, -1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, -1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, -1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, -1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, -1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, -1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, -1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, -1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, -1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, -1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, -1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, -2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, -2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, -2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, -2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, -2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, -2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, -2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, -2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, -2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, -2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, -2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, -2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, -2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, -2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, -2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, -2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, -2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, -2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, -2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, -2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, -2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, -2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, -2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, -2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, -2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, -2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, -2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, -2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, -2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, -2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, -2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, -2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, -2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, -2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, -2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, -2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, -2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, -2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, -2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, -2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, -2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, -2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, -2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, -2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, -2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, -2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, -2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, -2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, -2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, -2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, -2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, -2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, -2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, -2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, -2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, -2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, -2857, 2858, 2859, 2860, 2861, 2862, 2863, 9, 11, 6, 7, 8, 10, 4, 5, -0, 1, 2, 3, 0, 2, 10, 3, 6, 1, 9, 11, 4, 8, 7, -5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, -29, 30, 31, 32, 33, 34, 35, 68, 116, 22, 10, 97, 117, 52, 110, -7, 19, 111, 115, 6, 18, 0, 74, 88, 12, 48, 108, 99, 109, 38, -104, 4, 16, 24, 96, 15, 3, 50, 84, 71, 85, 36, 102, 103, 119, -54, 86, 100, 30, 25, 105, 113, 69, 53, 63, 98, 87, 93, 89, 95, -9, 21, 62, 114, 5, 17, 26, 55, 2, 14, 65, 8, 20, 64, 92, -42, 106, 11, 23, 46, 66, 34, 101, 107, 56, 35, 47, 57, 67, 76, -118, 75, 83, 82, 94, 37, 77, 29, 51, 1, 13, 27, 49, 58, 112, -39, 59, 28, 70, 44, 73, 80, 81, 32, 72, 31, 43, 33, 40, 41, -45, 60, 61, 78, 79, 90, 91 -}; - - -/**Function************************************************************* - - Synopsis [Reads library from array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Dar_LibReadNodes() -{ - Vec_Int_t * vResult; - int i; - vResult = Vec_IntAlloc( s_nDataSize1 ); - for ( i = 0; i < s_nDataSize1; i++ ) - Vec_IntPush( vResult, s_Data1[i] ); - return vResult; -} - -/**Function************************************************************* - - Synopsis [Reads library from array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Dar_LibReadOuts() -{ - Vec_Int_t * vResult; - int i; - vResult = Vec_IntAlloc( s_nDataSize2 ); - for ( i = 0; i < s_nDataSize2; i++ ) - Vec_IntPush( vResult, s_Data2[i] ); - return vResult; -} - -/**Function************************************************************* - - Synopsis [Reads library from array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Dar_LibReadPrios() -{ - Vec_Int_t * vResult; - int i; - vResult = Vec_IntAlloc( s_nDataSize3 ); - for ( i = 0; i < s_nDataSize3; i++ ) - Vec_IntPush( vResult, s_Data3[i] ); - return vResult; -} - -#if 0 - -#include "abc.h" - -/**Function************************************************************* - - Synopsis [Generate arrays.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Aig_NtkGenerateArrays( Abc_Ntk_t * pNtk ) -{ - extern int Io_WriteAigerEncode( char * pBuffer, int Pos, unsigned x ); - - Abc_Obj_t * pObj; - int i, Count = 0; - assert( Abc_NtkPiNum(pNtk) == 4 ); - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_ObjFanoutNum(Abc_AigConst1(pNtk)) == 0 ); -/* - { - unsigned char * pBuffer; - int Pos, uLit, uLit0, uLit1, Size, Digit; - - Abc_NtkForEachPi( pNtk, pObj, i ) - pObj->pCopy = (void *)Count++; - - Pos = 0; - pBuffer = ALLOC( char, 200000 ); - Abc_AigForEachAnd( pNtk, pObj, i ) - { - pObj->pCopy = (void *)Count++; - uLit = ((int)pObj->pCopy << 1); - uLit0 = (((int)Abc_ObjFanin0(pObj)->pCopy) << 1) | Abc_ObjFaninC0(pObj); - uLit1 = (((int)Abc_ObjFanin1(pObj)->pCopy) << 1) | Abc_ObjFaninC1(pObj); - assert( uLit0 < uLit1 ); - Pos = Io_WriteAigerEncode( pBuffer, Pos, uLit - uLit1 ); - Pos = Io_WriteAigerEncode( pBuffer, Pos, uLit1 - uLit0 ); - } - // write the buffer - Size = 0; - for ( i = 0; i < Pos; i++ ) - { - if ( i % 36 == 0 ) - printf( "\n" ); - - Digit = pBuffer[i] & 0xF; - if ( Digit < 10 ) - printf( "%d", Digit ); - else - printf( "%c", Digit - 10 + 'A' ); - - - Digit = pBuffer[i]; - Digit >>= 4; - if ( Digit < 10 ) - printf( "%d", Digit ); - else - printf( "%c", Digit - 10 + 'A' ); - - } - printf( "\n" ); - printf( "Size = %d.\n", Pos ); - } -*/ - - - Abc_NtkForEachPi( pNtk, pObj, i ) - pObj->pCopy = (void *)Count++; - Abc_AigForEachAnd( pNtk, pObj, i ) - { -// if ( (Count - 4) % 6 == 0 ) -// printf( "\n" ); -// printf( "%5d,", (((int)Abc_ObjFanin0(pObj)->pCopy) << 1) | Abc_ObjFaninC0(pObj) ); -// printf( "%5d,", (((int)Abc_ObjFanin1(pObj)->pCopy) << 1) | Abc_ObjFaninC1(pObj) ); - pObj->pCopy = (void *)Count++; - } -// printf( "\n" ); -// printf( "Nodes = %d.\n", Count-4 ); - - - - Abc_NtkForEachPo( pNtk, pObj, i ) - { - if ( i % 12 == 0 ) - printf( "\n" ); - printf( "%5d,", (int)Abc_ObjFanin0(pObj)->pCopy ); - } - printf( "\n" ); - printf( "Outputs = %d.\n", Abc_NtkPoNum(pNtk) ); - - -/* - { - unsigned char * pBuffer; - Vec_Int_t * vOuts; - int Pos, Prev, Out; - - vOuts = Vec_IntAlloc( 25000 ); - Abc_NtkForEachPo( pNtk, pObj, i ) - Vec_IntPush( vOuts, Abc_ObjFaninId0(pObj) ); - Vec_IntSort( vOuts, 0 ); - - Pos = 0; - pBuffer = ALLOC( char, 50000 ); - Prev = 0; - Vec_IntForEachEntry( vOuts, Out, i ) - { - assert( Prev < Out ); - Pos = Io_WriteAigerEncode( pBuffer, Pos, Out - Prev ); - Prev = Out; - } - Vec_IntFree( vOuts ); - - // write the buffer - for ( i = 0; i < Pos; i++ ) - { - if ( i % 32 == 0 ) - printf( "\n" ); - printf( "%d,", pBuffer[i] ); - } - printf( "\n" ); - printf( "Size = %d.\n", Pos ); - } -*/ - -} - -#endif - - - - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darLib.c b/src/vendor/stp/src/extlib-abc/aig/dar/darLib.c deleted file mode 100644 index 24929cf20..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darLib.c +++ /dev/null @@ -1,980 +0,0 @@ -/**CFile**************************************************************** - - FileName [darLib.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Library of AIG subgraphs used for rewriting.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darLib.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Dar_Lib_t_ Dar_Lib_t; -typedef struct Dar_LibObj_t_ Dar_LibObj_t; -typedef struct Dar_LibDat_t_ Dar_LibDat_t; - -struct Dar_LibObj_t_ // library object (2 words) -{ - unsigned Fan0 : 16; // the first fanin - unsigned Fan1 : 16; // the second fanin - unsigned fCompl0 : 1; // the first compl attribute - unsigned fCompl1 : 1; // the second compl attribute - unsigned fPhase : 1; // the phase of the node - unsigned fTerm : 1; // indicates a PI - unsigned Num : 28; // internal use -}; - -struct Dar_LibDat_t_ // library object data -{ - Aig_Obj_t * pFunc; // the corresponding AIG node if it exists - int Level; // level of this node after it is constructured - int TravId; // traversal ID of the library object data - unsigned char fMffc; // set to one if node is part of MFFC - unsigned char nLats[3]; // the number of latches on the input/output stem -}; - -struct Dar_Lib_t_ // library -{ - // objects - Dar_LibObj_t * pObjs; // the set of library objects - int nObjs; // the number of objects used - int iObj; // the current object - // structures by class - int nSubgr[222]; // the number of subgraphs by class - int * pSubgr[222]; // the subgraphs for each class - int * pSubgrMem; // memory for subgraph pointers - int nSubgrTotal; // the total number of subgraph - // structure priorities - int * pPriosMem; // memory for priority of structures - int * pPrios[222]; // pointers to the priority numbers - // structure places in the priorities - int * pPlaceMem; // memory for places of structures in the priority lists - int * pPlace[222]; // pointers to the places numbers - // structure scores - int * pScoreMem; // memory for scores of structures - int * pScore[222]; // pointers to the scores numbers - // nodes by class - int nNodes[222]; // the number of nodes by class - int * pNodes[222]; // the nodes for each class - int * pNodesMem; // memory for nodes pointers - int nNodesTotal; // the total number of nodes - // prepared library - int nSubgraphs; - int nNodes0Max; - // nodes by class - int nNodes0[222]; // the number of nodes by class - int * pNodes0[222]; // the nodes for each class - int * pNodes0Mem; // memory for nodes pointers - int nNodes0Total; // the total number of nodes - // structures by class - int nSubgr0[222]; // the number of subgraphs by class - int * pSubgr0[222]; // the subgraphs for each class - int * pSubgr0Mem; // memory for subgraph pointers - int nSubgr0Total; // the total number of subgraph - // object data - Dar_LibDat_t * pDatas; - int nDatas; - // information about NPN classes - char ** pPerms4; - unsigned short * puCanons; - char * pPhases; - char * pPerms; - unsigned char * pMap; -}; - -static Dar_Lib_t * s_DarLib = NULL; - -static inline Dar_LibObj_t * Dar_LibObj( Dar_Lib_t * p, int Id ) { return p->pObjs + Id; } -static inline int Dar_LibObjTruth( Dar_LibObj_t * pObj ) { return pObj->Num < (0xFFFF & ~pObj->Num) ? pObj->Num : (0xFFFF & ~pObj->Num); } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Starts the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dar_Lib_t * Dar_LibAlloc( int nObjs ) -{ - unsigned uTruths[4] = { 0xAAAA, 0xCCCC, 0xF0F0, 0xFF00 }; - Dar_Lib_t * p; - int i;//, clk = clock(); - p = ALLOC( Dar_Lib_t, 1 ); - memset( p, 0, sizeof(Dar_Lib_t) ); - // allocate objects - p->nObjs = nObjs; - p->pObjs = ALLOC( Dar_LibObj_t, nObjs ); - memset( p->pObjs, 0, sizeof(Dar_LibObj_t) * nObjs ); - // allocate canonical data - p->pPerms4 = Dar_Permutations( 4 ); - Dar_Truth4VarNPN( &p->puCanons, &p->pPhases, &p->pPerms, &p->pMap ); - // start the elementary objects - p->iObj = 4; - for ( i = 0; i < 4; i++ ) - { - p->pObjs[i].fTerm = 1; - p->pObjs[i].Num = uTruths[i]; - } -// PRT( "Library start", clock() - clk ); - return p; -} - -/**Function************************************************************* - - Synopsis [Frees the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibFree( Dar_Lib_t * p ) -{ - free( p->pObjs ); - free( p->pDatas ); - free( p->pNodesMem ); - free( p->pNodes0Mem ); - free( p->pSubgrMem ); - free( p->pSubgr0Mem ); - free( p->pPriosMem ); - FREE( p->pPlaceMem ); - FREE( p->pScoreMem ); - free( p->pPerms4 ); - free( p->puCanons ); - free( p->pPhases ); - free( p->pPerms ); - free( p->pMap ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Returns canonical truth tables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibReturnCanonicals( unsigned * pCanons ) -{ - int Visits[222] = {0}; - int i, k; - // find canonical truth tables - for ( i = k = 0; i < (1<<16); i++ ) - if ( !Visits[s_DarLib->pMap[i]] ) - { - Visits[s_DarLib->pMap[i]] = 1; - pCanons[k++] = ((i<<16) | i); - } - assert( k == 222 ); -} - -/**Function************************************************************* - - Synopsis [Adds one AND to the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibAddNode( Dar_Lib_t * p, int Id0, int Id1, int fCompl0, int fCompl1 ) -{ - Dar_LibObj_t * pFan0 = Dar_LibObj( p, Id0 ); - Dar_LibObj_t * pFan1 = Dar_LibObj( p, Id1 ); - Dar_LibObj_t * pObj = p->pObjs + p->iObj++; - pObj->Fan0 = Id0; - pObj->Fan1 = Id1; - pObj->fCompl0 = fCompl0; - pObj->fCompl1 = fCompl1; - pObj->fPhase = (fCompl0 ^ pFan0->fPhase) & (fCompl1 ^ pFan1->fPhase); - pObj->Num = 0xFFFF & (fCompl0? ~pFan0->Num : pFan0->Num) & (fCompl1? ~pFan1->Num : pFan1->Num); -} - -/**Function************************************************************* - - Synopsis [Adds one AND to the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibSetup_rec( Dar_Lib_t * p, Dar_LibObj_t * pObj, int Class, int fCollect ) -{ - if ( pObj->fTerm || (int)pObj->Num == Class ) - return; - pObj->Num = Class; - Dar_LibSetup_rec( p, Dar_LibObj(p, pObj->Fan0), Class, fCollect ); - Dar_LibSetup_rec( p, Dar_LibObj(p, pObj->Fan1), Class, fCollect ); - if ( fCollect ) - p->pNodes[Class][ p->nNodes[Class]++ ] = pObj-p->pObjs; - else - p->nNodes[Class]++; -} - -/**Function************************************************************* - - Synopsis [Adds one AND to the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibSetup( Dar_Lib_t * p, Vec_Int_t * vOuts, Vec_Int_t * vPrios ) -{ - int fTraining = 0; - Dar_LibObj_t * pObj; - int nNodesTotal, uTruth, Class, Out, i, k; - assert( p->iObj == p->nObjs ); - - // count the number of representatives of each class - for ( i = 0; i < 222; i++ ) - p->nSubgr[i] = p->nNodes[i] = 0; - Vec_IntForEachEntry( vOuts, Out, i ) - { - pObj = Dar_LibObj( p, Out ); - uTruth = Dar_LibObjTruth( pObj ); - Class = p->pMap[uTruth]; - p->nSubgr[Class]++; - } - // allocate memory for the roots of each class - p->pSubgrMem = ALLOC( int, Vec_IntSize(vOuts) ); - p->pSubgr0Mem = ALLOC( int, Vec_IntSize(vOuts) ); - p->nSubgrTotal = 0; - for ( i = 0; i < 222; i++ ) - { - p->pSubgr[i] = p->pSubgrMem + p->nSubgrTotal; - p->pSubgr0[i] = p->pSubgr0Mem + p->nSubgrTotal; - p->nSubgrTotal += p->nSubgr[i]; - p->nSubgr[i] = 0; - } - assert( p->nSubgrTotal == Vec_IntSize(vOuts) ); - // add the outputs to storage - Vec_IntForEachEntry( vOuts, Out, i ) - { - pObj = Dar_LibObj( p, Out ); - uTruth = Dar_LibObjTruth( pObj ); - Class = p->pMap[uTruth]; - p->pSubgr[Class][ p->nSubgr[Class]++ ] = Out; - } - - if ( fTraining ) - { - // allocate memory for the priority of roots of each class - p->pPriosMem = ALLOC( int, Vec_IntSize(vOuts) ); - p->nSubgrTotal = 0; - for ( i = 0; i < 222; i++ ) - { - p->pPrios[i] = p->pPriosMem + p->nSubgrTotal; - p->nSubgrTotal += p->nSubgr[i]; - for ( k = 0; k < p->nSubgr[i]; k++ ) - p->pPrios[i][k] = k; - - } - assert( p->nSubgrTotal == Vec_IntSize(vOuts) ); - - // allocate memory for the priority of roots of each class - p->pPlaceMem = ALLOC( int, Vec_IntSize(vOuts) ); - p->nSubgrTotal = 0; - for ( i = 0; i < 222; i++ ) - { - p->pPlace[i] = p->pPlaceMem + p->nSubgrTotal; - p->nSubgrTotal += p->nSubgr[i]; - for ( k = 0; k < p->nSubgr[i]; k++ ) - p->pPlace[i][k] = k; - - } - assert( p->nSubgrTotal == Vec_IntSize(vOuts) ); - - // allocate memory for the priority of roots of each class - p->pScoreMem = ALLOC( int, Vec_IntSize(vOuts) ); - p->nSubgrTotal = 0; - for ( i = 0; i < 222; i++ ) - { - p->pScore[i] = p->pScoreMem + p->nSubgrTotal; - p->nSubgrTotal += p->nSubgr[i]; - for ( k = 0; k < p->nSubgr[i]; k++ ) - p->pScore[i][k] = 0; - - } - assert( p->nSubgrTotal == Vec_IntSize(vOuts) ); - } - else - { - int Counter = 0; - // allocate memory for the priority of roots of each class - p->pPriosMem = ALLOC( int, Vec_IntSize(vOuts) ); - p->nSubgrTotal = 0; - for ( i = 0; i < 222; i++ ) - { - p->pPrios[i] = p->pPriosMem + p->nSubgrTotal; - p->nSubgrTotal += p->nSubgr[i]; - for ( k = 0; k < p->nSubgr[i]; k++ ) - p->pPrios[i][k] = Vec_IntEntry(vPrios, Counter++); - - } - assert( p->nSubgrTotal == Vec_IntSize(vOuts) ); - assert( Counter == Vec_IntSize(vPrios) ); - } - - // create traversal IDs - for ( i = 0; i < p->iObj; i++ ) - Dar_LibObj(p, i)->Num = 0xff; - // count nodes in each class - for ( i = 0; i < 222; i++ ) - for ( k = 0; k < p->nSubgr[i]; k++ ) - Dar_LibSetup_rec( p, Dar_LibObj(p, p->pSubgr[i][k]), i, 0 ); - // count the total number of nodes - p->nNodesTotal = 0; - for ( i = 0; i < 222; i++ ) - p->nNodesTotal += p->nNodes[i]; - // allocate memory for the nodes of each class - p->pNodesMem = ALLOC( int, p->nNodesTotal ); - p->pNodes0Mem = ALLOC( int, p->nNodesTotal ); - p->nNodesTotal = 0; - for ( i = 0; i < 222; i++ ) - { - p->pNodes[i] = p->pNodesMem + p->nNodesTotal; - p->pNodes0[i] = p->pNodes0Mem + p->nNodesTotal; - p->nNodesTotal += p->nNodes[i]; - p->nNodes[i] = 0; - } - // create traversal IDs - for ( i = 0; i < p->iObj; i++ ) - Dar_LibObj(p, i)->Num = 0xff; - // add the nodes to storage - nNodesTotal = 0; - for ( i = 0; i < 222; i++ ) - { - for ( k = 0; k < p->nSubgr[i]; k++ ) - Dar_LibSetup_rec( p, Dar_LibObj(p, p->pSubgr[i][k]), i, 1 ); - nNodesTotal += p->nNodes[i]; -//printf( "Class %3d : Subgraphs = %4d. Nodes = %5d.\n", i, p->nSubgr[i], p->nNodes[i] ); - } - assert( nNodesTotal == p->nNodesTotal ); - // prepare the number of the PI nodes - for ( i = 0; i < 4; i++ ) - Dar_LibObj(p, i)->Num = i; -} - -/**Function************************************************************* - - Synopsis [Starts the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibCreateData( Dar_Lib_t * p, int nDatas ) -{ - if ( p->nDatas == nDatas ) - return; - FREE( p->pDatas ); - // allocate datas - p->nDatas = nDatas; - p->pDatas = ALLOC( Dar_LibDat_t, nDatas ); - memset( p->pDatas, 0, sizeof(Dar_LibDat_t) * nDatas ); -} - -/**Function************************************************************* - - Synopsis [Adds one AND to the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibSetup0_rec( Dar_Lib_t * p, Dar_LibObj_t * pObj, int Class, int fCollect ) -{ - if ( pObj->fTerm || (int)pObj->Num == Class ) - return; - pObj->Num = Class; - Dar_LibSetup0_rec( p, Dar_LibObj(p, pObj->Fan0), Class, fCollect ); - Dar_LibSetup0_rec( p, Dar_LibObj(p, pObj->Fan1), Class, fCollect ); - if ( fCollect ) - p->pNodes0[Class][ p->nNodes0[Class]++ ] = pObj-p->pObjs; - else - p->nNodes0[Class]++; -} - -/**Function************************************************************* - - Synopsis [Starts the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibPrepare( int nSubgraphs ) -{ - Dar_Lib_t * p = s_DarLib; - int i, k, nNodes0Total; - if ( p->nSubgraphs == nSubgraphs ) - return; - - // favor special classes: - // 1 : F = (!d*!c*!b*!a) - // 4 : F = (!d*!c*!(b*a)) - // 12 : F = (!d*!(c*!(!b*!a))) - // 20 : F = (!d*!(c*b*a)) - - // set the subgraph counters - p->nSubgr0Total = 0; - for ( i = 0; i < 222; i++ ) - { -// if ( i == 1 || i == 4 || i == 12 || i == 20 ) // special classes - if ( i == 1 ) // special classes - p->nSubgr0[i] = p->nSubgr[i]; - else - p->nSubgr0[i] = AIG_MIN( p->nSubgr[i], nSubgraphs ); - p->nSubgr0Total += p->nSubgr0[i]; - for ( k = 0; k < p->nSubgr0[i]; k++ ) - p->pSubgr0[i][k] = p->pSubgr[i][ p->pPrios[i][k] ]; - } - - // count the number of nodes - // clean node counters - for ( i = 0; i < 222; i++ ) - p->nNodes0[i] = 0; - // create traversal IDs - for ( i = 0; i < p->iObj; i++ ) - Dar_LibObj(p, i)->Num = 0xff; - // count nodes in each class - // count the total number of nodes and the largest class - p->nNodes0Total = 0; - p->nNodes0Max = 0; - for ( i = 0; i < 222; i++ ) - { - for ( k = 0; k < p->nSubgr0[i]; k++ ) - Dar_LibSetup0_rec( p, Dar_LibObj(p, p->pSubgr0[i][k]), i, 0 ); - p->nNodes0Total += p->nNodes0[i]; - p->nNodes0Max = AIG_MAX( p->nNodes0Max, p->nNodes0[i] ); - } - - // clean node counters - for ( i = 0; i < 222; i++ ) - p->nNodes0[i] = 0; - // create traversal IDs - for ( i = 0; i < p->iObj; i++ ) - Dar_LibObj(p, i)->Num = 0xff; - // add the nodes to storage - nNodes0Total = 0; - for ( i = 0; i < 222; i++ ) - { - for ( k = 0; k < p->nSubgr0[i]; k++ ) - Dar_LibSetup0_rec( p, Dar_LibObj(p, p->pSubgr0[i][k]), i, 1 ); - nNodes0Total += p->nNodes0[i]; - } - assert( nNodes0Total == p->nNodes0Total ); - // prepare the number of the PI nodes - for ( i = 0; i < 4; i++ ) - Dar_LibObj(p, i)->Num = i; - - // realloc the datas - Dar_LibCreateData( p, p->nNodes0Max + 32 ); - // allocated more because Dar_LibBuildBest() sometimes requires more entries -} - -/**Function************************************************************* - - Synopsis [Reads library from array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dar_Lib_t * Dar_LibRead() -{ - Vec_Int_t * vObjs, * vOuts, * vPrios; - Dar_Lib_t * p; - int i; - // read nodes and outputs - vObjs = Dar_LibReadNodes(); - vOuts = Dar_LibReadOuts(); - vPrios = Dar_LibReadPrios(); - // create library - p = Dar_LibAlloc( Vec_IntSize(vObjs)/2 + 4 ); - // create nodes - for ( i = 0; i < vObjs->nSize; i += 2 ) - Dar_LibAddNode( p, vObjs->pArray[i] >> 1, vObjs->pArray[i+1] >> 1, - vObjs->pArray[i] & 1, vObjs->pArray[i+1] & 1 ); - // create outputs - Dar_LibSetup( p, vOuts, vPrios ); - Vec_IntFree( vObjs ); - Vec_IntFree( vOuts ); - Vec_IntFree( vPrios ); - return p; -} - -/**Function************************************************************* - - Synopsis [Starts the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibStart() -{ -// int clk = clock(); - assert( s_DarLib == NULL ); - s_DarLib = Dar_LibRead(); -// printf( "The 4-input library started with %d nodes and %d subgraphs. ", s_DarLib->nObjs - 4, s_DarLib->nSubgrTotal ); -// PRT( "Time", clock() - clk ); -} - -/**Function************************************************************* - - Synopsis [Stops the library.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibStop() -{ - assert( s_DarLib != NULL ); - Dar_LibFree( s_DarLib ); - s_DarLib = NULL; -} - -/**Function************************************************************* - - Synopsis [Updates the score of the class and adjusts the priority of this class.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibIncrementScore( int Class, int Out, int Gain ) -{ - int * pPrios = s_DarLib->pPrios[Class]; // pPrios[i] = Out - int * pPlace = s_DarLib->pPlace[Class]; // pPlace[Out] = i - int * pScore = s_DarLib->pScore[Class]; // score of Out - int Out2; - assert( Class >= 0 && Class < 222 ); - assert( Out >= 0 && Out < s_DarLib->nSubgr[Class] ); - assert( pPlace[pPrios[Out]] == Out ); - // increment the score - pScore[Out] += Gain; - // move the out in the order - while ( pPlace[Out] > 0 && pScore[Out] > pScore[ pPrios[pPlace[Out]-1] ] ) - { - // get the previous output in the priority list - Out2 = pPrios[pPlace[Out]-1]; - // swap Out and Out2 - pPlace[Out]--; - pPlace[Out2]++; - pPrios[pPlace[Out]] = Out; - pPrios[pPlace[Out2]] = Out2; - } -} - -/**Function************************************************************* - - Synopsis [Prints out the priorities into the file.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibDumpPriorities() -{ - int i, k, Out, Out2, Counter = 0, Printed = 0; - printf( "\nOutput priorities (total = %d):\n", s_DarLib->nSubgrTotal ); - for ( i = 0; i < 222; i++ ) - { -// printf( "Class%d: ", i ); - for ( k = 0; k < s_DarLib->nSubgr[i]; k++ ) - { - Out = s_DarLib->pPrios[i][k]; - Out2 = k == 0 ? Out : s_DarLib->pPrios[i][k-1]; - assert( s_DarLib->pScore[i][Out2] >= s_DarLib->pScore[i][Out] ); -// printf( "%d(%d), ", Out, s_DarLib->pScore[i][Out] ); - printf( "%d, ", Out ); - Printed++; - if ( ++Counter == 15 ) - { - printf( "\n" ); - Counter = 0; - } - } - } - printf( "\n" ); - assert( Printed == s_DarLib->nSubgrTotal ); -} - - -/**Function************************************************************* - - Synopsis [Matches the cut with its canonical form.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_LibCutMatch( Dar_Man_t * p, Dar_Cut_t * pCut ) -{ - Aig_Obj_t * pFanin; - unsigned uPhase; - char * pPerm; - int i; - assert( pCut->nLeaves == 4 ); - // get the fanin permutation - uPhase = s_DarLib->pPhases[pCut->uTruth]; - pPerm = s_DarLib->pPerms4[ (int)s_DarLib->pPerms[pCut->uTruth] ]; - // collect fanins with the corresponding permutation/phase - for ( i = 0; i < (int)pCut->nLeaves; i++ ) - { - pFanin = Aig_ManObj( p->pAig, pCut->pLeaves[ (int)pPerm[i] ] ); - if ( pFanin == NULL ) - { - p->nCutsBad++; - return 0; - } - pFanin = Aig_NotCond(pFanin, ((uPhase >> i) & 1) ); - s_DarLib->pDatas[i].pFunc = pFanin; - s_DarLib->pDatas[i].Level = Aig_Regular(pFanin)->Level; - } - p->nCutsGood++; - return 1; -} - - - -/**Function************************************************************* - - Synopsis [Marks the MFFC of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_LibCutMarkMffc( Aig_Man_t * p, Aig_Obj_t * pRoot, int nLeaves ) -{ - int i, nNodes; - // mark the cut leaves - for ( i = 0; i < nLeaves; i++ ) - Aig_Regular(s_DarLib->pDatas[i].pFunc)->nRefs++; - // label MFFC with current ID - nNodes = Aig_NodeMffsLabel( p, pRoot ); - // unmark the cut leaves - for ( i = 0; i < nLeaves; i++ ) - Aig_Regular(s_DarLib->pDatas[i].pFunc)->nRefs--; - return nNodes; -} - -/**Function************************************************************* - - Synopsis [Evaluates one cut.] - - Description [Returns the best gain.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibObjPrint_rec( Dar_LibObj_t * pObj ) -{ - if ( pObj->fTerm ) - { - printf( "%c", 'a' + (int)(pObj - s_DarLib->pObjs) ); - return; - } - printf( "(" ); - Dar_LibObjPrint_rec( Dar_LibObj(s_DarLib, pObj->Fan0) ); - if ( pObj->fCompl0 ) - printf( "\'" ); - Dar_LibObjPrint_rec( Dar_LibObj(s_DarLib, pObj->Fan1) ); - if ( pObj->fCompl0 ) - printf( "\'" ); - printf( ")" ); -} - - -/**Function************************************************************* - - Synopsis [Assigns numbers to the nodes of one class.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibEvalAssignNums( Dar_Man_t * p, int Class ) -{ - Dar_LibObj_t * pObj; - Dar_LibDat_t * pData, * pData0, * pData1; - Aig_Obj_t * pFanin0, * pFanin1; - int i; - for ( i = 0; i < s_DarLib->nNodes0[Class]; i++ ) - { - // get one class node, assign its temporary number and set its data - pObj = Dar_LibObj(s_DarLib, s_DarLib->pNodes0[Class][i]); - pObj->Num = 4 + i; - assert( (int)pObj->Num < s_DarLib->nNodes0Max + 4 ); - pData = s_DarLib->pDatas + pObj->Num; - pData->fMffc = 0; - pData->pFunc = NULL; - pData->TravId = 0xFFFF; - - // explore the fanins - assert( (int)Dar_LibObj(s_DarLib, pObj->Fan0)->Num < s_DarLib->nNodes0Max + 4 ); - assert( (int)Dar_LibObj(s_DarLib, pObj->Fan1)->Num < s_DarLib->nNodes0Max + 4 ); - pData0 = s_DarLib->pDatas + Dar_LibObj(s_DarLib, pObj->Fan0)->Num; - pData1 = s_DarLib->pDatas + Dar_LibObj(s_DarLib, pObj->Fan1)->Num; - pData->Level = 1 + AIG_MAX(pData0->Level, pData1->Level); - if ( pData0->pFunc == NULL || pData1->pFunc == NULL ) - continue; - pFanin0 = Aig_NotCond( pData0->pFunc, pObj->fCompl0 ); - pFanin1 = Aig_NotCond( pData1->pFunc, pObj->fCompl1 ); - pData->pFunc = Aig_TableLookupTwo( p->pAig, pFanin0, pFanin1 ); - if ( pData->pFunc ) - { - // update the level to be more accurate - pData->Level = Aig_Regular(pData->pFunc)->Level; - // mark the node if it is part of MFFC - pData->fMffc = Aig_ObjIsTravIdCurrent(p->pAig, pData->pFunc); - } - } -} - -/**Function************************************************************* - - Synopsis [Evaluates one cut.] - - Description [Returns the best gain.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_LibEval_rec( Dar_LibObj_t * pObj, int Out, int nNodesSaved, int Required ) -{ - Dar_LibDat_t * pData; - int Area; - if ( pObj->fTerm ) - return 0; - assert( pObj->Num > 3 ); - pData = s_DarLib->pDatas + pObj->Num; - if ( pData->Level > Required ) - return 0xff; - if ( pData->pFunc && !pData->fMffc ) - return 0; - if ( pData->TravId == Out ) - return 0; - pData->TravId = Out; - // this is a new node - get a bound on the area of its branches - nNodesSaved--; - Area = Dar_LibEval_rec( Dar_LibObj(s_DarLib, pObj->Fan0), Out, nNodesSaved, Required+1 ); - if ( Area > nNodesSaved ) - return 0xff; - Area += Dar_LibEval_rec( Dar_LibObj(s_DarLib, pObj->Fan1), Out, nNodesSaved, Required+1 ); - if ( Area > nNodesSaved ) - return 0xff; - return Area + 1; -} - -/**Function************************************************************* - - Synopsis [Evaluates one cut.] - - Description [Returns the best gain.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibEval( Dar_Man_t * p, Aig_Obj_t * pRoot, Dar_Cut_t * pCut, int Required ) -{ - int fTraining = 0; - Dar_LibObj_t * pObj; - int Out, k, Class, nNodesSaved, nNodesAdded, nNodesGained, clk; - clk = clock(); - if ( pCut->nLeaves != 4 ) - return; - // check if the cut exits and assigns leaves and their levels - if ( !Dar_LibCutMatch(p, pCut) ) - return; - // mark MFFC of the node - nNodesSaved = Dar_LibCutMarkMffc( p->pAig, pRoot, pCut->nLeaves ); - // evaluate the cut - Class = s_DarLib->pMap[pCut->uTruth]; - Dar_LibEvalAssignNums( p, Class ); - // profile outputs by their savings - p->nTotalSubgs += s_DarLib->nSubgr0[Class]; - p->ClassSubgs[Class] += s_DarLib->nSubgr0[Class]; - for ( Out = 0; Out < s_DarLib->nSubgr0[Class]; Out++ ) - { - pObj = Dar_LibObj(s_DarLib, s_DarLib->pSubgr0[Class][Out]); - if ( Aig_Regular(s_DarLib->pDatas[pObj->Num].pFunc) == pRoot ) - continue; - nNodesAdded = Dar_LibEval_rec( pObj, Out, nNodesSaved - !p->pPars->fUseZeros, Required ); - nNodesGained = nNodesSaved - nNodesAdded; - if ( fTraining && nNodesGained >= 0 ) - Dar_LibIncrementScore( Class, Out, nNodesGained + 1 ); - if ( nNodesGained < 0 || (nNodesGained == 0 && !p->pPars->fUseZeros) ) - continue; - if ( nNodesGained < p->GainBest || - (nNodesGained == p->GainBest && s_DarLib->pDatas[pObj->Num].Level >= p->LevelBest) ) - continue; - // remember this possibility - Vec_PtrClear( p->vLeavesBest ); - for ( k = 0; k < (int)pCut->nLeaves; k++ ) - Vec_PtrPush( p->vLeavesBest, s_DarLib->pDatas[k].pFunc ); - p->OutBest = s_DarLib->pSubgr0[Class][Out]; - p->OutNumBest = Out; - p->LevelBest = s_DarLib->pDatas[pObj->Num].Level; - p->GainBest = nNodesGained; - p->ClassBest = Class; - assert( p->LevelBest <= Required ); - } -clk = clock() - clk; -p->ClassTimes[Class] += clk; -p->timeEval += clk; -} - -/**Function************************************************************* - - Synopsis [Clears the fields of the nodes used in this cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_LibBuildClear_rec( Dar_LibObj_t * pObj, int * pCounter ) -{ - if ( pObj->fTerm ) - return; - pObj->Num = (*pCounter)++; - s_DarLib->pDatas[ pObj->Num ].pFunc = NULL; - Dar_LibBuildClear_rec( Dar_LibObj(s_DarLib, pObj->Fan0), pCounter ); - Dar_LibBuildClear_rec( Dar_LibObj(s_DarLib, pObj->Fan1), pCounter ); -} - -/**Function************************************************************* - - Synopsis [Reconstructs the best cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Dar_LibBuildBest_rec( Dar_Man_t * p, Dar_LibObj_t * pObj ) -{ - Aig_Obj_t * pFanin0, * pFanin1; - Dar_LibDat_t * pData = s_DarLib->pDatas + pObj->Num; - if ( pData->pFunc ) - return pData->pFunc; - pFanin0 = Dar_LibBuildBest_rec( p, Dar_LibObj(s_DarLib, pObj->Fan0) ); - pFanin1 = Dar_LibBuildBest_rec( p, Dar_LibObj(s_DarLib, pObj->Fan1) ); - pFanin0 = Aig_NotCond( pFanin0, pObj->fCompl0 ); - pFanin1 = Aig_NotCond( pFanin1, pObj->fCompl1 ); - pData->pFunc = Aig_And( p->pAig, pFanin0, pFanin1 ); -// assert( pData->Level == (int)Aig_Regular(pData->pFunc)->Level ); - return pData->pFunc; -} - -/**Function************************************************************* - - Synopsis [Reconstructs the best cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Dar_LibBuildBest( Dar_Man_t * p ) -{ - int i, Counter = 4; - for ( i = 0; i < Vec_PtrSize(p->vLeavesBest); i++ ) - s_DarLib->pDatas[i].pFunc = Vec_PtrEntry( p->vLeavesBest, i ); - Dar_LibBuildClear_rec( Dar_LibObj(s_DarLib, p->OutBest), &Counter ); - return Dar_LibBuildBest_rec( p, Dar_LibObj(s_DarLib, p->OutBest) ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darMan.c b/src/vendor/stp/src/extlib-abc/aig/dar/darMan.c deleted file mode 100644 index 83951a288..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darMan.c +++ /dev/null @@ -1,133 +0,0 @@ -/**CFile**************************************************************** - - FileName [darMan.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [AIG manager.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darMan.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Starts the rewriting manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dar_Man_t * Dar_ManStart( Aig_Man_t * pAig, Dar_RwrPar_t * pPars ) -{ - Dar_Man_t * p; - // start the manager - p = ALLOC( Dar_Man_t, 1 ); - memset( p, 0, sizeof(Dar_Man_t) ); - p->pPars = pPars; - p->pAig = pAig; - // prepare the internal memory manager - p->pMemCuts = Aig_MmFixedStart( p->pPars->nCutsMax * sizeof(Dar_Cut_t), 1024 ); - // other data - p->vLeavesBest = Vec_PtrAlloc( 4 ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the rewriting manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_ManStop( Dar_Man_t * p ) -{ - if ( p->pPars->fVerbose ) - Dar_ManPrintStats( p ); - if ( p->pMemCuts ) - Aig_MmFixedStop( p->pMemCuts, 0 ); - if ( p->vLeavesBest ) - Vec_PtrFree( p->vLeavesBest ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Stops the AIG manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_ManPrintStats( Dar_Man_t * p ) -{ - unsigned pCanons[222]; - int Gain, i; - extern void Kit_DsdPrintFromTruth( unsigned * pTruth, int nVars ); - - Gain = p->nNodesInit - Aig_ManNodeNum(p->pAig); - printf( "Tried = %8d. Beg = %8d. End = %8d. Gain = %6d. (%6.2f %%). Cut mem = %d Mb\n", - p->nNodesTried, p->nNodesInit, Aig_ManNodeNum(p->pAig), Gain, 100.0*Gain/p->nNodesInit, p->nCutMemUsed ); - printf( "Cuts = %8d. Tried = %8d. Used = %8d. Bad = %5d. Skipped = %5d. Ave = %.2f.\n", - p->nCutsAll, p->nCutsTried, p->nCutsUsed, p->nCutsBad, p->nCutsSkipped, - (float)p->nCutsUsed/Aig_ManNodeNum(p->pAig) ); - - printf( "Bufs = %5d. BufMax = %5d. BufReplace = %6d. BufFix = %6d. Levels = %4d.\n", - Aig_ManBufNum(p->pAig), p->pAig->nBufMax, p->pAig->nBufReplaces, p->pAig->nBufFixes, Aig_ManLevels(p->pAig) ); - PRT( "Cuts ", p->timeCuts ); - PRT( "Eval ", p->timeEval ); - PRT( "Other ", p->timeOther ); - PRT( "TOTAL ", p->timeTotal ); - - if ( !p->pPars->fVeryVerbose ) - return; - Dar_LibReturnCanonicals( pCanons ); - for ( i = 0; i < 222; i++ ) - { - if ( p->ClassGains[i] == 0 && p->ClassTimes[i] == 0 ) - continue; - printf( "%3d : ", i ); - printf( "G = %6d (%5.2f %%) ", p->ClassGains[i], Gain? 100.0*p->ClassGains[i]/Gain : 0.0 ); - printf( "S = %8d (%5.2f %%) ", p->ClassSubgs[i], p->nTotalSubgs? 100.0*p->ClassSubgs[i]/p->nTotalSubgs : 0.0 ); - printf( "R = %7d ", p->ClassGains[i]? p->ClassSubgs[i]/p->ClassGains[i] : 9999999 ); -// Kit_DsdPrintFromTruth( pCanons + i, 4 ); -// PRTP( "T", p->ClassTimes[i], p->timeEval ); - printf( "\n" ); - } -} - - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darPrec.c b/src/vendor/stp/src/extlib-abc/aig/dar/darPrec.c deleted file mode 100644 index 0fb4d0827..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darPrec.c +++ /dev/null @@ -1,387 +0,0 @@ -/**CFile**************************************************************** - - FileName [darPrec.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Truth table precomputation.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darPrec.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocated one-memory-chunk array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char ** Dar_ArrayAlloc( int nCols, int nRows, int Size ) -{ - char ** pRes; - char * pBuffer; - int i; - assert( nCols > 0 && nRows > 0 && Size > 0 ); - pBuffer = ALLOC( char, nCols * (sizeof(void *) + nRows * Size) ); - pRes = (char **)pBuffer; - pRes[0] = pBuffer + nCols * sizeof(void *); - for ( i = 1; i < nCols; i++ ) - pRes[i] = pRes[0] + i * nRows * Size; - return pRes; -} - -/**Function******************************************************************** - - Synopsis [Computes the factorial.] - - Description [] - - SideEffects [] - - SeeAlso [] - -******************************************************************************/ -int Dar_Factorial( int n ) -{ - int i, Res = 1; - for ( i = 1; i <= n; i++ ) - Res *= i; - return Res; -} - -/**Function******************************************************************** - - Synopsis [Fills in the array of permutations.] - - Description [] - - SideEffects [] - - SeeAlso [] - -******************************************************************************/ -void Dar_Permutations_rec( char ** pRes, int nFact, int n, char Array[] ) -{ - char ** pNext; - int nFactNext; - int iTemp, iCur, iLast, k; - - if ( n == 1 ) - { - pRes[0][0] = Array[0]; - return; - } - - // get the next factorial - nFactNext = nFact / n; - // get the last entry - iLast = n - 1; - - for ( iCur = 0; iCur < n; iCur++ ) - { - // swap Cur and Last - iTemp = Array[iCur]; - Array[iCur] = Array[iLast]; - Array[iLast] = iTemp; - - // get the pointer to the current section - pNext = pRes + (n - 1 - iCur) * nFactNext; - - // set the last entry - for ( k = 0; k < nFactNext; k++ ) - pNext[k][iLast] = Array[iLast]; - - // call recursively for this part - Dar_Permutations_rec( pNext, nFactNext, n - 1, Array ); - - // swap them back - iTemp = Array[iCur]; - Array[iCur] = Array[iLast]; - Array[iLast] = iTemp; - } -} - -/**Function******************************************************************** - - Synopsis [Computes the set of all permutations.] - - Description [The number of permutations in the array is n!. The number of - entries in each permutation is n. Therefore, the resulting array is a - two-dimentional array of the size: n! x n. To free the resulting array, - call free() on the pointer returned by this procedure.] - - SideEffects [] - - SeeAlso [] - -******************************************************************************/ -char ** Dar_Permutations( int n ) -{ - char Array[50]; - char ** pRes; - int nFact, i; - // allocate memory - nFact = Dar_Factorial( n ); - pRes = Dar_ArrayAlloc( nFact, n, sizeof(char) ); - // fill in the permutations - for ( i = 0; i < n; i++ ) - Array[i] = i; - Dar_Permutations_rec( pRes, nFact, n, Array ); - // print the permutations -/* - { - int i, k; - for ( i = 0; i < nFact; i++ ) - { - printf( "{" ); - for ( k = 0; k < n; k++ ) - printf( " %d", pRes[i][k] ); - printf( " }\n" ); - } - } -*/ - return pRes; -} - -/**Function************************************************************* - - Synopsis [Permutes the given vector of minterms.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_TruthPermute_int( int * pMints, int nMints, char * pPerm, int nVars, int * pMintsP ) -{ - int m, v; - // clean the storage for minterms - memset( pMintsP, 0, sizeof(int) * nMints ); - // go through minterms and add the variables - for ( m = 0; m < nMints; m++ ) - for ( v = 0; v < nVars; v++ ) - if ( pMints[m] & (1 << v) ) - pMintsP[m] |= (1 << pPerm[v]); -} - -/**Function************************************************************* - - Synopsis [Permutes the function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Dar_TruthPermute( unsigned Truth, char * pPerms, int nVars, int fReverse ) -{ - unsigned Result; - int * pMints; - int * pMintsP; - int nMints; - int i, m; - - assert( nVars < 6 ); - nMints = (1 << nVars); - pMints = ALLOC( int, nMints ); - pMintsP = ALLOC( int, nMints ); - for ( i = 0; i < nMints; i++ ) - pMints[i] = i; - - Dar_TruthPermute_int( pMints, nMints, pPerms, nVars, pMintsP ); - - Result = 0; - if ( fReverse ) - { - for ( m = 0; m < nMints; m++ ) - if ( Truth & (1 << pMintsP[m]) ) - Result |= (1 << m); - } - else - { - for ( m = 0; m < nMints; m++ ) - if ( Truth & (1 << m) ) - Result |= (1 << pMintsP[m]); - } - - free( pMints ); - free( pMintsP ); - - return Result; -} - -/**Function************************************************************* - - Synopsis [Changes the phase of the function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Dar_TruthPolarize( unsigned uTruth, int Polarity, int nVars ) -{ - // elementary truth tables - static unsigned Signs[5] = { - 0xAAAAAAAA, // 1010 1010 1010 1010 1010 1010 1010 1010 - 0xCCCCCCCC, // 1010 1010 1010 1010 1010 1010 1010 1010 - 0xF0F0F0F0, // 1111 0000 1111 0000 1111 0000 1111 0000 - 0xFF00FF00, // 1111 1111 0000 0000 1111 1111 0000 0000 - 0xFFFF0000 // 1111 1111 1111 1111 0000 0000 0000 0000 - }; - unsigned uTruthRes, uCof0, uCof1; - int nMints, Shift, v; - assert( nVars < 6 ); - nMints = (1 << nVars); - uTruthRes = uTruth; - for ( v = 0; v < nVars; v++ ) - if ( Polarity & (1 << v) ) - { - uCof0 = uTruth & ~Signs[v]; - uCof1 = uTruth & Signs[v]; - Shift = (1 << v); - uCof0 <<= Shift; - uCof1 >>= Shift; - uTruth = uCof0 | uCof1; - } - return uTruth; -} - -/**Function************************************************************* - - Synopsis [Computes NPN canonical forms for 4-variable functions.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_Truth4VarNPN( unsigned short ** puCanons, char ** puPhases, char ** puPerms, unsigned char ** puMap ) -{ - unsigned short * uCanons; - unsigned char * uMap; - unsigned uTruth, uPhase, uPerm; - char ** pPerms4, * uPhases, * uPerms; - int nFuncs, nClasses; - int i, k; - - nFuncs = (1 << 16); - uCanons = ALLOC( unsigned short, nFuncs ); - uPhases = ALLOC( char, nFuncs ); - uPerms = ALLOC( char, nFuncs ); - uMap = ALLOC( unsigned char, nFuncs ); - memset( uCanons, 0, sizeof(unsigned short) * nFuncs ); - memset( uPhases, 0, sizeof(char) * nFuncs ); - memset( uPerms, 0, sizeof(char) * nFuncs ); - memset( uMap, 0, sizeof(unsigned char) * nFuncs ); - pPerms4 = Dar_Permutations( 4 ); - - nClasses = 1; - nFuncs = (1 << 15); - for ( uTruth = 1; uTruth < (unsigned)nFuncs; uTruth++ ) - { - // skip already assigned - if ( uCanons[uTruth] ) - { - assert( uTruth > uCanons[uTruth] ); - uMap[~uTruth & 0xFFFF] = uMap[uTruth] = uMap[uCanons[uTruth]]; - continue; - } - uMap[uTruth] = nClasses++; - for ( i = 0; i < 16; i++ ) - { - uPhase = Dar_TruthPolarize( uTruth, i, 4 ); - for ( k = 0; k < 24; k++ ) - { - uPerm = Dar_TruthPermute( uPhase, pPerms4[k], 4, 0 ); - if ( uCanons[uPerm] == 0 ) - { - uCanons[uPerm] = uTruth; - uPhases[uPerm] = i; - uPerms[uPerm] = k; - - uPerm = ~uPerm & 0xFFFF; - uCanons[uPerm] = uTruth; - uPhases[uPerm] = i | 16; - uPerms[uPerm] = k; - } - else - assert( uCanons[uPerm] == uTruth ); - } - uPhase = Dar_TruthPolarize( ~uTruth & 0xFFFF, i, 4 ); - for ( k = 0; k < 24; k++ ) - { - uPerm = Dar_TruthPermute( uPhase, pPerms4[k], 4, 0 ); - if ( uCanons[uPerm] == 0 ) - { - uCanons[uPerm] = uTruth; - uPhases[uPerm] = i; - uPerms[uPerm] = k; - - uPerm = ~uPerm & 0xFFFF; - uCanons[uPerm] = uTruth; - uPhases[uPerm] = i | 16; - uPerms[uPerm] = k; - } - else - assert( uCanons[uPerm] == uTruth ); - } - } - } - uPhases[(1<<16)-1] = 16; - assert( nClasses == 222 ); - free( pPerms4 ); - if ( puCanons ) - *puCanons = uCanons; - else - free( uCanons ); - if ( puPhases ) - *puPhases = uPhases; - else - free( uPhases ); - if ( puPerms ) - *puPerms = uPerms; - else - free( uPerms ); - if ( puMap ) - *puMap = uMap; - else - free( uMap ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/dar/darScript.c b/src/vendor/stp/src/extlib-abc/aig/dar/darScript.c deleted file mode 100644 index e60df0043..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/dar/darScript.c +++ /dev/null @@ -1,392 +0,0 @@ -/**CFile**************************************************************** - - FileName [darScript.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Rewriting scripts.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darScript.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" -//#include "ioa.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs one iteration of AIG rewriting.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Dar_ManRewriteDefault( Aig_Man_t * pAig ) -{ - Aig_Man_t * pTemp; - Dar_RwrPar_t Pars, * pPars = &Pars; - Dar_ManDefaultRwrParams( pPars ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - Dar_ManRewrite( pAig, pPars ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - return pAig; -} - -/**Function************************************************************* - - Synopsis [Reproduces script "compress2".] - - Description [] - - SideEffects [This procedure does not tighten level during restructuring.] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose ) -//alias rwsat "st; rw -l; b -l; rw -l; rf -l" -{ - Aig_Man_t * pTemp; - - Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; - Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; - - Dar_ManDefaultRwrParams( pParsRwr ); - Dar_ManDefaultRefParams( pParsRef ); - - pParsRwr->fUpdateLevel = 0; - pParsRef->fUpdateLevel = 0; - - pParsRwr->fVerbose = fVerbose; - pParsRef->fVerbose = fVerbose; - - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - - // refactor - Dar_ManRefactor( pAig, pParsRef ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - - // balance - if ( fBalance ) - { - pAig = Dar_ManBalance( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - } - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - - return pAig; -} - - -/**Function************************************************************* - - Synopsis [Reproduces script "compress".] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Dar_ManCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ) -//alias compress2 "b -l; rw -l; rwz -l; b -l; rwz -l; b -l" -{ - Aig_Man_t * pTemp; - - Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; - Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; - - Dar_ManDefaultRwrParams( pParsRwr ); - Dar_ManDefaultRefParams( pParsRef ); - - pParsRwr->fUpdateLevel = fUpdateLevel; - pParsRef->fUpdateLevel = fUpdateLevel; - - pParsRwr->fVerbose = 0;//fVerbose; - pParsRef->fVerbose = 0;//fVerbose; - - pAig = Aig_ManDup( pAig, 0 ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // balance - if ( fBalance ) - { -// pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); -// Aig_ManStop( pTemp ); -// if ( fVerbose ) Aig_ManPrintStats( pAig ); - } - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // refactor - Dar_ManRefactor( pAig, pParsRef ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // balance - if ( fBalance ) - { - pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - } - - pParsRwr->fUseZeros = 1; - pParsRef->fUseZeros = 1; - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - return pAig; -} - -/**Function************************************************************* - - Synopsis [Reproduces script "compress2".] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ) -//alias compress2 "b -l; rw -l; rf -l; b -l; rw -l; rwz -l; b -l; rfz -l; rwz -l; b -l" -{ - Aig_Man_t * pTemp; - - Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; - Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; - - Dar_ManDefaultRwrParams( pParsRwr ); - Dar_ManDefaultRefParams( pParsRef ); - - pParsRwr->fUpdateLevel = fUpdateLevel; - pParsRef->fUpdateLevel = fUpdateLevel; - - pParsRwr->fVerbose = 0;//fVerbose; - pParsRef->fVerbose = 0;//fVerbose; - - pAig = Aig_ManDup( pAig, 0 ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // balance - if ( fBalance ) - { -// pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); -// Aig_ManStop( pTemp ); -// if ( fVerbose ) Aig_ManPrintStats( pAig ); - } - - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // refactor - Dar_ManRefactor( pAig, pParsRef ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // balance -// if ( fBalance ) - { - pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - } - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - pParsRwr->fUseZeros = 1; - pParsRef->fUseZeros = 1; - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // balance - if ( fBalance ) - { - pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - } - - // refactor - Dar_ManRefactor( pAig, pParsRef ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // rewrite - Dar_ManRewrite( pAig, pParsRwr ); - pAig = Aig_ManDup( pTemp = pAig, 0 ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - - // balance - if ( fBalance ) - { - pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); - Aig_ManStop( pTemp ); - if ( fVerbose ) Aig_ManPrintStats( pAig ); - } - return pAig; -} - -/**Function************************************************************* - - Synopsis [Reproduces script "compress2".] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Dar_ManChoiceSynthesis( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ) -//alias resyn "b; rw; rwz; b; rwz; b" -//alias resyn2 "b; rw; rf; b; rw; rwz; b; rfz; rwz; b" -{ - Vec_Ptr_t * vAigs; - vAigs = Vec_PtrAlloc( 3 ); - pAig = Aig_ManDup(pAig, 0); - Vec_PtrPush( vAigs, pAig ); - pAig = Dar_ManCompress (pAig, 0, fUpdateLevel, fVerbose); - Vec_PtrPush( vAigs, pAig ); - pAig = Dar_ManCompress2(pAig, fBalance, fUpdateLevel, fVerbose); - Vec_PtrPush( vAigs, pAig ); - return vAigs; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -/* -Vec_Ptr_t * Dar_ManChoiceSynthesisExt() -{ - Vec_Ptr_t * vAigs; - Aig_Man_t * pMan; - vAigs = Vec_PtrAlloc( 3 ); - pMan = Ioa_ReadAiger( "i10_1.aig", 1 ); - Vec_PtrPush( vAigs, pMan ); - pMan = Ioa_ReadAiger( "i10_2.aig", 1 ); - Vec_PtrPush( vAigs, pMan ); - pMan = Ioa_ReadAiger( "i10_3.aig", 1 ); - Vec_PtrPush( vAigs, pMan ); - return vAigs; -} -*/ - -/**Function************************************************************* - - Synopsis [Reproduces script "compress2".] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Dar_ManChoice( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ) -{ -/* - Aig_Man_t * pMan, * pTemp; - Vec_Ptr_t * vAigs; - int i, clk; - -clk = clock(); -// vAigs = Dar_ManChoiceSynthesisExt(); - vAigs = Dar_ManChoiceSynthesis( pAig, fBalance, fUpdateLevel, fVerbose ); - - // swap the first and last network - // this should lead to the primary choice being "better" because of synthesis - pMan = Vec_PtrPop( vAigs ); - Vec_PtrPush( vAigs, Vec_PtrEntry(vAigs,0) ); - Vec_PtrWriteEntry( vAigs, 0, pMan ); - -if ( fVerbose ) -{ -PRT( "Synthesis time", clock() - clk ); -} -clk = clock(); - pMan = Aig_ManChoicePartitioned( vAigs, 300 ); - Vec_PtrForEachEntry( vAigs, pTemp, i ) - Aig_ManStop( pTemp ); - Vec_PtrFree( vAigs ); -if ( fVerbose ) -{ -PRT( "Choicing time ", clock() - clk ); -} - return pMan; -*/ - return NULL; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/kit/kitIsop.c b/src/vendor/stp/src/extlib-abc/aig/kit/kitIsop.c deleted file mode 100644 index b2fbc9935..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/kit/kitIsop.c +++ /dev/null @@ -1,325 +0,0 @@ -/**CFile**************************************************************** - - FileName [kitIsop.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Computation kit.] - - Synopsis [ISOP computation based on Morreale's algorithm.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - Dec 6, 2006.] - - Revision [$Id: kitIsop.c,v 1.00 2006/12/06 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -// ISOP computation fails if intermediate memory usage exceed this limit -#define KIT_ISOP_MEM_LIMIT (1<<16) - -// static procedures to compute ISOP -static unsigned * Kit_TruthIsop_rec( unsigned * puOn, unsigned * puOnDc, int nVars, Kit_Sop_t * pcRes, Vec_Int_t * vStore ); -static unsigned Kit_TruthIsop5_rec( unsigned uOn, unsigned uOnDc, int nVars, Kit_Sop_t * pcRes, Vec_Int_t * vStore ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Computes ISOP from TT.] - - Description [Returns the cover in vMemory. Uses the rest of array in vMemory - as an intermediate memory storage. Returns the cover with -1 cubes, if the - the computation exceeded the memory limit (KIT_ISOP_MEM_LIMIT words of - intermediate data).] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthIsop( unsigned * puTruth, int nVars, Vec_Int_t * vMemory, int fTryBoth ) -{ - Kit_Sop_t cRes, * pcRes = &cRes; - Kit_Sop_t cRes2, * pcRes2 = &cRes2; - unsigned * pResult; - int RetValue = 0; - assert( nVars >= 0 && nVars < 16 ); - // if nVars < 5, make sure it does not depend on those vars -// for ( i = nVars; i < 5; i++ ) -// assert( !Kit_TruthVarInSupport(puTruth, 5, i) ); - // prepare memory manager - Vec_IntClear( vMemory ); - Vec_IntGrow( vMemory, KIT_ISOP_MEM_LIMIT ); - // compute ISOP for the direct polarity - pResult = Kit_TruthIsop_rec( puTruth, puTruth, nVars, pcRes, vMemory ); - if ( pcRes->nCubes == -1 ) - { - vMemory->nSize = -1; - return -1; - } - assert( Kit_TruthIsEqual( puTruth, pResult, nVars ) ); - if ( pcRes->nCubes == 0 || (pcRes->nCubes == 1 && pcRes->pCubes[0] == 0) ) - { - vMemory->pArray[0] = 0; - Vec_IntShrink( vMemory, pcRes->nCubes ); - return 0; - } - if ( fTryBoth ) - { - // compute ISOP for the complemented polarity - Kit_TruthNot( puTruth, puTruth, nVars ); - pResult = Kit_TruthIsop_rec( puTruth, puTruth, nVars, pcRes2, vMemory ); - if ( pcRes2->nCubes >= 0 ) - { - assert( Kit_TruthIsEqual( puTruth, pResult, nVars ) ); - if ( pcRes->nCubes > pcRes2->nCubes ) - { - RetValue = 1; - pcRes = pcRes2; - } - } - Kit_TruthNot( puTruth, puTruth, nVars ); - } -// printf( "%d ", vMemory->nSize ); - // move the cover representation to the beginning of the memory buffer - memmove( vMemory->pArray, pcRes->pCubes, pcRes->nCubes * sizeof(unsigned) ); - Vec_IntShrink( vMemory, pcRes->nCubes ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Computes ISOP 6 variables or more.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Kit_TruthIsop_rec( unsigned * puOn, unsigned * puOnDc, int nVars, Kit_Sop_t * pcRes, Vec_Int_t * vStore ) -{ - Kit_Sop_t cRes0, cRes1, cRes2; - Kit_Sop_t * pcRes0 = &cRes0, * pcRes1 = &cRes1, * pcRes2 = &cRes2; - unsigned * puRes0, * puRes1, * puRes2; - unsigned * puOn0, * puOn1, * puOnDc0, * puOnDc1, * pTemp, * pTemp0, * pTemp1; - int i, k, Var, nWords, nWordsAll; -// assert( Kit_TruthIsImply( puOn, puOnDc, nVars ) ); - // allocate room for the resulting truth table - nWordsAll = Kit_TruthWordNum( nVars ); - pTemp = Vec_IntFetch( vStore, nWordsAll ); - if ( pTemp == NULL ) - { - pcRes->nCubes = -1; - return NULL; - } - // check for constants - if ( Kit_TruthIsConst0( puOn, nVars ) ) - { - pcRes->nCubes = 0; - pcRes->pCubes = NULL; - Kit_TruthClear( pTemp, nVars ); - return pTemp; - } - if ( Kit_TruthIsConst1( puOnDc, nVars ) ) - { - pcRes->nCubes = 1; - pcRes->pCubes = Vec_IntFetch( vStore, 1 ); - if ( pcRes->pCubes == NULL ) - { - pcRes->nCubes = -1; - return NULL; - } - pcRes->pCubes[0] = 0; - Kit_TruthFill( pTemp, nVars ); - return pTemp; - } - assert( nVars > 0 ); - // find the topmost var - for ( Var = nVars-1; Var >= 0; Var-- ) - if ( Kit_TruthVarInSupport( puOn, nVars, Var ) || - Kit_TruthVarInSupport( puOnDc, nVars, Var ) ) - break; - assert( Var >= 0 ); - // consider a simple case when one-word computation can be used - if ( Var < 5 ) - { - unsigned uRes = Kit_TruthIsop5_rec( puOn[0], puOnDc[0], Var+1, pcRes, vStore ); - for ( i = 0; i < nWordsAll; i++ ) - pTemp[i] = uRes; - return pTemp; - } - assert( Var >= 5 ); - nWords = Kit_TruthWordNum( Var ); - // cofactor - puOn0 = puOn; puOn1 = puOn + nWords; - puOnDc0 = puOnDc; puOnDc1 = puOnDc + nWords; - pTemp0 = pTemp; pTemp1 = pTemp + nWords; - // solve for cofactors - Kit_TruthSharp( pTemp0, puOn0, puOnDc1, Var ); - puRes0 = Kit_TruthIsop_rec( pTemp0, puOnDc0, Var, pcRes0, vStore ); - if ( pcRes0->nCubes == -1 ) - { - pcRes->nCubes = -1; - return NULL; - } - Kit_TruthSharp( pTemp1, puOn1, puOnDc0, Var ); - puRes1 = Kit_TruthIsop_rec( pTemp1, puOnDc1, Var, pcRes1, vStore ); - if ( pcRes1->nCubes == -1 ) - { - pcRes->nCubes = -1; - return NULL; - } - Kit_TruthSharp( pTemp0, puOn0, puRes0, Var ); - Kit_TruthSharp( pTemp1, puOn1, puRes1, Var ); - Kit_TruthOr( pTemp0, pTemp0, pTemp1, Var ); - Kit_TruthAnd( pTemp1, puOnDc0, puOnDc1, Var ); - puRes2 = Kit_TruthIsop_rec( pTemp0, pTemp1, Var, pcRes2, vStore ); - if ( pcRes2->nCubes == -1 ) - { - pcRes->nCubes = -1; - return NULL; - } - // create the resulting cover - pcRes->nCubes = pcRes0->nCubes + pcRes1->nCubes + pcRes2->nCubes; - pcRes->pCubes = Vec_IntFetch( vStore, pcRes->nCubes ); - if ( pcRes->pCubes == NULL ) - { - pcRes->nCubes = -1; - return NULL; - } - k = 0; - for ( i = 0; i < pcRes0->nCubes; i++ ) - pcRes->pCubes[k++] = pcRes0->pCubes[i] | (1 << ((Var<<1)+0)); - for ( i = 0; i < pcRes1->nCubes; i++ ) - pcRes->pCubes[k++] = pcRes1->pCubes[i] | (1 << ((Var<<1)+1)); - for ( i = 0; i < pcRes2->nCubes; i++ ) - pcRes->pCubes[k++] = pcRes2->pCubes[i]; - assert( k == pcRes->nCubes ); - // create the resulting truth table - Kit_TruthOr( pTemp0, puRes0, puRes2, Var ); - Kit_TruthOr( pTemp1, puRes1, puRes2, Var ); - // copy the table if needed - nWords <<= 1; - for ( i = 1; i < nWordsAll/nWords; i++ ) - for ( k = 0; k < nWords; k++ ) - pTemp[i*nWords + k] = pTemp[k]; - // verify in the end -// assert( Kit_TruthIsImply( puOn, pTemp, nVars ) ); -// assert( Kit_TruthIsImply( pTemp, puOnDc, nVars ) ); - return pTemp; -} - -/**Function************************************************************* - - Synopsis [Computes ISOP for 5 variables or less.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Kit_TruthIsop5_rec( unsigned uOn, unsigned uOnDc, int nVars, Kit_Sop_t * pcRes, Vec_Int_t * vStore ) -{ - unsigned uMasks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; - Kit_Sop_t cRes0, cRes1, cRes2; - Kit_Sop_t * pcRes0 = &cRes0, * pcRes1 = &cRes1, * pcRes2 = &cRes2; - unsigned uOn0, uOn1, uOnDc0, uOnDc1, uRes0, uRes1, uRes2; - int i, k, Var; - assert( nVars <= 5 ); - assert( (uOn & ~uOnDc) == 0 ); - if ( uOn == 0 ) - { - pcRes->nCubes = 0; - pcRes->pCubes = NULL; - return 0; - } - if ( uOnDc == 0xFFFFFFFF ) - { - pcRes->nCubes = 1; - pcRes->pCubes = Vec_IntFetch( vStore, 1 ); - if ( pcRes->pCubes == NULL ) - { - pcRes->nCubes = -1; - return 0; - } - pcRes->pCubes[0] = 0; - return 0xFFFFFFFF; - } - assert( nVars > 0 ); - // find the topmost var - for ( Var = nVars-1; Var >= 0; Var-- ) - if ( Kit_TruthVarInSupport( &uOn, 5, Var ) || - Kit_TruthVarInSupport( &uOnDc, 5, Var ) ) - break; - assert( Var >= 0 ); - // cofactor - uOn0 = uOn1 = uOn; - uOnDc0 = uOnDc1 = uOnDc; - Kit_TruthCofactor0( &uOn0, Var + 1, Var ); - Kit_TruthCofactor1( &uOn1, Var + 1, Var ); - Kit_TruthCofactor0( &uOnDc0, Var + 1, Var ); - Kit_TruthCofactor1( &uOnDc1, Var + 1, Var ); - // solve for cofactors - uRes0 = Kit_TruthIsop5_rec( uOn0 & ~uOnDc1, uOnDc0, Var, pcRes0, vStore ); - if ( pcRes0->nCubes == -1 ) - { - pcRes->nCubes = -1; - return 0; - } - uRes1 = Kit_TruthIsop5_rec( uOn1 & ~uOnDc0, uOnDc1, Var, pcRes1, vStore ); - if ( pcRes1->nCubes == -1 ) - { - pcRes->nCubes = -1; - return 0; - } - uRes2 = Kit_TruthIsop5_rec( (uOn0 & ~uRes0) | (uOn1 & ~uRes1), uOnDc0 & uOnDc1, Var, pcRes2, vStore ); - if ( pcRes2->nCubes == -1 ) - { - pcRes->nCubes = -1; - return 0; - } - // create the resulting cover - pcRes->nCubes = pcRes0->nCubes + pcRes1->nCubes + pcRes2->nCubes; - pcRes->pCubes = Vec_IntFetch( vStore, pcRes->nCubes ); - if ( pcRes->pCubes == NULL ) - { - pcRes->nCubes = -1; - return 0; - } - k = 0; - for ( i = 0; i < pcRes0->nCubes; i++ ) - pcRes->pCubes[k++] = pcRes0->pCubes[i] | (1 << ((Var<<1)+0)); - for ( i = 0; i < pcRes1->nCubes; i++ ) - pcRes->pCubes[k++] = pcRes1->pCubes[i] | (1 << ((Var<<1)+1)); - for ( i = 0; i < pcRes2->nCubes; i++ ) - pcRes->pCubes[k++] = pcRes2->pCubes[i]; - assert( k == pcRes->nCubes ); - // derive the final truth table - uRes2 |= (uRes0 & ~uMasks[Var]) | (uRes1 & uMasks[Var]); -// assert( (uOn & ~uRes2) == 0 ); -// assert( (uRes2 & ~uOnDc) == 0 ); - return uRes2; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/kit/kitSop.c b/src/vendor/stp/src/extlib-abc/aig/kit/kitSop.c deleted file mode 100644 index f2c5cc44c..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/kit/kitSop.c +++ /dev/null @@ -1,572 +0,0 @@ -/**CFile**************************************************************** - - FileName [kitSop.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Computation kit.] - - Synopsis [Procedures involving SOPs.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - Dec 6, 2006.] - - Revision [$Id: kitSop.c,v 1.00 2006/12/06 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Creates SOP from the cube array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopCreate( Kit_Sop_t * cResult, Vec_Int_t * vInput, int nVars, Vec_Int_t * vMemory ) -{ - unsigned uCube; - int i; - // start the cover - cResult->nCubes = 0; - cResult->pCubes = Vec_IntFetch( vMemory, Vec_IntSize(vInput) ); - // add the cubes - Vec_IntForEachEntry( vInput, uCube, i ) - Kit_SopPushCube( cResult, uCube ); -} - -/**Function************************************************************* - - Synopsis [Creates SOP from the cube array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopCreateInverse( Kit_Sop_t * cResult, Vec_Int_t * vInput, int nLits, Vec_Int_t * vMemory ) -{ - unsigned uCube, uMask = 0; - int i, nCubes = Vec_IntSize(vInput); - // start the cover - cResult->nCubes = 0; - cResult->pCubes = Vec_IntFetch( vMemory, nCubes ); - // add the cubes -// Vec_IntForEachEntry( vInput, uCube, i ) - for ( i = 0; i < nCubes; i++ ) - { - uCube = Vec_IntEntry( vInput, i ); - uMask = ((uCube | (uCube >> 1)) & 0x55555555); - uMask |= (uMask << 1); - Kit_SopPushCube( cResult, uCube ^ uMask ); - } -} - -/**Function************************************************************* - - Synopsis [Duplicates SOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopDup( Kit_Sop_t * cResult, Kit_Sop_t * cSop, Vec_Int_t * vMemory ) -{ - unsigned uCube; - int i; - // start the cover - cResult->nCubes = 0; - cResult->pCubes = Vec_IntFetch( vMemory, Kit_SopCubeNum(cSop) ); - // add the cubes - Kit_SopForEachCube( cSop, uCube, i ) - Kit_SopPushCube( cResult, uCube ); -} - -/**Function************************************************************* - - Synopsis [Derives the quotient of division by literal.] - - Description [Reduces the cover to be equal to the result of - division of the given cover by the literal.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopDivideByLiteralQuo( Kit_Sop_t * cSop, int iLit ) -{ - unsigned uCube; - int i, k = 0; - Kit_SopForEachCube( cSop, uCube, i ) - { - if ( Kit_CubeHasLit(uCube, iLit) ) - Kit_SopWriteCube( cSop, Kit_CubeRemLit(uCube, iLit), k++ ); - } - Kit_SopShrink( cSop, k ); -} - - -/**Function************************************************************* - - Synopsis [Divides cover by one cube.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopDivideByCube( Kit_Sop_t * cSop, Kit_Sop_t * cDiv, Kit_Sop_t * vQuo, Kit_Sop_t * vRem, Vec_Int_t * vMemory ) -{ - unsigned uCube, uDiv; - int i; - // get the only cube - assert( Kit_SopCubeNum(cDiv) == 1 ); - uDiv = Kit_SopCube(cDiv, 0); - // allocate covers - vQuo->nCubes = 0; - vQuo->pCubes = Vec_IntFetch( vMemory, Kit_SopCubeNum(cSop) ); - vRem->nCubes = 0; - vRem->pCubes = Vec_IntFetch( vMemory, Kit_SopCubeNum(cSop) ); - // sort the cubes - Kit_SopForEachCube( cSop, uCube, i ) - { - if ( Kit_CubeContains( uCube, uDiv ) ) - Kit_SopPushCube( vQuo, Kit_CubeSharp(uCube, uDiv) ); - else - Kit_SopPushCube( vRem, uCube ); - } -} - -/**Function************************************************************* - - Synopsis [Divides cover by one cube.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopDivideInternal( Kit_Sop_t * cSop, Kit_Sop_t * cDiv, Kit_Sop_t * vQuo, Kit_Sop_t * vRem, Vec_Int_t * vMemory ) -{ - unsigned uCube, uDiv, uCube2, uDiv2, uQuo; - int i, i2, k, k2, nCubesRem; - assert( Kit_SopCubeNum(cSop) >= Kit_SopCubeNum(cDiv) ); - // consider special case - if ( Kit_SopCubeNum(cDiv) == 1 ) - { - Kit_SopDivideByCube( cSop, cDiv, vQuo, vRem, vMemory ); - return; - } - // allocate quotient - vQuo->nCubes = 0; - vQuo->pCubes = Vec_IntFetch( vMemory, Kit_SopCubeNum(cSop) / Kit_SopCubeNum(cDiv) ); - // for each cube of the cover - // it either belongs to the quotient or to the remainder - Kit_SopForEachCube( cSop, uCube, i ) - { - // skip taken cubes - if ( Kit_CubeIsMarked(uCube) ) - continue; - // find a matching cube in the divisor - uDiv = ~0; - Kit_SopForEachCube( cDiv, uDiv, k ) - if ( Kit_CubeContains( uCube, uDiv ) ) - break; - // the cube is not found - if ( k == Kit_SopCubeNum(cDiv) ) - continue; - // the quotient cube exists - uQuo = Kit_CubeSharp( uCube, uDiv ); - // find corresponding cubes for other cubes of the divisor - uDiv2 = ~0; - Kit_SopForEachCube( cDiv, uDiv2, k2 ) - { - if ( k2 == k ) - continue; - // find a matching cube - Kit_SopForEachCube( cSop, uCube2, i2 ) - { - // skip taken cubes - if ( Kit_CubeIsMarked(uCube2) ) - continue; - // check if the cube can be used - if ( Kit_CubeContains( uCube2, uDiv2 ) && uQuo == Kit_CubeSharp( uCube2, uDiv2 ) ) - break; - } - // the case when the cube is not found - if ( i2 == Kit_SopCubeNum(cSop) ) - break; - } - // we did not find some cubes - continue looking at other cubes - if ( k2 != Kit_SopCubeNum(cDiv) ) - continue; - // we found all cubes - add the quotient cube - Kit_SopPushCube( vQuo, uQuo ); - - // mark the first cube - Kit_SopWriteCube( cSop, Kit_CubeMark(uCube), i ); - // mark other cubes that have this quotient - Kit_SopForEachCube( cDiv, uDiv2, k2 ) - { - if ( k2 == k ) - continue; - // find a matching cube - Kit_SopForEachCube( cSop, uCube2, i2 ) - { - // skip taken cubes - if ( Kit_CubeIsMarked(uCube2) ) - continue; - // check if the cube can be used - if ( Kit_CubeContains( uCube2, uDiv2 ) && uQuo == Kit_CubeSharp( uCube2, uDiv2 ) ) - break; - } - assert( i2 < Kit_SopCubeNum(cSop) ); - // the cube is found, mark it - // (later we will add all unmarked cubes to the remainder) - Kit_SopWriteCube( cSop, Kit_CubeMark(uCube2), i2 ); - } - } - // determine the number of cubes in the remainder - nCubesRem = Kit_SopCubeNum(cSop) - Kit_SopCubeNum(vQuo) * Kit_SopCubeNum(cDiv); - // allocate remainder - vRem->nCubes = 0; - vRem->pCubes = Vec_IntFetch( vMemory, nCubesRem ); - // finally add the remaining unmarked cubes to the remainder - // and clean the marked cubes in the cover - Kit_SopForEachCube( cSop, uCube, i ) - { - if ( !Kit_CubeIsMarked(uCube) ) - { - Kit_SopPushCube( vRem, uCube ); - continue; - } - Kit_SopWriteCube( cSop, Kit_CubeUnmark(uCube), i ); - } - assert( nCubesRem == Kit_SopCubeNum(vRem) ); -} - -/**Function************************************************************* - - Synopsis [Returns the common cube.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Kit_SopCommonCube( Kit_Sop_t * cSop ) -{ - unsigned uMask, uCube; - int i; - uMask = ~(unsigned)0; - Kit_SopForEachCube( cSop, uCube, i ) - uMask &= uCube; - return uMask; -} - -/**Function************************************************************* - - Synopsis [Makes the cover cube-free.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopMakeCubeFree( Kit_Sop_t * cSop ) -{ - unsigned uMask, uCube; - int i; - uMask = Kit_SopCommonCube( cSop ); - if ( uMask == 0 ) - return; - // remove the common cube - Kit_SopForEachCube( cSop, uCube, i ) - Kit_SopWriteCube( cSop, Kit_CubeSharp(uCube, uMask), i ); -} - -/**Function************************************************************* - - Synopsis [Checks if the cover is cube-free.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_SopIsCubeFree( Kit_Sop_t * cSop ) -{ - return Kit_SopCommonCube( cSop ) == 0; -} - -/**Function************************************************************* - - Synopsis [Creates SOP composes of the common cube of the given SOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopCommonCubeCover( Kit_Sop_t * cResult, Kit_Sop_t * cSop, Vec_Int_t * vMemory ) -{ - assert( Kit_SopCubeNum(cSop) > 0 ); - cResult->nCubes = 0; - cResult->pCubes = Vec_IntFetch( vMemory, 1 ); - Kit_SopPushCube( cResult, Kit_SopCommonCube(cSop) ); -} - - -/**Function************************************************************* - - Synopsis [Find any literal that occurs more than once.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_SopAnyLiteral( Kit_Sop_t * cSop, int nLits ) -{ - unsigned uCube; - int i, k, nLitsCur; - // go through each literal - for ( i = 0; i < nLits; i++ ) - { - // go through all the cubes - nLitsCur = 0; - Kit_SopForEachCube( cSop, uCube, k ) - if ( Kit_CubeHasLit(uCube, i) ) - nLitsCur++; - if ( nLitsCur > 1 ) - return i; - } - return -1; -} - -/**Function************************************************************* - - Synopsis [Find the least often occurring literal.] - - Description [Find the least often occurring literal among those - that occur more than once.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_SopWorstLiteral( Kit_Sop_t * cSop, int nLits ) -{ - unsigned uCube; - int i, k, iMin, nLitsMin, nLitsCur; - int fUseFirst = 1; - - // go through each literal - iMin = -1; - nLitsMin = 1000000; - for ( i = 0; i < nLits; i++ ) - { - // go through all the cubes - nLitsCur = 0; - Kit_SopForEachCube( cSop, uCube, k ) - if ( Kit_CubeHasLit(uCube, i) ) - nLitsCur++; - // skip the literal that does not occur or occurs once - if ( nLitsCur < 2 ) - continue; - // check if this is the best literal - if ( fUseFirst ) - { - if ( nLitsMin > nLitsCur ) - { - nLitsMin = nLitsCur; - iMin = i; - } - } - else - { - if ( nLitsMin >= nLitsCur ) - { - nLitsMin = nLitsCur; - iMin = i; - } - } - } - if ( nLitsMin < 1000000 ) - return iMin; - return -1; -} - -/**Function************************************************************* - - Synopsis [Find the least often occurring literal.] - - Description [Find the least often occurring literal among those - that occur more than once.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_SopBestLiteral( Kit_Sop_t * cSop, int nLits, unsigned uMask ) -{ - unsigned uCube; - int i, k, iMax, nLitsMax, nLitsCur; - int fUseFirst = 1; - - // go through each literal - iMax = -1; - nLitsMax = -1; - for ( i = 0; i < nLits; i++ ) - { - if ( !Kit_CubeHasLit(uMask, i) ) - continue; - // go through all the cubes - nLitsCur = 0; - Kit_SopForEachCube( cSop, uCube, k ) - if ( Kit_CubeHasLit(uCube, i) ) - nLitsCur++; - // skip the literal that does not occur or occurs once - if ( nLitsCur < 2 ) - continue; - // check if this is the best literal - if ( fUseFirst ) - { - if ( nLitsMax < nLitsCur ) - { - nLitsMax = nLitsCur; - iMax = i; - } - } - else - { - if ( nLitsMax <= nLitsCur ) - { - nLitsMax = nLitsCur; - iMax = i; - } - } - } - if ( nLitsMax >= 0 ) - return iMax; - return -1; -} - -/**Function************************************************************* - - Synopsis [Computes a level-zero kernel.] - - Description [Modifies the cover to contain one level-zero kernel.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopDivisorZeroKernel_rec( Kit_Sop_t * cSop, int nLits ) -{ - int iLit; - // find any literal that occurs at least two times - iLit = Kit_SopWorstLiteral( cSop, nLits ); - if ( iLit == -1 ) - return; - // derive the cube-free quotient - Kit_SopDivideByLiteralQuo( cSop, iLit ); // the same cover - Kit_SopMakeCubeFree( cSop ); // the same cover - // call recursively - Kit_SopDivisorZeroKernel_rec( cSop, nLits ); // the same cover -} - -/**Function************************************************************* - - Synopsis [Computes the quick divisor of the cover.] - - Description [Returns 0, if there is no divisor other than trivial.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_SopDivisor( Kit_Sop_t * cResult, Kit_Sop_t * cSop, int nLits, Vec_Int_t * vMemory ) -{ - if ( Kit_SopCubeNum(cSop) <= 1 ) - return 0; - if ( Kit_SopAnyLiteral( cSop, nLits ) == -1 ) - return 0; - // duplicate the cover - Kit_SopDup( cResult, cSop, vMemory ); - // perform the kerneling - Kit_SopDivisorZeroKernel_rec( cResult, nLits ); - assert( Kit_SopCubeNum(cResult) > 0 ); - return 1; -} - - -/**Function************************************************************* - - Synopsis [Create the one-literal cover with the best literal from cSop.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_SopBestLiteralCover( Kit_Sop_t * cResult, Kit_Sop_t * cSop, unsigned uCube, int nLits, Vec_Int_t * vMemory ) -{ - int iLitBest; - // get the best literal - iLitBest = Kit_SopBestLiteral( cSop, nLits, uCube ); - // start the cover - cResult->nCubes = 0; - cResult->pCubes = Vec_IntFetch( vMemory, 1 ); - // set the cube - Kit_SopPushCube( cResult, Kit_CubeSetLit(0, iLitBest) ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/aig/kit/kitTruth.c b/src/vendor/stp/src/extlib-abc/aig/kit/kitTruth.c deleted file mode 100644 index 2df3ce996..000000000 --- a/src/vendor/stp/src/extlib-abc/aig/kit/kitTruth.c +++ /dev/null @@ -1,1721 +0,0 @@ -/**CFile**************************************************************** - - FileName [kitTruth.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Computation kit.] - - Synopsis [Procedures involving truth tables.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - Dec 6, 2006.] - - Revision [$Id: kitTruth.c,v 1.00 2006/12/06 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Swaps two adjacent variables in the truth table.] - - Description [Swaps var number Start and var number Start+1 (0-based numbers). - The input truth table is pIn. The output truth table is pOut.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthSwapAdjacentVars( unsigned * pOut, unsigned * pIn, int nVars, int iVar ) -{ - static unsigned PMasks[4][3] = { - { 0x99999999, 0x22222222, 0x44444444 }, - { 0xC3C3C3C3, 0x0C0C0C0C, 0x30303030 }, - { 0xF00FF00F, 0x00F000F0, 0x0F000F00 }, - { 0xFF0000FF, 0x0000FF00, 0x00FF0000 } - }; - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step, Shift; - - assert( iVar < nVars - 1 ); - if ( iVar < 4 ) - { - Shift = (1 << iVar); - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & PMasks[iVar][0]) | ((pIn[i] & PMasks[iVar][1]) << Shift) | ((pIn[i] & PMasks[iVar][2]) >> Shift); - } - else if ( iVar > 4 ) - { - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 4*Step ) - { - for ( i = 0; i < Step; i++ ) - pOut[i] = pIn[i]; - for ( i = 0; i < Step; i++ ) - pOut[Step+i] = pIn[2*Step+i]; - for ( i = 0; i < Step; i++ ) - pOut[2*Step+i] = pIn[Step+i]; - for ( i = 0; i < Step; i++ ) - pOut[3*Step+i] = pIn[3*Step+i]; - pIn += 4*Step; - pOut += 4*Step; - } - } - else // if ( iVar == 4 ) - { - for ( i = 0; i < nWords; i += 2 ) - { - pOut[i] = (pIn[i] & 0x0000FFFF) | ((pIn[i+1] & 0x0000FFFF) << 16); - pOut[i+1] = (pIn[i+1] & 0xFFFF0000) | ((pIn[i] & 0xFFFF0000) >> 16); - } - } -} - -/**Function************************************************************* - - Synopsis [Swaps two adjacent variables in the truth table.] - - Description [Swaps var number Start and var number Start+1 (0-based numbers). - The input truth table is pIn. The output truth table is pOut.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthSwapAdjacentVars2( unsigned * pIn, unsigned * pOut, int nVars, int Start ) -{ - int nWords = (nVars <= 5)? 1 : (1 << (nVars-5)); - int i, k, Step; - - assert( Start < nVars - 1 ); - switch ( Start ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0x99999999) | ((pIn[i] & 0x22222222) << 1) | ((pIn[i] & 0x44444444) >> 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xC3C3C3C3) | ((pIn[i] & 0x0C0C0C0C) << 2) | ((pIn[i] & 0x30303030) >> 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xF00FF00F) | ((pIn[i] & 0x00F000F0) << 4) | ((pIn[i] & 0x0F000F00) >> 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xFF0000FF) | ((pIn[i] & 0x0000FF00) << 8) | ((pIn[i] & 0x00FF0000) >> 8); - return; - case 4: - for ( i = 0; i < nWords; i += 2 ) - { - pOut[i] = (pIn[i] & 0x0000FFFF) | ((pIn[i+1] & 0x0000FFFF) << 16); - pOut[i+1] = (pIn[i+1] & 0xFFFF0000) | ((pIn[i] & 0xFFFF0000) >> 16); - } - return; - default: - Step = (1 << (Start - 5)); - for ( k = 0; k < nWords; k += 4*Step ) - { - for ( i = 0; i < Step; i++ ) - pOut[i] = pIn[i]; - for ( i = 0; i < Step; i++ ) - pOut[Step+i] = pIn[2*Step+i]; - for ( i = 0; i < Step; i++ ) - pOut[2*Step+i] = pIn[Step+i]; - for ( i = 0; i < Step; i++ ) - pOut[3*Step+i] = pIn[3*Step+i]; - pIn += 4*Step; - pOut += 4*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Expands the truth table according to the phase.] - - Description [The input and output truth tables are in pIn/pOut. The current number - of variables is nVars. The total number of variables in nVarsAll. The last argument - (Phase) contains shows where the variables should go.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthStretch( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn ) -{ - unsigned * pTemp; - int i, k, Var = nVars - 1, Counter = 0; - for ( i = nVarsAll - 1; i >= 0; i-- ) - if ( Phase & (1 << i) ) - { - for ( k = Var; k < i; k++ ) - { - Kit_TruthSwapAdjacentVars( pOut, pIn, nVarsAll, k ); - pTemp = pIn; pIn = pOut; pOut = pTemp; - Counter++; - } - Var--; - } - assert( Var == -1 ); - // swap if it was moved an even number of times - if ( fReturnIn ^ !(Counter & 1) ) - Kit_TruthCopy( pOut, pIn, nVarsAll ); -} - -/**Function************************************************************* - - Synopsis [Shrinks the truth table according to the phase.] - - Description [The input and output truth tables are in pIn/pOut. The current number - of variables is nVars. The total number of variables in nVarsAll. The last argument - (Phase) contains shows what variables should remain.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthShrink( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn ) -{ - unsigned * pTemp; - int i, k, Var = 0, Counter = 0; - for ( i = 0; i < nVarsAll; i++ ) - if ( Phase & (1 << i) ) - { - for ( k = i-1; k >= Var; k-- ) - { - Kit_TruthSwapAdjacentVars( pOut, pIn, nVarsAll, k ); - pTemp = pIn; pIn = pOut; pOut = pTemp; - Counter++; - } - Var++; - } - assert( Var == nVars ); - // swap if it was moved an even number of times - if ( fReturnIn ^ !(Counter & 1) ) - Kit_TruthCopy( pOut, pIn, nVarsAll ); -} - - -/**Function************************************************************* - - Synopsis [Returns 1 if TT depends on the given variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthVarInSupport( unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - if ( (pTruth[i] & 0x55555555) != ((pTruth[i] & 0xAAAAAAAA) >> 1) ) - return 1; - return 0; - case 1: - for ( i = 0; i < nWords; i++ ) - if ( (pTruth[i] & 0x33333333) != ((pTruth[i] & 0xCCCCCCCC) >> 2) ) - return 1; - return 0; - case 2: - for ( i = 0; i < nWords; i++ ) - if ( (pTruth[i] & 0x0F0F0F0F) != ((pTruth[i] & 0xF0F0F0F0) >> 4) ) - return 1; - return 0; - case 3: - for ( i = 0; i < nWords; i++ ) - if ( (pTruth[i] & 0x00FF00FF) != ((pTruth[i] & 0xFF00FF00) >> 8) ) - return 1; - return 0; - case 4: - for ( i = 0; i < nWords; i++ ) - if ( (pTruth[i] & 0x0000FFFF) != ((pTruth[i] & 0xFFFF0000) >> 16) ) - return 1; - return 0; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - if ( pTruth[i] != pTruth[Step+i] ) - return 1; - pTruth += 2*Step; - } - return 0; - } -} - -/**Function************************************************************* - - Synopsis [Returns the number of support vars.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthSupportSize( unsigned * pTruth, int nVars ) -{ - int i, Counter = 0; - for ( i = 0; i < nVars; i++ ) - Counter += Kit_TruthVarInSupport( pTruth, nVars, i ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Returns support of the function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Kit_TruthSupport( unsigned * pTruth, int nVars ) -{ - int i, Support = 0; - for ( i = 0; i < nVars; i++ ) - if ( Kit_TruthVarInSupport( pTruth, nVars, i ) ) - Support |= (1 << i); - return Support; -} - - - -/**Function************************************************************* - - Synopsis [Computes negative cofactor of the function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthCofactor0( unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0x55555555) | ((pTruth[i] & 0x55555555) << 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0x33333333) | ((pTruth[i] & 0x33333333) << 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0x0F0F0F0F) | ((pTruth[i] & 0x0F0F0F0F) << 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0x00FF00FF) | ((pTruth[i] & 0x00FF00FF) << 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0x0000FFFF) | ((pTruth[i] & 0x0000FFFF) << 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - pTruth[Step+i] = pTruth[i]; - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Computes positive cofactor of the function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthCofactor1( unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0xAAAAAAAA) | ((pTruth[i] & 0xAAAAAAAA) >> 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0xCCCCCCCC) | ((pTruth[i] & 0xCCCCCCCC) >> 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0xF0F0F0F0) | ((pTruth[i] & 0xF0F0F0F0) >> 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0xFF00FF00) | ((pTruth[i] & 0xFF00FF00) >> 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = (pTruth[i] & 0xFFFF0000) | ((pTruth[i] & 0xFFFF0000) >> 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - pTruth[i] = pTruth[Step+i]; - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Computes positive cofactor of the function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthCofactor0New( unsigned * pOut, unsigned * pIn, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0x55555555) | ((pIn[i] & 0x55555555) << 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0x33333333) | ((pIn[i] & 0x33333333) << 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0x0F0F0F0F) | ((pIn[i] & 0x0F0F0F0F) << 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0x00FF00FF) | ((pIn[i] & 0x00FF00FF) << 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0x0000FFFF) | ((pIn[i] & 0x0000FFFF) << 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - pOut[i] = pOut[Step+i] = pIn[i]; - pIn += 2*Step; - pOut += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Computes positive cofactor of the function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthCofactor1New( unsigned * pOut, unsigned * pIn, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xAAAAAAAA) | ((pIn[i] & 0xAAAAAAAA) >> 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xCCCCCCCC) | ((pIn[i] & 0xCCCCCCCC) >> 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xF0F0F0F0) | ((pIn[i] & 0xF0F0F0F0) >> 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xFF00FF00) | ((pIn[i] & 0xFF00FF00) >> 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pIn[i] & 0xFFFF0000) | ((pIn[i] & 0xFFFF0000) >> 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - pOut[i] = pOut[Step+i] = pIn[Step+i]; - pIn += 2*Step; - pOut += 2*Step; - } - return; - } -} - - -/**Function************************************************************* - - Synopsis [Existentially quantifies the variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthExist( unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pTruth[i] |= ((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pTruth[i] |= ((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pTruth[i] |= ((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pTruth[i] |= ((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pTruth[i] |= ((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - pTruth[i] |= pTruth[Step+i]; - pTruth[Step+i] = pTruth[i]; - } - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Existentially quantifies the variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthExistNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] | ((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] | ((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] | ((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] | ((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] | ((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - pRes[i] = pTruth[i] | pTruth[Step+i]; - pRes[Step+i] = pRes[i]; - } - pRes += 2*Step; - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Existantially quantifies the set of variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthExistSet( unsigned * pRes, unsigned * pTruth, int nVars, unsigned uMask ) -{ - int v; - Kit_TruthCopy( pRes, pTruth, nVars ); - for ( v = 0; v < nVars; v++ ) - if ( uMask & (1 << v) ) - Kit_TruthExist( pRes, nVars, v ); -} - -/**Function************************************************************* - - Synopsis [Unversally quantifies the variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthForall( unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pTruth[i] &= ((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pTruth[i] &= ((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pTruth[i] &= ((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pTruth[i] &= ((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pTruth[i] &= ((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - pTruth[i] &= pTruth[Step+i]; - pTruth[Step+i] = pTruth[i]; - } - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Universally quantifies the variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthForallNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] & (((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1)); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] & (((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2)); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] & (((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4)); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] & (((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8)); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] & (((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16)); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - pRes[i] = pTruth[i] & pTruth[Step+i]; - pRes[Step+i] = pRes[i]; - } - pRes += 2*Step; - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Universally quantifies the variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthUniqueNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1)); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2)); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4)); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8)); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16)); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - pRes[i] = pTruth[i] ^ pTruth[Step+i]; - pRes[Step+i] = pRes[i]; - } - pRes += 2*Step; - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Universally quantifies the set of variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthForallSet( unsigned * pRes, unsigned * pTruth, int nVars, unsigned uMask ) -{ - int v; - Kit_TruthCopy( pRes, pTruth, nVars ); - for ( v = 0; v < nVars; v++ ) - if ( uMask & (1 << v) ) - Kit_TruthForall( pRes, nVars, v ); -} - - -/**Function************************************************************* - - Synopsis [Multiplexes two functions with the given variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthMuxVar( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pCof0[i] & 0x55555555) | (pCof1[i] & 0xAAAAAAAA); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pCof0[i] & 0x33333333) | (pCof1[i] & 0xCCCCCCCC); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pCof0[i] & 0x0F0F0F0F) | (pCof1[i] & 0xF0F0F0F0); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pCof0[i] & 0x00FF00FF) | (pCof1[i] & 0xFF00FF00); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (pCof0[i] & 0x0000FFFF) | (pCof1[i] & 0xFFFF0000); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - pOut[i] = pCof0[i]; - pOut[Step+i] = pCof1[Step+i]; - } - pOut += 2*Step; - pCof0 += 2*Step; - pCof1 += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Multiplexes two functions with the given variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthMuxVarPhase( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar, int fCompl0 ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - - if ( fCompl0 == 0 ) - { - Kit_TruthMuxVar( pOut, pCof0, pCof1, nVars, iVar ); - return; - } - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (~pCof0[i] & 0x55555555) | (pCof1[i] & 0xAAAAAAAA); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (~pCof0[i] & 0x33333333) | (pCof1[i] & 0xCCCCCCCC); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (~pCof0[i] & 0x0F0F0F0F) | (pCof1[i] & 0xF0F0F0F0); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (~pCof0[i] & 0x00FF00FF) | (pCof1[i] & 0xFF00FF00); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pOut[i] = (~pCof0[i] & 0x0000FFFF) | (pCof1[i] & 0xFFFF0000); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - pOut[i] = ~pCof0[i]; - pOut[Step+i] = pCof1[Step+i]; - } - pOut += 2*Step; - pCof0 += 2*Step; - pCof1 += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Checks symmetry of two variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthVarsSymm( unsigned * pTruth, int nVars, int iVar0, int iVar1 ) -{ - static unsigned uTemp0[16], uTemp1[16]; - assert( nVars <= 9 ); - // compute Cof01 - Kit_TruthCopy( uTemp0, pTruth, nVars ); - Kit_TruthCofactor0( uTemp0, nVars, iVar0 ); - Kit_TruthCofactor1( uTemp0, nVars, iVar1 ); - // compute Cof10 - Kit_TruthCopy( uTemp1, pTruth, nVars ); - Kit_TruthCofactor1( uTemp1, nVars, iVar0 ); - Kit_TruthCofactor0( uTemp1, nVars, iVar1 ); - // compare - return Kit_TruthIsEqual( uTemp0, uTemp1, nVars ); -} - -/**Function************************************************************* - - Synopsis [Checks antisymmetry of two variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthVarsAntiSymm( unsigned * pTruth, int nVars, int iVar0, int iVar1 ) -{ - static unsigned uTemp0[16], uTemp1[16]; - assert( nVars <= 9 ); - // compute Cof00 - Kit_TruthCopy( uTemp0, pTruth, nVars ); - Kit_TruthCofactor0( uTemp0, nVars, iVar0 ); - Kit_TruthCofactor0( uTemp0, nVars, iVar1 ); - // compute Cof11 - Kit_TruthCopy( uTemp1, pTruth, nVars ); - Kit_TruthCofactor1( uTemp1, nVars, iVar0 ); - Kit_TruthCofactor1( uTemp1, nVars, iVar1 ); - // compare - return Kit_TruthIsEqual( uTemp0, uTemp1, nVars ); -} - -/**Function************************************************************* - - Synopsis [Changes phase of the function w.r.t. one variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthChangePhase( unsigned * pTruth, int nVars, int iVar ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Step; - unsigned Temp; - - assert( iVar < nVars ); - switch ( iVar ) - { - case 0: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = ((pTruth[i] & 0x55555555) << 1) | ((pTruth[i] & 0xAAAAAAAA) >> 1); - return; - case 1: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = ((pTruth[i] & 0x33333333) << 2) | ((pTruth[i] & 0xCCCCCCCC) >> 2); - return; - case 2: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = ((pTruth[i] & 0x0F0F0F0F) << 4) | ((pTruth[i] & 0xF0F0F0F0) >> 4); - return; - case 3: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = ((pTruth[i] & 0x00FF00FF) << 8) | ((pTruth[i] & 0xFF00FF00) >> 8); - return; - case 4: - for ( i = 0; i < nWords; i++ ) - pTruth[i] = ((pTruth[i] & 0x0000FFFF) << 16) | ((pTruth[i] & 0xFFFF0000) >> 16); - return; - default: - Step = (1 << (iVar - 5)); - for ( k = 0; k < nWords; k += 2*Step ) - { - for ( i = 0; i < Step; i++ ) - { - Temp = pTruth[i]; - pTruth[i] = pTruth[Step+i]; - pTruth[Step+i] = Temp; - } - pTruth += 2*Step; - } - return; - } -} - -/**Function************************************************************* - - Synopsis [Computes minimum overlap in supports of cofactors.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthMinCofSuppOverlap( unsigned * pTruth, int nVars, int * pVarMin ) -{ - static unsigned uCofactor[16]; - int i, ValueCur, ValueMin, VarMin; - unsigned uSupp0, uSupp1; - int nVars0, nVars1; - assert( nVars <= 9 ); - ValueMin = 32; - VarMin = -1; - for ( i = 0; i < nVars; i++ ) - { - // get negative cofactor - Kit_TruthCopy( uCofactor, pTruth, nVars ); - Kit_TruthCofactor0( uCofactor, nVars, i ); - uSupp0 = Kit_TruthSupport( uCofactor, nVars ); - nVars0 = Kit_WordCountOnes( uSupp0 ); -//Kit_PrintBinary( stdout, &uSupp0, 8 ); printf( "\n" ); - // get positive cofactor - Kit_TruthCopy( uCofactor, pTruth, nVars ); - Kit_TruthCofactor1( uCofactor, nVars, i ); - uSupp1 = Kit_TruthSupport( uCofactor, nVars ); - nVars1 = Kit_WordCountOnes( uSupp1 ); -//Kit_PrintBinary( stdout, &uSupp1, 8 ); printf( "\n" ); - // get the number of common vars - ValueCur = Kit_WordCountOnes( uSupp0 & uSupp1 ); - if ( ValueMin > ValueCur && nVars0 <= 5 && nVars1 <= 5 ) - { - ValueMin = ValueCur; - VarMin = i; - } - if ( ValueMin == 0 ) - break; - } - if ( pVarMin ) - *pVarMin = VarMin; - return ValueMin; -} - - -/**Function************************************************************* - - Synopsis [Find the best cofactoring variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthBestCofVar( unsigned * pTruth, int nVars, unsigned * pCof0, unsigned * pCof1 ) -{ - int i, iBestVar, nSuppSizeCur0, nSuppSizeCur1, nSuppSizeCur, nSuppSizeMin; - if ( Kit_TruthIsConst0(pTruth, nVars) || Kit_TruthIsConst1(pTruth, nVars) ) - return -1; - // iterate through variables - iBestVar = -1; - nSuppSizeMin = KIT_INFINITY; - for ( i = 0; i < nVars; i++ ) - { - // cofactor the functiona and get support sizes - Kit_TruthCofactor0New( pCof0, pTruth, nVars, i ); - Kit_TruthCofactor1New( pCof1, pTruth, nVars, i ); - nSuppSizeCur0 = Kit_TruthSupportSize( pCof0, nVars ); - nSuppSizeCur1 = Kit_TruthSupportSize( pCof1, nVars ); - nSuppSizeCur = nSuppSizeCur0 + nSuppSizeCur1; - // compare this variable with other variables - if ( nSuppSizeMin > nSuppSizeCur ) - { - nSuppSizeMin = nSuppSizeCur; - iBestVar = i; - } - } - assert( iBestVar != -1 ); - // cofactor w.r.t. this variable - Kit_TruthCofactor0New( pCof0, pTruth, nVars, iBestVar ); - Kit_TruthCofactor1New( pCof1, pTruth, nVars, iBestVar ); - return iBestVar; -} - - -/**Function************************************************************* - - Synopsis [Counts the number of 1's in each cofactor.] - - Description [The resulting numbers are stored in the array of shorts, - whose length is 2*nVars. The number of 1's is counted in a different - space than the original function. For example, if the function depends - on k variables, the cofactors are assumed to depend on k-1 variables.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthCountOnesInCofs( unsigned * pTruth, int nVars, short * pStore ) -{ - int nWords = Kit_TruthWordNum( nVars ); - int i, k, Counter; - memset( pStore, 0, sizeof(short) * 2 * nVars ); - if ( nVars <= 5 ) - { - if ( nVars > 0 ) - { - pStore[2*0+0] = Kit_WordCountOnes( pTruth[0] & 0x55555555 ); - pStore[2*0+1] = Kit_WordCountOnes( pTruth[0] & 0xAAAAAAAA ); - } - if ( nVars > 1 ) - { - pStore[2*1+0] = Kit_WordCountOnes( pTruth[0] & 0x33333333 ); - pStore[2*1+1] = Kit_WordCountOnes( pTruth[0] & 0xCCCCCCCC ); - } - if ( nVars > 2 ) - { - pStore[2*2+0] = Kit_WordCountOnes( pTruth[0] & 0x0F0F0F0F ); - pStore[2*2+1] = Kit_WordCountOnes( pTruth[0] & 0xF0F0F0F0 ); - } - if ( nVars > 3 ) - { - pStore[2*3+0] = Kit_WordCountOnes( pTruth[0] & 0x00FF00FF ); - pStore[2*3+1] = Kit_WordCountOnes( pTruth[0] & 0xFF00FF00 ); - } - if ( nVars > 4 ) - { - pStore[2*4+0] = Kit_WordCountOnes( pTruth[0] & 0x0000FFFF ); - pStore[2*4+1] = Kit_WordCountOnes( pTruth[0] & 0xFFFF0000 ); - } - return; - } - // nVars >= 6 - // count 1's for all other variables - for ( k = 0; k < nWords; k++ ) - { - Counter = Kit_WordCountOnes( pTruth[k] ); - for ( i = 5; i < nVars; i++ ) - if ( k & (1 << (i-5)) ) - pStore[2*i+1] += Counter; - else - pStore[2*i+0] += Counter; - } - // count 1's for the first five variables - for ( k = 0; k < nWords/2; k++ ) - { - pStore[2*0+0] += Kit_WordCountOnes( (pTruth[0] & 0x55555555) | ((pTruth[1] & 0x55555555) << 1) ); - pStore[2*0+1] += Kit_WordCountOnes( (pTruth[0] & 0xAAAAAAAA) | ((pTruth[1] & 0xAAAAAAAA) >> 1) ); - pStore[2*1+0] += Kit_WordCountOnes( (pTruth[0] & 0x33333333) | ((pTruth[1] & 0x33333333) << 2) ); - pStore[2*1+1] += Kit_WordCountOnes( (pTruth[0] & 0xCCCCCCCC) | ((pTruth[1] & 0xCCCCCCCC) >> 2) ); - pStore[2*2+0] += Kit_WordCountOnes( (pTruth[0] & 0x0F0F0F0F) | ((pTruth[1] & 0x0F0F0F0F) << 4) ); - pStore[2*2+1] += Kit_WordCountOnes( (pTruth[0] & 0xF0F0F0F0) | ((pTruth[1] & 0xF0F0F0F0) >> 4) ); - pStore[2*3+0] += Kit_WordCountOnes( (pTruth[0] & 0x00FF00FF) | ((pTruth[1] & 0x00FF00FF) << 8) ); - pStore[2*3+1] += Kit_WordCountOnes( (pTruth[0] & 0xFF00FF00) | ((pTruth[1] & 0xFF00FF00) >> 8) ); - pStore[2*4+0] += Kit_WordCountOnes( (pTruth[0] & 0x0000FFFF) | ((pTruth[1] & 0x0000FFFF) << 16) ); - pStore[2*4+1] += Kit_WordCountOnes( (pTruth[0] & 0xFFFF0000) | ((pTruth[1] & 0xFFFF0000) >> 16) ); - pTruth += 2; - } -} - -/**Function************************************************************* - - Synopsis [Counts the number of 1's in each cofactor.] - - Description [Verifies the above procedure.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthCountOnesInCofsSlow( unsigned * pTruth, int nVars, short * pStore, unsigned * pAux ) -{ - int i; - for ( i = 0; i < nVars; i++ ) - { - Kit_TruthCofactor0New( pAux, pTruth, nVars, i ); - pStore[2*i+0] = Kit_TruthCountOnes( pAux, nVars ) / 2; - Kit_TruthCofactor1New( pAux, pTruth, nVars, i ); - pStore[2*i+1] = Kit_TruthCountOnes( pAux, nVars ) / 2; - } -} - -/**Function************************************************************* - - Synopsis [Canonicize the truth table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Kit_TruthHash( unsigned * pIn, int nWords ) -{ - // The 1,024 smallest prime numbers used to compute the hash value - // http://www.math.utah.edu/~alfeld/math/primelist.html - static int HashPrimes[1024] = { 2, 3, 5, - 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, - 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, - 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, - 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, - 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, - 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, - 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, - 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, - 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, - 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, - 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, - 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, - 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, - 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, - 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, - 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, - 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, - 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, - 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, - 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, - 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, - 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, - 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, - 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, - 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, - 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, - 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, - 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, - 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, - 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, - 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, - 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, - 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, - 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, - 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, - 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, - 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, - 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, - 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, - 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, - 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, - 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, - 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, - 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, - 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, - 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, - 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, - 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, - 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, - 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, - 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, - 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, - 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, - 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, - 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, - 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, - 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, - 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, - 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, - 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, - 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, - 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, - 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, - 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, - 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, - 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, - 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, - 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, - 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, - 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, - 8147, 8161 }; - int i; - unsigned uHashKey; - assert( nWords <= 1024 ); - uHashKey = 0; - for ( i = 0; i < nWords; i++ ) - uHashKey ^= HashPrimes[i] * pIn[i]; - return uHashKey; -} - - -/**Function************************************************************* - - Synopsis [Canonicize the truth table.] - - Description [Returns the phase. ] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Kit_TruthSemiCanonicize( unsigned * pInOut, unsigned * pAux, int nVars, char * pCanonPerm, short * pStore ) -{ -// short pStore2[32]; - unsigned * pIn = pInOut, * pOut = pAux, * pTemp; -// int nWords = Kit_TruthWordNum( nVars ); - int i, Temp, fChange, Counter;//, nOnes;//, k, j, w, Limit; - unsigned uCanonPhase; - - // canonicize output - uCanonPhase = 0; -/* - nOnes = Kit_TruthCountOnes(pIn, nVars); - if ( (nOnes > nWords * 16) )//|| ((nOnes == nWords * 16) && (pIn[0] & 1)) ) - { - uCanonPhase |= (1 << nVars); - Kit_TruthNot( pIn, pIn, nVars ); - } -*/ - // collect the minterm counts - Kit_TruthCountOnesInCofs( pIn, nVars, pStore ); -// Kit_TruthCountOnesInCofsSlow( pIn, nVars, pStore2, pAux ); -// for ( i = 0; i < 2*nVars; i++ ) -// { -// assert( pStore[i] == pStore2[i] ); -// } - - // canonicize phase - for ( i = 0; i < nVars; i++ ) - { - if ( pStore[2*i+0] >= pStore[2*i+1] ) - continue; - uCanonPhase |= (1 << i); - Temp = pStore[2*i+0]; - pStore[2*i+0] = pStore[2*i+1]; - pStore[2*i+1] = Temp; - Kit_TruthChangePhase( pIn, nVars, i ); - } - -// Kit_PrintHexadecimal( stdout, pIn, nVars ); -// printf( "\n" ); - - // permute - Counter = 0; - do { - fChange = 0; - for ( i = 0; i < nVars-1; i++ ) - { - if ( pStore[2*i] >= pStore[2*(i+1)] ) - continue; - Counter++; - fChange = 1; - - Temp = pCanonPerm[i]; - pCanonPerm[i] = pCanonPerm[i+1]; - pCanonPerm[i+1] = Temp; - - Temp = pStore[2*i]; - pStore[2*i] = pStore[2*(i+1)]; - pStore[2*(i+1)] = Temp; - - Temp = pStore[2*i+1]; - pStore[2*i+1] = pStore[2*(i+1)+1]; - pStore[2*(i+1)+1] = Temp; - - // if the polarity of variables is different, swap them - if ( ((uCanonPhase & (1 << i)) > 0) != ((uCanonPhase & (1 << (i+1))) > 0) ) - { - uCanonPhase ^= (1 << i); - uCanonPhase ^= (1 << (i+1)); - } - - Kit_TruthSwapAdjacentVars( pOut, pIn, nVars, i ); - pTemp = pIn; pIn = pOut; pOut = pTemp; - } - } while ( fChange ); - -/* - Extra_PrintBinary( stdout, &uCanonPhase, nVars+1 ); printf( " : " ); - for ( i = 0; i < nVars; i++ ) - printf( "%d=%d/%d ", pCanonPerm[i], pStore[2*i], pStore[2*i+1] ); - printf( " C = %d\n", Counter ); - Extra_PrintHexadecimal( stdout, pIn, nVars ); - printf( "\n" ); -*/ - -/* - // process symmetric variable groups - uSymms = 0; - for ( i = 0; i < nVars-1; i++ ) - { - if ( pStore[2*i] != pStore[2*(i+1)] ) // i and i+1 cannot be symmetric - continue; - if ( pStore[2*i] != pStore[2*i+1] ) - continue; - if ( Kit_TruthVarsSymm( pIn, nVars, i, i+1 ) ) - continue; - if ( Kit_TruthVarsAntiSymm( pIn, nVars, i, i+1 ) ) - Kit_TruthChangePhase( pIn, nVars, i+1 ); - } -*/ - -/* - // process symmetric variable groups - uSymms = 0; - for ( i = 0; i < nVars-1; i++ ) - { - if ( pStore[2*i] != pStore[2*(i+1)] ) // i and i+1 cannot be symmetric - continue; - // i and i+1 can be symmetric - // find the end of this group - for ( k = i+1; k < nVars; k++ ) - if ( pStore[2*i] != pStore[2*k] ) - break; - Limit = k; - assert( i < Limit-1 ); - // go through the variables in this group - for ( j = i + 1; j < Limit; j++ ) - { - // check symmetry - if ( Kit_TruthVarsSymm( pIn, nVars, i, j ) ) - { - uSymms |= (1 << j); - continue; - } - // they are phase-unknown - if ( pStore[2*i] == pStore[2*i+1] ) - { - if ( Kit_TruthVarsAntiSymm( pIn, nVars, i, j ) ) - { - Kit_TruthChangePhase( pIn, nVars, j ); - uCanonPhase ^= (1 << j); - uSymms |= (1 << j); - continue; - } - } - - // they are not symmetric - move j as far as it goes in the group - for ( k = j; k < Limit-1; k++ ) - { - Counter++; - - Temp = pCanonPerm[k]; - pCanonPerm[k] = pCanonPerm[k+1]; - pCanonPerm[k+1] = Temp; - - assert( pStore[2*k] == pStore[2*(k+1)] ); - Kit_TruthSwapAdjacentVars( pOut, pIn, nVars, k ); - pTemp = pIn; pIn = pOut; pOut = pTemp; - } - Limit--; - j--; - } - i = Limit - 1; - } -*/ - - // swap if it was moved an even number of times - if ( Counter & 1 ) - Kit_TruthCopy( pOut, pIn, nVars ); - return uCanonPhase; -} - - -/**Function************************************************************* - - Synopsis [Fast counting minterms in the cofactors of a function.] - - Description [Returns the total number of minterms in the function. - The resulting array (pRes) contains the number of minterms in 0-cofactor - w.r.t. each variables. The additional array (pBytes) is used for internal - storage. It should have the size equal to the number of truth table bytes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Kit_TruthCountMinterms( unsigned * pTruth, int nVars, int * pRes, int * pBytes ) -{ - // the number of 1s if every byte as well as in the 0-cofactors w.r.t. three variables - static unsigned Table[256] = { - 0x00000000, 0x01010101, 0x01010001, 0x02020102, 0x01000101, 0x02010202, 0x02010102, 0x03020203, - 0x01000001, 0x02010102, 0x02010002, 0x03020103, 0x02000102, 0x03010203, 0x03010103, 0x04020204, - 0x00010101, 0x01020202, 0x01020102, 0x02030203, 0x01010202, 0x02020303, 0x02020203, 0x03030304, - 0x01010102, 0x02020203, 0x02020103, 0x03030204, 0x02010203, 0x03020304, 0x03020204, 0x04030305, - 0x00010001, 0x01020102, 0x01020002, 0x02030103, 0x01010102, 0x02020203, 0x02020103, 0x03030204, - 0x01010002, 0x02020103, 0x02020003, 0x03030104, 0x02010103, 0x03020204, 0x03020104, 0x04030205, - 0x00020102, 0x01030203, 0x01030103, 0x02040204, 0x01020203, 0x02030304, 0x02030204, 0x03040305, - 0x01020103, 0x02030204, 0x02030104, 0x03040205, 0x02020204, 0x03030305, 0x03030205, 0x04040306, - 0x00000101, 0x01010202, 0x01010102, 0x02020203, 0x01000202, 0x02010303, 0x02010203, 0x03020304, - 0x01000102, 0x02010203, 0x02010103, 0x03020204, 0x02000203, 0x03010304, 0x03010204, 0x04020305, - 0x00010202, 0x01020303, 0x01020203, 0x02030304, 0x01010303, 0x02020404, 0x02020304, 0x03030405, - 0x01010203, 0x02020304, 0x02020204, 0x03030305, 0x02010304, 0x03020405, 0x03020305, 0x04030406, - 0x00010102, 0x01020203, 0x01020103, 0x02030204, 0x01010203, 0x02020304, 0x02020204, 0x03030305, - 0x01010103, 0x02020204, 0x02020104, 0x03030205, 0x02010204, 0x03020305, 0x03020205, 0x04030306, - 0x00020203, 0x01030304, 0x01030204, 0x02040305, 0x01020304, 0x02030405, 0x02030305, 0x03040406, - 0x01020204, 0x02030305, 0x02030205, 0x03040306, 0x02020305, 0x03030406, 0x03030306, 0x04040407, - 0x00000001, 0x01010102, 0x01010002, 0x02020103, 0x01000102, 0x02010203, 0x02010103, 0x03020204, - 0x01000002, 0x02010103, 0x02010003, 0x03020104, 0x02000103, 0x03010204, 0x03010104, 0x04020205, - 0x00010102, 0x01020203, 0x01020103, 0x02030204, 0x01010203, 0x02020304, 0x02020204, 0x03030305, - 0x01010103, 0x02020204, 0x02020104, 0x03030205, 0x02010204, 0x03020305, 0x03020205, 0x04030306, - 0x00010002, 0x01020103, 0x01020003, 0x02030104, 0x01010103, 0x02020204, 0x02020104, 0x03030205, - 0x01010003, 0x02020104, 0x02020004, 0x03030105, 0x02010104, 0x03020205, 0x03020105, 0x04030206, - 0x00020103, 0x01030204, 0x01030104, 0x02040205, 0x01020204, 0x02030305, 0x02030205, 0x03040306, - 0x01020104, 0x02030205, 0x02030105, 0x03040206, 0x02020205, 0x03030306, 0x03030206, 0x04040307, - 0x00000102, 0x01010203, 0x01010103, 0x02020204, 0x01000203, 0x02010304, 0x02010204, 0x03020305, - 0x01000103, 0x02010204, 0x02010104, 0x03020205, 0x02000204, 0x03010305, 0x03010205, 0x04020306, - 0x00010203, 0x01020304, 0x01020204, 0x02030305, 0x01010304, 0x02020405, 0x02020305, 0x03030406, - 0x01010204, 0x02020305, 0x02020205, 0x03030306, 0x02010305, 0x03020406, 0x03020306, 0x04030407, - 0x00010103, 0x01020204, 0x01020104, 0x02030205, 0x01010204, 0x02020305, 0x02020205, 0x03030306, - 0x01010104, 0x02020205, 0x02020105, 0x03030206, 0x02010205, 0x03020306, 0x03020206, 0x04030307, - 0x00020204, 0x01030305, 0x01030205, 0x02040306, 0x01020305, 0x02030406, 0x02030306, 0x03040407, - 0x01020205, 0x02030306, 0x02030206, 0x03040307, 0x02020306, 0x03030407, 0x03030307, 0x04040408 - }; - unsigned uSum; - unsigned char * pTruthC, * pLimit; - int i, iVar, Step, nWords, nBytes, nTotal; - - assert( nVars <= 20 ); - - // clear storage - memset( pRes, 0, sizeof(int) * nVars ); - - // count the number of one's in 0-cofactors of the first three variables - nTotal = uSum = 0; - nWords = Kit_TruthWordNum( nVars ); - nBytes = nWords * 4; - pTruthC = (unsigned char *)pTruth; - pLimit = pTruthC + nBytes; - for ( ; pTruthC < pLimit; pTruthC++ ) - { - uSum += Table[*pTruthC]; - *pBytes++ = (Table[*pTruthC] & 0xff); - if ( (uSum & 0xff) > 246 ) - { - nTotal += (uSum & 0xff); - pRes[0] += ((uSum >> 8) & 0xff); - pRes[2] += ((uSum >> 16) & 0xff); - pRes[3] += ((uSum >> 24) & 0xff); - uSum = 0; - } - } - if ( uSum ) - { - nTotal += (uSum & 0xff); - pRes[0] += ((uSum >> 8) & 0xff); - pRes[1] += ((uSum >> 16) & 0xff); - pRes[2] += ((uSum >> 24) & 0xff); - } - - // count all other variables - for ( iVar = 3, Step = 1; Step < nBytes; Step *= 2, iVar++ ) - for ( i = 0; i < nBytes; i += Step + Step ) - { - pRes[iVar] += pBytes[i]; - pBytes[i] += pBytes[i+Step]; - } - assert( pBytes[0] == nTotal ); - assert( iVar == nVars ); - return nTotal; -} - -/**Function************************************************************* - - Synopsis [Prints the hex unsigned into a file.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_PrintHexadecimal( FILE * pFile, unsigned Sign[], int nVars ) -{ - int nDigits, Digit, k; - // write the number into the file - nDigits = (1 << nVars) / 4; - for ( k = nDigits - 1; k >= 0; k-- ) - { - Digit = ((Sign[k/8] >> ((k%8) * 4)) & 15); - if ( Digit < 10 ) - fprintf( pFile, "%d", Digit ); - else - fprintf( pFile, "%c", 'a' + Digit-10 ); - } -// fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [Fast counting minterms for the functions.] - - Description [Returns 0 if the function is a constant.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Kit_TruthCountMintermsPrecomp() -{ - int bit_count[256] = { - 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 - }; - unsigned i, uWord; - for ( i = 0; i < 256; i++ ) - { - if ( i % 8 == 0 ) - printf( "\n" ); - uWord = bit_count[i]; - uWord |= (bit_count[i & 0x55] << 8); - uWord |= (bit_count[i & 0x33] << 16); - uWord |= (bit_count[i & 0x0f] << 24); - printf( "0x" ); - Kit_PrintHexadecimal( stdout, &uWord, 5 ); - printf( ", " ); - } -} - -/**Function************************************************************* - - Synopsis [Dumps truth table into a file.] - - Description [Generates script file for reading into ABC.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char * Kit_TruthDumpToFile( unsigned * pTruth, int nVars, int nFile ) -{ - static char pFileName[100]; - FILE * pFile; - sprintf( pFileName, "tt\\s%04d", nFile ); - pFile = fopen( pFileName, "w" ); - fprintf( pFile, "rt " ); - Kit_PrintHexadecimal( pFile, pTruth, nVars ); - fprintf( pFile, "; bdd; sop; ps\n" ); - fclose( pFile ); - return pFileName; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/cnf.h b/src/vendor/stp/src/extlib-abc/cnf.h deleted file mode 100644 index dda183f89..000000000 --- a/src/vendor/stp/src/extlib-abc/cnf.h +++ /dev/null @@ -1,162 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnf.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [External declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnf.h,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __CNF_H__ -#define __CNF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -#include "vec.h" -#include "aig.h" -#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Cnf_Man_t_ Cnf_Man_t; -typedef struct Cnf_Dat_t_ Cnf_Dat_t; -typedef struct Cnf_Cut_t_ Cnf_Cut_t; - -// the CNF asserting outputs of AIG to be 1 -struct Cnf_Dat_t_ -{ - Aig_Man_t * pMan; // the AIG manager, for which CNF is computed - int nVars; // the number of variables - int nLiterals; // the number of CNF literals - int nClauses; // the number of CNF clauses - int ** pClauses; // the CNF clauses - int * pVarNums; // the number of CNF variable for each node ID (-1 if unused) -}; - -// the cut used to represent node in the AIG -struct Cnf_Cut_t_ -{ - char nFanins; // the number of leaves - char Cost; // the cost of this cut - short nWords; // the number of words in truth table - Vec_Int_t * vIsop[2]; // neg/pos ISOPs - int pFanins[0]; // the fanins (followed by the truth table) -}; - -// the CNF computation manager -struct Cnf_Man_t_ -{ - Aig_Man_t * pManAig; // the underlying AIG manager - char * pSopSizes; // sizes of SOPs for 4-variable functions - char ** pSops; // the SOPs for 4-variable functions - int aArea; // the area of the mapping - Aig_MmFlex_t * pMemCuts; // memory manager for cuts - int nMergeLimit; // the limit on the size of merged cut - unsigned * pTruths[4]; // temporary truth tables - Vec_Int_t * vMemory; // memory for intermediate ISOP representation - int timeCuts; - int timeMap; - int timeSave; -}; - - -static inline Dar_Cut_t * Dar_ObjBestCut( Aig_Obj_t * pObj ) { Dar_Cut_t * pCut; int i; Dar_ObjForEachCut( pObj, pCut, i ) if ( pCut->fBest ) return pCut; return NULL; } - -static inline int Cnf_CutSopCost( Cnf_Man_t * p, Dar_Cut_t * pCut ) { return p->pSopSizes[pCut->uTruth] + p->pSopSizes[0xFFFF & ~pCut->uTruth]; } - -static inline int Cnf_CutLeaveNum( Cnf_Cut_t * pCut ) { return pCut->nFanins; } -static inline int * Cnf_CutLeaves( Cnf_Cut_t * pCut ) { return pCut->pFanins; } -static inline unsigned * Cnf_CutTruth( Cnf_Cut_t * pCut ) { return (unsigned *)(pCut->pFanins + pCut->nFanins); } - -static inline Cnf_Cut_t * Cnf_ObjBestCut( Aig_Obj_t * pObj ) { return pObj->pData; } -static inline void Cnf_ObjSetBestCut( Aig_Obj_t * pObj, Cnf_Cut_t * pCut ) { pObj->pData = pCut; } - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// ITERATORS /// -//////////////////////////////////////////////////////////////////////// - -// iterator over leaves of the cut -#define Cnf_CutForEachLeaf( p, pCut, pLeaf, i ) \ - for ( i = 0; (i < (int)(pCut)->nFanins) && ((pLeaf) = Aig_ManObj(p, (pCut)->pFanins[i])); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -/*=== cnfCore.c ========================================================*/ -extern Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig, int nOutputs ); -extern Cnf_Man_t * Cnf_ManRead(); -extern void Cnf_ClearMemory(); -/*=== cnfCut.c ========================================================*/ -extern Cnf_Cut_t * Cnf_CutCreate( Cnf_Man_t * p, Aig_Obj_t * pObj ); -extern void Cnf_CutPrint( Cnf_Cut_t * pCut ); -extern void Cnf_CutFree( Cnf_Cut_t * pCut ); -extern void Cnf_CutUpdateRefs( Cnf_Man_t * p, Cnf_Cut_t * pCut, Cnf_Cut_t * pCutFan, Cnf_Cut_t * pCutRes ); -extern Cnf_Cut_t * Cnf_CutCompose( Cnf_Man_t * p, Cnf_Cut_t * pCut, Cnf_Cut_t * pCutFan, int iFan ); -/*=== cnfData.c ========================================================*/ -extern void Cnf_ReadMsops( char ** ppSopSizes, char *** ppSops ); -/*=== cnfMan.c ========================================================*/ -extern Cnf_Man_t * Cnf_ManStart(); -extern void Cnf_ManStop( Cnf_Man_t * p ); -extern Vec_Int_t * Cnf_DataCollectPiSatNums( Cnf_Dat_t * pCnf, Aig_Man_t * p ); -extern void Cnf_DataFree( Cnf_Dat_t * p ); -extern void Cnf_DataWriteIntoFile( Cnf_Dat_t * p, char * pFileName, int fReadable ); -void * Cnf_DataWriteIntoSolver( Cnf_Dat_t * p ); -/*=== cnfMap.c ========================================================*/ -extern void Cnf_DeriveMapping( Cnf_Man_t * p ); -extern int Cnf_ManMapForCnf( Cnf_Man_t * p ); -/*=== cnfPost.c ========================================================*/ -extern void Cnf_ManTransferCuts( Cnf_Man_t * p ); -extern void Cnf_ManFreeCuts( Cnf_Man_t * p ); -extern void Cnf_ManPostprocess( Cnf_Man_t * p ); -/*=== cnfUtil.c ========================================================*/ -extern Vec_Ptr_t * Aig_ManScanMapping( Cnf_Man_t * p, int fCollect ); -extern Vec_Ptr_t * Cnf_ManScanMapping( Cnf_Man_t * p, int fCollect, int fPreorder ); -/*=== cnfWrite.c ========================================================*/ -extern void Cnf_SopConvertToVector( char * pSop, int nCubes, Vec_Int_t * vCover ); -extern Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped, int nOutputs ); -extern Cnf_Dat_t * Cnf_DeriveSimple( Aig_Man_t * p, int nOutputs ); - -#ifdef __cplusplus -} -#endif - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/cnf_short.h b/src/vendor/stp/src/extlib-abc/cnf_short.h deleted file mode 100644 index e8a158742..000000000 --- a/src/vendor/stp/src/extlib-abc/cnf_short.h +++ /dev/null @@ -1,164 +0,0 @@ -/**CFile**************************************************************** - - FileName [cnf.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [External declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: cnf.h,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __CNF_H__ -#define __CNF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -#include "vec.h" -#include "aig.h" -//#include "darInt.h" - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Cnf_Man_t_ Cnf_Man_t; -typedef struct Cnf_Dat_t_ Cnf_Dat_t; -typedef struct Cnf_Cut_t_ Cnf_Cut_t; - -// the CNF asserting outputs of AIG to be 1 -struct Cnf_Dat_t_ -{ - Aig_Man_t * pMan; // the AIG manager, for which CNF is computed - int nVars; // the number of variables - int nLiterals; // the number of CNF literals - int nClauses; // the number of CNF clauses - int ** pClauses; // the CNF clauses - int * pVarNums; // the number of CNF variable for each node ID (-1 if unused) -}; - -// the cut used to represent node in the AIG -struct Cnf_Cut_t_ -{ - char nFanins; // the number of leaves - char Cost; // the cost of this cut - short nWords; // the number of words in truth table - Vec_Int_t * vIsop[2]; // neg/pos ISOPs - int pFanins[0]; // the fanins (followed by the truth table) -}; - -// the CNF computation manager -struct Cnf_Man_t_ -{ - Aig_Man_t * pManAig; // the underlying AIG manager - char * pSopSizes; // sizes of SOPs for 4-variable functions - char ** pSops; // the SOPs for 4-variable functions - int aArea; // the area of the mapping - Aig_MmFlex_t * pMemCuts; // memory manager for cuts - int nMergeLimit; // the limit on the size of merged cut - unsigned * pTruths[4]; // temporary truth tables - Vec_Int_t * vMemory; // memory for intermediate ISOP representation - int timeCuts; - int timeMap; - int timeSave; -}; - - -//static inline Dar_Cut_t * Dar_ObjBestCut( Aig_Obj_t * pObj ) { Dar_Cut_t * pCut; int i; Dar_ObjForEachCut( pObj, pCut, i ) if ( pCut->fBest ) return pCut; return NULL; } - -//static inline int Cnf_CutSopCost( Cnf_Man_t * p, Dar_Cut_t * pCut ) { return p->pSopSizes[pCut->uTruth] + p->pSopSizes[0xFFFF & ~pCut->uTruth]; } - -static inline int Cnf_CutLeaveNum( Cnf_Cut_t * pCut ) { return pCut->nFanins; } -static inline int * Cnf_CutLeaves( Cnf_Cut_t * pCut ) { return pCut->pFanins; } -static inline unsigned * Cnf_CutTruth( Cnf_Cut_t * pCut ) { return (unsigned *)(pCut->pFanins + pCut->nFanins); } - -//static inline Cnf_Cut_t * Cnf_ObjBestCut( Aig_Obj_t * pObj ) { return pObj->pData; } -static inline void Cnf_ObjSetBestCut( Aig_Obj_t * pObj, Cnf_Cut_t * pCut ) { pObj->pData = pCut; } - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// ITERATORS /// -//////////////////////////////////////////////////////////////////////// - -// iterator over leaves of the cut -#define Cnf_CutForEachLeaf( p, pCut, pLeaf, i ) \ - for ( i = 0; (i < (int)(pCut)->nFanins) && ((pLeaf) = Aig_ManObj(p, (pCut)->pFanins[i])); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -/*=== cnfCore.c ========================================================*/ -extern Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig, int nOutputs ); -extern Cnf_Man_t * Cnf_ManRead(); -extern void Cnf_ClearMemory(); -/*=== cnfCut.c ========================================================*/ -extern Cnf_Cut_t * Cnf_CutCreate( Cnf_Man_t * p, Aig_Obj_t * pObj ); -extern void Cnf_CutPrint( Cnf_Cut_t * pCut ); -extern void Cnf_CutFree( Cnf_Cut_t * pCut ); -extern void Cnf_CutUpdateRefs( Cnf_Man_t * p, Cnf_Cut_t * pCut, Cnf_Cut_t * pCutFan, Cnf_Cut_t * pCutRes ); -extern Cnf_Cut_t * Cnf_CutCompose( Cnf_Man_t * p, Cnf_Cut_t * pCut, Cnf_Cut_t * pCutFan, int iFan ); -/*=== cnfData.c ========================================================*/ -extern void Cnf_ReadMsops( char ** ppSopSizes, char *** ppSops ); -/*=== cnfMan.c ========================================================*/ -extern Cnf_Man_t * Cnf_ManStart(); -extern void Cnf_ManStop( Cnf_Man_t * p ); -extern Vec_Int_t * Cnf_DataCollectPiSatNums( Cnf_Dat_t * pCnf, Aig_Man_t * p ); -extern void Cnf_DataFree( Cnf_Dat_t * p ); -extern void Cnf_DataWriteIntoFile( Cnf_Dat_t * p, char * pFileName, int fReadable ); -void * Cnf_DataWriteIntoSolver( Cnf_Dat_t * p ); -/*=== cnfMap.c ========================================================*/ -extern void Cnf_DeriveMapping( Cnf_Man_t * p ); -extern int Cnf_ManMapForCnf( Cnf_Man_t * p ); -/*=== cnfPost.c ========================================================*/ -extern void Cnf_ManTransferCuts( Cnf_Man_t * p ); -extern void Cnf_ManFreeCuts( Cnf_Man_t * p ); -extern void Cnf_ManPostprocess( Cnf_Man_t * p ); -/*=== cnfUtil.c ========================================================*/ -extern Vec_Ptr_t * Aig_ManScanMapping( Cnf_Man_t * p, int fCollect ); -extern Vec_Ptr_t * Cnf_ManScanMapping( Cnf_Man_t * p, int fCollect, int fPreorder ); -/*=== cnfWrite.c ========================================================*/ -extern void Cnf_SopConvertToVector( char * pSop, int nCubes, Vec_Int_t * vCover ); -extern Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped, int nOutputs ); -extern Cnf_Dat_t * Cnf_DeriveSimple( Aig_Man_t * p, int nOutputs ); -// NB: This is an STP function... -extern Cnf_Dat_t * Cnf_DeriveSimple_Additional( Aig_Man_t * p, Cnf_Dat_t * old ); - -#ifdef __cplusplus -} -#endif - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/copyright.txt b/src/vendor/stp/src/extlib-abc/copyright.txt deleted file mode 100644 index 4afdc149c..000000000 --- a/src/vendor/stp/src/extlib-abc/copyright.txt +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) The Regents of the University of California. All rights reserved. - -Permission is hereby granted, without written agreement and without license or -royalty fees, to use, copy, modify, and distribute this software and its -documentation for any purpose, provided that the above copyright notice and -the following two paragraphs appear in all copies of this software. - -IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR -DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF -THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF -CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, -AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, -SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - diff --git a/src/vendor/stp/src/extlib-abc/dar.h b/src/vendor/stp/src/extlib-abc/dar.h deleted file mode 100644 index dcb3efd3e..000000000 --- a/src/vendor/stp/src/extlib-abc/dar.h +++ /dev/null @@ -1,106 +0,0 @@ -/**CFile**************************************************************** - - FileName [dar.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [External declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: dar.h,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __DAR_H__ -#define __DAR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Dar_RwrPar_t_ Dar_RwrPar_t; -typedef struct Dar_RefPar_t_ Dar_RefPar_t; - -struct Dar_RwrPar_t_ -{ - int nCutsMax; // the maximum number of cuts to try - int nSubgMax; // the maximum number of subgraphs to try - int fFanout; // support fanout representation - int fUpdateLevel; // update level - int fUseZeros; // performs zero-cost replacement - int fVerbose; // enables verbose output - int fVeryVerbose; // enables very verbose output -}; - -struct Dar_RefPar_t_ -{ - int nMffcMin; // the min MFFC size for which refactoring is used - int nLeafMax; // the max number of leaves of a cut - int nCutsMax; // the max number of cuts to consider - int fExtend; // extends the cut below MFFC - int fUpdateLevel; // updates the level after each move - int fUseZeros; // perform zero-cost replacements - int fVerbose; // verbosity level - int fVeryVerbose; // enables very verbose output -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// ITERATORS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -/*=== darLib.c ========================================================*/ -extern void Dar_LibStart(); -extern void Dar_LibStop(); -/*=== darBalance.c ========================================================*/ -extern Aig_Man_t * Dar_ManBalance( Aig_Man_t * p, int fUpdateLevel ); -/*=== darCore.c ========================================================*/ -extern void Dar_ManDefaultRwrParams( Dar_RwrPar_t * pPars ); -extern int Dar_ManRewrite( Aig_Man_t * pAig, Dar_RwrPar_t * pPars ); -extern Aig_MmFixed_t * Dar_ManComputeCuts( Aig_Man_t * pAig, int nCutsMax ); -/*=== darRefact.c ========================================================*/ -extern void Dar_ManDefaultRefParams( Dar_RefPar_t * pPars ); -extern int Dar_ManRefactor( Aig_Man_t * pAig, Dar_RefPar_t * pPars ); -/*=== darScript.c ========================================================*/ -extern Aig_Man_t * Dar_ManRewriteDefault( Aig_Man_t * pAig ); -extern Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose ); -extern Aig_Man_t * Dar_ManCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ); -extern Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ); -extern Aig_Man_t * Dar_ManChoice( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ); - -#ifdef __cplusplus -} -#endif - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/darInt.h b/src/vendor/stp/src/extlib-abc/darInt.h deleted file mode 100644 index b9ed455bf..000000000 --- a/src/vendor/stp/src/extlib-abc/darInt.h +++ /dev/null @@ -1,165 +0,0 @@ -/**CFile**************************************************************** - - FileName [darInt.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Internal declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darInt.h,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __DAR_INT_H__ -#define __DAR_INT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -//#include "bar.h" -#include "vec.h" -#include "aig.h" -#include "dar.h" - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Dar_Man_t_ Dar_Man_t; -typedef struct Dar_Cut_t_ Dar_Cut_t; - -// the AIG 4-cut -struct Dar_Cut_t_ // 6 words -{ - unsigned uSign; // cut signature - unsigned uTruth : 16; // the truth table of the cut function - unsigned Value : 11; // the value of the cut - unsigned fBest : 1; // marks the best cut - unsigned fUsed : 1; // marks the cut currently in use - unsigned nLeaves : 3; // the number of leaves - int pLeaves[4]; // the array of leaves -}; - -// the AIG manager -struct Dar_Man_t_ -{ - // input data - Dar_RwrPar_t * pPars; // rewriting parameters - Aig_Man_t * pAig; // AIG manager - // various data members - Aig_MmFixed_t * pMemCuts; // memory manager for cuts - void * pManCnf; // CNF managers - // current rewriting step - Vec_Ptr_t * vLeavesBest; // the best set of leaves - int OutBest; // the best output (in the library) - int OutNumBest; // the best number of the output - int GainBest; // the best gain - int LevelBest; // the level of node with the best gain - int ClassBest; // the equivalence class of the best replacement - // function statistics - int nTotalSubgs; // the total number of subgraphs tried - int ClassTimes[222];// the runtimes for each class - int ClassGains[222];// the gains for each class - int ClassSubgs[222];// the graphs for each class - int nCutMemUsed; // memory used for cuts - // rewriting statistics - int nNodesInit; // the original number of nodes - int nNodesTried; // the number of nodes attempted - int nCutsAll; // all cut pairs - int nCutsTried; // computed cuts - int nCutsUsed; // used cuts - int nCutsBad; // bad cuts due to absent fanin - int nCutsGood; // good cuts - int nCutsSkipped; // skipped bad cuts - // timing statistics - int timeCuts; - int timeEval; - int timeOther; - int timeTotal; - int time1; - int time2; -}; - -static inline Dar_Cut_t * Dar_ObjCuts( Aig_Obj_t * pObj ) { return pObj->pData; } -static inline void Dar_ObjSetCuts( Aig_Obj_t * pObj, Dar_Cut_t * pCuts ) { assert( !Aig_ObjIsNone(pObj) ); pObj->pData = pCuts; } - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// ITERATORS /// -//////////////////////////////////////////////////////////////////////// - -// iterator over all cuts of the node -#define Dar_ObjForEachCutAll( pObj, pCut, i ) \ - for ( (pCut) = Dar_ObjCuts(pObj), i = 0; i < (int)(pObj)->nCuts; i++, pCut++ ) -#define Dar_ObjForEachCut( pObj, pCut, i ) \ - for ( (pCut) = Dar_ObjCuts(pObj), i = 0; i < (int)(pObj)->nCuts; i++, pCut++ ) if ( (pCut)->fUsed==0 ) {} else -// iterator over leaves of the cut -#define Dar_CutForEachLeaf( p, pCut, pLeaf, i ) \ - for ( i = 0; (i < (int)(pCut)->nLeaves) && (((pLeaf) = Aig_ManObj(p, (pCut)->pLeaves[i])), 1); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -/*=== darBalance.c ========================================================*/ -/*=== darCore.c ===========================================================*/ -/*=== darCut.c ============================================================*/ -extern void Dar_ManCutsStart( Dar_Man_t * p ); -extern void Dar_ManCutsFree( Dar_Man_t * p ); -extern Dar_Cut_t * Dar_ObjComputeCuts_rec( Dar_Man_t * p, Aig_Obj_t * pObj ); -extern Dar_Cut_t * Dar_ObjComputeCuts( Dar_Man_t * p, Aig_Obj_t * pObj ); -/*=== darData.c ===========================================================*/ -extern Vec_Int_t * Dar_LibReadNodes(); -extern Vec_Int_t * Dar_LibReadOuts(); -extern Vec_Int_t * Dar_LibReadPrios(); -/*=== darLib.c ============================================================*/ -extern void Dar_LibStart(); -extern void Dar_LibStop(); -extern void Dar_LibPrepare( int nSubgraphs ); -extern void Dar_LibReturnCanonicals( unsigned * pCanons ); -extern void Dar_LibEval( Dar_Man_t * p, Aig_Obj_t * pRoot, Dar_Cut_t * pCut, int Required ); -extern Aig_Obj_t * Dar_LibBuildBest( Dar_Man_t * p ); -/*=== darMan.c ============================================================*/ -extern Dar_Man_t * Dar_ManStart( Aig_Man_t * pAig, Dar_RwrPar_t * pPars ); -extern void Dar_ManStop( Dar_Man_t * p ); -extern void Dar_ManPrintStats( Dar_Man_t * p ); -/*=== darPrec.c ============================================================*/ -extern char ** Dar_Permutations( int n ); -extern void Dar_Truth4VarNPN( unsigned short ** puCanons, char ** puPhases, char ** puPerms, unsigned char ** puMap ); - -#ifdef __cplusplus -} -#endif - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/kit.h b/src/vendor/stp/src/extlib-abc/kit.h deleted file mode 100644 index 44ef3f88d..000000000 --- a/src/vendor/stp/src/extlib-abc/kit.h +++ /dev/null @@ -1,542 +0,0 @@ -/**CFile**************************************************************** - - FileName [kit.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Computation kit.] - - Synopsis [External declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - Dec 6, 2006.] - - Revision [$Id: kit.h,v 1.00 2006/12/06 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __KIT_H__ -#define __KIT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include "vec.h" -//#include "extra.h" -//#include "cloud.h" - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Kit_Sop_t_ Kit_Sop_t; -struct Kit_Sop_t_ -{ - int nCubes; // the number of cubes - unsigned * pCubes; // the storage for cubes -}; - -typedef struct Kit_Edge_t_ Kit_Edge_t; -struct Kit_Edge_t_ -{ - unsigned fCompl : 1; // the complemented bit - unsigned Node : 30; // the decomposition node pointed by the edge -}; - -typedef struct Kit_Node_t_ Kit_Node_t; -struct Kit_Node_t_ -{ - Kit_Edge_t eEdge0; // the left child of the node - Kit_Edge_t eEdge1; // the right child of the node - // other info - void * pFunc; // the function of the node (BDD or AIG) - unsigned Level : 14; // the level of this node in the global AIG - // printing info - unsigned fNodeOr : 1; // marks the original OR node - unsigned fCompl0 : 1; // marks the original complemented edge - unsigned fCompl1 : 1; // marks the original complemented edge - // latch info - unsigned nLat0 : 5; // the number of latches on the first edge - unsigned nLat1 : 5; // the number of latches on the second edge - unsigned nLat2 : 5; // the number of latches on the output edge -}; - -typedef struct Kit_Graph_t_ Kit_Graph_t; -struct Kit_Graph_t_ -{ - int fConst; // marks the constant 1 graph - int nLeaves; // the number of leaves - int nSize; // the number of nodes (including the leaves) - int nCap; // the number of allocated nodes - Kit_Node_t * pNodes; // the array of leaves and internal nodes - Kit_Edge_t eRoot; // the pointer to the topmost node -}; - - -// DSD node types -typedef enum { - KIT_DSD_NONE = 0, // 0: unknown - KIT_DSD_CONST1, // 1: constant 1 - KIT_DSD_VAR, // 2: elementary variable - KIT_DSD_AND, // 3: multi-input AND - KIT_DSD_XOR, // 4: multi-input XOR - KIT_DSD_PRIME // 5: arbitrary function of 3+ variables -} Kit_Dsd_t; - -// DSD node -typedef struct Kit_DsdObj_t_ Kit_DsdObj_t; -struct Kit_DsdObj_t_ -{ - unsigned Id : 6; // the number of this node - unsigned Type : 3; // none, const, var, AND, XOR, MUX, PRIME - unsigned fMark : 1; // finished checking output - unsigned Offset : 8; // offset to the truth table - unsigned nRefs : 8; // offset to the truth table - unsigned nFans : 6; // the number of fanins of this node - unsigned char pFans[0]; // the fanin literals -}; - -// DSD network -typedef struct Kit_DsdNtk_t_ Kit_DsdNtk_t; -struct Kit_DsdNtk_t_ -{ - unsigned char nVars; // at most 16 (perhaps 18?) - unsigned char nNodesAlloc; // the number of allocated nodes (at most nVars) - unsigned char nNodes; // the number of nodes - unsigned char Root; // the root of the tree - unsigned * pMem; // memory for the truth tables (memory manager?) - unsigned * pSupps; // supports of the nodes - Kit_DsdObj_t** pNodes; // the nodes -}; - -#if 0 -// DSD manager -typedef struct Kit_DsdMan_t_ Kit_DsdMan_t; -struct Kit_DsdMan_t_ -{ - int nVars; // the maximum number of variables - int nWords; // the number of words in TTs - Vec_Ptr_t * vTtElems; // elementary truth tables - Vec_Ptr_t * vTtNodes; // the node truth tables - // BDD representation - CloudManager * dd; // BDD package - Vec_Ptr_t * vTtBdds; // the node truth tables - Vec_Int_t * vNodes; // temporary array for BDD nodes -}; -#endif - -static inline int Kit_DsdVar2Lit( int Var, int fCompl ) { return Var + Var + fCompl; } -static inline int Kit_DsdLit2Var( int Lit ) { return Lit >> 1; } -static inline int Kit_DsdLitIsCompl( int Lit ) { return Lit & 1; } -static inline int Kit_DsdLitNot( int Lit ) { return Lit ^ 1; } -static inline int Kit_DsdLitNotCond( int Lit, int c ) { return Lit ^ (int)(c > 0); } -static inline int Kit_DsdLitRegular( int Lit ) { return Lit & 0xfe; } - -static inline unsigned Kit_DsdObjOffset( int nFans ) { return (nFans >> 2) + ((nFans & 3) > 0); } -static inline unsigned * Kit_DsdObjTruth( Kit_DsdObj_t * pObj ) { return pObj->Type == KIT_DSD_PRIME ? (unsigned *)pObj->pFans + pObj->Offset: NULL; } -static inline int Kit_DsdNtkObjNum( Kit_DsdNtk_t * pNtk ){ return pNtk->nVars + pNtk->nNodes; } -static inline Kit_DsdObj_t * Kit_DsdNtkObj( Kit_DsdNtk_t * pNtk, int Id ) { assert( Id >= 0 && Id < pNtk->nVars + pNtk->nNodes ); return Id < pNtk->nVars ? NULL : pNtk->pNodes[Id - pNtk->nVars]; } -static inline Kit_DsdObj_t * Kit_DsdNtkRoot( Kit_DsdNtk_t * pNtk ) { return Kit_DsdNtkObj( pNtk, Kit_DsdLit2Var(pNtk->Root) ); } -static inline int Kit_DsdLitIsLeaf( Kit_DsdNtk_t * pNtk, int Lit ) { int Id = Kit_DsdLit2Var(Lit); assert( Id >= 0 && Id < pNtk->nVars + pNtk->nNodes ); return Id < pNtk->nVars; } -static inline unsigned Kit_DsdLitSupport( Kit_DsdNtk_t * pNtk, int Lit ) { int Id = Kit_DsdLit2Var(Lit); assert( Id >= 0 && Id < pNtk->nVars + pNtk->nNodes ); return pNtk->pSupps? (Id < pNtk->nVars? (1 << Id) : pNtk->pSupps[Id - pNtk->nVars]) : 0; } - -#define Kit_DsdNtkForEachObj( pNtk, pObj, i ) \ - for ( i = 0; (i < (pNtk)->nNodes) && ((pObj) = (pNtk)->pNodes[i]); i++ ) -#define Kit_DsdObjForEachFanin( pNtk, pObj, iLit, i ) \ - for ( i = 0; (i < (pObj)->nFans) && ((iLit) = (pObj)->pFans[i], 1); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -#define KIT_MIN(a,b) (((a) < (b))? (a) : (b)) -#define KIT_MAX(a,b) (((a) > (b))? (a) : (b)) -#define KIT_INFINITY (100000000) - -#ifndef ALLOC -#define ALLOC(type, num) ((type *) malloc(sizeof(type) * (num))) -#endif - -#ifndef FREE -#define FREE(obj) ((obj) ? (free((char *) (obj)), (obj) = 0) : 0) -#endif - -#ifndef REALLOC -#define REALLOC(type, obj, num) \ - ((obj) ? ((type *) realloc((char *)(obj), sizeof(type) * (num))) : \ - ((type *) malloc(sizeof(type) * (num)))) -#endif - -static inline int Kit_CubeHasLit( unsigned uCube, int i ) { return(uCube & (unsigned)(1< 0; } -static inline unsigned Kit_CubeSetLit( unsigned uCube, int i ) { return uCube | (unsigned)(1<> (32-nVar); } - -static inline int Kit_CubeIsMarked( unsigned uCube ) { return Kit_CubeHasLit( uCube, 31 ); } -static inline unsigned Kit_CubeMark( unsigned uCube ) { return Kit_CubeSetLit( uCube, 31 ); } -static inline unsigned Kit_CubeUnmark( unsigned uCube ) { return Kit_CubeRemLit( uCube, 31 ); } - -static inline int Kit_SopCubeNum( Kit_Sop_t * cSop ) { return cSop->nCubes; } -static inline unsigned Kit_SopCube( Kit_Sop_t * cSop, int i ) { return cSop->pCubes[i]; } -static inline void Kit_SopShrink( Kit_Sop_t * cSop, int nCubesNew ) { cSop->nCubes = nCubesNew; } -static inline void Kit_SopPushCube( Kit_Sop_t * cSop, unsigned uCube ) { cSop->pCubes[cSop->nCubes++] = uCube; } -static inline void Kit_SopWriteCube( Kit_Sop_t * cSop, unsigned uCube, int i ) { cSop->pCubes[i] = uCube; } - -static inline Kit_Edge_t Kit_EdgeCreate( int Node, int fCompl ) { Kit_Edge_t eEdge = { fCompl, Node }; return eEdge; } -static inline unsigned Kit_EdgeToInt( Kit_Edge_t eEdge ) { return (eEdge.Node << 1) | eEdge.fCompl; } -static inline Kit_Edge_t Kit_IntToEdge( unsigned Edge ) { return Kit_EdgeCreate( Edge >> 1, Edge & 1 ); } -static inline unsigned Kit_EdgeToInt_( Kit_Edge_t eEdge ) { return *(unsigned *)&eEdge; } -static inline Kit_Edge_t Kit_IntToEdge_( unsigned Edge ) { return *(Kit_Edge_t *)&Edge; } - -static inline int Kit_GraphIsConst( Kit_Graph_t * pGraph ) { return pGraph->fConst; } -static inline int Kit_GraphIsConst0( Kit_Graph_t * pGraph ) { return pGraph->fConst && pGraph->eRoot.fCompl; } -static inline int Kit_GraphIsConst1( Kit_Graph_t * pGraph ) { return pGraph->fConst && !pGraph->eRoot.fCompl; } -static inline int Kit_GraphIsComplement( Kit_Graph_t * pGraph ) { return pGraph->eRoot.fCompl; } -static inline int Kit_GraphIsVar( Kit_Graph_t * pGraph ) { return pGraph->eRoot.Node < (unsigned)pGraph->nLeaves; } -static inline void Kit_GraphComplement( Kit_Graph_t * pGraph ) { pGraph->eRoot.fCompl ^= 1; } -static inline void Kit_GraphSetRoot( Kit_Graph_t * pGraph, Kit_Edge_t eRoot ) { pGraph->eRoot = eRoot; } -static inline int Kit_GraphLeaveNum( Kit_Graph_t * pGraph ) { return pGraph->nLeaves; } -static inline int Kit_GraphNodeNum( Kit_Graph_t * pGraph ) { return pGraph->nSize - pGraph->nLeaves; } -static inline Kit_Node_t * Kit_GraphNode( Kit_Graph_t * pGraph, int i ) { return pGraph->pNodes + i; } -static inline Kit_Node_t * Kit_GraphNodeLast( Kit_Graph_t * pGraph ) { return pGraph->pNodes + pGraph->nSize - 1; } -static inline int Kit_GraphNodeInt( Kit_Graph_t * pGraph, Kit_Node_t * pNode ) { return pNode - pGraph->pNodes; } -static inline int Kit_GraphNodeIsVar( Kit_Graph_t * pGraph, Kit_Node_t * pNode ) { return Kit_GraphNodeInt(pGraph,pNode) < pGraph->nLeaves; } -static inline Kit_Node_t * Kit_GraphVar( Kit_Graph_t * pGraph ) { assert( Kit_GraphIsVar( pGraph ) ); return Kit_GraphNode( pGraph, pGraph->eRoot.Node ); } -static inline int Kit_GraphVarInt( Kit_Graph_t * pGraph ) { assert( Kit_GraphIsVar( pGraph ) ); return Kit_GraphNodeInt( pGraph, Kit_GraphVar(pGraph) ); } -static inline Kit_Node_t * Kit_GraphNodeFanin0( Kit_Graph_t * pGraph, Kit_Node_t * pNode ){ return Kit_GraphNodeIsVar(pGraph, pNode)? NULL : Kit_GraphNode(pGraph, pNode->eEdge0.Node); } -static inline Kit_Node_t * Kit_GraphNodeFanin1( Kit_Graph_t * pGraph, Kit_Node_t * pNode ){ return Kit_GraphNodeIsVar(pGraph, pNode)? NULL : Kit_GraphNode(pGraph, pNode->eEdge1.Node); } -static inline int Kit_GraphRootLevel( Kit_Graph_t * pGraph ) { return Kit_GraphNode(pGraph, pGraph->eRoot.Node)->Level; } - -static inline int Kit_Float2Int( float Val ) { return *((int *)&Val); } -static inline float Kit_Int2Float( int Num ) { return *((float *)&Num); } -static inline int Kit_BitWordNum( int nBits ) { return nBits/(8*sizeof(unsigned)) + ((nBits%(8*sizeof(unsigned))) > 0); } -static inline int Kit_TruthWordNum( int nVars ) { return nVars <= 5 ? 1 : (1 << (nVars - 5)); } -static inline unsigned Kit_BitMask( int nBits ) { assert( nBits <= 32 ); return ~((~(unsigned)0) << nBits); } - -static inline void Kit_TruthSetBit( unsigned * p, int Bit ) { p[Bit>>5] |= (1<<(Bit & 31)); } -static inline void Kit_TruthXorBit( unsigned * p, int Bit ) { p[Bit>>5] ^= (1<<(Bit & 31)); } -static inline int Kit_TruthHasBit( unsigned * p, int Bit ) { return (p[Bit>>5] & (1<<(Bit & 31))) > 0; } - -static inline int Kit_WordFindFirstBit( unsigned uWord ) -{ - int i; - for ( i = 0; i < 32; i++ ) - if ( uWord & (1 << i) ) - return i; - return -1; -} -static inline int Kit_WordHasOneBit( unsigned uWord ) -{ - return (uWord & (uWord - 1)) == 0; -} -static inline int Kit_WordCountOnes( unsigned uWord ) -{ - uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555); - uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333); - uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F); - uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF); - return (uWord & 0x0000FFFF) + (uWord>>16); -} -static inline int Kit_TruthCountOnes( unsigned * pIn, int nVars ) -{ - int w, Counter = 0; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - Counter += Kit_WordCountOnes(pIn[w]); - return Counter; -} -static inline int Kit_TruthFindFirstBit( unsigned * pIn, int nVars ) -{ - int w; - for ( w = 0; w < Kit_TruthWordNum(nVars); w++ ) - if ( pIn[w] ) - return 32*w + Kit_WordFindFirstBit(pIn[w]); - return -1; -} -static inline int Kit_TruthFindFirstZero( unsigned * pIn, int nVars ) -{ - int w; - for ( w = 0; w < Kit_TruthWordNum(nVars); w++ ) - if ( ~pIn[w] ) - return 32*w + Kit_WordFindFirstBit(~pIn[w]); - return -1; -} -static inline int Kit_TruthIsEqual( unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn0[w] != pIn1[w] ) - return 0; - return 1; -} -static inline int Kit_TruthIsOpposite( unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn0[w] != ~pIn1[w] ) - return 0; - return 1; -} -static inline int Kit_TruthIsEqualWithPhase( unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - if ( (pIn0[0] & 1) == (pIn1[0] & 1) ) - { - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn0[w] != pIn1[w] ) - return 0; - } - else - { - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn0[w] != ~pIn1[w] ) - return 0; - } - return 1; -} -static inline int Kit_TruthIsConst0( unsigned * pIn, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn[w] ) - return 0; - return 1; -} -static inline int Kit_TruthIsConst1( unsigned * pIn, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn[w] != ~(unsigned)0 ) - return 0; - return 1; -} -static inline int Kit_TruthIsImply( unsigned * pIn1, unsigned * pIn2, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn1[w] & ~pIn2[w] ) - return 0; - return 1; -} -static inline int Kit_TruthIsDisjoint( unsigned * pIn1, unsigned * pIn2, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn1[w] & pIn2[w] ) - return 0; - return 1; -} -static inline int Kit_TruthIsDisjoint3( unsigned * pIn1, unsigned * pIn2, unsigned * pIn3, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - if ( pIn1[w] & pIn2[w] & pIn3[w] ) - return 0; - return 1; -} -static inline void Kit_TruthCopy( unsigned * pOut, unsigned * pIn, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = pIn[w]; -} -static inline void Kit_TruthClear( unsigned * pOut, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = 0; -} -static inline void Kit_TruthFill( unsigned * pOut, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = ~(unsigned)0; -} -static inline void Kit_TruthNot( unsigned * pOut, unsigned * pIn, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = ~pIn[w]; -} -static inline void Kit_TruthAnd( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = pIn0[w] & pIn1[w]; -} -static inline void Kit_TruthOr( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = pIn0[w] | pIn1[w]; -} -static inline void Kit_TruthXor( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = pIn0[w] ^ pIn1[w]; -} -static inline void Kit_TruthSharp( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = pIn0[w] & ~pIn1[w]; -} -static inline void Kit_TruthNand( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = ~(pIn0[w] & pIn1[w]); -} -static inline void Kit_TruthAndPhase( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars, int fCompl0, int fCompl1 ) -{ - int w; - if ( fCompl0 && fCompl1 ) - { - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = ~(pIn0[w] | pIn1[w]); - } - else if ( fCompl0 && !fCompl1 ) - { - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = ~pIn0[w] & pIn1[w]; - } - else if ( !fCompl0 && fCompl1 ) - { - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = pIn0[w] & ~pIn1[w]; - } - else // if ( !fCompl0 && !fCompl1 ) - { - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = pIn0[w] & pIn1[w]; - } -} -static inline void Kit_TruthMux( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, unsigned * pCtrl, int nVars ) -{ - int w; - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = (pIn0[w] & ~pCtrl[w]) | (pIn1[w] & pCtrl[w]); -} -static inline void Kit_TruthMuxPhase( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, unsigned * pCtrl, int nVars, int fComp0 ) -{ - int w; - if ( fComp0 ) - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = (~pIn0[w] & ~pCtrl[w]) | (pIn1[w] & pCtrl[w]); - else - for ( w = Kit_TruthWordNum(nVars)-1; w >= 0; w-- ) - pOut[w] = (pIn0[w] & ~pCtrl[w]) | (pIn1[w] & pCtrl[w]); -} -static inline void Kit_TruthIthVar( unsigned * pTruth, int nVars, int iVar ) -{ - unsigned Masks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; - int k, nWords = (nVars <= 5 ? 1 : (1 << (nVars - 5))); - if ( iVar < 5 ) - { - for ( k = 0; k < nWords; k++ ) - pTruth[k] = Masks[iVar]; - } - else - { - for ( k = 0; k < nWords; k++ ) - if ( k & (1 << (iVar-5)) ) - pTruth[k] = ~(unsigned)0; - else - pTruth[k] = 0; - } -} - - -//////////////////////////////////////////////////////////////////////// -/// ITERATORS /// -//////////////////////////////////////////////////////////////////////// - -#define Kit_SopForEachCube( cSop, uCube, i ) \ - for ( i = 0; (i < Kit_SopCubeNum(cSop)) && ((uCube) = Kit_SopCube(cSop, i)); i++ ) -#define Kit_CubeForEachLiteral( uCube, Lit, nLits, i ) \ - for ( i = 0; (i < (nLits)) && ((Lit) = Kit_CubeHasLit(uCube, i)); i++ ) - -#define Kit_GraphForEachLeaf( pGraph, pLeaf, i ) \ - for ( i = 0; (i < (pGraph)->nLeaves) && (((pLeaf) = Kit_GraphNode(pGraph, i)), 1); i++ ) -#define Kit_GraphForEachNode( pGraph, pAnd, i ) \ - for ( i = (pGraph)->nLeaves; (i < (pGraph)->nSize) && (((pAnd) = Kit_GraphNode(pGraph, i)), 1); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -/*=== kitIsop.c ==========================================================*/ -extern int Kit_TruthIsop( unsigned * puTruth, int nVars, Vec_Int_t * vMemory, int fTryBoth ); -/*=== kitSop.c ==========================================================*/ -extern void Kit_SopCreate( Kit_Sop_t * cResult, Vec_Int_t * vInput, int nVars, Vec_Int_t * vMemory ); -extern void Kit_SopCreateInverse( Kit_Sop_t * cResult, Vec_Int_t * vInput, int nVars, Vec_Int_t * vMemory ); -extern void Kit_SopDup( Kit_Sop_t * cResult, Kit_Sop_t * cSop, Vec_Int_t * vMemory ); -extern void Kit_SopDivideByLiteralQuo( Kit_Sop_t * cSop, int iLit ); -extern void Kit_SopDivideByCube( Kit_Sop_t * cSop, Kit_Sop_t * cDiv, Kit_Sop_t * vQuo, Kit_Sop_t * vRem, Vec_Int_t * vMemory ); -extern void Kit_SopDivideInternal( Kit_Sop_t * cSop, Kit_Sop_t * cDiv, Kit_Sop_t * vQuo, Kit_Sop_t * vRem, Vec_Int_t * vMemory ); -extern void Kit_SopMakeCubeFree( Kit_Sop_t * cSop ); -extern int Kit_SopIsCubeFree( Kit_Sop_t * cSop ); -extern void Kit_SopCommonCubeCover( Kit_Sop_t * cResult, Kit_Sop_t * cSop, Vec_Int_t * vMemory ); -extern int Kit_SopAnyLiteral( Kit_Sop_t * cSop, int nLits ); -extern int Kit_SopDivisor( Kit_Sop_t * cResult, Kit_Sop_t * cSop, int nLits, Vec_Int_t * vMemory ); -extern void Kit_SopBestLiteralCover( Kit_Sop_t * cResult, Kit_Sop_t * cSop, unsigned uCube, int nLits, Vec_Int_t * vMemory ); -/*=== kitTruth.c ==========================================================*/ -extern void Kit_TruthSwapAdjacentVars( unsigned * pOut, unsigned * pIn, int nVars, int Start ); -extern void Kit_TruthStretch( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn ); -extern void Kit_TruthShrink( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn ); -extern int Kit_TruthVarInSupport( unsigned * pTruth, int nVars, int iVar ); -extern int Kit_TruthSupportSize( unsigned * pTruth, int nVars ); -extern unsigned Kit_TruthSupport( unsigned * pTruth, int nVars ); -extern void Kit_TruthCofactor0( unsigned * pTruth, int nVars, int iVar ); -extern void Kit_TruthCofactor1( unsigned * pTruth, int nVars, int iVar ); -extern void Kit_TruthCofactor0New( unsigned * pOut, unsigned * pIn, int nVars, int iVar ); -extern void Kit_TruthCofactor1New( unsigned * pOut, unsigned * pIn, int nVars, int iVar ); -extern void Kit_TruthExist( unsigned * pTruth, int nVars, int iVar ); -extern void Kit_TruthExistNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar ); -extern void Kit_TruthExistSet( unsigned * pRes, unsigned * pTruth, int nVars, unsigned uMask ); -extern void Kit_TruthForall( unsigned * pTruth, int nVars, int iVar ); -extern void Kit_TruthForallNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar ); -extern void Kit_TruthForallSet( unsigned * pRes, unsigned * pTruth, int nVars, unsigned uMask ); -extern void Kit_TruthUniqueNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar ); -extern void Kit_TruthMuxVar( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar ); -extern void Kit_TruthMuxVarPhase( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar, int fCompl0 ); -extern void Kit_TruthChangePhase( unsigned * pTruth, int nVars, int iVar ); -extern int Kit_TruthMinCofSuppOverlap( unsigned * pTruth, int nVars, int * pVarMin ); -extern int Kit_TruthBestCofVar( unsigned * pTruth, int nVars, unsigned * pCof0, unsigned * pCof1 ); -extern void Kit_TruthCountOnesInCofs( unsigned * pTruth, int nVars, short * pStore ); -extern void Kit_TruthCountOnesInCofsSlow( unsigned * pTruth, int nVars, short * pStore, unsigned * pAux ); -extern unsigned Kit_TruthHash( unsigned * pIn, int nWords ); -extern unsigned Kit_TruthSemiCanonicize( unsigned * pInOut, unsigned * pAux, int nVars, char * pCanonPerm, short * pStore ); -extern char * Kit_TruthDumpToFile( unsigned * pTruth, int nVars, int nFile ); - -#ifdef __cplusplus -} - -#endif -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/leaks.h b/src/vendor/stp/src/extlib-abc/leaks.h deleted file mode 100644 index 56f5199a1..000000000 --- a/src/vendor/stp/src/extlib-abc/leaks.h +++ /dev/null @@ -1,30 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// This file is used to detect memory leaks using Visual Studio 6.0 -// The idea comes from this page: http://www.michaelmoser.org/memory.htm -// In addition to this file, it required the presence of "stdlib_hack.h" -////////////////////////////////////////////////////////////////////////// - -#ifndef __LEAKS_H__ -#define __LEAKS_H__ - -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC // include Microsoft memory leak detection procedures -//#define _INC_MALLOC // exclude standard memory alloc procedures - -#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__) -#define calloc(c, s) _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__) -#define realloc(p, s) _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__) -//#define _expand(p, s) _expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__) -//#define free(p) _free_dbg(p, _NORMAL_BLOCK) -//#define _msize(p) _msize_dbg(p, _NORMAL_BLOCK) - -//#include -#include -#include -#endif - -#endif - -////////////////////////////////////// - - diff --git a/src/vendor/stp/src/extlib-abc/vec.h b/src/vendor/stp/src/extlib-abc/vec.h deleted file mode 100644 index 55ab00163..000000000 --- a/src/vendor/stp/src/extlib-abc/vec.h +++ /dev/null @@ -1,109 +0,0 @@ -/**CFile**************************************************************** - - FileName [vec.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Resizable arrays.] - - Synopsis [External declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: vec.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __VEC_H__ -#define __VEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 -#define inline __inline // compatible with MS VS 6.0 -#pragma warning(disable : 4152) // warning C4152: nonstandard extension, function/data pointer conversion in expression -#pragma warning(disable : 4244) // warning C4244: '+=' : conversion from 'int ' to 'unsigned short ', possible loss of data -#pragma warning(disable : 4514) // warning C4514: 'Vec_StrPop' : unreferenced inline function has been removed -#pragma warning(disable : 4710) // warning C4710: function 'Vec_PtrGrow' not inlined -#endif - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -// this include should be the first one in the list -// it is used to catch memory leaks on Windows -#include "leaks.h" - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -#ifndef ABS -#define ABS(a) ((a) < 0 ? -(a) : (a)) -#endif - -#ifndef MAX -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef ALLOC -#define ALLOC(type, num) ((type *) malloc(sizeof(type) * (num))) -#endif - -#ifndef FREE -#define FREE(obj) ((obj) ? (free((char *) (obj)), (obj) = 0) : 0) -#endif - -#ifndef REALLOC -#define REALLOC(type, obj, num) \ - ((obj) ? ((type *) realloc((char *)(obj), sizeof(type) * (num))) : \ - ((type *) malloc(sizeof(type) * (num)))) -#endif - -#ifndef PRT -#define PRT(a,t) printf("%s = ", (a)); printf("%6.2f sec\n", (float)(t)/(float)(CLOCKS_PER_SEC)) -#endif - -#ifndef PRTP -#define PRTP(a,t,T) printf("%s = ", (a)); printf("%6.2f sec (%6.2f %%)\n", (float)(t)/(float)(CLOCKS_PER_SEC), (T)? 100.0*(t)/(T) : 0.0) -#endif - -#include "vecInt.h" -#include "vecFlt.h" -#include "vecStr.h" -#include "vecPtr.h" -#include "vecVec.h" - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#ifdef __cplusplus -} -#endif - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/vecFlt.h b/src/vendor/stp/src/extlib-abc/vecFlt.h deleted file mode 100644 index 365ecec10..000000000 --- a/src/vendor/stp/src/extlib-abc/vecFlt.h +++ /dev/null @@ -1,630 +0,0 @@ -/**CFile**************************************************************** - - FileName [vecFlt.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Resizable arrays.] - - Synopsis [Resizable arrays of floats.] - - Author [Aaron P. Hurst] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: vecInt.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __VEC_FLT_H__ -#define __VEC_FLT_H__ - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Vec_Flt_t_ Vec_Flt_t; -struct Vec_Flt_t_ -{ - int nCap; - int nSize; - float * pArray; -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -#define Vec_FltForEachEntry( vVec, Entry, i ) \ - for ( i = 0; (i < Vec_FltSize(vVec)) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ ) -#define Vec_FltForEachEntryStart( vVec, Entry, i, Start ) \ - for ( i = Start; (i < Vec_FltSize(vVec)) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ ) -#define Vec_FltForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \ - for ( i = Start; (i < Stop) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ ) -#define Vec_FltForEachEntryReverse( vVec, pEntry, i ) \ - for ( i = Vec_FltSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_FltEntry(vVec, i)), 1); i-- ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Flt_t * Vec_FltAlloc( int nCap ) -{ - Vec_Flt_t * p; - p = ALLOC( Vec_Flt_t, 1 ); - if ( nCap > 0 && nCap < 16 ) - nCap = 16; - p->nSize = 0; - p->nCap = nCap; - p->pArray = p->nCap? ALLOC( float, p->nCap ) : NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given size and cleans it.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Flt_t * Vec_FltStart( int nSize ) -{ - Vec_Flt_t * p; - p = Vec_FltAlloc( nSize ); - p->nSize = nSize; - memset( p->pArray, 0, sizeof(float) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from a float array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Flt_t * Vec_FltAllocArray( float * pArray, int nSize ) -{ - Vec_Flt_t * p; - p = ALLOC( Vec_Flt_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = pArray; - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from a float array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Flt_t * Vec_FltAllocArrayCopy( float * pArray, int nSize ) -{ - Vec_Flt_t * p; - p = ALLOC( Vec_Flt_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = ALLOC( float, nSize ); - memcpy( p->pArray, pArray, sizeof(float) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Duplicates the float array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Flt_t * Vec_FltDup( Vec_Flt_t * pVec ) -{ - Vec_Flt_t * p; - p = ALLOC( Vec_Flt_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nCap; - p->pArray = p->nCap? ALLOC( float, p->nCap ) : NULL; - memcpy( p->pArray, pVec->pArray, sizeof(float) * pVec->nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Transfers the array into another vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Flt_t * Vec_FltDupArray( Vec_Flt_t * pVec ) -{ - Vec_Flt_t * p; - p = ALLOC( Vec_Flt_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nCap; - p->pArray = pVec->pArray; - pVec->nSize = 0; - pVec->nCap = 0; - pVec->pArray = NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltFree( Vec_Flt_t * p ) -{ - FREE( p->pArray ); - FREE( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline float * Vec_FltReleaseArray( Vec_Flt_t * p ) -{ - float * pArray = p->pArray; - p->nCap = 0; - p->nSize = 0; - p->pArray = NULL; - return pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline float * Vec_FltArray( Vec_Flt_t * p ) -{ - return p->pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_FltSize( Vec_Flt_t * p ) -{ - return p->nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline float Vec_FltEntry( Vec_Flt_t * p, int i ) -{ - assert( i >= 0 && i < p->nSize ); - return p->pArray[i]; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltWriteEntry( Vec_Flt_t * p, int i, float Entry ) -{ - assert( i >= 0 && i < p->nSize ); - p->pArray[i] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltAddToEntry( Vec_Flt_t * p, int i, float Addition ) -{ - assert( i >= 0 && i < p->nSize ); - p->pArray[i] += Addition; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline float Vec_FltEntryLast( Vec_Flt_t * p ) -{ - return p->pArray[p->nSize-1]; -} - -/**Function************************************************************* - - Synopsis [Resizes the vector to the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltGrow( Vec_Flt_t * p, int nCapMin ) -{ - if ( p->nCap >= nCapMin ) - return; - p->pArray = REALLOC( float, p->pArray, nCapMin ); - p->nCap = nCapMin; -} - -/**Function************************************************************* - - Synopsis [Fills the vector with given number of entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltFill( Vec_Flt_t * p, int nSize, float Entry ) -{ - int i; - Vec_FltGrow( p, nSize ); - for ( i = 0; i < nSize; i++ ) - p->pArray[i] = Entry; - p->nSize = nSize; -} - -/**Function************************************************************* - - Synopsis [Fills the vector with given number of entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltFillExtra( Vec_Flt_t * p, int nSize, float Entry ) -{ - int i; - if ( p->nSize >= nSize ) - return; - Vec_FltGrow( p, nSize ); - for ( i = p->nSize; i < nSize; i++ ) - p->pArray[i] = Entry; - p->nSize = nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltShrink( Vec_Flt_t * p, int nSizeNew ) -{ - assert( p->nSize >= nSizeNew ); - p->nSize = nSizeNew; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltClear( Vec_Flt_t * p ) -{ - p->nSize = 0; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltPush( Vec_Flt_t * p, float Entry ) -{ - if ( p->nSize == p->nCap ) - { - if ( p->nCap < 16 ) - Vec_FltGrow( p, 16 ); - else - Vec_FltGrow( p, 2 * p->nCap ); - } - p->pArray[p->nSize++] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltPushOrder( Vec_Flt_t * p, float Entry ) -{ - int i; - if ( p->nSize == p->nCap ) - { - if ( p->nCap < 16 ) - Vec_FltGrow( p, 16 ); - else - Vec_FltGrow( p, 2 * p->nCap ); - } - p->nSize++; - for ( i = p->nSize-2; i >= 0; i-- ) - if ( p->pArray[i] > Entry ) - p->pArray[i+1] = p->pArray[i]; - else - break; - p->pArray[i+1] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_FltPushUnique( Vec_Flt_t * p, float Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - return 1; - Vec_FltPush( p, Entry ); - return 0; -} - -/**Function************************************************************* - - Synopsis [Returns the last entry and removes it from the list.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline float Vec_FltPop( Vec_Flt_t * p ) -{ - assert( p->nSize > 0 ); - return p->pArray[--p->nSize]; -} - -/**Function************************************************************* - - Synopsis [Find entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_FltFind( Vec_Flt_t * p, float Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - return i; - return -1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_FltRemove( Vec_Flt_t * p, float Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - break; - if ( i == p->nSize ) - return 0; - assert( i < p->nSize ); - for ( i++; i < p->nSize; i++ ) - p->pArray[i-1] = p->pArray[i]; - p->nSize--; - return 1; -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two floats.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_FltSortCompare1( float * pp1, float * pp2 ) -{ - // for some reason commenting out lines (as shown) led to crashing of the release version - if ( *pp1 < *pp2 ) - return -1; - if ( *pp1 > *pp2 ) // - return 1; - return 0; // -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two floats.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_FltSortCompare2( float * pp1, float * pp2 ) -{ - // for some reason commenting out lines (as shown) led to crashing of the release version - if ( *pp1 > *pp2 ) - return -1; - if ( *pp1 < *pp2 ) // - return 1; - return 0; // -} - -/**Function************************************************************* - - Synopsis [Sorting the entries by their value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_FltSort( Vec_Flt_t * p, int fReverse ) -{ - if ( fReverse ) - qsort( (void *)p->pArray, p->nSize, sizeof(float), - (int (*)(const void *, const void *)) Vec_FltSortCompare2 ); - else - qsort( (void *)p->pArray, p->nSize, sizeof(float), - (int (*)(const void *, const void *)) Vec_FltSortCompare1 ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - -#endif - diff --git a/src/vendor/stp/src/extlib-abc/vecInt.h b/src/vendor/stp/src/extlib-abc/vecInt.h deleted file mode 100644 index fd3c00258..000000000 --- a/src/vendor/stp/src/extlib-abc/vecInt.h +++ /dev/null @@ -1,834 +0,0 @@ -/**CFile**************************************************************** - - FileName [vecInt.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Resizable arrays.] - - Synopsis [Resizable arrays of integers.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: vecInt.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __VEC_INT_H__ -#define __VEC_INT_H__ - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Vec_Int_t_ Vec_Int_t; -struct Vec_Int_t_ -{ - int nCap; - int nSize; - int * pArray; -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -#define Vec_IntForEachEntry( vVec, Entry, i ) \ - for ( i = 0; (i < Vec_IntSize(vVec)) && (((Entry) = Vec_IntEntry(vVec, i)), 1); i++ ) -#define Vec_IntForEachEntryStart( vVec, Entry, i, Start ) \ - for ( i = Start; (i < Vec_IntSize(vVec)) && (((Entry) = Vec_IntEntry(vVec, i)), 1); i++ ) -#define Vec_IntForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \ - for ( i = Start; (i < Stop) && (((Entry) = Vec_IntEntry(vVec, i)), 1); i++ ) -#define Vec_IntForEachEntryReverse( vVec, pEntry, i ) \ - for ( i = Vec_IntSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_IntEntry(vVec, i)), 1); i-- ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntAlloc( int nCap ) -{ - Vec_Int_t * p; - p = ALLOC( Vec_Int_t, 1 ); - if ( nCap > 0 && nCap < 16 ) - nCap = 16; - p->nSize = 0; - p->nCap = nCap; - p->pArray = p->nCap? ALLOC( int, p->nCap ) : NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given size and cleans it.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntStart( int nSize ) -{ - Vec_Int_t * p; - p = Vec_IntAlloc( nSize ); - p->nSize = nSize; - memset( p->pArray, 0, sizeof(int) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given size and cleans it.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntStartNatural( int nSize ) -{ - Vec_Int_t * p; - int i; - p = Vec_IntAlloc( nSize ); - p->nSize = nSize; - for ( i = 0; i < nSize; i++ ) - p->pArray[i] = i; - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from an integer array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntAllocArray( int * pArray, int nSize ) -{ - Vec_Int_t * p; - p = ALLOC( Vec_Int_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = pArray; - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from an integer array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntAllocArrayCopy( int * pArray, int nSize ) -{ - Vec_Int_t * p; - p = ALLOC( Vec_Int_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = ALLOC( int, nSize ); - memcpy( p->pArray, pArray, sizeof(int) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Duplicates the integer array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntDup( Vec_Int_t * pVec ) -{ - Vec_Int_t * p; - p = ALLOC( Vec_Int_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nSize; - p->pArray = p->nCap? ALLOC( int, p->nCap ) : NULL; - memcpy( p->pArray, pVec->pArray, sizeof(int) * pVec->nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Transfers the array into another vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntDupArray( Vec_Int_t * pVec ) -{ - Vec_Int_t * p; - p = ALLOC( Vec_Int_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nCap; - p->pArray = pVec->pArray; - pVec->nSize = 0; - pVec->nCap = 0; - pVec->pArray = NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntFree( Vec_Int_t * p ) -{ - FREE( p->pArray ); - FREE( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int * Vec_IntReleaseArray( Vec_Int_t * p ) -{ - int * pArray = p->pArray; - p->nCap = 0; - p->nSize = 0; - p->pArray = NULL; - return pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int * Vec_IntArray( Vec_Int_t * p ) -{ - return p->pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntSize( Vec_Int_t * p ) -{ - return p->nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntEntry( Vec_Int_t * p, int i ) -{ - assert( i >= 0 && i < p->nSize ); - return p->pArray[i]; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntWriteEntry( Vec_Int_t * p, int i, int Entry ) -{ - assert( i >= 0 && i < p->nSize ); - p->pArray[i] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntAddToEntry( Vec_Int_t * p, int i, int Addition ) -{ - assert( i >= 0 && i < p->nSize ); - p->pArray[i] += Addition; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntEntryLast( Vec_Int_t * p ) -{ - assert( p->nSize > 0 ); - return p->pArray[p->nSize-1]; -} - -/**Function************************************************************* - - Synopsis [Resizes the vector to the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntGrow( Vec_Int_t * p, int nCapMin ) -{ - if ( p->nCap >= nCapMin ) - return; - p->pArray = REALLOC( int, p->pArray, nCapMin ); - assert( p->pArray ); - p->nCap = nCapMin; -} - -/**Function************************************************************* - - Synopsis [Fills the vector with given number of entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntFill( Vec_Int_t * p, int nSize, int Entry ) -{ - int i; - Vec_IntGrow( p, nSize ); - for ( i = 0; i < nSize; i++ ) - p->pArray[i] = Entry; - p->nSize = nSize; -} - -/**Function************************************************************* - - Synopsis [Fills the vector with given number of entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntFillExtra( Vec_Int_t * p, int nSize, int Entry ) -{ - int i; - if ( p->nSize >= nSize ) - return; - Vec_IntGrow( p, nSize ); - for ( i = p->nSize; i < nSize; i++ ) - p->pArray[i] = Entry; - p->nSize = nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntShrink( Vec_Int_t * p, int nSizeNew ) -{ - assert( p->nSize >= nSizeNew ); - p->nSize = nSizeNew; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntClear( Vec_Int_t * p ) -{ - p->nSize = 0; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntPush( Vec_Int_t * p, int Entry ) -{ - if ( p->nSize == p->nCap ) - { - if ( p->nCap < 16 ) - Vec_IntGrow( p, 16 ); - else - Vec_IntGrow( p, 2 * p->nCap ); - } - p->pArray[p->nSize++] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntPushFirst( Vec_Int_t * p, int Entry ) -{ - int i; - if ( p->nSize == p->nCap ) - { - if ( p->nCap < 16 ) - Vec_IntGrow( p, 16 ); - else - Vec_IntGrow( p, 2 * p->nCap ); - } - p->nSize++; - for ( i = p->nSize - 1; i >= 1; i-- ) - p->pArray[i] = p->pArray[i-1]; - p->pArray[0] = Entry; -} - -/**Function************************************************************* - - Synopsis [Inserts the entry while preserving the increasing order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntPushOrder( Vec_Int_t * p, int Entry ) -{ - int i; - if ( p->nSize == p->nCap ) - { - if ( p->nCap < 16 ) - Vec_IntGrow( p, 16 ); - else - Vec_IntGrow( p, 2 * p->nCap ); - } - p->nSize++; - for ( i = p->nSize-2; i >= 0; i-- ) - if ( p->pArray[i] > Entry ) - p->pArray[i+1] = p->pArray[i]; - else - break; - p->pArray[i+1] = Entry; -} - -/**Function************************************************************* - - Synopsis [Inserts the entry while preserving the increasing order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntPushUniqueOrder( Vec_Int_t * p, int Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - return 1; - Vec_IntPushOrder( p, Entry ); - return 0; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntPushUnique( Vec_Int_t * p, int Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - return 1; - Vec_IntPush( p, Entry ); - return 0; -} - -/**Function************************************************************* - - Synopsis [Returns the pointer to the next nWords entries in the vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned * Vec_IntFetch( Vec_Int_t * p, int nWords ) -{ - if ( nWords == 0 ) - return NULL; - assert( nWords > 0 ); - p->nSize += nWords; - if ( p->nSize > p->nCap ) - { -// Vec_IntGrow( p, 2 * p->nSize ); - return NULL; - } - return ((unsigned *)p->pArray) + p->nSize - nWords; -} - -/**Function************************************************************* - - Synopsis [Returns the last entry and removes it from the list.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntPop( Vec_Int_t * p ) -{ - assert( p->nSize > 0 ); - return p->pArray[--p->nSize]; -} - -/**Function************************************************************* - - Synopsis [Find entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntFind( Vec_Int_t * p, int Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - return i; - return -1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntRemove( Vec_Int_t * p, int Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - break; - if ( i == p->nSize ) - return 0; - assert( i < p->nSize ); - for ( i++; i < p->nSize; i++ ) - p->pArray[i-1] = p->pArray[i]; - p->nSize--; - return 1; -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two integers.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntSortCompare1( int * pp1, int * pp2 ) -{ - // for some reason commenting out lines (as shown) led to crashing of the release version - if ( *pp1 < *pp2 ) - return -1; - if ( *pp1 > *pp2 ) // - return 1; - return 0; // -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two integers.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntSortCompare2( int * pp1, int * pp2 ) -{ - // for some reason commenting out lines (as shown) led to crashing of the release version - if ( *pp1 > *pp2 ) - return -1; - if ( *pp1 < *pp2 ) // - return 1; - return 0; // -} - -/**Function************************************************************* - - Synopsis [Sorting the entries by their integer value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntSort( Vec_Int_t * p, int fReverse ) -{ - if ( fReverse ) - qsort( (void *)p->pArray, p->nSize, sizeof(int), - (int (*)(const void *, const void *)) Vec_IntSortCompare2 ); - else - qsort( (void *)p->pArray, p->nSize, sizeof(int), - (int (*)(const void *, const void *)) Vec_IntSortCompare1 ); -} - - -/**Function************************************************************* - - Synopsis [Comparison procedure for two integers.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntSortCompareUnsigned( unsigned * pp1, unsigned * pp2 ) -{ - if ( *pp1 < *pp2 ) - return -1; - if ( *pp1 > *pp2 ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Sorting the entries by their integer value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_IntSortUnsigned( Vec_Int_t * p ) -{ - qsort( (void *)p->pArray, p->nSize, sizeof(int), - (int (*)(const void *, const void *)) Vec_IntSortCompareUnsigned ); -} - -/**Function************************************************************* - - Synopsis [Returns the number of common entries.] - - Description [Assumes that the vectors are sorted in the increasing order.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_IntTwoCountCommon( Vec_Int_t * vArr1, Vec_Int_t * vArr2 ) -{ - int * pBeg1 = vArr1->pArray; - int * pBeg2 = vArr2->pArray; - int * pEnd1 = vArr1->pArray + vArr1->nSize; - int * pEnd2 = vArr2->pArray + vArr2->nSize; - int Counter = 0; - while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 ) - { - if ( *pBeg1 == *pBeg2 ) - pBeg1++, pBeg2++, Counter++; - else if ( *pBeg1 < *pBeg2 ) - pBeg1++; - else - pBeg2++; - } - return Counter; -} - -/**Function************************************************************* - - Synopsis [Returns the result of merging the two vectors.] - - Description [Assumes that the vectors are sorted in the increasing order.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Int_t * Vec_IntTwoMerge( Vec_Int_t * vArr1, Vec_Int_t * vArr2 ) -{ - Vec_Int_t * vArr = Vec_IntAlloc( vArr1->nSize + vArr2->nSize ); - int * pBeg = vArr->pArray; - int * pBeg1 = vArr1->pArray; - int * pBeg2 = vArr2->pArray; - int * pEnd1 = vArr1->pArray + vArr1->nSize; - int * pEnd2 = vArr2->pArray + vArr2->nSize; - while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 ) - { - if ( *pBeg1 == *pBeg2 ) - *pBeg++ = *pBeg1++, pBeg2++; - else if ( *pBeg1 < *pBeg2 ) - *pBeg++ = *pBeg1++; - else - *pBeg++ = *pBeg2++; - } - while ( pBeg1 < pEnd1 ) - *pBeg++ = *pBeg1++; - while ( pBeg2 < pEnd2 ) - *pBeg++ = *pBeg2++; - vArr->nSize = pBeg - vArr->pArray; - assert( vArr->nSize <= vArr->nCap ); - assert( vArr->nSize >= vArr1->nSize ); - assert( vArr->nSize >= vArr2->nSize ); - return vArr; -} - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/vecPtr.h b/src/vendor/stp/src/extlib-abc/vecPtr.h deleted file mode 100644 index 56d11eca5..000000000 --- a/src/vendor/stp/src/extlib-abc/vecPtr.h +++ /dev/null @@ -1,762 +0,0 @@ -/**CFile**************************************************************** - - FileName [vecPtr.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Resizable arrays.] - - Synopsis [Resizable arrays of generic pointers.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: vecPtr.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __VEC_PTR_H__ -#define __VEC_PTR_H__ - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Vec_Ptr_t_ Vec_Ptr_t; -struct Vec_Ptr_t_ -{ - int nCap; - int nSize; - void ** pArray; -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -// iterators through entries -#define Vec_PtrForEachEntry( vVec, pEntry, i ) \ - for ( i = 0; (i < Vec_PtrSize(vVec)) && (((pEntry) = Vec_PtrEntry(vVec, i)), 1); i++ ) -#define Vec_PtrForEachEntryStart( vVec, pEntry, i, Start ) \ - for ( i = Start; (i < Vec_PtrSize(vVec)) && (((pEntry) = Vec_PtrEntry(vVec, i)), 1); i++ ) -#define Vec_PtrForEachEntryStop( vVec, pEntry, i, Stop ) \ - for ( i = 0; (i < Stop) && (((pEntry) = Vec_PtrEntry(vVec, i)), 1); i++ ) -#define Vec_PtrForEachEntryStartStop( vVec, pEntry, i, Start, Stop ) \ - for ( i = Start; (i < Stop) && (((pEntry) = Vec_PtrEntry(vVec, i)), 1); i++ ) -#define Vec_PtrForEachEntryReverse( vVec, pEntry, i ) \ - for ( i = Vec_PtrSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_PtrEntry(vVec, i)), 1); i-- ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrAlloc( int nCap ) -{ - Vec_Ptr_t * p; - p = ALLOC( Vec_Ptr_t, 1 ); - if ( nCap > 0 && nCap < 8 ) - nCap = 8; - p->nSize = 0; - p->nCap = nCap; - p->pArray = p->nCap? ALLOC( void *, p->nCap ) : NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given size and cleans it.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrStart( int nSize ) -{ - Vec_Ptr_t * p; - p = Vec_PtrAlloc( nSize ); - p->nSize = nSize; - memset( p->pArray, 0, sizeof(void *) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from an integer array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrAllocArray( void ** pArray, int nSize ) -{ - Vec_Ptr_t * p; - p = ALLOC( Vec_Ptr_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = pArray; - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from an integer array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrAllocArrayCopy( void ** pArray, int nSize ) -{ - Vec_Ptr_t * p; - p = ALLOC( Vec_Ptr_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = ALLOC( void *, nSize ); - memcpy( p->pArray, pArray, sizeof(void *) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates the array of simulation info.] - - Description [Allocates the array containing given number of entries, - each of which contains given number of unsigned words of simulation data. - The resulting array can be freed using regular procedure Vec_PtrFree(). - It is the responsibility of the user to ensure this array is never grown.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrAllocSimInfo( int nEntries, int nWords ) -{ - void ** pMemory; - unsigned * pInfo; - int i; - pMemory = (void **)ALLOC( char, (sizeof(void *) + sizeof(unsigned) * nWords) * nEntries ); - pInfo = (unsigned *)(pMemory + nEntries); - for ( i = 0; i < nEntries; i++ ) - pMemory[i] = pInfo + i * nWords; - return Vec_PtrAllocArray( pMemory, nEntries ); -} - -/**Function************************************************************* - - Synopsis [Allocates the array of truth tables for the given number of vars.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrAllocTruthTables( int nVars ) -{ - Vec_Ptr_t * p; - unsigned Masks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; - unsigned * pTruth; - int i, k, nWords; - nWords = (nVars <= 5 ? 1 : (1 << (nVars - 5))); - p = Vec_PtrAllocSimInfo( nVars, nWords ); - for ( i = 0; i < nVars; i++ ) - { - pTruth = (unsigned *)p->pArray[i]; - if ( i < 5 ) - { - for ( k = 0; k < nWords; k++ ) - pTruth[k] = Masks[i]; - } - else - { - for ( k = 0; k < nWords; k++ ) - if ( k & (1 << (i-5)) ) - pTruth[k] = ~(unsigned)0; - else - pTruth[k] = 0; - } - } - return p; -} - -/**Function************************************************************* - - Synopsis [Duplicates the integer array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrDup( Vec_Ptr_t * pVec ) -{ - Vec_Ptr_t * p; - p = ALLOC( Vec_Ptr_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nCap; - p->pArray = p->nCap? ALLOC( void *, p->nCap ) : NULL; - memcpy( p->pArray, pVec->pArray, sizeof(void *) * pVec->nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Transfers the array into another vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Ptr_t * Vec_PtrDupArray( Vec_Ptr_t * pVec ) -{ - Vec_Ptr_t * p; - p = ALLOC( Vec_Ptr_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nCap; - p->pArray = pVec->pArray; - pVec->nSize = 0; - pVec->nCap = 0; - pVec->pArray = NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [Frees the vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrFree( Vec_Ptr_t * p ) -{ - FREE( p->pArray ); - FREE( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void ** Vec_PtrReleaseArray( Vec_Ptr_t * p ) -{ - void ** pArray = p->pArray; - p->nCap = 0; - p->nSize = 0; - p->pArray = NULL; - return pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void ** Vec_PtrArray( Vec_Ptr_t * p ) -{ - return p->pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_PtrSize( Vec_Ptr_t * p ) -{ - return p->nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void * Vec_PtrEntry( Vec_Ptr_t * p, int i ) -{ - assert( i >= 0 && i < p->nSize ); - return p->pArray[i]; -} - -/**Function************************************************************* - - Synopsis [Resizes the array of simulation info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrDoubleSimInfo( Vec_Ptr_t * vInfo ) -{ - Vec_Ptr_t * vInfoNew; - int nWords; - assert( Vec_PtrSize(vInfo) > 2 ); - // get the new array - nWords = (unsigned *)Vec_PtrEntry(vInfo,1) - (unsigned *)Vec_PtrEntry(vInfo,0); - vInfoNew = Vec_PtrAllocSimInfo( 2*Vec_PtrSize(vInfo), nWords ); - // copy the simulation info - memcpy( Vec_PtrEntry(vInfoNew,0), Vec_PtrEntry(vInfo,0), Vec_PtrSize(vInfo) * nWords * 4 ); - // replace the array - free( vInfo->pArray ); - vInfo->pArray = vInfoNew->pArray; - vInfo->nSize *= 2; - vInfo->nCap *= 2; - // free the old array - vInfoNew->pArray = NULL; - free( vInfoNew ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void ** Vec_PtrEntryP( Vec_Ptr_t * p, int i ) -{ - assert( i >= 0 && i < p->nSize ); - return p->pArray + i; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrWriteEntry( Vec_Ptr_t * p, int i, void * Entry ) -{ - assert( i >= 0 && i < p->nSize ); - p->pArray[i] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void * Vec_PtrEntryLast( Vec_Ptr_t * p ) -{ - assert( p->nSize > 0 ); - return p->pArray[p->nSize-1]; -} - -/**Function************************************************************* - - Synopsis [Resizes the vector to the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrGrow( Vec_Ptr_t * p, int nCapMin ) -{ - if ( p->nCap >= nCapMin ) - return; - p->pArray = REALLOC( void *, p->pArray, nCapMin ); - p->nCap = nCapMin; -} - -/**Function************************************************************* - - Synopsis [Fills the vector with given number of entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrFill( Vec_Ptr_t * p, int nSize, void * Entry ) -{ - int i; - Vec_PtrGrow( p, nSize ); - for ( i = 0; i < nSize; i++ ) - p->pArray[i] = Entry; - p->nSize = nSize; -} - -/**Function************************************************************* - - Synopsis [Fills the vector with given number of entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrFillExtra( Vec_Ptr_t * p, int nSize, void * Entry ) -{ - int i; - if ( p->nSize >= nSize ) - return; - assert( p->nSize < nSize ); - if ( 2 * p->nSize > nSize ) - Vec_PtrGrow( p, 2 * nSize ); - else - Vec_PtrGrow( p, nSize ); - for ( i = p->nSize; i < nSize; i++ ) - p->pArray[i] = Entry; - p->nSize = nSize; -} - -/**Function************************************************************* - - Synopsis [Returns the entry even if the place not exist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void * Vec_PtrGetEntry( Vec_Ptr_t * p, int i ) -{ - Vec_PtrFillExtra( p, i + 1, NULL ); - return Vec_PtrEntry( p, i ); -} - -/**Function************************************************************* - - Synopsis [Inserts the entry even if the place does not exist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrSetEntry( Vec_Ptr_t * p, int i, void * Entry ) -{ - Vec_PtrFillExtra( p, i + 1, NULL ); - Vec_PtrWriteEntry( p, i, Entry ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrShrink( Vec_Ptr_t * p, int nSizeNew ) -{ - assert( p->nSize >= nSizeNew ); - p->nSize = nSizeNew; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrClear( Vec_Ptr_t * p ) -{ - p->nSize = 0; -} - -/**Function************************************************************* - - Synopsis [Copies the interger array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrCopy( Vec_Ptr_t * pDest, Vec_Ptr_t * pSour ) -{ - pDest->nSize = 0; - Vec_PtrGrow( pDest, pSour->nSize ); - memcpy( pDest->pArray, pSour->pArray, sizeof(void *) * pSour->nSize ); - pDest->nSize = pSour->nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrPush( Vec_Ptr_t * p, void * Entry ) -{ - if ( p->nSize == p->nCap ) - { - if ( p->nCap < 16 ) - Vec_PtrGrow( p, 16 ); - else - Vec_PtrGrow( p, 2 * p->nCap ); - } - p->pArray[p->nSize++] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_PtrPushUnique( Vec_Ptr_t * p, void * Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - return 1; - Vec_PtrPush( p, Entry ); - return 0; -} - -/**Function************************************************************* - - Synopsis [Returns the last entry and removes it from the list.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void * Vec_PtrPop( Vec_Ptr_t * p ) -{ - assert( p->nSize > 0 ); - return p->pArray[--p->nSize]; -} - -/**Function************************************************************* - - Synopsis [Find entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_PtrFind( Vec_Ptr_t * p, void * Entry ) -{ - int i; - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - return i; - return -1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrRemove( Vec_Ptr_t * p, void * Entry ) -{ - int i; - // delete assuming that it is closer to the end - for ( i = p->nSize - 1; i >= 0; i-- ) - if ( p->pArray[i] == Entry ) - break; - assert( i >= 0 ); -/* - // delete assuming that it is closer to the beginning - for ( i = 0; i < p->nSize; i++ ) - if ( p->pArray[i] == Entry ) - break; - assert( i < p->nSize ); -*/ - for ( i++; i < p->nSize; i++ ) - p->pArray[i-1] = p->pArray[i]; - p->nSize--; -} - -/**Function************************************************************* - - Synopsis [Moves the first nItems to the end.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrReorder( Vec_Ptr_t * p, int nItems ) -{ - assert( nItems < p->nSize ); - Vec_PtrGrow( p, nItems + p->nSize ); - memmove( (char **)p->pArray + p->nSize, p->pArray, nItems * sizeof(void*) ); - memmove( p->pArray, (char **)p->pArray + nItems, p->nSize * sizeof(void*) ); -} - -/**Function************************************************************* - - Synopsis [Sorting the entries by their integer value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrSort( Vec_Ptr_t * p, int (*Vec_PtrSortCompare)() ) -{ - if ( p->nSize < 2 ) - return; - qsort( (void *)p->pArray, p->nSize, sizeof(void *), - (int (*)(const void *, const void *)) Vec_PtrSortCompare ); -} - -/**Function************************************************************* - - Synopsis [Sorting the entries by their integer value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_PtrUniqify( Vec_Ptr_t * p, int (*Vec_PtrSortCompare)() ) -{ - int i, k; - if ( p->nSize < 2 ) - return; - qsort( (void *)p->pArray, p->nSize, sizeof(void *), - (int (*)(const void *, const void *)) Vec_PtrSortCompare ); - for ( i = k = 1; i < p->nSize; i++ ) - if ( p->pArray[i] != p->pArray[i-1] ) - p->pArray[k++] = p->pArray[i]; - p->nSize = k; -} - -#endif - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/vecStr.h b/src/vendor/stp/src/extlib-abc/vecStr.h deleted file mode 100644 index ef0c6c481..000000000 --- a/src/vendor/stp/src/extlib-abc/vecStr.h +++ /dev/null @@ -1,583 +0,0 @@ -/**CFile**************************************************************** - - FileName [vecStr.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Resizable arrays.] - - Synopsis [Resizable arrays of characters.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: vecStr.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __VEC_STR_H__ -#define __VEC_STR_H__ - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Vec_Str_t_ Vec_Str_t; -struct Vec_Str_t_ -{ - int nCap; - int nSize; - char * pArray; -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -#define Vec_StrForEachEntry( vVec, Entry, i ) \ - for ( i = 0; (i < Vec_StrSize(vVec)) && (((Entry) = Vec_StrEntry(vVec, i)), 1); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Str_t * Vec_StrAlloc( int nCap ) -{ - Vec_Str_t * p; - p = ALLOC( Vec_Str_t, 1 ); - if ( nCap > 0 && nCap < 16 ) - nCap = 16; - p->nSize = 0; - p->nCap = nCap; - p->pArray = p->nCap? ALLOC( char, p->nCap ) : NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given size and cleans it.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Str_t * Vec_StrStart( int nSize ) -{ - Vec_Str_t * p; - p = Vec_StrAlloc( nSize ); - p->nSize = nSize; - memset( p->pArray, 0, sizeof(char) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from an integer array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Str_t * Vec_StrAllocArray( char * pArray, int nSize ) -{ - Vec_Str_t * p; - p = ALLOC( Vec_Str_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = pArray; - return p; -} - -/**Function************************************************************* - - Synopsis [Creates the vector from an integer array of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Str_t * Vec_StrAllocArrayCopy( char * pArray, int nSize ) -{ - Vec_Str_t * p; - p = ALLOC( Vec_Str_t, 1 ); - p->nSize = nSize; - p->nCap = nSize; - p->pArray = ALLOC( char, nSize ); - memcpy( p->pArray, pArray, sizeof(char) * nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Duplicates the integer array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Str_t * Vec_StrDup( Vec_Str_t * pVec ) -{ - Vec_Str_t * p; - p = ALLOC( Vec_Str_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nCap; - p->pArray = p->nCap? ALLOC( char, p->nCap ) : NULL; - memcpy( p->pArray, pVec->pArray, sizeof(char) * pVec->nSize ); - return p; -} - -/**Function************************************************************* - - Synopsis [Transfers the array into another vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Str_t * Vec_StrDupArray( Vec_Str_t * pVec ) -{ - Vec_Str_t * p; - p = ALLOC( Vec_Str_t, 1 ); - p->nSize = pVec->nSize; - p->nCap = pVec->nCap; - p->pArray = pVec->pArray; - pVec->nSize = 0; - pVec->nCap = 0; - pVec->pArray = NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrFree( Vec_Str_t * p ) -{ - FREE( p->pArray ); - FREE( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline char * Vec_StrReleaseArray( Vec_Str_t * p ) -{ - char * pArray = p->pArray; - p->nCap = 0; - p->nSize = 0; - p->pArray = NULL; - return pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline char * Vec_StrArray( Vec_Str_t * p ) -{ - return p->pArray; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_StrSize( Vec_Str_t * p ) -{ - return p->nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline char Vec_StrEntry( Vec_Str_t * p, int i ) -{ - assert( i >= 0 && i < p->nSize ); - return p->pArray[i]; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrWriteEntry( Vec_Str_t * p, int i, char Entry ) -{ - assert( i >= 0 && i < p->nSize ); - p->pArray[i] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline char Vec_StrEntryLast( Vec_Str_t * p ) -{ - assert( p->nSize > 0 ); - return p->pArray[p->nSize-1]; -} - -/**Function************************************************************* - - Synopsis [Resizes the vector to the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrGrow( Vec_Str_t * p, int nCapMin ) -{ - if ( p->nCap >= nCapMin ) - return; - p->pArray = REALLOC( char, p->pArray, 2 * nCapMin ); - p->nCap = 2 * nCapMin; -} - -/**Function************************************************************* - - Synopsis [Fills the vector with given number of entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrFill( Vec_Str_t * p, int nSize, char Entry ) -{ - int i; - Vec_StrGrow( p, nSize ); - p->nSize = nSize; - for ( i = 0; i < p->nSize; i++ ) - p->pArray[i] = Entry; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrShrink( Vec_Str_t * p, int nSizeNew ) -{ - assert( p->nSize >= nSizeNew ); - p->nSize = nSizeNew; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrClear( Vec_Str_t * p ) -{ - p->nSize = 0; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrPush( Vec_Str_t * p, char Entry ) -{ - if ( p->nSize == p->nCap ) - { - if ( p->nCap < 16 ) - Vec_StrGrow( p, 16 ); - else - Vec_StrGrow( p, 2 * p->nCap ); - } - p->pArray[p->nSize++] = Entry; -} - -/**Function******************************************************************** - - Synopsis [Finds the smallest integer larger of equal than the logarithm.] - - Description [Returns [Log10(Num)].] - - SideEffects [] - - SeeAlso [] - -******************************************************************************/ -static inline int Vec_StrBase10Log( unsigned Num ) -{ - int Res; - assert( Num >= 0 ); - if ( Num == 0 ) return 0; - if ( Num == 1 ) return 1; - for ( Res = 0, Num--; Num; Num /= 10, Res++ ); - return Res; -} /* end of Extra_Base2Log */ - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrPrintNum( Vec_Str_t * p, int Num ) -{ - int i, nDigits; - if ( Num < 0 ) - { - Vec_StrPush( p, '-' ); - Num = -Num; - } - if ( Num < 10 ) - { - Vec_StrPush( p, (char)('0' + Num) ); - return; - } - nDigits = Vec_StrBase10Log( Num ); - Vec_StrGrow( p, p->nSize + nDigits ); - for ( i = nDigits - 1; i >= 0; i-- ) - { - Vec_StrWriteEntry( p, p->nSize + i, (char)('0' + Num % 10) ); - Num /= 10; - } - assert( Num == 0 ); - p->nSize += nDigits; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrPrintStr( Vec_Str_t * p, char * pStr ) -{ - int i, Length = strlen(pStr); - for ( i = 0; i < Length; i++ ) - Vec_StrPush( p, pStr[i] ); -} - -/**Function************************************************************* - - Synopsis [Appends the string to the char vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrAppend( Vec_Str_t * p, char * pString ) -{ - int i, nLength = strlen(pString); - Vec_StrGrow( p, p->nSize + nLength ); - for ( i = 0; i < nLength; i++ ) - p->pArray[p->nSize + i] = pString[i]; - p->nSize += nLength; -} - -/**Function************************************************************* - - Synopsis [Returns the last entry and removes it from the list.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline char Vec_StrPop( Vec_Str_t * p ) -{ - assert( p->nSize > 0 ); - return p->pArray[--p->nSize]; -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two clauses.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_StrSortCompare1( char * pp1, char * pp2 ) -{ - // for some reason commenting out lines (as shown) led to crashing of the release version - if ( *pp1 < *pp2 ) - return -1; - if ( *pp1 > *pp2 ) // - return 1; - return 0; // -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two clauses.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_StrSortCompare2( char * pp1, char * pp2 ) -{ - // for some reason commenting out lines (as shown) led to crashing of the release version - if ( *pp1 > *pp2 ) - return -1; - if ( *pp1 < *pp2 ) // - return 1; - return 0; // -} - -/**Function************************************************************* - - Synopsis [Sorting the entries by their integer value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_StrSort( Vec_Str_t * p, int fReverse ) -{ - if ( fReverse ) - qsort( (void *)p->pArray, p->nSize, sizeof(char), - (int (*)(const void *, const void *)) Vec_StrSortCompare2 ); - else - qsort( (void *)p->pArray, p->nSize, sizeof(char), - (int (*)(const void *, const void *)) Vec_StrSortCompare1 ); -} - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-abc/vecVec.h b/src/vendor/stp/src/extlib-abc/vecVec.h deleted file mode 100644 index 475cbb829..000000000 --- a/src/vendor/stp/src/extlib-abc/vecVec.h +++ /dev/null @@ -1,356 +0,0 @@ -/**CFile**************************************************************** - - FileName [vecVec.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Resizable arrays.] - - Synopsis [Resizable vector of resizable vectors.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: vecVec.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef __VEC_VEC_H__ -#define __VEC_VEC_H__ - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Vec_Vec_t_ Vec_Vec_t; -struct Vec_Vec_t_ -{ - int nCap; - int nSize; - void ** pArray; -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -// iterators through levels -#define Vec_VecForEachLevel( vGlob, vVec, i ) \ - for ( i = 0; (i < Vec_VecSize(vGlob)) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i++ ) -#define Vec_VecForEachLevelStart( vGlob, vVec, i, LevelStart ) \ - for ( i = LevelStart; (i < Vec_VecSize(vGlob)) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i++ ) -#define Vec_VecForEachLevelStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \ - for ( i = LevelStart; (i <= LevelStop) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i++ ) -#define Vec_VecForEachLevelReverse( vGlob, vVec, i ) \ - for ( i = Vec_VecSize(vGlob) - 1; (i >= 0) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i-- ) -#define Vec_VecForEachLevelReverseStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \ - for ( i = LevelStart; (i >= LevelStop) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i-- ) - -// iteratores through entries -#define Vec_VecForEachEntry( vGlob, pEntry, i, k ) \ - for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \ - Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k ) -#define Vec_VecForEachEntryLevel( vGlob, pEntry, i, Level ) \ - Vec_PtrForEachEntry( Vec_VecEntry(vGlob, Level), pEntry, i ) -#define Vec_VecForEachEntryStart( vGlob, pEntry, i, k, LevelStart ) \ - for ( i = LevelStart; i < Vec_VecSize(vGlob); i++ ) \ - Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k ) -#define Vec_VecForEachEntryStartStop( vGlob, pEntry, i, k, LevelStart, LevelStop ) \ - for ( i = LevelStart; i <= LevelStop; i++ ) \ - Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k ) -#define Vec_VecForEachEntryReverse( vGlob, pEntry, i, k ) \ - for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \ - Vec_PtrForEachEntryReverse( Vec_VecEntry(vGlob, i), pEntry, k ) -#define Vec_VecForEachEntryReverseReverse( vGlob, pEntry, i, k ) \ - for ( i = Vec_VecSize(vGlob) - 1; i >= 0; i-- ) \ - Vec_PtrForEachEntryReverse( Vec_VecEntry(vGlob, i), pEntry, k ) -#define Vec_VecForEachEntryReverseStart( vGlob, pEntry, i, k, LevelStart ) \ - for ( i = LevelStart; i >= 0; i-- ) \ - Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Vec_t * Vec_VecAlloc( int nCap ) -{ - Vec_Vec_t * p; - p = ALLOC( Vec_Vec_t, 1 ); - if ( nCap > 0 && nCap < 8 ) - nCap = 8; - p->nSize = 0; - p->nCap = nCap; - p->pArray = p->nCap? ALLOC( void *, p->nCap ) : NULL; - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Vec_Vec_t * Vec_VecStart( int nSize ) -{ - Vec_Vec_t * p; - int i; - p = Vec_VecAlloc( nSize ); - for ( i = 0; i < nSize; i++ ) - p->pArray[i] = Vec_PtrAlloc( 0 ); - p->nSize = nSize; - return p; -} - -/**Function************************************************************* - - Synopsis [Allocates a vector with the given capacity.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_VecExpand( Vec_Vec_t * p, int Level ) -{ - int i; - if ( p->nSize >= Level + 1 ) - return; - Vec_PtrGrow( (Vec_Ptr_t *)p, Level + 1 ); - for ( i = p->nSize; i <= Level; i++ ) - p->pArray[i] = Vec_PtrAlloc( 0 ); - p->nSize = Level + 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_VecSize( Vec_Vec_t * p ) -{ - return p->nSize; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void * Vec_VecEntry( Vec_Vec_t * p, int i ) -{ - assert( i >= 0 && i < p->nSize ); - return p->pArray[i]; -} - -/**Function************************************************************* - - Synopsis [Frees the vector.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_VecFree( Vec_Vec_t * p ) -{ - Vec_Ptr_t * vVec; - int i; - Vec_VecForEachLevel( p, vVec, i ) - Vec_PtrFree( vVec ); - Vec_PtrFree( (Vec_Ptr_t *)p ); -} - -/**Function************************************************************* - - Synopsis [Frees the vector of vectors.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_VecSizeSize( Vec_Vec_t * p ) -{ - Vec_Ptr_t * vVec; - int i, Counter = 0; - Vec_VecForEachLevel( p, vVec, i ) - Counter += vVec->nSize; - return Counter; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_VecClear( Vec_Vec_t * p ) -{ - Vec_Ptr_t * vVec; - int i; - Vec_VecForEachLevel( p, vVec, i ) - Vec_PtrClear( vVec ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_VecPush( Vec_Vec_t * p, int Level, void * Entry ) -{ - if ( p->nSize < Level + 1 ) - { - int i; - Vec_PtrGrow( (Vec_Ptr_t *)p, Level + 1 ); - for ( i = p->nSize; i < Level + 1; i++ ) - p->pArray[i] = Vec_PtrAlloc( 0 ); - p->nSize = Level + 1; - } - Vec_PtrPush( (Vec_Ptr_t*)p->pArray[Level], Entry ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_VecPushUnique( Vec_Vec_t * p, int Level, void * Entry ) -{ - if ( p->nSize < Level + 1 ) - Vec_VecPush( p, Level, Entry ); - else - Vec_PtrPushUnique( (Vec_Ptr_t*)p->pArray[Level], Entry ); -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two arrays.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_VecSortCompare1( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 ) -{ - if ( Vec_PtrSize(*pp1) < Vec_PtrSize(*pp2) ) - return -1; - if ( Vec_PtrSize(*pp1) > Vec_PtrSize(*pp2) ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Comparison procedure for two integers.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_VecSortCompare2( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 ) -{ - if ( Vec_PtrSize(*pp1) > Vec_PtrSize(*pp2) ) - return -1; - if ( Vec_PtrSize(*pp1) < Vec_PtrSize(*pp2) ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Sorting the entries by their integer value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_VecSort( Vec_Vec_t * p, int fReverse ) -{ - if ( fReverse ) - qsort( (void *)p->pArray, p->nSize, sizeof(void *), - (int (*)(const void *, const void *)) Vec_VecSortCompare2 ); - else - qsort( (void *)p->pArray, p->nSize, sizeof(void *), - (int (*)(const void *, const void *)) Vec_VecSortCompare1 ); -} - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/vendor/stp/src/extlib-constbv/Makefile b/src/vendor/stp/src/extlib-constbv/Makefile deleted file mode 100644 index 7b56942b5..000000000 --- a/src/vendor/stp/src/extlib-constbv/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -OBJS = $(SRCS:.cpp=.o) - - -libconstantbv.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend diff --git a/src/vendor/stp/src/extlib-constbv/constantbv.cpp b/src/vendor/stp/src/extlib-constbv/constantbv.cpp deleted file mode 100644 index cdae9c6ee..000000000 --- a/src/vendor/stp/src/extlib-constbv/constantbv.cpp +++ /dev/null @@ -1,3567 +0,0 @@ -/*****************************************************************************/ -/* AUTHOR: */ -/*****************************************************************************/ -/* */ -/* Steffen Beyer */ -/* mailto:sb@engelschall.com */ -/* http://www.engelschall.com/u/sb/download/ */ -/* */ -/*****************************************************************************/ -/* COPYRIGHT: */ -/*****************************************************************************/ -/* */ -/* Copyright (c) 1995 - 2004 by Steffen Beyer. */ -/* All rights reserved. */ -/* */ -/*****************************************************************************/ -/* LICENSE: */ -/*****************************************************************************/ -/* */ -/* This library is free software; you can redistribute it and/or */ -/* modify it under the terms of the GNU Library General Public */ -/* License as published by the Free Software Foundation; either */ -/* version 2 of the License, || (at your option) any later version. */ -/* */ -/* This library is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY || FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ -/* Library General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Library General Public */ -/* License along with this library; if not, write to the */ -/* Free Software Foundation, Inc., */ -/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* */ -/* || download a copy from ftp://ftp.gnu.org/pub/gnu/COPYING.LIB-2.0 */ -/* */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* MODULE NAME: constantbv.cpp MODULE TYPE:constantbv*/ -/*****************************************************************************/ -/* MODULE IMPORTS: */ -/*****************************************************************************/ -#include -#include /* MODULE TYPE: (sys) */ -#include /* MODULE TYPE: (sys) */ -#include /* MODULE TYPE: (sys) */ -#include /* MODULE TYPE: (sys) */ -#include "constantbv.h" - -namespace CONSTANTBV { - /*****************************************************************************/ - /* MODULE IMPLEMENTATION: */ - /*****************************************************************************/ - /**********************************************/ - /* global implementation-intrinsic constants: */ - /**********************************************/ - -#define BIT_VECTOR_HIDDEN_WORDS 3 - - /*****************************************************************/ - /* global machine-dependent constants (set by "BitVector_Boot"): */ - /*****************************************************************/ - - static unsigned int BITS; /* = # of bits in machine word (must be power of 2) */ - static unsigned int MODMASK; /* = BITS - 1 (mask for calculating modulo BITS) */ - static unsigned int LOGBITS; /* = ld(BITS) (logarithmus dualis) */ - static unsigned int FACTOR; /* = ld(BITS / 8) (ld of # of bytes) */ - - static unsigned int LSB = 1; /* = mask for least significant bit */ - static unsigned int MSB; /* = mask for most significant bit */ - - static unsigned int LONGBITS; /* = # of bits in unsigned long */ - - static unsigned int LOG10; /* = logarithm to base 10 of BITS - 1 */ - static unsigned int EXP10; /* = largest possible power of 10 in signed int */ - - /********************************************************************/ - /* global bit mask table for fast access (set by "BitVector_Boot"): */ - /********************************************************************/ - - static unsigned int BITMASKTAB[sizeof(unsigned int) << 3]; - - /*****************************/ - /* global macro definitions: */ - /*****************************/ - -#define BIT_VECTOR_ZERO_WORDS(target,count) \ - while (count-- > 0) *target++ = 0; - -#define BIT_VECTOR_FILL_WORDS(target,fill,count) \ - while (count-- > 0) *target++ = fill; - -#define BIT_VECTOR_FLIP_WORDS(target,flip,count) \ - while (count-- > 0) *target++ ^= flip; - -#define BIT_VECTOR_COPY_WORDS(target,source,count) \ - while (count-- > 0) *target++ = *source++; - -#define BIT_VECTOR_BACK_WORDS(target,source,count) \ - { target += count; source += count; while (count-- > 0) *--target = *--source; } - -#define BIT_VECTOR_CLR_BIT(address,index) \ - *(address+(index>>LOGBITS)) &= ~ BITMASKTAB[index & MODMASK]; - -#define BIT_VECTOR_SET_BIT(address,index) \ - *(address+(index>>LOGBITS)) |= BITMASKTAB[index & MODMASK]; - -#define BIT_VECTOR_TST_BIT(address,index) \ - ((*(address+(index>>LOGBITS)) & BITMASKTAB[index & MODMASK]) != 0) - -#define BIT_VECTOR_FLP_BIT(address,index,mask) \ - (mask = BITMASKTAB[index & MODMASK]), \ - (((*(addr+(index>>LOGBITS)) ^= mask) & mask) != 0) - -#define BIT_VECTOR_DIGITIZE(type,value,digit) \ - value = (type) ((digit = value) / 10); \ - digit -= value * 10; \ - digit += (type) '0'; - - /*********************************************************/ - /* private low-level functions (potentially dangerous!): */ - /*********************************************************/ - - static unsigned int power10(unsigned int x) { - unsigned int y = 1; - - while (x-- > 0) y *= 10; - return(y); - } - - static void BIT_VECTOR_zro_words(unsigned int * addr, unsigned int count) { - BIT_VECTOR_ZERO_WORDS(addr,count) - } - - static void BIT_VECTOR_cpy_words(unsigned int * target, - unsigned int * source, unsigned int count) { - BIT_VECTOR_COPY_WORDS(target,source,count) - } - - static void BIT_VECTOR_mov_words(unsigned int * target, - unsigned int * source, unsigned int count) { - if (target != source) { - if (target < source) BIT_VECTOR_COPY_WORDS(target,source,count) - else BIT_VECTOR_BACK_WORDS(target,source,count) - } - } - - static void BIT_VECTOR_ins_words(unsigned int * addr, - unsigned int total, unsigned int count, boolean clear) { - unsigned int length; - - if ((total > 0) && (count > 0)) { - if (count > total) count = total; - length = total - count; - if (length > 0) BIT_VECTOR_mov_words(addr+count,addr,length); - if (clear) BIT_VECTOR_zro_words(addr,count); - } - } - - static void BIT_VECTOR_del_words(unsigned int * addr, - unsigned int total, unsigned int count, boolean clear) { - unsigned int length; - - if ((total > 0) && (count > 0)) { - if (count > total) count = total; - length = total - count; - if (length > 0) BIT_VECTOR_mov_words(addr,addr+count,length); - if (clear) BIT_VECTOR_zro_words(addr+length,count); - } - } - - static void BIT_VECTOR_reverse(unsigned char * string, unsigned int length) { - unsigned char * last; - unsigned char temp; - - if (length > 1) { - last = string + length - 1; - while (string < last) { - temp = *string; - *string = *last; - *last = temp; - string++; - last--; - } - } - } - - static unsigned int BIT_VECTOR_int2str(unsigned char * string, unsigned int value) { - unsigned int length; - unsigned int digit; - unsigned char * work; - - work = string; - if (value > 0) { - length = 0; - while (value > 0) { - BIT_VECTOR_DIGITIZE(unsigned int,value,digit) - *work++ = (unsigned char) digit; - length++; - } - BIT_VECTOR_reverse(string,length); - } - else { - length = 1; - *work++ = (unsigned char) '0'; - } - return(length); - } - - static unsigned int BIT_VECTOR_str2int(unsigned char * string, unsigned int *value) { - unsigned int length; - unsigned int digit; - - *value = 0; - length = 0; - digit = (unsigned int) *string++; - /* separate because isdigit() is likely a macro! */ - while (isdigit((int)digit) != 0) { - length++; - digit -= (unsigned int) '0'; - if (*value) *value *= 10; - *value += digit; - digit = (unsigned int) *string++; - } - return(length); - } - - /********************************************/ - /* routine to convert error code to string: */ - /********************************************/ - - unsigned char * BitVector_Error(ErrCode error) { - switch (error) { - case ErrCode_Ok: return( (unsigned char *) NULL ); break; - case ErrCode_Type: return( (unsigned char *) ERRCODE_TYPE ); break; - case ErrCode_Bits: return( (unsigned char *) ERRCODE_BITS ); break; - case ErrCode_Word: return( (unsigned char *) ERRCODE_WORD ); break; - case ErrCode_Long: return( (unsigned char *) ERRCODE_LONG ); break; - case ErrCode_Powr: return( (unsigned char *) ERRCODE_POWR ); break; - case ErrCode_Loga: return( (unsigned char *) ERRCODE_LOGA ); break; - case ErrCode_Null: return( (unsigned char *) ERRCODE_NULL ); break; - case ErrCode_Indx: return( (unsigned char *) ERRCODE_INDX ); break; - case ErrCode_Ordr: return( (unsigned char *) ERRCODE_ORDR ); break; - case ErrCode_Size: return( (unsigned char *) ERRCODE_SIZE ); break; - case ErrCode_Pars: return( (unsigned char *) ERRCODE_PARS ); break; - case ErrCode_Ovfl: return( (unsigned char *) ERRCODE_OVFL ); break; - case ErrCode_Same: return( (unsigned char *) ERRCODE_SAME ); break; - case ErrCode_Expo: return( (unsigned char *) ERRCODE_EXPO ); break; - case ErrCode_Zero: return( (unsigned char *) ERRCODE_ZERO ); break; - default: return( (unsigned char *) ERRCODE_OOPS ); break; - } - } - - /*****************************************/ - /* automatic self-configuration routine: */ - /*****************************************/ - - /*******************************************************/ - /* */ - /* MUST be called once prior to any other function */ - /* to initialize the machine dependent constants */ - /* of this package! (But call only ONCE, or you */ - /* will suffer memory leaks!) */ - /* */ - /*******************************************************/ - - ErrCode BitVector_Boot(void) { - unsigned long longsample = 1L; - unsigned int sample = LSB; - unsigned int lsb; - - if (sizeof(unsigned int) > sizeof(size_t)) return(ErrCode_Type); - - BITS = 1; - while (sample <<= 1) BITS++; /* determine # of bits in a machine word */ - - if (BITS != (sizeof(unsigned int) << 3)) return(ErrCode_Bits); - - if (BITS < 16) return(ErrCode_Word); - - LONGBITS = 1; - while (longsample <<= 1) LONGBITS++; /* = # of bits in an unsigned long */ - - if (BITS > LONGBITS) return(ErrCode_Long); - - LOGBITS = 0; - sample = BITS; - lsb = (sample & LSB); - while ((sample >>= 1) && (! lsb)) { - LOGBITS++; - lsb = (sample & LSB); - } - - if (sample) return(ErrCode_Powr); /* # of bits is not a power of 2! */ - - if (BITS != (LSB << LOGBITS)) return(ErrCode_Loga); - - MODMASK = BITS - 1; - FACTOR = LOGBITS - 3; /* ld(BITS / 8) = ld(BITS) - ld(8) = ld(BITS) - 3 */ - MSB = (LSB << MODMASK); - - for ( sample = 0; sample < BITS; sample++ ) { - BITMASKTAB[sample] = (LSB << sample); - } - - LOG10 = (unsigned int) (MODMASK * 0.30103); /* = (BITS - 1) * ( ln 2 / ln 10 ) */ - EXP10 = power10(LOG10); - - return(ErrCode_Ok); - } - - unsigned int BitVector_Size(unsigned int bits) { /* bit vector size (# of words) */ - unsigned int size; - - size = bits >> LOGBITS; - if (bits & MODMASK) size++; - return(size); - } - - unsigned int BitVector_Mask(unsigned int bits) /* bit vector mask (unused bits) */ - { - unsigned int mask; - - mask = bits & MODMASK; - if (mask) mask = (unsigned int) ~(~0L << mask); else mask = (unsigned int) ~0L; - return(mask); - } - - unsigned char * BitVector_Version(void) - { - return((unsigned char *)"6.4"); - } - - unsigned int BitVector_Word_Bits(void) - { - return(BITS); - } - - unsigned int BitVector_Long_Bits(void) - { - return(LONGBITS); - } - - /********************************************************************/ - /* */ - /* WARNING: Do not "free()" constant character strings, i.e., */ - /* don't call "BitVector_Dispose()" for strings returned */ - /* by "BitVector_Error()" or "BitVector_Version()"! */ - /* */ - /* ONLY call this function for strings allocated with "malloc()", */ - /* i.e., the strings returned by the functions "BitVector_to_*()" */ - /* and "BitVector_Block_Read()"! */ - /* */ - /********************************************************************/ - - void BitVector_Dispose(unsigned char * string) /* free string */ - { - if (string != NULL) free((void *) string); - } - - void BitVector_Destroy(unsigned int * addr) /* free bitvec */ - { - if (addr != NULL) - { - addr -= BIT_VECTOR_HIDDEN_WORDS; - free((void *) addr); - } - } - - void BitVector_Destroy_List(unsigned int * * list, unsigned int count) /* free list */ - { - unsigned int * * slot; - - if (list != NULL) - { - slot = list; - while (count-- > 0) - { - BitVector_Destroy(*slot++); - } - free((void *) list); - } - } - - unsigned int * BitVector_Create(unsigned int bits, boolean clear) /* malloc */ - { - unsigned int size; - unsigned int mask; - unsigned int bytes; - unsigned int * addr; - unsigned int * zero; - - size = BitVector_Size(bits); - mask = BitVector_Mask(bits); - bytes = (size + BIT_VECTOR_HIDDEN_WORDS) << FACTOR; - addr = (unsigned int * ) malloc((size_t) bytes); - if (addr != NULL) - { - *addr++ = bits; - *addr++ = size; - *addr++ = mask; - if (clear) - { - zero = addr; - BIT_VECTOR_ZERO_WORDS(zero,size) - } - } - return(addr); - } - - unsigned int * * BitVector_Create_List(unsigned int bits, boolean clear, unsigned int count) - { - unsigned int * * list = NULL; - unsigned int * * slot; - unsigned int * addr; - unsigned int i; - - if (count > 0) - { - list = (unsigned int * * ) malloc(sizeof(unsigned int * ) * count); - if (list != NULL) - { - slot = list; - for ( i = 0; i < count; i++ ) - { - addr = BitVector_Create(bits,clear); - if (addr == NULL) - { - BitVector_Destroy_List(list,i); - return(NULL); - } - *slot++ = addr; - } - } - } - return(list); - } - - unsigned int * BitVector_Resize(unsigned int * oldaddr, unsigned int bits) /* realloc */ - { - unsigned int bytes; - unsigned int oldsize; - unsigned int oldmask; - unsigned int newsize; - unsigned int newmask; - unsigned int * newaddr; - unsigned int * source; - unsigned int * target; - - oldsize = size_(oldaddr); - oldmask = mask_(oldaddr); - newsize = BitVector_Size(bits); - newmask = BitVector_Mask(bits); - if (oldsize > 0) *(oldaddr+oldsize-1) &= oldmask; - if (newsize <= oldsize) - { - newaddr = oldaddr; - bits_(newaddr) = bits; - size_(newaddr) = newsize; - mask_(newaddr) = newmask; - if (newsize > 0) *(newaddr+newsize-1) &= newmask; - } - else - { - bytes = (newsize + BIT_VECTOR_HIDDEN_WORDS) << FACTOR; - newaddr = (unsigned int * ) malloc((size_t) bytes); - if (newaddr != NULL) - { - *newaddr++ = bits; - *newaddr++ = newsize; - *newaddr++ = newmask; - target = newaddr; - source = oldaddr; - newsize -= oldsize; - BIT_VECTOR_COPY_WORDS(target,source,oldsize) - BIT_VECTOR_ZERO_WORDS(target,newsize) - } - BitVector_Destroy(oldaddr); - } - return(newaddr); - } - - unsigned int * BitVector_Shadow(unsigned int * addr) /* makes new, same size but empty */ - { - return( BitVector_Create(bits_(addr),true) ); - } - - unsigned int * BitVector_Clone(unsigned int * addr) /* makes exact duplicate */ - { - unsigned int bits; - unsigned int * twin; - - bits = bits_(addr); - twin = BitVector_Create(bits,false); - if ((twin != NULL) && (bits > 0)) - BIT_VECTOR_cpy_words(twin,addr,size_(addr)); - return(twin); - } - - unsigned int * BitVector_Concat(unsigned int * X, unsigned int * Y) /* returns concatenation */ - { - /* BEWARE that X = most significant part, Y = least significant part! */ - - unsigned int bitsX; - unsigned int bitsY; - unsigned int bitsZ; - unsigned int * Z; - - bitsX = bits_(X); - bitsY = bits_(Y); - bitsZ = bitsX + bitsY; - Z = BitVector_Create(bitsZ,false); - if ((Z != NULL) && (bitsZ > 0)) - { - BIT_VECTOR_cpy_words(Z,Y,size_(Y)); - BitVector_Interval_Copy(Z,X,bitsY,0,bitsX); - *(Z+size_(Z)-1) &= mask_(Z); - } - return(Z); - } - - void BitVector_Copy(unsigned int * X, unsigned int * Y) /* X = Y */ - { - unsigned int sizeX = size_(X); - unsigned int sizeY = size_(Y); - unsigned int maskX = mask_(X); - unsigned int maskY = mask_(Y); - unsigned int fill = 0; - unsigned int * lastX; - unsigned int * lastY; - - if ((X != Y) && (sizeX > 0)) - { - lastX = X + sizeX - 1; - if (sizeY > 0) - { - lastY = Y + sizeY - 1; - if ( (*lastY & (maskY & ~ (maskY >> 1))) == 0 ) *lastY &= maskY; - else - { - fill = (unsigned int) ~0L; - *lastY |= ~ maskY; - } - while ((sizeX > 0) && (sizeY > 0)) - { - *X++ = *Y++; - sizeX--; - sizeY--; - } - *lastY &= maskY; - } - while (sizeX-- > 0) *X++ = fill; - *lastX &= maskX; - } - } - - void BitVector_Empty(unsigned int * addr) /* X = {} clr all */ - { - unsigned int size = size_(addr); - - BIT_VECTOR_ZERO_WORDS(addr,size) - } - - void BitVector_Fill(unsigned int * addr) /* X = ~{} set all */ - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int fill = (unsigned int) ~0L; - - if (size > 0) - { - BIT_VECTOR_FILL_WORDS(addr,fill,size) - *(--addr) &= mask; - } - } - - void BitVector_Flip(unsigned int * addr) /* X = ~X flip all */ - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int flip = (unsigned int) ~0L; - - if (size > 0) - { - BIT_VECTOR_FLIP_WORDS(addr,flip,size) - *(--addr) &= mask; - } - } - - void BitVector_Primes(unsigned int * addr) - { - unsigned int bits = bits_(addr); - unsigned int size = size_(addr); - unsigned int * work; - unsigned int temp; - unsigned int i,j; - - if (size > 0) - { - temp = 0xAAAA; - i = BITS >> 4; - while (--i > 0) - { - temp <<= 16; - temp |= 0xAAAA; - } - i = size; - work = addr; - *work++ = temp ^ 0x0006; - while (--i > 0) *work++ = temp; - for ( i = 3; (j = i * i) < bits; i += 2 ) - { - for ( ; j < bits; j += i ) BIT_VECTOR_CLR_BIT(addr,j) - } - *(addr+size-1) &= mask_(addr); - } - } - - void BitVector_Reverse(unsigned int * X, unsigned int * Y) - { - unsigned int bits = bits_(X); - unsigned int mask; - unsigned int bit; - unsigned int value; - - if (bits > 0) - { - if (X == Y) BitVector_Interval_Reverse(X,0,bits-1); - else if (bits == bits_(Y)) - { - /* mask = mask_(Y); */ - /* mask &= ~ (mask >> 1); */ - mask = BITMASKTAB[(bits-1) & MODMASK]; - Y += size_(Y) - 1; - value = 0; - bit = LSB; - while (bits-- > 0) - { - if ((*Y & mask) != 0) - { - value |= bit; - } - if (! (mask >>= 1)) - { - Y--; - mask = MSB; - } - if (! (bit <<= 1)) - { - *X++ = value; - value = 0; - bit = LSB; - } - } - if (bit > LSB) *X = value; - } - } - } - - void BitVector_Interval_Empty(unsigned int * addr, unsigned int lower, unsigned int upper) - { /* X = X \ [lower..upper] */ - unsigned int bits = bits_(addr); - unsigned int size = size_(addr); - unsigned int * loaddr; - unsigned int * hiaddr; - unsigned int lobase; - unsigned int hibase; - unsigned int lomask; - unsigned int himask; - unsigned int diff; - - if ((size > 0) && (lower < bits) && (upper < bits) && (lower <= upper)) - { - lobase = lower >> LOGBITS; - hibase = upper >> LOGBITS; - diff = hibase - lobase; - loaddr = addr + lobase; - hiaddr = addr + hibase; - - lomask = (unsigned int) (~0L << (lower & MODMASK)); - himask = (unsigned int) ~((~0L << (upper & MODMASK)) << 1); - - if (diff == 0) - { - *loaddr &= ~ (lomask & himask); - } - else - { - *loaddr++ &= ~ lomask; - while (--diff > 0) - { - *loaddr++ = 0; - } - *hiaddr &= ~ himask; - } - } - } - - void BitVector_Interval_Fill(unsigned int * addr, unsigned int lower, unsigned int upper) - { /* X = X + [lower..upper] */ - unsigned int bits = bits_(addr); - unsigned int size = size_(addr); - unsigned int fill = (unsigned int) ~0L; - unsigned int * loaddr; - unsigned int * hiaddr; - unsigned int lobase; - unsigned int hibase; - unsigned int lomask; - unsigned int himask; - unsigned int diff; - - if ((size > 0) && (lower < bits) && (upper < bits) && (lower <= upper)) - { - lobase = lower >> LOGBITS; - hibase = upper >> LOGBITS; - diff = hibase - lobase; - loaddr = addr + lobase; - hiaddr = addr + hibase; - - lomask = (unsigned int) (~0L << (lower & MODMASK)); - himask = (unsigned int) ~((~0L << (upper & MODMASK)) << 1); - - if (diff == 0) - { - *loaddr |= (lomask & himask); - } - else - { - *loaddr++ |= lomask; - while (--diff > 0) - { - *loaddr++ = fill; - } - *hiaddr |= himask; - } - *(addr+size-1) &= mask_(addr); - } - } - - void BitVector_Interval_Flip(unsigned int * addr, unsigned int lower, unsigned int upper) - { /* X = X ^ [lower..upper] */ - unsigned int bits = bits_(addr); - unsigned int size = size_(addr); - unsigned int flip = (unsigned int) ~0L; - unsigned int * loaddr; - unsigned int * hiaddr; - unsigned int lobase; - unsigned int hibase; - unsigned int lomask; - unsigned int himask; - unsigned int diff; - - if ((size > 0) && (lower < bits) && (upper < bits) && (lower <= upper)) - { - lobase = lower >> LOGBITS; - hibase = upper >> LOGBITS; - diff = hibase - lobase; - loaddr = addr + lobase; - hiaddr = addr + hibase; - - lomask = (unsigned int) (~0L << (lower & MODMASK)); - himask = (unsigned int) ~((~0L << (upper & MODMASK)) << 1); - - if (diff == 0) - { - *loaddr ^= (lomask & himask); - } - else - { - *loaddr++ ^= lomask; - while (--diff > 0) - { - *loaddr++ ^= flip; - } - *hiaddr ^= himask; - } - *(addr+size-1) &= mask_(addr); - } - } - - void BitVector_Interval_Reverse(unsigned int * addr, unsigned int lower, unsigned int upper) - { - unsigned int bits = bits_(addr); - unsigned int * loaddr; - unsigned int * hiaddr; - unsigned int lomask; - unsigned int himask; - - if ((bits > 0) && (lower < bits) && (upper < bits) && (lower < upper)) - { - loaddr = addr + (lower >> LOGBITS); - hiaddr = addr + (upper >> LOGBITS); - lomask = BITMASKTAB[lower & MODMASK]; - himask = BITMASKTAB[upper & MODMASK]; - for ( bits = upper - lower + 1; bits > 1; bits -= 2 ) - { - if (((*loaddr & lomask) != 0) ^ ((*hiaddr & himask) != 0)) - { - *loaddr ^= lomask; /* swap bits only if they differ! */ - *hiaddr ^= himask; - } - if (! (lomask <<= 1)) - { - lomask = LSB; - loaddr++; - } - if (! (himask >>= 1)) - { - himask = MSB; - hiaddr--; - } - } - } - } - - boolean BitVector_interval_scan_inc(unsigned int * addr, unsigned int start, - unsigned int * min, unsigned int * max) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int offset; - unsigned int bitmask; - unsigned int value; - boolean empty; - - if ((size == 0) || (start >= bits_(addr))) return(false); - - *min = start; - *max = start; - - offset = start >> LOGBITS; - - *(addr+size-1) &= mask; - - addr += offset; - size -= offset; - - bitmask = BITMASKTAB[start & MODMASK]; - mask = ~ (bitmask | (bitmask - 1)); - - value = *addr++; - if ((value & bitmask) == 0) - { - value &= mask; - if (value == 0) - { - offset++; - empty = true; - while (empty && (--size > 0)) - { - if ((value = *addr++)) empty = false; else offset++; - } - if (empty) return(false); - } - start = offset << LOGBITS; - bitmask = LSB; - mask = value; - while (! (mask & LSB)) - { - bitmask <<= 1; - mask >>= 1; - start++; - } - mask = ~ (bitmask | (bitmask - 1)); - *min = start; - *max = start; - } - value = ~ value; - value &= mask; - if (value == 0) - { - offset++; - empty = true; - while (empty && (--size > 0)) - { - if ((value = ~ *addr++)) empty = false; else offset++; - } - if (empty) value = LSB; - } - start = offset << LOGBITS; - while (! (value & LSB)) - { - value >>= 1; - start++; - } - *max = --start; - return(true); - } - - boolean BitVector_interval_scan_dec(unsigned int * addr, unsigned int start, - unsigned int * min, unsigned int * max) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int offset; - unsigned int bitmask; - unsigned int value; - boolean empty; - - if ((size == 0) || (start >= bits_(addr))) return(false); - - *min = start; - *max = start; - - offset = start >> LOGBITS; - - if (offset >= size) return(false); - - *(addr+size-1) &= mask; - - addr += offset; - size = ++offset; - - bitmask = BITMASKTAB[start & MODMASK]; - mask = (bitmask - 1); - - value = *addr--; - if ((value & bitmask) == 0) - { - value &= mask; - if (value == 0) - { - offset--; - empty = true; - while (empty && (--size > 0)) - { - if ((value = *addr--)) empty = false; else offset--; - } - if (empty) return(false); - } - start = offset << LOGBITS; - bitmask = MSB; - mask = value; - while (! (mask & MSB)) - { - bitmask >>= 1; - mask <<= 1; - start--; - } - mask = (bitmask - 1); - *max = --start; - *min = start; - } - value = ~ value; - value &= mask; - if (value == 0) - { - offset--; - empty = true; - while (empty && (--size > 0)) - { - if ((value = ~ *addr--)) empty = false; else offset--; - } - if (empty) value = MSB; - } - start = offset << LOGBITS; - while (! (value & MSB)) - { - value <<= 1; - start--; - } - *min = start; - return(true); - } - - void BitVector_Interval_Copy(unsigned int * X, unsigned int * Y, unsigned int Xoffset, - unsigned int Yoffset, unsigned int length) - { - unsigned int bitsX = bits_(X); - unsigned int bitsY = bits_(Y); - unsigned int source = 0; /* silence compiler warning */ - unsigned int target = 0; /* silence compiler warning */ - unsigned int s_lo_base; - unsigned int s_hi_base; - unsigned int s_lo_bit; - unsigned int s_hi_bit; - unsigned int s_base; - unsigned int s_lower = 0; /* silence compiler warning */ - unsigned int s_upper = 0; /* silence compiler warning */ - unsigned int s_bits; - unsigned int s_min; - unsigned int s_max; - unsigned int t_lo_base; - unsigned int t_hi_base; - unsigned int t_lo_bit; - unsigned int t_hi_bit; - unsigned int t_base; - unsigned int t_lower = 0; /* silence compiler warning */ - unsigned int t_upper = 0; /* silence compiler warning */ - unsigned int t_bits; - unsigned int t_min; - unsigned int mask; - unsigned int bits; - unsigned int select; - boolean ascending; - boolean notfirst; - unsigned int * Z = X; - - if ((length > 0) && (Xoffset < bitsX) && (Yoffset < bitsY)) - { - if ((Xoffset + length) > bitsX) length = bitsX - Xoffset; - if ((Yoffset + length) > bitsY) length = bitsY - Yoffset; - - ascending = (Xoffset <= Yoffset); - - s_lo_base = Yoffset >> LOGBITS; - s_lo_bit = Yoffset & MODMASK; - Yoffset += --length; - s_hi_base = Yoffset >> LOGBITS; - s_hi_bit = Yoffset & MODMASK; - - t_lo_base = Xoffset >> LOGBITS; - t_lo_bit = Xoffset & MODMASK; - Xoffset += length; - t_hi_base = Xoffset >> LOGBITS; - t_hi_bit = Xoffset & MODMASK; - - if (ascending) - { - s_base = s_lo_base; - t_base = t_lo_base; - } - else - { - s_base = s_hi_base; - t_base = t_hi_base; - } - s_bits = 0; - t_bits = 0; - Y += s_base; - X += t_base; - notfirst = false; - while (true) - { - if (t_bits == 0) - { - if (notfirst) - { - *X = target; - if (ascending) - { - if (t_base == t_hi_base) break; - t_base++; - X++; - } - else - { - if (t_base == t_lo_base) break; - t_base--; - X--; - } - } - select = ((t_base == t_hi_base) << 1) | (t_base == t_lo_base); - switch (select) - { - case 0: - t_lower = 0; - t_upper = BITS - 1; - t_bits = BITS; - target = 0; - break; - case 1: - t_lower = t_lo_bit; - t_upper = BITS - 1; - t_bits = BITS - t_lo_bit; - mask = (unsigned int) (~0L << t_lower); - target = *X & ~ mask; - break; - case 2: - t_lower = 0; - t_upper = t_hi_bit; - t_bits = t_hi_bit + 1; - mask = (unsigned int) ((~0L << t_upper) << 1); - target = *X & mask; - break; - case 3: - t_lower = t_lo_bit; - t_upper = t_hi_bit; - t_bits = t_hi_bit - t_lo_bit + 1; - mask = (unsigned int) (~0L << t_lower); - mask &= (unsigned int) ~((~0L << t_upper) << 1); - target = *X & ~ mask; - break; - } - } - if (s_bits == 0) - { - if (notfirst) - { - if (ascending) - { - if (s_base == s_hi_base) break; - s_base++; - Y++; - } - else - { - if (s_base == s_lo_base) break; - s_base--; - Y--; - } - } - source = *Y; - select = ((s_base == s_hi_base) << 1) | (s_base == s_lo_base); - switch (select) - { - case 0: - s_lower = 0; - s_upper = BITS - 1; - s_bits = BITS; - break; - case 1: - s_lower = s_lo_bit; - s_upper = BITS - 1; - s_bits = BITS - s_lo_bit; - break; - case 2: - s_lower = 0; - s_upper = s_hi_bit; - s_bits = s_hi_bit + 1; - break; - case 3: - s_lower = s_lo_bit; - s_upper = s_hi_bit; - s_bits = s_hi_bit - s_lo_bit + 1; - break; - } - } - notfirst = true; - if (s_bits > t_bits) - { - bits = t_bits - 1; - if (ascending) - { - s_min = s_lower; - s_max = s_lower + bits; - } - else - { - s_max = s_upper; - s_min = s_upper - bits; - } - t_min = t_lower; - } - else - { - bits = s_bits - 1; - if (ascending) t_min = t_lower; - else t_min = t_upper - bits; - s_min = s_lower; - s_max = s_upper; - } - bits++; - mask = (unsigned int) (~0L << s_min); - mask &= (unsigned int) ~((~0L << s_max) << 1); - if (s_min == t_min) target |= (source & mask); - else - { - if (s_min < t_min) target |= (source & mask) << (t_min-s_min); - else target |= (source & mask) >> (s_min-t_min); - } - if (ascending) - { - s_lower += bits; - t_lower += bits; - } - else - { - s_upper -= bits; - t_upper -= bits; - } - s_bits -= bits; - t_bits -= bits; - } - *(Z+size_(Z)-1) &= mask_(Z); - } - } - - - unsigned int * BitVector_Interval_Substitute(unsigned int * X, unsigned int * Y, - unsigned int Xoffset, unsigned int Xlength, - unsigned int Yoffset, unsigned int Ylength) - { - unsigned int Xbits = bits_(X); - unsigned int Ybits = bits_(Y); - unsigned int limit; - unsigned int diff; - - if ((Xoffset <= Xbits) && (Yoffset <= Ybits)) - { - limit = Xoffset + Xlength; - if (limit > Xbits) - { - limit = Xbits; - Xlength = Xbits - Xoffset; - } - if ((Yoffset + Ylength) > Ybits) - { - Ylength = Ybits - Yoffset; - } - if (Xlength == Ylength) - { - if ((Ylength > 0) && ((X != Y) || (Xoffset != Yoffset))) - { - BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Ylength); - } - } - else /* Xlength != Ylength */ - { - if (Xlength > Ylength) - { - diff = Xlength - Ylength; - if (Ylength > 0) BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Ylength); - if (limit < Xbits) BitVector_Delete(X,Xoffset+Ylength,diff,false); - if ((X = BitVector_Resize(X,Xbits-diff)) == NULL) return(NULL); - } - else /* Ylength > Xlength ==> Ylength > 0 */ - { - diff = Ylength - Xlength; - if (X != Y) - { - if ((X = BitVector_Resize(X,Xbits+diff)) == NULL) return(NULL); - if (limit < Xbits) BitVector_Insert(X,limit,diff,false); - BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Ylength); - } - else /* in-place */ - { - if ((Y = X = BitVector_Resize(X,Xbits+diff)) == NULL) return(NULL); - if (limit >= Xbits) - { - BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Ylength); - } - else /* limit < Xbits */ - { - BitVector_Insert(X,limit,diff,false); - if ((Yoffset+Ylength) <= limit) - { - BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Ylength); - } - else /* overlaps or lies above critical area */ - { - if (limit <= Yoffset) - { - Yoffset += diff; - BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Ylength); - } - else /* Yoffset < limit */ - { - Xlength = limit - Yoffset; - BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Xlength); - Yoffset = Xoffset + Ylength; /* = limit + diff */ - Xoffset += Xlength; - Ylength -= Xlength; - BitVector_Interval_Copy(X,Y,Xoffset,Yoffset,Ylength); - } - } - } - } - } - } - } - return(X); - } - - boolean BitVector_is_empty(unsigned int * addr) /* X == {} ? */ - { - unsigned int size = size_(addr); - boolean r = true; - - if (size > 0) - { - *(addr+size-1) &= mask_(addr); - while (r && (size-- > 0)) r = ( *addr++ == 0 ); - } - return(r); - } - - boolean BitVector_is_full(unsigned int * addr) /* X == ~{} ? */ - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - boolean r = false; - unsigned int * last; - - if (size > 0) - { - r = true; - last = addr + size - 1; - *last |= ~ mask; - while (r && (size-- > 0)) r = ( ~ *addr++ == 0 ); - *last &= mask; - } - return(r); - } - - boolean BitVector_equal(unsigned int * X, unsigned int * Y) /* X == Y ? */ - { - unsigned int size = size_(X); - unsigned int mask = mask_(X); - boolean r = false; - - if (bits_(X) == bits_(Y)) - { - r = true; - if (size > 0) - { - *(X+size-1) &= mask; - *(Y+size-1) &= mask; - while (r && (size-- > 0)) r = (*X++ == *Y++); - } - } - return(r); - } - - /* X <,=,> Y ? : unsigned */ - signed int BitVector_Lexicompare(unsigned int * X, unsigned int * Y) { - unsigned int bitsX = bits_(X); - unsigned int bitsY = bits_(Y); - unsigned int size = size_(X); - boolean r = true; - - if (bitsX == bitsY) { - if (size > 0) { - X += size; - Y += size; - while (r && (size-- > 0)) r = (*(--X) == *(--Y)); - } - if (r) return((signed int) 0); - else { - if (*X < *Y) return((signed int) -1); else return((signed int) 1); - } - } - else { - if (bitsX < bitsY) return((signed int) -1); else return((signed int) 1); - } - } - - signed int BitVector_Compare(unsigned int * X, unsigned int * Y) /* X <,=,> Y ? */ - { /* signed */ - unsigned int bitsX = bits_(X); - unsigned int bitsY = bits_(Y); - unsigned int size = size_(X); - unsigned int mask = mask_(X); - unsigned int sign; - boolean r = true; - - if (bitsX == bitsY) - { - if (size > 0) - { - X += size; - Y += size; - mask &= ~ (mask >> 1); - if ((sign = (*(X-1) & mask)) != (*(Y-1) & mask)) - { - if (sign) return((signed int) -1); else return((signed int) 1); - } - while (r && (size-- > 0)) r = (*(--X) == *(--Y)); - } - if (r) return((signed int) 0); - else - { - if (*X < *Y) return((signed int) -1); else return((signed int) 1); - } - } - else - { - if (bitsX < bitsY) return((signed int) -1); else return((signed int) 1); - } - } - - size_t BitVector_Hash(unsigned int * addr) - { - unsigned int bits = bits_(addr); - unsigned int size = size_(addr); - unsigned int value; - unsigned int count; - unsigned int digit; - unsigned int length; - - size_t result = 0; - - length = bits >> 2; - if (bits & 0x0003) length++; - if (size > 0) - { - *(addr+size-1) &= mask_(addr); - while ((size-- > 0) && (length > 0)) - { - value = *addr++; - count = BITS >> 2; - while ((count-- > 0) && (length > 0)) - { - digit = value & 0x000F; - if (digit > 9) digit += (unsigned int) 'A' - 10; - else digit += (unsigned int) '0'; - result = 5*result + digit; length--; - if ((count > 0) && (length > 0)) value >>= 4; - } - } - } - return result; - } - - - unsigned char * BitVector_to_Hex(unsigned int * addr) - { - unsigned int bits = bits_(addr); - unsigned int size = size_(addr); - unsigned int value; - unsigned int count; - unsigned int digit; - unsigned int length; - unsigned char * string; - - length = bits >> 2; - if (bits & 0x0003) length++; - string = (unsigned char *) malloc((size_t) (length+1)); - if (string == NULL) return(NULL); - string += length; - *string = (unsigned char) '\0'; - if (size > 0) - { - *(addr+size-1) &= mask_(addr); - while ((size-- > 0) && (length > 0)) - { - value = *addr++; - count = BITS >> 2; - while ((count-- > 0) && (length > 0)) - { - digit = value & 0x000F; - if (digit > 9) digit += (unsigned int) 'A' - 10; - else digit += (unsigned int) '0'; - *(--string) = (unsigned char) digit; length--; - if ((count > 0) && (length > 0)) value >>= 4; - } - } - } - return(string); - } - - ErrCode BitVector_from_Hex(unsigned int * addr, unsigned char * string) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - boolean ok = true; - unsigned int length; - unsigned int value; - unsigned int count; - int digit; - - if (size > 0) - { - length = strlen((char *) string); - string += length; - while (size-- > 0) - { - value = 0; - for ( count = 0; (ok && (length > 0) && (count < BITS)); count += 4 ) - { - digit = (int) *(--string); length--; - /* separate because toupper() is likely a macro! */ - digit = toupper(digit); - if ((ok = (isxdigit(digit) != 0))) - { - if (digit >= (int) 'A') digit -= (int) 'A' - 10; - else digit -= (int) '0'; - value |= (((unsigned int) digit) << count); - } - } - *addr++ = value; - } - *(--addr) &= mask; - } - if (ok) return(ErrCode_Ok); - else return(ErrCode_Pars); - } - - unsigned char * BitVector_to_Bin(unsigned int * addr) - { - unsigned int size = size_(addr); - unsigned int value; - unsigned int count; - unsigned int digit; - unsigned int length; - unsigned char * string; - - length = bits_(addr); - string = (unsigned char *) malloc((size_t) (length+1)); - if (string == NULL) return(NULL); - string += length; - *string = (unsigned char) '\0'; - if (size > 0) - { - *(addr+size-1) &= mask_(addr); - while (size-- > 0) - { - value = *addr++; - count = BITS; - if (count > length) count = length; - while (count-- > 0) - { - digit = value & 0x0001; - digit += (unsigned int) '0'; - *(--string) = (unsigned char) digit; length--; - if (count > 0) value >>= 1; - } - } - } - return(string); - } - - ErrCode BitVector_from_Bin(unsigned int * addr, unsigned char * string) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - boolean ok = true; - unsigned int length; - unsigned int value; - unsigned int count; - int digit; - - if (size > 0) - { - length = strlen((char *) string); - string += length; - while (size-- > 0) - { - value = 0; - for ( count = 0; (ok && (length > 0) && (count < BITS)); count++ ) - { - digit = (int) *(--string); length--; - switch (digit) - { - case (int) '0': - break; - case (int) '1': - value |= BITMASKTAB[count]; - break; - default: - ok = false; - break; - } - } - *addr++ = value; - } - *(--addr) &= mask; - } - if (ok) return(ErrCode_Ok); - else return(ErrCode_Pars); - } - - unsigned char * BitVector_to_Dec(unsigned int * addr) - { - unsigned int bits = bits_(addr); - unsigned int length; - unsigned int digits; - unsigned int count; - unsigned int q; - unsigned int r; - boolean loop; - unsigned char * result; - unsigned char * string; - unsigned int * quot; - unsigned int * rest; - unsigned int * temp; - unsigned int * base; - signed int sign; - - length = (unsigned int) (bits / 3.3); /* digits = bits * ln(2) / ln(10) */ - length += 2; /* compensate for truncating & provide space for minus sign */ - result = (unsigned char *) malloc((size_t) (length+1)); /* remember the '\0'! */ - if (result == NULL) return(NULL); - string = result; - sign = BitVector_Sign(addr); - if ((bits < 4) || (sign == 0)) - { - if (bits > 0) digits = *addr; else digits = (unsigned int) 0; - if (sign < 0) digits = ((unsigned int)(-((signed int)digits))) & mask_(addr); - *string++ = (unsigned char) digits + (unsigned char) '0'; - digits = 1; - } - else - { - quot = BitVector_Create(bits,false); - if (quot == NULL) - { - BitVector_Dispose(result); - return(NULL); - } - rest = BitVector_Create(bits,false); - if (rest == NULL) - { - BitVector_Dispose(result); - BitVector_Destroy(quot); - return(NULL); - } - temp = BitVector_Create(bits,false); - if (temp == NULL) - { - BitVector_Dispose(result); - BitVector_Destroy(quot); - BitVector_Destroy(rest); - return(NULL); - } - base = BitVector_Create(bits,true); - if (base == NULL) - { - BitVector_Dispose(result); - BitVector_Destroy(quot); - BitVector_Destroy(rest); - BitVector_Destroy(temp); - return(NULL); - } - if (sign < 0) BitVector_Negate(quot,addr); - else BitVector_Copy(quot,addr); - digits = 0; - *base = EXP10; - loop = (bits >= BITS); - do - { - if (loop) - { - BitVector_Copy(temp,quot); - if (BitVector_Div_Pos(quot,temp,base,rest)) - { - BitVector_Dispose(result); /* emergency exit */ - BitVector_Destroy(quot); - BitVector_Destroy(rest); /* should never occur */ - BitVector_Destroy(temp); /* under normal operation */ - BitVector_Destroy(base); - return(NULL); - } - loop = ! BitVector_is_empty(quot); - q = *rest; - } - else q = *quot; - count = LOG10; - while (((loop && (count-- > 0)) || ((! loop) && (q != 0))) && - (digits < length)) - { - if (q != 0) - { - BIT_VECTOR_DIGITIZE(unsigned int,q,r) - } - else r = (unsigned int) '0'; - *string++ = (unsigned char) r; - digits++; - } - } - while (loop && (digits < length)); - BitVector_Destroy(quot); - BitVector_Destroy(rest); - BitVector_Destroy(temp); - BitVector_Destroy(base); - } - if ((sign < 0) && (digits < length)) - { - *string++ = (unsigned char) '-'; - digits++; - } - *string = (unsigned char) '\0'; - BIT_VECTOR_reverse(result,digits); - return(result); - } - - ErrCode BitVector_from_Dec(unsigned int * addr, unsigned char * string) - { - ErrCode error = ErrCode_Ok; - unsigned int bits = bits_(addr); - unsigned int mask = mask_(addr); - boolean init = (bits > BITS); - boolean minus; - boolean shift; - boolean carry; - unsigned int * term; - unsigned int * base; - unsigned int * prod; - unsigned int * rank; - unsigned int * temp; - unsigned int accu; - unsigned int powr; - unsigned int count; - unsigned int length; - int digit; - - if (bits > 0) - { - length = strlen((char *) string); - if (length == 0) return(ErrCode_Pars); - digit = (int) *string; - if ((minus = (digit == (int) '-')) || - (digit == (int) '+')) - { - string++; - if (--length == 0) return(ErrCode_Pars); - } - string += length; - term = BitVector_Create(BITS,false); - if (term == NULL) - { - return(ErrCode_Null); - } - base = BitVector_Create(BITS,false); - if (base == NULL) - { - BitVector_Destroy(term); - return(ErrCode_Null); - } - prod = BitVector_Create(bits,init); - if (prod == NULL) - { - BitVector_Destroy(term); - BitVector_Destroy(base); - return(ErrCode_Null); - } - rank = BitVector_Create(bits,init); - if (rank == NULL) - { - BitVector_Destroy(term); - BitVector_Destroy(base); - BitVector_Destroy(prod); - return(ErrCode_Null); - } - temp = BitVector_Create(bits,false); - if (temp == NULL) - { - BitVector_Destroy(term); - BitVector_Destroy(base); - BitVector_Destroy(prod); - BitVector_Destroy(rank); - return(ErrCode_Null); - } - BitVector_Empty(addr); - *base = EXP10; - shift = false; - while ((! error) && (length > 0)) - { - accu = 0; - powr = 1; - count = LOG10; - while ((! error) && (length > 0) && (count-- > 0)) - { - digit = (int) *(--string); length--; - /* separate because isdigit() is likely a macro! */ - if (isdigit(digit) != 0) - { - accu += ((unsigned int) digit - (unsigned int) '0') * powr; - powr *= 10; - } - else error = ErrCode_Pars; - } - if (! error) - { - if (shift) - { - *term = accu; - BitVector_Copy(temp,rank); - error = BitVector_Mul_Pos(prod,temp,term,false); - } - else - { - *prod = accu; - if ((! init) && ((accu & ~ mask) != 0)) error = ErrCode_Ovfl; - } - if (! error) - { - carry = false; - BitVector_compute(addr,addr,prod,false,&carry); - /* ignores sign change (= overflow) but ! */ - /* numbers too large (= carry) for resulting bit vector */ - if (carry) error = ErrCode_Ovfl; - else - { - if (length > 0) - { - if (shift) - { - BitVector_Copy(temp,rank); - error = BitVector_Mul_Pos(rank,temp,base,false); - } - else - { - *rank = *base; - shift = true; - } - } - } - } - } - } - BitVector_Destroy(term); - BitVector_Destroy(base); - BitVector_Destroy(prod); - BitVector_Destroy(rank); - BitVector_Destroy(temp); - if (! error && minus) - { - BitVector_Negate(addr,addr); - if ((*(addr + size_(addr) - 1) & mask & ~ (mask >> 1)) == 0) - error = ErrCode_Ovfl; - } - } - return(error); - } - - unsigned char * BitVector_to_Enum(unsigned int * addr) - { - unsigned int bits = bits_(addr); - unsigned int sample; - unsigned int length; - unsigned int digits; - unsigned int factor; - unsigned int power; - unsigned int start; - unsigned int min; - unsigned int max; - unsigned char * string; - unsigned char * target; - boolean comma; - - if (bits > 0) - { - sample = bits - 1; /* greatest possible index */ - length = 2; /* account for index 0 && terminating '\0' */ - digits = 1; /* account for intervening dashes && commas */ - factor = 1; - power = 10; - while (sample >= (power-1)) - { - length += ++digits * factor * 6; /* 9,90,900,9000,... (9*2/3 = 6) */ - factor = power; - power *= 10; - } - if (sample > --factor) - { - sample -= factor; - factor = (unsigned int) ( sample / 3 ); - factor = (factor << 1) + (sample - (factor * 3)); - length += ++digits * factor; - } - } - else length = 1; - string = (unsigned char *) malloc((size_t) length); - if (string == NULL) return(NULL); - start = 0; - comma = false; - target = string; - while ((start < bits) && BitVector_interval_scan_inc(addr,start,&min,&max)) - { - start = max + 2; - if (comma) *target++ = (unsigned char) ','; - if (min == max) - { - target += BIT_VECTOR_int2str(target,min); - } - else - { - if (min+1 == max) - { - target += BIT_VECTOR_int2str(target,min); - *target++ = (unsigned char) ','; - target += BIT_VECTOR_int2str(target,max); - } - else - { - target += BIT_VECTOR_int2str(target,min); - *target++ = (unsigned char) '-'; - target += BIT_VECTOR_int2str(target,max); - } - } - comma = true; - } - *target = (unsigned char) '\0'; - return(string); - } - - ErrCode BitVector_from_Enum(unsigned int * addr, unsigned char * string) - { - ErrCode error = ErrCode_Ok; - unsigned int bits = bits_(addr); - unsigned int state = 1; - unsigned int token; - unsigned int index = 0; - unsigned int start = 0; /* silence compiler warning */ - - if (bits > 0) - { - BitVector_Empty(addr); - while ((! error) && (state != 0)) - { - token = (unsigned int) *string; - /* separate because isdigit() is likely a macro! */ - if (isdigit((int)token) != 0) - { - string += BIT_VECTOR_str2int(string,&index); - if (index < bits) token = (unsigned int) '0'; - else error = ErrCode_Indx; - } - else string++; - if (! error) - switch (state) - { - case 1: - switch (token) - { - case (unsigned int) '0': - state = 2; - break; - case (unsigned int) '\0': - state = 0; - break; - default: - error = ErrCode_Pars; - break; - } - break; - case 2: - switch (token) - { - case (unsigned int) '-': - start = index; - state = 3; - break; - case (unsigned int) ',': - BIT_VECTOR_SET_BIT(addr,index) - state = 5; - break; - case (unsigned int) '\0': - BIT_VECTOR_SET_BIT(addr,index) - state = 0; - break; - default: - error = ErrCode_Pars; - break; - } - break; - case 3: - switch (token) - { - case (unsigned int) '0': - if (start < index) - BitVector_Interval_Fill(addr,start,index); - else if (start == index) - BIT_VECTOR_SET_BIT(addr,index) - else error = ErrCode_Ordr; - state = 4; - break; - default: - error = ErrCode_Pars; - break; - } - break; - case 4: - switch (token) - { - case (unsigned int) ',': - state = 5; - break; - case (unsigned int) '\0': - state = 0; - break; - default: - error = ErrCode_Pars; - break; - } - break; - case 5: - switch (token) - { - case (unsigned int) '0': - state = 2; - break; - default: - error = ErrCode_Pars; - break; - } - break; - } - } - } - return(error); - } - - void BitVector_Bit_Off(unsigned int * addr, unsigned int index) /* X = X \ {x} */ - { - if (index < bits_(addr)) BIT_VECTOR_CLR_BIT(addr,index) - } - - void BitVector_Bit_On(unsigned int * addr, unsigned int index) /* X = X + {x} */ - { - if (index < bits_(addr)) BIT_VECTOR_SET_BIT(addr,index) - } - - boolean BitVector_bit_flip(unsigned int * addr, unsigned int index) /* X=(X+{x})\(X*{x}) */ - { - unsigned int mask; - - if (index < bits_(addr)) return( BIT_VECTOR_FLP_BIT(addr,index,mask) ); - else return( false ); - } - - boolean BitVector_bit_test(unsigned int * addr, unsigned int index) /* {x} in X ? */ - { - if (index < bits_(addr)) return( BIT_VECTOR_TST_BIT(addr,index) ); - else return( false ); - } - - void BitVector_Bit_Copy(unsigned int * addr, unsigned int index, boolean bit) - { - if (index < bits_(addr)) - { - if (bit) BIT_VECTOR_SET_BIT(addr,index) - else BIT_VECTOR_CLR_BIT(addr,index) - } - } - - void BitVector_LSB(unsigned int * addr, boolean bit) - { - if (bits_(addr) > 0) - { - if (bit) *addr |= LSB; - else *addr &= ~ LSB; - } - } - - void BitVector_MSB(unsigned int * addr, boolean bit) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - - if (size-- > 0) - { - if (bit) *(addr+size) |= mask & ~ (mask >> 1); - else *(addr+size) &= ~ mask | (mask >> 1); - } - } - - boolean BitVector_lsb_(unsigned int * addr) - { - if (size_(addr) > 0) return( (*addr & LSB) != 0 ); - else return( false ); - } - - boolean BitVector_msb_(unsigned int * addr) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - - if (size-- > 0) - return( (*(addr+size) & (mask & ~ (mask >> 1))) != 0 ); - else - return( false ); - } - - boolean BitVector_rotate_left(unsigned int * addr) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int msb; - boolean carry_in; - boolean carry_out = false; - - if (size > 0) - { - msb = mask & ~ (mask >> 1); - carry_in = ((*(addr+size-1) & msb) != 0); - while (size-- > 1) - { - carry_out = ((*addr & MSB) != 0); - *addr <<= 1; - if (carry_in) *addr |= LSB; - carry_in = carry_out; - addr++; - } - carry_out = ((*addr & msb) != 0); - *addr <<= 1; - if (carry_in) *addr |= LSB; - *addr &= mask; - } - return(carry_out); - } - - boolean BitVector_rotate_right(unsigned int * addr) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int msb; - boolean carry_in; - boolean carry_out = false; - - if (size > 0) - { - msb = mask & ~ (mask >> 1); - carry_in = ((*addr & LSB) != 0); - addr += size-1; - *addr &= mask; - carry_out = ((*addr & LSB) != 0); - *addr >>= 1; - if (carry_in) *addr |= msb; - carry_in = carry_out; - addr--; - size--; - while (size-- > 0) - { - carry_out = ((*addr & LSB) != 0); - *addr >>= 1; - if (carry_in) *addr |= MSB; - carry_in = carry_out; - addr--; - } - } - return(carry_out); - } - - boolean BitVector_shift_left(unsigned int * addr, boolean carry_in) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int msb; - boolean carry_out = carry_in; - - if (size > 0) - { - msb = mask & ~ (mask >> 1); - while (size-- > 1) - { - carry_out = ((*addr & MSB) != 0); - *addr <<= 1; - if (carry_in) *addr |= LSB; - carry_in = carry_out; - addr++; - } - carry_out = ((*addr & msb) != 0); - *addr <<= 1; - if (carry_in) *addr |= LSB; - *addr &= mask; - } - return(carry_out); - } - - boolean BitVector_shift_right(unsigned int * addr, boolean carry_in) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int msb; - boolean carry_out = carry_in; - - if (size > 0) - { - msb = mask & ~ (mask >> 1); - addr += size-1; - *addr &= mask; - carry_out = ((*addr & LSB) != 0); - *addr >>= 1; - if (carry_in) *addr |= msb; - carry_in = carry_out; - addr--; - size--; - while (size-- > 0) - { - carry_out = ((*addr & LSB) != 0); - *addr >>= 1; - if (carry_in) *addr |= MSB; - carry_in = carry_out; - addr--; - } - } - return(carry_out); - } - - void BitVector_Move_Left(unsigned int * addr, unsigned int bits) - { - unsigned int count; - unsigned int words; - - if (bits > 0) - { - count = bits & MODMASK; - words = bits >> LOGBITS; - if (bits >= bits_(addr)) BitVector_Empty(addr); - else - { - while (count-- > 0) BitVector_shift_left(addr,0); - BitVector_Word_Insert(addr,0,words,true); - } - } - } - - void BitVector_Move_Right(unsigned int * addr, unsigned int bits) - { - unsigned int count; - unsigned int words; - - if (bits > 0) - { - count = bits & MODMASK; - words = bits >> LOGBITS; - if (bits >= bits_(addr)) BitVector_Empty(addr); - else - { - while (count-- > 0) BitVector_shift_right(addr,0); - BitVector_Word_Delete(addr,0,words,true); - } - } - } - - void BitVector_Insert(unsigned int * addr, unsigned int offset, unsigned int count, boolean clear) - { - unsigned int bits = bits_(addr); - unsigned int last; - - if ((count > 0) && (offset < bits)) - { - last = offset + count; - if (last < bits) - { - BitVector_Interval_Copy(addr,addr,last,offset,(bits-last)); - } - else last = bits; - if (clear) BitVector_Interval_Empty(addr,offset,(last-1)); - } - } - - void BitVector_Delete(unsigned int * addr, unsigned int offset, unsigned int count, boolean clear) - { - unsigned int bits = bits_(addr); - unsigned int last; - - if ((count > 0) && (offset < bits)) - { - last = offset + count; - if (last < bits) - { - BitVector_Interval_Copy(addr,addr,offset,last,(bits-last)); - } - else count = bits - offset; - if (clear) BitVector_Interval_Empty(addr,(bits-count),(bits-1)); - } - } - - boolean BitVector_increment(unsigned int * addr) /* X++ */ - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int * last = addr + size - 1; - boolean carry = true; - - if (size > 0) - { - *last |= ~ mask; - while (carry && (size-- > 0)) - { - carry = (++(*addr++) == 0); - } - *last &= mask; - } - return(carry); - } - - boolean BitVector_decrement(unsigned int * addr) /* X-- */ - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int * last = addr + size - 1; - boolean carry = true; - - if (size > 0) - { - *last &= mask; - while (carry && (size-- > 0)) - { - carry = (*addr == 0); - --(*addr++); - } - *last &= mask; - } - return(carry); - } - - boolean BitVector_compute(unsigned int * X, unsigned int * Y, unsigned int * Z, boolean minus, boolean *carry) - { - unsigned int size = size_(X); - unsigned int mask = mask_(X); - unsigned int vv = 0; - unsigned int cc; - unsigned int mm; - unsigned int yy; - unsigned int zz; - unsigned int lo; - unsigned int hi; - - if (size > 0) - { - if (minus) cc = (*carry == 0); - else cc = (*carry != 0); - /* deal with (size-1) least significant full words first: */ - while (--size > 0) - { - yy = *Y++; - if (minus) zz = (unsigned int) ~ ( Z ? *Z++ : 0 ); - else zz = (unsigned int) ( Z ? *Z++ : 0 ); - lo = (yy & LSB) + (zz & LSB) + cc; - hi = (yy >> 1) + (zz >> 1) + (lo >> 1); - cc = ((hi & MSB) != 0); - *X++ = (hi << 1) | (lo & LSB); - } - /* deal with most significant word (may be used only partially): */ - yy = *Y & mask; - if (minus) zz = (unsigned int) ~ ( Z ? *Z : 0 ); - else zz = (unsigned int) ( Z ? *Z : 0 ); - zz &= mask; - if (mask == LSB) /* special case, only one bit used */ - { - vv = cc; - lo = yy + zz + cc; - cc = (lo >> 1); - vv ^= cc; - *X = lo & LSB; - } - else - { - if (~ mask) /* not all bits are used, but more than one */ - { - mm = (mask >> 1); - vv = (yy & mm) + (zz & mm) + cc; - mm = mask & ~ mm; - lo = yy + zz + cc; - cc = (lo >> 1); - vv ^= cc; - vv &= mm; - cc &= mm; - *X = lo & mask; - } - else /* other special case, all bits are used */ - { - mm = ~ MSB; - lo = (yy & mm) + (zz & mm) + cc; - vv = lo & MSB; - hi = ((yy & MSB) >> 1) + ((zz & MSB) >> 1) + (vv >> 1); - cc = hi & MSB; - vv ^= cc; - *X = (hi << 1) | (lo & mm); - } - } - if (minus) *carry = (cc == 0); - else *carry = (cc != 0); - } - return(vv != 0); - } - - boolean BitVector_add(unsigned int * X, unsigned int * Y, unsigned int * Z, boolean *carry) - { - return(BitVector_compute(X,Y,Z,false,carry)); - } - - boolean BitVector_sub(unsigned int * X, unsigned int * Y, unsigned int * Z, boolean *carry) - { - return(BitVector_compute(X,Y,Z,true,carry)); - } - - boolean BitVector_inc(unsigned int * X, unsigned int * Y) - { - boolean carry = true; - - return(BitVector_compute(X,Y,NULL,false,&carry)); - } - - boolean BitVector_dec(unsigned int * X, unsigned int * Y) - { - boolean carry = true; - - return(BitVector_compute(X,Y,NULL,true,&carry)); - } - - void BitVector_Negate(unsigned int * X, unsigned int * Y) - { - unsigned int size = size_(X); - unsigned int mask = mask_(X); - boolean carry = true; - - if (size > 0) - { - while (size-- > 0) - { - *X = ~ *Y++; - if (carry) - { - carry = (++(*X) == 0); - } - X++; - } - *(--X) &= mask; - } - } - - void BitVector_Absolute(unsigned int * X, unsigned int * Y) - { - unsigned int size = size_(Y); - unsigned int mask = mask_(Y); - - if (size > 0) - { - if (*(Y+size-1) & (mask & ~ (mask >> 1))) BitVector_Negate(X,Y); - else BitVector_Copy(X,Y); - } - } - - // FIXME: What the hell does the return value of this mean? - // It returns 0, 1, or -1 under mysterious circumstances. - signed int BitVector_Sign(unsigned int * addr) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int * last = addr + size - 1; - boolean r = true; - - if (size > 0) - { - *last &= mask; - while (r && (size-- > 0)) r = ( *addr++ == 0 ); - } - if (r) return((signed int) 0); - else - { - if (*last & (mask & ~ (mask >> 1))) return((signed int) -1); - else return((signed int) 1); - } - } - - ErrCode BitVector_Mul_Pos(unsigned int * X, unsigned int * Y, unsigned int * Z, boolean strict) - { - unsigned int mask; - unsigned int limit; - unsigned int count; - signed long last; - unsigned int * sign; - boolean carry; - boolean overflow; - boolean ok = true; - - /* - Requirements: - - X, Y && Z must be distinct - - X && Y must have equal sizes (whereas Z may be any size!) - - Z should always contain the SMALLER of the two factors Y && Z - Constraints: - - The contents of Y (&& of X, of course) are destroyed - (only Z is preserved!) - */ - - if ((X == Y) || (X == Z) || (Y == Z)) return(ErrCode_Same); - if (bits_(X) != bits_(Y)) return(ErrCode_Size); - BitVector_Empty(X); - if (BitVector_is_empty(Y)) return(ErrCode_Ok); /* exit also taken if bits_(Y)==0 */ - if ((last = Set_Max(Z)) < 0L) return(ErrCode_Ok); - limit = (unsigned int) last; - sign = Y + size_(Y) - 1; - mask = mask_(Y); - *sign &= mask; - mask &= ~ (mask >> 1); - for ( count = 0; (ok && (count <= limit)); count++ ) - { - if ( BIT_VECTOR_TST_BIT(Z,count) ) - { - carry = false; - overflow = BitVector_compute(X,X,Y,false,&carry); - if (strict) ok = ! (carry || overflow); - else ok = ! carry; - } - if (ok && (count < limit)) - { - carry = BitVector_shift_left(Y,0); - if (strict) - { - overflow = ((*sign & mask) != 0); - ok = ! (carry || overflow); - } - else ok = ! carry; - } - } - if (ok) return(ErrCode_Ok); else return(ErrCode_Ovfl); - } - - ErrCode BitVector_Multiply(unsigned int * X, unsigned int * Y, unsigned int * Z) - { - ErrCode error = ErrCode_Ok; - unsigned int bit_x = bits_(X); - unsigned int bit_y = bits_(Y); - unsigned int bit_z = bits_(Z); - unsigned int size; - unsigned int mask; - unsigned int msb; - unsigned int * ptr_y; - unsigned int * ptr_z; - boolean sgn_x; - boolean sgn_y; - boolean sgn_z; - boolean zero; - unsigned int * A; - unsigned int * B; - - /* - Requirements: - - Y && Z must have equal sizes - - X must have at least the same size as Y && Z but may be larger (!) - Features: - - The contents of Y && Z are preserved - - X may be identical with Y or Z (or both!) - (in-place multiplication is possible!) - */ - - if ((bit_y != bit_z) || (bit_x < bit_y)) return(ErrCode_Size); - if (BitVector_is_empty(Y) || BitVector_is_empty(Z)) - { - BitVector_Empty(X); - } - else - { - A = BitVector_Create(bit_y,false); - if (A == NULL) return(ErrCode_Null); - B = BitVector_Create(bit_z,false); - if (B == NULL) { BitVector_Destroy(A); return(ErrCode_Null); } - size = size_(Y); - mask = mask_(Y); - msb = (mask & ~ (mask >> 1)); - sgn_y = (((*(Y+size-1) &= mask) & msb) != 0); - sgn_z = (((*(Z+size-1) &= mask) & msb) != 0); - sgn_x = sgn_y ^ sgn_z; - if (sgn_y) BitVector_Negate(A,Y); else BitVector_Copy(A,Y); - if (sgn_z) BitVector_Negate(B,Z); else BitVector_Copy(B,Z); - ptr_y = A + size; - ptr_z = B + size; - zero = true; - while (zero && (size-- > 0)) - { - zero &= (*(--ptr_y) == 0); - zero &= (*(--ptr_z) == 0); - } - if (*ptr_y > *ptr_z) - { - if (bit_x > bit_y) - { - A = BitVector_Resize(A,bit_x); - if (A == NULL) { BitVector_Destroy(B); return(ErrCode_Null); } - } - error = BitVector_Mul_Pos(X,A,B,true); - } - else - { - if (bit_x > bit_z) - { - B = BitVector_Resize(B,bit_x); - if (B == NULL) { BitVector_Destroy(A); return(ErrCode_Null); } - } - error = BitVector_Mul_Pos(X,B,A,true); - } - if ((! error) && sgn_x) BitVector_Negate(X,X); - BitVector_Destroy(A); - BitVector_Destroy(B); - } - return(error); - } - - ErrCode BitVector_Div_Pos(unsigned int * Q, unsigned int * X, unsigned int * Y, unsigned int * R) - { - unsigned int bits = bits_(Q); - unsigned int mask; - unsigned int * addr; - signed long last; - boolean flag; - boolean copy = false; /* flags whether valid rest is in R (0) || X (1) */ - - /* - Requirements: - - All bit vectors must have equal sizes - - Q, X, Y && R must all be distinct bit vectors - - Y must be non-zero (of course!) - Constraints: - - The contents of X (&& Q && R, of course) are destroyed - (only Y is preserved!) - */ - - if ((bits != bits_(X)) || (bits != bits_(Y)) || (bits != bits_(R))) - return(ErrCode_Size); - if ((Q == X) || (Q == Y) || (Q == R) || (X == Y) || (X == R) || (Y == R)) - return(ErrCode_Same); - if (BitVector_is_empty(Y)) - return(ErrCode_Zero); - - BitVector_Empty(R); - BitVector_Copy(Q,X); - if ((last = Set_Max(Q)) < 0L) return(ErrCode_Ok); - bits = (unsigned int) ++last; - while (bits-- > 0) - { - addr = Q + (bits >> LOGBITS); - mask = BITMASKTAB[bits & MODMASK]; - flag = ((*addr & mask) != 0); - if (copy) - { - BitVector_shift_left(X,flag); - flag = false; - BitVector_compute(R,X,Y,true,&flag); - } - else - { - BitVector_shift_left(R,flag); - flag = false; - BitVector_compute(X,R,Y,true,&flag); - } - if (flag) *addr &= ~ mask; - else - { - *addr |= mask; - copy = ! copy; - } - } - if (copy) BitVector_Copy(R,X); - return(ErrCode_Ok); - } - - ErrCode BitVector_Divide(unsigned int * Q, unsigned int * X, unsigned int * Y, unsigned int * R) - { - ErrCode error = ErrCode_Ok; - unsigned int bits = bits_(Q); - unsigned int size = size_(Q); - unsigned int mask = mask_(Q); - unsigned int msb = (mask & ~ (mask >> 1)); - boolean sgn_q; - boolean sgn_x; - boolean sgn_y; - unsigned int * A; - unsigned int * B; - - /* - Requirements: - - All bit vectors must have equal sizes - - Q && R must be two distinct bit vectors - - Y must be non-zero (of course!) - Features: - - The contents of X && Y are preserved - - Q may be identical with X || Y (or both) - (in-place division is possible!) - - R may be identical with X || Y (or both) - (but not identical with Q!) - */ - - if ((bits != bits_(X)) || (bits != bits_(Y)) || (bits != bits_(R))) - return(ErrCode_Size); - if (Q == R) - return(ErrCode_Same); - if (BitVector_is_empty(Y)) - return(ErrCode_Zero); - - if (BitVector_is_empty(X)) - { - BitVector_Empty(Q); - BitVector_Empty(R); - } - else - { - A = BitVector_Create(bits,false); - if (A == NULL) return(ErrCode_Null); - B = BitVector_Create(bits,false); - if (B == NULL) { BitVector_Destroy(A); return(ErrCode_Null); } - size--; - sgn_x = (((*(X+size) &= mask) & msb) != 0); - sgn_y = (((*(Y+size) &= mask) & msb) != 0); - sgn_q = sgn_x ^ sgn_y; - if (sgn_x) BitVector_Negate(A,X); else BitVector_Copy(A,X); - if (sgn_y) BitVector_Negate(B,Y); else BitVector_Copy(B,Y); - if (! (error = BitVector_Div_Pos(Q,A,B,R))) - { - if (sgn_q) BitVector_Negate(Q,Q); - if (sgn_x) BitVector_Negate(R,R); - } - BitVector_Destroy(A); - BitVector_Destroy(B); - } - return(error); - } - - ErrCode BitVector_GCD(unsigned int * X, unsigned int * Y, unsigned int * Z) - { - ErrCode error = ErrCode_Ok; - unsigned int bits = bits_(X); - unsigned int size = size_(X); - unsigned int mask = mask_(X); - unsigned int msb = (mask & ~ (mask >> 1)); - boolean sgn_a; - boolean sgn_b; - boolean sgn_r; - unsigned int * Q; - unsigned int * R; - unsigned int * A; - unsigned int * B; - unsigned int * T; - - /* - Requirements: - - All bit vectors must have equal sizes - Features: - - The contents of Y && Z are preserved - - X may be identical with Y || Z (or both) - (in-place is possible!) - - GCD(0,z) == GCD(z,0) == z - - negative values are h&&led correctly - */ - - if ((bits != bits_(Y)) || (bits != bits_(Z))) return(ErrCode_Size); - if (BitVector_is_empty(Y)) - { - if (X != Z) BitVector_Copy(X,Z); - return(ErrCode_Ok); - } - if (BitVector_is_empty(Z)) - { - if (X != Y) BitVector_Copy(X,Y); - return(ErrCode_Ok); - } - Q = BitVector_Create(bits,false); - if (Q == NULL) - { - return(ErrCode_Null); - } - R = BitVector_Create(bits,false); - if (R == NULL) - { - BitVector_Destroy(Q); - return(ErrCode_Null); - } - A = BitVector_Create(bits,false); - if (A == NULL) - { - BitVector_Destroy(Q); - BitVector_Destroy(R); - return(ErrCode_Null); - } - B = BitVector_Create(bits,false); - if (B == NULL) - { - BitVector_Destroy(Q); - BitVector_Destroy(R); - BitVector_Destroy(A); - return(ErrCode_Null); - } - size--; - sgn_a = (((*(Y+size) &= mask) & msb) != 0); - sgn_b = (((*(Z+size) &= mask) & msb) != 0); - if (sgn_a) BitVector_Negate(A,Y); else BitVector_Copy(A,Y); - if (sgn_b) BitVector_Negate(B,Z); else BitVector_Copy(B,Z); - while (! error) - { - if (! (error = BitVector_Div_Pos(Q,A,B,R))) - { - if (BitVector_is_empty(R)) break; - T = A; sgn_r = sgn_a; - A = B; sgn_a = sgn_b; - B = R; sgn_b = sgn_r; - R = T; - } - } - if (! error) - { - if (sgn_b) BitVector_Negate(X,B); else BitVector_Copy(X,B); - } - BitVector_Destroy(Q); - BitVector_Destroy(R); - BitVector_Destroy(A); - BitVector_Destroy(B); - return(error); - } - - ErrCode BitVector_GCD2(unsigned int * U, unsigned int * V, unsigned int * W, unsigned int * X, unsigned int * Y) - { - ErrCode error = ErrCode_Ok; - unsigned int bits = bits_(U); - unsigned int size = size_(U); - unsigned int mask = mask_(U); - unsigned int msb = (mask & ~ (mask >> 1)); - boolean minus; - boolean carry; - boolean sgn_q; - boolean sgn_r; - boolean sgn_a; - boolean sgn_b; - boolean sgn_x; - boolean sgn_y; - unsigned int * * L; - unsigned int * Q; - unsigned int * R; - unsigned int * A; - unsigned int * B; - unsigned int * T; - unsigned int * X1; - unsigned int * X2; - unsigned int * X3; - unsigned int * Y1; - unsigned int * Y2; - unsigned int * Y3; - unsigned int * Z; - - /* - Requirements: - - All bit vectors must have equal sizes - - U, V, && W must all be distinct bit vectors - Features: - - The contents of X && Y are preserved - - U, V && W may be identical with X || Y (or both, - provided that U, V && W are mutually distinct) - (i.e., in-place is possible!) - - GCD(0,z) == GCD(z,0) == z - - negative values are h&&led correctly - */ - - if ((bits != bits_(V)) || - (bits != bits_(W)) || - (bits != bits_(X)) || - (bits != bits_(Y))) - { - return(ErrCode_Size); - } - if ((U == V) || (U == W) || (V == W)) - { - return(ErrCode_Same); - } - if (BitVector_is_empty(X)) - { - if (U != Y) BitVector_Copy(U,Y); - BitVector_Empty(V); - BitVector_Empty(W); - *W = 1; - return(ErrCode_Ok); - } - if (BitVector_is_empty(Y)) - { - if (U != X) BitVector_Copy(U,X); - BitVector_Empty(V); - BitVector_Empty(W); - *V = 1; - return(ErrCode_Ok); - } - if ((L = BitVector_Create_List(bits,false,11)) == NULL) - { - return(ErrCode_Null); - } - Q = L[0]; - R = L[1]; - A = L[2]; - B = L[3]; - X1 = L[4]; - X2 = L[5]; - X3 = L[6]; - Y1 = L[7]; - Y2 = L[8]; - Y3 = L[9]; - Z = L[10]; - size--; - sgn_a = (((*(X+size) &= mask) & msb) != 0); - sgn_b = (((*(Y+size) &= mask) & msb) != 0); - if (sgn_a) BitVector_Negate(A,X); else BitVector_Copy(A,X); - if (sgn_b) BitVector_Negate(B,Y); else BitVector_Copy(B,Y); - BitVector_Empty(X1); - BitVector_Empty(X2); - *X1 = 1; - BitVector_Empty(Y1); - BitVector_Empty(Y2); - *Y2 = 1; - sgn_x = false; - sgn_y = false; - while (! error) - { - if ((error = BitVector_Div_Pos(Q,A,B,R))) - { - break; - } - if (BitVector_is_empty(R)) - { - break; - } - sgn_q = sgn_a ^ sgn_b; - - if (sgn_x) BitVector_Negate(Z,X2); else BitVector_Copy(Z,X2); - if ((error = BitVector_Mul_Pos(X3,Z,Q,true))) - { - break; - } - minus = ! (sgn_x ^ sgn_q); - carry = 0; - if (BitVector_compute(X3,X1,X3,minus,&carry)) - { - error = ErrCode_Ovfl; - break; - } - sgn_x = (((*(X3+size) &= mask) & msb) != 0); - - if (sgn_y) BitVector_Negate(Z,Y2); else BitVector_Copy(Z,Y2); - if ((error = BitVector_Mul_Pos(Y3,Z,Q,true))) - { - break; - } - minus = ! (sgn_y ^ sgn_q); - carry = 0; - if (BitVector_compute(Y3,Y1,Y3,minus,&carry)) - { - error = ErrCode_Ovfl; - break; - } - sgn_y = (((*(Y3+size) &= mask) & msb) != 0); - - T = A; sgn_r = sgn_a; - A = B; sgn_a = sgn_b; - B = R; sgn_b = sgn_r; - R = T; - - T = X1; - X1 = X2; - X2 = X3; - X3 = T; - - T = Y1; - Y1 = Y2; - Y2 = Y3; - Y3 = T; - } - if (! error) - { - if (sgn_b) BitVector_Negate(U,B); else BitVector_Copy(U,B); - BitVector_Copy(V,X2); - BitVector_Copy(W,Y2); - } - BitVector_Destroy_List(L,11); - return(error); - } - - ErrCode BitVector_Power(unsigned int * X, unsigned int * Y, unsigned int * Z) - { - ErrCode error = ErrCode_Ok; - unsigned int bits = bits_(X); - boolean first = true; - signed long last; - unsigned int limit; - unsigned int count; - unsigned int * T; - - /* - Requirements: - - X must have at least the same size as Y but may be larger (!) - - X may not be identical with Z - - Z must be positive - Features: - - The contents of Y && Z are preserved - */ - - if (X == Z) return(ErrCode_Same); - if (bits < bits_(Y)) return(ErrCode_Size); - if (BitVector_msb_(Z)) return(ErrCode_Expo); - if ((last = Set_Max(Z)) < 0L) - { - if (bits < 2) return(ErrCode_Ovfl); - BitVector_Empty(X); - *X |= LSB; - return(ErrCode_Ok); /* anything ^ 0 == 1 */ - } - if (BitVector_is_empty(Y)) - { - if (X != Y) BitVector_Empty(X); - return(ErrCode_Ok); /* 0 ^ anything ! zero == 0 */ - } - T = BitVector_Create(bits,false); - if (T == NULL) return(ErrCode_Null); - limit = (unsigned int) last; - for ( count = 0; ((!error) && (count <= limit)); count++ ) - { - if ( BIT_VECTOR_TST_BIT(Z,count) ) - { - if (first) - { - first = false; - if (count) { BitVector_Copy(X,T); } - else { if (X != Y) BitVector_Copy(X,Y); } - } - else error = BitVector_Multiply(X,T,X); /* order important because T > X */ - } - if ((!error) && (count < limit)) - { - if (count) error = BitVector_Multiply(T,T,T); - else error = BitVector_Multiply(T,Y,Y); - } - } - BitVector_Destroy(T); - return(error); - } - - void BitVector_Block_Store(unsigned int * addr, unsigned char * buffer, unsigned int length) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int value; - unsigned int count; - - /* provide translation for independence of endian-ness: */ - if (size > 0) - { - while (size-- > 0) - { - value = 0; - for ( count = 0; (length > 0) && (count < BITS); count += 8 ) - { - value |= (((unsigned int) *buffer++) << count); length--; - } - *addr++ = value; - } - *(--addr) &= mask; - } - } - - unsigned char * BitVector_Block_Read(unsigned int * addr, unsigned int * length) - { - unsigned int size = size_(addr); - unsigned int value; - unsigned int count; - unsigned char * buffer; - unsigned char * target; - - /* provide translation for independence of endian-ness: */ - *length = size << FACTOR; - buffer = (unsigned char *) malloc((size_t) ((*length)+1)); - if (buffer == NULL) return(NULL); - target = buffer; - if (size > 0) - { - *(addr+size-1) &= mask_(addr); - while (size-- > 0) - { - value = *addr++; - count = BITS >> 3; - while (count-- > 0) - { - *target++ = (unsigned char) (value & 0x00FF); - if (count > 0) value >>= 8; - } - } - } - *target = (unsigned char) '\0'; - return(buffer); - } - - void BitVector_Word_Store(unsigned int * addr, unsigned int offset, unsigned int value) - { - unsigned int size = size_(addr); - - if (size > 0) - { - if (offset < size) *(addr+offset) = value; - *(addr+size-1) &= mask_(addr); - } - } - - unsigned int BitVector_Word_Read(unsigned int * addr, unsigned int offset) - { - unsigned int size = size_(addr); - - if (size > 0) - { - *(addr+size-1) &= mask_(addr); - if (offset < size) return( *(addr+offset) ); - } - return( (unsigned int) 0 ); - } - - void BitVector_Word_Insert(unsigned int * addr, unsigned int offset, unsigned int count, - boolean clear) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int * last = addr+size-1; - - if (size > 0) - { - *last &= mask; - if (offset > size) offset = size; - BIT_VECTOR_ins_words(addr+offset,size-offset,count,clear); - *last &= mask; - } - } - - void BitVector_Word_Delete(unsigned int * addr, unsigned int offset, unsigned int count, - boolean clear) - { - unsigned int size = size_(addr); - unsigned int mask = mask_(addr); - unsigned int * last = addr+size-1; - - if (size > 0) - { - *last &= mask; - if (offset > size) offset = size; - BIT_VECTOR_del_words(addr+offset,size-offset,count,clear); - *last &= mask; - } - } - - void BitVector_Chunk_Store(unsigned int * addr, unsigned int chunksize, unsigned int offset, - unsigned long value) - { - unsigned int bits = bits_(addr); - unsigned int mask; - unsigned int temp; - - if ((chunksize > 0) && (offset < bits)) - { - if (chunksize > LONGBITS) chunksize = LONGBITS; - if ((offset + chunksize) > bits) chunksize = bits - offset; - addr += offset >> LOGBITS; - offset &= MODMASK; - while (chunksize > 0) - { - mask = (unsigned int) (~0L << offset); - bits = offset + chunksize; - if (bits < BITS) - { - mask &= (unsigned int) ~(~0L << bits); - bits = chunksize; - } - else bits = BITS - offset; - temp = (unsigned int) (value << offset); - temp &= mask; - *addr &= ~ mask; - *addr++ |= temp; - value >>= bits; - chunksize -= bits; - offset = 0; - } - } - } - - unsigned long BitVector_Chunk_Read(unsigned int * addr, unsigned int chunksize, unsigned int offset) - { - unsigned int bits = bits_(addr); - unsigned int chunkbits = 0; - unsigned long value = 0L; - unsigned long temp; - unsigned int mask; - - if ((chunksize > 0) && (offset < bits)) - { - if (chunksize > LONGBITS) chunksize = LONGBITS; - if ((offset + chunksize) > bits) chunksize = bits - offset; - addr += offset >> LOGBITS; - offset &= MODMASK; - while (chunksize > 0) - { - bits = offset + chunksize; - if (bits < BITS) - { - mask = (unsigned int) ~(~0L << bits); - bits = chunksize; - } - else - { - mask = (unsigned int) ~0L; - bits = BITS - offset; - } - temp = (unsigned long) ((*addr++ & mask) >> offset); - value |= temp << chunkbits; - chunkbits += bits; - chunksize -= bits; - offset = 0; - } - } - return(value); - } - - /*******************/ - /* set operations: */ - /*******************/ - - void Set_Union(unsigned int * X, unsigned int * Y, unsigned int * Z) /* X = Y + Z */ - { - unsigned int bits = bits_(X); - unsigned int size = size_(X); - unsigned int mask = mask_(X); - - if ((size > 0) && (bits == bits_(Y)) && (bits == bits_(Z))) - { - while (size-- > 0) *X++ = *Y++ | *Z++; - *(--X) &= mask; - } - } - - void Set_Intersection(unsigned int * X, unsigned int * Y, unsigned int * Z) /* X = Y * Z */ - { - unsigned int bits = bits_(X); - unsigned int size = size_(X); - unsigned int mask = mask_(X); - - if ((size > 0) && (bits == bits_(Y)) && (bits == bits_(Z))) - { - while (size-- > 0) *X++ = *Y++ & *Z++; - *(--X) &= mask; - } - } - - void Set_Difference(unsigned int * X, unsigned int * Y, unsigned int * Z) /* X = Y \ Z */ - { - unsigned int bits = bits_(X); - unsigned int size = size_(X); - unsigned int mask = mask_(X); - - if ((size > 0) && (bits == bits_(Y)) && (bits == bits_(Z))) - { - while (size-- > 0) *X++ = *Y++ & ~ *Z++; - *(--X) &= mask; - } - } - - void Set_ExclusiveOr(unsigned int * X, unsigned int * Y, unsigned int * Z) /* X=(Y+Z)\(Y*Z) */ - { - unsigned int bits = bits_(X); - unsigned int size = size_(X); - unsigned int mask = mask_(X); - - if ((size > 0) && (bits == bits_(Y)) && (bits == bits_(Z))) - { - while (size-- > 0) *X++ = *Y++ ^ *Z++; - *(--X) &= mask; - } - } - - void Set_Complement(unsigned int * X, unsigned int * Y) /* X = ~Y */ - { - unsigned int size = size_(X); - unsigned int mask = mask_(X); - - if ((size > 0) && (bits_(X) == bits_(Y))) - { - while (size-- > 0) *X++ = ~ *Y++; - *(--X) &= mask; - } - } - - /******************/ - /* set functions: */ - /******************/ - - boolean Set_subset(unsigned int * X, unsigned int * Y) /* X subset Y ? */ - { - unsigned int size = size_(X); - boolean r = false; - - if ((size > 0) && (bits_(X) == bits_(Y))) - { - r = true; - while (r && (size-- > 0)) r = ((*X++ & ~ *Y++) == 0); - } - return(r); - } - - unsigned int Set_Norm(unsigned int * addr) /* = | X | */ - { - unsigned char * byte; - unsigned int bytes; - unsigned int n; - - byte = (unsigned char *) addr; - bytes = size_(addr) << FACTOR; - n = 0; - while (bytes-- > 0) - { - n += BitVector_BYTENORM[*byte++]; - } - return(n); - } - - unsigned int Set_Norm2(unsigned int * addr) /* = | X | */ - { - unsigned int size = size_(addr); - unsigned int w0,w1; - unsigned int n,k; - - n = 0; - while (size-- > 0) - { - k = 0; - w1 = ~ (w0 = *addr++); - while (w0 && w1) - { - w0 &= w0 - 1; - w1 &= w1 - 1; - k++; - } - if (w0 == 0) n += k; - else n += BITS - k; - } - return(n); - } - - unsigned int Set_Norm3(unsigned int * addr) /* = | X | */ - { - unsigned int size = size_(addr); - unsigned int count = 0; - unsigned int c; - - while (size-- > 0) - { - c = *addr++; - while (c) - { - c &= c - 1; - count++; - } - } - return(count); - } - - signed long Set_Min(unsigned int * addr) /* = min(X) */ - { - boolean empty = true; - unsigned int size = size_(addr); - unsigned int i = 0; - unsigned int c = 0; /* silence compiler warning */ - - while (empty && (size-- > 0)) - { - if ((c = *addr++)) empty = false; else i++; - } - if (empty) return((signed long) LONG_MAX); /* plus infinity */ - i <<= LOGBITS; - while (! (c & LSB)) - { - c >>= 1; - i++; - } - return((signed long) i); - } - - signed long Set_Max(unsigned int * addr) /* = max(X) */ - { - boolean empty = true; - unsigned int size = size_(addr); - unsigned int i = size; - unsigned int c = 0; /* silence compiler warning */ - - addr += size-1; - while (empty && (size-- > 0)) - { - if ((c = *addr--)) empty = false; else i--; - } - if (empty) return((signed long) LONG_MIN); /* minus infinity */ - i <<= LOGBITS; - while (! (c & MSB)) - { - c <<= 1; - i--; - } - return((signed long) --i); - } - - /**********************************/ - /* matrix-of-booleans operations: */ - /**********************************/ - - void Matrix_Multiplication(unsigned int * X, unsigned int rowsX, unsigned int colsX, - unsigned int * Y, unsigned int rowsY, unsigned int colsY, - unsigned int * Z, unsigned int rowsZ, unsigned int colsZ) - { - unsigned int i; - unsigned int j; - unsigned int k; - unsigned int indxX; - unsigned int indxY; - unsigned int indxZ; - unsigned int termX; - unsigned int termY; - unsigned int sum; - - if ((colsY == rowsZ) && (rowsX == rowsY) && (colsX == colsZ) && - (bits_(X) == rowsX*colsX) && - (bits_(Y) == rowsY*colsY) && - (bits_(Z) == rowsZ*colsZ)) - { - for ( i = 0; i < rowsY; i++ ) - { - termX = i * colsX; - termY = i * colsY; - for ( j = 0; j < colsZ; j++ ) - { - indxX = termX + j; - sum = 0; - for ( k = 0; k < colsY; k++ ) - { - indxY = termY + k; - indxZ = k * colsZ + j; - if ( BIT_VECTOR_TST_BIT(Y,indxY) & - BIT_VECTOR_TST_BIT(Z,indxZ) ) sum ^= 1; - } - if (sum) BIT_VECTOR_SET_BIT(X,indxX) - else BIT_VECTOR_CLR_BIT(X,indxX) - } - } - } - } - - void Matrix_Product(unsigned int * X, unsigned int rowsX, unsigned int colsX, - unsigned int * Y, unsigned int rowsY, unsigned int colsY, - unsigned int * Z, unsigned int rowsZ, unsigned int colsZ) - { - unsigned int i; - unsigned int j; - unsigned int k; - unsigned int indxX; - unsigned int indxY; - unsigned int indxZ; - unsigned int termX; - unsigned int termY; - unsigned int sum; - - if ((colsY == rowsZ) && (rowsX == rowsY) && (colsX == colsZ) && - (bits_(X) == rowsX*colsX) && - (bits_(Y) == rowsY*colsY) && - (bits_(Z) == rowsZ*colsZ)) - { - for ( i = 0; i < rowsY; i++ ) - { - termX = i * colsX; - termY = i * colsY; - for ( j = 0; j < colsZ; j++ ) - { - indxX = termX + j; - sum = 0; - for ( k = 0; k < colsY; k++ ) - { - indxY = termY + k; - indxZ = k * colsZ + j; - if ( BIT_VECTOR_TST_BIT(Y,indxY) & - BIT_VECTOR_TST_BIT(Z,indxZ) ) sum |= 1; - } - if (sum) BIT_VECTOR_SET_BIT(X,indxX) - else BIT_VECTOR_CLR_BIT(X,indxX) - } - } - } - } - - void Matrix_Closure(unsigned int * addr, unsigned int rows, unsigned int cols) - { - unsigned int i; - unsigned int j; - unsigned int k; - unsigned int ii; - unsigned int ij; - unsigned int ik; - unsigned int kj; - unsigned int termi; - unsigned int termk; - - if ((rows == cols) && (bits_(addr) == rows*cols)) - { - for ( i = 0; i < rows; i++ ) - { - ii = i * cols + i; - BIT_VECTOR_SET_BIT(addr,ii) - } - for ( k = 0; k < rows; k++ ) - { - termk = k * cols; - for ( i = 0; i < rows; i++ ) - { - termi = i * cols; - ik = termi + k; - for ( j = 0; j < rows; j++ ) - { - ij = termi + j; - kj = termk + j; - if ( BIT_VECTOR_TST_BIT(addr,ik) & - BIT_VECTOR_TST_BIT(addr,kj) ) - BIT_VECTOR_SET_BIT(addr,ij) - } - } - } - } - } - - void Matrix_Transpose(unsigned int * X, unsigned int rowsX, unsigned int colsX, - unsigned int * Y, unsigned int rowsY, unsigned int colsY) - { - unsigned int i; - unsigned int j; - unsigned int ii; - unsigned int ij; - unsigned int ji; - unsigned int addii; - unsigned int addij; - unsigned int addji; - unsigned int bitii; - unsigned int bitij; - unsigned int bitji; - unsigned int termi; - unsigned int termj; - boolean swap; - - /* BEWARE that "in-place" is ONLY possible if the matrix is quadratic!! */ - - if ((rowsX == colsY) && (colsX == rowsY) && - (bits_(X) == rowsX*colsX) && - (bits_(Y) == rowsY*colsY)) - { - if (rowsY == colsY) /* in-place is possible! */ - { - for ( i = 0; i < rowsY; i++ ) - { - termi = i * colsY; - for ( j = 0; j < i; j++ ) - { - termj = j * colsX; - ij = termi + j; - ji = termj + i; - addij = ij >> LOGBITS; - addji = ji >> LOGBITS; - bitij = BITMASKTAB[ij & MODMASK]; - bitji = BITMASKTAB[ji & MODMASK]; - swap = ((*(Y+addij) & bitij) != 0); - if ((*(Y+addji) & bitji) != 0) - *(X+addij) |= bitij; - else - *(X+addij) &= ~ bitij; - if (swap) - *(X+addji) |= bitji; - else - *(X+addji) &= ~ bitji; - } - ii = termi + i; - addii = ii >> LOGBITS; - bitii = BITMASKTAB[ii & MODMASK]; - if ((*(Y+addii) & bitii) != 0) - *(X+addii) |= bitii; - else - *(X+addii) &= ~ bitii; - } - } - else /* rowsX != colsX, in-place is ~ possible! */ - { - for ( i = 0; i < rowsY; i++ ) - { - termi = i * colsY; - for ( j = 0; j < colsY; j++ ) - { - termj = j * colsX; - ij = termi + j; - ji = termj + i; - addij = ij >> LOGBITS; - addji = ji >> LOGBITS; - bitij = BITMASKTAB[ij & MODMASK]; - bitji = BITMASKTAB[ji & MODMASK]; - if ((*(Y+addij) & bitij) != 0) - *(X+addji) |= bitji; - else - *(X+addji) &= ~ bitji; - } - } - } - } - } -}; //end of namespace CONSTANTBV diff --git a/src/vendor/stp/src/extlib-constbv/constantbv.h b/src/vendor/stp/src/extlib-constbv/constantbv.h deleted file mode 100644 index 3241b4555..000000000 --- a/src/vendor/stp/src/extlib-constbv/constantbv.h +++ /dev/null @@ -1,316 +0,0 @@ -#ifndef MODULE_BIT_VECTOR -#define MODULE_BIT_VECTOR -/*****************************************************************************/ -/* AUTHOR: */ -/*****************************************************************************/ -/* */ -/* Steffen Beyer */ -/* mailto:sb@engelschall.com */ -/* http://www.engelschall.com/u/sb/download/ */ -/* */ -/*****************************************************************************/ -/* COPYRIGHT: */ -/*****************************************************************************/ -/* */ -/* Copyright (c) 1995 - 2004 by Steffen Beyer. */ -/* All rights reserved. */ -/* */ -/*****************************************************************************/ -/* LICENSE: */ -/*****************************************************************************/ -/* */ -/* This library is free software; you can redistribute it and/or */ -/* modify it under the terms of the GNU Library General Public */ -/* License as published by the Free Software Foundation; either */ -/* version 2 of the License, or (at your option) any later version. */ -/* */ -/* This library is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ -/* Library General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Library General Public */ -/* License along with this library; if not, write to the */ -/* Free Software Foundation, Inc., */ -/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* */ -/* or download a copy from ftp://ftp.gnu.org/pub/gnu/COPYING.LIB-2.0 */ -/* */ -/*****************************************************************************/ - - -/*****************************************************************************/ -/* MODULE NAME: BitVector.h MODULE TYPE: (adt) */ -/*****************************************************************************/ -/* MODULE IMPORTS: */ -/*****************************************************************************/ -#include /* MODULE TYPE: (sys) */ -#include /* MODULE TYPE: (sys) */ -#include /* MODULE TYPE: (sys) */ -#include /* MODULE TYPE: (sys) */ -/*****************************************************************************/ -/* MODULE INTERFACE: */ -/*****************************************************************************/ - -namespace CONSTANTBV { - -#ifdef __cplusplus - extern "C" { - typedef bool boolean; -#else - typedef enum { false = (0!=0), true = (0==0) } boolean; -#endif - - typedef enum { - ErrCode_Ok = 0, /* everything went allright */ - ErrCode_Type, /* types word and size_t have incompatible sizes */ - ErrCode_Bits, /* bits of word and sizeof(word) are inconsistent */ - ErrCode_Word, /* size of word is less than 16 bits */ - ErrCode_Long, /* size of word is greater than size of long */ - ErrCode_Powr, /* number of bits of word is not a power of two */ - ErrCode_Loga, /* error in calculation of logarithm */ - ErrCode_Null, /* unable to allocate memory */ - ErrCode_Indx, /* index out of range */ - ErrCode_Ordr, /* minimum > maximum index */ - ErrCode_Size, /* bit vector size mismatch */ - ErrCode_Pars, /* input string syntax error */ - ErrCode_Ovfl, /* numeric overflow error */ - ErrCode_Same, /* operands must be distinct */ - ErrCode_Expo, /* exponent must be positive */ - ErrCode_Zero /* division by zero error */ - } ErrCode; - - - /* ===> MISCELLANEOUS BASIC FUNCTIONS: <=== */ - unsigned char * BitVector_Error(ErrCode error); /* return string for err code */ - ErrCode BitVector_Boot (void); /* 0 = ok, 1..7 = error */ - unsigned int BitVector_Size(unsigned int bits); /* bit vector size (# of words) */ - unsigned int BitVector_Mask(unsigned int bits); /* bit vector mask (unused bits) */ - - /* ===> CLASS METHODS: <=== */ - unsigned char * BitVector_Version(void); /* return version string */ - unsigned int BitVector_Word_Bits(void); /* return # of bits in machine word */ - unsigned int BitVector_Long_Bits(void); /* return # of bits in unsigned long */ - - /* ===> CONSTRUCTOR METHODS: <=== */ - unsigned int * BitVector_Create (unsigned int bits, boolean clear); /* malloc */ - unsigned int ** BitVector_Create_List (unsigned int bits, boolean clear, unsigned int count); - unsigned int * BitVector_Resize (unsigned int * oldaddr, unsigned int bits); /* realloc */ - unsigned int * BitVector_Shadow (unsigned int * addr); /* make new same size but empty */ - unsigned int * BitVector_Clone (unsigned int * addr); /* make exact duplicate */ - unsigned int * BitVector_Concat (unsigned int * X, unsigned int * Y); /* return concatenation */ - - /* ===> DESTRUCTOR METHODS: <=== */ - void BitVector_Dispose (unsigned char * string); /* string */ - void BitVector_Destroy (unsigned int * addr); /* bitvec */ - void BitVector_Destroy_List (unsigned int * * list, unsigned int count); /* list */ - - /* ===> OBJECT METHODS: <=== */ - - /* ===> bit vector hash: */ - size_t BitVector_Hash (unsigned int * X); - - /* ===> bit vector copy function: */ - void BitVector_Copy (unsigned int * X, unsigned int * Y); /* X := Y */ - - /* ===> bit vector initialization: */ - void BitVector_Empty (unsigned int * addr); /* X = {} */ - void BitVector_Fill (unsigned int * addr); /* X = ~{} */ - void BitVector_Flip (unsigned int * addr); /* X = ~X */ - void BitVector_Primes (unsigned int * addr); - - /* ===> miscellaneous functions: */ - void BitVector_Reverse (unsigned int * X, unsigned int * Y); - - /* ===> bit vector interval operations and functions: */ - void BitVector_Interval_Empty (unsigned int * addr, unsigned int lower, unsigned int upper); - void BitVector_Interval_Fill (unsigned int * addr, unsigned int lower, unsigned int upper); - void BitVector_Interval_Flip (unsigned int * addr, unsigned int lower, unsigned int upper); - void BitVector_Interval_Reverse (unsigned int * addr, unsigned int lower, unsigned int upper); - - boolean BitVector_interval_scan_inc (unsigned int * addr, unsigned int start, - unsigned int * min, unsigned int * max); - boolean BitVector_interval_scan_dec (unsigned int * addr, unsigned int start, - unsigned int * min, unsigned int * max); - void BitVector_Interval_Copy (unsigned int * X, unsigned int * Y, - unsigned int Xoffset, unsigned int Yoffset, unsigned int length); - unsigned int * BitVector_Interval_Substitute(unsigned int * X, unsigned int * Y, - unsigned int Xoffset, unsigned int Xlength, - unsigned int Yoffset, unsigned int Ylength); - - /* ===> bit vector test functions: */ - boolean BitVector_is_empty (unsigned int * addr); /* X == {} ? */ - boolean BitVector_is_full (unsigned int * addr); /* X == ~{} ? */ - boolean BitVector_equal (unsigned int * X, unsigned int * Y); /* X == Y ? */ - signed int BitVector_Lexicompare (unsigned int * X, unsigned int * Y); /* X <,=,> Y ? */ - signed int BitVector_Compare (unsigned int * X, unsigned int * Y); /* X <,=,> Y ? */ - - /* ===> bit vector string conversion functions: */ - unsigned char * BitVector_to_Hex (unsigned int * addr); - ErrCode BitVector_from_Hex (unsigned int * addr, unsigned char * string); - unsigned char * BitVector_to_Bin (unsigned int * addr); - ErrCode BitVector_from_Bin (unsigned int * addr, unsigned char * string); - unsigned char * BitVector_to_Dec (unsigned int * addr); - ErrCode BitVector_from_Dec (unsigned int * addr, unsigned char * string); - unsigned char * BitVector_to_Enum (unsigned int * addr); - ErrCode BitVector_from_Enum (unsigned int * addr, unsigned char * string); - - /* ===> bit vector bit operations, functions & tests: */ - void BitVector_Bit_Off (unsigned int * addr, unsigned int index); /* X = X \ {x} */ - void BitVector_Bit_On (unsigned int * addr, unsigned int index); /* X = X + {x} */ - boolean BitVector_bit_flip (unsigned int * addr, unsigned int index); /* (X+{x})\(X*{x}) */ - boolean BitVector_bit_test (unsigned int * addr, unsigned int index); /* {x} in X ? */ - void BitVector_Bit_Copy (unsigned int * addr, unsigned int index, boolean bit); - - /* ===> bit vector bit shift & rotate functions: */ - void BitVector_LSB (unsigned int * addr, boolean bit); - void BitVector_MSB (unsigned int * addr, boolean bit); - boolean BitVector_lsb_ (unsigned int * addr); - boolean BitVector_msb_ (unsigned int * addr); - boolean BitVector_rotate_left (unsigned int * addr); - boolean BitVector_rotate_right (unsigned int * addr); - boolean BitVector_shift_left (unsigned int * addr, boolean carry_in); - boolean BitVector_shift_right (unsigned int * addr, boolean carry_in); - void BitVector_Move_Left (unsigned int * addr, unsigned int bits); - void BitVector_Move_Right (unsigned int * addr, unsigned int bits); - - /* ===> bit vector insert/delete bits: */ - void BitVector_Insert (unsigned int * addr, - unsigned int offset, unsigned int count, boolean clear); - void BitVector_Delete (unsigned int * addr, - unsigned int offset, unsigned int count, boolean clear); - - /* ===> bit vector arithmetic: */ - boolean BitVector_increment (unsigned int * addr); /* X++ */ - boolean BitVector_decrement (unsigned int * addr); /* X-- */ - boolean BitVector_compute (unsigned int * X, unsigned int * Y, - unsigned int * Z, boolean minus, boolean *carry); - boolean BitVector_add (unsigned int * X, - unsigned int * Y, unsigned int * Z, boolean *carry); - boolean BitVector_sub (unsigned int * X, - unsigned int * Y, unsigned int * Z, boolean *carry); /* X = Y-Z*/ - boolean BitVector_inc (unsigned int * X, unsigned int * Y); - boolean BitVector_dec (unsigned int * X, unsigned int * Y); - - void BitVector_Negate (unsigned int * X, unsigned int * Y); - void BitVector_Absolute (unsigned int * X, unsigned int * Y); - signed int BitVector_Sign (unsigned int * addr); - ErrCode BitVector_Mul_Pos (unsigned int * X, - unsigned int * Y, unsigned int * Z, boolean strict); - ErrCode BitVector_Multiply (unsigned int * X, unsigned int * Y, unsigned int * Z); - ErrCode BitVector_Div_Pos (unsigned int * Q, unsigned int * X, unsigned int * Y, unsigned int * R); - ErrCode BitVector_Divide (unsigned int * Q, unsigned int * X, unsigned int * Y, unsigned int * R); - ErrCode BitVector_GCD (unsigned int * X, unsigned int * Y, unsigned int * Z); - ErrCode BitVector_GCD2 (unsigned int * U, unsigned int * V, unsigned int * W, /* O */ - unsigned int * X, unsigned int * Y); /* I */ - ErrCode BitVector_Power (unsigned int * X, unsigned int * Y, unsigned int * Z); - - /* ===> direct memory access functions: */ - void BitVector_Block_Store (unsigned int * addr, - unsigned char * buffer, unsigned int length); - unsigned char * BitVector_Block_Read (unsigned int * addr, unsigned int * length); - - /* ===> word array functions: */ - void BitVector_Word_Store (unsigned int * addr, unsigned int offset, unsigned int value); - unsigned int BitVector_Word_Read (unsigned int * addr, unsigned int offset); - void BitVector_Word_Insert (unsigned int * addr, - unsigned int offset, unsigned int count, boolean clear); - void BitVector_Word_Delete (unsigned int * addr, - unsigned int offset, unsigned int count, boolean clear); - - /* ===> arbitrary size chunk functions: */ - void BitVector_Chunk_Store (unsigned int * addr, unsigned int chunksize, - unsigned int offset, unsigned long value); - unsigned long BitVector_Chunk_Read (unsigned int * addr, - unsigned int chunksize,unsigned int offset); - - /* ===> set operations: */ - void Set_Union (unsigned int * X, unsigned int * Y, unsigned int * Z); /* X = Y + Z */ - void Set_Intersection (unsigned int * X, unsigned int * Y, unsigned int * Z); /* X = Y * Z */ - void Set_Difference (unsigned int * X, unsigned int * Y, unsigned int * Z); /* X = Y \ Z */ - void Set_ExclusiveOr (unsigned int * X, unsigned int * Y, unsigned int * Z); /*(Y+Z)\(Y*Z)*/ - void Set_Complement (unsigned int * X, unsigned int * Y); /* X = ~Y */ - - /* ===> set functions: */ - boolean Set_subset (unsigned int * X, unsigned int * Y); /* X in Y ? */ - unsigned int Set_Norm (unsigned int * addr); /* = | X | */ - unsigned int Set_Norm2 (unsigned int * addr); /* = | X | */ - unsigned int Set_Norm3 (unsigned int * addr); /* = | X | */ - signed long Set_Min (unsigned int * addr); /* = min(X) */ - signed long Set_Max (unsigned int * addr); /* = max(X) */ - - /* ===> matrix-of-booleans operations: */ - void Matrix_Multiplication (unsigned int * X, unsigned int rowsX, unsigned int colsX, - unsigned int * Y, unsigned int rowsY, unsigned int colsY, - unsigned int * Z, unsigned int rowsZ, unsigned int colsZ); - void Matrix_Product (unsigned int * X, unsigned int rowsX, unsigned int colsX, - unsigned int * Y, unsigned int rowsY, unsigned int colsY, - unsigned int * Z, unsigned int rowsZ, unsigned int colsZ); - void Matrix_Closure (unsigned int * addr, unsigned int rows, unsigned int cols); - void Matrix_Transpose (unsigned int * X, unsigned int rowsX, unsigned int colsX, - unsigned int * Y, unsigned int rowsY, unsigned int colsY); - - /*****************************************************************************/ - /* MODULE RESOURCES: */ - /*****************************************************************************/ -#define bits_(BitVector) *(BitVector-3) -#define size_(BitVector) *(BitVector-2) -#define mask_(BitVector) *(BitVector-1) - -#define ERRCODE_TYPE "sizeof(word) > sizeof(size_t)" -#define ERRCODE_BITS "bits(word) != sizeof(word)*8" -#define ERRCODE_WORD "bits(word) < 16" -#define ERRCODE_LONG "bits(word) > bits(long)" -#define ERRCODE_POWR "bits(word) != 2^x" -#define ERRCODE_LOGA "bits(word) != 2^ld(bits(word))" -#define ERRCODE_NULL "unable to allocate memory" -#define ERRCODE_INDX "index out of range" -#define ERRCODE_ORDR "minimum > maximum index" -#define ERRCODE_SIZE "bit vector size mismatch" -#define ERRCODE_PARS "input string syntax error" -#define ERRCODE_OVFL "numeric overflow error" -#define ERRCODE_SAME "result vector(s) must be distinct" -#define ERRCODE_EXPO "exponent must be positive" -#define ERRCODE_ZERO "division by zero error" -#define ERRCODE_OOPS "unexpected internal error - please contact author" - - const unsigned int BitVector_BYTENORM[256] = { - 0x00, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x03, - 0x01, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x04, /* 0x00 */ - 0x01, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x04, - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, /* 0x10 */ - 0x01, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x04, - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, /* 0x20 */ - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, /* 0x30 */ - 0x01, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x04, - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, /* 0x40 */ - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, /* 0x50 */ - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, /* 0x60 */ - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, - 0x04, 0x05, 0x05, 0x06, 0x05, 0x06, 0x06, 0x07, /* 0x70 */ - 0x01, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x04, - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, /* 0x80 */ - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, /* 0x90 */ - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, /* 0xA0 */ - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, - 0x04, 0x05, 0x05, 0x06, 0x05, 0x06, 0x06, 0x07, /* 0xB0 */ - 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, /* 0xC0 */ - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, - 0x04, 0x05, 0x05, 0x06, 0x05, 0x06, 0x06, 0x07, /* 0xD0 */ - 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, - 0x04, 0x05, 0x05, 0x06, 0x05, 0x06, 0x06, 0x07, /* 0xE0 */ - 0x04, 0x05, 0x05, 0x06, 0x05, 0x06, 0x06, 0x07, - 0x05, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x08 /* 0xF0 */ - }; -#ifdef __cplusplus - }; -#endif -}; //end of namespace CONSTANTBV -#endif - diff --git a/src/vendor/stp/src/main/Globals.cpp b/src/vendor/stp/src/main/Globals.cpp deleted file mode 100644 index 0b981ea95..000000000 --- a/src/vendor/stp/src/main/Globals.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../STPManager/STP.h" - -namespace BEEV -{ - enum inputStatus input_status = NOT_DECLARED; - - //Originally just used by the parser, now used elesewhere. - STP * GlobalSTP; - STPMgr * ParserBM; - - // Used exclusively for parsing. - Cpp_interface * parserInterface; - - void (*vc_error_hdlr)(const char* err_msg) = NULL; - - // This is reusable empty vector, for representing empty children - // arrays - ASTVec _empty_ASTVec; - - //Some constant global vars for the Main function. Once they are - //set, these globals will remain constants. These vars are not used - //in the STP library. - const char * prog = "stp"; - int linenum = 1; - const char * usage = "Usage: %s [-option] [infile]\n"; - std::string helpstring = "\n"; -}; //end of namespace BEEV diff --git a/src/vendor/stp/src/main/Globals.h b/src/vendor/stp/src/main/Globals.h deleted file mode 100644 index b79628abc..000000000 --- a/src/vendor/stp/src/main/Globals.h +++ /dev/null @@ -1,94 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -#ifndef GLOBALS_H -#define GLOBALS_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace BEEV -{ - class STPMgr; - class ASTNode; - class ASTInternal; - class ASTInterior; - class ASTSymbol; - class ASTBVConst; - class BVSolver; - class STP; - class Cpp_interface; - - /*************************************************************** - * ENUM TYPES - * - ***************************************************************/ - - enum inputStatus - { - NOT_DECLARED =0, // Not included in the input file / stream - TO_BE_SATISFIABLE, - TO_BE_UNSATISFIABLE, - TO_BE_UNKNOWN // Specified in the input file as unknown. - }; - - //return types for the GetType() function in ASTNode class - enum types - { - BOOLEAN_TYPE = 0, - BITVECTOR_TYPE, - ARRAY_TYPE, - UNKNOWN_TYPE - }; - - enum SOLVER_RETURN_TYPE - { - SOLVER_INVALID=0, - SOLVER_VALID=1, - SOLVER_UNDECIDED=2, - SOLVER_TIMEOUT=3, - SOLVER_ERROR=-100, - SOLVER_UNSATISFIABLE = 1, - SOLVER_SATISFIABLE = 0 - }; - - //Empty vector. Useful commonly used ASTNodes - extern std::vector _empty_ASTVec; - extern ASTNode ASTFalse, ASTTrue, ASTUndefined; - - //Useful global variables. Use for parsing only - extern STP * GlobalSTP; - extern STPMgr * ParserBM; - extern Cpp_interface * parserInterface; - - //Some constant global vars for the Main function. Once they are - //set, these globals will remain constants. These vars are not used - //in the STP library. - extern const char * prog; - extern int linenum; - extern const char * usage; - extern std::string helpstring; - extern const std::string version; - extern enum inputStatus input_status; - - - // Function that computes various kinds of statistics for the phases - // of STP - void CountersAndStats(const char * functionname, STPMgr * bm); - -}; //end of namespace BEEV - -#endif diff --git a/src/vendor/stp/src/main/Makefile b/src/vendor/stp/src/main/Makefile deleted file mode 100644 index 624f08485..000000000 --- a/src/vendor/stp/src/main/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = main.cpp Globals.cpp -OBJS = $(SRCS:.cpp=.o) - - -# Build as a library; final linking to an executable will be done by the -# topmost Makefile. -libmain.a: $(filter-out main.o,$(OBJS)) | main.o - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o *~ *.a .#* depend - -FORCE: - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend diff --git a/src/vendor/stp/src/main/main.cpp b/src/vendor/stp/src/main/main.cpp deleted file mode 100644 index 03a2bb24c..000000000 --- a/src/vendor/stp/src/main/main.cpp +++ /dev/null @@ -1,547 +0,0 @@ - -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- -#include "../AST/AST.h" -#include "../printer/AssortedPrinters.h" -#include "../printer/printers.h" -#include "../STPManager/STPManager.h" -#include "../STPManager/STP.h" -#include "../AST/NodeFactory/TypeChecker.h" -#include "../AST/NodeFactory/SimplifyingNodeFactory.h" -#include "../cpp_interface/cpp_interface.h" -#include -#include -#include "../extlib-abc/cnf_short.h" - - -#ifdef EXT_HASH_MAP -using namespace __gnu_cxx; -#endif -using namespace BEEV; - -extern int smtparse(void*); -extern int smt2parse(); -extern int cvcparse(void*); -extern int cvclex_destroy(void); -extern int smtlex_destroy(void); -extern int smt2lex_destroy(void); - -namespace BEEV -{ - void setHardTimeout(int); -} - -bool onePrintBack =false; - - -static string tolower(const char * name) -{ - string s(name); - for (size_t i = 0; i < s.size(); ++i) - s[i] = ::tolower(s[i]); - return s; -} - - - -// Amount of memory to ask for at beginning of main. -static const intptr_t INITIAL_MEMORY_PREALLOCATION_SIZE = 4000000; -/******************************************************************** - * MAIN FUNCTION: - * - * step 0. Parse the input into an ASTVec. - * step 1. Do BV Rewrites - * step 2. Bitblasts the ASTNode. - * step 3. Convert to CNF - * step 4. Convert to SAT - * step 5. Call SAT to determine if input is SAT or UNSAT - ********************************************************************/ - -typedef enum {PRINT_BACK_C=1, PRINT_BACK_CVC, PRINT_BACK_SMTLIB2,PRINT_BACK_SMTLIB1, PRINT_BACK_GDL, PRINT_BACK_DOT, OUTPUT_BENCH, OUTPUT_CNF, USE_SIMPLIFYING_SOLVER, SMT_LIB2_FORMAT, SMT_LIB1_FORMAT, DISABLE_CBITP,EXIT_AFTER_CNF,USE_CRYPTOMINISAT_SOLVER,USE_MINISAT_SOLVER, DISABLE_SIMPLIFICATIONS, OLDSTYLE_REFINEMENT, DISABLE_EQUALITY, RANDOM_SEED,HASHING_NF} OptionType; - - -int main(int argc, char ** argv) { - char * infile = NULL; - extern FILE *cvcin; - extern FILE *smtin; - extern FILE *smt2in; - - // Grab some memory from the OS upfront to reduce system time when - // individual hash tables are being allocated - if (sbrk(INITIAL_MEMORY_PREALLOCATION_SIZE) == ((void *) -1)) - { - FatalError("Initial allocation of memory failed."); - } - - - STPMgr * bm = new STPMgr(); - - auto_ptr simplifyingNF( new SimplifyingNodeFactory(*bm->hashingNodeFactory, *bm)); - bm->defaultNodeFactory = simplifyingNF.get(); - - // The simplified keeps a pointer to whatever is set as the default node factory. - Simplifier * simp = new Simplifier(bm); - auto_ptr simpCleaner(simp); - - ArrayTransformer * arrayTransformer = new ArrayTransformer(bm, simp); - auto_ptr atClearner(arrayTransformer); - - ToSAT * tosat = new ToSAT(bm); - auto_ptr tosatCleaner(tosat); - - AbsRefine_CounterExample * Ctr_Example = new AbsRefine_CounterExample(bm, simp, arrayTransformer); - auto_ptr ctrCleaner(Ctr_Example); - - ParserBM = bm; - GlobalSTP = - new STP(bm, - simp, - arrayTransformer, - tosat, - Ctr_Example); - - - //populate the help string - helpstring += - "STP version : " + version + "\n" - "--disable-simplify : disable all simplifications\n" - "-w : switch wordlevel solver off (optimizations are ON by default)\n" - "-a : disable potentially size-increasing optimisations\n" - "--disable-cbitp : disable constant bit propagation\n" - "--disable-equality : disable equality propagation\n" - "\n" - "--cryptominisat : use cryptominisat2 as the solver\n" - "--simplifying-minisat : use simplifying-minisat 2.2 as the solver\n" - "--minisat : use minisat 2.2 as the solver\n" - "\n" - "--oldstyle-refinement : Do abstraction-refinement outside the SAT solver\n" - "-r : Eagerly encode array-read axioms (Ackermannistaion)\n" - "\n" - "-b : print STP input back to cout\n" - "--print-back-CVC : print input in CVC format, then exit\n" - "--print-back-SMTLIB2 : print input in SMT-LIB2 format, then exit\n" - "--print-back-SMTLIB1 : print input in SMT-LIB1 format, then exit\n" - "--print-back-GDL : print AiSee's graph format, then exit\n" - "--print-back-dot : print dotty/neato's graph format, then exit\n" - "\n" - "--SMTLIB1 -m : use the SMT-LIB1 format parser\n" - "--SMTLIB2 : use the SMT-LIB2 format parser\n" - "\n" - "--output-CNF : save the CNF into output_[0..n].cnf\n" - "--output-bench : save in ABC's bench format to output.bench\n" - "\n" - "--exit-after-CNF : exit after the CNF has been generated\n" - "-g : timeout (seconds until STP gives up)\n" - "-h : help\n" - "-i : Randomize STP's satisfiable output. Random_seed is an integer >= 0\n" - "--random-seed : Generate a random number for the SAT solver.\n" - "-p : print counterexample\n" - "-s : print function statistics\n" - "-t : print quick statistics\n" - "-v : print nodes \n" - "-y : print counterexample in binary\n"; - - // "-x : flatten nested XORs\n" - // "-c : construct counterexample\n" - // "-d : check counterexample\n" - - for(int i=1; i < argc;i++) - { - if(argv[i][0] == '-') - { - if(argv[i][1] == '-') - { - // long options. - map lookup; - lookup.insert(make_pair(tolower("--print-back-C"),PRINT_BACK_C)); - lookup.insert(make_pair(tolower("--cryptominisat"),USE_CRYPTOMINISAT_SOLVER)); - lookup.insert(make_pair(tolower("--minisat"),USE_MINISAT_SOLVER)); - - lookup.insert(make_pair(tolower("--print-back-CVC"),PRINT_BACK_CVC)); - lookup.insert(make_pair(tolower("--print-back-SMTLIB2"),PRINT_BACK_SMTLIB2)); - lookup.insert(make_pair(tolower("--print-back-SMTLIB1"),PRINT_BACK_SMTLIB1)); - lookup.insert(make_pair(tolower("--print-back-GDL"),PRINT_BACK_GDL)); - lookup.insert(make_pair(tolower("--print-back-dot"),PRINT_BACK_DOT)); - lookup.insert(make_pair(tolower("--output-CNF"),OUTPUT_CNF)); - lookup.insert(make_pair(tolower("--exit-after-CNF"),EXIT_AFTER_CNF)); - lookup.insert(make_pair(tolower("--output-bench"),OUTPUT_BENCH)); - lookup.insert(make_pair(tolower("--simplifying-minisat"),USE_SIMPLIFYING_SOLVER)); - lookup.insert(make_pair(tolower("--SMTLIB2"),SMT_LIB2_FORMAT)); - lookup.insert(make_pair(tolower("--SMTLIB1"),SMT_LIB1_FORMAT)); - lookup.insert(make_pair(tolower("--disable-cbitp"),DISABLE_CBITP)); - lookup.insert(make_pair(tolower("--disable-simplify"),DISABLE_SIMPLIFICATIONS)); - lookup.insert(make_pair(tolower("--oldstyle-refinement"),OLDSTYLE_REFINEMENT)); - lookup.insert(make_pair(tolower("--disable-equality"),DISABLE_EQUALITY)); - lookup.insert(make_pair(tolower("--random-seed"),RANDOM_SEED)); - lookup.insert(make_pair(tolower("--hash-nf"),HASHING_NF)); - - - if (!strncmp(argv[i],"--config_",strlen("--config_"))) - { - // Must contain an equals. - // Must contain a name >=1 character long. - // Must contain a value >=1 char. - string s(argv[i]); - size_t a = s.find("_"); - size_t b = s.find("="); - if (a== string::npos || b == string::npos || b < a || b==a+1 || b==s.length()-1) - { - fprintf(stderr,usage,prog); - cout << helpstring; - return -1; - break; - } - - string name = s.substr(a+1,b-a-1); - string value = s.substr(b+1); - - bm->UserFlags.set(name,value); - } - else - - switch(lookup[tolower(argv[i])]) - { - case DISABLE_CBITP: - bm->UserFlags.bitConstantProp_flag = false; - break; - case EXIT_AFTER_CNF: - bm->UserFlags.exit_after_CNF = true; - break; - case PRINT_BACK_C: - bm->UserFlags.print_STPinput_back_C_flag = true; - onePrintBack = true; - break; - case PRINT_BACK_CVC: - bm->UserFlags.print_STPinput_back_CVC_flag = true; - onePrintBack = true; - break; - case PRINT_BACK_SMTLIB2: - bm->UserFlags.print_STPinput_back_SMTLIB2_flag = true; - onePrintBack = true; - break; - case PRINT_BACK_SMTLIB1: - bm->UserFlags.print_STPinput_back_SMTLIB1_flag = true; - onePrintBack = true; - break; - case PRINT_BACK_GDL: - bm->UserFlags.print_STPinput_back_GDL_flag = true; - onePrintBack = true; - break; - case PRINT_BACK_DOT: - bm->UserFlags.print_STPinput_back_dot_flag = true; - onePrintBack = true; - break; - case OUTPUT_CNF: - bm->UserFlags.output_CNF_flag = true; - //bm->UserFlags.print_cnf_flag = true; - break; - case OUTPUT_BENCH: - bm->UserFlags.output_bench_flag = true; - break; - case SMT_LIB2_FORMAT: - bm->UserFlags.smtlib2_parser_flag = true; - bm->UserFlags.division_by_zero_returns_one_flag = true; - if (bm->UserFlags.smtlib1_parser_flag) - FatalError("Can't use both the smtlib and smtlib2 parsers"); - break; - case SMT_LIB1_FORMAT: - bm->UserFlags.smtlib1_parser_flag = true; - bm->UserFlags.division_by_zero_returns_one_flag = true; - if (bm->UserFlags.smtlib2_parser_flag) - FatalError("Can't use both the smtlib and smtlib2 parsers"); - break; - case USE_SIMPLIFYING_SOLVER: - bm->UserFlags.solver_to_use = UserDefinedFlags::SIMPLIFYING_MINISAT_SOLVER; - break; - case USE_CRYPTOMINISAT_SOLVER: - bm->UserFlags.solver_to_use = UserDefinedFlags::CRYPTOMINISAT_SOLVER; - break; - case USE_MINISAT_SOLVER: - bm->UserFlags.solver_to_use = UserDefinedFlags::MINISAT_SOLVER; - break; - case OLDSTYLE_REFINEMENT: - bm->UserFlags.solver_to_use = UserDefinedFlags::MINISAT_SOLVER; - break; - case DISABLE_SIMPLIFICATIONS: - bm->UserFlags.disableSimplifications(); - break; - case DISABLE_EQUALITY: - bm->UserFlags.propagate_equalities = false; - break; - case RANDOM_SEED: - { - srand(time(NULL)); - bm->UserFlags.random_seed_flag = true; - bm->UserFlags.random_seed = rand(); - } - break; - case HASHING_NF: - bm->defaultNodeFactory = bm->hashingNodeFactory; - break; - - default: - fprintf(stderr,usage,prog); - cout << helpstring; - return -1; - break; - } - } - else - { - if(argv[i][2]) - { - fprintf(stderr, - "Multiple character options are not allowed.\n"); - fprintf(stderr, - "(for example: -ab is not an abbreviation for -a -b)\n"); - fprintf(stderr,usage,prog); - cout << helpstring; - return -1; - } - - if (argv[i][1] == 'g') - { - BEEV::setHardTimeout(atoi(argv[++i])); - } - else if (argv[i][1] == 'i') - { - bm->UserFlags.random_seed_flag = true; - bm->UserFlags.random_seed = atoi(argv[++i]); - //cerr << "Random seed is: " << bm->UserFlags.random_seed << endl; - if(!(0 <= bm->UserFlags.random_seed)) - { - FatalError("Random Seed should be an integer >= 0\n"); - } - } - else if (argv[i][1] == 'b') - { - onePrintBack = true; - bm->UserFlags.print_STPinput_back_flag = true; - } - else - process_argument(argv[i][1],bm); - - } - } else { - if (NULL != infile) - FatalError("One input file only."); - infile = argv[i]; - } - } - - if (!bm->UserFlags.smtlib1_parser_flag && !bm->UserFlags.smtlib2_parser_flag) - { - // No parser is explicity requested. - if (NULL != infile && strlen(infile)>=5) - { - string f(infile); - if (!f.compare(f.length()-4, 4,".smt")) - { - bm->UserFlags.division_by_zero_returns_one_flag = true; - bm->UserFlags.smtlib1_parser_flag = true; - } - if (!f.compare(f.length()-5, 5,".smt2")) - { - bm->UserFlags.division_by_zero_returns_one_flag = true; - bm->UserFlags.smtlib2_parser_flag = true; - } - } - } - - FILE* toClose= 0; - - // If we're not reading the file from stdin. - if (infile != NULL) - { - if (bm->UserFlags.smtlib1_parser_flag) - { - smtin = fopen(infile,"r"); - toClose = smtin; - if(smtin == NULL) - { - fprintf(stderr,"%s: Error: cannot open %s\n",prog,infile); - FatalError(""); - } - } else - if (bm->UserFlags.smtlib2_parser_flag) - { - smt2in = fopen(infile,"r"); - toClose = smt2in; - if(smt2in == NULL) - { - fprintf(stderr,"%s: Error: cannot open %s\n",prog,infile); - FatalError(""); - } - } - - else - { - cvcin = fopen(infile,"r"); - toClose = cvcin; - if(cvcin == NULL) - { - fprintf(stderr,"%s: Error: cannot open %s\n",prog,infile); - FatalError(""); - } - } - } - - - //want to print the output always from the commandline. - bm->UserFlags.print_output_flag = true; - ASTVec * AssertsQuery = new ASTVec; - - bm->GetRunTimes()->start(RunTimes::Parsing); - { - TypeChecker nfTypeCheckSimp(*bm->defaultNodeFactory, *bm); - TypeChecker nfTypeCheckDefault(*bm->hashingNodeFactory, *bm); - - Cpp_interface piTypeCheckSimp(*bm, &nfTypeCheckSimp); - Cpp_interface piTypeCheckDefault(*bm, &nfTypeCheckDefault); - - // If you are converting formats, you probably don't want it simplifying (at least I dont). - if (onePrintBack) - { - parserInterface = &piTypeCheckDefault; - } - else - parserInterface = &piTypeCheckSimp; - - parserInterface->startup(); - - if (onePrintBack) - { - if (bm->UserFlags.smtlib2_parser_flag) - { - cerr << "Printback from SMTLIB2 inputs isn't currently working." << endl; - cerr << "Please try again later" << endl; - cerr << "It works prior to revision 1354" << endl; - exit(1); - } - } - - - if (bm->UserFlags.smtlib1_parser_flag) { - smtparse((void*) AssertsQuery); - smtlex_destroy(); - } else if (bm->UserFlags.smtlib2_parser_flag) { - smt2parse(); - smt2lex_destroy(); - } else { - cvcparse((void*) AssertsQuery); - cvclex_destroy(); - } - parserInterface = NULL; - if (toClose != NULL) - fclose(toClose); - } - bm->GetRunTimes()->stop(RunTimes::Parsing); - - /* The SMTLIB2 has a command language. The parser calls all the functions, - * so when we get to here the parser has already called "exit". i.e. if the - * language is smt2 then all the work has already been done, and all we need - * to do is cleanup... - * */ - if (!bm->UserFlags.smtlib2_parser_flag) - { - - if (((ASTVec*) AssertsQuery)->empty()) - { - FatalError("Input is Empty. Please enter some asserts and query\n"); - } - - if (((ASTVec*) AssertsQuery)->size() != 2) - { - FatalError("Input must contain a query\n"); - } - - ASTNode asserts = (*(ASTVec*) AssertsQuery)[0]; - ASTNode query = (*(ASTVec*) AssertsQuery)[1]; - - if (onePrintBack) - { - - ASTNode original_input = bm->CreateNode(AND, bm->CreateNode(NOT, query), asserts); - - if (bm->UserFlags.print_STPinput_back_flag) - { - if (bm->UserFlags.smtlib1_parser_flag) - bm->UserFlags.print_STPinput_back_SMTLIB2_flag = true; - else - bm->UserFlags.print_STPinput_back_CVC_flag = true; - } - - if (bm->UserFlags.print_STPinput_back_CVC_flag) - { - //needs just the query. Reads the asserts out of the data structure. - print_STPInput_Back(original_input); - } - - if (bm->UserFlags.print_STPinput_back_SMTLIB1_flag) - { - printer::SMTLIB1_PrintBack(cout, original_input); - } - - if (bm->UserFlags.print_STPinput_back_SMTLIB2_flag) - { - printer::SMTLIB2_PrintBack(cout, original_input); - } - - if (bm->UserFlags.print_STPinput_back_C_flag) - { - printer::C_Print(cout, original_input); - } - - if (bm->UserFlags.print_STPinput_back_GDL_flag) - { - printer::GDL_Print(cout, original_input); - } - - if (bm->UserFlags.print_STPinput_back_dot_flag) - { - printer::Dot_Print(cout, original_input); - } - - return 0; - } - - SOLVER_RETURN_TYPE ret = GlobalSTP->TopLevelSTP(asserts, query); - if (bm->UserFlags.quick_statistics_flag) - { - bm->GetRunTimes()->print(); - } - (GlobalSTP->tosat)->PrintOutput(ret); - - asserts = ASTNode(); - query = ASTNode(); - } - - // Currently for testcase12.stp.smt2 we spend 3 seconds running the destructors, - // the total runtime is 17 seconds, so about 20% of runtime is spent destructing - // which is wasted work because the process is going to be killed anyway. - if (bm->UserFlags.isSet("fast-exit", "1")) - exit(0); - - AssertsQuery->clear(); - delete AssertsQuery; - - _empty_ASTVec.clear(); - - simpCleaner.release(); - atClearner.release(); - tosatCleaner.release(); - ctrCleaner.release(); - - delete GlobalSTP; - delete ParserBM; - - Cnf_ClearMemory(); - - return 0; -}//end of Main diff --git a/src/vendor/stp/src/parser/LetMgr.cpp b/src/vendor/stp/src/parser/LetMgr.cpp deleted file mode 100644 index ffb5054d8..000000000 --- a/src/vendor/stp/src/parser/LetMgr.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include -#include "LetMgr.h" - -namespace BEEV { - // FUNC: This function builds the map between LET-var names and - // LET-expressions - // - //1. if the Let-var is already defined in the LET scope, then the - //1. function returns an error. - // - //2. if the Let-var is already declared variable in the input, then - //2. the function returns an error - // - //3. otherwise add the pair to the _letid_expr table. - void LETMgr::LetExprMgr(const ASTNode& var, const ASTNode& letExpr) - { - string name = var.GetName(); - MapType::iterator it; - if(((it = _letid_expr_map->find(name)) != _letid_expr_map->end())) - { - FatalError("LetExprMgr:The LET-var v has already been defined"\ - "in this LET scope: v =", var); - } - - if(_parser_symbol_table.find(var) != _parser_symbol_table.end()) - { - FatalError("LetExprMgr:This var is already declared. "\ - "cannot redeclare as a letvar: v =", var); - } - - LetExprMgr(var.GetName(),letExpr); - }//end of LetExprMgr() - - void LETMgr::LetExprMgr(string name, const ASTNode& letExpr) - { - assert (_letid_expr_map->find(name) == _letid_expr_map->end()); - (*_letid_expr_map)[name] = letExpr; - }//end of LetExprMgr() - - - //this function looks up the "var to letexpr map" and returns the - //corresponding letexpr. if there is no letexpr, then it simply - //returns the var. - ASTNode LETMgr::ResolveID(const ASTNode& v) - { - if (v.GetKind() != SYMBOL) { - return v; - } - - if(_parser_symbol_table.find(v) != _parser_symbol_table.end()) { - return v; - } - - MapType::iterator it; - if((it =_letid_expr_map->find(v.GetName())) != _letid_expr_map->end()) - { - return it->second; - } - - return v; - }//End of ResolveID() - - // This function simply cleans up the LetID -> LetExpr Map. - void LETMgr::CleanupLetIDMap(void) - { - // ext/hash_map::clear() is very expensive on big empty maps. shortcut. - if (_letid_expr_map->size() ==0) - return; - - // May contain lots of buckets, so reset. - delete _letid_expr_map; - InitializeLetIDMap(); - }//end of CleanupLetIDMap() - - void LETMgr::InitializeLetIDMap(void) - { - _letid_expr_map = new hash_map >(); - } //end of InitializeLetIDMap() -}; diff --git a/src/vendor/stp/src/parser/LetMgr.h b/src/vendor/stp/src/parser/LetMgr.h deleted file mode 100644 index bcd002b9e..000000000 --- a/src/vendor/stp/src/parser/LetMgr.h +++ /dev/null @@ -1,92 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef LETMGR_H -#define LETMGR_H - -#include "../AST/AST.h" - -namespace BEEV -{ - -//LET Management - class LETMgr - { - private: - - // Hash function for the hash_map of a string.. - template - struct hashF { - size_t operator() (const T & x) const { - return std::hash()(x.c_str()); - } - }; - - const ASTNode ASTUndefined; - - typedef hash_map > MapType; - - // MAP: This map is from bound IDs that occur in LETs to - // expression. The map is useful in checking replacing the IDs - // with the corresponding expressions. As soon as the brackets - // that close a let expression is reached, it is emptied by - // a call to CleanupLetIDMap(). - MapType *_letid_expr_map; - - //Allocate LetID map - void InitializeLetIDMap(void); - - public: - - // I think this keeps a reference to symbols so they don't get garbage collected. - ASTNodeSet _parser_symbol_table; - - // A let with this name has already been declared. - bool isLetDeclared(string s) - { - return _letid_expr_map->find(s) !=_letid_expr_map->end(); - } - - void cleanupParserSymbolTable() - { - _parser_symbol_table.clear(); - } - - LETMgr(ASTNode undefined) - : ASTUndefined(undefined) - { - assert(!undefined.IsNull()); - InitializeLetIDMap(); - } - - ~LETMgr() - { - delete _letid_expr_map; - } - - // We know for sure that it's a let. - ASTNode resolveLet(const string s) - { - assert(isLetDeclared(s)); - return _letid_expr_map->find(s)->second; - } - - ASTNode ResolveID(const ASTNode& var); - - //Functions that are used to manage LET expressions - void LetExprMgr(const ASTNode& var, const ASTNode& letExpr); - void LetExprMgr(string name, const ASTNode& letExpr); - - //Delete Letid Map. Called when we move onto the expression after (let ... ) - void CleanupLetIDMap(void); - - };// End of class LETMgr -}; //end of namespace - -#endif diff --git a/src/vendor/stp/src/parser/Makefile b/src/vendor/stp/src/parser/Makefile deleted file mode 100644 index 89542bb1c..000000000 --- a/src/vendor/stp/src/parser/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -# Workaround for flex < 2.5.20 which do not support the -f flag nor provide *_destroy functions -OLD_FLEX=$(shell flex --version | awk -F '[ .]' '{ print ($$(NF-2) < 2 || $$(NF-2) == 2 && ($$(NF-1) < 5 || $$(NF-1) == 5 && $$NF < 20)) }') - -ifeq (1,$(OLD_FLEX)) -LEX=flex -Ce -else -#`From the flex manual>: -Cfe' is often a good compromise between speed and size for production scanners. -LEX=flex -Cfe -endif - -YACC=bison --debug -v - -SRCS = $(foreach foo,cvc smt smt2,lex$(foo).cpp parse$(foo).cpp) LetMgr.cpp -OBJS = $(SRCS:.cpp=.o) - - -libparser.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -lex%.cpp: %.lex parse%.hpp ../AST/AST.h - $(LEX) -o$@ -P$* $< -ifeq (1,$(OLD_FLEX)) - echo "int $*lex_destroy(void) { return 0; }" >> $@ -endif - -parse%.cpp parse%.hpp: %.y - $(YACC) -o parse$*.cpp -d -p $* $< - - -clean: - $(RM) *.o *~ *.a .#* depend lex*.cpp parse*.cpp parse*.hpp *.output - -ifeq (,$(filter clean configclean distclean,$(MAKECMDGOALS))) -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend -endif diff --git a/src/vendor/stp/src/parser/cvc.lex b/src/vendor/stp/src/parser/cvc.lex deleted file mode 100644 index a71325a89..000000000 --- a/src/vendor/stp/src/parser/cvc.lex +++ /dev/null @@ -1,157 +0,0 @@ -%{ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include -#include "parser.h" -#include "parsecvc.hpp" -#include "../cpp_interface/cpp_interface.h" - - using namespace std; - using namespace BEEV; - extern char *yytext; - extern int cvcerror (const char *msg); -%} - -%option noyywrap -%option nounput -%option noreject -%option noyymore -%option yylineno -%x COMMENT -%x STRING_LITERAL -LETTER ([a-zA-Z]) -HEX ([0-9a-fA-F]) -BITS ([0-1]) -DIGIT ([0-9]) -OPCHAR (['?\_$]) -ANYTHING ({LETTER}|{DIGIT}|{OPCHAR}) -%% - -[()[\]{},.;:'!#?_=] { return yytext[0];} - -[\n] { /*Skip new line */ } -[ \t\r\f] { /* skip whitespace */ } -0b{BITS}+ { cvclval.node = new BEEV::ASTNode(BEEV::ParserBM->CreateBVConst(yytext+2, 2)); return BVCONST_TOK;} -0bin{BITS}+ { cvclval.node = new BEEV::ASTNode(BEEV::ParserBM->CreateBVConst(yytext+4, 2)); return BVCONST_TOK;} -0x{HEX}+ { cvclval.node = new BEEV::ASTNode(BEEV::ParserBM->CreateBVConst(yytext+2, 16)); return BVCONST_TOK;} -0h{HEX}+ { cvclval.node = new BEEV::ASTNode(BEEV::ParserBM->CreateBVConst(yytext+2, 16)); return BVCONST_TOK;} -0hex{HEX}+ { cvclval.node = new BEEV::ASTNode(BEEV::ParserBM->CreateBVConst(yytext+4, 16)); return BVCONST_TOK;} -{DIGIT}+ { cvclval.uintval = strtoul(yytext, NULL, 10); return NUMERAL_TOK;} -\'b[0-1]+ { cvclval.str = strdup(yytext+2); return BIN_BASED_NUMBER;} -\'d[0-9]+ { cvclval.str = strdup(yytext+2); return DEC_BASED_NUMBER;} -\'h[0-9a-fA-F]+ { cvclval.str = strdup(yytext+2); return HEX_BASED_NUMBER;} - -"%" { BEGIN COMMENT;} -"\n" { BEGIN INITIAL; /* return to normal mode */} -. { /* stay in comment mode */} - -"ARRAY" { return ARRAY_TOK; } -"OF" { return OF_TOK; } -"WITH" { return WITH_TOK; } -"AND" { return AND_TOK;} -"NAND" { return NAND_TOK;} -"NOR" { return NOR_TOK;} -"NOT" { return NOT_TOK; } -"EXCEPT" { return EXCEPT_TOK; } -"OR" { return OR_TOK; } -"/=" { return NEQ_TOK; } - ":=" { return ASSIGN_TOK;} -"=>" { return IMPLIES_TOK; } -"<=>" { return IFF_TOK; } -"XOR" { return XOR_TOK; } -"IF" { return IF_TOK; } -"THEN" { return THEN_TOK; } -"ELSE" { return ELSE_TOK; } -"ELSIF" { return ELSIF_TOK; } -"END" { return END_TOK; } -"ENDIF" { return ENDIF_TOK; } -"BV" { return BV_TOK;} -"BITVECTOR" { return BV_TOK;} -"BOOLEAN" { return BOOLEAN_TOK;} -"<<" { return BVLEFTSHIFT_TOK;} -">>" { return BVRIGHTSHIFT_TOK;} -"BVPLUS" { return BVPLUS_TOK;} -"BVSUB" { return BVSUB_TOK;} -"BVUMINUS" { return BVUMINUS_TOK;} -"BVMULT" { return BVMULT_TOK;} -"BVDIV" { return BVDIV_TOK;} -"BVMOD" { return BVMOD_TOK;} -"SBVDIV" { return SBVDIV_TOK;} -"SBVMOD" { return SBVREM_TOK;} -"SBVREM" { return SBVREM_TOK;} -"~" { return BVNEG_TOK;} -"&" { return BVAND_TOK;} -"|" { return BVOR_TOK;} -"BVXOR" { return BVXOR_TOK;} -"BVNAND" { return BVNAND_TOK;} -"BVNOR" { return BVNOR_TOK;} -"BVXNOR" { return BVXNOR_TOK;} -"@" { return BVCONCAT_TOK;} -"BVLT" { return BVLT_TOK;} -"BVGT" { return BVGT_TOK;} -"BVLE" { return BVLE_TOK;} -"BVGE" { return BVGE_TOK;} -"BVSLT" { return BVSLT_TOK;} -"BVSGT" { return BVSGT_TOK;} -"BVSLE" { return BVSLE_TOK;} -"BVSGE" { return BVSGE_TOK;} -"BVSX" { return BVSX_TOK;} -"SBVLT" { return BVSLT_TOK;} -"SBVGT" { return BVSGT_TOK;} -"SBVLE" { return BVSLE_TOK;} -"SBVGE" { return BVSGE_TOK;} -"SX" { return BVSX_TOK;} -"BOOLEXTRACT" { return BOOLEXTRACT_TOK;} -"BOOLBV" { return BOOL_TO_BV_TOK;} -"ASSERT" { return ASSERT_TOK; } -"QUERY" { return QUERY_TOK; } -"FALSE" { return FALSELIT_TOK;} -"TRUE" { return TRUELIT_TOK;} -"IN" { return IN_TOK;} -"LET" { return LET_TOK;} -"COUNTEREXAMPLE" { return COUNTEREXAMPLE_TOK;} -"COUNTERMODEL" { return COUNTEREXAMPLE_TOK;} -"PUSH" { return PUSH_TOK;} -"POP" { return POP_TOK;} - -(({LETTER})|(_)({ANYTHING}))({ANYTHING})* { - - ASTNode nptr; - - if (BEEV::parserInterface->LookupSymbol(yytext,nptr)) // it's a symbol. - { - cvclval.node = BEEV::parserInterface->newNode(nptr); - if ((cvclval.node)->GetType() == BEEV::BOOLEAN_TYPE) - return FORMID_TOK; - else - return TERMID_TOK; - } - - // Making 4.4M strings took 1B instructions. So I split out the above case - // which occurs >90% of the time (so avoiding turning the char* into a string). - string str(yytext); - if (BEEV::parserInterface->letMgr.isLetDeclared(str)) // a let. - { - nptr= BEEV::parserInterface->letMgr.resolveLet(str); - cvclval.node = BEEV::parserInterface->newNode(nptr); - - if ((cvclval.node)->GetType() == BEEV::BOOLEAN_TYPE) - return FORMID_TOK; - else - return TERMID_TOK; - } - - // It hasn't been found. So it's not already declared. - // it has not been seen before. - cvclval.str = strdup(yytext); - return STRING_TOK; -} - -. { cvcerror("Illegal input character."); } -%% diff --git a/src/vendor/stp/src/parser/cvc.y b/src/vendor/stp/src/parser/cvc.y deleted file mode 100644 index 350618f47..000000000 --- a/src/vendor/stp/src/parser/cvc.y +++ /dev/null @@ -1,1062 +0,0 @@ -%{ - // -*- c++ -*- - /******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "parser.h" -#include "../cpp_interface/cpp_interface.h" - - using namespace std; - using namespace BEEV; - - // Suppress the bogus warning suppression in bison (it generates - // compile error) -#undef __GNUC_MINOR__ - -#define YYLTYPE_IS_TRIVIAL 1 -#define YYMAXDEPTH 1048576000 -#define YYERROR_VERBOSE 1 -#define YY_EXIT_FAILURE -1 - - extern int cvclex(void); - extern char* yytext; - extern int cvclineno; - int yyerror(const char *s) { - cout << "syntax error: line " << cvclineno << "\n" << s << endl; - FatalError(""); - return YY_EXIT_FAILURE; - }; - int yyerror(void* AssertsQuery, const char* s) { return yyerror(s); } - - %} - -%parse-param {void* AssertsQuery} - -%union { - - unsigned int uintval; /* for numerals in types. */ - struct { - //stores the indexwidth and valuewidth - //indexwidth is 0 iff type is bitvector. positive iff type is - //array, and stores the width of the indexing bitvector - unsigned int indexwidth; - //width of the bitvector type - unsigned int valuewidth; - } indexvaluewidth; - - //ASTNode,ASTVec - BEEV::ASTNode *node; - BEEV::ASTVec *vec; - vector * stringVec; - char* str; - - //Hash_Map to hold Array Updates during parse A map from array index - //to array values. To support the WITH construct - BEEV::ASTNodeMap * Index_To_UpdateValue; -}; - -%start cmd - -%token AND_TOK "AND" -%token OR_TOK "OR" -%token NOT_TOK "NOT" -%token EXCEPT_TOK "EXCEPT" -%token XOR_TOK "XOR" -%token NAND_TOK "NAND" -%token NOR_TOK "NOR" -%token IMPLIES_TOK "=>" -%token IFF_TOK "<=>" - -%token IF_TOK "IF" -%token THEN_TOK "THEN" -%token ELSE_TOK "ELSE" -%token ELSIF_TOK "ELSIF" -%token END_TOK "END" -%token ENDIF_TOK "ENDIF" -%token NEQ_TOK "/=" -%token ASSIGN_TOK ":=" - -%token BV_TOK "BV" -%token BVLEFTSHIFT_TOK "<<" -%token BVRIGHTSHIFT_TOK ">>" -%token BVPLUS_TOK "BVPLUS" -%token BVSUB_TOK "BVSUB" -%token BVUMINUS_TOK "BVUMINUS" -%token BVMULT_TOK "BVMULT" - -%token BVDIV_TOK "BVDIV" -%token BVMOD_TOK "BVMOD" -%token SBVDIV_TOK "SBVDIV" -%token SBVREM_TOK "SBVREM" - - -%token BVNEG_TOK "~" -%token BVAND_TOK "&" -%token BVOR_TOK "|" -%token BVXOR_TOK "BVXOR" -%token BVNAND_TOK "BVNAND" -%token BVNOR_TOK "BVNOR" -%token BVXNOR_TOK "BVXNOR" -%token BVCONCAT_TOK "@" - -%token BVLT_TOK "BVLT" -%token BVGT_TOK "BVGT" -%token BVLE_TOK "BVLE" -%token BVGE_TOK "BVGE" - -%token BVSLT_TOK "BVSLT" -%token BVSGT_TOK "BVSGT" -%token BVSLE_TOK "BVSLE" -%token BVSGE_TOK "BVSGE" -%token BOOL_TO_BV_TOK "BOOLBV" -%token BVSX_TOK "BVSX" -%token BOOLEXTRACT_TOK "BOOLEXTRACT" -%token ASSERT_TOK "ASSERT" -%token QUERY_TOK "QUERY" - -%token BOOLEAN_TOK "BOOLEAN" -%token ARRAY_TOK "ARRAY" -%token OF_TOK "OF" -%token WITH_TOK "WITH" - -%token TRUELIT_TOK "TRUE" -%token FALSELIT_TOK "FALSE" - -%token IN_TOK "IN" -%token LET_TOK "LET" - //%token COUNTEREXAMPLE_TOK "COUNTEREXAMPLE" -%token PUSH_TOK "PUSH" -%token POP_TOK "POP" - -%left IN_TOK -%left XOR_TOK -%left IFF_TOK -%right IMPLIES_TOK -%left OR_TOK -%left AND_TOK -%left NAND_TOK -%left NOR_TOK -%left NOT_TOK -%left BVCONCAT_TOK -%left BVOR_TOK -%left BVAND_TOK -%left BVXOR_TOK -%left BVNAND_TOK -%left BVNOR_TOK -%left BVXNOR_TOK -%left BVNEG_TOK -%left BVLEFTSHIFT_TOK BVRIGHTSHIFT_TOK -%left WITH_TOK - -%nonassoc '=' NEQ_TOK ASSIGN_TOK -%nonassoc BVLT_TOK BVLE_TOK BVGT_TOK BVGE_TOK -%nonassoc BVUMINUS_TOK BVPLUS_TOK BVSUB_TOK BVSX_TOK -%nonassoc '[' -%nonassoc '{' '.' '(' -%nonassoc BV_TOK - -%type Exprs -%type Asserts -%type FORM_IDs reverseFORM_IDs -%type Expr Formula ForDecl IfExpr ElseRestExpr IfForm ElseRestForm Assert Query ArrayUpdateExpr -%type Updates - -%type BvType BoolType ArrayType Type - -%token BVCONST_TOK -%token TERMID_TOK FORMID_TOK COUNTEREXAMPLE_TOK -%token NUMERAL_TOK -%token BIN_BASED_NUMBER -%token DEC_BASED_NUMBER -%token HEX_BASED_NUMBER -%token STRING_TOK - -%% - -cmd : other_cmd -{ - parserInterface->letMgr._parser_symbol_table.clear(); -} -| other_cmd counterexample -{ - parserInterface->letMgr._parser_symbol_table.clear(); -} -; - -counterexample : COUNTEREXAMPLE_TOK ';' -{ - parserInterface->getUserFlags().print_counterexample_flag = true; - (GlobalSTP->Ctr_Example)->PrintCounterExample(true); -} -; - -other_cmd : -/* other_cmd1 */ -/* { */ -/* ASTVec aaa = parserInterface->GetAsserts(); */ -/* if(aaa.size() == 0) */ -/* { */ -/* yyerror("Fatal Error: parsing: GetAsserts() call: no assertions: "); */ -/* } */ - -/* ASTNode asserts = */ -/* aaa.size() == 1 ? */ -/* aaa[0] : */ -/* parserInterface->CreateNode(AND, aaa); */ -/* ((ASTVec*)AssertsQuery)->push_back(asserts); */ -/* } */ -| Query -{ - ((ASTVec*)AssertsQuery)->push_back(parserInterface->CreateNode(TRUE)); - ((ASTVec*)AssertsQuery)->push_back(*$1); - delete $1; -} -| VarDecls Query -{ - ((ASTVec*)AssertsQuery)->push_back(parserInterface->CreateNode(TRUE)); - ((ASTVec*)AssertsQuery)->push_back(*$2); - delete $2; -} -| other_cmd1 Query -{ - ASTVec aaa = parserInterface->GetAsserts(); - if(aaa.size() == 0) - { - yyerror("Fatal Error: parsing: GetAsserts() call: no assertions: "); - } - - ASTNode asserts = - aaa.size() == 1 ? - aaa[0] : - parserInterface->CreateNode(AND, aaa); - ((ASTVec*)AssertsQuery)->push_back(asserts); - ((ASTVec*)AssertsQuery)->push_back(*$2); - delete $2; -} -; - -other_cmd1 : VarDecls Asserts -{ - delete $2; -} -| Asserts -{ - delete $1; -} -| other_cmd1 VarDecls Asserts -{ - delete $3; -} -; - -/* push : PUSH_TOK */ -/* { */ -/* ParserBM->Push(); */ -/* } */ -/* | */ -/* ; */ - -/* pop : POP_TOK */ -/* { */ -/* ParserBM->Pop(); */ -/* } */ -/* | */ -/* ; */ - -Asserts : Assert -{ - $$ = new ASTVec; - $$->push_back(*$1); - parserInterface->AddAssert(*$1); - delete $1; -} -| Asserts Assert -{ - $1->push_back(*$2); - parserInterface->AddAssert(*$2); - $$ = $1; - delete $2; -} -; - -Assert : ASSERT_TOK Formula ';' -{ - $$ = $2; - } -; - -Query : QUERY_TOK Formula ';' { parserInterface->AddQuery(*$2); $$ = $2;} -; - - -/* Grammar for Variable Declaration */ -VarDecls : VarDecl ';' -{ -} -| VarDecls VarDecl ';' -{ -} -; - -VarDecl : FORM_IDs ':' Type -{ - for(vector::iterator i=$1->begin(),iend=$1->end();i!=iend;i++) { - ASTNode s = BEEV::parserInterface->LookupOrCreateSymbol(*i); - s.SetIndexWidth($3.indexwidth); - s.SetValueWidth($3.valuewidth); - parserInterface->letMgr._parser_symbol_table.insert(s); - ParserBM->ListOfDeclaredVars.push_back(s); - } - delete $1; -} -| FORM_IDs ':' Type '=' Expr -{ - //do type checking. if doesn't pass then abort - BVTypeCheck(*$5); - if($3.indexwidth != $5->GetIndexWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - if($3.valuewidth != $5->GetValueWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - - for(vector::iterator i=$1->begin(),iend=$1->end();i!=iend;i++) { - parserInterface->letMgr.LetExprMgr(*i,*$5); - } - delete $5; - delete $1; -} -| FORM_IDs ':' Type '=' Formula -{ - //do type checking. if doesn't pass then abort - BVTypeCheck(*$5); - if($3.indexwidth != $5->GetIndexWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - if($3.valuewidth != $5->GetValueWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - - for(vector::iterator i=$1->begin(),iend=$1->end();i!=iend;i++) { - parserInterface->letMgr.LetExprMgr(*i,*$5); - } - delete $5; - delete $1; -} -; - -reverseFORM_IDs : STRING_TOK -{ - $$ = new vector(); - $$->push_back($1); - // delete $1; -} -| STRING_TOK ',' reverseFORM_IDs -{ - $3->push_back($1); - $$ = $3; - // delete $1; -} -; - -FORM_IDs : reverseFORM_IDs -{ - $$ = new vector($1->rbegin(),$1->rend()); - delete $1; -} -; - -ForDecl : FORMID_TOK ':' Type -{ - $1->SetIndexWidth($3.indexwidth); - $1->SetValueWidth($3.valuewidth); - parserInterface->letMgr._parser_symbol_table.insert(*$1); - $$ = $1; -} - -/* Grammar for Types */ -Type : BvType { $$ = $1; } -| BoolType { $$ = $1; } -| ArrayType { $$ = $1; } -; - -BvType : BV_TOK '(' NUMERAL_TOK ')' -{ - /*((indexwidth is 0) && (valuewidth>0)) iff type is BV*/ - $$.indexwidth = 0; - unsigned int length = $3; - if(length > 0) { - $$.valuewidth = length; - } - else - FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n"); -} -; -BoolType : BOOLEAN_TOK -{ - $$.indexwidth = 0; - $$.valuewidth = 0; -} -; -ArrayType : ARRAY_TOK BvType OF_TOK BvType -{ - $$.indexwidth = $2.valuewidth; - $$.valuewidth = $4.valuewidth; -} -; - -/*Grammar for ITEs which are a type of Term*/ -IfExpr : IF_TOK Formula THEN_TOK Expr ElseRestExpr -{ - unsigned int width = $4->GetValueWidth(); - if (width != $5->GetValueWidth()) - yyerror("Width mismatch in IF-THEN-ELSE"); - if($4->GetIndexWidth() != $5->GetIndexWidth()) - yyerror("Width mismatch in IF-THEN-ELSE"); - - BVTypeCheck(*$2); - BVTypeCheck(*$4); - BVTypeCheck(*$5); - $$ = new ASTNode(parserInterface->nf->CreateArrayTerm(ITE,$5->GetIndexWidth(), width, *$2, *$4, *$5)); - delete $2; - delete $4; - delete $5; -} -; - -ElseRestExpr : ELSE_TOK Expr ENDIF_TOK { $$ = $2; } -| ELSIF_TOK Expr THEN_TOK Expr ElseRestExpr -{ - unsigned int width = $2->GetValueWidth(); - if (width != $4->GetValueWidth() || width != $5->GetValueWidth()) - yyerror("Width mismatch in IF-THEN-ELSE"); - if ($2->GetIndexWidth() != $4->GetValueWidth() || $2->GetIndexWidth() != $5->GetValueWidth()) - yyerror("Width mismatch in IF-THEN-ELSE"); - - BVTypeCheck(*$2); - BVTypeCheck(*$4); - BVTypeCheck(*$5); - $$ = new ASTNode(parserInterface->nf->CreateArrayTerm(ITE, $5->GetIndexWidth(), width, *$2, *$4, *$5)); - delete $2; - delete $4; - delete $5; -} -; - -/* Grammar for formulas */ -Formula : '(' Formula ')' -{ - $$ = $2; -} -| FORMID_TOK -{ - $$ = new ASTNode(parserInterface->letMgr.ResolveID(*$1)); delete $1; -} -| FORMID_TOK '(' Expr ')' -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(PARAMBOOL,*$1,*$3)); - delete $1; - delete $3; -} -| BOOLEXTRACT_TOK '(' Expr ',' NUMERAL_TOK ')' -{ - unsigned int width = $3->GetValueWidth(); - if(width <= (unsigned)$5) - yyerror("Fatal Error: BOOLEXTRACT: trying to boolextract a bit which beyond range"); - - ASTNode hi = parserInterface->CreateBVConst(32, $5); - ASTNode low = parserInterface->CreateBVConst(32, $5); - ASTNode n = parserInterface->nf->CreateTerm(BVEXTRACT,1,*$3,hi,low); - ASTNode one = parserInterface->CreateBVConst(1,1); - ASTNode * out = new ASTNode(parserInterface->nf->CreateNode(EQ,n,one)); - - $$ = out; - delete $3; -} -| Expr '=' Expr -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(EQ, *$1, *$3)); - $$ = n; - delete $1; - delete $3; -} -| Expr NEQ_TOK Expr -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(NOT, parserInterface->nf->CreateNode(EQ, *$1, *$3))); - $$ = n; - delete $1; - delete $3; -} -| NOT_TOK Formula -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(NOT, *$2)); - delete $2; -} -| Formula OR_TOK Formula %prec OR_TOK -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(OR, *$1, *$3)); - delete $1; - delete $3; -} -| Formula NOR_TOK Formula -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(NOR, *$1, *$3)); - delete $1; - delete $3; -} -| Formula AND_TOK Formula %prec AND_TOK -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(AND, *$1, *$3)); - delete $1; - delete $3; -} -| Formula NAND_TOK Formula -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(NAND, *$1, *$3)); - delete $1; - delete $3; -} -| Formula IMPLIES_TOK Formula -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(IMPLIES, *$1, *$3)); - delete $1; - delete $3; -} -| Formula IFF_TOK Formula -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(IFF, *$1, *$3)); - delete $1; - delete $3; -} -| Formula XOR_TOK Formula -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(XOR, *$1, *$3)); - delete $1; - delete $3; -} -| BVLT_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVLT, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVGT_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVGT, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVLE_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVLE, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVGE_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVGE, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVSLT_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVSLT, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVSGT_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVSGT, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVSLE_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVSLE, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVSGE_TOK '(' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateNode(BVSGE, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| IfForm -| TRUELIT_TOK -{ - $$ = new ASTNode(parserInterface->CreateNode(TRUE)); - assert($$->GetIndexWidth() == 0); - assert($$->GetValueWidth() == 0); -} -| FALSELIT_TOK -{ - $$ = new ASTNode(parserInterface->CreateNode(FALSE)); - assert($$->GetIndexWidth() == 0); - assert($$->GetValueWidth() == 0); -} - -| LET_TOK LetDecls IN_TOK Formula -{ - $$ = $4; - //Cleanup the LetIDToExprMap - parserInterface->letMgr.CleanupLetIDMap(); -} -; - -/*Grammar for ITEs which are Formulas */ -IfForm : IF_TOK Formula THEN_TOK Formula ElseRestForm -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(ITE, *$2, *$4, *$5)); - delete $2; - delete $4; - delete $5; -} -; - -ElseRestForm : ELSE_TOK Formula ENDIF_TOK { $$ = $2; } -| ELSIF_TOK Formula THEN_TOK Formula ElseRestForm -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(ITE, *$2, *$4, *$5)); - delete $2; - delete $4; - delete $5; -} | STRING_TOK -{ - cerr << "Unresolved symbol:" << $1 << endl; - yyerror("bad symbol"); -} -; - -/*Grammar for a list of expressions*/ -Exprs : Expr -{ - $$ = new ASTVec; - BVTypeCheck(*$1); - $$->push_back(*$1); - delete $1; -} -| Exprs ',' Expr -{ - $1->push_back(*$3); - BVTypeCheck(*$3); - $$ = $1; - delete $3; -} -; - -/* Grammar for Expr */ -Expr : TERMID_TOK { $$ = new ASTNode(parserInterface->letMgr.ResolveID(*$1)); delete $1;} -| '(' Expr ')' { $$ = $2; } -| BVCONST_TOK { $$ = $1; } -| BOOL_TO_BV_TOK '(' Formula ')' -{ - BVTypeCheck(*$3); - ASTNode one = parserInterface->CreateBVConst(1,1); - ASTNode zero = parserInterface->CreateBVConst(1,0); - - //return ITE(*$3, length(1), 0bin1, 0bin0) - $$ = new ASTNode(parserInterface->nf->CreateTerm(ITE,1,*$3,one,zero)); - delete $3; -} -| NUMERAL_TOK BIN_BASED_NUMBER -{ - std::string vals($2); - $$ = new ASTNode(parserInterface->CreateBVConst(vals, 2, $1)); - free($2); -} -| NUMERAL_TOK DEC_BASED_NUMBER -{ - std::string vals($2); - $$ = new ASTNode(parserInterface->CreateBVConst(vals, 10, $1)); - free($2); -} -| NUMERAL_TOK HEX_BASED_NUMBER -{ - std::string vals($2); - $$ = new ASTNode(parserInterface->CreateBVConst(vals, 16, $1)); - free($2); -} -| Expr '[' Expr ']' -{ - // valuewidth is same as array, indexwidth is 0. - unsigned int width = $1->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(READ, width, *$1, *$3)); - $$ = n; - - delete $1; - delete $3; -} -| Expr '(' Expr ')' //array read but in the form of a uninterpreted function application -{ - // valuewidth is same as array, indexwidth is 0. - unsigned int width = $1->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(READ, width, *$1, *$3)); - $$ = n; - - delete $1; - delete $3; -} -| Expr '[' NUMERAL_TOK ':' NUMERAL_TOK ']' -{ - int width = $3 - $5 + 1; - if (width < 0) - yyerror("Negative width in extract"); - - if((unsigned)$3 >= $1->GetValueWidth()) - yyerror("Parsing: Wrong width in BVEXTRACT\n"); - - ASTNode hi = parserInterface->CreateBVConst(32, $3); - ASTNode low = parserInterface->CreateBVConst(32, $5); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVEXTRACT, width, *$1,hi,low)); - $$ = n; - delete $1; -} -| BVNEG_TOK Expr -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVNEG, width, *$2)); - $$ = n; - delete $2; -} -| Expr BVAND_TOK Expr -{ - unsigned int width = $1->GetValueWidth(); - if (width != $3->GetValueWidth()) { - yyerror("Width mismatch in AND"); - } - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVAND, width, *$1, *$3)); - $$ = n; - delete $1; - delete $3; -} -| Expr BVOR_TOK Expr -{ - unsigned int width = $1->GetValueWidth(); - if (width != $3->GetValueWidth()) { - yyerror("Width mismatch in OR"); - } - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVOR, width, *$1, *$3)); - $$ = n; - delete $1; - delete $3; -} -| BVXOR_TOK '(' Expr ',' Expr ')' -{ - unsigned int width = $3->GetValueWidth(); - if (width != $5->GetValueWidth()) { - yyerror("Width mismatch in XOR"); - } - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVXOR, width, *$3, *$5)); - $$ = n; - delete $3; - delete $5; -} -| BVNAND_TOK '(' Expr ',' Expr ')' -{ - unsigned int width = $3->GetValueWidth(); - if (width != $5->GetValueWidth()) { - yyerror("Width mismatch in NAND"); - } - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVNAND, width, *$3, *$5)); - $$ = n; - - delete $3; - delete $5; -} -| BVNOR_TOK '(' Expr ',' Expr ')' -{ - unsigned int width = $3->GetValueWidth(); - if (width != $5->GetValueWidth()) { - yyerror("Width mismatch in NOR"); - } - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVNOR, width, *$3, *$5)); - $$ = n; - - delete $3; - delete $5; -} -| BVXNOR_TOK '(' Expr ',' Expr ')' -{ - unsigned int width = $3->GetValueWidth(); - if (width != $5->GetValueWidth()) { - yyerror("Width mismatch in NOR"); - } - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVXNOR, width, *$3, *$5)); - $$ = n; - - delete $3; - delete $5; -} -| BVSX_TOK '(' Expr ',' NUMERAL_TOK ')' -{ - //width of the expr which is being sign - //extended. $5 is the resulting length of the - //signextended expr - BVTypeCheck(*$3); - if($3->GetValueWidth() == $5) { - $$ = $3; - } - else { - ASTNode width = parserInterface->CreateBVConst(32,$5); - ASTNode *n = - new ASTNode(parserInterface->nf->CreateTerm(BVSX, $5,*$3,width)); - $$ = n; - delete $3; - } -} -| Expr BVCONCAT_TOK Expr -{ - unsigned int width = $1->GetValueWidth() + $3->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVCONCAT, width, *$1, *$3)); - $$ = n; - - delete $1; - delete $3; -} -| Expr BVLEFTSHIFT_TOK NUMERAL_TOK -{ - if (0 == $3) - { - $$ = $1; - } - else - { - ASTNode zero_bits = parserInterface->CreateZeroConst($3); - ASTNode * n = - new ASTNode(parserInterface->nf->CreateTerm(BVCONCAT, - $1->GetValueWidth() + $3, *$1, zero_bits)); - $$ = n; - delete $1; - } -} -| Expr BVRIGHTSHIFT_TOK NUMERAL_TOK -{ - ASTNode len = parserInterface->CreateZeroConst($3); - unsigned int w = $1->GetValueWidth(); - - //the amount by which you are rightshifting - //is less-than/equal-to the length of input - //bitvector - if((unsigned)$3 < w) { - ASTNode hi = parserInterface->CreateBVConst(32,w-1); - ASTNode low = parserInterface->CreateBVConst(32,$3); - ASTNode extract = parserInterface->nf->CreateTerm(BVEXTRACT,w-$3,*$1,hi,low); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVCONCAT, w,len, extract)); - $$ = n; - } - else - $$ = new ASTNode(parserInterface->CreateZeroConst(w)); - - delete $1; -} -| Expr BVRIGHTSHIFT_TOK Expr -{ - // VARIABLE RIGHT SHIFT - // - // $1 (THEEXPR) is being shifted - // - // $3 is the variable shift amount - unsigned int width = $1->GetValueWidth(); - ASTNode * ret = new ASTNode(parserInterface->nf->CreateTerm(BVRIGHTSHIFT, width, *$1, *$3)); - BVTypeCheck(*ret); - //cout << *ret; - - $$ = ret; - delete $1; - delete $3; -} -| BVPLUS_TOK '(' NUMERAL_TOK ',' Exprs ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVPLUS, $3, *$5)); - $$ = n; - - delete $5; -} -| BVSUB_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVSUB, $3, *$5, *$7)); - $$ = n; - - delete $5; - delete $7; -} -| BVUMINUS_TOK '(' Expr ')' -{ - unsigned width = $3->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVUMINUS,width,*$3)); - $$ = n; - delete $3; -} -| BVMULT_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVMULT, $3, *$5, *$7)); - $$ = n; - - delete $5; - delete $7; -} -| BVDIV_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVDIV, $3, *$5, *$7)); - $$ = n; - - delete $5; - delete $7; -} -| BVMOD_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVMOD, $3, *$5, *$7)); - $$ = n; - - delete $5; - delete $7; -} -| SBVDIV_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(SBVDIV, $3, *$5, *$7)); - $$ = n; - - delete $5; - delete $7; -} -| SBVREM_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')' -{ - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(SBVREM, $3, *$5, *$7)); - $$ = n; - delete $5; - delete $7; -} -| IfExpr { $$ = $1; } -| ArrayUpdateExpr -| LET_TOK LetDecls IN_TOK Expr -{ - $$ = $4; -} | STRING_TOK -{ - cerr << "Unresolved symbol:" << $1 << endl; - yyerror("bad symbol"); -} -; - -/*Grammar for Array Update Expr*/ -ArrayUpdateExpr : Expr WITH_TOK Updates -{ - ASTNode * result; - unsigned int width = $1->GetValueWidth(); - - ASTNodeMap::iterator it = $3->begin(); - ASTNodeMap::iterator itend = $3->end(); - result = new ASTNode(parserInterface->nf->CreateArrayTerm(WRITE, - $1->GetIndexWidth(), - width, - *$1, - (*it).first, - (*it).second)); - BVTypeCheck(*result); - for(it++;it!=itend;it++) { - result = new ASTNode(parserInterface->nf->CreateArrayTerm(WRITE, - $1->GetIndexWidth(), - width, - *result, - (*it).first, - (*it).second)); - BVTypeCheck(*result); - } - BVTypeCheck(*result); - $$ = result; - delete $3; - delete $1; -} -; - -Updates : '[' Expr ']' ASSIGN_TOK Expr -{ - $$ = new ASTNodeMap(); - (*$$)[*$2] = *$5; - delete $2; - delete $5; -} -| Updates WITH_TOK '[' Expr ']' ASSIGN_TOK Expr -{ - (*$1)[*$4] = *$7; - delete $4; - delete $7; -} -; - -/*Grammar for LET Expr*/ -LetDecls : LetDecl -| LetDecls ',' LetDecl -; - -LetDecl : STRING_TOK '=' Expr -{ - //Expr must typecheck - BVTypeCheck(*$3); - - //set the valuewidth of the identifier - - //populate the hashtable from LET-var --> - //LET-exprs and then process them: - // - //1. ensure that LET variables do not clash - //1. with declared variables. - // - //2. Ensure that LET variables are not - //2. defined more than once - parserInterface->letMgr.LetExprMgr($1,*$3); - free($1); - delete $3; -} -| STRING_TOK ':' Type '=' Expr -{ - //do type checking. if doesn't pass then abort - BVTypeCheck(*$5); - - if($3.indexwidth != $5->GetIndexWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - if($3.valuewidth != $5->GetValueWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - - parserInterface->letMgr.LetExprMgr($1,*$5); - free( $1); - delete $5; -} -| STRING_TOK '=' Formula -{ - //Expr must typecheck - BVTypeCheck(*$3); - - //Do LET-expr management - parserInterface->letMgr.LetExprMgr($1,*$3); - free( $1); - delete $3; -} -| STRING_TOK ':' Type '=' Formula -{ - //do type checking. if doesn't pass then abort - BVTypeCheck(*$5); - - if($3.indexwidth != $5->GetIndexWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - if($3.valuewidth != $5->GetValueWidth()) - yyerror("Fatal Error: parsing: LET Expr: Type check fail: "); - - //Do LET-expr management - parserInterface->letMgr.LetExprMgr($1,*$5); - free( $1); - delete $5; -} -; - -%% diff --git a/src/vendor/stp/src/parser/parser.h b/src/vendor/stp/src/parser/parser.h deleted file mode 100644 index 132958450..000000000 --- a/src/vendor/stp/src/parser/parser.h +++ /dev/null @@ -1,22 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef PARSER_H -#define PARSER_H - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../STPManager/STP.h" - -namespace BEEV -{ - //external parser table for declared symbols. - //extern ASTNodeSet _parser_symbol_table; -}; //end of namespace -#endif diff --git a/src/vendor/stp/src/parser/smt.lex b/src/vendor/stp/src/parser/smt.lex deleted file mode 100644 index a6e1c6917..000000000 --- a/src/vendor/stp/src/parser/smt.lex +++ /dev/null @@ -1,253 +0,0 @@ -%{ - /******************************************************************** - * AUTHORS: Vijay Ganesh, David L. Dill, Trevor Hansen - * - * BEGIN DATE: July, 2006 - * - * This file is modified version of the CVCL's smtlib.lex file. Please - * see CVCL license below - ********************************************************************/ - - /******************************************************************** - * \file smtlib.lex - * - * Author: Sergey Berezin, Clark Barrett - * - * Created: Apr 30 2005 - * - *


- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford - * Junior University and by New York University. - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - * - *
- ********************************************************************/ - // -*- c++ -*- -#include -#include "parser.h" -#include "parsesmt.hpp" -#include "../cpp_interface/cpp_interface.h" - - using namespace std; - using namespace BEEV; - - extern char *smttext; - extern int smterror (const char *msg); - - // File-static (local to this file) variables and functions - static std::string _string_lit; - static char escapeChar(char c) { - switch(c) { - case 'n': return '\n'; - case 't': return '\t'; - default: return c; - } - } -%} - -%option noyywrap -%option nounput -%option noreject -%option noyymore -%option yylineno - -%x COMMENT -%x STRING_LITERAL -%x USER_VALUE - -LETTER ([a-zA-Z]) -DIGIT ([0-9]) -OPCHAR (['\.\_]) -ANYTHING ({LETTER}|{DIGIT}|{OPCHAR}) - -%% -[ \n\t\r\f] { /* sk'ip whitespace */ } -{DIGIT}+ { smtlval.uintval = strtoul(smttext, NULL, 10); return NUMERAL_TOK; } - - - bv{DIGIT}+ { smtlval.str = new std::string(smttext+2); return BVCONST_TOK; } - -bit{DIGIT}+ { - char c = smttext[3]; - if (c == '1') { - smtlval.node = new BEEV::ASTNode(parserInterface->CreateOneConst(1)); - } - else { - smtlval.node = new BEEV::ASTNode(parserInterface->CreateZeroConst(1)); - } - return BITCONST_TOK; - }; - - -";" { BEGIN COMMENT; } -"\n" { BEGIN INITIAL; /* return to normal mode */} -. { /* stay in comment mode */ } - -"\"" { BEGIN STRING_LITERAL; - _string_lit.erase(_string_lit.begin(), - _string_lit.end()); } -"\\". { /* escape characters (like \n or \") */ - _string_lit.insert(_string_lit.end(), - escapeChar(smttext[1])); } -"\"" { BEGIN INITIAL; /* return to normal mode */ - smtlval.str = new std::string(_string_lit); - return STRING_TOK; } -. { _string_lit.insert(_string_lit.end(),*smttext); } - - -"{" { BEGIN USER_VALUE; - _string_lit.erase(_string_lit.begin(), - _string_lit.end()); } -"\\"[{}] { /* escape characters */ - _string_lit.insert(_string_lit.end(),smttext[1]); } - -"}" { BEGIN INITIAL; /* return to normal mode */ - smtlval.str = new std::string(_string_lit); - return USER_VAL_TOK; } -"\n" { _string_lit.insert(_string_lit.end(),'\n');} -. { _string_lit.insert(_string_lit.end(),*smttext); } - -"BitVec" { return BITVEC_TOK;} -"Array" { return ARRAY_TOK;} -"true" { return TRUE_TOK; } -"false" { return FALSE_TOK; } -"not" { return NOT_TOK; } -"implies" { return IMPLIES_TOK; } -"ite" { return ITE_TOK;} -"if_then_else" { return ITE_TOK;} // This is in the SMTLIB benchmarks. -"and" { return AND_TOK; } -"or" { return OR_TOK; } -"xor" { return XOR_TOK; } -"iff" { return IFF_TOK; } -"let" { return LET_TOK; } -"flet" { return FLET_TOK; } -"notes" { return NOTES_TOK; } -"sorts" { return SORTS_TOK; } -"funs" { return FUNS_TOK; } -"preds" { return PREDS_TOK; } -"extensions" { return EXTENSIONS_TOK; } -"definition" { return DEFINITION_TOK; } -"axioms" { return AXIOMS_TOK; } -"logic" { return LOGIC_TOK; } -"sat" { return SAT_TOK; } -"unsat" { return UNSAT_TOK; } -"unknown" { return UNKNOWN_TOK; } -"assumption" { return ASSUMPTION_TOK; } -"formula" { return FORMULA_TOK; } -"status" { return STATUS_TOK; } -"difficulty" { return DIFFICULTY_TOK; } -"benchmark" { return BENCHMARK_TOK; } -"source" { return SOURCE_TOK;} -"category" { return CATEGORY_TOK;} -"extrasorts" { return EXTRASORTS_TOK; } -"extrafuns" { return EXTRAFUNS_TOK; } -"extrapreds" { return EXTRAPREDS_TOK; } -"language" { return LANGUAGE_TOK; } -"distinct" { return DISTINCT_TOK; } -"select" { return SELECT_TOK; } -"store" { return STORE_TOK; } -":" { return COLON_TOK; } -"\[" { return LBRACKET_TOK; } -"\]" { return RBRACKET_TOK; } -"(" { return LPAREN_TOK; } -")" { return RPAREN_TOK; } -"$" { return DOLLAR_TOK; } -"?" { return QUESTION_TOK; } -"=" {return EQ_TOK;} - -"nand" { return NAND_TOK;} -"nor" { return NOR_TOK;} -"bvshl" { return BVLEFTSHIFT_1_TOK;} -"bvlshr" { return BVRIGHTSHIFT_1_TOK;} -"bvashr" { return BVARITHRIGHTSHIFT_TOK;} -"bvadd" { return BVPLUS_TOK;} -"bvsub" { return BVSUB_TOK;} -"bvnot" { return BVNOT_TOK;} -"bvmul" { return BVMULT_TOK;} -"bvudiv" { return BVDIV_TOK;} -"bvsdiv" { return SBVDIV_TOK;} -"bvurem" { return BVMOD_TOK;} -"bvsrem" { return SBVREM_TOK;} -"bvsmod" { return SBVMOD_TOK;} -"bvneg" { return BVNEG_TOK;} -"bvand" { return BVAND_TOK;} -"bvor" { return BVOR_TOK;} -"bvxor" { return BVXOR_TOK;} -"bvnand" { return BVNAND_TOK;} -"bvnor" { return BVNOR_TOK;} -"bvxnor" { return BVXNOR_TOK;} -"concat" { return BVCONCAT_TOK;} -"extract" { return BVEXTRACT_TOK;} -"bvlt" { return BVLT_TOK;} -"bvgt" { return BVGT_TOK;} -"bvleq" { return BVLE_TOK;} -"bvgeq" { return BVGE_TOK;} -"bvult" { return BVLT_TOK;} -"bvugt" { return BVGT_TOK;} -"bvuleq" { return BVLE_TOK;} -"bvugeq" { return BVGE_TOK;} -"bvule" { return BVLE_TOK;} -"bvuge" { return BVGE_TOK;} - -"bvslt" { return BVSLT_TOK;} -"bvsgt" { return BVSGT_TOK;} -"bvsleq" { return BVSLE_TOK;} -"bvsgeq" { return BVSGE_TOK;} -"bvsle" { return BVSLE_TOK;} -"bvsge" { return BVSGE_TOK;} - -"bvcomp" { return BVCOMP_TOK;} - - -"zero_extend" { return BVZX_TOK;} -"sign_extend" { return BVSX_TOK;} -"repeat" { return BVREPEAT_TOK;} - -"rotate_left" { return BVROTATE_LEFT_TOK;} -"rotate_right" { return BVROTATE_RIGHT_TOK;} - -"boolextract" { return BOOLEXTRACT_TOK;} -"boolbv" { return BOOL_TO_BV_TOK;} - -(({LETTER})|(_)({ANYTHING}))({ANYTHING})* { - string str(smttext); - bool found = false; - ASTNode nptr; - - if (BEEV::parserInterface->isSymbolAlreadyDeclared(str)) // it's a symbol. - { - nptr= BEEV::parserInterface->LookupOrCreateSymbol(str); - found = true; - } - else if (BEEV::parserInterface->letMgr.isLetDeclared(str)) // a let. - { - nptr= BEEV::parserInterface->letMgr.resolveLet(str); - found = true; - } - - if (found) - { - smtlval.node = BEEV::parserInterface->newNode(nptr); - if ((smtlval.node)->GetType() == BEEV::BOOLEAN_TYPE) - return FORMID_TOK; - else - return TERMID_TOK; - } - - // It hasn't been found. So it's not already declared. - // it has not been seen before. - smtlval.str = new std::string(str); - return STRING_TOK; -} -. { smterror("Illegal input character."); } -%% diff --git a/src/vendor/stp/src/parser/smt.y b/src/vendor/stp/src/parser/smt.y deleted file mode 100644 index e7b0ea7d8..000000000 --- a/src/vendor/stp/src/parser/smt.y +++ /dev/null @@ -1,1114 +0,0 @@ -%{ - /******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: July, 2006 - * - * This file is modified version of the CVCL's smtlib.y file. Please - * see CVCL license below - ********************************************************************/ - - /******************************************************************** - * - * \file smtlib.y - * - * Author: Sergey Berezin, Clark Barrett - * - * Created: Apr 30 2005 - * - *
- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford - * Junior University and by New York University. - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - * - *
- ********************************************************************/ - // -*- c++ -*- - -#include "../cpp_interface/cpp_interface.h" - - using namespace std; - using namespace BEEV; - - // Suppress the bogus warning suppression in bison (it generates - // compile error) -#undef __GNUC_MINOR__ - - extern char* smttext; - extern int smtlineno; - extern int smtlex(void); - - int yyerror(const char *s) { - cout << "syntax error: line " << smtlineno << "\n" << s << endl; - cout << " token: " << smttext << endl; - FatalError(""); - return 1; - } - int yyerror(void* AssertsQuery, const char* s) { return yyerror(s); } - - ASTNode query; -#define YYLTYPE_IS_TRIVIAL 1 -#define YYMAXDEPTH 104857600 -#define YYERROR_VERBOSE 1 -#define YY_EXIT_FAILURE -1 - %} - -%parse-param {void* AssertsQuery} - -%union { - // FIXME: Why is this not an UNSIGNED int? - int uintval; /* for numerals in types. */ - - // for BV32 BVCONST - unsigned long long ullval; - - struct { - //stores the indexwidth and valuewidth - //indexwidth is 0 iff type is bitvector. positive iff type is - //array, and stores the width of the indexing bitvector - unsigned int indexwidth; - //width of the bitvector type - unsigned int valuewidth; - } indexvaluewidth; - - //ASTNode,ASTVec - BEEV::ASTNode *node; - BEEV::ASTVec *vec; - std::string *str; -}; - -%start cmd - -%type sort_symb sort_symbs -%type status -%type bench_attributes an_formulas an_terms - -%type benchmark bench_attribute -%type an_term an_nonbvconst_term an_formula - -%type var fvar -%type user_value logic_name bench_name - -%token NUMERAL_TOK -%token BVCONST_TOK -%token BITCONST_TOK -%token FORMID_TOK TERMID_TOK -%token STRING_TOK -%token USER_VAL_TOK -%token SOURCE_TOK -%token CATEGORY_TOK -%token DIFFICULTY_TOK -%token BITVEC_TOK -%token ARRAY_TOK -%token SELECT_TOK -%token STORE_TOK -%token TRUE_TOK -%token FALSE_TOK -%token NOT_TOK -%token IMPLIES_TOK -%token ITE_TOK -%token AND_TOK -%token OR_TOK -%token XOR_TOK -%token IFF_TOK -%token EXISTS_TOK -%token FORALL_TOK -%token LET_TOK -%token FLET_TOK -%token NOTES_TOK -%token CVC_COMMAND_TOK -%token SORTS_TOK -%token FUNS_TOK -%token PREDS_TOK -%token EXTENSIONS_TOK -%token DEFINITION_TOK -%token AXIOMS_TOK -%token LOGIC_TOK -%token COLON_TOK -%token LBRACKET_TOK -%token RBRACKET_TOK -%token LPAREN_TOK -%token RPAREN_TOK -%token SAT_TOK -%token UNSAT_TOK -%token UNKNOWN_TOK -%token ASSUMPTION_TOK -%token FORMULA_TOK -%token STATUS_TOK -%token BENCHMARK_TOK -%token EXTRASORTS_TOK -%token EXTRAFUNS_TOK -%token EXTRAPREDS_TOK -%token LANGUAGE_TOK -%token DOLLAR_TOK -%token QUESTION_TOK -%token DISTINCT_TOK -%token SEMICOLON_TOK -%token EOF_TOK -%token EQ_TOK - /*BV SPECIFIC TOKENS*/ -%token NAND_TOK -%token NOR_TOK -%token NEQ_TOK -%token ASSIGN_TOK -%token BV_TOK -%token BOOLEAN_TOK -%token BVLEFTSHIFT_1_TOK -%token BVRIGHTSHIFT_1_TOK -%token BVARITHRIGHTSHIFT_TOK -%token BVPLUS_TOK -%token BVSUB_TOK -%token BVNOT_TOK //bvneg in CVCL -%token BVMULT_TOK -%token BVDIV_TOK -%token SBVDIV_TOK -%token BVMOD_TOK -%token SBVREM_TOK -%token SBVMOD_TOK -%token BVNEG_TOK //bvuminus in CVCL -%token BVAND_TOK -%token BVOR_TOK -%token BVXOR_TOK -%token BVNAND_TOK -%token BVNOR_TOK -%token BVXNOR_TOK -%token BVCONCAT_TOK -%token BVLT_TOK -%token BVGT_TOK -%token BVLE_TOK -%token BVGE_TOK -%token BVSLT_TOK -%token BVSGT_TOK -%token BVSLE_TOK -%token BVSGE_TOK -%token BVSX_TOK -%token BVZX_TOK -%token BVROTATE_RIGHT_TOK -%token BVROTATE_LEFT_TOK -%token BVREPEAT_TOK -%token BVCOMP_TOK - -%token BOOLEXTRACT_TOK -%token BOOL_TO_BV_TOK -%token BVEXTRACT_TOK - -%left LBRACKET_TOK RBRACKET_TOK - -%% - -cmd: -benchmark -{ - ASTNode assumptions; - if($1 == NULL) - { - assumptions = parserInterface->CreateNode(TRUE); - } - else - { - assumptions = *$1; - } - - if(query.IsNull()) - { - query = parserInterface->CreateNode(FALSE); - } - - ((ASTVec*)AssertsQuery)->push_back(assumptions); - ((ASTVec*)AssertsQuery)->push_back(query); - delete $1; - parserInterface->letMgr.cleanupParserSymbolTable(); - query = ASTNode(); - YYACCEPT; -} -; - -benchmark: -LPAREN_TOK BENCHMARK_TOK bench_name bench_attributes RPAREN_TOK -{ - if($4 != NULL){ - if($4->size() > 1) - $$ = new ASTNode(parserInterface->CreateNode(AND,*$4)); - else if($4->size() ==1) - $$ = new ASTNode((*$4)[0]); - else - $$ = new ASTNode(parserInterface->CreateNode(TRUE)); - delete $4; - } - else { - $$ = NULL; - } - delete $3; //discard the benchmarkname. -} -/* | EOF_TOK */ -/* { */ -/* } */ -; - -bench_name: -STRING_TOK -{ -} -; - -bench_attributes: -bench_attribute -{ - $$ = new ASTVec; - if ($1 != NULL) { - $$->push_back(*$1); - parserInterface->AddAssert(*$1); - delete $1; - } -} -| bench_attributes bench_attribute -{ - if ($1 != NULL && $2 != NULL) { - $1->push_back(*$2); - parserInterface->AddAssert(*$2); - $$ = $1; - delete $2; - } -} -; - -bench_attribute: -COLON_TOK ASSUMPTION_TOK an_formula -{ - //assumptions are like asserts - $$ = $3; -} -| COLON_TOK FORMULA_TOK an_formula -{ - // Previously this would call AddQuery() on the negation. - // But if multiple formula were (eroneously) present - // it discarded all but the last formula. Allowing multiple - // formula and taking the conjunction of them along with all - // the assumptions is what the other solvers do. - - //assumptions are like asserts - $$ = $3; -} -| COLON_TOK STATUS_TOK status -{ - $$ = NULL; -} -| COLON_TOK LOGIC_TOK logic_name -{ - if (!(0 == strcmp($3->c_str(),"QF_UFBV") || - 0 == strcmp($3->c_str(),"QF_BV") || - //0 == strcmp($3->c_str(),"QF_UF") || - 0 == strcmp($3->c_str(),"QF_AUFBV"))) { - yyerror("Wrong input logic:"); - } - delete $3; - $$ = NULL; -} -| COLON_TOK EXTRAFUNS_TOK LPAREN_TOK var_decls RPAREN_TOK -{ - $$ = NULL; -} -| COLON_TOK EXTRAPREDS_TOK LPAREN_TOK var_decls RPAREN_TOK -{ - $$ = NULL; -} -| annotation -{ - $$ = NULL; -} -; - -logic_name: -STRING_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK -{ - $$ = $1; -} -| STRING_TOK -{ - $$ = $1; -} -; - -status: -SAT_TOK { - input_status = TO_BE_SATISFIABLE; - $$ = NULL; -} -| UNSAT_TOK { - input_status = TO_BE_UNSATISFIABLE; - $$ = NULL; - } -| UNKNOWN_TOK -{ - input_status = TO_BE_UNKNOWN; - $$ = NULL; -} -; - - -/* annotations: */ -/* annotation */ -/* { */ -/* } */ -/* | annotations annotation */ -/* { */ -/* } */ -/* ; */ - -annotation: -attribute -{ -} -| attribute user_value -{ -} -; - -user_value: -USER_VAL_TOK -{ - //cerr << "Printing user_value: " << *$1 << endl; - delete $1; -} -; - -attribute: -COLON_TOK SOURCE_TOK -{ -} -| COLON_TOK CATEGORY_TOK -{ -} -| COLON_TOK DIFFICULTY_TOK -; - -sort_symbs: -sort_symb -{ - //a single sort symbol here means either a BitVec or a Boolean - $$.indexwidth = $1.indexwidth; - $$.valuewidth = $1.valuewidth; -} -| sort_symb sort_symb -{ - //two sort symbols mean f: type --> type - $$.indexwidth = $1.valuewidth; - $$.valuewidth = $2.valuewidth; -} -; - -// There are some gulwani benchmarks that create multiple variables in the same header. -// Maybe you shouldn'.t.. -var_decls: -var_decl -{} -| -var_decls var_decl -{} -; - - - -var_decl: -LPAREN_TOK STRING_TOK sort_symbs RPAREN_TOK -{ - ASTNode s = BEEV::parserInterface->LookupOrCreateSymbol($2->c_str()); - //Sort_symbs has the indexwidth/valuewidth. Set those fields in - //var - s.SetIndexWidth($3.indexwidth); - s.SetValueWidth($3.valuewidth); - parserInterface->letMgr._parser_symbol_table.insert(s); - delete $2; -} -| LPAREN_TOK STRING_TOK RPAREN_TOK -{ - ASTNode s = BEEV::parserInterface->LookupOrCreateSymbol($2->c_str()); - s.SetIndexWidth(0); - s.SetValueWidth(0); - parserInterface->letMgr._parser_symbol_table.insert(s); - //Sort_symbs has the indexwidth/valuewidth. Set those fields in - //var - delete $2; -} -; - -an_formulas: -an_formula -{ - $$ = new ASTVec; - if ($1 != NULL) { - $$->push_back(*$1); - delete $1; - } -} -| -an_formulas an_formula -{ - if ($1 != NULL && $2 != NULL) { - $1->push_back(*$2); - $$ = $1; - delete $2; - } -} -; - -an_formula: -TRUE_TOK -{ - $$ = new ASTNode(parserInterface->CreateNode(TRUE)); - assert(0 == $$->GetIndexWidth()); - assert(0 == $$->GetValueWidth()); -} -| FALSE_TOK -{ - $$ = new ASTNode(parserInterface->CreateNode(FALSE)); - assert(0 == $$->GetIndexWidth()); - assert(0 == $$->GetValueWidth()); -} -| fvar -{ - $$ = $1; -} -| LPAREN_TOK EQ_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = new ASTNode(parserInterface->CreateNode(EQ,*$3, *$4)); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK DISTINCT_TOK an_terms RPAREN_TOK -{ - using namespace BEEV; - - ASTVec terms = *$3; - ASTVec forms; - - for(ASTVec::const_iterator it=terms.begin(),itend=terms.end(); - it!=itend; it++) { - for(ASTVec::const_iterator it2=it+1; it2!=itend; it2++) { - ASTNode n = (parserInterface->nf->CreateNode(NOT, parserInterface->CreateNode(EQ, *it, *it2))); - - - forms.push_back(n); - } - } - - if(forms.size() == 0) - FatalError("empty distinct"); - - $$ = (forms.size() == 1) ? - new ASTNode(forms[0]) : - new ASTNode(parserInterface->CreateNode(AND, forms)); - - delete $3; -} - -| LPAREN_TOK BVSLT_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVSLT_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSLT, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK BVSLE_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVSLE_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSLE, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK BVSGT_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVSGT_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSGT, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK BVSGE_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVSGE_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSGE, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK BVLT_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVLT_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVLT, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK BVLE_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVLE_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVLE, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK BVGT_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVGT_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVGT, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK BVGE_TOK an_term an_term RPAREN_TOK - //| LPAREN_TOK BVGE_TOK an_term an_term annotations RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVGE, *$3, *$4); - $$ = n; - delete $3; - delete $4; -} -| LPAREN_TOK an_formula RPAREN_TOK -{ - $$ = $2; -} -| LPAREN_TOK NOT_TOK an_formula RPAREN_TOK -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(NOT, *$3)); - delete $3; -} -| LPAREN_TOK IMPLIES_TOK an_formula an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(IMPLIES, *$3, *$4); - delete $3; - delete $4; -} -| LPAREN_TOK ITE_TOK an_formula an_formula an_formula RPAREN_TOK -{ - $$ = new ASTNode(parserInterface->nf->CreateNode(ITE, *$3, *$4, *$5)); - delete $3; - delete $4; - delete $5; -} -| LPAREN_TOK AND_TOK an_formulas RPAREN_TOK -{ - $$ = new ASTNode(parserInterface->CreateNode(AND, *$3)); - delete $3; -} -| LPAREN_TOK OR_TOK an_formulas RPAREN_TOK -{ - $$ = new ASTNode(parserInterface->CreateNode(OR, *$3)); - delete $3; -} -| LPAREN_TOK XOR_TOK an_formula an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(XOR, *$3, *$4); - delete $3; - delete $4; -} -| LPAREN_TOK IFF_TOK an_formula an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(IFF, *$3, *$4); - delete $3; - delete $4; -} -| letexpr_mgmt an_formula RPAREN_TOK - //| letexpr_mgmt an_formula annotations RPAREN_TOK -{ - $$ = $2; - //Cleanup the LetIDToExprMap - parserInterface->letMgr.CleanupLetIDMap(); -} -; - -letexpr_mgmt: -LPAREN_TOK LET_TOK LPAREN_TOK QUESTION_TOK STRING_TOK an_term RPAREN_TOK -{ - //populate the hashtable from LET-var --> - //LET-exprs and then process them: - // - //1. ensure that LET variables do not clash - //1. with declared variables. - // - //2. Ensure that LET variables are not - //2. defined more than once - parserInterface->letMgr.LetExprMgr(*$5,*$6); - - delete $5; - delete $6; -} -| LPAREN_TOK FLET_TOK LPAREN_TOK DOLLAR_TOK STRING_TOK an_formula RPAREN_TOK -{ - //Do LET-expr management - parserInterface->letMgr.LetExprMgr(*$5,*$6); - delete $5; - delete $6; -} - -an_terms: -an_term -{ - $$ = new ASTVec; - if ($1 != NULL) { - $$->push_back(*$1); - delete $1; - } -} -| -an_terms an_term -{ - if ($1 != NULL && $2 != NULL) { - $1->push_back(*$2); - $$ = $1; - delete $2; - } -} -; - -an_term: -BVCONST_TOK -{ - $$ = new ASTNode(parserInterface->CreateBVConst(*$1, 10, 32)); - delete $1; -} -| BVCONST_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK -{ - $$ = new ASTNode(parserInterface->CreateBVConst(*$1,10,$3)); - delete $1; -} -| an_nonbvconst_term -{ -$$ = $1; -} -; - -an_nonbvconst_term: -BITCONST_TOK { $$ = $1; } -| var -{ - $$ = new ASTNode((*$1)); - delete $1; -} -| LPAREN_TOK an_term RPAREN_TOK -{ - $$ = $2; -} -| SELECT_TOK an_term an_term -{ - //ARRAY READ - // valuewidth is same as array, indexwidth is 0. - ASTNode array = *$2; - ASTNode index = *$3; - unsigned int width = array.GetValueWidth(); - ASTNode * n = - new ASTNode(parserInterface->nf->CreateTerm(READ, width, array, index)); - $$ = n; - delete $2; - delete $3; -} -| STORE_TOK an_term an_term an_term -{ - //ARRAY WRITE - unsigned int width = $4->GetValueWidth(); - ASTNode array = *$2; - ASTNode index = *$3; - ASTNode writeval = *$4; - ASTNode write_term = parserInterface->nf->CreateArrayTerm(WRITE,$2->GetIndexWidth(),width,array,index,writeval); - ASTNode * n = new ASTNode(write_term); - $$ = n; - delete $2; - delete $3; - delete $4; -} -| BVEXTRACT_TOK LBRACKET_TOK NUMERAL_TOK COLON_TOK NUMERAL_TOK RBRACKET_TOK an_term -{ - int width = $3 - $5 + 1; - if (width < 0) - yyerror("Negative width in extract"); - - if((unsigned)$3 >= $7->GetValueWidth()) - yyerror("Parsing: Wrong width in BVEXTRACT\n"); - - ASTNode hi = parserInterface->CreateBVConst(32, $3); - ASTNode low = parserInterface->CreateBVConst(32, $5); - ASTNode output = parserInterface->nf->CreateTerm(BVEXTRACT, width, *$7,hi,low); - ASTNode * n = new ASTNode(output); - $$ = n; - delete $7; -} -| ITE_TOK an_formula an_term an_term -{ - const unsigned int width = $3->GetValueWidth(); - $$ = new ASTNode(parserInterface->nf->CreateArrayTerm(ITE,$4->GetIndexWidth(), width,*$2, *$3, *$4)); - delete $2; - delete $3; - delete $4; -} -| BVCONCAT_TOK an_term an_term -{ - const unsigned int width = $2->GetValueWidth() + $3->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVCONCAT, width, *$2, *$3)); - $$ = n; - delete $2; - delete $3; -} -| BVNOT_TOK an_term -{ - //this is the BVNEG (term) in the CVCL language - unsigned int width = $2->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVNEG, width, *$2)); - $$ = n; - delete $2; -} -| BVNEG_TOK an_term -{ - //this is the BVUMINUS term in CVCL langauge - unsigned width = $2->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVUMINUS,width,*$2)); - $$ = n; - delete $2; -} -| BVAND_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVAND, width, *$2, *$3); - $$ = n; - delete $2; - delete $3; -} -| BVOR_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVOR, width, *$2, *$3); - $$ = n; - delete $2; - delete $3; -} -| BVXOR_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n =parserInterface->newNode(BVXOR, width, *$2, *$3); - $$ = n; - delete $2; - delete $3; -} - | BVXNOR_TOK an_term an_term - { -// (bvxnor s t) abbreviates (bvor (bvand s t) (bvand (bvnot s) (bvnot t))) - - - unsigned int width = $2->GetValueWidth(); - ASTNode * n = new ASTNode( - parserInterface->nf->CreateTerm( BVOR, width, - parserInterface->nf->CreateTerm(BVAND, width, *$2, *$3), - parserInterface->nf->CreateTerm(BVAND, width, - parserInterface->nf->CreateTerm(BVNEG, width, *$2), - parserInterface->nf->CreateTerm(BVNEG, width, *$3) - ))); - - $$ = n; - delete $2; - delete $3; - - } - | BVCOMP_TOK an_term an_term - { - - - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(ITE, 1, - parserInterface->nf->CreateNode(EQ, *$2, *$3), - parserInterface->CreateOneConst(1), - parserInterface->CreateZeroConst(1))); - - $$ = n; - delete $2; - delete $3; - } - - -| BVSUB_TOK an_term an_term -{ - const unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVSUB, width, *$2, *$3); - $$ = n; - delete $2; - delete $3; -} -| BVPLUS_TOK an_terms -{ - const unsigned int width = (*$2)[0].GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVPLUS, width, *$2)); - $$ = n; - delete $2; - -} -| BVMULT_TOK an_terms -{ - const unsigned int width = (*$2)[0].GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVMULT, width, *$2)); - $$ = n; - delete $2; -} - -| BVDIV_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVDIV, width, *$2, *$3); - $$ = n; - - delete $2; - delete $3; -} -| BVMOD_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVMOD, width, *$2, *$3); - $$ = n; - - delete $2; - delete $3; -} -| SBVDIV_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(SBVDIV, width, *$2, *$3); - $$ = n; - - delete $2; - delete $3; -} -| SBVREM_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(SBVREM, width, *$2, *$3); - $$ = n; - delete $2; - delete $3; -} -| SBVMOD_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(SBVMOD, width, *$2, *$3); - $$ = n; - delete $2; - delete $3; -} -| BVNAND_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVNEG, width, parserInterface->nf->CreateTerm(BVAND, width, *$2, *$3))); - $$ = n; - delete $2; - delete $3; -} -| BVNOR_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = new ASTNode(parserInterface->nf->CreateTerm(BVNEG, width, parserInterface->nf->CreateTerm(BVOR, width, *$2, *$3))); - $$ = n; - delete $2; - delete $3; -} -| BVLEFTSHIFT_1_TOK an_term an_term -{ - // shifting left by who know how much? - unsigned int w = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVLEFTSHIFT,w,*$2,*$3); - $$ = n; - delete $2; - delete $3; -} -| BVRIGHTSHIFT_1_TOK an_term an_term -{ - // shifting right by who know how much? - unsigned int w = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVRIGHTSHIFT,w,*$2,*$3); - $$ = n; - delete $2; - delete $3; -} -| BVARITHRIGHTSHIFT_TOK an_term an_term -{ - // shifting arithmetic right by who know how much? - unsigned int w = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVSRSHIFT,w,*$2,*$3); - $$ = n; - delete $2; - delete $3; -} -| BVROTATE_LEFT_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK an_term -{ - - ASTNode *n; - unsigned width = $5->GetValueWidth(); - unsigned rotate = $3; - if (0 == rotate) - { - n = $5; - } - else if (rotate < width) - { - ASTNode high = parserInterface->CreateBVConst(32,width-1); - ASTNode zero = parserInterface->CreateBVConst(32,0); - ASTNode cut = parserInterface->CreateBVConst(32,width-rotate); - ASTNode cutMinusOne = parserInterface->CreateBVConst(32,width-rotate-1); - - ASTNode top = parserInterface->nf->CreateTerm(BVEXTRACT,rotate,*$5,high, cut); - ASTNode bottom = parserInterface->nf->CreateTerm(BVEXTRACT,width-rotate,*$5,cutMinusOne,zero); - n = new ASTNode(parserInterface->nf->CreateTerm(BVCONCAT,width,bottom,top)); - delete $5; - } - else - { - n = NULL; // remove gcc warning. - yyerror("Rotate must be strictly less than the width."); - } - - $$ = n; - -} -| BVROTATE_RIGHT_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK an_term -{ - - ASTNode *n; - unsigned width = $5->GetValueWidth(); - unsigned rotate = $3; - if (0 == rotate) - { - n = $5; - } - else if (rotate < width) - { - ASTNode high = parserInterface->CreateBVConst(32,width-1); - ASTNode zero = parserInterface->CreateBVConst(32,0); - ASTNode cut = parserInterface->CreateBVConst(32,rotate); - ASTNode cutMinusOne = parserInterface->CreateBVConst(32,rotate-1); - - ASTNode bottom = parserInterface->nf->CreateTerm(BVEXTRACT,rotate,*$5,cutMinusOne, zero); - ASTNode top = parserInterface->nf->CreateTerm(BVEXTRACT,width-rotate,*$5,high,cut); - n = new ASTNode(parserInterface->nf->CreateTerm(BVCONCAT,width,bottom,top)); - delete $5; - } - else - { - n = NULL; // remove gcc warning. - yyerror("Rotate must be strictly less than the width."); - } - - $$ = n; - -} - | BVREPEAT_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK an_term - { - unsigned count = $3; - if (count < 1) - FatalError("One or more repeats please"); - - unsigned w = $5->GetValueWidth(); - ASTNode n = *$5; - - for (unsigned i =1; i < count; i++) - { - n = parserInterface->nf->CreateTerm(BVCONCAT,w*(i+1),n,*$5); - } - delete $5; - $$ = new ASTNode(n); - } -| BVSX_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK an_term -{ - unsigned w = $5->GetValueWidth() + $3; - ASTNode width = parserInterface->CreateBVConst(32,w); - ASTNode *n = new ASTNode(parserInterface->nf->CreateTerm(BVSX,w,*$5,width)); - $$ = n; - delete $5; -} -| BVZX_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK an_term -{ - if (0 != $3) - { - unsigned w = $5->GetValueWidth() + $3; - ASTNode leading_zeroes = parserInterface->CreateZeroConst($3); - ASTNode *n = new ASTNode(parserInterface->nf->CreateTerm(BVCONCAT,w,leading_zeroes,*$5)); - $$ = n; - delete $5; - } - else - $$ = $5; - -} -; - -sort_symb: -BITVEC_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK -{ - // Just return BV width. If sort is BOOL, width is 0. - // Otherwise, BITVEC[w] returns w. - // - //((indexwidth is 0) && (valuewidth>0)) iff type is BV - $$.indexwidth = 0; - unsigned int length = $3; - if(length > 0) { - $$.valuewidth = length; - } - else { - FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n"); - } -} -| ARRAY_TOK LBRACKET_TOK NUMERAL_TOK COLON_TOK NUMERAL_TOK RBRACKET_TOK -{ - unsigned int index_len = $3; - unsigned int value_len = $5; - if(index_len > 0) { - $$.indexwidth = $3; - } - else { - FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n"); - } - - if(value_len > 0) { - $$.valuewidth = $5; - } - else { - FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n"); - } -} -; - -var: -FORMID_TOK -{ - $$ = new ASTNode((*$1)); - delete $1; -} -| TERMID_TOK -{ - $$ = new ASTNode((*$1)); - delete $1; -} -| QUESTION_TOK TERMID_TOK -{ - $$ = $2; -} -; - -fvar: -DOLLAR_TOK FORMID_TOK -{ - $$ = $2; -} -| FORMID_TOK -{ - $$ = new ASTNode((*$1)); - delete $1; -} -; -%% diff --git a/src/vendor/stp/src/parser/smt2.lex b/src/vendor/stp/src/parser/smt2.lex deleted file mode 100644 index 2d64ff06e..000000000 --- a/src/vendor/stp/src/parser/smt2.lex +++ /dev/null @@ -1,255 +0,0 @@ -%{ - /******************************************************************** - * AUTHORS: Trevor Hansen - * - * BEGIN DATE: May, 2010 - * - * This file is modified version of the STP's smtlib.lex file. Please - * see CVCL license below - ********************************************************************/ - - /******************************************************************** - * AUTHORS: Trevor Hansen, Vijay Ganesh, David L. Dill - * - * BEGIN DATE: July, 2006 - * - * This file is modified version of the CVCL's smtlib.lex file. Please - * see CVCL license below - ********************************************************************/ - - /******************************************************************** - * \file smtlib.lex - * - * Author: Sergey Berezin, Clark Barrett - * - * Created: Apr 30 2005 - * - *
- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford - * Junior University and by New York University. - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - * - *
- ********************************************************************/ - // -*- c++ -*-L -#include "parser.h" -#include "parsesmt2.hpp" -#include "../cpp_interface/cpp_interface.h" - - extern char *smt2text; - extern int smt2error (const char *msg); - - // File-static (local to this file) variables and functions - static std::string _string_lit; - static char escapeChar(char c) { - switch(c) { - case 'n': return '\n'; - case 't': return '\t'; - default: return c; - } - } - - static int lookup(const char* s) - { - string str(s); - - // The SMTLIB2 specifications sez that the outter bars aren't part of the - // name. This means that we can create an empty string symbol name. - if (s[0] == '|' && s[str.size()-1] == '|') - str = str.substr(1,str.length()-2); - - BEEV::ASTNode nptr; - bool found = false; - - if (BEEV::parserInterface->isSymbolAlreadyDeclared(str)) // it's a symbol. - { - nptr= BEEV::parserInterface->LookupOrCreateSymbol(str); - found = true; - } - else if (BEEV::parserInterface->letMgr.isLetDeclared(str)) // a let. - { - nptr = BEEV::parserInterface->letMgr.resolveLet(str); - found = true; - } - - if (found) - { - // Check valuesize to see if it's a prop var. I don't like doing - // type determination in the lexer, but it's easier than rewriting - // the whole grammar to eliminate the term/formula distinction. - smt2lval.node = BEEV::parserInterface->newNode(nptr); - if ((smt2lval.node)->GetType() == BEEV::BOOLEAN_TYPE) - return FORMID_TOK; - else - return TERMID_TOK; - } - else - { - // it has not been seen before. - smt2lval.str = new std::string(str); - return STRING_TOK; - } - } -%} - -%option noyywrap -%option nounput -%option noreject -%option noyymore -%option yylineno - -%x COMMENT -%x STRING_LITERAL -%x SYMBOL - -LETTER ([a-zA-Z]) -DIGIT ([0-9]) -OPCHAR ([~!@$%^&*\_\-+=<>\.?/]) - -ANYTHING ({LETTER}|{DIGIT}|{OPCHAR}) - -%% -[ \n\t\r\f] { /* sk'ip whitespace */ } - - /* We limit numerals to maxint, in the specification they are arbitary precision.*/ -{DIGIT}+ { smt2lval.uintval = strtoul(smt2text, NULL, 10); return NUMERAL_TOK; } - -bv{DIGIT}+ { smt2lval.str = new std::string(smt2text+2); return BVCONST_DECIMAL_TOK; } -#b{DIGIT}+ { smt2lval.str = new std::string(smt2text+2); return BVCONST_BINARY_TOK; } -#x({DIGIT}|[a-fA-F])+ { smt2lval.str = new std::string(smt2text+2); return BVCONST_HEXIDECIMAL_TOK; } - -{DIGIT}+"."{DIGIT}+ { return DECIMAL_TOK;} - -";" { BEGIN COMMENT; } -"\n" { BEGIN INITIAL; /* return to normal mode */} -. { /* stay in comment mode */ } - -"\"" { BEGIN STRING_LITERAL; - _string_lit.erase(_string_lit.begin(), - _string_lit.end()); } -"\\". { /* escape characters (like \n or \") */ - _string_lit.insert(_string_lit.end(), - escapeChar(smt2text[1])); } -"\"" { BEGIN INITIAL; - smt2lval.str = new std::string(_string_lit); - return STRING_TOK; } -. { _string_lit.insert(_string_lit.end(),*smt2text); } -"\n" { _string_lit.insert(_string_lit.end(),*smt2text); } - - /* Valid character are: ~ ! @ # $ % ^ & * _ - + = | \ : ; " < > . ? / ( ) */ -"(" { return LPAREN_TOK; } -")" { return RPAREN_TOK; } -"_" { return UNDERSCORE_TOK; } - - /* Set info types */ - /* This is a very restricted set of the possible keywords */ -":source" { return SOURCE_TOK;} -":category" { return CATEGORY_TOK;} -":difficulty" { return DIFFICULTY_TOK; } -":smt-lib-version" { return VERSION_TOK; } -":status" { return STATUS_TOK; } -":print-success" { return PRINT_TOK; } - - - /* COMMANDS */ -"set-logic" { return LOGIC_TOK; } -"set-info" { return NOTES_TOK; } -"set-option" { return OPTION_TOK; } -"declare-fun" { return DECLARE_FUNCTION_TOK; } -"push" { return PUSH_TOK;} -"pop" { return POP_TOK;} - - /* - "declare-sort" - "define-sort" -*/ -"assert" { return FORMULA_TOK; } -"check-sat" { return CHECK_SAT_TOK; } - /* - "get-assertions" - "get-proof" - "get-unsat-core" - "get-value" - "get-assignment" - "get-option" - "get-info" -*/ -"exit" {return EXIT_TOK;} - - /* Types for QF_BV and QF_AUFBV. */ -"BitVec" { return BITVEC_TOK;} -"Array" { return ARRAY_TOK;} -"Bool" { return BOOL_TOK;} - - - /* CORE THEORY pg. 29 of the SMT-LIB2 standard 30-March-2010. */ -"true" { return TRUE_TOK; } -"false" { return FALSE_TOK; } -"not" { return NOT_TOK; } -"and" { return AND_TOK; } -"or" { return OR_TOK; } -"xor" { return XOR_TOK;} -"ite" { return ITE_TOK;} // PARAMETRIC -"=" { return EQ_TOK;} -"=>" { return IMPLIES_TOK; } - - /* CORE THEORY. But not on pg 29. */ -"distinct" { return DISTINCT_TOK; } // variadic -"let" { return LET_TOK; } - - /* Functions for QF_BV and QF_AUFBV. */ -"bvshl" { return BVLEFTSHIFT_1_TOK;} -"bvlshr" { return BVRIGHTSHIFT_1_TOK;} -"bvashr" { return BVARITHRIGHTSHIFT_TOK;} -"bvadd" { return BVPLUS_TOK;} -"bvsub" { return BVSUB_TOK;} -"bvnot" { return BVNOT_TOK;} -"bvmul" { return BVMULT_TOK;} -"bvudiv" { return BVDIV_TOK;} -"bvsdiv" { return SBVDIV_TOK;} -"bvurem" { return BVMOD_TOK;} -"bvsrem" { return SBVREM_TOK;} -"bvsmod" { return SBVMOD_TOK;} -"bvneg" { return BVNEG_TOK;} -"bvand" { return BVAND_TOK;} -"bvor" { return BVOR_TOK;} -"bvxor" { return BVXOR_TOK;} -"bvnand" { return BVNAND_TOK;} -"bvnor" { return BVNOR_TOK;} -"bvxnor" { return BVXNOR_TOK;} -"concat" { return BVCONCAT_TOK;} -"extract" { return BVEXTRACT_TOK;} -"bvult" { return BVLT_TOK;} -"bvugt" { return BVGT_TOK;} -"bvule" { return BVLE_TOK;} -"bvuge" { return BVGE_TOK;} -"bvslt" { return BVSLT_TOK;} -"bvsgt" { return BVSGT_TOK;} -"bvsle" { return BVSLE_TOK;} -"bvsge" { return BVSGE_TOK;} -"bvcomp" { return BVCOMP_TOK;} -"zero_extend" { return BVZX_TOK;} -"sign_extend" { return BVSX_TOK;} -"repeat" { return BVREPEAT_TOK;} -"rotate_left" { return BVROTATE_LEFT_TOK;} -"rotate_right" { return BVROTATE_RIGHT_TOK;} - - /* Functions for QF_AUFBV. */ -"select" { return SELECT_TOK; } -"store" { return STORE_TOK; } - -({LETTER}|{OPCHAR})({ANYTHING})* {return lookup(smt2text);} -\|([^\|]|\n)*\| {return lookup(smt2text);} - -. { smt2error("Illegal input character."); } -%% diff --git a/src/vendor/stp/src/parser/smt2.y b/src/vendor/stp/src/parser/smt2.y deleted file mode 100644 index aa79897ad..000000000 --- a/src/vendor/stp/src/parser/smt2.y +++ /dev/null @@ -1,964 +0,0 @@ -%{ - /******************************************************************** - * AUTHORS: Trevor Hansen - * - * BEGIN DATE: May, 2010 - * - * This file is modified version of the STP's smtlib.y file. Please - * see CVCL license below - ********************************************************************/ - - /******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: July, 2006 - * - * This file is modified version of the CVCL's smtlib.y file. Please - * see CVCL license below - ********************************************************************/ - - - /******************************************************************** - * - * \file smtlib.y - * - * Author: Sergey Berezin, Clark Barrett - * - * Created: Apr 30 2005 - * - *
- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford - * Junior University and by New York University. - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - * - *
- ********************************************************************/ - // -*- c++ -*- - -#include "../cpp_interface/cpp_interface.h" - - using namespace std; - using namespace BEEV; - - // Suppress the bogus warning suppression in bison (it generates - // compile error) -#undef __GNUC_MINOR__ - - extern char* smt2text; - extern int smt2lineno; - extern int smt2lex(void); - - int yyerror(const char *s) { - cout << "syntax error: line " << smt2lineno << "\n" << s << endl; - cout << " token: " << smt2text << endl; - FatalError(""); - return 1; - } - - -#define YYLTYPE_IS_TRIVIAL 1 -#define YYMAXDEPTH 104857600 -#define YYERROR_VERBOSE 1 -#define YY_EXIT_FAILURE -1 - - %} - -%union { - unsigned uintval; /* for numerals in types. */ - //ASTNode,ASTVec - BEEV::ASTNode *node; - BEEV::ASTVec *vec; - std::string *str; -}; - -%start cmd - -%type status -%type an_formulas an_terms - -%type an_term an_formula - -%token NUMERAL_TOK -%token BVCONST_DECIMAL_TOK -%token BVCONST_BINARY_TOK -%token BVCONST_HEXIDECIMAL_TOK - - /* We have this so we can parse :smt-lib-version 2.0 */ -%token DECIMAL_TOK - -%token FORMID_TOK TERMID_TOK -%token STRING_TOK - - - /* set-info tokens */ -%token SOURCE_TOK -%token CATEGORY_TOK -%token DIFFICULTY_TOK -%token VERSION_TOK -%token STATUS_TOK -%token PRINT_TOK - - /* ASCII Symbols */ - /* Semicolons (comments) are ignored by the lexer */ -%token UNDERSCORE_TOK -%token LPAREN_TOK -%token RPAREN_TOK - - - /*BV SPECIFIC TOKENS*/ -%token BVLEFTSHIFT_1_TOK -%token BVRIGHTSHIFT_1_TOK -%token BVARITHRIGHTSHIFT_TOK -%token BVPLUS_TOK -%token BVSUB_TOK -%token BVNOT_TOK //bvneg in CVCL -%token BVMULT_TOK -%token BVDIV_TOK -%token SBVDIV_TOK -%token BVMOD_TOK -%token SBVREM_TOK -%token SBVMOD_TOK -%token BVNEG_TOK //bvuminus in CVCL -%token BVAND_TOK -%token BVOR_TOK -%token BVXOR_TOK -%token BVNAND_TOK -%token BVNOR_TOK -%token BVXNOR_TOK -%token BVCONCAT_TOK -%token BVLT_TOK -%token BVGT_TOK -%token BVLE_TOK -%token BVGE_TOK -%token BVSLT_TOK -%token BVSGT_TOK -%token BVSLE_TOK -%token BVSGE_TOK - -%token BVSX_TOK -%token BVEXTRACT_TOK -%token BVZX_TOK -%token BVROTATE_RIGHT_TOK -%token BVROTATE_LEFT_TOK -%token BVREPEAT_TOK -%token BVCOMP_TOK - - /* Types for QF_BV and QF_AUFBV. */ -%token BITVEC_TOK -%token ARRAY_TOK -%token BOOL_TOK - -/* CORE THEORY pg. 29 of the SMT-LIB2 standard 30-March-2010. */ -%token TRUE_TOK; -%token FALSE_TOK; -%token NOT_TOK; -%token AND_TOK; -%token OR_TOK; -%token XOR_TOK; -%token ITE_TOK; -%token EQ_TOK; -%token IMPLIES_TOK; - - /* CORE THEORY. But not on pg 29. */ -%token DISTINCT_TOK; -%token LET_TOK; - -// COMMANDS -%token EXIT_TOK -%token CHECK_SAT_TOK -%token LOGIC_TOK -%token NOTES_TOK -%token OPTION_TOK -%token DECLARE_FUNCTION_TOK -%token FORMULA_TOK -%token PUSH_TOK -%token POP_TOK - - /* Functions for QF_AUFBV. */ -%token SELECT_TOK; -%token STORE_TOK; - -%token END 0 "end of file" - -%% -cmd: commands END -{ - parserInterface->cleanUp(); - YYACCEPT; -} -; - - -commands: commands cmdi -| cmdi -{} -; - -cmdi: - LPAREN_TOK EXIT_TOK RPAREN_TOK - { - parserInterface->cleanUp(); - YYACCEPT; - } -| LPAREN_TOK CHECK_SAT_TOK RPAREN_TOK - { - parserInterface->checkSat(parserInterface->getAssertVector()); - } -| - LPAREN_TOK LOGIC_TOK STRING_TOK RPAREN_TOK - { - if (!(0 == strcmp($3->c_str(),"QF_BV") || - 0 == strcmp($3->c_str(),"QF_ABV") || - 0 == strcmp($3->c_str(),"QF_AUFBV"))) { - yyerror("Wrong input logic:"); - } - parserInterface->success(); - delete $3; - } -| LPAREN_TOK NOTES_TOK attribute STRING_TOK RPAREN_TOK - { - delete $4; - } -| LPAREN_TOK OPTION_TOK attribute RPAREN_TOK - { - } -| LPAREN_TOK NOTES_TOK attribute DECIMAL_TOK RPAREN_TOK - {} -| LPAREN_TOK NOTES_TOK attribute RPAREN_TOK - {} -| LPAREN_TOK PUSH_TOK NUMERAL_TOK RPAREN_TOK - { - for (int i=0; i < $3;i++) - { - parserInterface->push(); - } - parserInterface->success(); - } -| LPAREN_TOK POP_TOK NUMERAL_TOK RPAREN_TOK - { - for (int i=0; i < $3;i++) - parserInterface->pop(); - parserInterface->success(); - } -| LPAREN_TOK DECLARE_FUNCTION_TOK var_decl RPAREN_TOK - { - parserInterface->success(); - } -| LPAREN_TOK FORMULA_TOK an_formula RPAREN_TOK - { - parserInterface->AddAssert(*$3); - parserInterface->deleteNode($3); - parserInterface->success(); - } -; - -status: -STRING_TOK { - - std::transform($1->begin(), $1->end(), $1->begin(), ::tolower); - - if (0 == strcmp($1->c_str(), "sat")) - input_status = TO_BE_SATISFIABLE; - else if (0 == strcmp($1->c_str(), "unsat")) - input_status = TO_BE_UNSATISFIABLE; - else if (0 == strcmp($1->c_str(), "unknown")) - input_status = TO_BE_UNKNOWN; - else - yyerror($1->c_str()); - delete $1; - $$ = NULL; -} -; - -attribute: -SOURCE_TOK -{} -| CATEGORY_TOK -{} -| DIFFICULTY_TOK -{} -| VERSION_TOK -{} -| STATUS_TOK status -{} -| PRINT_TOK TRUE_TOK -{ - parserInterface->setPrintSuccess(true); - parserInterface->success(); -} -| PRINT_TOK FALSE_TOK -{ - parserInterface->setPrintSuccess(false); -} - -; - -var_decl: -STRING_TOK LPAREN_TOK RPAREN_TOK LPAREN_TOK UNDERSCORE_TOK BITVEC_TOK NUMERAL_TOK RPAREN_TOK -{ - ASTNode s = BEEV::parserInterface->LookupOrCreateSymbol($1->c_str()); - parserInterface->addSymbol(s); - //Sort_symbs has the indexwidth/valuewidth. Set those fields in - //var - s.SetIndexWidth(0); - s.SetValueWidth($7); - delete $1; -} -| STRING_TOK LPAREN_TOK RPAREN_TOK BOOL_TOK -{ - ASTNode s = BEEV::parserInterface->LookupOrCreateSymbol($1->c_str()); - s.SetIndexWidth(0); - s.SetValueWidth(0); - parserInterface->addSymbol(s); - delete $1; -} -| STRING_TOK LPAREN_TOK RPAREN_TOK LPAREN_TOK ARRAY_TOK LPAREN_TOK UNDERSCORE_TOK BITVEC_TOK NUMERAL_TOK RPAREN_TOK LPAREN_TOK UNDERSCORE_TOK BITVEC_TOK NUMERAL_TOK RPAREN_TOK RPAREN_TOK -{ - ASTNode s = BEEV::parserInterface->LookupOrCreateSymbol($1->c_str()); - parserInterface->addSymbol(s); - unsigned int index_len = $9; - unsigned int value_len = $14; - if(index_len > 0) { - s.SetIndexWidth($9); - } - else { - FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n"); - } - - if(value_len > 0) { - s.SetValueWidth($14); - } - else { - FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n"); - } - delete $1; -} -; - -an_formulas: -an_formula -{ - $$ = new ASTVec; - if ($1 != NULL) { - $$->push_back(*$1); - parserInterface->deleteNode($1); - } -} -| -an_formulas an_formula -{ - if ($1 != NULL && $2 != NULL) { - $1->push_back(*$2); - $$ = $1; - parserInterface->deleteNode($2); - } -} -; - -an_formula: -TRUE_TOK -{ - $$ = parserInterface->newNode(parserInterface->CreateNode(TRUE)); - assert(0 == $$->GetIndexWidth()); - assert(0 == $$->GetValueWidth()); -} -| FALSE_TOK -{ - $$ = parserInterface->newNode(parserInterface->CreateNode(FALSE)); - assert(0 == $$->GetIndexWidth()); - assert(0 == $$->GetValueWidth()); -} -| FORMID_TOK -{ - $$ = parserInterface->newNode(*$1); - parserInterface->deleteNode($1); -} -| LPAREN_TOK EQ_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(EQ,*$3, *$4); - $$ = n; - parserInterface->deleteNode($3); - parserInterface->deleteNode($4); -} -| LPAREN_TOK DISTINCT_TOK an_terms RPAREN_TOK -{ - using namespace BEEV; - - ASTVec terms = *$3; - ASTVec forms; - - for(ASTVec::const_iterator it=terms.begin(),itend=terms.end(); - it!=itend; it++) { - for(ASTVec::const_iterator it2=it+1; it2!=itend; it2++) { - ASTNode n = (parserInterface->nf->CreateNode(NOT, parserInterface->CreateNode(EQ, *it, *it2))); - - - forms.push_back(n); - } - } - - if(forms.size() == 0) - FatalError("empty distinct"); - - $$ = (forms.size() == 1) ? - parserInterface->newNode(forms[0]) : - parserInterface->newNode(parserInterface->CreateNode(AND, forms)); - - delete $3; -} -| LPAREN_TOK DISTINCT_TOK an_formulas RPAREN_TOK -{ - using namespace BEEV; - - ASTVec terms = *$3; - ASTVec forms; - - for(ASTVec::const_iterator it=terms.begin(),itend=terms.end(); - it!=itend; it++) { - for(ASTVec::const_iterator it2=it+1; it2!=itend; it2++) { - ASTNode n = (parserInterface->nf->CreateNode(NOT, parserInterface->CreateNode(IFF, *it, *it2))); - forms.push_back(n); - } - } - - if(forms.size() == 0) - FatalError("empty distinct"); - - $$ = (forms.size() == 1) ? - parserInterface->newNode(forms[0]) : - parserInterface->newNode(parserInterface->CreateNode(AND, forms)); - - delete $3; -} -| LPAREN_TOK BVSLT_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSLT, *$3, *$4); - $$ = n; - parserInterface->deleteNode($3); - parserInterface->deleteNode($4); -} -| LPAREN_TOK BVSLE_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSLE, *$3, *$4); - $$ = n; - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK BVSGT_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSGT, *$3, *$4); - $$ = n; - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK BVSGE_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVSGE, *$3, *$4); - $$ = n; - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK BVLT_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVLT, *$3, *$4); - $$ = n; - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK BVLE_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVLE, *$3, *$4); - $$ = n; - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK BVGT_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVGT, *$3, *$4); - $$ = n; - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK BVGE_TOK an_term an_term RPAREN_TOK -{ - ASTNode * n = parserInterface->newNode(BVGE, *$3, *$4); - $$ = n; - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK an_formula RPAREN_TOK -{ - $$ = $2; -} -| LPAREN_TOK NOT_TOK an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(parserInterface->nf->CreateNode(NOT, *$3)); - parserInterface->deleteNode( $3); -} -| LPAREN_TOK IMPLIES_TOK an_formula an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(IMPLIES, *$3, *$4); - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK ITE_TOK an_formula an_formula an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(parserInterface->nf->CreateNode(ITE, *$3, *$4, *$5)); - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); - parserInterface->deleteNode( $5); -} -| LPAREN_TOK AND_TOK an_formulas RPAREN_TOK -{ - $$ = parserInterface->newNode(parserInterface->CreateNode(AND, *$3)); - delete $3; -} -| LPAREN_TOK OR_TOK an_formulas RPAREN_TOK -{ - $$ = parserInterface->newNode(parserInterface->CreateNode(OR, *$3)); - delete $3; -} -| LPAREN_TOK XOR_TOK an_formula an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(XOR, *$3, *$4); - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK EQ_TOK an_formula an_formula RPAREN_TOK -{ - $$ = parserInterface->newNode(IFF, *$3, *$4); - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK LET_TOK LPAREN_TOK lets RPAREN_TOK an_formula RPAREN_TOK -{ - $$ = $6; - //Cleanup the LetIDToExprMap - parserInterface->letMgr.CleanupLetIDMap(); -} -; - -lets: let lets -| let -{}; - -let: LPAREN_TOK STRING_TOK an_formula RPAREN_TOK -{ - //populate the hashtable from LET-var --> - //LET-exprs and then process them: - // - //1. ensure that LET variables do not clash - //1. with declared variables. - // - //2. Ensure that LET variables are not - //2. defined more than once - parserInterface->letMgr.LetExprMgr(*$2,*$3); - delete $2; - parserInterface->deleteNode( $3); -} -| LPAREN_TOK STRING_TOK an_term RPAREN_TOK -{ - //populate the hashtable from LET-var --> - //LET-exprs and then process them: - // - //1. ensure that LET variables do not clash - //1. with declared variables. - // - //2. Ensure that LET variables are not - //2. defined more than once - parserInterface->letMgr.LetExprMgr(*$2,*$3); - delete $2; - parserInterface->deleteNode( $3); - -} -; - -an_terms: -an_term -{ - $$ = new ASTVec; - if ($1 != NULL) { - $$->push_back(*$1); - parserInterface->deleteNode( $1); - - } -} -| -an_terms an_term -{ - if ($1 != NULL && $2 != NULL) { - $1->push_back(*$2); - $$ = $1; - parserInterface->deleteNode( $2); - } -} -; - -an_term: -TERMID_TOK -{ - $$ = parserInterface->newNode((*$1)); - parserInterface->deleteNode( $1); -} -| LPAREN_TOK an_term RPAREN_TOK -{ - $$ = $2; -} -| SELECT_TOK an_term an_term -{ - //ARRAY READ - // valuewidth is same as array, indexwidth is 0. - ASTNode array = *$2; - ASTNode index = *$3; - unsigned int width = array.GetValueWidth(); - ASTNode * n = - parserInterface->newNode(parserInterface->nf->CreateTerm(READ, width, array, index)); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| STORE_TOK an_term an_term an_term -{ - //ARRAY WRITE - unsigned int width = $4->GetValueWidth(); - ASTNode array = *$2; - ASTNode index = *$3; - ASTNode writeval = *$4; - ASTNode write_term = parserInterface->nf->CreateArrayTerm(WRITE,$2->GetIndexWidth(),width,array,index,writeval); - ASTNode * n = parserInterface->newNode(write_term); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| LPAREN_TOK UNDERSCORE_TOK BVEXTRACT_TOK NUMERAL_TOK NUMERAL_TOK RPAREN_TOK an_term -{ - int width = $4 - $5 + 1; - if (width < 0) - yyerror("Negative width in extract"); - - if((unsigned)$4 >= $7->GetValueWidth()) - yyerror("Parsing: Wrong width in BVEXTRACT\n"); - - ASTNode hi = parserInterface->CreateBVConst(32, $4); - ASTNode low = parserInterface->CreateBVConst(32, $5); - ASTNode output = parserInterface->nf->CreateTerm(BVEXTRACT, width, *$7,hi,low); - ASTNode * n = parserInterface->newNode(output); - $$ = n; - parserInterface->deleteNode( $7); -} -| LPAREN_TOK UNDERSCORE_TOK BVZX_TOK NUMERAL_TOK RPAREN_TOK an_term -{ - if (0 != $4) - { - unsigned w = $6->GetValueWidth() + $4; - ASTNode leading_zeroes = parserInterface->CreateZeroConst($4); - ASTNode *n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVCONCAT,w,leading_zeroes,*$6)); - $$ = n; - parserInterface->deleteNode( $6); - } - else - $$ = $6; -} -| LPAREN_TOK UNDERSCORE_TOK BVSX_TOK NUMERAL_TOK RPAREN_TOK an_term -{ - unsigned w = $6->GetValueWidth() + $4; - ASTNode width = parserInterface->CreateBVConst(32,w); - ASTNode *n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVSX,w,*$6,width)); - $$ = n; - parserInterface->deleteNode( $6); -} - -| ITE_TOK an_formula an_term an_term -{ - const unsigned int width = $3->GetValueWidth(); - $$ = parserInterface->newNode(parserInterface->nf->CreateArrayTerm(ITE,$4->GetIndexWidth(), width,*$2, *$3, *$4)); - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); - parserInterface->deleteNode( $4); -} -| BVCONCAT_TOK an_term an_term -{ - const unsigned int width = $2->GetValueWidth() + $3->GetValueWidth(); - ASTNode * n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVCONCAT, width, *$2, *$3)); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVNOT_TOK an_term -{ - //this is the BVNEG (term) in the CVCL language - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVNEG, width, *$2)); - $$ = n; - parserInterface->deleteNode( $2); -} -| BVNEG_TOK an_term -{ - //this is the BVUMINUS term in CVCL langauge - unsigned width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVUMINUS,width,*$2)); - $$ = n; - parserInterface->deleteNode( $2); -} -| BVAND_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVAND, width, *$2, *$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVOR_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVOR, width, *$2, *$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVXOR_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVXOR, width, *$2, *$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVXNOR_TOK an_term an_term -{ -// (bvxnor s t) abbreviates (bvor (bvand s t) (bvand (bvnot s) (bvnot t))) - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode( - parserInterface->nf->CreateTerm( BVOR, width, - parserInterface->nf->CreateTerm(BVAND, width, *$2, *$3), - parserInterface->nf->CreateTerm(BVAND, width, - parserInterface->nf->CreateTerm(BVNEG, width, *$2), - parserInterface->nf->CreateTerm(BVNEG, width, *$3) - ))); - - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVCOMP_TOK an_term an_term -{ - ASTNode * n = parserInterface->newNode(parserInterface->nf->CreateTerm(ITE, 1, - parserInterface->nf->CreateNode(EQ, *$2, *$3), - parserInterface->CreateOneConst(1), - parserInterface->CreateZeroConst(1))); - - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVSUB_TOK an_term an_term -{ - const unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVSUB, width, *$2, *$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVPLUS_TOK an_term an_term -{ - const unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVPLUS, width, *$2, *$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); - -} -| BVMULT_TOK an_term an_term -{ - const unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVMULT, width, *$2, *$3)); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVDIV_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVDIV, width, *$2, *$3); - $$ = n; - - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVMOD_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVMOD, width, *$2, *$3); - $$ = n; - - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| SBVDIV_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(SBVDIV, width, *$2, *$3); - $$ = n; - - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| SBVREM_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(SBVREM, width, *$2, *$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| SBVMOD_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(SBVMOD, width, *$2, *$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVNAND_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVNEG, width, parserInterface->nf->CreateTerm(BVAND, width, *$2, *$3))); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVNOR_TOK an_term an_term -{ - unsigned int width = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVNEG, width, parserInterface->nf->CreateTerm(BVOR, width, *$2, *$3))); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVLEFTSHIFT_1_TOK an_term an_term -{ - // shifting left by who know how much? - unsigned int w = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVLEFTSHIFT,w,*$2,*$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVRIGHTSHIFT_1_TOK an_term an_term -{ - // shifting right by who know how much? - unsigned int w = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVRIGHTSHIFT,w,*$2,*$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| BVARITHRIGHTSHIFT_TOK an_term an_term -{ - // shifting arithmetic right by who know how much? - unsigned int w = $2->GetValueWidth(); - ASTNode * n = parserInterface->newNode(BVSRSHIFT,w,*$2,*$3); - $$ = n; - parserInterface->deleteNode( $2); - parserInterface->deleteNode( $3); -} -| LPAREN_TOK UNDERSCORE_TOK BVROTATE_LEFT_TOK NUMERAL_TOK RPAREN_TOK an_term -{ - ASTNode *n; - unsigned width = $6->GetValueWidth(); - unsigned rotate = $4 % width; - if (0 == rotate) - { - n = $6; - } - else - { - ASTNode high = parserInterface->CreateBVConst(32,width-1); - ASTNode zero = parserInterface->CreateBVConst(32,0); - ASTNode cut = parserInterface->CreateBVConst(32,width-rotate); - ASTNode cutMinusOne = parserInterface->CreateBVConst(32,width-rotate-1); - - ASTNode top = parserInterface->nf->CreateTerm(BVEXTRACT,rotate,*$6,high, cut); - ASTNode bottom = parserInterface->nf->CreateTerm(BVEXTRACT,width-rotate,*$6,cutMinusOne,zero); - n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVCONCAT,width,bottom,top)); - parserInterface->deleteNode( $6); - - - } - - $$ = n; -} -| LPAREN_TOK UNDERSCORE_TOK BVROTATE_RIGHT_TOK NUMERAL_TOK RPAREN_TOK an_term -{ - ASTNode *n; - unsigned width = $6->GetValueWidth(); - unsigned rotate = $4 % width; - if (0 == rotate) - { - n = $6; - } - else - { - ASTNode high = parserInterface->CreateBVConst(32,width-1); - ASTNode zero = parserInterface->CreateBVConst(32,0); - ASTNode cut = parserInterface->CreateBVConst(32,rotate); - ASTNode cutMinusOne = parserInterface->CreateBVConst(32,rotate-1); - - ASTNode bottom = parserInterface->nf->CreateTerm(BVEXTRACT,rotate,*$6,cutMinusOne, zero); - ASTNode top = parserInterface->nf->CreateTerm(BVEXTRACT,width-rotate,*$6,high,cut); - n = parserInterface->newNode(parserInterface->nf->CreateTerm(BVCONCAT,width,bottom,top)); - parserInterface->deleteNode( $6); - } - - $$ = n; -} -| LPAREN_TOK UNDERSCORE_TOK BVREPEAT_TOK NUMERAL_TOK RPAREN_TOK an_term -{ - unsigned count = $4; - if (count < 1) - FatalError("One or more repeats please"); - - unsigned w = $6->GetValueWidth(); - ASTNode n = *$6; - - for (unsigned i =1; i < count; i++) - { - n = parserInterface->nf->CreateTerm(BVCONCAT,w*(i+1),n,*$6); - } - $$ = parserInterface->newNode(n); - parserInterface->deleteNode( $6); -} -| UNDERSCORE_TOK BVCONST_DECIMAL_TOK NUMERAL_TOK -{ - $$ = parserInterface->newNode(parserInterface->CreateBVConst(*$2, 10, $3)); - $$->SetValueWidth($3); - delete $2; -} -| BVCONST_HEXIDECIMAL_TOK -{ - unsigned width = $1->length()*4; - $$ = parserInterface->newNode(parserInterface->CreateBVConst(*$1, 16, width)); - $$->SetValueWidth(width); - delete $1; -} -| BVCONST_BINARY_TOK -{ - unsigned width = $1->length(); - $$ = parserInterface->newNode(parserInterface->CreateBVConst(*$1, 2, width)); - $$->SetValueWidth(width); - delete $1; -} -; - -%% diff --git a/src/vendor/stp/src/printer/AssortedPrinters.cpp b/src/vendor/stp/src/printer/AssortedPrinters.cpp deleted file mode 100644 index 987a380df..000000000 --- a/src/vendor/stp/src/printer/AssortedPrinters.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "printers.h" -#include "AssortedPrinters.h" - -// to get the PRIu64 macro from inttypes, this needs to be defined. -#ifndef __STDC_FORMAT_MACROS - #define __STDC_FORMAT_MACROS -#endif -#include -//#undef __STDC_FORMAT_MACROS - -namespace BEEV -{ - /****************************************************************** - * Assorted print routines collected in one place. The code here is - * different from the one in printers directory. It is possible that - * there is some duplication. - * - * FIXME: Get rid of any redundant code - ******************************************************************/ - - ostream &ASTNode::LispPrint(ostream &os, int indentation) const - { - return printer::Lisp_Print(os, *this, indentation); - } - - ostream &ASTNode::LispPrint_indent(ostream &os, int indentation) const - { - return printer::Lisp_Print_indent(os, *this, indentation); - } - - ostream& ASTNode::PL_Print(ostream &os, int indentation) const - { - return printer::PL_Print(os, *this, indentation); - } - - //This is the IO manipulator. It builds an object of class - //"LispPrinter" that has a special overloaded "<<" operator. - inline LispPrinter lisp(const ASTNode &node, int indentation = 0) - { - LispPrinter lp(node, indentation); - return lp; - } //end of LispPrinter_lisp - - //iomanipulator. builds an object of class "LisPrinter" that has a - //special overloaded "<<" operator. - inline LispVecPrinter lisp(const ASTVec &vec, int indentation = 0) - { - LispVecPrinter lvp(vec, indentation); - return lvp; - } //end of LispVecPrinter_lisp() - - // FIXME: Made non-ref in the hope that it would work better. - void lp(ASTNode node) - { - cout << lisp(node) << endl; - } - - void lpvec(const ASTVec &vec) - { - (vec[0].GetSTPMgr())->AlreadyPrintedSet.clear(); - LispPrintVec(cout, vec, 0); - cout << endl; - } - - // //Variable Order Printer: A global function which converts a MINISAT - // //var into a ASTNODE var. It then prints this var along with - // //variable order dcisions taken by MINISAT. - // void Convert_MINISATVar_To_ASTNode_Print(int minisat_var, - // int decision_level, int polarity) - // { - // BEEV::ASTNode vv = BEEV::GlobalSTPMgr->_SATVar_to_AST[minisat_var]; - // cout << spaces(decision_level); - // if (polarity) - // { - // cout << "!"; - // } - // printer::PL_Print(cout,vv, 0); - // cout << endl; - // } //end of Convert_MINISATVar_To_ASTNode_Print() - - void STPMgr::printVarDeclsToStream(ostream &os, ASTNodeSet& ListOfDeclaredVars) { - for(ASTNodeSet::iterator - i = ListOfDeclaredVars.begin(),iend=ListOfDeclaredVars.end(); - i!=iend;i++) - { - BEEV::ASTNode a = *i; - switch(a.GetType()) { - case BEEV::BITVECTOR_TYPE: - a.PL_Print(os); - os << " : BITVECTOR(" << a.GetValueWidth() << ");" << endl; - break; - case BEEV::ARRAY_TYPE: - a.PL_Print(os); - os << " : ARRAY " << "BITVECTOR(" << a.GetIndexWidth() << ") OF "; - os << "BITVECTOR(" << a.GetValueWidth() << ");" << endl; - break; - case BEEV::BOOLEAN_TYPE: - a.PL_Print(os); - os << " : BOOLEAN;" << endl; - break; - default: - BEEV::FatalError("vc_printDeclsToStream: Unsupported type",a); - break; - } - } - } //printVarDeclsToStream - - void STPMgr::printAssertsToStream(ostream &os, int simplify_print) { - ASTVec v = GetAsserts(); - for(ASTVec::iterator i=v.begin(),iend=v.end();i!=iend;i++) { - //Begin_RemoveWrites = true; ASTNode q = (simplify_print == 1) ? - //SimplifyFormula_TopLevel(*i,false) : *i; q = (simplify_print - //== 1) ? SimplifyFormula_TopLevel(q,false) : q; - ASTNode q = *i; - //Begin_RemoveWrites = false; - os << "ASSERT( "; - q.PL_Print(os); - os << ");" << endl; - } - } - - void print_STPInput_Back(const ASTNode& query) { - - // Determine the symbols in the query and asserts. - ASTNodeSet visited; - ASTNodeSet symbols; - buildListOfSymbols(query, visited, symbols); - ASTVec v = (BEEV::GlobalSTP->bm)->GetAsserts(); - for(ASTVec::iterator i=v.begin(),iend=v.end();i!=iend;i++) - buildListOfSymbols(*i, visited, symbols); - - (BEEV::GlobalSTP->bm)->printVarDeclsToStream(cout, symbols); - (BEEV::GlobalSTP->bm)->printAssertsToStream(cout,0); - cout << "QUERY("; - query.PL_Print(cout); - cout << ");\n"; - } //end of print_STPInput_Back() -};//end of namespace BEEV diff --git a/src/vendor/stp/src/printer/AssortedPrinters.h b/src/vendor/stp/src/printer/AssortedPrinters.h deleted file mode 100644 index 90d0dc869..000000000 --- a/src/vendor/stp/src/printer/AssortedPrinters.h +++ /dev/null @@ -1,80 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef PRINTER_H -#define PRINTER_H - -#include "../AST/AST.h" -namespace BEEV -{ - using namespace std; - - /*************************************************************************** - Class LispPrinter: iomanipulator for printing ASTNode or ASTVec - ***************************************************************************/ - class LispPrinter - { - - public: - ASTNode _node; - - // number of spaces to print before first real character of - // object. - int _indentation; - - // FIXME: pass ASTNode by reference - // Constructor to build the LispPrinter object - LispPrinter(ASTNode node, int indentation) : - _node(node), _indentation(indentation) - { - } - - friend ostream &operator<<(ostream &os, const LispPrinter &lp) - { - return lp._node.LispPrint(os, lp._indentation); - } - ; - - }; //End of ListPrinter - - /***************************************************************************/ - /* Class LispVecPrinter:iomanipulator for printing vector of ASTNodes */ - /***************************************************************************/ - class LispVecPrinter - { - - public: - const ASTVec * _vec; - // number of spaces to print before first real - // character of object. - int _indentation; - - // Constructor to build the LispPrinter object - LispVecPrinter(const ASTVec &vec, int indentation) - { - _vec = &vec; - _indentation = indentation; - } - - friend ostream &operator<<(ostream &os, const LispVecPrinter &lvp) - { - LispPrintVec(os, *lvp._vec, lvp._indentation); - return os; - } - ; - }; //End of Class ListVecPrinter - - //global function which accepts an integer and looks up the - //corresponding ASTNode and prints a string of that ASTNode - void Convert_MINISATVar_To_ASTNode_Print(int minisat_var, - int decision, int polarity=0); - - void print_STPInput_Back(const ASTNode& query); -};// end of namespace BEEV -#endif diff --git a/src/vendor/stp/src/printer/BenchPrinter.cpp b/src/vendor/stp/src/printer/BenchPrinter.cpp deleted file mode 100644 index 3f0424f31..000000000 --- a/src/vendor/stp/src/printer/BenchPrinter.cpp +++ /dev/null @@ -1,212 +0,0 @@ -#include "printers.h" -#include -#include "../AST/ASTKind.h" -#include - -/* - * Bench format which the ABC logic synthesis tool can read. - * No more than 2-arity seem to be accepted. - */ - -namespace printer -{ -using std::string; -using namespace BEEV; - -string name(const Kind k) -{ - return _kind_names[k]; -} - -string bvconstToString(const ASTNode& n) -{ - assert (n.GetKind() == BVCONST); - std::stringstream output; - output << *n.GetBVConst(); - return output.str(); -} - -// ABC doesn't like spaces, nor brackets. in variable names. -// TODO CHECK that this doesn't cause duplicate names -string symbolToString(const ASTNode &n) -{ - assert(n.GetKind() == SYMBOL); - std::stringstream output; - n.nodeprint(output); - - string result = output.str(); - replace(result.begin(), result.end(), ' ', '_'); - replace(result.begin(), result.end(), '(', '_'); - replace(result.begin(), result.end(), ')', '_'); - - return result; - -} - -string Bench_Print1(ostream &os, const ASTNode& n, - map *alreadyOutput) -{ - - assert(((n.GetKind() == SYMBOL) || (n.GetKind() == BVCONST) || n.GetValueWidth() <= 1)); - assert(!n.IsNull()); - - map::iterator it; - if ((it = alreadyOutput->find(n)) != alreadyOutput->end()) - return it->second; - - if (n.GetKind() == BVCONST) - { - (*alreadyOutput)[n] = bvconstToString(n); - return (*alreadyOutput)[n]; - } - - if (n.GetKind() == SYMBOL) - { - (*alreadyOutput)[n] = symbolToString(n); - return (*alreadyOutput)[n]; - } - - if (n.GetKind() == TRUE) - { - return "vdd"; - } - - if (n.GetKind() == FALSE) - { - return "gnd"; - } - - if (n.GetKind() == BVGETBIT) - { - assert(n[1].GetKind() == BVCONST); - std::stringstream nn; - nn << Bench_Print1(os, n[0], alreadyOutput) << "_" << Bench_Print1(os, n[1], alreadyOutput); - (*alreadyOutput)[n] = nn.str(); - return (*alreadyOutput)[n]; - } - - std::stringstream nodeNameSS; - nodeNameSS << "n" << n.GetNodeNum(); - - string thisNode = nodeNameSS.str(); - (*alreadyOutput)[n] = thisNode; - - assert(n.Degree() > 0); - std::stringstream output; - - // The bench format doesn't accept propositional ITEs. - if (n.GetKind() == ITE) - { - assert(n.Degree() == 3); - string p = Bench_Print1(os, n[0], alreadyOutput); - string p1 = Bench_Print1(os, n[1], alreadyOutput); - string p2 = Bench_Print1(os, n[2], alreadyOutput); - - os << thisNode << "_1 = AND(" << p << "," << p1 << ")" << endl; - os << thisNode << "_2" << " = NOT(" << p << ")," << endl; - os << thisNode << "_3" << " = AND(" << thisNode << "_2" - << "," << p2 << ")" << endl; - os << thisNode << "=" << "OR(," << thisNode << "_1" << "," - << thisNode << "_3)" << endl; - } - else - { - if (n.Degree() > 2) - { - assert(n.GetKind() == AND || n.GetKind() == XOR || n.GetKind() == OR); // must be associative. - deque names; - - for (unsigned i = 0; i < n.Degree(); i++) - names.push_back(Bench_Print1(os, n[i], alreadyOutput)); - - int id = 0; - - while (names.size() > 2) - { - string a = names.front(); - names.pop_front(); - - string b = names.front(); - names.pop_front(); - - std::stringstream thisName; - thisName << thisNode << "___" << id++; - - output << thisName.str() << "=" << name(n.GetKind()) << "(" - << a << "," << b << ")" << endl; - - names.push_back(thisName.str()); - } - - assert(names.size() == 2); - // last two now. - - string a = names.front(); - names.pop_front(); - string b = names.front(); - names.pop_front(); - - output << thisNode << "=" << name(n.GetKind()) << "(" << a - << "," << b << ")" << endl; - os << output.str(); - } - else - { - output << thisNode << "=" << name(n.GetKind()) << "("; - for (unsigned i = 0; i < n.Degree(); i++) - { - if (i >= 1) - output << " , "; - output << Bench_Print1(os, n[i], alreadyOutput); - - } - os << output.str() << ")" << endl; - } - } - return thisNode; -} - -void OutputInputs(ostream &os, const ASTNode& n, hash_set *alreadyOutput) -{ - if (alreadyOutput->find(n.GetNodeNum()) != alreadyOutput->end()) - return; - - alreadyOutput->insert(n.GetNodeNum()); - - if (n.GetKind() == BVGETBIT) - { - assert(n[1].GetKind() == BVCONST); - std::stringstream nn; - n[0].nodeprint(nn); - nn << "_" << bvconstToString(n[1]); - os << "INPUT(" << nn.str() << ")" << endl; - return; - } - - // A boolean symbol. - if (n.GetKind() == SYMBOL) - { - os << "INPUT(" << symbolToString(n) << ")" << endl; - return; - } - - for (unsigned i = 0; i < n.Degree(); i++) - { - OutputInputs(os, n[i], alreadyOutput); - } -} - -ostream& Bench_Print(ostream &os, const ASTNode n) -{ - hash_set alreadyOutput2; - - OutputInputs(os, n, &alreadyOutput2); - - map alreadyOutput; - - os << "OUTPUT(" << "n" << n.GetNodeNum() << ")" << endl; - Bench_Print1(os, n, &alreadyOutput); - return os; -} -} -; diff --git a/src/vendor/stp/src/printer/CPrinter.cpp b/src/vendor/stp/src/printer/CPrinter.cpp deleted file mode 100644 index dce9d364a..000000000 --- a/src/vendor/stp/src/printer/CPrinter.cpp +++ /dev/null @@ -1,532 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include -#include "printers.h" -namespace printer -{ - - using std::string; - using namespace BEEV; - - // printer for C code (copied from PL_Print()) - // TODO: this does not fully implement printing of all of the STP - // language - FatalError calls inserted for unimplemented - // functionality, e.g.,: - // FatalError("C_Print1: printing not implemented for this kind: ",*this); - - // helper function for printing C code (copied from PL_Print1()) - void C_Print1(ostream& os, const ASTNode n, int indentation, bool letize) - { - - unsigned int upper, lower, num_bytes; - Kind LHSkind, RHSkind; - - //os << spaces(indentation); - //os << endl << spaces(indentation); - if (!n.IsDefined()) - { - os << ""; - return; - } - - //if this node is present in the letvar Map, then print the letvar - STPMgr *bm = n.GetSTPMgr(); - - //this is to print letvars for shared subterms inside the printing - //of "(LET v0 = term1, v1=term1@term2,... - if ((bm->NodeLetVarMap1.find(n) != bm->NodeLetVarMap1.end()) && !letize) - { - C_Print1(os, (bm->NodeLetVarMap1[n]), indentation, letize); - return; - } - - //this is to print letvars for shared subterms inside the actual - //term to be printed - if ((bm->NodeLetVarMap.find(n) != bm->NodeLetVarMap.end()) && letize) - { - C_Print1(os, (bm->NodeLetVarMap[n]), indentation, letize); - return; - } - - //otherwise print it normally - Kind kind = n.GetKind(); - const ASTVec &c = n.GetChildren(); - switch (kind) - { - case BVGETBIT: - FatalError("C_Print1: printing not implemented for this kind: ", n); - C_Print1(os, c[0], indentation, letize); - os << "{"; - C_Print1(os, c[1], indentation, letize); - os << "}"; - break; - case BITVECTOR: - FatalError("C_Print1: printing not implemented for this kind: ", n); - os << "BITVECTOR("; - unsigned char * str; - str = CONSTANTBV::BitVector_to_Hex(c[0].GetBVConst()); - os << str << ")"; - CONSTANTBV::BitVector_Dispose(str); - break; - case BOOLEAN: - FatalError("C_Print1: printing not implemented for this kind: ", n); - os << "BOOLEAN"; - break; - case FALSE: - os << "0"; - break; - case TRUE: - os << "1"; - break; - case BVCONST: - case SYMBOL: - // print in C friendly format: - n.nodeprint(os, true); - break; - case READ: - C_Print1(os, c[0], indentation, letize); - os << "["; - C_Print1(os, c[1], indentation, letize); - os << "]"; - break; - case WRITE: - os << "("; - C_Print1(os, c[0], indentation, letize); - os << " WITH ["; - C_Print1(os, c[1], indentation, letize); - os << "] := "; - C_Print1(os, c[2], indentation, letize); - os << ")"; - os << endl; - break; - case BVUMINUS: - os << kind << "( "; - C_Print1(os, c[0], indentation, letize); - os << ")"; - break; - case NOT: - os << "!("; - C_Print1(os, c[0], indentation, letize); - os << ") " << endl; - break; - case BVNEG: - os << " ~("; - C_Print1(os, c[0], indentation, letize); - os << ")"; - break; - case BVCONCAT: - // stopgap for un-implemented features - FatalError("C_Print1: printing not implemented for this kind: ", n); - os << "("; - C_Print1(os, c[0], indentation, letize); - os << " @ "; - C_Print1(os, c[1], indentation, letize); - os << ")" << endl; - break; - case BVOR: - os << "("; - C_Print1(os, c[0], indentation, letize); - os << " | "; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVAND: - os << "("; - C_Print1(os, c[0], indentation, letize); - os << " & "; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVEXTRACT: - - // we only accept indices that are byte-aligned - // (e.g., [15:8], [23:16]) - // and round down to byte indices rather than bit indices - upper = c[1].GetUnsignedConst(); - lower = c[2].GetUnsignedConst(); - assert(upper > lower); - assert(lower % 8 == 0); - assert((upper + 1) % 8 == 0); - num_bytes = (upper - lower + 1) / 8; - assert (num_bytes > 0); - - // for multi-byte extraction, use the ADDRESS - if (num_bytes > 1) - { - os << "&"; - C_Print1(os, c[0], indentation, letize); - os << "[" << lower / 8 << "]"; - } - // for single-byte extraction, use the VALUE - else - { - C_Print1(os, c[0], indentation, letize); - os << "[" << lower / 8 << "]"; - } - - break; - case BVLEFTSHIFT: - // stopgap for un-implemented features - FatalError("C_Print1: printing not implemented for this kind: ", n); - os << "("; - C_Print1(os, c[0], indentation, letize); - os << " << "; - os << c[1].GetUnsignedConst(); - os << ")"; - break; - case BVRIGHTSHIFT: - // stopgap for un-implemented features - FatalError("C_Print1: printing not implemented for this kind: ", n); - os << "("; - C_Print1(os, c[0], indentation, letize); - os << " >> "; - os << c[1].GetUnsignedConst(); - os << ")"; - break; - case BVMULT: - case BVSUB: - case BVPLUS: - case SBVDIV: - case SBVREM: - case BVDIV: - case BVMOD: - os << kind << "("; - os << n.GetValueWidth(); - for (ASTVec::const_iterator - it = c.begin(), itend = c.end(); it != itend; it++) - { - os << ", " << endl; - C_Print1(os, *it, indentation, letize); - } - os << ")" << endl; - break; - case ITE: - os << "if ("; - C_Print1(os, c[0], indentation, letize); - os << ")" << endl; - os << "{"; - C_Print1(os, c[1], indentation, letize); - os << endl << "} else {"; - C_Print1(os, c[2], indentation, letize); - os << endl << "}"; - break; - case BVLT: - // convert to UNSIGNED before doing comparison! - os << "((unsigned char)"; - C_Print1(os, c[0], indentation, letize); - os << " < "; - os << "(unsigned char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVLE: - // convert to UNSIGNED before doing comparison! - os << "((unsigned char)"; - C_Print1(os, c[0], indentation, letize); - os << " <= "; - os << "(unsigned char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVGT: - // convert to UNSIGNED before doing comparison! - os << "((unsigned char)"; - C_Print1(os, c[0], indentation, letize); - os << " > "; - os << "(unsigned char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVGE: - // convert to UNSIGNED before doing comparison! - os << "((unsigned char)"; - C_Print1(os, c[0], indentation, letize); - os << " >= "; - os << "(unsigned char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVXOR: - case BVNAND: - case BVNOR: - case BVXNOR: - // stopgap for un-implemented features - FatalError("C_Print1: printing not implemented for this kind: ", n); - break; - case BVSLT: - // convert to SIGNED before doing comparison! - os << "((signed char)"; - C_Print1(os, c[0], indentation, letize); - os << " < "; - os << "(signed char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVSLE: - // convert to SIGNED before doing comparison! - os << "((signed char)"; - C_Print1(os, c[0], indentation, letize); - os << " <= "; - os << "(signed char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVSGT: - // convert to SIGNED before doing comparison! - os << "((signed char)"; - C_Print1(os, c[0], indentation, letize); - os << " > "; - os << "(signed char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case BVSGE: - // convert to SIGNED before doing comparison! - os << "((signed char)"; - C_Print1(os, c[0], indentation, letize); - os << " >= "; - os << "(signed char)"; - C_Print1(os, c[1], indentation, letize); - os << ")"; - break; - case EQ: - // tricky tricky ... if it's a single-byte comparison, - // simply do ==, but if it's multi-byte, must do memcmp - LHSkind = c[0].GetKind(); - RHSkind = c[1].GetKind(); - - num_bytes = 0; - - // try to figure out whether it's a single-byte or multi-byte - // comparison - if (LHSkind == BVEXTRACT) - { - upper = c[0].GetChildren()[1].GetUnsignedConst(); - lower = c[0].GetChildren()[2].GetUnsignedConst(); - num_bytes = (upper - lower + 1) / 8; - } - else if (RHSkind == BVEXTRACT) - { - upper = c[1].GetChildren()[1].GetUnsignedConst(); - lower = c[1].GetChildren()[2].GetUnsignedConst(); - num_bytes = (upper - lower + 1) / 8; - } - - if (num_bytes > 1) - { - os << "(memcmp("; - C_Print1(os, c[0], indentation, letize); - os << ", "; - C_Print1(os, c[1], indentation, letize); - os << ", "; - os << num_bytes; - os << ") == 0)"; - } - else if (num_bytes == 1) - { - os << "("; - C_Print1(os, c[0], indentation, letize); - os << " == "; - C_Print1(os, c[1], indentation, letize); - os << ")"; - } - else - { - FatalError("C_Print1: ugh problem in implementing =="); - } - - break; - case AND: - case OR: - case NAND: - case NOR: - case XOR: - { - os << "("; - C_Print1(os, c[0], indentation, letize); - ASTVec::const_iterator it = c.begin(); - ASTVec::const_iterator itend = c.end(); - - it++; - for (; it != itend; it++) - { - switch (kind) - { - case AND: - os << " && "; - break; - case OR: - os << " || "; - break; - case NAND: - FatalError("unsupported boolean type in C_Print1"); - break; - case NOR: - FatalError("unsupported boolean type in C_Print1"); - break; - case XOR: - FatalError("unsupported boolean type in C_Print1"); - break; - default: - FatalError("unsupported boolean type in C_Print1"); - } - C_Print1(os, *it, indentation, letize); - } - os << ")"; - break; - } - case IFF: - // stopgap for un-implemented features - FatalError("C_Print1: printing not implemented for this kind: ", n); - os << "("; - os << "("; - C_Print1(os, c[0], indentation, letize); - os << ")"; - os << " <=> "; - os << "("; - C_Print1(os, c[1], indentation, letize); - os << ")"; - os << ")"; - os << endl; - break; - case IMPLIES: - // stopgap for un-implemented features - FatalError("C_Print1: printing not implemented for this kind: ", n); - os << "("; - os << "("; - C_Print1(os, c[0], indentation, letize); - os << ")"; - os << " => "; - os << "("; - C_Print1(os, c[1], indentation, letize); - os << ")"; - os << ")"; - os << endl; - break; - case BVSX: - // stopgap for un-implemented features - FatalError("C_Print1: printing not implemented for this kind: ", n); - - os << kind << "("; - C_Print1(os, c[0], indentation, letize); - os << ","; - os << n.GetValueWidth(); - os << ")" << endl; - break; - default: - //remember to use LispPrinter here. Otherwise this function will - //go into an infinite loop. Recall that "<<" is overloaded to - //the lisp printer. FatalError uses lispprinter - FatalError("C_Print1: printing not implemented for this kind: ", n); - break; - } - } //end of C_Print1() - - - //two pass algorithm: - // - //1. In the first pass, letize this Node, N: i.e. if a node - //1. appears more than once in N, then record this fact. - // - //2. In the second pass print a "global let" and then print N - //2. as follows: Every occurence of a node occuring more than - //2. once is replaced with the corresponding let variable. - ostream& C_Print(ostream &os, const ASTNode n, int indentation) - { - // Clear the PrintMap - STPMgr* bm = n.GetSTPMgr(); - bm->PLPrintNodeSet.clear(); - bm->NodeLetVarMap.clear(); - bm->NodeLetVarVec.clear(); - bm->NodeLetVarMap1.clear(); - - //pass 1: letize the node - n.LetizeNode(); - - unsigned int lower, upper, num_bytes = 0; - - //pass 2: - // - //2. print all the let variables and their counterpart expressions - //2. as follows (LET var1 = expr1, var2 = expr2, ... - // - //3. Then print the Node itself, replacing every occurence of - //3. expr1 with var1, expr2 with var2, ... - //os << "("; - if (0 < bm->NodeLetVarMap.size()) - { - //ASTNodeMap::iterator it=bm->NodeLetVarMap.begin(); - //ASTNodeMap::iterator itend=bm->NodeLetVarMap.end(); - std::vector >::iterator it = - bm->NodeLetVarVec.begin(); - std::vector >::iterator itend = - bm->NodeLetVarVec.end(); - - // start a new block to create new static scope - os << "{" << endl; - - for (; it != itend; it++) - { - - // see if it's a BVEXTRACT, and if so, whether it's multi-byte - if (it->second.GetKind() == BVEXTRACT) - { - upper = it->second.GetChildren()[1].GetUnsignedConst(); - lower = it->second.GetChildren()[2].GetUnsignedConst(); - num_bytes = (upper - lower + 1) / 8; - assert(num_bytes > 0); - } - - //print the let var first - if (num_bytes > 1) - { - // for multi-byte assignment, use 'memcpy' and array notation - os << "unsigned char "; - C_Print1(os, it->first, indentation, false); - os << "[" << num_bytes << "]; "; - os << "memcpy("; - C_Print1(os, it->first, indentation, false); - os << ", "; - //print the expr - C_Print1(os, it->second, indentation, false); - os << ", " << num_bytes << ");"; - } - else - { - // for single-byte assignment, use '=' - os << "unsigned char "; - C_Print1(os, it->first, indentation, false); - os << " = "; - //print the expr - C_Print1(os, it->second, indentation, false); - os << ";" << endl; - } - - //update the second map for proper printing of LET - bm->NodeLetVarMap1[it->second] = it->first; - } - - os << endl << "stp_assert "; - C_Print1(os, n, indentation, true); - - os << ";" << endl << "}"; - } - else - { - os << "stp_assert "; - C_Print1(os, n, indentation, false); - os << ";"; - } - //os << " )"; - //os << " "; - - return os; - } //end of C_Print() -} diff --git a/src/vendor/stp/src/printer/GDLPrinter.cpp b/src/vendor/stp/src/printer/GDLPrinter.cpp deleted file mode 100644 index 89e4c3ef9..000000000 --- a/src/vendor/stp/src/printer/GDLPrinter.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// Outputs in the Graph Description Langauge format (GDL) -// can be laid out by the graph layout tool: aiSee. - -// todo: this contains only small differences to the dotprinter.cpp. they should be merged. - -/******************************************************************** - * AUTHORS: Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "printers.h" -#include - -namespace printer -{ - - using std::string; - using namespace BEEV; - - void outputBitVec(const ASTNode n, ostream& os); - - void GDL_Print1(ostream &os, const ASTNode& n, hash_set *alreadyOutput, string (*annotate)(const ASTNode&)) - { - // check if this node has already been printed. If so return. - if (alreadyOutput->find(n.GetNodeNum()) != alreadyOutput->end()) - return; - - alreadyOutput->insert(n.GetNodeNum()); - - os << "node: { title:\"n" << n.GetNodeNum() << "\" label: \""; - switch (n.GetKind()) - { - case SYMBOL: - n.nodeprint(os); - break; - - case BITVECTOR: - case BVCONST: - outputBitVec(n, os); - break; - - default: - os << _kind_names[n.GetKind()]; - } - - os << annotate(n); - os << "\"}" << endl; - - // print the edges to each child. - const ASTVec ch = n.GetChildren(); - const ASTVec::const_iterator itend = ch.end(); - - //If a node has the child 'TRUE' twice, we only want to output one TRUE node. - ASTNodeSet constantOutput; - - int i =0; - for (ASTVec::const_iterator it = ch.begin(); it < itend; it++) - { - std::stringstream label; - - if (!isCommutative(n.GetKind())) - label << " label:\"" << i << "\""; - - if (it->isConstant()) - { - std::stringstream ss; - ss << n.GetNodeNum() << "_" << it->GetNodeNum(); - - if (constantOutput.end() == constantOutput.find(*it)) - { - os << "node: { title:\"n"; - - os << ss.str() << "\" label: \""; - if (it->GetType() == BEEV::BOOLEAN_TYPE) - os << _kind_names[it->GetKind()]; - else - outputBitVec(*it, os); - os << "\"}" << endl; - constantOutput.insert(*it); - } - - os << "edge: { source:\"n" << n.GetNodeNum() << "\" target: \"" << "n" << ss.str() << "\"" << label.str() << "}" << endl; - } - else - os << "edge: { source:\"n" << n.GetNodeNum() << "\" target: \"" << "n" << it->GetNodeNum() << "\"" << label.str() << "}" << endl; - i++; - } - - // print each of the children. - for (ASTVec::const_iterator it = ch.begin(); it < itend; it++) - { - if (!it->isConstant()) - GDL_Print1(os, *it, alreadyOutput,annotate); - } - } - - - string empty(const ASTNode& n) - { - return ""; - } - - - - ostream& GDL_Print(ostream &os, const ASTNode n, string (*annotate)(const ASTNode&)) - { - - os << "graph: {" << endl; - os << "splines: yes" << endl; - os << "layoutalgorithm: dfs" << endl; - os << "display_edge_labels: yes" << endl; - - - // create hashmap to hold integers (node numbers). - hash_set alreadyOutput; - - GDL_Print1(os, n, &alreadyOutput,annotate);; - - os << "}" << endl; - - return os; - } - - ostream& GDL_Print(ostream &os, const ASTNode n) - { - return GDL_Print(os,n,empty); - } - -} diff --git a/src/vendor/stp/src/printer/LispPrinter.cpp b/src/vendor/stp/src/printer/LispPrinter.cpp deleted file mode 100644 index f7fe05f0c..000000000 --- a/src/vendor/stp/src/printer/LispPrinter.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "printers.h" - -namespace printer -{ - - using std::string; - using namespace BEEV; - - ostream &Lisp_Print_indent(ostream &os, const ASTNode& n,int indentation); - - - /** Internal function to print in lisp format. Assume newline - and indentation printed already before first line. Recursive - calls will have newline & indent, though */ - ostream &Lisp_Print1(ostream &os, const ASTNode& n, int indentation) - { - if (!n.IsDefined()) - { - os << ""; - return os; - } - Kind kind = n.GetKind(); - // FIXME: figure out how to avoid symbols with same names as kinds. - // if (kind == READ) { - // const ASTVec &children = GetChildren(); - // children[0].LispPrint1(os, indentation); - // os << "[" << children[1] << "]"; - // } else - if (kind == BVGETBIT) - { - const ASTVec &children = n.GetChildren(); - // child 0 is a symbol. Print without the NodeNum. - os << n.GetNodeNum() << ":"; - - children[0].nodeprint(os,true); - os << "{"; - children[1].nodeprint(os,true); - os << "}"; - } - else if (kind == NOT) - { - const ASTVec &children = n.GetChildren(); - os << n.GetNodeNum() << ":"; - os << "(NOT "; - Lisp_Print1(os,children[0], indentation); - os << ")"; - } - else if (n.Degree() == 0) - { - // Symbol or a kind with no children print as index:NAME if shared, - // even if they have been printed before. - os << n.GetNodeNum() << ":"; - n.nodeprint(os,true); - // os << "(" << _int_node_ptr->_ref_count << ")"; - // os << "{" << GetValueWidth() << "}"; - } - else if (n.IsAlreadyPrinted()) - { - // print non-symbols as "[index]" if seen before. - os << "[" << n.GetNodeNum() << "]"; - // << "(" << _int_node_ptr->_ref_count << ")"; - } - else - { - n.MarkAlreadyPrinted(); - const ASTVec &children = n.GetChildren(); - os << n.GetNodeNum() << ":" - //<< "(" << _int_node_ptr->_ref_count << ")" - << "(" << kind << " "; - // os << "{" << GetValueWidth() << "}"; - ASTVec::const_iterator iend = children.end(); - for (ASTVec::const_iterator i = children.begin(); i != iend; i++) - { - Lisp_Print_indent(os, *i, indentation + 2); - } - os << ")"; - } - return os; - } - - // Print in lisp format - ostream &Lisp_Print(ostream &os, const ASTNode& n, int indentation) - { - // Clear the PrintMap - STPMgr* bm = n.GetSTPMgr(); - bm->AlreadyPrintedSet.clear(); - Lisp_Print_indent(os, n, indentation); - printf("\n"); - return os; - } - - // Print newline and indentation, then print the thing. - ostream &Lisp_Print_indent(ostream &os, const ASTNode& n,int indentation) - { - os << endl << spaces(indentation); - Lisp_Print1(os, n, indentation); - return os; - } - -} diff --git a/src/vendor/stp/src/printer/Makefile b/src/vendor/stp/src/printer/Makefile deleted file mode 100644 index b7a563651..000000000 --- a/src/vendor/stp/src/printer/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -OBJS = $(SRCS:.cpp=.o) - - -#Make the ast library for use by other modules -libprinter.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend - diff --git a/src/vendor/stp/src/printer/PLPrinter.cpp b/src/vendor/stp/src/printer/PLPrinter.cpp deleted file mode 100644 index 45afe483e..000000000 --- a/src/vendor/stp/src/printer/PLPrinter.cpp +++ /dev/null @@ -1,360 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "printers.h" - -namespace printer -{ - -using std::string; -using namespace BEEV; - -string functionToCVCName(const Kind k) { - switch (k) { - - case BVUMINUS: - case NOT: - case BVLT: - case BVLE: - case BVGT: - case BVGE: - case BVXOR: - case BVNAND: - case BVNOR: - case BVXNOR: - case BVMULT: - case AND: - case OR: - case NAND: - case NOR: - case XOR: - case BVSUB: - case BVPLUS: - case SBVDIV: - case SBVREM: - case BVDIV: - case BVMOD: - return _kind_names[k]; - break; - case BVSLT: - return "SBVLT"; - case BVSLE: - return "SBVLE"; - case BVSGT: - return "SBVGT"; - case BVSGE: - return "SBVGE"; - case IFF: - return "<=>"; - case IMPLIES: - return "=>"; - case BVNEG: - return "~"; - case EQ: - return "="; - case BVCONCAT: - return "@"; - case BVOR: - return "|"; - case BVAND: - return "&"; - case BVRIGHTSHIFT: - return ">>"; - default: { - cerr << "Unknown name when outputting:"; - FatalError(_kind_names[k]); - return ""; // to quieten compiler/ - } - } -} - - - void PL_Print1(ostream& os, const ASTNode& n,int indentation, bool letize) - { - //os << spaces(indentation); - //os << endl << spaces(indentation); - if (!n.IsDefined()) - { - os << ""; - return; - } - - //if this node is present in the letvar Map, then print the letvar - STPMgr *bm = n.GetSTPMgr(); - - //this is to print letvars for shared subterms inside the printing - //of "(LET v0 = term1, v1=term1@term2,... - if ((bm->NodeLetVarMap1.find(n) != bm->NodeLetVarMap1.end()) && !letize) - { - PL_Print1(os, (bm->NodeLetVarMap1[n]), indentation, letize); - return; - } - - //this is to print letvars for shared subterms inside the actual - //term to be printed - if ((bm->NodeLetVarMap.find(n) != bm->NodeLetVarMap.end()) && letize) - { - PL_Print1(os, (bm->NodeLetVarMap[n]), indentation, letize); - return; - } - - //otherwise print it normally - const Kind kind = n.GetKind(); - const ASTVec &c = n.GetChildren(); - switch (kind) - { - case BVGETBIT: - PL_Print1(os, c[0], indentation, letize); - os << "{"; - PL_Print1(os, c[1],indentation, letize); - os << "}"; - break; - case BITVECTOR: - os << "BITVECTOR("; - unsigned char * str; - str = CONSTANTBV::BitVector_to_Hex(c[0].GetBVConst()); - os << str << ")"; - CONSTANTBV::BitVector_Dispose(str); - break; - case BOOLEAN: - os << "BOOLEAN"; - break; - case FALSE: - case TRUE: - os << kind; - break; - case BVCONST: - case SYMBOL: - n.nodeprint(os, true); - break; - case READ: - PL_Print1(os, c[0], indentation, letize); - os << "["; - PL_Print1(os, c[1], indentation, letize); - os << "]"; - break; - case WRITE: - os << "("; - PL_Print1(os, c[0], indentation, letize); - os << " WITH ["; - PL_Print1(os, c[1], indentation, letize); - os << "] := "; - PL_Print1(os, c[2], indentation, letize); - os << ")"; - os << endl; - break; - case BVUMINUS: - case NOT: - case BVNEG: - assert(1 == c.size()); - os << "( "; - os << functionToCVCName(kind); - os << "( "; - PL_Print1(os, c[0], indentation, letize); - os << "))"; - break; - case BVEXTRACT: - PL_Print1(os, c[0], indentation, letize); - os << "["; - os << c[1].GetUnsignedConst(); - os << ":"; - os << c[2].GetUnsignedConst(); - os << "]"; - break; - case BVLEFTSHIFT: - os << "("; - PL_Print1(os, c[0], indentation, letize); - os << " << "; - if (!c[1].isConstant()) - { - FatalError("PL_Print1: The shift argument to a left shift must be a constant. Found:",c[1]); - } - os << c[1].GetUnsignedConst(); - os << ")"; - os << "["; - os << (c[0].GetValueWidth()-1); - os << " : " << "0]"; - - break; - - case BVMULT: // variable arity, function name at front, size next, comma separated. - case BVSUB: - case BVPLUS: - case SBVDIV: - case SBVREM: - case BVDIV: - case BVMOD: - os << functionToCVCName(kind) << "("; - os << n.GetValueWidth(); - for (ASTVec::const_iterator - it = c.begin(), itend = c.end(); it != itend; it++) - { - os << ", " << endl; - PL_Print1(os, *it, indentation, letize); - } - os << ")" << endl; - break; - case ITE: - os << "IF("; - PL_Print1(os, c[0], indentation, letize); - os << ")" << endl; - os << "THEN "; - PL_Print1(os, c[1], indentation, letize); - os << endl << "ELSE "; - PL_Print1(os, c[2], indentation, letize); - os << endl << "ENDIF"; - break; - case PARAMBOOL: - PL_Print1(os, c[0], indentation, letize); - os << "("; - PL_Print1(os, c[1], indentation, letize); - os << ")"; - break; - - case BVLT: // two arity, prefixed function name. - case BVLE: - case BVGT: - case BVGE: - case BVXOR: - case BVNAND: - case BVNOR: - case BVXNOR: - case BVSLT: - case BVSLE: - case BVSGT: - case BVSGE: - assert(2 == c.size()); - os << functionToCVCName(kind) << "("; - PL_Print1(os, c[0], indentation, letize); - os << ","; - PL_Print1(os, c[1], indentation, letize); - os << ")" << endl; - break; - - case BVCONCAT: // two arity, infix function name. - case BVOR: - case BVAND: - case BVRIGHTSHIFT: - case EQ: - case IFF: - case IMPLIES: - assert(2 == c.size()); - // run on. - case AND: // variable arity, infix function name. - case OR: - case NAND: - case NOR: - case XOR: - { - os << "("; - PL_Print1(os, c[0], indentation, letize); - ASTVec::const_iterator it = c.begin(); - ASTVec::const_iterator itend = c.end(); - - it++; - for (; it != itend; it++) - { - os << " " << functionToCVCName(kind) << " "; - PL_Print1(os, *it, indentation, letize); - os << endl; - } - os << ")"; - break; - } - case BVSX: - case BVZX: - os << kind << "("; - PL_Print1(os, c[0], indentation, letize); - os << ","; - os << n.GetValueWidth(); - os << ")" << endl; - break; - default: - //remember to use LispPrinter here. Otherwise this function will - //go into an infinite loop. Recall that "<<" is overloaded to - //the lisp printer. FatalError uses lispprinter - FatalError("PL_Print1: printing not implemented for this kind: ", n); - break; - } - } //end of PL_Print1() - - - //print in PRESENTATION LANGUAGE - // - //two pass algorithm: - // - //1. In the first pass, letize this Node, N: i.e. if a node - //1. appears more than once in N, then record this fact. - // - //2. In the second pass print a "global let" and then print N - //2. as follows: Every occurence of a node occuring more than - //2. once is replaced with the corresponding let variable. - ostream& PL_Print(ostream &os, const ASTNode& n, int indentation) - { - // Clear the PrintMap - STPMgr* bm = n.GetSTPMgr(); - bm->PLPrintNodeSet.clear(); - bm->NodeLetVarMap.clear(); - bm->NodeLetVarVec.clear(); - bm->NodeLetVarMap1.clear(); - - //pass 1: letize the node - n.LetizeNode(); - - //pass 2: - // - //2. print all the let variables and their counterpart expressions - //2. as follows (LET var1 = expr1, var2 = expr2, ... - // - //3. Then print the Node itself, replacing every occurence of - //3. expr1 with var1, expr2 with var2, ... - //os << "("; - if (0 < bm->NodeLetVarMap.size()) - { - //ASTNodeMap::iterator it=bm->NodeLetVarMap.begin(); - //ASTNodeMap::iterator itend=bm->NodeLetVarMap.end(); - std::vector >::iterator - it = bm->NodeLetVarVec.begin(); - std::vector >::iterator - itend = bm->NodeLetVarVec.end(); - - os << "(LET "; - //print the let var first - PL_Print1(os, it->first, indentation, false); - os << " = "; - //print the expr - PL_Print1(os, it->second, indentation, false); - - //update the second map for proper printing of LET - bm->NodeLetVarMap1[it->second] = it->first; - - for (it++; it != itend; it++) - { - os << "," << endl; - //print the let var first - PL_Print1(os, it->first, indentation, false); - os << " = "; - //print the expr - PL_Print1(os, it->second, indentation, false); - - //update the second map for proper printing of LET - bm->NodeLetVarMap1[it->second] = it->first; - } - - os << " IN " << endl; - PL_Print1(os, n, indentation, true); - os << ") "; - } - else - PL_Print1(os,n, indentation, false); - //os << " )"; - os << " "; - return os; - } //end of PL_Print() -} diff --git a/src/vendor/stp/src/printer/SMTLIB1Printer.cpp b/src/vendor/stp/src/printer/SMTLIB1Printer.cpp deleted file mode 100644 index 25e5555fb..000000000 --- a/src/vendor/stp/src/printer/SMTLIB1Printer.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/******************************************************************** - * AUTHORS: Trevor Hansen, Vijay Ganesh - * - * BEGIN DATE: July, 2009 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "printers.h" -#include -#include -#include "SMTLIBPrinter.h" - -// Outputs in the SMTLIB1 format. If you want something that can be parsed by other tools call -// SMTLIB_PrintBack(). SMTLIB_Print() prints just an expression. -// Wierdly is seems that only terms, not formulas can be LETized. - -// NB: This code doesn't include the substitution map. So if you've already simplified -// the graph, then solving what this prints out wont necessarily give you a model. - - -namespace printer -{ - using std::string; - using namespace BEEV; - - void SMTLIB1_Print1(ostream& os, const BEEV::ASTNode n, int indentation, bool letize); - void printSMTLIB1VarDeclsToStream(ASTNodeSet& symbols, ostream& os); - - void SMTLIB1_PrintBack(ostream &os, const ASTNode& n) -{ - os << "(" << endl; - os << "benchmark blah" << endl; - if (containsArrayOps(n)) - os << ":logic QF_AUFBV" << endl; - else - os << ":logic QF_BV" << endl; - - if (input_status == TO_BE_SATISFIABLE) { - os << ":status sat" << endl; - } - else if (input_status == TO_BE_UNSATISFIABLE) { - os << ":status unsat" << endl; - } - else - os << ":status unknown" << endl; - - ASTNodeSet visited, symbols; - buildListOfSymbols(n, visited, symbols); - printSMTLIB1VarDeclsToStream(symbols, os); - os << ":formula "; - SMTLIB_Print(os, n, 0, &SMTLIB1_Print1,true); - os << ")" << endl; - } - -void printSMTLIB1VarDeclsToStream(ASTNodeSet& symbols, ostream& os) -{ - for (ASTNodeSet::const_iterator i = symbols.begin(), iend = symbols.end(); i - != iend; i++) - { - const BEEV::ASTNode& a = *i; - - // Should be a symbol. - assert(a.GetKind()== SYMBOL); - - switch (a.GetType()) - { - case BEEV::BITVECTOR_TYPE: - - os << ":extrafuns (( "; - a.nodeprint(os); - os << " BitVec[" << a.GetValueWidth() << "]"; - os << " ))" << endl; - break; - case BEEV::ARRAY_TYPE: - os << ":extrafuns (( "; - a.nodeprint(os); - os << " Array[" << a.GetIndexWidth(); - os << ":" << a.GetValueWidth() << "] ))" << endl; - break; - case BEEV::BOOLEAN_TYPE: - os << ":extrapreds (( "; - a.nodeprint(os); - os << "))" << endl; - break; - default: - BEEV::FatalError("printVarDeclsToStream: Unsupported type",a); - break; - } - } - } //printVarDeclsToStream - - void outputBitVec(const ASTNode n, ostream& os) - { - const Kind k = n.GetKind(); - const ASTVec &c = n.GetChildren(); - ASTNode op; - - if (BITVECTOR == k) - { - op = c[0]; - } - else if (BVCONST == k) - { - op = n; - } - else - FatalError("nsadfsdaf"); - - // CONSTANTBV::BitVector_to_Dec returns a signed representation by default. - // Prepend with zero to convert to unsigned. - - os << "bv"; - CBV unsign = CONSTANTBV::BitVector_Concat( - n.GetSTPMgr()->CreateZeroConst(1).GetBVConst(), op.GetBVConst()); - unsigned char * str = CONSTANTBV::BitVector_to_Dec(unsign); - CONSTANTBV::BitVector_Destroy(unsign); - os << str << "[" << op.GetValueWidth() << "]"; - CONSTANTBV::BitVector_Dispose(str); - } - - void SMTLIB1_Print1(ostream& os, const ASTNode n, int indentation, bool letize) - { - //os << spaces(indentation); - //os << endl << spaces(indentation); - if (!n.IsDefined()) - { - FatalError(""); - return; - } - - //if this node is present in the letvar Map, then print the letvar - //this is to print letvars for shared subterms inside the printing - //of "(LET v0 = term1, v1=term1@term2,... - if ((NodeLetVarMap1.find(n) != NodeLetVarMap1.end()) && !letize) - { - SMTLIB1_Print1(os, (NodeLetVarMap1[n]), indentation, letize); - return; - } - - //this is to print letvars for shared subterms inside the actual - //term to be printed - if ((NodeLetVarMap.find(n) != NodeLetVarMap.end()) && letize) - { - SMTLIB1_Print1(os, (NodeLetVarMap[n]), indentation, letize); - return; - } - - //otherwise print it normally - const Kind kind = n.GetKind(); - const ASTVec &c = n.GetChildren(); - switch (kind) - { - case BITVECTOR: - case BVCONST: - outputBitVec(n, os); - break; - case SYMBOL: - n.nodeprint(os); - break; - case FALSE: - os << "false"; - break; - case NAND: // No NAND, NOR in smtlib format. - case NOR: - assert(c.size() ==2); - os << "(" << "not "; - if (NAND == kind ) - os << "(" << "and "; - else - os << "(" << "or "; - SMTLIB1_Print1(os, c[0], 0, letize); - os << " " ; - SMTLIB1_Print1(os, c[1], 0, letize); - os << "))"; - break; - case TRUE: - os << "true"; - break; - case BVSX: - case BVZX: - { - unsigned int amount = c[1].GetUnsignedConst(); - if (BVZX == kind) - os << "(zero_extend["; - else - os << "(sign_extend["; - - os << (amount - c[0].GetValueWidth()) << "]"; - SMTLIB1_Print1(os, c[0], indentation, letize); - os << ")"; - } - break; - case BVEXTRACT: - { - unsigned int upper = c[1].GetUnsignedConst(); - unsigned int lower = c[2].GetUnsignedConst(); - assert(upper >= lower); - os << "(extract[" << upper << ":" << lower << "] "; - SMTLIB1_Print1(os, c[0], indentation, letize); - os << ")"; - } - break; - default: - { - if ((kind == AND || kind == OR|| kind == XOR) && n.Degree() == 1) - { - FatalError("Wrong number of arguments to operation (must be >1).", n); - } - - // SMT-LIB only allows these functions to have two parameters. - if ((kind == AND || kind == OR|| kind == XOR || BVPLUS == kind || kind == BVOR || kind == BVAND) && n.Degree() > 2) - { - string close = ""; - - for (int i =0; i < c.size()-1; i++) - { - os << "(" << functionToSMTLIBName(kind,true); - os << " "; - SMTLIB1_Print1(os, c[i], 0, letize); - os << " "; - close += ")"; - } - SMTLIB1_Print1(os, c[c.size()-1], 0, letize); - os << close; - } - else - { - os << "(" << functionToSMTLIBName(kind,true); - - ASTVec::const_iterator iend = c.end(); - for (ASTVec::const_iterator i = c.begin(); i != iend; i++) - { - os << " "; - SMTLIB1_Print1(os, *i, 0, letize); - } - - os << ")"; - } - } - } - } -} diff --git a/src/vendor/stp/src/printer/SMTLIB2Printer.cpp b/src/vendor/stp/src/printer/SMTLIB2Printer.cpp deleted file mode 100644 index 5ee4e98a1..000000000 --- a/src/vendor/stp/src/printer/SMTLIB2Printer.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/******************************************************************** - * AUTHORS: Trevor Hansen, Vijay Ganesh - * - * BEGIN DATE: July, 2009 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "printers.h" -#include -#include -#include "SMTLIBPrinter.h" - -// Outputs in the SMTLIB format. If you want something that can be parsed by other tools call -// SMTLIB_PrintBack(). SMTLIB_Print() prints just an expression. - -namespace printer -{ - - using std::string; - using namespace BEEV; - - void SMTLIB2_Print1(ostream& os, const BEEV::ASTNode n, int indentation, bool letize); - void printVarDeclsToStream(ASTNodeSet& symbols, ostream& os); - -void SMTLIB2_PrintBack(ostream &os, const ASTNode& n, const bool definately_bv) -{ - if (!definately_bv && containsArrayOps(n)) - os << "(set-logic QF_ABV)\n"; - else - os << "(set-logic QF_BV)\n"; - - os << "(set-info :smt-lib-version 2.0)\n"; - - - if (input_status == TO_BE_SATISFIABLE) { - os << "(set-info :status sat)\n"; - } - else if (input_status == TO_BE_UNSATISFIABLE) { - os << "(set-info :status unsat)\n"; - } else - os << "(set-info :status unknown)\n"; - - ASTNodeSet visited, symbols; - buildListOfSymbols(n, visited, symbols); - printVarDeclsToStream(symbols, os); - os << "(assert "; - SMTLIB_Print(os, n, 0, &SMTLIB2_Print1, false); - os << ")\n"; - // os << "(check-sat)" << endl; - // os << "(exit)\n"; - } - -void printVarDeclsToStream(ASTNodeSet& symbols, ostream& os) -{ - for (ASTNodeSet::const_iterator i = symbols.begin(), iend = symbols.end(); i - != iend; i++) - { - const BEEV::ASTNode& a = *i; - os << "(declare-fun "; - - // Should be a symbol. - assert(a.GetKind()== SYMBOL); - os << "|"; - a.nodeprint(os); - os << "|"; - - switch (a.GetType()) - { - case BEEV::BITVECTOR_TYPE: - os << " () ("; - os << "_ BitVec " << a.GetValueWidth() << ")"; - - break; - case BEEV::ARRAY_TYPE: - os << " () ("; - os << "Array (_ BitVec " << a.GetIndexWidth() << ") (_ BitVec " << a.GetValueWidth() << ") )"; - break; - case BEEV::BOOLEAN_TYPE: - os << " () Bool "; - break; - default: - BEEV::FatalError("printVarDeclsToStream: Unsupported type",a); - break; - } - os << ")\n"; - } - } //printVarDeclsToStream - - void outputBitVecSMTLIB2(const ASTNode n, ostream& os) - { - const Kind k = n.GetKind(); - const ASTVec &c = n.GetChildren(); - ASTNode op; - - if (BITVECTOR == k) - { - op = c[0]; - } - else if (BVCONST == k) - { - op = n; - } - else - FatalError("nsadfsdaf"); - - // CONSTANTBV::BitVector_to_Dec returns a signed representation by default. - // Prepend with zero to convert to unsigned. - - os << "(_ bv"; - CBV unsign = CONSTANTBV::BitVector_Concat( - n.GetSTPMgr()->CreateZeroConst(1).GetBVConst(), op.GetBVConst()); - unsigned char * str = CONSTANTBV::BitVector_to_Dec(unsign); - CONSTANTBV::BitVector_Destroy(unsign); - os << str << " " << op.GetValueWidth() << ")"; - CONSTANTBV::BitVector_Dispose(str); - } - - void SMTLIB2_Print1(ostream& os, const ASTNode n, int indentation, bool letize) - { - //os << spaces(indentation); - //os << endl << spaces(indentation); - if (!n.IsDefined()) - { - FatalError(""); - return; - } - - //if this node is present in the letvar Map, then print the letvar - //this is to print letvars for shared subterms inside the printing - //of "(LET v0 = term1, v1=term1@term2,... - if ((NodeLetVarMap1.find(n) != NodeLetVarMap1.end()) && !letize) - { - SMTLIB2_Print1(os, (NodeLetVarMap1[n]), indentation, letize); - return; - } - - //this is to print letvars for shared subterms inside the actual - //term to be printed - if ((NodeLetVarMap.find(n) != NodeLetVarMap.end()) && letize) - { - SMTLIB2_Print1(os, (NodeLetVarMap[n]), indentation, letize); - return; - } - - //otherwise print it normally - const Kind kind = n.GetKind(); - const ASTVec &c = n.GetChildren(); - switch (kind) - { - case BITVECTOR: - case BVCONST: - outputBitVecSMTLIB2(n, os); - break; - case SYMBOL: - os << "|"; - n.nodeprint(os); - os << "|"; - break; - case FALSE: - os << "false"; - break; - case NAND: // No NAND, NOR in smtlib format. - case NOR: - assert(c.size() ==2); - os << "(" << "not "; - if (NAND == kind ) - os << "(" << "and "; - else - os << "(" << "or "; - SMTLIB2_Print1(os, c[0], 0, letize); - os << " " ; - SMTLIB2_Print1(os, c[1], 0, letize); - os << "))"; - break; - case TRUE: - os << "true"; - break; - case BVSX: - case BVZX: - { - unsigned int amount = c[1].GetUnsignedConst(); - if (BVZX == kind) - os << "((_ zero_extend "; - else - os << "((_ sign_extend "; - - os << (amount - c[0].GetValueWidth()) << ") "; - SMTLIB2_Print1(os, c[0], indentation, letize); - os << ")"; - } - break; - case BVEXTRACT: - { - unsigned int upper = c[1].GetUnsignedConst(); - unsigned int lower = c[2].GetUnsignedConst(); - assert(upper >= lower); - os << "((_ extract " << upper << " " << lower << ") "; - SMTLIB2_Print1(os, c[0], indentation, letize); - os << ")"; - } - break; - default: - { - if ((kind == AND || kind == OR|| kind == XOR) && n.Degree() == 1) - { - FatalError("Wrong number of arguments to operation (must be >1).", n); - } - - // SMT-LIB only allows these functions to have two parameters. - if ((kind == AND || kind == OR|| kind == XOR || BVPLUS == kind || kind == BVOR || kind == BVAND) && n.Degree() > 2) - { - string close = ""; - - for (int i =0; i < c.size()-1; i++) - { - os << "(" << functionToSMTLIBName(kind,false); - os << " "; - SMTLIB2_Print1(os, c[i], 0, letize); - os << " "; - close += ")"; - } - SMTLIB2_Print1(os, c[c.size()-1], 0, letize); - os << close; - } - else - { - os << "(" << functionToSMTLIBName(kind,false); - - ASTVec::const_iterator iend = c.end(); - for (ASTVec::const_iterator i = c.begin(); i != iend; i++) - { - os << " "; - SMTLIB2_Print1(os, *i, 0, letize); - } - - os << ")"; - } - } - } - } -} diff --git a/src/vendor/stp/src/printer/SMTLIBPrinter.cpp b/src/vendor/stp/src/printer/SMTLIBPrinter.cpp deleted file mode 100644 index bc33b7253..000000000 --- a/src/vendor/stp/src/printer/SMTLIBPrinter.cpp +++ /dev/null @@ -1,252 +0,0 @@ -#include "printers.h" -#include "SMTLIBPrinter.h" - -// Functions used by both the version1 and version2 STMLIB printers. - -namespace printer -{ -using namespace BEEV; - -static string tolower(const char * name) -{ - string s(name); - for (size_t i = 0; i < s.size(); ++i) - s[i] = ::tolower(s[i]); - return s; -} - - - //Map from ASTNodes to LetVars - BEEV::ASTNodeMap NodeLetVarMap; - - //This is a vector which stores the Node to LetVars pairs. It - //allows for sorted printing, as opposed to NodeLetVarMap - std::vector > NodeLetVarVec; - - //a partial Map from ASTNodes to LetVars. Needed in order to - //correctly print shared subterms inside the LET itself - BEEV::ASTNodeMap NodeLetVarMap1; - - // copied from Presentation Langauge printer. - ostream& SMTLIB_Print(ostream &os, const ASTNode n, const int indentation, void (*SMTLIB1_Print1)(ostream&, const ASTNode , int , bool ), bool smtlib1) - { - // Clear the maps - NodeLetVarMap.clear(); - NodeLetVarVec.clear(); - NodeLetVarMap1.clear(); - - //pass 1: letize the node - { - ASTNodeSet PLPrintNodeSet; - LetizeNode(n, PLPrintNodeSet, smtlib1); - } - - //pass 2: - // - //2. print all the let variables and their counterpart expressions - //2. as follows (LET var1 = expr1, var2 = expr2, ... - // - //3. Then print the Node itself, replacing every occurence of - //3. expr1 with var1, expr2 with var2, ... - //os << "("; - if (0 < NodeLetVarMap.size()) - { - std::vector >::iterator it = - NodeLetVarVec.begin(); - const std::vector >::iterator itend = - NodeLetVarVec.end(); - - os << "(let ("; - if (!smtlib1) - os << "("; - //print the let var first - SMTLIB1_Print1(os, it->first, indentation, false); - os << " "; - //print the expr - SMTLIB1_Print1(os, it->second, indentation, false); - os << " )"; - if (!smtlib1) - os << ")"; - - - //update the second map for proper printing of LET - NodeLetVarMap1[it->second] = it->first; - - string closing = ""; - for (it++; it != itend; it++) - { - os << " " << endl; - os << "(let ("; - if (!smtlib1) - os << "("; - //print the let var first - SMTLIB1_Print1(os, it->first, indentation, false); - os << " "; - //print the expr - SMTLIB1_Print1(os, it->second, indentation, false); - os << ")"; - if (!smtlib1) - os << ")"; - - //update the second map for proper printing of LET - NodeLetVarMap1[it->second] = it->first; - closing += ")"; - } - os << endl; - SMTLIB1_Print1(os, n, indentation, true); - os << closing; - os << " ) "; - } - else - SMTLIB1_Print1(os, n, indentation, false); - - os << endl; - return os; - } - - void LetizeNode(const ASTNode& n, ASTNodeSet& PLPrintNodeSet, bool smtlib1) - { - const Kind kind = n.GetKind(); - - if (kind == SYMBOL || kind == BVCONST || kind == FALSE || kind == TRUE) - return; - - const ASTVec &c = n.GetChildren(); - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - const ASTNode& ccc = *it; - - const Kind k = ccc.GetKind(); - if (k == SYMBOL || k == BVCONST || k == FALSE || k == TRUE) - continue; - - if (PLPrintNodeSet.find(ccc) == PLPrintNodeSet.end()) - { - //If branch: if *it is not in NodeSet then, - // - //1. add it to NodeSet - // - //2. Letize its childNodes - PLPrintNodeSet.insert(ccc); - LetizeNode(ccc, PLPrintNodeSet, smtlib1); - } - else - { - //0. Else branch: Node has been seen before - // - //1. Check if the node has a corresponding letvar in the - //1. NodeLetVarMap. - // - //2. if no, then create a new var and add it to the - //2. NodeLetVarMap - if ((!smtlib1 || ccc.GetType() == BITVECTOR_TYPE) && NodeLetVarMap.find(ccc) - == NodeLetVarMap.end()) - { - //Create a new symbol. Get some name. if it conflicts with a - //declared name, too bad. - int sz = NodeLetVarMap.size(); - ostringstream oss; - oss << "?let_k_" << sz; - - ASTNode CurrentSymbol = n.GetSTPMgr()->CreateSymbol( - oss.str().c_str(),n.GetIndexWidth(), n.GetValueWidth()); - /* If for some reason the variable being created here is - * already declared by the user then the printed output will - * not be a legal input to the system. too bad. I refuse to - * check for this. [Vijay is the author of this comment.] - */ - - NodeLetVarMap[ccc] = CurrentSymbol; - std::pair - node_letvar_pair(CurrentSymbol, ccc); - NodeLetVarVec.push_back(node_letvar_pair); - } - } - } - } //end of LetizeNode() - - string functionToSMTLIBName(const Kind k, bool smtlib1) - { - switch (k) - { - case IFF: - if (smtlib1) - return "iff"; - else - return "="; - case IMPLIES: - if (smtlib1) - return "implies"; - else - return "=>"; - case AND: - case BVAND: - case BVNAND: - case BVNOR: - case BVOR: - case BVSGE: - case BVSGT: - case BVSLE: - case BVSLT: - case BVSUB: - case BVXOR: - case ITE: - case NAND: - case NOR: - case NOT: - case OR: - case XOR: - { - return tolower(_kind_names[k]); - } - - case BVCONCAT: - return "concat"; - case BVDIV: - return "bvudiv"; - case BVGT: - return "bvugt"; - case BVGE: - return "bvuge"; - case BVLE: - return "bvule"; - case BVLEFTSHIFT: - return "bvshl"; - case BVLT: - return "bvult"; - case BVMOD: - return "bvurem"; - case BVMULT: - return "bvmul"; - case BVNEG: - return "bvnot"; // CONFUSSSSINNG. (1/2) - case BVPLUS: - return "bvadd"; - case BVRIGHTSHIFT: - return "bvlshr"; // logical - case BVSRSHIFT: - return "bvashr"; // arithmetic. - case BVUMINUS: - return "bvneg"; // CONFUSSSSINNG. (2/2) - case EQ: - return "="; - case READ: - return "select"; - case WRITE: - return "store"; - case SBVDIV: - return "bvsdiv"; - case SBVREM: - return "bvsrem"; - case SBVMOD: - return "bvsmod"; - - default: - { - cerr << "Unknown name when outputting:"; - FatalError(_kind_names[k]); - return ""; // to quieten compiler/ - } - } - } -}; diff --git a/src/vendor/stp/src/printer/SMTLIBPrinter.h b/src/vendor/stp/src/printer/SMTLIBPrinter.h deleted file mode 100644 index 4373f75df..000000000 --- a/src/vendor/stp/src/printer/SMTLIBPrinter.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef SMTLIBPRINTERS_H_ -#define SMTLIBPRINTERS_H_ - -#include "printers.h" - -namespace printer -{ - - //Map from ASTNodes to LetVars - extern BEEV::ASTNodeMap NodeLetVarMap; - - //This is a vector which stores the Node to LetVars pairs. It - //allows for sorted printing, as opposed to NodeLetVarMap - extern std::vector > NodeLetVarVec; - - //a partial Map from ASTNodes to LetVars. Needed in order to - //correctly print shared subterms inside the LET itself - extern BEEV::ASTNodeMap NodeLetVarMap1; - - string functionToSMTLIBName(const Kind k, bool smtlib1); - - void LetizeNode(const ASTNode& n, BEEV::ASTNodeSet& PLPrintNodeSet, bool smtlib1); - - ostream& SMTLIB_Print(ostream &os, const ASTNode n, const int indentation, void (*SMTLIB_Print1)(ostream&, const ASTNode , int , bool ), bool smtlib1); - - bool containsAnyArrayOps(const ASTNode& n); - - static string tolower(const char * name); -}; -#endif diff --git a/src/vendor/stp/src/printer/dotPrinter.cpp b/src/vendor/stp/src/printer/dotPrinter.cpp deleted file mode 100644 index 785926f22..000000000 --- a/src/vendor/stp/src/printer/dotPrinter.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#include "printers.h" - -/* - * Outputs in DOT graph format. Can be layed out by the dotty/neato tools. - */ - -namespace printer -{ - - using std::string; - using namespace BEEV; - - void outputBitVec(const ASTNode n, ostream& os); - - void Dot_Print1(ostream &os, const ASTNode n, HASHSET *alreadyOutput) - { - - // check if this node has already been printed. If so return. - if (alreadyOutput->find(n.GetNodeNum()) != alreadyOutput->end()) - return; - - alreadyOutput->insert(n.GetNodeNum()); - - os << "n" << n.GetNodeNum() << "[label =\""; - switch (n.GetKind()) - { - case SYMBOL: - n.nodeprint(os); - break; - - case BITVECTOR: - case BVCONST: - outputBitVec(n, os); - break; - - default: - os << _kind_names[n.GetKind()]; - } - - os << "\"];" << endl; - - // print the edges to each child. - ASTVec ch = n.GetChildren(); - ASTVec::iterator itend = ch.end(); - int i = 0; - for (ASTVec::iterator it = ch.begin(); it < itend; it++) - { - os << "n" << n.GetNodeNum() - << " -> " << "n" - << it->GetNodeNum() - << "[label=" << i++ - << "];" << endl; - } - - // print each of the children. - for (ASTVec::iterator it = ch.begin(); it < itend; it++) - { - Dot_Print1(os, *it, alreadyOutput); - } - } - - ostream& Dot_Print(ostream &os, const ASTNode n) - { - - os << "digraph G{" << endl; - - // create hashmap to hold integers (node numbers). - HASHSET alreadyOutput; - - Dot_Print1(os, n, &alreadyOutput); - - os << "}" << endl; - - return os; - } - -} diff --git a/src/vendor/stp/src/printer/printers.h b/src/vendor/stp/src/printer/printers.h deleted file mode 100644 index f70f31497..000000000 --- a/src/vendor/stp/src/printer/printers.h +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#ifndef PRINTERS_H_ -#define PRINTERS_H_ -#include -#include -#include - -#include "../AST/AST.h" -#include "../AST/ASTKind.h" -#include "../STPManager/STP.h" - -namespace printer -{ - ostream& Dot_Print(ostream &os, const BEEV::ASTNode n); - - ostream& C_Print(ostream &os, - const BEEV::ASTNode n, const int indentation = 0); - ostream& PL_Print(ostream &os, - const BEEV::ASTNode& n, int indentation=0); - - void PL_Print1(ostream& os, const ASTNode& n,int indentation, bool letize); - - - ostream& Lisp_Print(ostream &os, - const BEEV::ASTNode& n, int indentation=0); - ostream& Lisp_Print_indent(ostream &os, - const BEEV::ASTNode& n,int indentation=0); - - // The "PrintBack" functions also define all the variables that are used. - void SMTLIB1_PrintBack(ostream &os, - const BEEV::ASTNode& n ); - - void SMTLIB2_PrintBack(ostream &os, const ASTNode& n, bool definately_bv=false); - - ostream& GDL_Print(ostream &os, const BEEV::ASTNode n); - ostream& GDL_Print(ostream &os, const ASTNode n, string (*annotate)(const ASTNode&)); - - ostream& Bench_Print(ostream &os, const ASTNode n); -} - -#endif /* PRINTERS_H_ */ diff --git a/src/vendor/stp/src/sat/CryptoMinisat.cpp b/src/vendor/stp/src/sat/CryptoMinisat.cpp deleted file mode 100644 index 71d9a346d..000000000 --- a/src/vendor/stp/src/sat/CryptoMinisat.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "CryptoMinisat.h" -#include "utils/System.h" - -#undef var_Undef -#undef l_True -#undef l_False -#undef l_Undef - - -#include "cryptominisat2/Solver.h" -#include "cryptominisat2/SolverTypes.h" - -namespace BEEV -{ - - CryptoMinisat::CryptoMinisat() - { - s = new MINISAT::Solver(); - } - - CryptoMinisat::~CryptoMinisat() - { - delete s; - } - - bool - CryptoMinisat::addClause(const vec_literals& ps) // Add a clause to the solver. - { - // Cryptominisat uses a slightly different vec class. - // Cryptominisat uses a slightly different Lit class too. - - // VERY SLOW> - MINISAT::vec v; - for (int i =0; iaddClause(v); - } - - bool - CryptoMinisat::okay() const // FALSE means solver is in a conflicting state - { - return s->okay(); - } - - bool - CryptoMinisat::solve() // Search without assumptions. - { - return s->solve().getchar(); - } - - uint8_t - CryptoMinisat::modelValue(Var x) const - { - return s->model[x].getchar(); - } - - Minisat::Var - CryptoMinisat::newVar() - { - return s->newVar(); - } - - int CryptoMinisat::setVerbosity(int v) - { - return s->verbosity = v; - } - - int CryptoMinisat::nVars() - {return s->nVars();} - - void CryptoMinisat::printStats() - { - double cpu_time = Minisat::cpuTime(); - double mem_used = Minisat::memUsedPeak(); - printf("restarts : %" PRIu64 "\n", s->starts); - printf("conflicts : %-12" PRIu64 " (%.0f /sec)\n", s->conflicts , s->conflicts /cpu_time); - printf("decisions : %-12" PRIu64 " (%4.2f %% random) (%.0f /sec)\n", s->decisions, (float)s->rnd_decisions*100 / (float)s->decisions, s->decisions /cpu_time); - printf("propagations : %-12" PRIu64 " (%.0f /sec)\n", s->propagations, s->propagations/cpu_time); - printf("conflict literals : %-12" PRIu64 " (%4.2f %% deleted)\n", s->tot_literals, (s->max_literals - s->tot_literals)*100 / (double)s->max_literals); - if (mem_used != 0) printf("Memory used : %.2f MB\n", mem_used); - printf("CPU time : %g s\n", cpu_time); - } -}; diff --git a/src/vendor/stp/src/sat/CryptoMinisat.h b/src/vendor/stp/src/sat/CryptoMinisat.h deleted file mode 100644 index 4a45c9711..000000000 --- a/src/vendor/stp/src/sat/CryptoMinisat.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Wraps around Cryptominisat minisat. - */ -#ifndef CRYPTOMINISAT_H_ -#define CRYPTOMINISAT_H_ - -#include "SATSolver.h" - -namespace MINISAT -{ - class Solver; -} - -namespace BEEV -{ - class CryptoMinisat : public SATSolver - { - MINISAT::Solver* s; - - public: - CryptoMinisat(); - - ~CryptoMinisat(); - - bool - addClause(const vec_literals& ps); // Add a clause to the solver. - - bool - okay() const; // FALSE means solver is in a conflicting state - - - bool - solve(); // Search without assumptions. - - virtual uint8_t modelValue(Var x) const; - - virtual Var newVar(); - - int setVerbosity(int v); - - int nVars(); - - void printStats(); - - //nb CMS2 has different literal values to the other minisats. - virtual lbool true_literal() {return ((uint8_t)1);} - virtual lbool false_literal() {return ((uint8_t)-1);} - virtual lbool undef_literal() {return ((uint8_t)0);} - }; -} -; - -#endif diff --git a/src/vendor/stp/src/sat/LICENSE b/src/vendor/stp/src/sat/LICENSE deleted file mode 100644 index c87a32731..000000000 --- a/src/vendor/stp/src/sat/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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. diff --git a/src/vendor/stp/src/sat/Makefile b/src/vendor/stp/src/sat/Makefile deleted file mode 100644 index 912f7b117..000000000 --- a/src/vendor/stp/src/sat/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -OBJS = $(SRCS:.cpp=.o) -LIB = libminisat.a - -# exported variables override those set in recursive makefiles. -export COPTIMIZE=$(CFLAGS_M32) $(CFLAGS_FPIC) -O3 - - -.PHONY:core -core: $(LIB) - -# $(LIB) depends on */lib$(SUB)_release.a and will be rebuilt only if they have been updated -.NOTPARALLEL: -$(LIB): core/libcore_release.a core_prop/libcore_prop_release.a simp/libsimp_release.a utils/libutils_release.a cryptominisat2/libminisat.a $(OBJS) - $(RM) $@ - $(call arcat,$@,$(filter %.a,$^)) - $(AR) qcs $@ $(filter %.o,$^) - -core_prop/libcore_prop_release.a: FORCE - $(MAKE) LIB="core_prop" -C core_prop libr -core/libcore_release.a: FORCE - $(MAKE) LIB="core" -C core libr -simp/libsimp_release.a: FORCE - $(MAKE) LIB="simp" -C simp libr -utils/libutils_release.a: FORCE - $(MAKE) LIB="utils" -C utils libr -cryptominisat2/libminisat.a: FORCE - $(MAKE) -C cryptominisat2 lib all -FORCE: - -.PHONY: clean -clean: - $(RM) *.o *~ *.a .#* - $(MAKE) -C core clean - $(MAKE) -C core_prop clean - $(MAKE) -C simp clean - $(MAKE) -C utils clean - $(MAKE) -C cryptominisat2 clean - -CryptoMinisat.o: CFLAGS += -Icryptominisat2/mtl -Imtl -I$(SRCTOP) diff --git a/src/vendor/stp/src/sat/MinisatCore.cpp b/src/vendor/stp/src/sat/MinisatCore.cpp deleted file mode 100644 index e03d2ff35..000000000 --- a/src/vendor/stp/src/sat/MinisatCore.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "core/Solver.h" -#include "MinisatCore.h" -#include "utils/System.h" -#include "simp/SimpSolver.h" - -namespace BEEV -{ - - template - MinisatCore::MinisatCore(volatile bool& interrupt) - { - s = new T(interrupt); - }; - - template - MinisatCore::~MinisatCore() - { - delete s; - } - - template - bool - MinisatCore::addClause(const SATSolver::vec_literals& ps) // Add a clause to the solver. - { - return s->addClause(ps); - } - - template - bool - MinisatCore::okay() const // FALSE means solver is in a conflicting state - { - return s->okay(); - } - - template - bool - MinisatCore::solve() // Search without assumptions. - { - if (!s->simplify()) - return false; - - return s->solve(); - - } - - template - uint8_t - MinisatCore::modelValue(Var x) const - { - return Minisat::toInt(s->modelValue(x)); - } - - template - Minisat::Var - MinisatCore::newVar() - { - return s->newVar(); - } - - template - int MinisatCore::setVerbosity(int v) - { - return s->verbosity = v; - } - - template - void MinisatCore::setSeed(int i) - { - s->random_seed = i; - } - - - template - int MinisatCore::nVars() - {return s->nVars();} - - template - void MinisatCore::printStats() - { - double cpu_time = Minisat::cpuTime(); - double mem_used = Minisat::memUsedPeak(); - printf("restarts : %" PRIu64 "\n", s->starts); - printf("conflicts : %-12" PRIu64 " (%.0f /sec)\n", s->conflicts , s->conflicts /cpu_time); - printf("decisions : %-12" PRIu64 " (%4.2f %% random) (%.0f /sec)\n", s->decisions, (float)s->rnd_decisions*100 / (float)s->decisions, s->decisions /cpu_time); - printf("propagations : %-12" PRIu64 " (%.0f /sec)\n", s->propagations, s->propagations/cpu_time); - printf("conflict literals : %-12" PRIu64 " (%4.2f %% deleted)\n", s->tot_literals, (s->max_literals - s->tot_literals)*100 / (double)s->max_literals); - if (mem_used != 0) printf("Memory used : %.2f MB\n", mem_used); - printf("CPU time : %g s\n", cpu_time); - } - - template - int MinisatCore::nClauses() - { - return s->nClauses(); - } - - template - bool MinisatCore::simplify() - { - return s->simplify(); - } - - - - // I was going to make SimpSolver and Solver instances of this template. - // But I'm not so sure now because I don't understand what eliminate() does in the simp solver. - template class MinisatCore; - //template class MinisatCore; -}; diff --git a/src/vendor/stp/src/sat/MinisatCore.h b/src/vendor/stp/src/sat/MinisatCore.h deleted file mode 100644 index d40f2784c..000000000 --- a/src/vendor/stp/src/sat/MinisatCore.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Wraps around CORE minisat. - */ -#ifndef MINISATCORE_H_ -#define MINIASTCORE_H_ - -#include "SATSolver.h" - -namespace Minisat -{ - class Solver; -} - -namespace BEEV -{ - template - class MinisatCore: public SATSolver - { - T * s; - - public: - MinisatCore(volatile bool& interrupt); - - ~MinisatCore(); - - bool - addClause(const vec_literals& ps); // Add a clause to the solver. - - bool - okay() const; // FALSE means solver is in a conflicting state - - - bool - solve(); // Search without assumptions. - - virtual - bool - simplify(); // Removes already satisfied clauses. - - virtual uint8_t modelValue(Var x) const; - - virtual Var newVar(); - - int setVerbosity(int v); - - int nVars(); - - void printStats(); - - virtual void setSeed(int i); - - virtual lbool true_literal() {return ((uint8_t)0);} - virtual lbool false_literal() {return ((uint8_t)1);} - virtual lbool undef_literal() {return ((uint8_t)2);} - - virtual int nClauses(); - - bool unitPropagate(const vec_literals& ps) - { - return s->unitPropagate(ps); - } - }; -} -; - -#endif diff --git a/src/vendor/stp/src/sat/MinisatCore_prop.cpp b/src/vendor/stp/src/sat/MinisatCore_prop.cpp deleted file mode 100644 index a570a21a6..000000000 --- a/src/vendor/stp/src/sat/MinisatCore_prop.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "core_prop/Solver_prop.h" -#include "MinisatCore_prop.h" -#include "utils/System.h" - -namespace BEEV -{ - - template - MinisatCore_prop::MinisatCore_prop(volatile bool& timeout) - { - s = new T(timeout); - }; - - template - MinisatCore_prop::~MinisatCore_prop() - { - delete s; - } - - template - bool - MinisatCore_prop::addArray(int array_id, const SATSolver::vec_literals& i, const SATSolver::vec_literals& v, const Minisat::vec & ki, const Minisat::vec & kv ) - { - s->addArray(array_id, i,v, ki,kv); - return true; - } - - - template - bool - MinisatCore_prop::addClause(const SATSolver::vec_literals& ps) // Add a clause to the solver. - { - return s->addClause(ps); - } - - template - bool - MinisatCore_prop::okay() const // FALSE means solver is in a conflicting state - { - return s->okay(); - } - - template - bool - MinisatCore_prop::solve() // Search without assumptions. - { - if (!s->simplify()) - return false; - - return s->solve(); - - } - - template - uint8_t - MinisatCore_prop::modelValue(Var x) const - { - return Minisat::toInt(s->modelValue(x)); - } - - template - Minisat::Var - MinisatCore_prop::newVar() - { - return s->newVar(); - } - - template - int MinisatCore_prop::setVerbosity(int v) - { - return s->verbosity = v; - } - - template - int MinisatCore_prop::nVars() - {return s->nVars();} - - template - void MinisatCore_prop::printStats() - { - double cpu_time = Minisat::cpuTime(); - double mem_used = Minisat::memUsedPeak(); - printf("restarts : %" PRIu64 "\n", s->starts); - printf("conflicts : %-12" PRIu64 " (%.0f /sec)\n", s->conflicts , s->conflicts /cpu_time); - printf("decisions : %-12" PRIu64 " (%4.2f %% random) (%.0f /sec)\n", s->decisions, (float)s->rnd_decisions*100 / (float)s->decisions, s->decisions /cpu_time); - printf("propagations : %-12" PRIu64 " (%.0f /sec)\n", s->propagations, s->propagations/cpu_time); - printf("conflict literals : %-12" PRIu64 " (%4.2f %% deleted)\n", s->tot_literals, (s->max_literals - s->tot_literals)*100 / (double)s->max_literals); - if (mem_used != 0) printf("Memory used : %.2f MB\n", mem_used); - printf("CPU time : %g s\n", cpu_time); - } - - template - void MinisatCore_prop::setSeed(int i) - { - s->random_seed = i; - } - - template class MinisatCore_prop; -}; diff --git a/src/vendor/stp/src/sat/MinisatCore_prop.h b/src/vendor/stp/src/sat/MinisatCore_prop.h deleted file mode 100644 index 92578f022..000000000 --- a/src/vendor/stp/src/sat/MinisatCore_prop.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Wraps around minisat with array propagators - */ -#ifndef MINISATCORE_PROP_H_ -#define MINIASTCORE_PROP_H_ - -#include "SATSolver.h" - -namespace Minisat -{ - class MinisatCore_prop; -} - -namespace BEEV -{ - template - class MinisatCore_prop: public SATSolver - { - T * s; - - public: - MinisatCore_prop(volatile bool& timeout); - - ~MinisatCore_prop(); - - bool - addClause(const vec_literals& ps); // Add a clause to the solver. - - bool - okay() const; // FALSE means solver is in a conflicting state - - virtual - bool addArray(int array_id, const SATSolver::vec_literals& i, const SATSolver::vec_literals& v, const Minisat::vec&, const Minisat::vec &); - - - bool - solve(); // Search without assumptions. - - virtual uint8_t modelValue(Var x) const; - - virtual Var newVar(); - - int setVerbosity(int v); - - int nVars(); - - void printStats(); - - virtual lbool true_literal() {return ((uint8_t)0);} - virtual lbool false_literal() {return ((uint8_t)1);} - virtual lbool undef_literal() {return ((uint8_t)2);} - - virtual void setSeed(int i); - }; -} -; - -#endif diff --git a/src/vendor/stp/src/sat/README b/src/vendor/stp/src/sat/README deleted file mode 100644 index e1b79329b..000000000 --- a/src/vendor/stp/src/sat/README +++ /dev/null @@ -1,19 +0,0 @@ -Directory overview: -================== - -mtl/ Mini Template Library -core/ A core version of the solver -simp/ An extended solver with simplification capabilities -README -LICENSE - -To build (release version: without assertions, statically linked, etc): -====================================================================== - -cd { core | simp } -gmake rs - -Usage: -====== - -TODO diff --git a/src/vendor/stp/src/sat/SATSolver.h b/src/vendor/stp/src/sat/SATSolver.h deleted file mode 100644 index 109136244..000000000 --- a/src/vendor/stp/src/sat/SATSolver.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef SATSOLVER_H_ -#define SATSOLVER_H_ - -#include "mtl/Vec.h" -#include "core/SolverTypes.h" -#include - -// Don't let the defines escape outside. - -namespace BEEV -{ - class SATSolver - { - private: - SATSolver(const SATSolver&); // no copy - void operator=(const SATSolver &); // no assign. - - - public: - - SATSolver(){} - - virtual ~SATSolver(){} - - class vec_literals : public Minisat::vec - {}; - - virtual bool - addClause(const SATSolver::vec_literals& ps)=0; // Add a clause to the solver. - - virtual - bool addArray(int array_id, const SATSolver::vec_literals& i, const SATSolver::vec_literals& v, const Minisat::vec&, const Minisat::vec& ) - { - std::cerr << "Not implemented"; - exit(1); - } - - - virtual bool - okay() const=0; // FALSE means solver is in a conflicting state - - virtual bool - solve()=0; // Search without assumptions. - - typedef int Var; - typedef uint8_t lbool; - - static inline Minisat::Lit mkLit (Var var, bool sign) { Minisat::Lit p; p.x = var + var + (int)sign; return p; } - - virtual uint8_t modelValue (Var x) const = 0; - - virtual Var newVar() =0; - - virtual int nVars() =0; - - virtual void printStats() = 0; - - virtual void setSeed(int i) - { - std::cerr << "Setting the random seen is not implemented for this solver" << std::endl; - exit(1); - } - - virtual int setVerbosity(int v) =0; - - virtual lbool true_literal() =0; - virtual lbool false_literal() =0; - virtual lbool undef_literal() =0; - - // The simplifying solvers shouldn't eliminate index / value variables. - virtual void setFrozen(Var x) - {} - - virtual int nClauses() - { - std::cerr << "Not yet implemented."; - exit(1); - } - - virtual bool simplify() - { - std::cerr << "Not yet implemented."; - exit(1); - - } - }; -}; -#endif diff --git a/src/vendor/stp/src/sat/SimplifyingMinisat.cpp b/src/vendor/stp/src/sat/SimplifyingMinisat.cpp deleted file mode 100644 index 8b80fda44..000000000 --- a/src/vendor/stp/src/sat/SimplifyingMinisat.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "SimplifyingMinisat.h" -#include "simp/SimpSolver.h" -#include "utils/System.h" - -namespace BEEV -{ - SimplifyingMinisat::SimplifyingMinisat(volatile bool& timeout) - { - s = new Minisat::SimpSolver(timeout); - } - - SimplifyingMinisat::~SimplifyingMinisat() - { - delete s; - } - - bool - SimplifyingMinisat::addClause(const vec_literals& ps) // Add a clause to the solver. - { - return s->addClause(ps); - } - - bool - SimplifyingMinisat::okay() const // FALSE means solver is in a conflicting state - { - return s->okay(); - } - - bool - SimplifyingMinisat::solve() // Search without assumptions. - { - if (!s->simplify()) - return false; - - return s->solve(); - } - - bool - SimplifyingMinisat::simplify() // Removes already satisfied clauses. - { - return s->simplify(); - } - - uint8_t - SimplifyingMinisat::modelValue(Var x) const - { - return Minisat::toInt(s->modelValue(x)); - } - - int SimplifyingMinisat::setVerbosity(int v) - { - return s->verbosity = v; - } - - void SimplifyingMinisat::setSeed(int i) - { - s->random_seed = i; - } - - Minisat::Var - SimplifyingMinisat::newVar() - { - return s->newVar(); - } - - int SimplifyingMinisat::nVars() - {return s->nVars();} - - void SimplifyingMinisat::printStats() - { - double cpu_time = Minisat::cpuTime(); - double mem_used = Minisat::memUsedPeak(); - printf("restarts : %" PRIu64 "\n", s->starts); - printf("conflicts : %-12" PRIu64 " (%.0f /sec)\n", s->conflicts , s->conflicts /cpu_time); - printf("decisions : %-12" PRIu64 " (%4.2f %% random) (%.0f /sec)\n", s->decisions, (float)s->rnd_decisions*100 / (float)s->decisions, s->decisions /cpu_time); - printf("propagations : %-12" PRIu64 " (%.0f /sec)\n", s->propagations, s->propagations/cpu_time); - printf("conflict literals : %-12" PRIu64 " (%4.2f %% deleted)\n", s->tot_literals, (s->max_literals - s->tot_literals)*100 / (double)s->max_literals); - if (mem_used != 0) printf("Memory used : %.2f MB\n", mem_used); - printf("CPU time : %g s\n", cpu_time); - } - - void SimplifyingMinisat::setFrozen(Var x) - { - s->setFrozen(x,true); - } -}; diff --git a/src/vendor/stp/src/sat/SimplifyingMinisat.h b/src/vendor/stp/src/sat/SimplifyingMinisat.h deleted file mode 100644 index 7311432d9..000000000 --- a/src/vendor/stp/src/sat/SimplifyingMinisat.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Wraps around Simplifying minisat. - */ -#ifndef SIMPLIFYINGMINISAT_H_ -#define SIMPLIFYINGMINISAT_H_ - -#include "SATSolver.h" - -namespace Minisat -{ - class SimpSolver; -} - -namespace BEEV -{ - class SimplifyingMinisat : public SATSolver - { - Minisat::SimpSolver* s; - - public: - - SimplifyingMinisat(volatile bool& timeout); - ~SimplifyingMinisat(); - - bool - addClause(const vec_literals& ps); // Add a clause to the solver. - - bool - okay() const; // FALSE means solver is in a conflicting state - - bool - solve(); // Search without assumptions. - - bool - simplify(); // Removes already satisfied clauses. - - int setVerbosity(int v); - - virtual uint8_t modelValue(Var x) const; - - virtual Var newVar(); - - int nVars(); - - void printStats(); - - virtual void setSeed(int i); - - virtual lbool true_literal() {return ((uint8_t)0);} - virtual lbool false_literal() {return ((uint8_t)1);} - virtual lbool undef_literal() {return ((uint8_t)2);} - - virtual void setFrozen(Var x); - }; -} -; - -#endif /* CORE_H_ */ diff --git a/src/vendor/stp/src/sat/core/Dimacs.h b/src/vendor/stp/src/sat/core/Dimacs.h deleted file mode 100644 index 2340b00a4..000000000 --- a/src/vendor/stp/src/sat/core/Dimacs.h +++ /dev/null @@ -1,89 +0,0 @@ -/****************************************************************************************[Dimacs.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Dimacs_h -#define Minisat_Dimacs_h - -#include - -#include "../utils/ParseUtils.h" -#include "../core/SolverTypes.h" - -namespace Minisat { - -//================================================================================================= -// DIMACS Parser: - -template -static void readClause(B& in, Solver& S, vec& lits) { - int parsed_lit, var; - lits.clear(); - for (;;){ - parsed_lit = parseInt(in); - if (parsed_lit == 0) break; - var = abs(parsed_lit)-1; - while (var >= S.nVars()) S.newVar(); - lits.push( (parsed_lit > 0) ? mkLit(var) : ~mkLit(var) ); - } -} - -template -static void parse_DIMACS_main(B& in, Solver& S) { - vec lits; - int vars = 0; - int clauses = 0; - int cnt = 0; - for (;;){ - skipWhitespace(in); - if (*in == EOF) break; - else if (*in == 'p'){ - if (eagerMatch(in, "p cnf")){ - vars = parseInt(in); - clauses = parseInt(in); - // SATRACE'06 hack - // if (clauses > 4000000) - // S.eliminate(true); - }else{ - printf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3); - } - } else if (*in == 'c' || *in == 'p') - skipLine(in); - else{ - cnt++; - readClause(in, S, lits); - S.addClause_(lits); } - } - if (vars != S.nVars()) - fprintf(stderr, "WARNING! DIMACS header mismatch: wrong number of variables.\n"); - if (cnt != clauses) - fprintf(stderr, "WARNING! DIMACS header mismatch: wrong number of clauses.\n"); -} - -// Inserts problem into solver. -// -template -static void parse_DIMACS(gzFile input_stream, Solver& S) { - StreamBuffer in(input_stream); - parse_DIMACS_main(in, S); } - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/core/Main.cc b/src/vendor/stp/src/sat/core/Main.cc deleted file mode 100644 index d2932c267..000000000 --- a/src/vendor/stp/src/sat/core/Main.cc +++ /dev/null @@ -1,192 +0,0 @@ -/*****************************************************************************************[Main.cc] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 "../utils/System.h" -#include "../utils/ParseUtils.h" -#include "../utils/Options.h" -#include "../core/Dimacs.h" -#include "../core/Solver.h" - -using namespace Minisat; - -//================================================================================================= - - -void printStats(Solver& solver) -{ - double cpu_time = cpuTime(); - double mem_used = memUsedPeak(); - printf("restarts : %" PRIu64 "\n", solver.starts); - printf("conflicts : %-12" PRIu64 " (%.0f /sec)\n", solver.conflicts , solver.conflicts /cpu_time); - printf("decisions : %-12" PRIu64 " (%4.2f %% random) (%.0f /sec)\n", solver.decisions, (float)solver.rnd_decisions*100 / (float)solver.decisions, solver.decisions /cpu_time); - printf("propagations : %-12" PRIu64 " (%.0f /sec)\n", solver.propagations, solver.propagations/cpu_time); - printf("conflict literals : %-12" PRIu64 " (%4.2f %% deleted)\n", solver.tot_literals, (solver.max_literals - solver.tot_literals)*100 / (double)solver.max_literals); - if (mem_used != 0) printf("Memory used : %.2f MB\n", mem_used); - printf("CPU time : %g s\n", cpu_time); -} - - -static Solver* solver; -// Terminate by notifying the solver and back out gracefully. This is mainly to have a test-case -// for this feature of the Solver as it may take longer than an immediate call to '_exit()'. -static void SIGINT_interrupt(int signum) { solver->interrupt(); } - -// Note that '_exit()' rather than 'exit()' has to be used. The reason is that 'exit()' calls -// destructors and may cause deadlocks if a malloc/free function happens to be running (these -// functions are guarded by locks for multithreaded use). -static void SIGINT_exit(int signum) { - printf("\n"); printf("*** INTERRUPTED ***\n"); - if (solver->verbosity > 0){ - printStats(*solver); - printf("\n"); printf("*** INTERRUPTED ***\n"); } - _exit(1); } - - -//================================================================================================= -// Main: - - -int main(int argc, char** argv) -{ - try { - setUsageHelp("USAGE: %s [options] \n\n where input may be either in plain or gzipped DIMACS.\n"); - // printf("This is MiniSat 2.0 beta\n"); - -#if defined(__linux__) - fpu_control_t oldcw, newcw; - _FPU_GETCW(oldcw); newcw = (oldcw & ~_FPU_EXTENDED) | _FPU_DOUBLE; _FPU_SETCW(newcw); - printf("WARNING: for repeatability, setting FPU to use double precision\n"); -#endif - // Extra options: - // - IntOption verb ("MAIN", "verb", "Verbosity level (0=silent, 1=some, 2=more).", 1, IntRange(0, 2)); - IntOption cpu_lim("MAIN", "cpu-lim","Limit on CPU time allowed in seconds.\n", INT32_MAX, IntRange(0, INT32_MAX)); - IntOption mem_lim("MAIN", "mem-lim","Limit on memory usage in megabytes.\n", INT32_MAX, IntRange(0, INT32_MAX)); - - parseOptions(argc, argv, true); - - Solver S; - double initial_time = cpuTime(); - - S.verbosity = verb; - - solver = &S; - // Use signal handlers that forcibly quit until the solver will be able to respond to - // interrupts: - signal(SIGINT, SIGINT_exit); - signal(SIGXCPU,SIGINT_exit); - - // Set limit on CPU-time: - if (cpu_lim != INT32_MAX){ - rlimit rl; - getrlimit(RLIMIT_CPU, &rl); - if (rl.rlim_max == RLIM_INFINITY || (rlim_t)cpu_lim < rl.rlim_max){ - rl.rlim_cur = cpu_lim; - if (setrlimit(RLIMIT_CPU, &rl) == -1) - printf("WARNING! Could not set resource limit: CPU-time.\n"); - } } - - // Set limit on virtual memory: - if (mem_lim != INT32_MAX){ - rlim_t new_mem_lim = (rlim_t)mem_lim * 1024*1024; - rlimit rl; - getrlimit(RLIMIT_AS, &rl); - if (rl.rlim_max == RLIM_INFINITY || new_mem_lim < rl.rlim_max){ - rl.rlim_cur = new_mem_lim; - if (setrlimit(RLIMIT_AS, &rl) == -1) - printf("WARNING! Could not set resource limit: Virtual memory.\n"); - } } - - if (argc == 1) - printf("Reading from standard input... Use '--help' for help.\n"); - - gzFile in = (argc == 1) ? gzdopen(0, "rb") : gzopen(argv[1], "rb"); - if (in == NULL) - printf("ERROR! Could not open file: %s\n", argc == 1 ? "" : argv[1]), exit(1); - - if (S.verbosity > 0){ - printf("============================[ Problem Statistics ]=============================\n"); - printf("| |\n"); } - - parse_DIMACS(in, S); - gzclose(in); - FILE* res = (argc >= 3) ? fopen(argv[2], "wb") : NULL; - - if (S.verbosity > 0){ - printf("| Number of variables: %12d |\n", S.nVars()); - printf("| Number of clauses: %12d |\n", S.nClauses()); } - - double parsed_time = cpuTime(); - if (S.verbosity > 0){ - printf("| Parse time: %12.2f s |\n", parsed_time - initial_time); - printf("| |\n"); } - - // Change to signal-handlers that will only notify the solver and allow it to terminate - // voluntarily: - signal(SIGINT, SIGINT_interrupt); - signal(SIGXCPU,SIGINT_interrupt); - - if (!S.simplify()){ - if (res != NULL) fprintf(res, "UNSAT\n"), fclose(res); - if (S.verbosity > 0){ - printf("===============================================================================\n"); - printf("Solved by unit propagation\n"); - printStats(S); - printf("\n"); } - printf("UNSATISFIABLE\n"); - exit(20); - } - - vec dummy; - lbool ret = S.solveLimited(dummy); - if (S.verbosity > 0){ - printStats(S); - printf("\n"); } - printf(ret == l_True ? "SATISFIABLE\n" : ret == l_False ? "UNSATISFIABLE\n" : "INDETERMINATE\n"); - if (res != NULL){ - if (ret == l_True){ - fprintf(res, "SAT\n"); - for (int i = 0; i < S.nVars(); i++) - if (S.model[i] != l_Undef) - fprintf(res, "%s%s%d", (i==0)?"":" ", (S.model[i]==l_True)?"":"-", i+1); - fprintf(res, " 0\n"); - }else if (ret == l_False) - fprintf(res, "UNSAT\n"); - else - fprintf(res, "INDET\n"); - fclose(res); - } - -#ifdef NDEBUG - exit(ret == l_True ? 10 : ret == l_False ? 20 : 0); // (faster than "return", which will invoke the destructor for 'Solver') -#else - return (ret == l_True ? 10 : ret == l_False ? 20 : 0); -#endif - } catch (OutOfMemoryException&){ - printf("===============================================================================\n"); - printf("INDETERMINATE\n"); - exit(0); - } -} diff --git a/src/vendor/stp/src/sat/core/Makefile b/src/vendor/stp/src/sat/core/Makefile deleted file mode 100644 index 9560f0dfb..000000000 --- a/src/vendor/stp/src/sat/core/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -EXEC = minisat -DEPDIR = mtl utils -MROOT=.. -LIB = core - -include $(MROOT)/mtl/template.mk diff --git a/src/vendor/stp/src/sat/core/Solver.cc b/src/vendor/stp/src/sat/core/Solver.cc deleted file mode 100644 index ce509e6ea..000000000 --- a/src/vendor/stp/src/sat/core/Solver.cc +++ /dev/null @@ -1,991 +0,0 @@ -/***************************************************************************************[Solver.cc] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 "../mtl/Sort.h" -#include "../core/Solver.h" - -using namespace Minisat; - -//================================================================================================= -// Options: - - -static const char* _cat = "CORE"; - -static DoubleOption opt_var_decay (_cat, "var-decay", "The variable activity decay factor", 0.95, DoubleRange(0, false, 1, false)); -static DoubleOption opt_clause_decay (_cat, "cla-decay", "The clause activity decay factor", 0.999, DoubleRange(0, false, 1, false)); -static DoubleOption opt_random_var_freq (_cat, "rnd-freq", "The frequency with which the decision heuristic tries to choose a random variable", 0, DoubleRange(0, true, 1, true)); -static DoubleOption opt_random_seed (_cat, "rnd-seed", "Used by the random variable selection", 91648253, DoubleRange(0, false, HUGE_VAL, false)); -static IntOption opt_ccmin_mode (_cat, "ccmin-mode", "Controls conflict clause minimization (0=none, 1=basic, 2=deep)", 2, IntRange(0, 2)); -static IntOption opt_phase_saving (_cat, "phase-saving", "Controls the level of phase saving (0=none, 1=limited, 2=full)", 2, IntRange(0, 2)); -static BoolOption opt_rnd_init_act (_cat, "rnd-init", "Randomize the initial activity", false); -static BoolOption opt_luby_restart (_cat, "luby", "Use the Luby restart sequence", true); -static IntOption opt_restart_first (_cat, "rfirst", "The base restart interval", 100, IntRange(1, INT32_MAX)); -static DoubleOption opt_restart_inc (_cat, "rinc", "Restart interval increase factor", 2, DoubleRange(1, false, HUGE_VAL, false)); -static DoubleOption opt_garbage_frac (_cat, "gc-frac", "The fraction of wasted memory allowed before a garbage collection is triggered", 0.20, DoubleRange(0, false, HUGE_VAL, false)); - - -//================================================================================================= -// Constructor/Destructor: - - -Solver::Solver(volatile bool& interrupt) : - - // Parameters (user settable): - // - verbosity (0) - , var_decay (opt_var_decay) - , clause_decay (opt_clause_decay) - , random_var_freq (opt_random_var_freq) - , random_seed (opt_random_seed) - , luby_restart (opt_luby_restart) - , ccmin_mode (opt_ccmin_mode) - , phase_saving (opt_phase_saving) - , rnd_pol (false) - , rnd_init_act (opt_rnd_init_act) - , garbage_frac (opt_garbage_frac) - , restart_first (opt_restart_first) - , restart_inc (opt_restart_inc) - - // Parameters (the rest): - // - , learntsize_factor((double)1/(double)3), learntsize_inc(1.1) - - // Parameters (experimental): - // - , learntsize_adjust_start_confl (100) - , learntsize_adjust_inc (1.5) - - // Statistics: (formerly in 'SolverStats') - // - , solves(0), starts(0), decisions(0), rnd_decisions(0), propagations(0), conflicts(0) - , dec_vars(0), clauses_literals(0), learnts_literals(0), max_literals(0), tot_literals(0) - - , ok (true) - , cla_inc (1) - , var_inc (1) - , watches (WatcherDeleted(ca)) - , qhead (0) - , simpDB_assigns (-1) - , simpDB_props (0) - , order_heap (VarOrderLt(activity)) - , progress_estimate (0) - , remove_satisfied (true) - - // Resource constraints: - // - , conflict_budget (-1) - , propagation_budget (-1) - , asynch_interrupt (interrupt) -{} - - -Solver::~Solver() -{ -} - - -//================================================================================================= -// Minor methods: - - -// Creates a new SAT variable in the solver. If 'decision' is cleared, variable will not be -// used as a decision variable (NOTE! This has effects on the meaning of a SATISFIABLE result). -// -Var Solver::newVar(bool sign, bool dvar) -{ - int v = nVars(); - watches .init(mkLit(v, false)); - watches .init(mkLit(v, true )); - assigns .push(l_Undef); - vardata .push(mkVarData(CRef_Undef, 0)); - //activity .push(0); - activity .push(rnd_init_act ? drand(random_seed) * 0.00001 : 0); - seen .push(0); - polarity .push(sign); - decision .push(); - trail .capacity(v+1); - setDecisionVar(v, dvar); - return v; -} - - -bool Solver::addClause_(vec& ps) -{ - assert(decisionLevel() == 0); - if (!ok) return false; - - // Check if clause is satisfied and remove false/duplicate literals: - sort(ps); - Lit p; int i, j; - for (i = j = 0, p = lit_Undef; i < ps.size(); i++) - if (value(ps[i]) == l_True || ps[i] == ~p) - return true; - else if (value(ps[i]) != l_False && ps[i] != p) - ps[j++] = p = ps[i]; - ps.shrink(i - j); - - if (ps.size() == 0) - return ok = false; - else if (ps.size() == 1){ - uncheckedEnqueue(ps[0]); - return ok = (propagate() == CRef_Undef); - }else{ - CRef cr = ca.alloc(ps, false); - clauses.push(cr); - attachClause(cr); - } - - return true; -} - - -void Solver::attachClause(CRef cr) { - const Clause& c = ca[cr]; - assert(c.size() > 1); - watches[~c[0]].push(Watcher(cr, c[1])); - watches[~c[1]].push(Watcher(cr, c[0])); - if (c.learnt()) learnts_literals += c.size(); - else clauses_literals += c.size(); } - - -void Solver::detachClause(CRef cr, bool strict) { - const Clause& c = ca[cr]; - assert(c.size() > 1); - - if (strict){ - remove(watches[~c[0]], Watcher(cr, c[1])); - remove(watches[~c[1]], Watcher(cr, c[0])); - }else{ - // Lazy detaching: (NOTE! Must clean all watcher lists before garbage collecting this clause) - watches.smudge(~c[0]); - watches.smudge(~c[1]); - } - - if (c.learnt()) learnts_literals -= c.size(); - else clauses_literals -= c.size(); } - - -void Solver::removeClause(CRef cr) { - Clause& c = ca[cr]; - detachClause(cr); - // Don't leave pointers to free'd memory! - if (locked(c)) vardata[var(c[0])].reason = CRef_Undef; - c.mark(1); - ca.free(cr); -} - - -bool Solver::satisfied(const Clause& c) const { - for (int i = 0; i < c.size(); i++) - if (value(c[i]) == l_True) - return true; - return false; } - - -// Revert to the state at given level (keeping all assignment at 'level' but not beyond). -// -void Solver::cancelUntil(int level) { - if (decisionLevel() > level){ - for (int c = trail.size()-1; c >= trail_lim[level]; c--){ - Var x = var(trail[c]); - assigns [x] = l_Undef; - if (phase_saving > 1 || (phase_saving == 1) && c > trail_lim.last()) - polarity[x] = sign(trail[c]); - insertVarOrder(x); } - qhead = trail_lim[level]; - trail.shrink(trail.size() - trail_lim[level]); - trail_lim.shrink(trail_lim.size() - level); - } } - - -//================================================================================================= -// Major methods: - - -Lit Solver::pickBranchLit() -{ - Var next = var_Undef; - - // Random decision: - if (drand(random_seed) < random_var_freq && !order_heap.empty()){ - next = order_heap[irand(random_seed,order_heap.size())]; - if (value(next) == l_Undef && decision[next]) - rnd_decisions++; } - - // Activity based decision: - while (next == var_Undef || value(next) != l_Undef || !decision[next]) - if (order_heap.empty()){ - next = var_Undef; - break; - }else - next = order_heap.removeMin(); - - return next == var_Undef ? lit_Undef : mkLit(next, rnd_pol ? drand(random_seed) < 0.5 : polarity[next]); -} - - -/*_________________________________________________________________________________________________ -| -| analyze : (confl : Clause*) (out_learnt : vec&) (out_btlevel : int&) -> [void] -| -| Description: -| Analyze conflict and produce a reason clause. -| -| Pre-conditions: -| * 'out_learnt' is assumed to be cleared. -| * Current decision level must be greater than root level. -| -| Post-conditions: -| * 'out_learnt[0]' is the asserting literal at level 'out_btlevel'. -| * If out_learnt.size() > 1 then 'out_learnt[1]' has the greatest decision level of the -| rest of literals. There may be others from the same level though. -| -|________________________________________________________________________________________________@*/ -void Solver::analyze(CRef confl, vec& out_learnt, int& out_btlevel) -{ - int pathC = 0; - Lit p = lit_Undef; - - // Generate conflict clause: - // - out_learnt.push(); // (leave room for the asserting literal) - int index = trail.size() - 1; - - do{ - assert(confl != CRef_Undef); // (otherwise should be UIP) - Clause& c = ca[confl]; - - if (c.learnt()) - claBumpActivity(c); - - for (int j = (p == lit_Undef) ? 0 : 1; j < c.size(); j++){ - Lit q = c[j]; - - if (!seen[var(q)] && level(var(q)) > 0){ - varBumpActivity(var(q)); - seen[var(q)] = 1; - if (level(var(q)) >= decisionLevel()) - pathC++; - else - out_learnt.push(q); - } - } - - // Select next clause to look at: - while (!seen[var(trail[index--])]); - p = trail[index+1]; - confl = reason(var(p)); - seen[var(p)] = 0; - pathC--; - - }while (pathC > 0); - out_learnt[0] = ~p; - - // Simplify conflict clause: - // - int i, j; - out_learnt.copyTo(analyze_toclear); - if (ccmin_mode == 2){ - uint32_t abstract_level = 0; - for (i = 1; i < out_learnt.size(); i++) - abstract_level |= abstractLevel(var(out_learnt[i])); // (maintain an abstraction of levels involved in conflict) - - for (i = j = 1; i < out_learnt.size(); i++) - if (reason(var(out_learnt[i])) == CRef_Undef || !litRedundant(out_learnt[i], abstract_level)) - out_learnt[j++] = out_learnt[i]; - - }else if (ccmin_mode == 1){ - for (i = j = 1; i < out_learnt.size(); i++){ - Var x = var(out_learnt[i]); - - if (reason(x) == CRef_Undef) - out_learnt[j++] = out_learnt[i]; - else{ - Clause& c = ca[reason(var(out_learnt[i]))]; - for (int k = 1; k < c.size(); k++) - if (!seen[var(c[k])] && level(var(c[k])) > 0){ - out_learnt[j++] = out_learnt[i]; - break; } - } - } - }else - i = j = out_learnt.size(); - - max_literals += out_learnt.size(); - out_learnt.shrink(i - j); - tot_literals += out_learnt.size(); - - // Find correct backtrack level: - // - if (out_learnt.size() == 1) - out_btlevel = 0; - else{ - int max_i = 1; - // Find the first literal assigned at the next-highest level: - for (int i = 2; i < out_learnt.size(); i++) - if (level(var(out_learnt[i])) > level(var(out_learnt[max_i]))) - max_i = i; - // Swap-in this literal at index 1: - Lit p = out_learnt[max_i]; - out_learnt[max_i] = out_learnt[1]; - out_learnt[1] = p; - out_btlevel = level(var(p)); - } - - for (int j = 0; j < analyze_toclear.size(); j++) seen[var(analyze_toclear[j])] = 0; // ('seen[]' is now cleared) -} - - -// Check if 'p' can be removed. 'abstract_levels' is used to abort early if the algorithm is -// visiting literals at levels that cannot be removed later. -bool Solver::litRedundant(Lit p, uint32_t abstract_levels) -{ - analyze_stack.clear(); analyze_stack.push(p); - int top = analyze_toclear.size(); - while (analyze_stack.size() > 0){ - assert(reason(var(analyze_stack.last())) != CRef_Undef); - Clause& c = ca[reason(var(analyze_stack.last()))]; analyze_stack.pop(); - - for (int i = 1; i < c.size(); i++){ - Lit p = c[i]; - if (!seen[var(p)] && level(var(p)) > 0){ - if (reason(var(p)) != CRef_Undef && (abstractLevel(var(p)) & abstract_levels) != 0){ - seen[var(p)] = 1; - analyze_stack.push(p); - analyze_toclear.push(p); - }else{ - for (int j = top; j < analyze_toclear.size(); j++) - seen[var(analyze_toclear[j])] = 0; - analyze_toclear.shrink(analyze_toclear.size() - top); - return false; - } - } - } - } - - return true; -} - - -/*_________________________________________________________________________________________________ -| -| analyzeFinal : (p : Lit) -> [void] -| -| Description: -| Specialized analysis procedure to express the final conflict in terms of assumptions. -| Calculates the (possibly empty) set of assumptions that led to the assignment of 'p', and -| stores the result in 'out_conflict'. -|________________________________________________________________________________________________@*/ -void Solver::analyzeFinal(Lit p, vec& out_conflict) -{ - out_conflict.clear(); - out_conflict.push(p); - - if (decisionLevel() == 0) - return; - - seen[var(p)] = 1; - - for (int i = trail.size()-1; i >= trail_lim[0]; i--){ - Var x = var(trail[i]); - if (seen[x]){ - if (reason(x) == CRef_Undef){ - assert(level(x) > 0); - out_conflict.push(~trail[i]); - }else{ - Clause& c = ca[reason(x)]; - for (int j = 1; j < c.size(); j++) - if (level(var(c[j])) > 0) - seen[var(c[j])] = 1; - } - seen[x] = 0; - } - } - - seen[var(p)] = 0; -} - - -void Solver::uncheckedEnqueue(Lit p, CRef from) -{ - assert(value(p) == l_Undef); - assigns[var(p)] = lbool(!sign(p)); - vardata[var(p)] = mkVarData(from, decisionLevel()); - trail.push_(p); -} - - -/*_________________________________________________________________________________________________ -| -| propagate : [void] -> [Clause*] -| -| Description: -| Propagates all enqueued facts. If a conflict arises, the conflicting clause is returned, -| otherwise CRef_Undef. -| -| Post-conditions: -| * the propagation queue is empty, even if there was a conflict. -|________________________________________________________________________________________________@*/ -CRef Solver::propagate() -{ - CRef confl = CRef_Undef; - int num_props = 0; - watches.cleanAll(); - - while (qhead < trail.size()){ - Lit p = trail[qhead++]; // 'p' is enqueued fact to propagate. - vec& ws = watches[p]; - Watcher *i, *j, *end; - num_props++; - - for (i = j = (Watcher*)ws, end = i + ws.size(); i != end;){ - // Try to avoid inspecting the clause: - Lit blocker = i->blocker; - if (value(blocker) == l_True){ - *j++ = *i++; continue; } - - // Make sure the false literal is data[1]: - CRef cr = i->cref; - Clause& c = ca[cr]; - Lit false_lit = ~p; - if (c[0] == false_lit) - c[0] = c[1], c[1] = false_lit; - assert(c[1] == false_lit); - i++; - - // If 0th watch is true, then clause is already satisfied. - Lit first = c[0]; - Watcher w = Watcher(cr, first); - if (first != blocker && value(first) == l_True){ - *j++ = w; continue; } - - // Look for new watch: - for (int k = 2; k < c.size(); k++) - if (value(c[k]) != l_False){ - c[1] = c[k]; c[k] = false_lit; - watches[~c[1]].push(w); - goto NextClause; } - - // Did not find watch -- clause is unit under assignment: - *j++ = w; - if (value(first) == l_False){ - confl = cr; - qhead = trail.size(); - // Copy the remaining watches: - while (i < end) - *j++ = *i++; - }else - uncheckedEnqueue(first, cr); - - NextClause:; - } - ws.shrink(i - j); - } - propagations += num_props; - simpDB_props -= num_props; - - return confl; -} - - -/*_________________________________________________________________________________________________ -| -| reduceDB : () -> [void] -| -| Description: -| Remove half of the learnt clauses, minus the clauses locked by the current assignment. Locked -| clauses are clauses that are reason to some assignment. Binary clauses are never removed. -|________________________________________________________________________________________________@*/ -struct reduceDB_lt { - ClauseAllocator& ca; - reduceDB_lt(ClauseAllocator& ca_) : ca(ca_) {} - bool operator () (CRef x, CRef y) { - return ca[x].size() > 2 && (ca[y].size() == 2 || ca[x].activity() < ca[y].activity()); } -}; -void Solver::reduceDB() -{ - int i, j; - double extra_lim = cla_inc / learnts.size(); // Remove any clause below this activity - - sort(learnts, reduceDB_lt(ca)); - // Don't delete binary or locked clauses. From the rest, delete clauses from the first half - // and clauses with activity smaller than 'extra_lim': - for (i = j = 0; i < learnts.size(); i++){ - Clause& c = ca[learnts[i]]; - if (c.size() > 2 && !locked(c) && (i < learnts.size() / 2 || c.activity() < extra_lim)) - removeClause(learnts[i]); - else - learnts[j++] = learnts[i]; - } - learnts.shrink(i - j); - checkGarbage(); -} - - -void Solver::removeSatisfied(vec& cs) -{ - int i, j; - for (i = j = 0; i < cs.size(); i++){ - Clause& c = ca[cs[i]]; - if (satisfied(c)) - removeClause(cs[i]); - else - cs[j++] = cs[i]; - } - cs.shrink(i - j); -} - - -void Solver::rebuildOrderHeap() -{ - vec vs; - for (Var v = 0; v < nVars(); v++) - if (decision[v] && value(v) == l_Undef) - vs.push(v); - order_heap.build(vs); -} - - -/*_________________________________________________________________________________________________ -| -| simplify : [void] -> [bool] -| -| Description: -| Simplify the clause database according to the current top-level assigment. Currently, the only -| thing done here is the removal of satisfied clauses, but more things can be put here. -|________________________________________________________________________________________________@*/ -bool Solver::simplify() -{ - assert(decisionLevel() == 0); - - if (!ok || propagate() != CRef_Undef) - return ok = false; - - if (nAssigns() == simpDB_assigns || (simpDB_props > 0)) - return true; - - // Remove satisfied clauses: - removeSatisfied(learnts); - if (remove_satisfied) // Can be turned off. - removeSatisfied(clauses); - checkGarbage(); - rebuildOrderHeap(); - - simpDB_assigns = nAssigns(); - simpDB_props = clauses_literals + learnts_literals; // (shouldn't depend on stats really, but it will do for now) - - return true; -} - - -/*_________________________________________________________________________________________________ -| -| search : (nof_conflicts : int) (params : const SearchParams&) -> [lbool] -| -| Description: -| Search for a model the specified number of conflicts. -| NOTE! Use negative value for 'nof_conflicts' indicate infinity. -| -| Output: -| 'l_True' if a partial assigment that is consistent with respect to the clauseset is found. If -| all variables are decision variables, this means that the clause set is satisfiable. 'l_False' -| if the clause set is unsatisfiable. 'l_Undef' if the bound on number of conflicts is reached. -|________________________________________________________________________________________________@*/ -lbool Solver::search(int nof_conflicts) -{ - assert(ok); - int backtrack_level; - int conflictC = 0; - vec learnt_clause; - starts++; - - for (;;){ - CRef confl = propagate(); - if (confl != CRef_Undef){ - // CONFLICT - conflicts++; conflictC++; - if (decisionLevel() == 0) return l_False; - - learnt_clause.clear(); - analyze(confl, learnt_clause, backtrack_level); - cancelUntil(backtrack_level); - - if (learnt_clause.size() == 1){ - uncheckedEnqueue(learnt_clause[0]); - }else{ - CRef cr = ca.alloc(learnt_clause, true); - learnts.push(cr); - attachClause(cr); - claBumpActivity(ca[cr]); - uncheckedEnqueue(learnt_clause[0], cr); - } - - varDecayActivity(); - claDecayActivity(); - - if (--learntsize_adjust_cnt == 0){ - learntsize_adjust_confl *= learntsize_adjust_inc; - learntsize_adjust_cnt = (int)learntsize_adjust_confl; - max_learnts *= learntsize_inc; - - if (verbosity >= 1) - printf("| %9d | %7d %8d %8d | %8d %8d %6.0f | %6.3f %% |\n", - (int)conflicts, - (int)dec_vars - (trail_lim.size() == 0 ? trail.size() : trail_lim[0]), nClauses(), (int)clauses_literals, - (int)max_learnts, nLearnts(), (double)learnts_literals/nLearnts(), progressEstimate()*100); - } - - }else{ - // NO CONFLICT - if (nof_conflicts >= 0 && conflictC >= nof_conflicts || !withinBudget()){ - // Reached bound on number of conflicts: - progress_estimate = progressEstimate(); - cancelUntil(0); - return l_Undef; } - - // Simplify the set of problem clauses: - if (decisionLevel() == 0 && !simplify()) - return l_False; - - if (learnts.size()-nAssigns() >= max_learnts) - // Reduce the set of learnt clauses: - reduceDB(); - - Lit next = lit_Undef; - while (decisionLevel() < assumptions.size()){ - // Perform user provided assumption: - Lit p = assumptions[decisionLevel()]; - if (value(p) == l_True){ - // Dummy decision level: - newDecisionLevel(); - }else if (value(p) == l_False){ - analyzeFinal(~p, conflict); - return l_False; - }else{ - next = p; - break; - } - } - - if (next == lit_Undef){ - // New variable decision: - decisions++; - next = pickBranchLit(); - - if (next == lit_Undef) - // Model found: - return l_True; - } - - // Increase decision level and enqueue 'next' - newDecisionLevel(); - uncheckedEnqueue(next); - } - } -} - - -double Solver::progressEstimate() const -{ - double progress = 0; - double F = 1.0 / nVars(); - - for (int i = 0; i <= decisionLevel(); i++){ - int beg = i == 0 ? 0 : trail_lim[i - 1]; - int end = i == decisionLevel() ? trail.size() : trail_lim[i]; - progress += pow(F, i) * (end - beg); - } - - return progress / nVars(); -} - -/* - Finite subsequences of the Luby-sequence: - - 0: 1 - 1: 1 1 2 - 2: 1 1 2 1 1 2 4 - 3: 1 1 2 1 1 2 4 1 1 2 1 1 2 4 8 - ... - - - */ - -static double luby(double y, int x){ - - // Find the finite subsequence that contains index 'x', and the - // size of that subsequence: - int size, seq; - for (size = 1, seq = 0; size < x+1; seq++, size = 2*size+1); - - while (size-1 != x){ - size = (size-1)>>1; - seq--; - x = x % size; - } - - return pow(y, seq); -} - -bool Solver::unitPropagate( const vec& assumps) -{ - model.clear(); - conflict.clear(); - - ok = true; - - assert(assumptions.size() == 0); - assert(decisionLevel()== 0); - - // None of the values should be known. - for (int i = 0; i < nVars(); i++) - { - assert(value(i) == l_Undef); - } - - - assumps.copyTo(assumptions); - - while (decisionLevel() < assumptions.size()) - { - // Perform user provided assumption: - Lit p = assumptions[decisionLevel()]; - if (value(p) == l_True){ - // Dummy decision level: - newDecisionLevel(); - }else if (value(p) == l_False){ - analyzeFinal(~p, conflict); - ok =false; - break; - }else{ - newDecisionLevel(); - uncheckedEnqueue(p); - if (propagate() != CRef_Undef) - { - ok =false; - break; - } - } - } - - if (ok) - { - // Extend & copy model: - model.growTo(nVars()); - for (int i = 0; i < nVars(); i++) model[i] = value(i); - } - - cancelUntil(0); - assumptions.clear(); - - for (int i = 0; i < nVars(); i++) - { - assert(value(i) == l_Undef); - } - - return ok; -} - - -// NOTE: assumptions passed in member-variable 'assumptions'. -lbool Solver::solve_() -{ - model.clear(); - conflict.clear(); - if (!ok) return l_False; - - solves++; - - max_learnts = nClauses() * learntsize_factor; - learntsize_adjust_confl = learntsize_adjust_start_confl; - learntsize_adjust_cnt = (int)learntsize_adjust_confl; - lbool status = l_Undef; - - if (verbosity >= 1){ - printf("============================[ Search Statistics ]==============================\n"); - printf("| Conflicts | ORIGINAL | LEARNT | Progress |\n"); - printf("| | Vars Clauses Literals | Limit Clauses Lit/Cl | |\n"); - printf("===============================================================================\n"); - } - - // Search: - int curr_restarts = 0; - while (status == l_Undef){ - double rest_base = luby_restart ? luby(restart_inc, curr_restarts) : pow(restart_inc, curr_restarts); - status = search(rest_base * restart_first); - if (!withinBudget()) break; - curr_restarts++; - } - - if (verbosity >= 1) - printf("===============================================================================\n"); - - - if (status == l_True){ - // Extend & copy model: - model.growTo(nVars()); - for (int i = 0; i < nVars(); i++) model[i] = value(i); - }else if (status == l_False && conflict.size() == 0) - ok = false; - - cancelUntil(0); - return status; -} - -//================================================================================================= -// Writing CNF to DIMACS: -// -// FIXME: this needs to be rewritten completely. - -static Var mapVar(Var x, vec& map, Var& max) -{ - if (max < x+1) - max =x+1; - return x; - -/* - - if (map.size() <= x || map[x] == -1){ - map.growTo(x+1, -1); - map[x] = max++; - } - return map[x]; - */ -} - - -void Solver::toDimacs(FILE* f, Clause& c, vec& map, Var& max) -{ - if (satisfied(c)) return; - - for (int i = 0; i < c.size(); i++) - if (value(c[i]) != l_False) - fprintf(f, "%s%d ", sign(c[i]) ? "-" : "", mapVar(var(c[i]), map, max)+1); - fprintf(f, "0\n"); -} - - -void Solver::toDimacs(const char *file, const vec& assumps) -{ - FILE* f = fopen(file, "wr"); - if (f == NULL) - fprintf(stderr, "could not open file %s\n", file), exit(1); - toDimacs(f, assumps); - fclose(f); -} - - - -void Solver::toDimacs(FILE* f, const vec& assumps) -{ - // Handle case when solver is in contradictory state: - if (!ok){ - fprintf(f, "p cnf 1 2\n1 0\n-1 0\n"); - return; } - - vec map; Var max = 0; - - // Cannot use removeClauses here because it is not safe - // to deallocate them at this point. Could be improved. - int cnt = 0; - for (int i = 0; i < clauses.size(); i++) - if (!satisfied(ca[clauses[i]])) - cnt++; - - for (int i = 0; i < clauses.size(); i++) - if (!satisfied(ca[clauses[i]])){ - Clause& c = ca[clauses[i]]; - for (int j = 0; j < c.size(); j++) - if (value(c[j]) != l_False) - mapVar(var(c[j]), map, max); - } - - // Assumptions are added as unit clauses: - cnt += assumptions.size(); - - fprintf(f, "p cnf %d %d\n", max, cnt); - - for (int i = 0; i < assumptions.size(); i++){ - assert(value(assumptions[i]) != l_False); - fprintf(f, "%s%d 0\n", sign(assumptions[i]) ? "-" : "", mapVar(var(assumptions[i]), map, max)+1); - } - - for (int i = 0; i < clauses.size(); i++) - toDimacs(f, ca[clauses[i]], map, max); - - if (verbosity > 0) - printf("Wrote %d clauses with %d variables.\n", cnt, max); -} - - -//================================================================================================= -// Garbage Collection methods: - -void Solver::relocAll(ClauseAllocator& to) -{ - // All watchers: - // - // for (int i = 0; i < watches.size(); i++) - watches.cleanAll(); - for (int v = 0; v < nVars(); v++) - for (int s = 0; s < 2; s++){ - Lit p = mkLit(v, s); - // printf(" >>> RELOCING: %s%d\n", sign(p)?"-":"", var(p)+1); - vec& ws = watches[p]; - for (int j = 0; j < ws.size(); j++) - ca.reloc(ws[j].cref, to); - } - - // All reasons: - // - for (int i = 0; i < trail.size(); i++){ - Var v = var(trail[i]); - - if (reason(v) != CRef_Undef && (ca[reason(v)].reloced() || locked(ca[reason(v)]))) - ca.reloc(vardata[v].reason, to); - } - - // All learnt: - // - for (int i = 0; i < learnts.size(); i++) - ca.reloc(learnts[i], to); - - // All original: - // - for (int i = 0; i < clauses.size(); i++) - ca.reloc(clauses[i], to); -} - - -void Solver::garbageCollect() -{ - // Initialize the next region to a size corresponding to the estimated utilization degree. This - // is not precise but should avoid some unnecessary reallocations for the new region: - ClauseAllocator to(ca.size() - ca.wasted()); - - relocAll(to); - if (verbosity >= 2) - printf("| Garbage collection: %12d bytes => %12d bytes |\n", - ca.size()*ClauseAllocator::Unit_Size, to.size()*ClauseAllocator::Unit_Size); - to.moveTo(ca); -} diff --git a/src/vendor/stp/src/sat/core/Solver.h b/src/vendor/stp/src/sat/core/Solver.h deleted file mode 100644 index 2979ca62d..000000000 --- a/src/vendor/stp/src/sat/core/Solver.h +++ /dev/null @@ -1,379 +0,0 @@ -/****************************************************************************************[Solver.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Solver_h -#define Minisat_Solver_h - -#include "../mtl/Vec.h" -#include "../mtl/Heap.h" -#include "../mtl/Alg.h" -#include "../utils/Options.h" -#include "../core/SolverTypes.h" - - -namespace Minisat { - -//================================================================================================= -// Solver -- the main class: - -class Solver { -public: - - // Constructor/Destructor: - // - Solver(volatile bool& interrupt); - virtual ~Solver(); - - // Problem specification: - // - Var newVar (bool polarity = true, bool dvar = true); // Add a new variable with parameters specifying variable mode. - - bool addClause (const vec& ps); // Add a clause to the solver. - bool addEmptyClause(); // Add the empty clause, making the solver contradictory. - bool addClause (Lit p); // Add a unit clause to the solver. - bool addClause (Lit p, Lit q); // Add a binary clause to the solver. - bool addClause (Lit p, Lit q, Lit r); // Add a ternary clause to the solver. - bool addClause_( vec& ps); // Add a clause to the solver without making superflous internal copy. Will - // change the passed vector 'ps'. - - // Solving: - // - bool simplify (); // Removes already satisfied clauses. - bool solve (const vec& assumps); // Search for a model that respects a given set of assumptions. - lbool solveLimited (const vec& assumps); // Search for a model that respects a given set of assumptions (With resource constraints). - bool solve (); // Search without assumptions. - bool solve (Lit p); // Search for a model that respects a single assumption. - bool solve (Lit p, Lit q); // Search for a model that respects two assumptions. - bool solve (Lit p, Lit q, Lit r); // Search for a model that respects three assumptions. - bool okay () const; // FALSE means solver is in a conflicting state - - void toDimacs (FILE* f, const vec& assumps); // Write CNF to file in DIMACS-format. - void toDimacs (const char *file, const vec& assumps); - void toDimacs (FILE* f, Clause& c, vec& map, Var& max); - - // Convenience versions of 'toDimacs()': - void toDimacs (const char* file); - void toDimacs (const char* file, Lit p); - void toDimacs (const char* file, Lit p, Lit q); - void toDimacs (const char* file, Lit p, Lit q, Lit r); - - // Variable mode: - // - void setPolarity (Var v, bool b); // Declare which polarity the decision heuristic should use for a variable. Requires mode 'polarity_user'. - void setDecisionVar (Var v, bool b); // Declare if a variable should be eligible for selection in the decision heuristic. - - // Read state: - // - lbool value (Var x) const; // The current value of a variable. - lbool value (Lit p) const; // The current value of a literal. - lbool modelValue (Var x) const; // The value of a variable in the last model. The last call to solve must have been satisfiable. - lbool modelValue (Lit p) const; // The value of a literal in the last model. The last call to solve must have been satisfiable. - int nAssigns () const; // The current number of assigned literals. - int nClauses () const; // The current number of original clauses. - int nLearnts () const; // The current number of learnt clauses. - int nVars () const; // The current number of variables. - int nFreeVars () const; - - // Resource contraints: - // - void setConfBudget(int64_t x); - void setPropBudget(int64_t x); - void budgetOff(); - void interrupt(); // Trigger a (potentially asynchronous) interruption of the solver. - void clearInterrupt(); // Clear interrupt indicator flag. - - // Memory managment: - // - virtual void garbageCollect(); - void checkGarbage(double gf); - void checkGarbage(); - - // Extra results: (read-only member variable) - // - vec model; // If problem is satisfiable, this vector contains the model (if any). - vec conflict; // If problem is unsatisfiable (possibly under assumptions), - // this vector represent the final conflict clause expressed in the assumptions. - - // Mode of operation: - // - int verbosity; - double var_decay; - double clause_decay; - double random_var_freq; - double random_seed; - bool luby_restart; - int ccmin_mode; // Controls conflict clause minimization (0=none, 1=basic, 2=deep). - int phase_saving; // Controls the level of phase saving (0=none, 1=limited, 2=full). - bool rnd_pol; // Use random polarities for branching heuristics. - bool rnd_init_act; // Initialize variable activities with a small random value. - double garbage_frac; // The fraction of wasted memory allowed before a garbage collection is triggered. - - int restart_first; // The initial restart limit. (default 100) - double restart_inc; // The factor with which the restart limit is multiplied in each restart. (default 1.5) - double learntsize_factor; // The intitial limit for learnt clauses is a factor of the original clauses. (default 1 / 3) - double learntsize_inc; // The limit for learnt clauses is multiplied with this factor each restart. (default 1.1) - - int learntsize_adjust_start_confl; - double learntsize_adjust_inc; - - // Statistics: (read-only member variable) - // - uint64_t solves, starts, decisions, rnd_decisions, propagations, conflicts; - uint64_t dec_vars, clauses_literals, learnts_literals, max_literals, tot_literals; - - bool unitPropagate( const vec& assumps); - -protected: - - // Helper structures: - // - struct VarData { CRef reason; int level; }; - static inline VarData mkVarData(CRef cr, int l){ VarData d = {cr, l}; return d; } - - struct Watcher { - CRef cref; - Lit blocker; - Watcher(CRef cr, Lit p) : cref(cr), blocker(p) {} - bool operator==(const Watcher& w) const { return cref == w.cref; } - bool operator!=(const Watcher& w) const { return cref != w.cref; } - }; - - struct WatcherDeleted - { - const ClauseAllocator& ca; - WatcherDeleted(const ClauseAllocator& _ca) : ca(_ca) {} - bool operator()(const Watcher& w) const { return ca[w.cref].mark() == 1; } - }; - - struct VarOrderLt { - const vec& activity; - bool operator () (Var x, Var y) const { return activity[x] > activity[y]; } - VarOrderLt(const vec& act) : activity(act) { } - }; - - // Solver state: - // - bool ok; // If FALSE, the constraints are already unsatisfiable. No part of the solver state may be used! - vec clauses; // List of problem clauses. - vec learnts; // List of learnt clauses. - double cla_inc; // Amount to bump next clause with. - vec activity; // A heuristic measurement of the activity of a variable. - double var_inc; // Amount to bump next variable with. - OccLists, WatcherDeleted> - watches; // 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true). - vec assigns; // The current assignments. - vec polarity; // The preferred polarity of each variable. - vec decision; // Declares if a variable is eligible for selection in the decision heuristic. - vec trail; // Assignment stack; stores all assigments made in the order they were made. - vec trail_lim; // Separator indices for different decision levels in 'trail'. - vec vardata; // Stores reason and level for each variable. - int qhead; // Head of queue (as index into the trail -- no more explicit propagation queue in MiniSat). - int simpDB_assigns; // Number of top-level assignments since last execution of 'simplify()'. - int64_t simpDB_props; // Remaining number of propagations that must be made before next execution of 'simplify()'. - - - vec assumptions; // Current set of assumptions provided to solve by the user. - - - Heap order_heap; // A priority queue of variables ordered with respect to the variable activity. - double progress_estimate;// Set by 'search()'. - bool remove_satisfied; // Indicates whether possibly inefficient linear scan for satisfied clauses should be performed in 'simplify'. - - ClauseAllocator ca; - - // Temporaries (to reduce allocation overhead). Each variable is prefixed by the method in which it is - // used, exept 'seen' wich is used in several places. - // - vec seen; - vec analyze_stack; - vec analyze_toclear; - vec add_tmp; - - double max_learnts; - double learntsize_adjust_confl; - int learntsize_adjust_cnt; - - // Resource contraints: - // - int64_t conflict_budget; // -1 means no budget. - int64_t propagation_budget; // -1 means no budget. - volatile bool& asynch_interrupt; - - // Main internal methods: - // - void insertVarOrder (Var x); // Insert a variable in the decision order priority queue. - Lit pickBranchLit (); // Return the next decision variable. - void newDecisionLevel (); // Begins a new decision level. - void uncheckedEnqueue (Lit p, CRef from = CRef_Undef); // Enqueue a literal. Assumes value of literal is undefined. - bool enqueue (Lit p, CRef from = CRef_Undef); // Test if fact 'p' contradicts current state, enqueue otherwise. - CRef propagate (); // Perform unit propagation. Returns possibly conflicting clause. - void cancelUntil (int level); // Backtrack until a certain level. - void analyze (CRef confl, vec& out_learnt, int& out_btlevel); // (bt = backtrack) - void analyzeFinal (Lit p, vec& out_conflict); // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION? - bool litRedundant (Lit p, uint32_t abstract_levels); // (helper method for 'analyze()') - lbool search (int nof_conflicts); // Search for a given number of conflicts. - lbool solve_ (); // Main solve method (assumptions given in 'assumptions'). - void reduceDB (); // Reduce the set of learnt clauses. - void removeSatisfied (vec& cs); // Shrink 'cs' to contain only non-satisfied clauses. - void rebuildOrderHeap (); - - // Maintaining Variable/Clause activity: - // - void varDecayActivity (); // Decay all variables with the specified factor. Implemented by increasing the 'bump' value instead. - void varBumpActivity (Var v, double inc); // Increase a variable with the current 'bump' value. - void varBumpActivity (Var v); // Increase a variable with the current 'bump' value. - void claDecayActivity (); // Decay all clauses with the specified factor. Implemented by increasing the 'bump' value instead. - void claBumpActivity (Clause& c); // Increase a clause with the current 'bump' value. - - // Operations on clauses: - // - void attachClause (CRef cr); // Attach a clause to watcher lists. - void detachClause (CRef cr, bool strict = false); // Detach a clause to watcher lists. - void removeClause (CRef cr); // Detach and free a clause. - bool locked (const Clause& c) const; // Returns TRUE if a clause is a reason for some implication in the current state. - bool satisfied (const Clause& c) const; // Returns TRUE if a clause is satisfied in the current state. - - void relocAll (ClauseAllocator& to); - - // Misc: - // - int decisionLevel () const; // Gives the current decisionlevel. - uint32_t abstractLevel (Var x) const; // Used to represent an abstraction of sets of decision levels. - CRef reason (Var x) const; - int level (Var x) const; - double progressEstimate () const; // DELETE THIS ?? IT'S NOT VERY USEFUL ... - bool withinBudget () const; - - // Static helpers: - // - - // Returns a random float 0 <= x < 1. Seed must never be 0. - static inline double drand(double& seed) { - seed *= 1389796; - int q = (int)(seed / 2147483647); - seed -= (double)q * 2147483647; - return seed / 2147483647; } - - // Returns a random integer 0 <= x < size. Seed must never be 0. - static inline int irand(double& seed, int size) { - return (int)(drand(seed) * size); } -}; - - -//================================================================================================= -// Implementation of inline methods: - -inline CRef Solver::reason(Var x) const { return vardata[x].reason; } -inline int Solver::level (Var x) const { return vardata[x].level; } - -inline void Solver::insertVarOrder(Var x) { - if (!order_heap.inHeap(x) && decision[x]) order_heap.insert(x); } - -inline void Solver::varDecayActivity() { var_inc *= (1 / var_decay); } -inline void Solver::varBumpActivity(Var v) { varBumpActivity(v, var_inc); } -inline void Solver::varBumpActivity(Var v, double inc) { - if ( (activity[v] += inc) > 1e100 ) { - // Rescale: - for (int i = 0; i < nVars(); i++) - activity[i] *= 1e-100; - var_inc *= 1e-100; } - - // Update order_heap with respect to new activity: - if (order_heap.inHeap(v)) - order_heap.decrease(v); } - -inline void Solver::claDecayActivity() { cla_inc *= (1 / clause_decay); } -inline void Solver::claBumpActivity (Clause& c) { - if ( (c.activity() += cla_inc) > 1e20 ) { - // Rescale: - for (int i = 0; i < learnts.size(); i++) - ca[learnts[i]].activity() *= 1e-20; - cla_inc *= 1e-20; } } - -inline void Solver::checkGarbage(void){ return checkGarbage(garbage_frac); } -inline void Solver::checkGarbage(double gf){ - if (ca.wasted() > ca.size() * gf) - garbageCollect(); } - -// NOTE: enqueue does not set the ok flag! (only public methods do) -inline bool Solver::enqueue (Lit p, CRef from) { return value(p) != l_Undef ? value(p) != l_False : (uncheckedEnqueue(p, from), true); } -inline bool Solver::addClause (const vec& ps) { ps.copyTo(add_tmp); return addClause_(add_tmp); } -inline bool Solver::addEmptyClause () { add_tmp.clear(); return addClause_(add_tmp); } -inline bool Solver::addClause (Lit p) { add_tmp.clear(); add_tmp.push(p); return addClause_(add_tmp); } -inline bool Solver::addClause (Lit p, Lit q) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); return addClause_(add_tmp); } -inline bool Solver::addClause (Lit p, Lit q, Lit r) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); add_tmp.push(r); return addClause_(add_tmp); } -inline bool Solver::locked (const Clause& c) const { return value(c[0]) == l_True && reason(var(c[0])) != CRef_Undef && ca.lea(reason(var(c[0]))) == &c; } -inline void Solver::newDecisionLevel() { trail_lim.push(trail.size()); } - -inline int Solver::decisionLevel () const { return trail_lim.size(); } -inline uint32_t Solver::abstractLevel (Var x) const { return 1 << (level(x) & 31); } -inline lbool Solver::value (Var x) const { return assigns[x]; } -inline lbool Solver::value (Lit p) const { return assigns[var(p)] ^ sign(p); } -inline lbool Solver::modelValue (Var x) const { return model[x]; } -inline lbool Solver::modelValue (Lit p) const { return model[var(p)] ^ sign(p); } -inline int Solver::nAssigns () const { return trail.size(); } -inline int Solver::nClauses () const { return clauses.size(); } -inline int Solver::nLearnts () const { return learnts.size(); } -inline int Solver::nVars () const { return vardata.size(); } -inline int Solver::nFreeVars () const { return (int)dec_vars - (trail_lim.size() == 0 ? trail.size() : trail_lim[0]); } -inline void Solver::setPolarity (Var v, bool b) { polarity[v] = b; } -inline void Solver::setDecisionVar(Var v, bool b) -{ - if ( b && !decision[v]) dec_vars++; - else if (!b && decision[v]) dec_vars--; - - decision[v] = b; - insertVarOrder(v); -} -inline void Solver::setConfBudget(int64_t x){ conflict_budget = conflicts + x; } -inline void Solver::setPropBudget(int64_t x){ propagation_budget = propagations + x; } -inline void Solver::interrupt(){ asynch_interrupt = true; } -inline void Solver::clearInterrupt(){ asynch_interrupt = false; } -inline void Solver::budgetOff(){ conflict_budget = propagation_budget = -1; } -inline bool Solver::withinBudget() const { - return !asynch_interrupt && - (conflict_budget < 0 || conflicts < (uint64_t)conflict_budget) && - (propagation_budget < 0 || propagations < (uint64_t)propagation_budget); } - -// FIXME: after the introduction of asynchronous interrruptions the solve-versions that return a -// pure bool do not give a safe interface. Either interrupts must be possible to turn off here, or -// all calls to solve must return an 'lbool'. I'm not yet sure which I prefer. -inline bool Solver::solve () { budgetOff(); assumptions.clear(); return solve_() == l_True; } -inline bool Solver::solve (Lit p) { budgetOff(); assumptions.clear(); assumptions.push(p); return solve_() == l_True; } -inline bool Solver::solve (Lit p, Lit q) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); return solve_() == l_True; } -inline bool Solver::solve (Lit p, Lit q, Lit r) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); assumptions.push(r); return solve_() == l_True; } -inline bool Solver::solve (const vec& assumps){ budgetOff(); assumps.copyTo(assumptions); return solve_() == l_True; } -inline lbool Solver::solveLimited (const vec& assumps){ assumps.copyTo(assumptions); return solve_(); } -inline bool Solver::okay () const { return ok; } - -inline void Solver::toDimacs (const char* file){ vec as; toDimacs(file, as); } -inline void Solver::toDimacs (const char* file, Lit p){ vec as; as.push(p); toDimacs(file, as); } -inline void Solver::toDimacs (const char* file, Lit p, Lit q){ vec as; as.push(p); as.push(q); toDimacs(file, as); } -inline void Solver::toDimacs (const char* file, Lit p, Lit q, Lit r){ vec as; as.push(p); as.push(q); as.push(r); toDimacs(file, as); } - - -//================================================================================================= -// Debug etc: - - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/core/SolverTypes.h b/src/vendor/stp/src/sat/core/SolverTypes.h deleted file mode 100644 index 51d7a4e53..000000000 --- a/src/vendor/stp/src/sat/core/SolverTypes.h +++ /dev/null @@ -1,408 +0,0 @@ -/***********************************************************************************[SolverTypes.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_SolverTypes_h -#define Minisat_SolverTypes_h - -#include - -#include "../mtl/IntTypesMtl.h" -#include "../mtl/Alg.h" -#include "../mtl/Vec.h" -#include "../mtl/Map.h" -#include "../mtl/Alloc.h" - -namespace Minisat { - -//================================================================================================= -// Variables, literals, lifted booleans, clauses: - - -// NOTE! Variables are just integers. No abstraction here. They should be chosen from 0..N, -// so that they can be used as array indices. - -typedef int Var; -#define var_Undef (-1) - - -struct Lit { - int x; - - // Use this as a constructor: - friend Lit mkLit(Var var, bool sign); - - bool operator == (Lit p) const { return x == p.x; } - bool operator != (Lit p) const { return x != p.x; } - bool operator < (Lit p) const { return x < p.x; } // '<' makes p, ~p adjacent in the ordering. -}; - - -inline Lit mkLit (Var var, bool sign = false) - { Lit p; p.x = var + var + (int)sign; return p; } -inline Lit operator ~(Lit p) { Lit q; q.x = p.x ^ 1; return q; } -inline Lit operator ^(Lit p, bool b) { Lit q; q.x = p.x ^ (unsigned int)b; return q; } -inline bool sign (Lit p) { return p.x & 1; } -inline int var (Lit p) { return p.x >> 1; } - -// Mapping Literals to and from compact integers suitable for array indexing: -inline int toInt (Var v) { return v; } -inline int toInt (Lit p) { return p.x; } -inline Lit toLit (int i) { Lit p; p.x = i; return p; } - -//const Lit lit_Undef = mkLit(var_Undef, false); // }- Useful special constants. -//const Lit lit_Error = mkLit(var_Undef, true ); // } - -const Lit lit_Undef = { -2 }; // }- Useful special constants. -const Lit lit_Error = { -1 }; // } - - -//================================================================================================= -// Lifted booleans: -// -// NOTE: this implementation is optimized for the case when comparisons between values are mostly -// between one variable and one constant. Some care had to be taken to make sure that gcc -// does enough constant propagation to produce sensible code, and this appears to be somewhat -// fragile unfortunately. - -#define l_True (Minisat::lbool((uint8_t)0)) // gcc does not do constant propagation if these are real constants. -#define l_False (Minisat::lbool((uint8_t)1)) -#define l_Undef (Minisat::lbool((uint8_t)2)) - -class lbool { - uint8_t value; - -public: - explicit lbool(uint8_t v) : value(v) { } - - lbool() : value(0) { } - explicit lbool(bool x) : value(!x) { } - - bool operator == (lbool b) const { return ((b.value&2) & (value&2)) | (!(b.value&2)&(value == b.value)); } - bool operator != (lbool b) const { return !(*this == b); } - lbool operator ^ (bool b) const { return lbool((uint8_t)(value^(uint8_t)b)); } - - lbool operator && (lbool b) const { - uint8_t sel = (this->value << 1) | (b.value << 3); - uint8_t v = (0xF7F755F4 >> sel) & 3; - return lbool(v); } - - lbool operator || (lbool b) const { - uint8_t sel = (this->value << 1) | (b.value << 3); - uint8_t v = (0xFCFCF400 >> sel) & 3; - return lbool(v); } - - friend int toInt (lbool l); - friend lbool toLbool(int v); -}; -inline int toInt (lbool l) { return l.value; } -inline lbool toLbool(int v) { return lbool((uint8_t)v); } - -//================================================================================================= -// Clause -- a simple class for representing a clause: - -class Clause; -typedef RegionAllocator::Ref CRef; - -class Clause { - struct { - unsigned mark : 2; - unsigned learnt : 1; - unsigned has_extra : 1; - unsigned reloced : 1; - unsigned size : 27; } header; - union { Lit lit; float act; uint32_t abs; CRef rel; } data[0]; - - friend class ClauseAllocator; - - // NOTE: This constructor cannot be used directly (doesn't allocate enough memory). - template - Clause(const V& ps, bool use_extra, bool learnt) { - header.mark = 0; - header.learnt = learnt; - header.has_extra = use_extra; - header.reloced = 0; - header.size = ps.size(); - - for (int i = 0; i < ps.size(); i++) - data[i].lit = ps[i]; - - if (header.has_extra){ - if (header.learnt) - data[header.size].act = 0; - else - calcAbstraction(); } - } - -public: - void calcAbstraction() { - assert(header.has_extra); - uint32_t abstraction = 0; - for (int i = 0; i < size(); i++) - abstraction |= 1 << (var(data[i].lit) & 31); - data[header.size].abs = abstraction; } - - - int size () const { return header.size; } - void shrink (int i) { assert(i <= size()); if (header.has_extra) data[header.size-i] = data[header.size]; header.size -= i; } - void pop () { shrink(1); } - bool learnt () const { return header.learnt; } - bool has_extra () const { return header.has_extra; } - uint32_t mark () const { return header.mark; } - void mark (uint32_t m) { header.mark = m; } - const Lit& last () const { return data[header.size-1].lit; } - - bool reloced () const { return header.reloced; } - CRef relocation () const { return data[0].rel; } - void relocate (CRef c) { header.reloced = 1; data[0].rel = c; } - - // NOTE: somewhat unsafe to change the clause in-place! Must manually call 'calcAbstraction' afterwards for - // subsumption operations to behave correctly. - Lit& operator [] (int i) { return data[i].lit; } - Lit operator [] (int i) const { return data[i].lit; } - operator const Lit* (void) const { return (Lit*)data; } - - float& activity () { assert(header.has_extra); return data[header.size].act; } - uint32_t abstraction () const { assert(header.has_extra); return data[header.size].abs; } - - Lit subsumes (const Clause& other) const; - void strengthen (Lit p); -}; - - -//================================================================================================= -// ClauseAllocator -- a simple class for allocating memory for clauses: - - -const CRef CRef_Undef = RegionAllocator::Ref_Undef; -class ClauseAllocator : public RegionAllocator -{ - static int clauseWord32Size(int size, bool has_extra){ - return (sizeof(Clause) + (sizeof(Lit) * (size + (int)has_extra))) / sizeof(uint32_t); } - public: - bool extra_clause_field; - - ClauseAllocator(uint32_t start_cap) : RegionAllocator(start_cap), extra_clause_field(false){} - ClauseAllocator() : extra_clause_field(false){} - - void moveTo(ClauseAllocator& to){ - to.extra_clause_field = extra_clause_field; - RegionAllocator::moveTo(to); } - - template - CRef alloc(const Lits& ps, bool learnt = false) - { - assert(sizeof(Lit) == sizeof(uint32_t)); - assert(sizeof(float) == sizeof(uint32_t)); - bool use_extra = learnt | extra_clause_field; - - CRef cid = RegionAllocator::alloc(clauseWord32Size(ps.size(), use_extra)); - new (lea(cid)) Clause(ps, use_extra, learnt); - - return cid; - } - - // Deref, Load Effective Address (LEA), Inverse of LEA (AEL): - Clause& operator[](Ref r) { return (Clause&)RegionAllocator::operator[](r); } - const Clause& operator[](Ref r) const { return (Clause&)RegionAllocator::operator[](r); } - Clause* lea (Ref r) { return (Clause*)RegionAllocator::lea(r); } - const Clause* lea (Ref r) const { return (Clause*)RegionAllocator::lea(r); } - Ref ael (const Clause* t){ return RegionAllocator::ael((uint32_t*)t); } - - void free(CRef cid) - { - Clause& c = operator[](cid); - RegionAllocator::free(clauseWord32Size(c.size(), c.has_extra())); - } - - void reloc(CRef& cr, ClauseAllocator& to) - { - Clause& c = operator[](cr); - - if (c.reloced()) { cr = c.relocation(); return; } - - cr = to.alloc(c, c.learnt()); - c.relocate(cr); - - // Copy extra data-fields: - // (This could be cleaned-up. Generalize Clause-constructor to be applicable here instead?) - to[cr].mark(c.mark()); - if (to[cr].learnt()) to[cr].activity() = c.activity(); - else if (to[cr].has_extra()) to[cr].calcAbstraction(); - } -}; - - -//================================================================================================= -// OccLists -- a class for maintaining occurence lists with lazy deletion: - -template -class OccLists -{ - vec occs; - vec dirty; - vec dirties; - Deleted deleted; - - public: - OccLists(const Deleted& d) : deleted(d) {} - - void init (const Idx& idx){ occs.growTo(toInt(idx)+1); dirty.growTo(toInt(idx)+1, 0); } - // Vec& operator[](const Idx& idx){ return occs[toInt(idx)]; } - Vec& operator[](const Idx& idx){ return occs[toInt(idx)]; } - Vec& lookup (const Idx& idx){ if (dirty[toInt(idx)]) clean(idx); return occs[toInt(idx)]; } - - void cleanAll (); - void clean (const Idx& idx); - void smudge (const Idx& idx){ - if (dirty[toInt(idx)] == 0){ - dirty[toInt(idx)] = 1; - dirties.push(idx); - } - } - - void clear(bool free = true){ - occs .clear(free); - dirty .clear(free); - dirties.clear(free); - } -}; - - -template -void OccLists::cleanAll() -{ - for (int i = 0; i < dirties.size(); i++) - // Dirties may contain duplicates so check here if a variable is already cleaned: - if (dirty[toInt(dirties[i])]) - clean(dirties[i]); - dirties.clear(); -} - - -template -void OccLists::clean(const Idx& idx) -{ - Vec& vec = occs[toInt(idx)]; - int i, j; - for (i = j = 0; i < vec.size(); i++) - if (!deleted(vec[i])) - vec[j++] = vec[i]; - vec.shrink(i - j); - dirty[toInt(idx)] = 0; -} - - -//================================================================================================= -// CMap -- a class for mapping clauses to values: - - -template -class CMap -{ - struct CRefHash { - uint32_t operator()(CRef cr) const { return (uint32_t)cr; } }; - - typedef Map HashTable; - HashTable map; - - public: - // Size-operations: - void clear () { map.clear(); } - int size () const { return map.elems(); } - - - // Insert/Remove/Test mapping: - void insert (CRef cr, const T& t){ map.insert(cr, t); } - void growTo (CRef cr, const T& t){ map.insert(cr, t); } // NOTE: for compatibility - void remove (CRef cr) { map.remove(cr); } - bool has (CRef cr, T& t) { return map.peek(cr, t); } - - // Vector interface (the clause 'c' must already exist): - const T& operator [] (CRef cr) const { return map[cr]; } - T& operator [] (CRef cr) { return map[cr]; } - - // Iteration (not transparent at all at the moment): - int bucket_count() const { return map.bucket_count(); } - const vec& bucket(int i) const { return map.bucket(i); } - - // Move contents to other map: - void moveTo(CMap& other){ map.moveTo(other.map); } - - // TMP debug: - void debug(){ - printf(" --- size = %d, bucket_count = %d\n", size(), map.bucket_count()); } -}; - - -/*_________________________________________________________________________________________________ -| -| subsumes : (other : const Clause&) -> Lit -| -| Description: -| Checks if clause subsumes 'other', and at the same time, if it can be used to simplify 'other' -| by subsumption resolution. -| -| Result: -| lit_Error - No subsumption or simplification -| lit_Undef - Clause subsumes 'other' -| p - The literal p can be deleted from 'other' -|________________________________________________________________________________________________@*/ -inline Lit Clause::subsumes(const Clause& other) const -{ - //if (other.size() < size() || (extra.abst & ~other.extra.abst) != 0) - //if (other.size() < size() || (!learnt() && !other.learnt() && (extra.abst & ~other.extra.abst) != 0)) - assert(!header.learnt); assert(!other.header.learnt); - assert(header.has_extra); assert(other.header.has_extra); - if (other.header.size < header.size || (data[header.size].abs & ~other.data[other.header.size].abs) != 0) - return lit_Error; - - Lit ret = lit_Undef; - const Lit* c = (const Lit*)(*this); - const Lit* d = (const Lit*)other; - - for (unsigned i = 0; i < header.size; i++) { - // search for c[i] or ~c[i] - for (unsigned j = 0; j < other.header.size; j++) - if (c[i] == d[j]) - goto ok; - else if (ret == lit_Undef && c[i] == ~d[j]){ - ret = c[i]; - goto ok; - } - - // did not find it - return lit_Error; - ok:; - } - - return ret; -} - -inline void Clause::strengthen(Lit p) -{ - remove(*this, p); - calcAbstraction(); -} - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/core_prop/Makefile b/src/vendor/stp/src/sat/core_prop/Makefile deleted file mode 100644 index 2447c41b1..000000000 --- a/src/vendor/stp/src/sat/core_prop/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -EXEC = minisat -DEPDIR = mtl utils -MROOT=.. -LIB = core_prop - -include $(MROOT)/mtl/template.mk diff --git a/src/vendor/stp/src/sat/core_prop/Solver_prop.cc b/src/vendor/stp/src/sat/core_prop/Solver_prop.cc deleted file mode 100644 index 6a89472bf..000000000 --- a/src/vendor/stp/src/sat/core_prop/Solver_prop.cc +++ /dev/null @@ -1,1861 +0,0 @@ -/***************************************************************************************[Solver_prop.cc] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 is a modified version of minisat 2.2 that has a propagator for function congruence built into the - * normal propatate()/search() loop. - */ - - - -#include -#include - -#include "../mtl/Sort.h" -#include "../core_prop/Solver_prop.h" - -using namespace Minisat; - -//================================================================================================= -// Options: - - -static const char* _cat = "CORE"; - -static DoubleOption opt_var_decay (_cat, "var-decay", "The variable activity decay factor", 0.95, DoubleRange(0, false, 1, false)); -static DoubleOption opt_clause_decay (_cat, "cla-decay", "The clause activity decay factor", 0.999, DoubleRange(0, false, 1, false)); -static DoubleOption opt_random_var_freq (_cat, "rnd-freq", "The frequency with which the decision heuristic tries to choose a random variable", 0, DoubleRange(0, true, 1, true)); -static DoubleOption opt_random_seed (_cat, "rnd-seed", "Used by the random variable selection", 91648253, DoubleRange(0, false, HUGE_VAL, false)); -static IntOption opt_ccmin_mode (_cat, "ccmin-mode", "Controls conflict clause minimization (0=none, 1=basic, 2=deep)", 2, IntRange(0, 2)); -static IntOption opt_phase_saving (_cat, "phase-saving", "Controls the level of phase saving (0=none, 1=limited, 2=full)", 2, IntRange(0, 2)); -static BoolOption opt_rnd_init_act (_cat, "rnd-init", "Randomize the initial activity", false); -static BoolOption opt_luby_restart (_cat, "luby", "Use the Luby restart sequence", true); -static IntOption opt_restart_first (_cat, "rfirst", "The base restart interval", 100, IntRange(1, INT32_MAX)); -static DoubleOption opt_restart_inc (_cat, "rinc", "Restart interval increase factor", 2, DoubleRange(1, false, HUGE_VAL, false)); -static DoubleOption opt_garbage_frac (_cat, "gc-frac", "The fraction of wasted memory allowed before a garbage collection is triggered", 0.20, DoubleRange(0, false, HUGE_VAL, false)); - - -//================================================================================================= -// Constructor/Destructor: - -Solver_prop::Solver_prop(volatile bool& timeout) : - - // Parameters (user settable): - // - aa_id(0) - , last_id(-1) - , number_of_arrays(0) - , array_trail(0) - , watched_indexes(0) - , top_level_var(0) - , alternate_trail_sorted_to(0) - , val_to_aa(NULL) - , verbosity (0) - , var_decay (opt_var_decay) - , clause_decay (opt_clause_decay) - , random_var_freq (opt_random_var_freq) - , random_seed (opt_random_seed) - , luby_restart (opt_luby_restart) - , ccmin_mode (opt_ccmin_mode) - , phase_saving (opt_phase_saving) - , rnd_pol (false) - , rnd_init_act (opt_rnd_init_act) - , garbage_frac (opt_garbage_frac) - , restart_first (opt_restart_first) - , restart_inc (opt_restart_inc) - - // Parameters (the rest): - // - , learntsize_factor((double)1/(double)3), learntsize_inc(1.1) - - // Parameters (experimental): - // - , learntsize_adjust_start_confl (100) - , learntsize_adjust_inc (1.5) - - // Statistics: (formerly in 'SolverStats') - // - , solves(0), starts(0), decisions(0), rnd_decisions(0), propagations(0), conflicts(0) - , dec_vars(0), clauses_literals(0), learnts_literals(0), max_literals(0), tot_literals(0) - - , ok (true) - , cla_inc (1) - , var_inc (1) - , watches (WatcherDeleted(ca)) - , qhead (0) - , simpDB_assigns (-1) - , simpDB_props (0) - , order_heap (VarOrderLt(activity)) - , progress_estimate (0) - , remove_satisfied (true) - - // Resource constraints: - // - , conflict_budget (-1) - , propagation_budget (-1) - , asynch_interrupt (timeout) -{} - - -Solver_prop::~Solver_prop() -{ - delete[] val_to_aa; - for (int i=0; i < (int)arrayData.size(); i++) - { - delete arrayData[i]; - } -} -//================================================================================================= -// Methods for the array propagator: - -const bool debug_print = false; - -bool -sortByLevel(const Minisat::Solver_prop::Assignment& a, - const Minisat::Solver_prop::Assignment& b) -{ - return a.decisionLevel < b.decisionLevel; -} - - -// Literals that are l_Undef come first, then the rest are sorted by decreasing decision level. -void -Solver_prop::sortVecByLevel(vec & c) -{ - LessThan_Level l(this); - sort(c, l); -} - -// Inplace sort of the alternate trail. -void -Solver_prop::sortAlternateTrail() -{ - int length = alternate_trail.size(); - assert(alternate_trail_sorted_to <= length); - - if (alternate_trail_sorted_to == length) - return; - - std::sort(alternate_trail.begin()+alternate_trail_sorted_to, alternate_trail.end(), sortByLevel); - std::inplace_merge(alternate_trail.begin(), alternate_trail.begin()+alternate_trail_sorted_to, alternate_trail.end(), sortByLevel); - - alternate_trail_sorted_to = length; -} - - -// array_id must grow monotonically. -// returns false if it's already a conflict. -bool -Solver_prop::addArray(int array_id, const vec& i, const vec& v, const vec& ki, const vec& kv) -{ - assert((i.size() > 0) ^ (ki.size() > 0)); - assert((v.size() > 0) ^ (kv.size() > 0)); - - if (!ok) return false; - - if (i.size() > INDEX_BIT_WIDTH || ki.size() > INDEX_BIT_WIDTH) - { - printf("The array propagators unfortunately don't do arbitrary precision integers yet. " - "With the INDICES_128BITS compile time flag STP does 128-bits on 64-bit machines compiled with GCC. " - "Currently STP is compiled to use %d bit indices. " - "Unfortunately your problem has array indexes of size %d bits. " - "STP does arbitrary precision indices with the '--oldstyle-refinement' or the '-r' flags.\n", - INDEX_BIT_WIDTH, std::max(i.size(), ki.size())); - exit(1); - } - - - bool startOfNewArray = false; - if (array_id != last_id) - { - assert(array_id > last_id); - number_of_arrays++; - - // Map doesn't have a copy constructor, so we create one on the heap. - // Some constant indexes will already have been copied into the val_to_aa map. - Map >* t = new Map > [number_of_arrays]; - - for (int j=0; j < number_of_arrays-1 ; j++) - val_to_aa[j].moveTo(t[j]); - - delete[] val_to_aa; - val_to_aa = t; - last_id = array_id; - startOfNewArray = true; - } - - assert(number_of_arrays > 0); - - ArrayAccess * iv = new ArrayAccess(aa_id++,i,v,ki,kv, number_of_arrays-1); - assert (!iv->known_index); // Not already added. - - if (!startOfNewArray) - { - assert(arrayData.last()->indexSize() == iv->indexSize()); - assert(arrayData.last()->valueSize() == iv->valueSize()); - } - arrayData.push(iv); - - // Adds it into the map if the index is known. - if (iv->isIndexConstant()) - { - CRef r = writeOutArrayAxiom(*iv); - if (r != CRef_Undef) - { - ok = false; - return ok; - } - assert (iv->known_index); // No added. - } - else - { - int & ii = iv->index_index ; - for (ii=0; ii < iv->indexSize(); ii++) - { - if (value(iv->index[ii]) == l_Undef) - { - break; - } - } - if (ii < iv->indexSize()) - startWatchOfIndexVariable(iv); - else - { - // The index has been determined by unit propagation already. - // We can't add it to the watchlist yet though, because when - // we add it. It creates new variables. These variables might - // conflict with clauses that have yet to be added. So we - // need to save this and add it during solve(). - iv->index_index = 0; - toAddAtStartup.push(iv); - } - assert (!iv->known_index); // No added. - } - return true; -} - -// Assumes the index of the access has at least one unset variable. -void Solver_prop::startWatchOfIndexVariable(ArrayAccess* iv) -{ - assert(!iv->isIndexConstant()); - assert(!iv->known_index); - assert(!IndexIsSet(*iv)); - const int indexSize = iv->indexSize(); - - if (value(iv->index[iv->index_index]) != l_Undef) - { - // Loop around checking for the next unset index. - - int j; - for (j = iv->index_index+1; j < indexSize; j++) - if (value(iv->index[j]) == l_Undef) - break; - - if (j == indexSize) - for (j = 0; j < indexSize; j++) - if (value(iv->index[j]) == l_Undef) - break; - - assert(j < indexSize); - iv->index_index = j; - } - - Var v = var(iv->index[iv->index_index]); - assert (value(iv->index[iv->index_index]) == l_Undef); - - array_of_interest[v] = 1; - if (!watchedLiterals.has(v)) - watchedLiterals.insert(v, std::vector()); - - watchedLiterals[v].push_back(iv); - watched_indexes++; -} - - -// Reads out the array index as an integer. It is completely specified. -index_type -Solver_prop::index_as_int(const ArrayAccess& iv) -{ - if (iv.isIndexConstant()) - return iv.constantIndex(); - - index_type t = 0; - assert(INDEX_BIT_WIDTH >= iv.indexSize()); - - for (int i = 0; i < iv.indexSize(); i++) - { - lbool v = accessIndex(iv, i); - assert(v == l_True || v == l_False); - if (v == l_True) - t += (1 << i); - } - - return t; -} - -// What is the value of iv->index[i]? -lbool -Solver_prop::accessIndex(const ArrayAccess& iv, int i) -{ - assert(i < iv.indexSize()); - assert(i >=0); - if (iv.isIndexConstant()) - return iv.constant_index[i]; - return value(iv.index[i]); -} - -lbool -Solver_prop::accessValue(const ArrayAccess& iv, int i) -{ - assert(i < iv.valueSize()); - assert(i >=0); - if (iv.isValueConstant()) - return iv.constant_value[i]; - return value(iv.value[i]); -} - - -void Solver_prop::assertIndexesEqual(ArrayAccess &a, ArrayAccess &b) -{ - assert(a.indexSize() == b.indexSize()); - assert(a.array_id == b.array_id); - for (int i=0; i < a.indexSize();i++) - { - assert(accessIndex(a,i) == accessIndex(b,i)); - } -} - -const bool debug_equals_lit=false; - -CRef -Solver_prop::addExtraClause(vec& c) -{ - sortVecByLevel(c); - CRef f = ca.alloc(c, false); - clauses.push(f); - attachClause(f); - - return f; -} - - -// Given two array accesses, builds up an equals formula for use on the lhs of an array axiom instance. -CRef Solver_prop::getEqualsLit( ArrayAccess &a, ArrayAccess &b, Lit & result, bool& alreadyCreated) -{ - assert(&a != &b); - assert(a.id != b.id); // Can't compare the same accesses. - assert(a.array_id == b.array_id); - assertIndexesEqual(a, b); - assert(IndexIsSet(a)); - - const int indexSize = a.indexSize(); - - alreadyCreated = false; - - { - ArrayAccess& lookup = (a.id < b.id) ? a : b; - ArrayAccess& other = (a.id < b.id) ? b : a; - EqualityVariables evss(lookup.id, other.id); - - // Lookup the already created equality variables. Maybe we've created it already. - if (equality_variables.peek(evss,result)) - { - alreadyCreated = true; - assert(value(result) == l_True); - return CRef_Undef; - } - - // Create the result variable. Store so we can reuse later. - result = mkLit(newVar(false,true),false); - equality_variables.insert(evss, result); - } - - if (a.isIndexConstant() && b.isIndexConstant()) - { - // We know already they are equal. - assert(decisionLevel() == 0); - uncheckedEnqueue(result); - return propagate(); - } - - vec clause; - clause.capacity(indexSize+1); - clause.push(result); - - if (a.isIndexConstant() || b.isIndexConstant()) - { - ArrayAccess & constantIndex = a.isIndexConstant()? a:b; - ArrayAccess & other = a.isIndexConstant()? b:a; - - // Because one of the indexes is completely known (at decision level 0), - // we include the other one in the clause. - for (int i = 0; i < indexSize; i++) - { - if (accessIndex(constantIndex,i) == l_True) - clause.push(~other.index[i]); - else - clause.push(other.index[i]); - } - } - else - { - assert (!a.isIndexConstant()); - assert (!b.isIndexConstant()); - - for (int i=0; i < indexSize;i++) - clause.push(mkLit(newVar(false,true),true)); - - // Add clauses for 1,1 => true, and 0,0 => true. - for (int i = 0; i < indexSize; i++) - { - assert (accessIndex(a,i) == accessIndex(b,i)); - assert (accessIndex(a,i) != l_Undef); - - // One of these two is used to set the intermediate value. - eqLitHelper(~a.index[i], ~b.index[i], ~clause[i+1]); - eqLitHelper(a.index[i], b.index[i], ~clause[i+1]); - } - } - assert((int)clause.size() == (indexSize+1)); - - #ifndef NDEBUG - int lvl =0; - for (int i=1; i <= indexSize;i++) - { - lvl = std::max(lvl,level(var(clause[i]))); - // All the immediates should now be true. - // But we store the "Not" of them into the clause.. - assert(value(clause[i]) == l_False); - } - assert(lvl == decisionLevel()); - #endif - - CRef from = addExtraClause(clause); - uncheckedEnqueue(result, from); - assert(value(result) == l_True); - - return propagate(); -} - -void -Solver_prop::eqLitHelper(const Lit& l0, const Lit& l1, const Lit& intermed) -{ - vec c; - c.push(intermed); - c.push(l0); - c.push(l1); - CRef f = addExtraClause(c); - - // It's only when l0 and l1 are false that anything more happens. - if (value(l0) == l_False) - { - assert(value(l1) == l_False); - assert(value(intermed) == l_Undef); - - int lvl = std::max(level(var(l0)),level(var(l1))); - assert (lvl <= decisionLevel()); - - assigns[var(intermed)] = l_True; - vardata[var(intermed)] = mkVarData(f, lvl); - - assert((ca[f][0])==intermed); - - for (int i=1; i < c.size();i++) - { - assert (value(ca[f][i]) == l_False); - assert ((level(var(ca[f][i]))) <= lvl); - } - - alternate_trail.push_back(Assignment(intermed, lvl)); - assert(level(var(intermed)) == lvl); - assert(watches[intermed].size() ==0); - } - return ; -} - -// Index is completely known. -bool Solver_prop::IndexIsSet(const ArrayAccess& iv) -{ - if (iv.isIndexConstant()) - return true; - - for (int i=0; i < iv.indexSize();i++) - { - if (value(iv.index[i]) == l_Undef) - return false; - } - return true; -} - -void -Solver_prop::printClauses() -{ - for (int i = 0; i < clauses.size(); i++) - { - const Clause &c = ca[clauses[i]]; - for (int j = 0; j < c.size(); j++) - { - printf("%c%d[%c:%d] ", sign(c[j]) ? '-' : ' ', var(c[j]), printValue(value(c[j])), level(var(c[j]))); - } - printf("\n"); - } -} - -// Assuming the index is known. Add the clauses to enforce that -// it's the same as the zeroeth array access with the same index. -CRef -Solver_prop::writeOutArrayAxiom(ArrayAccess& iv) -{ - assert(IndexIsSet(iv)); - - const index_type asInt = index_as_int(iv); - - if (!val_to_aa[iv.array_id].has(asInt)) - val_to_aa[iv.array_id].insert(asInt, std::vector()); - - std::vector& aa = val_to_aa[iv.array_id][asInt]; - - bool alreadyAdded = false; // Already in the bucket with the other values with the same index?? - - for (int j = 0; j < (int) aa.size(); j++) - if (&iv == aa[j]) - { - assert(!alreadyAdded); // only once. - assert(index_as_int(iv) == asInt); - alreadyAdded = true; - } - - if (!alreadyAdded) - { - assert(!iv.known_index); - - aa.push_back(&iv); - - if (arrayHistory_stack.size() > 0) - { - assert(arrayHistory_stack.last().decisionLevel <= decisionLevel()); - } - - - // So it can be removed when we cancel. - ArrayHistory h(&iv, decisionLevel()); - arrayHistory_stack.push(h); - - iv.known_index = true; - } - - if (aa.size() == 1) - return CRef_Undef; - - bool alreadyCreated = false; // Are the clauses constraining them in there. - - ArrayAccess& aa_0 = *aa[0]; - ArrayAccess& aa_back = *aa.back(); - - Lit eq; - CRef conflict = getEqualsLit(aa_0, aa_back, eq, alreadyCreated); - - if (alreadyCreated) - return CRef_Undef; // All the clauses have been created already for these guys. - - assert(value(eq) == l_True); - // Add the rhs of the equality. - - vec c; - - for (int i = 0; i < iv.valueSize(); i++) - { - c.clear(); - c.push(~eq); - - lbool a0_v = accessValue(aa_0,i); - lbool aback_v = accessValue(aa_back,i); - - CRef f; - - if (aa_0.isValueConstant() && aa_back.isValueConstant()) - { - if (a0_v != aback_v) - { - return ca.alloc(c); - } - else - continue; - } - else if (aa_0.isValueConstant()) - { - assert (a0_v != l_Undef); - - if (a0_v == l_True) - c.push(aa_back.value[i]); - else - c.push(~aa_back.value[i]); - } - else if (aa_back.isValueConstant()) - { - assert (aback_v != l_Undef); - - if (aback_v == l_True) - c.push(aa_0.value[i]); - else - c.push(~aa_0.value[i]); - } - else - { - c.push(aa_0.value[i]); - c.push(~(aa_back.value[i])); - - f = addExtraClause(c); - - assert(ca[f].size() ==3); - if ((value(ca[f][1]) == l_False) && (value(ca[f][2]) == l_False)) - { - const lbool first= value(ca[f][0]); - if (first == l_Undef) - uncheckedEnqueue(ca[f][0], f); - else if (first == l_False) - conflict = f; - } - - c.clear(); - c.push(~eq); - c.push(~aa_0.value[i]); - c.push(aa_back.value[i]); - } - - f = addExtraClause(c); - const Clause& newC = ca[f]; - - bool restFalse = true; - for (int j=1; j< newC.size();j++) - { - if (value(newC[j]) != l_False) - { - restFalse = false; - break; - } - } - - bool conflicted=false; - if (restFalse) - { - if (value(newC[0]) == l_Undef) - uncheckedEnqueue(newC[0],f); - else if (value(newC[0]) == l_False) - conflicted=true; - } - - - // We save up the conflicts because we want all of the clauses to be added. - if (conflicted) - { - int maxLevel=0; - if (!aa_0.isValueConstant()) - maxLevel = level(var(aa_0.value[i])); - - if (!aa_back.isValueConstant()) - maxLevel = std::max(level(var(aa_back.value[i])),maxLevel); - - if (maxLevel ==0) - { - c.clear(); - c.push(~eq); - return ca.alloc(c); - } - - conflict = f; - } - } - - - CRef rr = propagate(); - if (rr!=CRef_Undef) - conflict = rr; - - return conflict; -} - -// Look through each of the variables that have been set and see if they watch variables on array indexes. -CRef Solver_prop::arrayPropagate() -{ - if (watched_indexes ==0) - { - // either there are no arrays, or, - array_trail = trail.size(); - return CRef_Undef; - } - - for (; array_trail < trail.size(); array_trail++) - { - // check whether we are interested in any of the literals in the trail. - Var trail_variable = var(trail[array_trail]); - if (array_of_interest[trail_variable]) - { - Var variable = var(trail[array_trail]); - assert(watchedLiterals.has(variable)); - - // Initially I had this v as a reference. However, this instance is contained in a map, that can be rehashed and hence the vector moved around - // in memory (causing the reference to point to memory that no longer contains the vector. - std::vector v = watchedLiterals[variable]; // Take a copy. - assert(v.size() >0); - int initial_vector_size = (int)v.size(); // because more can be added in by the startWatchOfIndexVariable function. - - for (int i=0; i < (int)initial_vector_size;i++) - { - watched_indexes--; - ArrayAccess& iv = *(v[i]); - - assert(!iv.known_index); // Not already added. - assert(!iv.isIndexConstant()); // Completely known. So it should be in the map already. - assert(iv.indexSize() > 0); - - assert(var(iv.index[iv.index_index]) == trail_variable); - assert(value(iv.index[iv.index_index]) != l_Undef); - - // Checks each of the indexes around the loop!!. - int end = ((iv.index_index == 0)? iv.indexSize()-1 : iv.index_index-1); - bool first = true; // so 1-bit indexes are checked. - for (; (iv.index_index != end) || first ; iv.index_index = ((iv.index_index+1) % iv.indexSize())) - { - assert(iv.index_index < iv.indexSize()); - - lbool val = value(iv.index[iv.index_index]); - if (val == l_Undef) - break; - first = false; - } - assert(iv.index_index < iv.indexSize()); - - if (iv.index_index == end && l_Undef != value(iv.index[iv.index_index])) - { - //All of the bits are set to either true or false. - for (int w=0; w< iv.indexSize();w++) - { - assert(value(iv.index[w]) != l_Undef); - } - - CRef r = writeOutArrayAxiom(iv); - if (r != CRef_Undef) - { - std::vector& vec = watchedLiterals[variable]; - assert(vec.size() >= v.size()); - vec.erase(vec.begin(), vec.begin()+i+1); - - if(vec.size() ==0) - { - watchedLiterals.remove(variable); - array_of_interest[variable] = 0; - } - return r; - } - - assert(iv.known_index); - } - else - { - assert (value(iv.index[iv.index_index]) == l_Undef); - startWatchOfIndexVariable(&iv); - assert (!iv.known_index); // Not already added. - } - } - - std::vector& vec = watchedLiterals[variable]; // Reference. - assert(vec.size() >= v.size()); - - if((int)vec.size() == initial_vector_size) - { - // - watchedLiterals.remove(variable); - array_of_interest[variable] = 0; - } - else - { - vec.erase(vec.begin(),vec.begin() + initial_vector_size); - } - } - } - return CRef_Undef; - } - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////// - - -//================================================================================================= -// Minor methods: - - -// Creates a new SAT variable in the solver. If 'decision' is cleared, variable will not be -// used as a decision variable (NOTE! This has effects on the meaning of a SATISFIABLE result). -// -Var Solver_prop::newVar(bool sign, bool dvar) -{ - int v = nVars(); - watches .init(mkLit(v, false)); - watches .init(mkLit(v, true )); - assigns .push(l_Undef); - vardata .push(mkVarData(CRef_Undef, 0)); - //activity .push(0); - activity .push(rnd_init_act ? drand(random_seed) * 0.00001 : 0); - seen .push(0); - array_of_interest.push(0); - polarity .push(sign); - decision .push(); - trail .capacity(v+1); - setDecisionVar(v, dvar); - return v; -} - - -bool Solver_prop::addClause_(vec& ps) -{ - assert(decisionLevel() == 0); - if (!ok) return false; - - // Check if clause is satisfied and remove false/duplicate literals: - sort(ps); - Lit p; int i, j; - for (i = j = 0, p = lit_Undef; i < ps.size(); i++) - if (value(ps[i]) == l_True || ps[i] == ~p) - return true; - else if (value(ps[i]) != l_False && ps[i] != p) - ps[j++] = p = ps[i]; - ps.shrink(i - j); - - if (ps.size() == 0) - return ok = false; - else if (ps.size() == 1){ - uncheckedEnqueue(ps[0]); - return ok = (propagate() == CRef_Undef); - }else{ - CRef cr = ca.alloc(ps, false); - clauses.push(cr); - attachClause(cr); - } - - return true; -} - - -void Solver_prop::attachClause(CRef cr) { - const Clause& c = ca[cr]; - assert(c.size() > 1); - watches[~c[0]].push(Watcher(cr, c[1])); - watches[~c[1]].push(Watcher(cr, c[0])); - if (c.learnt()) learnts_literals += c.size(); - else clauses_literals += c.size(); } - - -void Solver_prop::detachClause(CRef cr, bool strict) { - const Clause& c = ca[cr]; - assert(c.size() > 1); - - if (strict){ - remove(watches[~c[0]], Watcher(cr, c[1])); - remove(watches[~c[1]], Watcher(cr, c[0])); - }else{ - // Lazy detaching: (NOTE! Must clean all watcher lists before garbage collecting this clause) - watches.smudge(~c[0]); - watches.smudge(~c[1]); - } - - if (c.learnt()) learnts_literals -= c.size(); - else clauses_literals -= c.size(); } - - -void Solver_prop::removeClause(CRef cr) { - Clause& c = ca[cr]; - detachClause(cr); - // Don't leave pointers to free'd memory! - if (locked(c)) vardata[var(c[0])].reason = CRef_Undef; - c.mark(1); - ca.free(cr); -} - - -bool Solver_prop::satisfied(const Clause& c) const { - for (int i = 0; i < c.size(); i++) - if (value(c[i]) == l_True) - return true; - return false; } - - -// Revert to the state at given level (keeping all assignment at 'level' but not beyond). -// -void Solver_prop::cancelUntil(int level) { - if (decisionLevel() > level){ - - struct to_re_add - { - index_type index_value; - int array_id; - }; - - vec toRep; - vec aaRep; - - vec toReAdd; - - // look through the map, and remove it. - while ((arrayHistory_stack.size() > 0) && (arrayHistory_stack.last().decisionLevel > level)) - { - ArrayAccess& aa = *(arrayHistory_stack.last().aa); - assert(aa.known_index); - assert(!aa.isIndexConstant()); // Shouldn't remove known indexes. - assert(IndexIsSet(aa)); // The index shouldn't be unset yet. - - // Get the integer. - index_type asInt = index_as_int(aa); - assert(val_to_aa[aa.array_id].has(asInt)); - - std::vector& aaV = val_to_aa[aa.array_id][asInt]; - - // We'll remove the zeroeth array access, so need to re-add all of the array axioms. - if (aaV[0] == &aa) - { - toRep.push(asInt); - aaRep.push(&aa); - } - - bool found = false; - for (int i = 0; i < (int) aaV.size(); i++) - if (aaV[i] == &aa) - { - //Find the same pointer and erase it. - aaV.erase(aaV.begin() + i); - found = true; - break; - } - assert(found); - - if (aaV.size() == 0) - val_to_aa[aa.array_id].remove(asInt); - - aa.known_index = false; - toReAdd.push(&aa); - arrayHistory_stack.shrink(1); - } - - // The zeroeth of these numbers has been deleted, so we might need to redo the implications. - for (int i=0; i < toRep.size(); i++) - { - index_type asInt = toRep[i]; - ArrayAccess& aa = *aaRep[i]; - - if (val_to_aa[aa.array_id].has(asInt)) - { - - std::vector& aaV = val_to_aa[aa.array_id][asInt]; - for (int j=1;j<(int)aaV.size();j++) - { - assert(aa.known_index); - writeOutArrayAxiom(*aaV[j]); - } - } - } - - sortAlternateTrail(); - while (alternate_trail.size() > 0 && (alternate_trail.back().decisionLevel > level)) - { - Var x = var( alternate_trail.back().l); - assigns [x] = l_Undef; - alternate_trail.erase(alternate_trail.end()-1); - } - alternate_trail_sorted_to = alternate_trail.size(); - - for (int c = trail.size()-1; c >= trail_lim[level]; c--){ - Var x = var(trail[c]); - assigns [x] = l_Undef; - if (phase_saving > 1 || (phase_saving == 1) && c > trail_lim.last()) - polarity[x] = sign(trail[c]); - insertVarOrder(x); } - qhead = trail_lim[level]; - trail.shrink(trail.size() - trail_lim[level]); - trail_lim.shrink(trail_lim.size() - level); - - for (int i=0; i < toReAdd.size(); i++) - { - ArrayAccess* aa = toReAdd[i]; - startWatchOfIndexVariable(aa); - } - - array_trail = std::min(trail.size(), array_trail); - } -} - - -//================================================================================================= -// Major methods: - - -Lit Solver_prop::pickBranchLit() -{ - Var next = var_Undef; - - // Random decision: - if (drand(random_seed) < random_var_freq && !order_heap.empty()){ - next = order_heap[irand(random_seed,order_heap.size())]; - if (value(next) == l_Undef && decision[next]) - rnd_decisions++; } - - // Activity based decision: - while (next == var_Undef || value(next) != l_Undef || !decision[next]) - if (order_heap.empty()){ - next = var_Undef; - break; - }else - next = order_heap.removeMin(); - - return next == var_Undef ? lit_Undef : mkLit(next, rnd_pol ? drand(random_seed) < 0.5 : polarity[next]); -} - - -/*_________________________________________________________________________________________________ -| -| analyze : (confl : Clause*) (out_learnt : vec&) (out_btlevel : int&) -> [void] -| -| Description: -| Analyze conflict and produce a reason clause. -| -| Pre-conditions: -| * 'out_learnt' is assumed to be cleared. -| * Current decision level must be greater than root level. -| -| Post-conditions: -| * 'out_learnt[0]' is the asserting literal at level 'out_btlevel'. -| * If out_learnt.size() > 1 then 'out_learnt[1]' has the greatest decision level of the -| rest of literals. There may be others from the same level though. -| -|________________________________________________________________________________________________@*/ -void Solver_prop::analyze(CRef confl, vec& out_learnt, int& out_btlevel) -{ - int pathC = 0; - Lit p = lit_Undef; - - - // Generate conflict clause: - // - out_learnt.push(); // (leave room for the asserting literal) - int index = trail.size() - 1; - - // If this is false, then we don't need to check the alternate_trail. - bool bigFound =false; - -#ifndef NDEBUG - // The conflict needs to be discovered before additional decisions are made. - int max_level2 =0; - Clause& c1 = ca[confl]; - for (int j=0; j < c1.size();j++) - { - if (max_level2 < level(var(c1[j]))) - max_level2 = level(var(c1[j])); - } - - assert (max_level2 == decisionLevel()); -#endif - - if (debug_print) - { - printf("!!starting %d\n", decisionLevel()); - printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - } - do{ - assert(confl != CRef_Undef); // (otherwise should be UIP) - Clause& c = ca[confl]; - - if (c.learnt()) - claBumpActivity(c); - - for (int j = (p == lit_Undef) ? 0 : 1; j < c.size(); j++){ - Lit q = c[j]; - - if (!seen[var(q)] && level(var(q)) > 0){ - varBumpActivity(var(q)); - seen[var(q)] = 1; - - if (toInt(var(q)) >= top_level_var) - bigFound=true; - - if (level(var(q)) >= decisionLevel()) - pathC++; - else - out_learnt.push(q); - } - } - - p = lit_Undef; - - // This looks for the literal in either of the watchlists with the highest level. It's slow because - // in the worst case it will iterate completely through both lists. strcmp32.c.smt is much slower - // because of this implementation.. However most of the time alternate_trail is small because it - // only grown when a new intermediate variable is added. That variable is only added once, and - // is removed when the level it was set at is Cancelled below. - if (bigFound && alternate_trail.size() > 0) - { - sortAlternateTrail(); - - int unset_index = alternate_trail.size() - 1; - while (unset_index >= 0 && !seen[(var(alternate_trail[unset_index].l))]) - unset_index--; - - if (unset_index >= 0) - p = alternate_trail[unset_index].l; - if (debug_print && p != lit_Undef) - printf("Found unsat var: %d\n", var(p)); - - } - - - if (p == lit_Undef) - { - while (!seen[var(trail[index--])]); - p = trail[index+1]; - - if (debug_print && p != lit_Undef) - printf("(1) Found trail var: %d\n", var(p)); - - } - else - { - int t_index = index; - while (t_index>= 0 && !seen[var(trail[t_index--])]); - if (t_index >= 0) - { - if (debug_print) - printf("::%d %d\n", level(var(p)) , level(var(trail[t_index+1]))); - - if (level(var(p)) < level(var(trail[t_index+1]))) - { - p = trail[t_index+1]; - index = t_index; - } - } - if (debug_print && p != lit_Undef) - printf("(2) Found trail var: %d\n", var(p)); - - } - - - confl = reason(var(p)); - seen[var(p)] = 0; - if (debug_print) - printf("Var %d, pathC %d, level %d, isUndef %d\n",toInt(var(p)),pathC, level(var(p)), (reason(var(p)) == CRef_Undef)); - pathC--; - - if (pathC >0) - { - assert(confl != CRef_Undef); // (otherwise should be UIP) - - if (debug_print) - printf("%d %d\n", toInt(p), toInt(var(p))); - Minisat::Clause cl= ca[confl]; - - assert(ca[confl][0] ==p); - assert(value(p) != l_Undef); - } - - if (debug_print) - { - printf("Learnt Clauses:\n"); - printClause(out_learnt); - } - }while (pathC > 0); - out_learnt[0] = ~p; - - // Simplify conflict clause: - // - int i, j; - out_learnt.copyTo(analyze_toclear); - if (ccmin_mode == 2){ - uint32_t abstract_level = 0; - for (i = 1; i < out_learnt.size(); i++) - abstract_level |= abstractLevel(var(out_learnt[i])); // (maintain an abstraction of levels involved in conflict) - - for (i = j = 1; i < out_learnt.size(); i++) - if (reason(var(out_learnt[i])) == CRef_Undef || !litRedundant(out_learnt[i], abstract_level)) - out_learnt[j++] = out_learnt[i]; - - }else if (ccmin_mode == 1){ - for (i = j = 1; i < out_learnt.size(); i++){ - Var x = var(out_learnt[i]); - - if (reason(x) == CRef_Undef) - out_learnt[j++] = out_learnt[i]; - else{ - Clause& c = ca[reason(var(out_learnt[i]))]; - for (int k = 1; k < c.size(); k++) - if (!seen[var(c[k])] && level(var(c[k])) > 0){ - out_learnt[j++] = out_learnt[i]; - break; } - } - } - }else - i = j = out_learnt.size(); - - max_literals += out_learnt.size(); - out_learnt.shrink(i - j); - tot_literals += out_learnt.size(); - - // Find correct backtrack level: - // - if (out_learnt.size() == 1) - out_btlevel = 0; - else{ - int max_i = 1; - // Find the first literal assigned at the next-highest level: - for (int i = 2; i < out_learnt.size(); i++) - if (level(var(out_learnt[i])) > level(var(out_learnt[max_i]))) - max_i = i; - // Swap-in this literal at index 1: - Lit p = out_learnt[max_i]; - out_learnt[max_i] = out_learnt[1]; - out_learnt[1] = p; - out_btlevel = level(var(p)); - } - - for (int j = 0; j < analyze_toclear.size(); j++) seen[var(analyze_toclear[j])] = 0; // ('seen[]' is now cleared) -} - - -// Check if 'p' can be removed. 'abstract_levels' is used to abort early if the algorithm is -// visiting literals at levels that cannot be removed later. -bool Solver_prop::litRedundant(Lit p, uint32_t abstract_levels) -{ - analyze_stack.clear(); analyze_stack.push(p); - int top = analyze_toclear.size(); - while (analyze_stack.size() > 0){ - assert(reason(var(analyze_stack.last())) != CRef_Undef); - Clause& c = ca[reason(var(analyze_stack.last()))]; analyze_stack.pop(); - - for (int i = 1; i < c.size(); i++){ - Lit p = c[i]; - if (!seen[var(p)] && level(var(p)) > 0){ - if (reason(var(p)) != CRef_Undef && (abstractLevel(var(p)) & abstract_levels) != 0){ - seen[var(p)] = 1; - analyze_stack.push(p); - analyze_toclear.push(p); - }else{ - for (int j = top; j < analyze_toclear.size(); j++) - seen[var(analyze_toclear[j])] = 0; - analyze_toclear.shrink(analyze_toclear.size() - top); - return false; - } - } - } - } - - return true; -} - - -/*_________________________________________________________________________________________________ -| -| analyzeFinal : (p : Lit) -> [void] -| -| Description: -| Specialized analysis procedure to express the final conflict in terms of assumptions. -| Calculates the (possibly empty) set of assumptions that led to the assignment of 'p', and -| stores the result in 'out_conflict'. -|________________________________________________________________________________________________@*/ -void Solver_prop::analyzeFinal(Lit p, vec& out_conflict) -{ - out_conflict.clear(); - out_conflict.push(p); - - if (decisionLevel() == 0) - return; - - seen[var(p)] = 1; - - for (int i = trail.size()-1; i >= trail_lim[0]; i--){ - Var x = var(trail[i]); - if (seen[x]){ - if (reason(x) == CRef_Undef){ - assert(level(x) > 0); - out_conflict.push(~trail[i]); - }else{ - Clause& c = ca[reason(x)]; - for (int j = 1; j < c.size(); j++) - if (level(var(c[j])) > 0) - seen[var(c[j])] = 1; - } - seen[x] = 0; - } - } - - seen[var(p)] = 0; -} - - -void Solver_prop::uncheckedEnqueue(Lit p, CRef from) -{ - assert(value(p) == l_Undef); // Shouldn't be set already. - if (from != CRef_Undef) - { - assert((ca[from][0])==(p)); - - const Clause& c = ca[from]; - for (int i=1; i < c.size();i++) - { - assert (value(c[i]) != l_Undef); - assert ((level(var(c[i]))) <= decisionLevel()); - } - } - - assigns[var(p)] = lbool(!sign(p)); - vardata[var(p)] = mkVarData(from, decisionLevel()); - // - //printf("Enqueu %d with reasons %c %d\n", var(p), from == CRef_Undef?'u':'c', decisionLevel()); - trail.push_(p); - - if (from != CRef_Undef) - { - assert(ca[from][0] == p); - } - - if (false &&from != CRef_Undef) - { - Clause& c = ca[from]; - for (int i = 0; i < c.size(); i++) - { - printf("%c", printValue(value(c[i]))); - } - printf("\n"); - } -} - - -/*_________________________________________________________________________________________________ -| -| propagate : [void] -> [Clause*] -| -| Description: -| Propagates all enqueued facts. If a conflict arises, the conflicting clause is returned, -| otherwise CRef_Undef. -| -| Post-conditions: -| * the propagation queue is empty, even if there was a conflict. -|________________________________________________________________________________________________@*/ -CRef Solver_prop::propagate() -{ - CRef confl = CRef_Undef; - int num_props = 0; - watches.cleanAll(); - - while (qhead < trail.size()){ - Lit p = trail[qhead++]; // 'p' is enqueued fact to propagate. - vec& ws = watches[p]; - Watcher *i, *j, *end; - num_props++; - - for (i = j = (Watcher*)ws, end = i + ws.size(); i != end;){ - // Try to avoid inspecting the clause: - Lit blocker = i->blocker; - if (value(blocker) == l_True){ - *j++ = *i++; continue; } - - // Make sure the false literal is data[1]: - CRef cr = i->cref; - Clause& c = ca[cr]; - Lit false_lit = ~p; - if (c[0] == false_lit) - c[0] = c[1], c[1] = false_lit; - assert(c[1] == false_lit); - i++; - - // If 0th watch is true, then clause is already satisfied. - Lit first = c[0]; - Watcher w = Watcher(cr, first); - if (first != blocker && value(first) == l_True){ - *j++ = w; continue; } - - // Look for new watch: - for (int k = 2; k < c.size(); k++) - if (value(c[k]) != l_False){ - c[1] = c[k]; c[k] = false_lit; - watches[~c[1]].push(w); - goto NextClause; } - - // Did not find watch -- clause is unit under assignment: - *j++ = w; - if (value(first) == l_False){ - confl = cr; - qhead = trail.size(); - // Copy the remaining watches: - while (i < end) - *j++ = *i++; - }else - uncheckedEnqueue(first, cr); - - NextClause:; - } - ws.shrink(i - j); - } - propagations += num_props; - simpDB_props -= num_props; - - return confl; -} - - - -/*_________________________________________________________________________________________________ -| -| reduceDB : () -> [void] -| -| Description: -| Remove half of the learnt clauses, minus the clauses locked by the current assignment. Locked -| clauses are clauses that are reason to some assignment. Binary clauses are never removed. -|________________________________________________________________________________________________@*/ -struct reduceDB_lt { - ClauseAllocator& ca; - reduceDB_lt(ClauseAllocator& ca_) : ca(ca_) {} - bool operator () (CRef x, CRef y) { - return ca[x].size() > 2 && (ca[y].size() == 2 || ca[x].activity() < ca[y].activity()); } -}; -void Solver_prop::reduceDB() -{ - int i, j; - double extra_lim = cla_inc / learnts.size(); // Remove any clause below this activity - - sort(learnts, reduceDB_lt(ca)); - // Don't delete binary or locked clauses. From the rest, delete clauses from the first half - // and clauses with activity smaller than 'extra_lim': - for (i = j = 0; i < learnts.size(); i++){ - Clause& c = ca[learnts[i]]; - if (c.size() > 2 && !locked(c) && (i < learnts.size() / 2 || c.activity() < extra_lim)) - removeClause(learnts[i]); - else - learnts[j++] = learnts[i]; - } - learnts.shrink(i - j); - checkGarbage(); -} - - -void Solver_prop::removeSatisfied(vec& cs) -{ - int i, j; - for (i = j = 0; i < cs.size(); i++){ - Clause& c = ca[cs[i]]; - if (satisfied(c)) - removeClause(cs[i]); - else - cs[j++] = cs[i]; - } - cs.shrink(i - j); -} - - -void Solver_prop::rebuildOrderHeap() -{ - vec vs; - for (Var v = 0; v < nVars(); v++) - if (decision[v] && value(v) == l_Undef) - vs.push(v); - order_heap.build(vs); -} - - -/*_________________________________________________________________________________________________ -| -| simplify : [void] -> [bool] -| -| Description: -| Simplify the clause database according to the current top-level assigment. Currently, the only -| thing done here is the removal of satisfied clauses, but more things can be put here. -|________________________________________________________________________________________________@*/ -bool Solver_prop::simplify() -{ - assert(decisionLevel() == 0); - - if (!ok || propagate() != CRef_Undef) - return ok = false; - - if (nAssigns() == simpDB_assigns || (simpDB_props > 0)) - return true; - - // Remove satisfied clauses: - removeSatisfied(learnts); - if (remove_satisfied) // Can be turned off. - removeSatisfied(clauses); - checkGarbage(); - rebuildOrderHeap(); - - simpDB_assigns = nAssigns(); - simpDB_props = clauses_literals + learnts_literals; // (shouldn't depend on stats really, but it will do for now) - - return true; -} - -/*_________________________________________________________________________________________________ -| -| search : (nof_conflicts : int) (params : const SearchParams&) -> [lbool] -| -| Description: -| Search for a model the specified number of conflicts. -| NOTE! Use negative value for 'nof_conflicts' indicate infinity. -| -| Output: -| 'l_True' if a partial assigment that is consistent with respect to the clauseset is found. If -| all variables are decision variables, this means that the clause set is satisfiable. 'l_False' -| if the clause set is unsatisfiable. 'l_Undef' if the bound on number of conflicts is reached. -|________________________________________________________________________________________________@*/ -lbool Solver_prop::search(int nof_conflicts) -{ - assert(ok); - int backtrack_level; - int conflictC = 0; - vec learnt_clause; - starts++; - - for (;;){ - CRef confl = propagate(); - if (confl== CRef_Undef) - confl = arrayPropagate(); - - - if (confl != CRef_Undef){ - // CONFLICT - conflicts++; conflictC++; - if (decisionLevel() == 0) return l_False; - - learnt_clause.clear(); - analyze(confl, learnt_clause, backtrack_level); - cancelUntil(backtrack_level); - if (debug_print) - { - printClause(learnt_clause); - printf("Backtrack %d\n", backtrack_level); - } - assert(value(learnt_clause[0]) == l_Undef); - - if (learnt_clause.size() == 1){ - uncheckedEnqueue(learnt_clause[0]); - }else{ - CRef cr = ca.alloc(learnt_clause, true); - learnts.push(cr); - attachClause(cr); - claBumpActivity(ca[cr]); - uncheckedEnqueue(learnt_clause[0], cr); - } - - varDecayActivity(); - claDecayActivity(); - - if (--learntsize_adjust_cnt == 0){ - learntsize_adjust_confl *= learntsize_adjust_inc; - learntsize_adjust_cnt = (int)learntsize_adjust_confl; - max_learnts *= learntsize_inc; - - if (verbosity >= 1) - printf("| %9d | %7d %8d %8d | %8d %8d %6.0f | %6.3f %% |\n", - (int)conflicts, - (int)dec_vars - (trail_lim.size() == 0 ? trail.size() : trail_lim[0]), nClauses(), (int)clauses_literals, - (int)max_learnts, nLearnts(), (double)learnts_literals/nLearnts(), progressEstimate()*100); - } - - }else{ - // NO CONFLICT - if (nof_conflicts >= 0 && conflictC >= nof_conflicts || !withinBudget()){ - // Reached bound on number of conflicts: - progress_estimate = progressEstimate(); - cancelUntil(0); - return l_Undef; } - - // Simplify the set of problem clauses: - if (decisionLevel() == 0 && !simplify()) - return l_False; - - if (learnts.size()-nAssigns() >= max_learnts) - // Reduce the set of learnt clauses: - reduceDB(); - - Lit next = lit_Undef; - while (decisionLevel() < assumptions.size()){ - // Perform user provided assumption: - Lit p = assumptions[decisionLevel()]; - if (value(p) == l_True){ - // Dummy decision level: - newDecisionLevel(); - }else if (value(p) == l_False){ - analyzeFinal(~p, conflict); - return l_False; - }else{ - next = p; - break; - } - } - - if (next == lit_Undef){ - // New variable decision: - decisions++; - next = pickBranchLit(); - - if (next == lit_Undef) - // Model found: - return l_True; - } - - // Increase decision level and enqueue 'next' - newDecisionLevel(); - uncheckedEnqueue(next); - } - } -} - - -double Solver_prop::progressEstimate() const -{ - double progress = 0; - double F = 1.0 / nVars(); - - for (int i = 0; i <= decisionLevel(); i++){ - int beg = i == 0 ? 0 : trail_lim[i - 1]; - int end = i == decisionLevel() ? trail.size() : trail_lim[i]; - progress += pow(F, i) * (end - beg); - } - - return progress / nVars(); -} - -/* - Finite subsequences of the Luby-sequence: - - 0: 1 - 1: 1 1 2 - 2: 1 1 2 1 1 2 4 - 3: 1 1 2 1 1 2 4 1 1 2 1 1 2 4 8 - ... - - - */ - -static double luby(double y, int x){ - - // Find the finite subsequence that contains index 'x', and the - // size of that subsequence: - int size, seq; - for (size = 1, seq = 0; size < x+1; seq++, size = 2*size+1); - - while (size-1 != x){ - size = (size-1)>>1; - seq--; - x = x % size; - } - - return pow(y, seq); -} - -// NOTE: assumptions passed in member-variable 'assumptions'. -lbool Solver_prop::solve_() -{ - model.clear(); - conflict.clear(); - if (!ok) return l_False; - - top_level_var = nVars(); - - for (int i = 0; i < toAddAtStartup.size(); i++) - { - ArrayAccess* iv = toAddAtStartup[i]; - CRef r = writeOutArrayAxiom(*iv); - if (r != CRef_Undef) - { - ok = false; - return l_False; - } - } - toAddAtStartup.clear(); - - - solves++; - - max_learnts = nClauses() * learntsize_factor; - learntsize_adjust_confl = learntsize_adjust_start_confl; - learntsize_adjust_cnt = (int)learntsize_adjust_confl; - lbool status = l_Undef; - - if (verbosity >= 1){ - printf("============================[ Search Statistics ]==============================\n"); - printf("| Conflicts | ORIGINAL | LEARNT | Progress |\n"); - printf("| | Vars Clauses Literals | Limit Clauses Lit/Cl | |\n"); - printf("===============================================================================\n"); - } - - // Search: - int curr_restarts = 0; - while (status == l_Undef){ - double rest_base = luby_restart ? luby(restart_inc, curr_restarts) : pow(restart_inc, curr_restarts); - status = search(rest_base * restart_first); - if (!withinBudget()) break; - curr_restarts++; - } - - if (verbosity >= 1) - printf("===============================================================================\n"); - - - if (status == l_True){ - // Extend & copy model: - model.growTo(nVars()); - for (int i = 0; i < nVars(); i++) model[i] = value(i); - - assert(watched_indexes==0); - }else if (status == l_False && conflict.size() == 0) - ok = false; - - cancelUntil(0); - return status; -} - -//================================================================================================= -// Writing CNF to DIMACS: -// -// FIXME: this needs to be rewritten completely. - -static Var mapVar(Var x, vec& map, Var& max) -{ - if (map.size() <= x || map[x] == -1){ - map.growTo(x+1, -1); - map[x] = max++; - } - return map[x]; -} - - -void Solver_prop::toDimacs(FILE* f, Clause& c, vec& map, Var& max) -{ - if (satisfied(c)) return; - - for (int i = 0; i < c.size(); i++) - if (value(c[i]) != l_False) - fprintf(f, "%s%d ", sign(c[i]) ? "-" : "", mapVar(var(c[i]), map, max)+1); - fprintf(f, "0\n"); -} - - -void Solver_prop::toDimacs(const char *file, const vec& assumps) -{ - FILE* f = fopen(file, "wr"); - if (f == NULL) - fprintf(stderr, "could not open file %s\n", file), exit(1); - toDimacs(f, assumps); - fclose(f); -} - - -void Solver_prop::toDimacs(FILE* f, const vec& assumps) -{ - // Handle case when solver is in contradictory state: - if (!ok){ - fprintf(f, "p cnf 1 2\n1 0\n-1 0\n"); - return; } - - vec map; Var max = 0; - - // Cannot use removeClauses here because it is not safe - // to deallocate them at this point. Could be improved. - int cnt = 0; - for (int i = 0; i < clauses.size(); i++) - if (!satisfied(ca[clauses[i]])) - cnt++; - - for (int i = 0; i < clauses.size(); i++) - if (!satisfied(ca[clauses[i]])){ - Clause& c = ca[clauses[i]]; - for (int j = 0; j < c.size(); j++) - if (value(c[j]) != l_False) - mapVar(var(c[j]), map, max); - } - - // Assumptions are added as unit clauses: - cnt += assumptions.size(); - - fprintf(f, "p cnf %d %d\n", max, cnt); - - for (int i = 0; i < assumptions.size(); i++){ - assert(value(assumptions[i]) != l_False); - fprintf(f, "%s%d 0\n", sign(assumptions[i]) ? "-" : "", mapVar(var(assumptions[i]), map, max)+1); - } - - for (int i = 0; i < clauses.size(); i++) - toDimacs(f, ca[clauses[i]], map, max); - - if (verbosity > 0) - printf("Wrote %d clauses with %d variables.\n", cnt, max); -} - - -//================================================================================================= -// Garbage Collection methods: - -void Solver_prop::relocAll(ClauseAllocator& to) -{ - // All watchers: - // - // for (int i = 0; i < watches.size(); i++) - watches.cleanAll(); - for (int v = 0; v < nVars(); v++) - for (int s = 0; s < 2; s++){ - Lit p = mkLit(v, s); - // printf(" >>> RELOCING: %s%d\n", sign(p)?"-":"", var(p)+1); - vec& ws = watches[p]; - for (int j = 0; j < ws.size(); j++) - ca.reloc(ws[j].cref, to); - } - - // All reasons: - // - for (int i = 0; i < trail.size(); i++){ - Var v = var(trail[i]); - - if (reason(v) != CRef_Undef && (ca[reason(v)].reloced() || locked(ca[reason(v)]))) - ca.reloc(vardata[v].reason, to); - } - - // All learnt: - // - for (int i = 0; i < learnts.size(); i++) - ca.reloc(learnts[i], to); - - // All original: - // - for (int i = 0; i < clauses.size(); i++) - ca.reloc(clauses[i], to); -} - - -void Solver_prop::garbageCollect() -{ - - // Initialize the next region to a size corresponding to the estimated utilization degree. This - // is not precise but should avoid some unnecessary reallocations for the new region: - assert(ca.wasted() <= ca.size()); - ClauseAllocator to(ca.size() - ca.wasted()); - - relocAll(to); - if (verbosity >= 2) - printf("| Garbage collection: %12d bytes => %12d bytes |\n", - ca.size()*ClauseAllocator::Unit_Size, to.size()*ClauseAllocator::Unit_Size); - to.moveTo(ca); -} diff --git a/src/vendor/stp/src/sat/core_prop/Solver_prop.h b/src/vendor/stp/src/sat/core_prop/Solver_prop.h deleted file mode 100644 index 5fab63890..000000000 --- a/src/vendor/stp/src/sat/core_prop/Solver_prop.h +++ /dev/null @@ -1,649 +0,0 @@ -/****************************************************************************************[Solver.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Solver_h -#define Minisat_Solver_h - -#include "../mtl/Vec.h" -#include "../mtl/Heap.h" -#include "../mtl/Alg.h" -#include "../utils/Options.h" -#include "../core/SolverTypes.h" -#include - - -namespace Minisat { - -// Use the GCC extension to use 128-bit indices. -#ifdef INDICES_128BITS - typedef unsigned int uint128_t __attribute__((mode(TI))); - static inline uint32_t hash(uint128_t x){ return (uint32_t)x; } - typedef uint128_t index_type; -#else - typedef uint64_t index_type; -#endif - -#define INDEX_BIT_WIDTH (sizeof(index_type) *8) - -//================================================================================================= -// Solver -- the main class: - -class Solver_prop { -public: - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////// - - // Changes for the array Propagator... -private: - - struct LessThan_Level { - Solver_prop* parent; - LessThan_Level(Solver_prop* parent_) - { - parent = parent_; - } - bool operator () (const Lit& x, const Lit& y) - { - if( parent->value(var(x)) == l_Undef) - return true; - if( parent->value(var(y)) == l_Undef) - return false; - - return parent->level(var(x)) > parent->level(var(y)); - } - }; - - - static char printValue(const lbool v) { - if (v == l_True) - return '1'; - else if (v == l_False) - return '0'; - else - return '.'; - } - - void printClause(const vec &c) { - for (int i = 0; i < c.size(); i++) { - printf("%s%d:[%c:%d] ", sign(c[i]) ? "-" : "", var(c[i]), - printValue(value(c[i])), level(var(c[i]))); - } - printf("\n"); - } - - static void printClause2(const vec &c) { - for (int i = 0; i < c.size(); i++) { - printf("%s%d ", sign(c[i]) ? "-" : "", var(c[i]) ); - } - printf("\n"); - } - - - struct EqualityVariables - { - int my_id; - int id; // other array id. - - EqualityVariables() - { - } - - EqualityVariables(int me_, int other_) - { - my_id = me_; - id = other_; - assert(me_ < other_); - } - - bool - operator==(const EqualityVariables& other) const - { - return other.my_id == my_id && other.id == id; - } - }; - - struct EqualityVariable_Hash - { - uint32_t operator()(const Minisat::Solver_prop::EqualityVariables & e) const - { return Minisat::hash(e.my_id + e.id); } - }; - - - struct ArrayAccess - { - vec index; - vec value; - - int array_id; - const int id; // unique id. - - private: - const int index_size; // bit-width of the index. - const int value_size; // bit-width of the value. - - const bool is_value_constant; // Whether the value is a constant at the start. - const bool is_index_constant; - - index_type index_constant; - public: - - //The index/value is entirely known in advance. - vec constant_index; - vec constant_value; - - // Whether the current object is in the watchlist. To be in the watchlist, - // the index must be known. - bool known_index; - - // Used by the watchlist to check whether the index is still unfixed. - int index_index; - - ArrayAccess(int id_, const vec& i, const vec& v, const vec& ki, const vec& kv, int arrayID): - array_id(arrayID), - id(id_), - index_size(std::max(ki.size(), i.size())), - value_size(std::max(kv.size(), v.size())), - is_value_constant(kv.size() > 0), - is_index_constant(ki.size() > 0), - index_constant(0), - index_index(0) - { - i.copyTo(index); - v.copyTo(value); - ki.copyTo(constant_index); - kv.copyTo(constant_value); - - known_index = false; - - if (is_index_constant) - { - assert(index_size <=INDEX_BIT_WIDTH); - for (int i = 0; i < index_size; i++) - { - lbool v = constant_index[i]; - assert(v == l_True || v == l_False); - if (v == l_True) - index_constant += (1 << i); - } - } - } - index_type constantIndex() const - { - assert (is_index_constant); - return index_constant; - } - - bool - isIndexConstant() const - { - return is_index_constant; - } - - bool - isValueConstant() const - { - return is_value_constant; - } - - int - indexSize() const - { - return index_size; - } - - int - valueSize() const - { - return value_size; - } - - void - print() - { - printf("------------\n"); - - printf("Index Size: %d\n", index.size()); - printClause2(index); - - printf("Value Size: %d\n", value.size()); - printClause2(value); - - printf("Known Index: %ld ", isIndexConstant() ? index_constant : -1); - printf("Known Value: %c\n", isValueConstant() ? 't' : 'f'); - printf("Array ID:%d\n", array_id); - printf("------------\n"); - } - }; - - // We keep the decision level that an index of an array access became fixed. - // We use this to remove the access from the list of fixed indexes. - struct ArrayHistory - { - ArrayHistory(ArrayAccess*aa_, int dl) - { - aa = aa_; - decisionLevel =dl; - } - - ArrayAccess *aa; - int decisionLevel; - }; - -public: - // Holds assignments to literals that should be in trail prior to the current decision level. - struct Assignment - { - Lit l; - int decisionLevel; - Assignment(Lit l_, int dl) - { - l =l_; - decisionLevel = dl; - } - }; -private: - - CRef arrayPropagate(); // top level. - - void eqLitHelper(const Lit& l0, const Lit& l1, const Lit& intermed); - bool IndexIsSet(const ArrayAccess& iv); - - lbool accessIndex(const ArrayAccess& iv, int i); - lbool accessValue(const ArrayAccess& iv, int i); - index_type index_as_int(const ArrayAccess& iv); - - void startWatchOfIndexVariable(ArrayAccess* iv); - - void printClauses(); - - void assertIndexesEqual(ArrayAccess &a, ArrayAccess &b); - CRef writeOutArrayAxiom(ArrayAccess& iv); - CRef getEqualsLit(ArrayAccess &a, ArrayAccess &b, Lit & eqLit, bool &alreadyCreated); - CRef addExtraClause(vec& l); - - - - void sortVecByLevel(vec & c); - void sortAlternateTrail(); - -public: - bool addArray(int array_id, const vec& i, const vec& v, const vec& ki, const vec& kv); -private: - - vec arrayData; // So we can cleanup. - int aa_id; // next globally unique id for an array access. - int last_id; // last id for the array. - int number_of_arrays; - int array_trail; // We have checked upto this index in the trail. - int watched_indexes; - int top_level_var; - int alternate_trail_sorted_to; - - Map >* val_to_aa; // Maps from the index value of fixed indexes to the array accesses. - Map > watchedLiterals; // The literals that are watched. - vec toAddAtStartup; // These need to be added in at startup. - vec arrayHistory_stack; // When the index is fixed it's added into here. - std::vector alternate_trail; // These literals were assigned below the current decisionLevel. - - Map equality_variables; - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////// - -public: - // Constructor/Destructor: - // - Solver_prop(volatile bool& timeout); - virtual ~Solver_prop(); - - // Problem specification: - // - Var newVar (bool polarity = true, bool dvar = true); // Add a new variable with parameters specifying variable mode. - - bool addClause (const vec& ps); // Add a clause to the solver. - bool addEmptyClause(); // Add the empty clause, making the solver contradictory. - bool addClause (Lit p); // Add a unit clause to the solver. - bool addClause (Lit p, Lit q); // Add a binary clause to the solver. - bool addClause (Lit p, Lit q, Lit r); // Add a ternary clause to the solver. - bool addClause_( vec& ps); // Add a clause to the solver without making superflous internal copy. Will - // change the passed vector 'ps'. - - // Solving: - // - bool simplify (); // Removes already satisfied clauses. - bool solve (const vec& assumps); // Search for a model that respects a given set of assumptions. - lbool solveLimited (const vec& assumps); // Search for a model that respects a given set of assumptions (With resource constraints). - bool solve (); // Search without assumptions. - bool solve (Lit p); // Search for a model that respects a single assumption. - bool solve (Lit p, Lit q); // Search for a model that respects two assumptions. - bool solve (Lit p, Lit q, Lit r); // Search for a model that respects three assumptions. - bool okay () const; // FALSE means solver is in a conflicting state - - void toDimacs (FILE* f, const vec& assumps); // Write CNF to file in DIMACS-format. - void toDimacs (const char *file, const vec& assumps); - void toDimacs (FILE* f, Clause& c, vec& map, Var& max); - - // Convenience versions of 'toDimacs()': - void toDimacs (const char* file); - void toDimacs (const char* file, Lit p); - void toDimacs (const char* file, Lit p, Lit q); - void toDimacs (const char* file, Lit p, Lit q, Lit r); - - // Variable mode: - // - void setPolarity (Var v, bool b); // Declare which polarity the decision heuristic should use for a variable. Requires mode 'polarity_user'. - void setDecisionVar (Var v, bool b); // Declare if a variable should be eligible for selection in the decision heuristic. - - // Read state: - // - lbool value (Var x) const; // The current value of a variable. - lbool value (Lit p) const; // The current value of a literal. - lbool modelValue (Var x) const; // The value of a variable in the last model. The last call to solve must have been satisfiable. - lbool modelValue (Lit p) const; // The value of a literal in the last model. The last call to solve must have been satisfiable. - int nAssigns () const; // The current number of assigned literals. - int nClauses () const; // The current number of original clauses. - int nLearnts () const; // The current number of learnt clauses. - int nVars () const; // The current number of variables. - int nFreeVars () const; - - // Resource contraints: - // - void setConfBudget(int64_t x); - void setPropBudget(int64_t x); - void budgetOff(); - void interrupt(); // Trigger a (potentially asynchronous) interruption of the solver. - void clearInterrupt(); // Clear interrupt indicator flag. - - // Memory managment: - // - virtual void garbageCollect(); - void checkGarbage(double gf); - void checkGarbage(); - - // Extra results: (read-only member variable) - // - vec model; // If problem is satisfiable, this vector contains the model (if any). - vec conflict; // If problem is unsatisfiable (possibly under assumptions), - // this vector represent the final conflict clause expressed in the assumptions. - - // Mode of operation: - // - int verbosity; - double var_decay; - double clause_decay; - double random_var_freq; - double random_seed; - bool luby_restart; - int ccmin_mode; // Controls conflict clause minimization (0=none, 1=basic, 2=deep). - int phase_saving; // Controls the level of phase saving (0=none, 1=limited, 2=full). - bool rnd_pol; // Use random polarities for branching heuristics. - bool rnd_init_act; // Initialize variable activities with a small random value. - double garbage_frac; // The fraction of wasted memory allowed before a garbage collection is triggered. - - int restart_first; // The initial restart limit. (default 100) - double restart_inc; // The factor with which the restart limit is multiplied in each restart. (default 1.5) - double learntsize_factor; // The intitial limit for learnt clauses is a factor of the original clauses. (default 1 / 3) - double learntsize_inc; // The limit for learnt clauses is multiplied with this factor each restart. (default 1.1) - - int learntsize_adjust_start_confl; - double learntsize_adjust_inc; - - // Statistics: (read-only member variable) - // - uint64_t solves, starts, decisions, rnd_decisions, propagations, conflicts; - uint64_t dec_vars, clauses_literals, learnts_literals, max_literals, tot_literals; - -protected: - - // Helper structures: - // - struct VarData { CRef reason; int level; }; - static inline VarData mkVarData(CRef cr, int l){ VarData d = {cr, l}; return d; } - - struct Watcher { - CRef cref; - Lit blocker; - Watcher(CRef cr, Lit p) : cref(cr), blocker(p) {} - bool operator==(const Watcher& w) const { return cref == w.cref; } - bool operator!=(const Watcher& w) const { return cref != w.cref; } - }; - - struct WatcherDeleted - { - const ClauseAllocator& ca; - WatcherDeleted(const ClauseAllocator& _ca) : ca(_ca) {} - bool operator()(const Watcher& w) const { return ca[w.cref].mark() == 1; } - }; - - struct VarOrderLt { - const vec& activity; - bool operator () (Var x, Var y) const { return activity[x] > activity[y]; } - VarOrderLt(const vec& act) : activity(act) { } - }; - - // Solver state: - // - bool ok; // If FALSE, the constraints are already unsatisfiable. No part of the solver state may be used! - vec clauses; // List of problem clauses. - vec learnts; // List of learnt clauses. - double cla_inc; // Amount to bump next clause with. - vec activity; // A heuristic measurement of the activity of a variable. - double var_inc; // Amount to bump next variable with. - OccLists, WatcherDeleted> - watches; // 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true). - vec assigns; // The current assignments. - vec polarity; // The preferred polarity of each variable. - vec decision; // Declares if a variable is eligible for selection in the decision heuristic. - vec trail; // Assignment stack; stores all assigments made in the order they were made. - vec trail_lim; // Separator indices for different decision levels in 'trail'. - vec vardata; // Stores reason and level for each variable. - int qhead; // Head of queue (as index into the trail -- no more explicit propagation queue in MiniSat). - int simpDB_assigns; // Number of top-level assignments since last execution of 'simplify()'. - int64_t simpDB_props; // Remaining number of propagations that must be made before next execution of 'simplify()'. - vec assumptions; // Current set of assumptions provided to solve by the user. - Heap order_heap; // A priority queue of variables ordered with respect to the variable activity. - double progress_estimate;// Set by 'search()'. - bool remove_satisfied; // Indicates whether possibly inefficient linear scan for satisfied clauses should be performed in 'simplify'. - - ClauseAllocator ca; - - // Temporaries (to reduce allocation overhead). Each variable is prefixed by the method in which it is - // used, exept 'seen' wich is used in several places. - // - vec seen; - vec analyze_stack; - vec analyze_toclear; - vec add_tmp; - vec array_of_interest; - - double max_learnts; - double learntsize_adjust_confl; - int learntsize_adjust_cnt; - - // Resource contraints: - // - int64_t conflict_budget; // -1 means no budget. - int64_t propagation_budget; // -1 means no budget. - volatile bool& asynch_interrupt; - - // Main internal methods: - // - void insertVarOrder (Var x); // Insert a variable in the decision order priority queue. - Lit pickBranchLit (); // Return the next decision variable. - void newDecisionLevel (); // Begins a new decision level. - void uncheckedEnqueue (Lit p, CRef from = CRef_Undef); // Enqueue a literal. Assumes value of literal is undefined. - bool enqueue (Lit p, CRef from = CRef_Undef); // Test if fact 'p' contradicts current state, enqueue otherwise. - CRef propagate (); // Perform unit propagation. Returns possibly conflicting clause. - void cancelUntil (int level); // Backtrack until a certain level. - void analyze (CRef confl, vec& out_learnt, int& out_btlevel); // (bt = backtrack) - void analyzeFinal (Lit p, vec& out_conflict); // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION? - bool litRedundant (Lit p, uint32_t abstract_levels); // (helper method for 'analyze()') - lbool search (int nof_conflicts); // Search for a given number of conflicts. - lbool solve_ (); // Main solve method (assumptions given in 'assumptions'). - void reduceDB (); // Reduce the set of learnt clauses. - void removeSatisfied (vec& cs); // Shrink 'cs' to contain only non-satisfied clauses. - void rebuildOrderHeap (); - - // Maintaining Variable/Clause activity: - // - void varDecayActivity (); // Decay all variables with the specified factor. Implemented by increasing the 'bump' value instead. - void varBumpActivity (Var v, double inc); // Increase a variable with the current 'bump' value. - void varBumpActivity (Var v); // Increase a variable with the current 'bump' value. - void claDecayActivity (); // Decay all clauses with the specified factor. Implemented by increasing the 'bump' value instead. - void claBumpActivity (Clause& c); // Increase a clause with the current 'bump' value. - - // Operations on clauses: - // - void attachClause (CRef cr); // Attach a clause to watcher lists. - void detachClause (CRef cr, bool strict = false); // Detach a clause to watcher lists. - void removeClause (CRef cr); // Detach and free a clause. - bool locked (const Clause& c) const; // Returns TRUE if a clause is a reason for some implication in the current state. - bool satisfied (const Clause& c) const; // Returns TRUE if a clause is satisfied in the current state. - - void relocAll (ClauseAllocator& to); - - // Misc: - // - int decisionLevel () const; // Gives the current decisionlevel. - uint32_t abstractLevel (Var x) const; // Used to represent an abstraction of sets of decision levels. - CRef reason (Var x) const; - int level (Var x) const; - double progressEstimate () const; // DELETE THIS ?? IT'S NOT VERY USEFUL ... - bool withinBudget () const; - - // Static helpers: - // - - // Returns a random float 0 <= x < 1. Seed must never be 0. - static inline double drand(double& seed) { - seed *= 1389796; - int q = (int)(seed / 2147483647); - seed -= (double)q * 2147483647; - return seed / 2147483647; } - - // Returns a random integer 0 <= x < size. Seed must never be 0. - static inline int irand(double& seed, int size) { - return (int)(drand(seed) * size); } -}; - - -//================================================================================================= -// Implementation of inline methods: - -inline CRef Solver_prop::reason(Var x) const { return vardata[x].reason; } -inline int Solver_prop::level (Var x) const { return vardata[x].level; } - -inline void Solver_prop::insertVarOrder(Var x) { - if (!order_heap.inHeap(x) && decision[x]) order_heap.insert(x); } - -inline void Solver_prop::varDecayActivity() { var_inc *= (1 / var_decay); } -inline void Solver_prop::varBumpActivity(Var v) { varBumpActivity(v, var_inc); } -inline void Solver_prop::varBumpActivity(Var v, double inc) { - if ( (activity[v] += inc) > 1e100 ) { - // Rescale: - for (int i = 0; i < nVars(); i++) - activity[i] *= 1e-100; - var_inc *= 1e-100; } - - // Update order_heap with respect to new activity: - if (order_heap.inHeap(v)) - order_heap.decrease(v); } - -inline void Solver_prop::claDecayActivity() { cla_inc *= (1 / clause_decay); } -inline void Solver_prop::claBumpActivity (Clause& c) { - if ( (c.activity() += cla_inc) > 1e20 ) { - // Rescale: - for (int i = 0; i < learnts.size(); i++) - ca[learnts[i]].activity() *= 1e-20; - cla_inc *= 1e-20; } } - -inline void Solver_prop::checkGarbage(void){ return checkGarbage(garbage_frac); } -inline void Solver_prop::checkGarbage(double gf){ - if (ca.wasted() > ca.size() * gf) - garbageCollect(); } - -// NOTE: enqueue does not set the ok flag! (only public methods do) -inline bool Solver_prop::enqueue (Lit p, CRef from) { return value(p) != l_Undef ? value(p) != l_False : (uncheckedEnqueue(p, from), true); } -inline bool Solver_prop::addClause (const vec& ps) { ps.copyTo(add_tmp); return addClause_(add_tmp); } -inline bool Solver_prop::addEmptyClause () { add_tmp.clear(); return addClause_(add_tmp); } -inline bool Solver_prop::addClause (Lit p) { add_tmp.clear(); add_tmp.push(p); return addClause_(add_tmp); } -inline bool Solver_prop::addClause (Lit p, Lit q) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); return addClause_(add_tmp); } -inline bool Solver_prop::addClause (Lit p, Lit q, Lit r) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); add_tmp.push(r); return addClause_(add_tmp); } -inline bool Solver_prop::locked (const Clause& c) const { return value(c[0]) == l_True && reason(var(c[0])) != CRef_Undef && ca.lea(reason(var(c[0]))) == &c; } -inline void Solver_prop::newDecisionLevel() { trail_lim.push(trail.size()); } - -inline int Solver_prop::decisionLevel () const { return trail_lim.size(); } -inline uint32_t Solver_prop::abstractLevel (Var x) const { return 1 << (level(x) & 31); } -inline lbool Solver_prop::value (Var x) const { return assigns[x]; } -inline lbool Solver_prop::value (Lit p) const { return assigns[var(p)] ^ sign(p); } -inline lbool Solver_prop::modelValue (Var x) const { return model[x]; } -inline lbool Solver_prop::modelValue (Lit p) const { return model[var(p)] ^ sign(p); } -inline int Solver_prop::nAssigns () const { return trail.size(); } -inline int Solver_prop::nClauses () const { return clauses.size(); } -inline int Solver_prop::nLearnts () const { return learnts.size(); } -inline int Solver_prop::nVars () const { return vardata.size(); } -inline int Solver_prop::nFreeVars () const { return (int)dec_vars - (trail_lim.size() == 0 ? trail.size() : trail_lim[0]); } -inline void Solver_prop::setPolarity (Var v, bool b) { polarity[v] = b; } -inline void Solver_prop::setDecisionVar(Var v, bool b) -{ - if ( b && !decision[v]) dec_vars++; - else if (!b && decision[v]) dec_vars--; - - decision[v] = b; - insertVarOrder(v); -} -inline void Solver_prop::setConfBudget(int64_t x){ conflict_budget = conflicts + x; } -inline void Solver_prop::setPropBudget(int64_t x){ propagation_budget = propagations + x; } -inline void Solver_prop::interrupt(){ asynch_interrupt = true; } -inline void Solver_prop::clearInterrupt(){ asynch_interrupt = false; } -inline void Solver_prop::budgetOff(){ conflict_budget = propagation_budget = -1; } -inline bool Solver_prop::withinBudget() const { - return !asynch_interrupt && - (conflict_budget < 0 || conflicts < (uint64_t)conflict_budget) && - (propagation_budget < 0 || propagations < (uint64_t)propagation_budget); } - -// FIXME: after the introduction of asynchronous interrruptions the solve-versions that return a -// pure bool do not give a safe interface. Either interrupts must be possible to turn off here, or -// all calls to solve must return an 'lbool'. I'm not yet sure which I prefer. -inline bool Solver_prop::solve () { budgetOff(); assumptions.clear(); return solve_() == l_True; } -inline bool Solver_prop::solve (Lit p) { budgetOff(); assumptions.clear(); assumptions.push(p); return solve_() == l_True; } -inline bool Solver_prop::solve (Lit p, Lit q) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); return solve_() == l_True; } -inline bool Solver_prop::solve (Lit p, Lit q, Lit r) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); assumptions.push(r); return solve_() == l_True; } -inline bool Solver_prop::solve (const vec& assumps){ budgetOff(); assumps.copyTo(assumptions); return solve_() == l_True; } -inline lbool Solver_prop::solveLimited (const vec& assumps){ assumps.copyTo(assumptions); return solve_(); } -inline bool Solver_prop::okay () const { return ok; } - -inline void Solver_prop::toDimacs (const char* file){ vec as; toDimacs(file, as); } -inline void Solver_prop::toDimacs (const char* file, Lit p){ vec as; as.push(p); toDimacs(file, as); } -inline void Solver_prop::toDimacs (const char* file, Lit p, Lit q){ vec as; as.push(p); as.push(q); toDimacs(file, as); } -inline void Solver_prop::toDimacs (const char* file, Lit p, Lit q, Lit r){ vec as; as.push(p); as.push(q); as.push(r); toDimacs(file, as); } - - -//================================================================================================= -// Debug etc: - - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/BitArray.h b/src/vendor/stp/src/sat/cryptominisat2/BitArray.h deleted file mode 100644 index aa58b6201..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/BitArray.h +++ /dev/null @@ -1,193 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef BITARRAY_H -#define BITARRAY_H - -//#define DEBUG_BITARRAY - -#include -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -namespace MINISAT -{ -using namespace MINISAT; - -class BitArray -{ -public: - BitArray() : - size(0) - , mp(NULL) - { - } - - BitArray(const BitArray& b) : - size(b.size) - { - mp = new uint64_t[size]; - memcpy(mp, b.mp, sizeof(uint64_t)*size); - } - - BitArray& operator=(const BitArray& b) - { - if (size != b.size) { - delete[] mp; - size = b.size; - mp = new uint64_t[size]; - } - memcpy(mp, b.mp, sizeof(uint64_t)*size); - - return *this; - } - - BitArray& operator&=(const BitArray& b) - { - assert(size == b.size); - uint64_t* t1 = mp; - uint64_t* t2 = b.mp; - for (uint64_t i = 0; i < size; i++) { - *t1 &= *t2; - t1++; - t2++; - } - - return *this; - } - - const bool nothingInCommon(const BitArray& b) const - { - assert(size == b.size); - const uint64_t* t1 = mp; - const uint64_t* t2 = b.mp; - for (uint64_t i = 0; i < size; i++) { - if ((*t1)&(*t2)) return false; - t1++; - t2++; - } - - return true; - } - - BitArray& removeThese(const BitArray& b) - { - assert(size == b.size); - uint64_t* t1 = mp; - uint64_t* t2 = b.mp; - for (uint64_t i = 0; i < size; i++) { - *t1 &= ~(*t2); - t1++; - t2++; - } - - return *this; - } - - template - BitArray& removeThese(const T& rem) - { - for (uint32_t i = 0; i < rem.size(); i++) { - clearBit(rem[i]); - } - - return *this; - } - - void resize(uint _size, const bool fill) - { - _size = _size/64 + (bool)(_size%64); - if (size != _size) { - delete[] mp; - size = _size; - mp = new uint64_t[size]; - } - if (fill) setOne(); - else setZero(); - } - - ~BitArray() - { - delete[] mp; - } - - inline const bool isZero() const - { - const uint64_t* mp2 = (const uint64_t*)mp; - - for (uint i = 0; i < size; i++) { - if (mp2[i]) return false; - } - return true; - } - - inline void setZero() - { - memset(mp, 0, size*sizeof(uint64_t)); - } - - inline void setOne() - { - memset(mp, 0, size*sizeof(uint64_t)); - } - - inline void clearBit(const uint i) - { - #ifdef DEBUG_BITARRAY - assert(size*64 > i); - #endif - - mp[i/64] &= ~((uint64_t)1 << (i%64)); - } - - inline void setBit(const uint i) - { - #ifdef DEBUG_BITARRAY - assert(size*64 > i); - #endif - - mp[i/64] |= ((uint64_t)1 << (i%64)); - } - - inline const bool operator[](const uint& i) const - { - #ifdef DEBUG_BITARRAY - assert(size*64 > i); - #endif - - return (mp[i/64] >> (i%64)) & 1; - } - - inline const uint getSize() const - { - return size*64; - } - -private: - - uint size; - uint64_t* mp; -}; - -}; //NAMESPACE MINISAT - -#endif //BITARRAY_H - diff --git a/src/vendor/stp/src/sat/cryptominisat2/BoundedQueue.h b/src/vendor/stp/src/sat/cryptominisat2/BoundedQueue.h deleted file mode 100644 index a705a6dc0..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/BoundedQueue.h +++ /dev/null @@ -1,88 +0,0 @@ -/*****************************************************************************************[Queue.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - 2008 - Gilles Audemard, Laurent Simon - -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 BoundedQueue_h -#define BoundedQueue_h - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Vec.h" - -//================================================================================================= - -namespace MINISAT -{ -using namespace MINISAT; - -template -class bqueue { - vec elems; - int first; - int last; - uint64_t sumofqueue; - int maxsize; - int queuesize; // Number of current elements (must be < maxsize !) - -public: - bqueue(void) : first(0), last(0), sumofqueue(0), maxsize(0), queuesize(0) { } - - void initSize(int size) {growTo(size);} // Init size of bounded size queue - - void push(T x) { - if (queuesize==maxsize) { - assert(last==first); // The queue is full, next value to enter will replace oldest one - sumofqueue -= elems[last]; - if ((++last) == maxsize) last = 0; - } else - queuesize++; - sumofqueue += x; - elems[first] = x; - if ((++first) == maxsize) first = 0; - } - - T peek() { assert(queuesize>0); return elems[last]; } - void pop() {sumofqueue-=elems[last]; queuesize--; if ((++last) == maxsize) last = 0;} - - uint64_t getsum() const {return sumofqueue;} - uint32_t getavg() const {return (uint64_t)sumofqueue/(uint64_t)queuesize;} - int isvalid() const {return (queuesize==maxsize);} - - void growTo(int size) { - elems.growTo(size); - first=0; maxsize=size; queuesize = 0; - for(int i=0;i -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -namespace MINISAT -{ -using namespace MINISAT; - -class Clause; - -//#pragma pack(push) -//#pragma pack(1) -class ClauseSimp -{ - public: - ClauseSimp(Clause* c, const uint32_t _index) : - clause(c) - , index(_index) - {} - - Clause* clause; - uint32_t index; -}; -//#pragma pack(pop) - -class CSet { - vec where; // Map clause ID to position in 'which'. - vec which; // List of clauses (for fast iteration). May contain 'Clause_NULL'. - vec free; // List of positions holding 'Clause_NULL'. - - public: - //ClauseSimp& operator [] (uint32_t index) { return which[index]; } - void reserve(uint32_t size) { where.reserve(size);} - uint32_t size(void) const { return which.size(); } - uint32_t nElems(void) const { return which.size() - free.size(); } - - bool add(const ClauseSimp& c) { - assert(c.clause != NULL); - where.growTo(c.index+1, std::numeric_limits::max()); - if (where[c.index] != std::numeric_limits::max()) { - return true; - } - if (free.size() > 0){ - where[c.index] = free.last(); - which[free.last()] = c; - free.pop(); - }else{ - where[c.index] = which.size(); - which.push(c); - } - return false; - } - - bool exclude(const ClauseSimp& c) { - assert(c.clause != NULL); - if (c.index >= where.size() || where[c.index] == std::numeric_limits::max()) { - //not inside - return false; - } - free.push(where[c.index]); - which[where[c.index]].clause = NULL; - where[c.index] = std::numeric_limits::max(); - return true; - } - - void clear(void) { - for (uint32_t i = 0; i < which.size(); i++) { - if (which[i].clause != NULL) { - where[which[i].index] = std::numeric_limits::max(); - } - } - which.clear(); - free.clear(); - } - - class iterator - { - public: - iterator(ClauseSimp* _it) : - it(_it) - {} - - void operator++() - { - it++; - } - - const bool operator!=(const iterator& iter) const - { - return (it != iter.it);; - } - - ClauseSimp& operator*() { - return *it; - } - - ClauseSimp*& operator->() { - return it; - } - private: - ClauseSimp* it; - }; - - iterator begin() - { - return iterator(which.getData()); - } - - iterator end() - { - return iterator(which.getData() + which.size()); - } -}; - -#endif //CSET_H - -}; //NAMESPACE MINISAT - diff --git a/src/vendor/stp/src/sat/cryptominisat2/Clause.h b/src/vendor/stp/src/sat/cryptominisat2/Clause.h deleted file mode 100644 index 42d55d7ce..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Clause.h +++ /dev/null @@ -1,355 +0,0 @@ -/***********************************************************************************[SolverTypes.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -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 CLAUSE_H -#define CLAUSE_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include -#include -#include -#include "Vec.h" -#include "SolverTypes.h" -#include "PackedRow.h" -#include "constants.h" -#include "ClauseAllocator.h" - -template -uint32_t calcAbstraction(const T& ps) { - uint32_t abstraction = 0; - for (uint32_t i = 0; i != ps.size(); i++) - abstraction |= 1 << (ps[i].toInt() & 31); - return abstraction; -} - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// Clause -- a simple class for representing a clause: - -class MatrixFinder; - -class Clause -{ -protected: - - #ifdef STATS_NEEDED - uint group; - #endif - - uint32_t isLearnt:1; - uint32_t strenghtened:1; - uint32_t varChanged:1; - uint32_t sorted:1; - uint32_t invertedXor:1; - uint32_t isXorClause:1; - uint32_t subsume0Done:1; - uint32_t isRemoved:1; - uint32_t isFreed:1; - uint32_t wasBinInternal:1; - uint32_t mySize:20; - - union {uint32_t act; uint32_t abst;} extra; - float oldActivityInter; - #ifdef _MSC_VER - Lit data[1]; - #else - Lit data[0]; - #endif //_MSC_VER - -#ifdef _MSC_VER -public: -#endif //_MSC_VER - template - Clause(const V& ps, const uint _group, const bool learnt) - { - wasBinInternal = (ps.size() == 2); - isFreed = false; - isXorClause = false; - strenghtened = false; - sorted = false; - varChanged = true; - subsume0Done = false; - mySize = ps.size(); - isLearnt = learnt; - isRemoved = false; - setGroup(_group); - - memcpy(data, ps.getData(), ps.size()*sizeof(Lit)); - if (learnt) { - extra.act = 0; - oldActivityInter = 0; - } else - calcAbstractionClause(); - } - -public: - friend class ClauseAllocator; - - const uint size () const { - return mySize; - } - void resize (const uint size) { - mySize = size; - } - void shrink (const uint i) { - assert(i <= size()); - mySize -= i; - } - void pop () { - shrink(1); - } - const bool isXor () { - return isXorClause; - } - const bool learnt () const { - return isLearnt; - } - float& oldActivity () { - return oldActivityInter; - } - - const float& oldActivity () const { - return oldActivityInter; - } - - const bool getStrenghtened() const { - return strenghtened; - } - void setStrenghtened() { - strenghtened = true; - sorted = false; - subsume0Done = false; - } - void unsetStrenghtened() { - strenghtened = false; - } - const bool getVarChanged() const { - return varChanged; - } - void setVarChanged() { - varChanged = true; - sorted = false; - subsume0Done = false; - } - void unsetVarChanged() { - varChanged = false; - } - const bool getSorted() const { - return sorted; - } - void setSorted() { - sorted = true; - } - void setUnsorted() { - sorted = false; - } - void subsume0Finished() { - subsume0Done = 1; - } - const bool subsume0IsFinished() { - return subsume0Done; - } - - Lit& operator [] (uint32_t i) { - return data[i]; - } - const Lit& operator [] (uint32_t i) const { - return data[i]; - } - - void setActivity(uint32_t i) { - extra.act = i; - } - - const uint32_t& activity () const { - return extra.act; - } - - void makeNonLearnt() { - assert(isLearnt); - isLearnt = false; - calcAbstractionClause(); - } - - void makeLearnt(const uint32_t newActivity) { - extra.act = newActivity; - oldActivityInter = 0; - isLearnt = true; - } - - inline void strengthen(const Lit p) - { - remove(*this, p); - sorted = false; - calcAbstractionClause(); - } - - void calcAbstractionClause() { - assert(!learnt()); - extra.abst = calcAbstraction(*this);; - } - - uint32_t getAbst() - { - if (learnt()) - return calcAbstraction(*this); - else - return extra.abst; - } - - const Lit* getData () const { - return data; - } - Lit* getData () { - return data; - } - const Lit* getDataEnd () const { - return data+size(); - } - Lit* getDataEnd () { - return data+size(); - } - void print(FILE* to = stdout) { - plainPrint(to); - fprintf(to, "c clause learnt %s group %d act %d oldAct %f\n", (learnt() ? "yes" : "no"), getGroup(), activity(), oldActivity()); - } - void plainPrint(FILE* to = stdout) const { - for (uint i = 0; i < size(); i++) { - if (data[i].sign()) fprintf(to, "-"); - fprintf(to, "%d ", data[i].var() + 1); - } - fprintf(to, "0\n"); - } - #ifdef STATS_NEEDED - const uint32_t getGroup() const - { - return group; - } - void setGroup(const uint32_t _group) - { - group = _group; - } - #else - const uint getGroup() const - { - return 0; - } - void setGroup(const uint32_t _group) - { - return; - } - #endif //STATS_NEEDED - void setRemoved() { - isRemoved = true; - } - - const bool removed() const { - return isRemoved; - } - - void setFreed() { - isFreed = true; - } - - const bool freed() const { - return isFreed; - } - - const bool wasBin() const { - return wasBinInternal; - } - - void setWasBin(const bool toSet) { - wasBinInternal = toSet; - } -}; - -class XorClause : public Clause -{ -protected: - // NOTE: This constructor cannot be used directly (doesn't allocate enough memory). - template - XorClause(const V& ps, const bool inverted, const uint _group) : - Clause(ps, _group, false) - { - invertedXor = inverted; - isXorClause = true; - calcXorAbstraction(); - } - -public: - friend class ClauseAllocator; - - inline bool xor_clause_inverted() const - { - return invertedXor; - } - inline void invert(bool b) - { - invertedXor ^= b; - } - void calcXorAbstraction() { - extra.abst = 0; - for (uint32_t i = 0; i != size(); i++) - extra.abst |= 1 << (data[i].var() & 31); - } - - void print() { - printf("XOR Clause group: %d, size: %d, learnt:%d, lits:\"", getGroup(), size(), learnt()); - plainPrint(); - } - - void plainPrint(FILE* to = stdout) const { - fprintf(to, "x"); - if (xor_clause_inverted()) - printf("-"); - for (uint i = 0; i < size(); i++) { - fprintf(to, "%d ", data[i].var() + 1); - } - fprintf(to, "0\n"); - } - - friend class MatrixFinder; -}; - -class WatchedBin { - public: - WatchedBin(Lit _impliedLit) : impliedLit(_impliedLit) {}; - Lit impliedLit; -}; - -class Watched { - public: - Watched(ClauseOffset _clause, Lit _blockedLit) : clause(_clause), blockedLit(_blockedLit) {}; - ClauseOffset clause; - Lit blockedLit; -}; - -}; //NAMESPACE MINISAT - -#endif //CLAUSE_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/ClauseAllocator.cpp b/src/vendor/stp/src/sat/cryptominisat2/ClauseAllocator.cpp deleted file mode 100644 index 99bfaed63..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/ClauseAllocator.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/*********************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -************************************************************************/ - -#include "ClauseAllocator.h" - -#include -#include -#include "assert.h" -#include "SolverTypes.h" -#include "Clause.h" -#include "Solver.h" -#include "time_mem.h" -#include "Subsumer.h" -#include "XorSubsumer.h" -//#include "VarReplacer.h" -#include "PartHandler.h" - -namespace MINISAT -{ -using namespace MINISAT; - -//#define DEBUG_CLAUSEALLOCATOR - -ClauseAllocator::ClauseAllocator() : - clausePoolBin(sizeof(Clause) + 2*sizeof(Lit)) -{} - -ClauseAllocator::~ClauseAllocator() -{ - for (uint32_t i = 0; i < dataStarts.size(); i++) { - free(dataStarts[i]); - } -} - -template -Clause* ClauseAllocator::Clause_new(const T& ps, const unsigned int group, const bool learnt) -{ - void* mem = allocEnough(ps.size()); - Clause* real= new (mem) Clause(ps, group, learnt); - //assert(!(ps.size() == 2 && !real->wasBin())); - - return real; -} -template Clause* ClauseAllocator::Clause_new(const vec& ps, const unsigned int group, const bool learnt); -template Clause* ClauseAllocator::Clause_new(const Clause& ps, const unsigned int group, const bool learnt); -template Clause* ClauseAllocator::Clause_new(const XorClause& ps, const unsigned int group, const bool learnt); - -template -XorClause* ClauseAllocator::XorClause_new(const T& ps, const bool inverted, const unsigned int group) -{ - void* mem = allocEnough(ps.size()); - XorClause* real= new (mem) XorClause(ps, inverted, group); - //assert(!(ps.size() == 2 && !real->wasBin())); - - return real; -} -template XorClause* ClauseAllocator::XorClause_new(const vec& ps, const bool inverted, const unsigned int group); -template XorClause* ClauseAllocator::XorClause_new(const XorClause& ps, const bool inverted, const unsigned int group); - -Clause* ClauseAllocator::Clause_new(Clause& c) -{ - void* mem = allocEnough(c.size()); - memcpy(mem, &c, sizeof(Clause)+sizeof(Lit)*c.size()); - Clause& c2 = *(Clause*)mem; - c2.setWasBin(c.size() == 2); - //assert(!(c.size() == 2 && !c2.wasBin())); - - return &c2; -} - -#define MIN_LIST_SIZE (300000 * (sizeof(Clause) + 4*sizeof(Lit))) - -void* ClauseAllocator::allocEnough(const uint32_t size) -{ - assert(sizes.size() == dataStarts.size()); - assert(maxSizes.size() == dataStarts.size()); - assert(origClauseSizes.size() == dataStarts.size()); - - assert(sizeof(Clause)%sizeof(uint32_t) == 0); - assert(sizeof(Lit)%sizeof(uint32_t) == 0); - - if (size == 2) { - return clausePoolBin.malloc(); - } - - uint32_t needed = sizeof(Clause)+sizeof(Lit)*size; - bool found = false; - uint32_t which = std::numeric_limits::max(); - for (uint32_t i = 0; i < sizes.size(); i++) { - if (sizes[i] + needed < maxSizes[i]) { - found = true; - which = i; - break; - } - } - - if (!found) { - #ifdef DEBUG_CLAUSEALLOCATOR - std::cout << "c New list in ClauseAllocator" << std::endl; - #endif //DEBUG_CLAUSEALLOCATOR - - uint32_t nextSize; //number of BYTES to allocate - if (maxSizes.size() != 0) - nextSize = maxSizes[maxSizes.size()-1]*3*sizeof(uint32_t); - else - nextSize = MIN_LIST_SIZE; - assert(needed < nextSize); - - uint32_t *dataStart = (uint32_t*)malloc(nextSize); - assert(dataStart != NULL); - dataStarts.push(dataStart); - sizes.push(0); - maxSizes.push(nextSize/sizeof(uint32_t)); - origClauseSizes.push(); - currentlyUsedSize.push(0); - which = dataStarts.size()-1; - } - #ifdef DEBUG_CLAUSEALLOCATOR - std::cout - << "selected list = " << which - << " size = " << sizes[which] - << " maxsize = " << maxSizes[which] - << " diff = " << maxSizes[which] - sizes[which] << std::endl; - #endif //DEBUG_CLAUSEALLOCATOR - - assert(which != std::numeric_limits::max()); - Clause* pointer = (Clause*)(dataStarts[which] + sizes[which]); - sizes[which] += needed/sizeof(uint32_t); - currentlyUsedSize[which] += needed/sizeof(uint32_t); - origClauseSizes[which].push(needed/sizeof(uint32_t)); - - return pointer; -} - -const ClauseOffset ClauseAllocator::getOffset(const Clause* ptr) const -{ - uint32_t outerOffset = getOuterOffset(ptr); - uint32_t interOffset = getInterOffset(ptr, outerOffset); - return combineOuterInterOffsets(outerOffset, interOffset); -} - -inline const ClauseOffset ClauseAllocator::combineOuterInterOffsets(const uint32_t outerOffset, const uint32_t interOffset) const -{ - return (outerOffset | (interOffset<<4)); -} - -inline uint32_t ClauseAllocator::getOuterOffset(const Clause* ptr) const -{ - uint32_t which = std::numeric_limits::max(); - for (uint32_t i = 0; i < sizes.size(); i++) { - if ((uint32_t*)ptr >= dataStarts[i] && (uint32_t*)ptr < dataStarts[i] + maxSizes[i]) - which = i; - } - assert(which != std::numeric_limits::max()); - - return which; -} - -inline uint32_t ClauseAllocator::getInterOffset(const Clause* ptr, uint32_t outerOffset) const -{ - return ((uint32_t*)ptr - dataStarts[outerOffset]); -} - -void ClauseAllocator::clauseFree(Clause* c) -{ - if (c->wasBin()) { - clausePoolBin.free(c); - } else { - c->setFreed(); - uint32_t outerOffset = getOuterOffset(c); - //uint32_t interOffset = getInterOffset(c, outerOffset); - currentlyUsedSize[outerOffset] -= (sizeof(Clause) + c->size()*sizeof(Lit))/sizeof(uint32_t); - //above should be - //origClauseSizes[outerOffset][interOffset] - //but it cannot be :( - } -} - -struct NewPointerAndOffset { - Clause* newPointer; - uint32_t newOffset; -}; - -void ClauseAllocator::consolidate(Solver* solver) -{ - double myTime = cpuTime(); - - //if (dataStarts.size() > 2) { - uint32_t sum = 0; - for (uint32_t i = 0; i < sizes.size(); i++) { - sum += currentlyUsedSize[i]; - } - uint32_t sumAlloc = 0; - for (uint32_t i = 0; i < sizes.size(); i++) { - sumAlloc += sizes[i]; - } - - #ifdef DEBUG_CLAUSEALLOCATOR - std::cout << "c ratio:" << (double)sum/(double)sumAlloc << std::endl; - #endif //DEBUG_CLAUSEALLOCATOR - - if ((double)sum/(double)sumAlloc > 0.7 /*&& sum > 10000000*/) { - if (solver->verbosity >= 2) { - std::cout << "c Not consolidating memory." << std::endl; - } - return; - } - - - uint32_t newMaxSize = std::max(sum*2*sizeof(uint32_t), MIN_LIST_SIZE); - uint32_t* newDataStarts = (uint32_t*)malloc(newMaxSize); - newMaxSize /= sizeof(uint32_t); - uint32_t newSize = 0; - vec newOrigClauseSizes; - //} - - map oldToNewPointer; - map oldToNewOffset; - - uint32_t* newDataStartsPointer = newDataStarts; - for (uint32_t i = 0; i < dataStarts.size(); i++) { - uint32_t currentLoc = 0; - for (uint32_t i2 = 0; i2 < origClauseSizes[i].size(); i2++) { - Clause* oldPointer = (Clause*)(dataStarts[i] + currentLoc); - if (!oldPointer->freed()) { - uint32_t sizeNeeded = sizeof(Clause) + oldPointer->size()*sizeof(Lit); - memcpy(newDataStartsPointer, dataStarts[i] + currentLoc, sizeNeeded); - - oldToNewPointer[oldPointer] = (Clause*)newDataStartsPointer; - oldToNewOffset[combineOuterInterOffsets(i, currentLoc)] = combineOuterInterOffsets(0, newSize); - - newSize += sizeNeeded/sizeof(uint32_t); - newOrigClauseSizes.push(sizeNeeded/sizeof(uint32_t)); - newDataStartsPointer += sizeNeeded/sizeof(uint32_t); - } - - currentLoc += origClauseSizes[i][i2]; - } - } - assert(newSize < newMaxSize); - assert(newSize <= newMaxSize/2); - - updateOffsets(solver->watches, oldToNewOffset); - updateOffsetsXor(solver->xorwatches, oldToNewOffset); - - updatePointers(solver->clauses, oldToNewPointer); - updatePointers(solver->learnts, oldToNewPointer); - updatePointers(solver->binaryClauses, oldToNewPointer); - updatePointers(solver->xorclauses, oldToNewPointer); - - //No need to update varreplacer, since it only stores binary clauses that - //must have been allocated such as to use the pool - //updatePointers(solver->varReplacer->clauses, oldToNewPointer); - updatePointers(solver->partHandler->clausesRemoved, oldToNewPointer); - updatePointers(solver->partHandler->xorClausesRemoved, oldToNewPointer); - for(map >::iterator it = solver->subsumer->elimedOutVar.begin(); it != solver->subsumer->elimedOutVar.end(); it++) { - updatePointers(it->second, oldToNewPointer); - } - for(map >::iterator it = solver->xorSubsumer->elimedOutVar.begin(); it != solver->xorSubsumer->elimedOutVar.end(); it++) { - updatePointers(it->second, oldToNewPointer); - } - - - vec& reason = solver->reason; - for (PropagatedFrom *it = reason.getData(), *end = reason.getDataEnd(); it != end; it++) { - if (!it->isBinary() && !it->isNULL()) { - /*if ((it == reason.getData() + (*it->getClause())[0].var()) - && (solver->value((*it->getClause())[0]) == l_True)) { - assert(oldToNewPointer.find(it->getClause()) != oldToNewPointer.end()); - *it = PropagatedFrom(oldToNewPointer[it->getClause()]); - } else { - *it = PropagatedFrom(); - }*/ - if (oldToNewPointer.find(it->getClause()) != oldToNewPointer.end()) { - *it = PropagatedFrom(oldToNewPointer[it->getClause()]); - } - } - } - - for (uint32_t i = 0; i < dataStarts.size(); i++) - free(dataStarts[i]); - - dataStarts.clear(); - maxSizes.clear(); - sizes.clear(); - origClauseSizes.clear(); - - dataStarts.push(newDataStarts); - maxSizes.push(newMaxSize); - sizes.push(newSize); - currentlyUsedSize.clear(); - currentlyUsedSize.push(newSize); - origClauseSizes.clear(); - origClauseSizes.push(); - newOrigClauseSizes.moveTo(origClauseSizes[0]); - - if (solver->verbosity >= 1) { - std::cout << "c Consolidated memory. Time: " - << cpuTime() - myTime << std::endl; - } -} - -template -void ClauseAllocator::updateOffsets(vec >& watches, const map& oldToNewOffset) -{ - for (uint32_t i = 0; i < watches.size(); i++) { - vec& list = watches[i]; - for (T *it = list.getData(), *end = list.getDataEnd(); it != end; it++) { - map::const_iterator it2 = oldToNewOffset.find(it->clause); - assert(it2 != oldToNewOffset.end()); - it->clause = it2->second; - } - } -} - -template -void ClauseAllocator::updateOffsetsXor(vec >& watches, const map& oldToNewOffset) -{ - for (uint32_t i = 0; i < watches.size(); i++) { - vec& list = watches[i]; - for (T *it = list.getData(), *end = list.getDataEnd(); it != end; it++) { - map::const_iterator it2 = oldToNewOffset.find(*it); - assert(it2 != oldToNewOffset.end()); - *it = it2->second; - } - } -} - -template -void ClauseAllocator::updatePointers(vec& toUpdate, const map& oldToNewPointer) -{ - for (T **it = toUpdate.getData(), **end = toUpdate.getDataEnd(); it != end; it++) { - if (!(*it)->wasBin()) { - //assert(oldToNewPointer.find((TT*)*it) != oldToNewPointer.end()); - map::const_iterator it2 = oldToNewPointer.find((Clause*)*it); - *it = (T*)it2->second; - } - } -} - -void ClauseAllocator::updatePointers(vector& toUpdate, const map& oldToNewPointer) -{ - for (vector::iterator it = toUpdate.begin(), end = toUpdate.end(); it != end; it++) { - if (!(*it)->wasBin()) { - //assert(oldToNewPointer.find((TT*)*it) != oldToNewPointer.end()); - map::const_iterator it2 = oldToNewPointer.find((Clause*)*it); - *it = it2->second; - } - } -} - -void ClauseAllocator::updatePointers(vector& toUpdate, const map& oldToNewPointer) -{ - for (vector::iterator it = toUpdate.begin(), end = toUpdate.end(); it != end; it++) { - if (!(*it)->wasBin()) { - //assert(oldToNewPointer.find((TT*)*it) != oldToNewPointer.end()); - map::const_iterator it2 = oldToNewPointer.find((Clause*)*it); - *it = (XorClause*)it2->second; - } - } -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/ClauseAllocator.h b/src/vendor/stp/src/sat/cryptominisat2/ClauseAllocator.h deleted file mode 100644 index 4bf378a91..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/ClauseAllocator.h +++ /dev/null @@ -1,96 +0,0 @@ -/*********************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -************************************************************************/ - -#ifndef CLAUSEALLOCATOR_H -#define CLAUSEALLOCATOR_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Vec.h" -#include -#include -#include -using std::map; -using std::vector; - -namespace MINISAT -{ -using namespace MINISAT; - -class Clause; -class XorClause; -class Solver; - -typedef uint32_t ClauseOffset; - -class ClauseAllocator { - public: - ClauseAllocator(); - ~ClauseAllocator(); - - template - Clause* Clause_new(const T& ps, const uint32_t group, const bool learnt = false); - template - XorClause* XorClause_new(const T& ps, const bool inverted, const uint32_t group); - Clause* Clause_new(Clause& c); - - const ClauseOffset getOffset(const Clause* ptr) const; - - inline Clause* getPointer(const uint32_t offset) - { - return (Clause*)(dataStarts[offset&15]+(offset>>4)); - } - - void clauseFree(Clause* c); - - void consolidate(Solver* solver); - - private: - uint32_t getOuterOffset(const Clause* c) const; - uint32_t getInterOffset(const Clause* c, const uint32_t outerOffset) const; - const ClauseOffset combineOuterInterOffsets(const uint32_t outerOffset, const uint32_t interOffset) const; - - template - void updatePointers(vec& toUpdate, const map& oldToNewPointer); - void updatePointers(vector& toUpdate, const map& oldToNewPointer); - void updatePointers(vector& toUpdate, const map& oldToNewPointer); - - template - void updateOffsets(vec >& watches, const map& oldToNewOffset); - template - void updateOffsetsXor(vec >& watches, const map& oldToNewOffset); - - vec dataStarts; - vec sizes; - vec > origClauseSizes; - vec maxSizes; - vec currentlyUsedSize; - vec origSizes; - - boost::pool<> clausePoolBin; - - void* allocEnough(const uint32_t size); -}; - -}; //NAMESPACE MINISAT - -#endif //CLAUSEALLOCATOR_H - diff --git a/src/vendor/stp/src/sat/cryptominisat2/ClauseCleaner.cpp b/src/vendor/stp/src/sat/cryptominisat2/ClauseCleaner.cpp deleted file mode 100644 index 65e01e9da..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/ClauseCleaner.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "ClauseCleaner.h" -#include "VarReplacer.h" - -#ifdef _MSC_VER -#define __builtin_prefetch(a,b,c) -#endif //_MSC_VER - -//#define DEBUG_CLEAN -//#define VERBOSE_DEBUG - -namespace MINISAT -{ -using namespace MINISAT; - -ClauseCleaner::ClauseCleaner(Solver& _solver) : - solver(_solver) -{ - for (uint i = 0; i < 6; i++) { - lastNumUnitarySat[i] = solver.get_unitary_learnts_num(); - lastNumUnitaryClean[i] = solver.get_unitary_learnts_num(); - } -} - -void ClauseCleaner::removeSatisfied(vec& cs, ClauseSetType type, const uint limit) -{ - #ifdef DEBUG_CLEAN - assert(solver.decisionLevel() == 0); - #endif - - if (lastNumUnitarySat[type] + limit >= solver.get_unitary_learnts_num()) - return; - - uint32_t i,j; - for (i = j = 0; i < cs.size(); i++) { - if (satisfied(*cs[i])) - solver.removeClause(*cs[i]); - else - cs[j++] = cs[i]; - } - cs.shrink(i - j); - - lastNumUnitarySat[type] = solver.get_unitary_learnts_num(); -} - -void ClauseCleaner::removeSatisfied(vec& cs, ClauseSetType type, const uint limit) -{ - #ifdef DEBUG_CLEAN - assert(solver.decisionLevel() == 0); - #endif - - if (lastNumUnitarySat[type] + limit >= solver.get_unitary_learnts_num()) - return; - - Clause **i,**j, **end; - for (i = j = cs.getData(), end = i + cs.size(); i != end; i++) { - if (i+1 != end) - __builtin_prefetch(*(i+1), 0, 0); - if (satisfied(**i)) - solver.removeClause(**i); - else - *j++ = *i; - } - cs.shrink(i - j); - - lastNumUnitarySat[type] = solver.get_unitary_learnts_num(); -} - -void ClauseCleaner::cleanClauses(vec& cs, ClauseSetType type, const uint limit) -{ - assert(solver.decisionLevel() == 0); - assert(solver.qhead == solver.trail.size()); - - if (lastNumUnitaryClean[type] + limit >= solver.get_unitary_learnts_num()) - return; - - #ifdef VERBOSE_DEBUG - std::cout << "Cleaning " << (type==binaryClauses ? "binaryClauses" : "normal clauses" ) << std::endl; - #endif //VERBOSE_DEBUG - - Clause **s, **ss, **end; - for (s = ss = cs.getData(), end = s + cs.size(); s != end;) { - if (s+1 != end) - __builtin_prefetch(*(s+1), 1, 0); - if (cleanClause(*s)) { - solver.clauseAllocator.clauseFree(*s); - s++; - } else if (type != ClauseCleaner::binaryClauses && (*s)->size() == 2) { - solver.binaryClauses.push(*s); - solver.becameBinary++; - s++; - } else { - *ss++ = *s++; - } - } - cs.shrink(s-ss); - - lastNumUnitaryClean[type] = solver.get_unitary_learnts_num(); - - #ifdef VERBOSE_DEBUG - cout << "cleanClauses(Clause) useful ?? Removed: " << s-ss << endl; - #endif -} - -inline const bool ClauseCleaner::cleanClause(Clause*& cc) -{ - Clause& c = *cc; - - Lit origLit1 = c[0]; - Lit origLit2 = c[1]; - uint32_t origSize = c.size(); - - Lit *i, *j, *end; - for (i = j = c.getData(), end = i + c.size(); i != end; i++) { - lbool val = solver.value(*i); - if (val == l_Undef) { - *j++ = *i; - continue; - } - - if (val == l_True) { - solver.detachModifiedClause(origLit1, origLit2, origSize, &c); - return true; - } - } - c.shrink(i-j); - - assert(c.size() != 1); - if (i != j) { - c.setStrenghtened(); - if (c.size() == 2) { - solver.detachModifiedClause(origLit1, origLit2, origSize, &c); - Clause *c2 = solver.clauseAllocator.Clause_new(c); - solver.clauseAllocator.clauseFree(&c); - cc = c2; - solver.attachClause(*c2); - } else { - if (c.learnt()) - solver.learnts_literals -= i-j; - else - solver.clauses_literals -= i-j; - } - } - - return false; -} - -void ClauseCleaner::cleanClauses(vec& cs, ClauseSetType type, const uint limit) -{ - assert(solver.decisionLevel() == 0); - assert(solver.qhead == solver.trail.size()); - - if (lastNumUnitaryClean[type] + limit >= solver.get_unitary_learnts_num()) - return; - - XorClause **s, **ss, **end; - for (s = ss = cs.getData(), end = s + cs.size(); s != end; s++) { - if (s+1 != end) - __builtin_prefetch(*(s+1), 1, 0); - - #ifdef DEBUG_ATTACH - assert(find(solver.xorwatches[(**s)[0].var()], *s)); - assert(find(solver.xorwatches[(**s)[1].var()], *s)); - if (solver.assigns[(**s)[0].var()]!=l_Undef || solver.assigns[(**s)[1].var()]!=l_Undef) { - satisfied(**s); - } - #endif //DEBUG_ATTACH - - if (cleanClause(**s)) { - solver.freeLater.push(*s); - (*s)->setRemoved(); - } else { - #ifdef DEBUG_ATTACH - assert(find(solver.xorwatches[(**s)[0].var()], *s)); - assert(find(solver.xorwatches[(**s)[1].var()], *s)); - #endif //DEBUG_ATTACH - *ss++ = *s; - } - } - cs.shrink(s-ss); - - lastNumUnitaryClean[type] = solver.get_unitary_learnts_num(); - - #ifdef VERBOSE_DEBUG - cout << "cleanClauses(XorClause) useful: ?? Removed: " << s-ss << endl; - #endif -} - -inline const bool ClauseCleaner::cleanClause(XorClause& c) -{ - Lit *i, *j, *end; - Var origVar1 = c[0].var(); - Var origVar2 = c[1].var(); - uint32_t origSize = c.size(); - for (i = j = c.getData(), end = i + c.size(); i != end; i++) { - const lbool& val = solver.assigns[i->var()]; - if (val.isUndef()) { - *j = *i; - j++; - } else c.invert(val.getBool()); - } - c.shrink(i-j); - - assert(c.size() != 1); - switch (c.size()) { - case 0: { - solver.detachModifiedClause(origVar1, origVar2, origSize, &c); - return true; - } - case 2: { - c[0] = c[0].unsign(); - c[1] = c[1].unsign(); - solver.varReplacer->replace(c, c.xor_clause_inverted(), c.getGroup()); - solver.detachModifiedClause(origVar1, origVar2, origSize, &c); - return true; - } - default: { - if (i-j > 0) { - c.setStrenghtened(); - solver.clauses_literals -= i-j; - } - return false; - } - } - - assert(false); - return false; -} - -void ClauseCleaner::cleanClausesBewareNULL(vec& cs, ClauseCleaner::ClauseSetType type, Subsumer& subs, const uint limit) -{ - assert(solver.decisionLevel() == 0); - assert(solver.qhead == solver.trail.size()); - - if (lastNumUnitaryClean[type] + limit >= solver.get_unitary_learnts_num()) - return; - - ClauseSimp *s, *end; - for (s = cs.getData(), end = s + cs.size(); s != end; s++) { - if (s+1 != end) - __builtin_prefetch((s+1)->clause, 1, 0); - if (s->clause == NULL) - continue; - - if (cleanClauseBewareNULL(*s, subs)) { - continue; - } else if (s->clause->size() == 2) - solver.becameBinary++; - } - - lastNumUnitaryClean[type] = solver.get_unitary_learnts_num(); -} - -inline const bool ClauseCleaner::cleanClauseBewareNULL(ClauseSimp cc, Subsumer& subs) -{ - Clause& c = *cc.clause; - vec origClause(c.size()); - memcpy(origClause.getData(), c.getData(), sizeof(Lit)*c.size()); - - Lit *i, *j, *end; - for (i = j = c.getData(), end = i + c.size(); i != end; i++) { - lbool val = solver.value(*i); - if (val == l_Undef) { - *j++ = *i; - continue; - } - - if (val == l_True) { - subs.unlinkModifiedClause(origClause, cc, true); - solver.clauseAllocator.clauseFree(cc.clause); - return true; - } - } - - if (i != j) { - c.setStrenghtened(); - if (origClause.size() > 2 && origClause.size()-(i-j) == 2) { - subs.unlinkModifiedClause(origClause, cc, true); - subs.clauses[cc.index] = cc; - c.shrink(i-j); - solver.attachClause(c); - subs.linkInAlreadyClause(cc); - } else { - c.shrink(i-j); - subs.unlinkModifiedClause(origClause, cc, false); - subs.linkInAlreadyClause(cc); - if (c.learnt()) - solver.learnts_literals -= i-j; - else - solver.clauses_literals -= i-j; - } - if (!c.learnt()) c.calcAbstractionClause(); - subs.updateClause(cc); - } - - return false; -} - -void ClauseCleaner::cleanXorClausesBewareNULL(vec& cs, ClauseCleaner::ClauseSetType type, XorSubsumer& subs, const uint limit) -{ - assert(solver.decisionLevel() == 0); - assert(solver.qhead == solver.trail.size()); - - if (lastNumUnitaryClean[type] + limit >= solver.get_unitary_learnts_num()) - return; - - XorClauseSimp *s, *end; - for (s = cs.getData(), end = s + cs.size(); s != end; s++) { - if (s+1 != end) - __builtin_prefetch((s+1)->clause, 1, 0); - if (s->clause == NULL) - continue; - - cleanXorClauseBewareNULL(*s, subs); - } - - lastNumUnitaryClean[type] = solver.get_unitary_learnts_num(); -} - -inline const bool ClauseCleaner::cleanXorClauseBewareNULL(XorClauseSimp cc, XorSubsumer& subs) -{ - XorClause& c = *cc.clause; - vec origClause(c.size()); - memcpy(origClause.getData(), c.getData(), sizeof(Lit)*c.size()); - - Lit *i, *j, *end; - for (i = j = c.getData(), end = i + c.size(); i != end; i++) { - const lbool& val = solver.assigns[i->var()]; - if (val.isUndef()) { - *j = *i; - j++; - } else c.invert(val.getBool()); - } - c.shrink(i-j); - - switch(c.size()) { - case 0: { - subs.unlinkModifiedClause(origClause, cc); - solver.clauseAllocator.clauseFree(cc.clause); - return true; - } - case 2: { - vec ps(2); - ps[0] = c[0].unsign(); - ps[1] = c[1].unsign(); - solver.varReplacer->replace(ps, c.xor_clause_inverted(), c.getGroup()); - subs.unlinkModifiedClause(origClause, cc); - solver.clauseAllocator.clauseFree(cc.clause); - return true; - } - default: - if (i-j > 0) { - subs.unlinkModifiedClauseNoDetachNoNULL(origClause, cc); - subs.linkInAlreadyClause(cc); - c.calcXorAbstraction(); - } - } - - return false; -} - -bool ClauseCleaner::satisfied(const Clause& c) const -{ - for (uint i = 0; i != c.size(); i++) - if (solver.value(c[i]) == l_True) - return true; - return false; -} - -bool ClauseCleaner::satisfied(const XorClause& c) const -{ - bool final = c.xor_clause_inverted(); - for (uint k = 0; k != c.size(); k++ ) { - const lbool& val = solver.assigns[c[k].var()]; - if (val.isUndef()) return false; - final ^= val.getBool(); - } - return final; -} - -void ClauseCleaner::moveBinClausesToBinClauses() -{ - assert(solver.decisionLevel() == 0); - assert(solver.qhead == solver.trail.size()); - - vec& cs = solver.clauses; - Clause **s, **ss, **end; - for (s = ss = cs.getData(), end = s + cs.size(); s != end; s++) { - if (s+1 != end) - __builtin_prefetch(*(s+1), 1, 0); - - if ((**s).size() == 2) { - solver.detachClause(**s); - Clause *c2 = solver.clauseAllocator.Clause_new(**s); - solver.clauseAllocator.clauseFree(*s); - solver.attachClause(*c2); - solver.becameBinary++; - solver.binaryClauses.push(c2); - } else - *ss++ = *s; - } - cs.shrink(s-ss); -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/ClauseCleaner.h b/src/vendor/stp/src/sat/cryptominisat2/ClauseCleaner.h deleted file mode 100644 index d4c2adfc8..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/ClauseCleaner.h +++ /dev/null @@ -1,81 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef CLAUSECLEANER_H -#define CLAUSECLEANER_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Solver.h" -#include "Subsumer.h" -#include "XorSubsumer.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class ClauseCleaner -{ - public: - ClauseCleaner(Solver& solver); - - enum ClauseSetType {clauses, xorclauses, learnts, binaryClauses, simpClauses, xorSimpClauses}; - - void cleanClauses(vec& cs, ClauseSetType type, const uint limit = 0); - void cleanClausesBewareNULL(vec& cs, ClauseSetType type, Subsumer& subs, const uint limit = 0); - void cleanXorClausesBewareNULL(vec& cs, ClauseSetType type, XorSubsumer& subs, const uint limit = 0); - const bool cleanClauseBewareNULL(ClauseSimp c, Subsumer& subs); - const bool cleanXorClauseBewareNULL(XorClauseSimp c, XorSubsumer& subs); - - void cleanClauses(vec& cs, ClauseSetType type, const uint limit = 0); - void removeSatisfied(vec& cs, ClauseSetType type, const uint limit = 0); - void removeSatisfied(vec& cs, ClauseSetType type, const uint limit = 0); - void removeAndCleanAll(const bool nolimit = false); - bool satisfied(const Clause& c) const; - bool satisfied(const XorClause& c) const; - - void moveBinClausesToBinClauses(); - - private: - const bool cleanClause(XorClause& c); - const bool cleanClause(Clause*& c); - - uint lastNumUnitarySat[6]; - uint lastNumUnitaryClean[6]; - - Solver& solver; -}; - -inline void ClauseCleaner::removeAndCleanAll(const bool nolimit) -{ - //uint limit = std::min((uint)((double)solver.order_heap.size() * PERCENTAGECLEANCLAUSES), FIXCLEANREPLACE); - uint limit = (double)solver.order_heap.size() * PERCENTAGECLEANCLAUSES; - if (nolimit) limit = 0; - - removeSatisfied(solver.binaryClauses, ClauseCleaner::binaryClauses, limit); - cleanClauses(solver.clauses, ClauseCleaner::clauses, limit); - cleanClauses(solver.xorclauses, ClauseCleaner::xorclauses, limit); - cleanClauses(solver.learnts, ClauseCleaner::learnts, limit); -} - -}; //NAMESPACE MINISAT - -#endif //CLAUSECLEANER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/DoublePackedRow.h b/src/vendor/stp/src/sat/cryptominisat2/DoublePackedRow.h deleted file mode 100644 index 50cfd8aee..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/DoublePackedRow.h +++ /dev/null @@ -1,173 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef DOUBLEPACKEDROW_H -#define DOUBLEPACKEDROW_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include - -#include "SolverTypes.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class DoublePackedRow -{ - private: - class BitIter { - public: - inline void operator=(const lbool toSet) - { - val &= ~((unsigned char)3 << offset); - val |= toSet.value << offset; - } - - inline operator lbool() const - { - return lbool((val >> offset) & 3); - } - - inline const bool isUndef() const { - return ((lbool)*this).isUndef(); - } - inline const bool isDef() const { - return ((lbool)*this).isDef(); - } - inline const bool getBool() const { - return ((lbool)*this).getBool(); - } - inline const bool operator==(lbool b) const { - return ((lbool)*this) == b; - } - inline const bool operator!=(lbool b) const { - return ((lbool)*this) != b; - } - const lbool operator^(const bool b) const { - return ((lbool)*this) ^ b; - } - - private: - friend class DoublePackedRow; - inline BitIter(unsigned char& mp, const uint32_t _offset) : - val(mp) - , offset(_offset) - {} - - unsigned char& val; - const uint32_t offset; - }; - - class BitIterConst { - public: - inline operator lbool() const - { - return lbool((val >> offset) & 3); - } - - inline const bool isUndef() const { - return ((lbool)*this).isUndef(); - } - inline const bool isDef() const { - return ((lbool)*this).isDef(); - } - inline const bool getBool() const { - return ((lbool)*this).getBool(); - } - inline const bool operator==(lbool b) const { - return ((lbool)*this) == b; - } - inline const bool operator!=(lbool b) const { - return ((lbool)*this) != b; - } - const lbool operator^(const bool b) const { - return ((lbool)*this) ^ b; - } - - - private: - friend class DoublePackedRow; - inline BitIterConst(unsigned char& mp, const uint32_t _offset) : - val(mp) - , offset(_offset) - {} - - const unsigned char& val; - const uint32_t offset; - }; - - public: - DoublePackedRow() : - numElems(0) - , mp(NULL) - {} - - uint32_t size() const - { - return numElems; - } - - void growTo(const uint32_t newNumElems) - { - uint32_t oldSize = numElems/4 + (bool)(numElems % 4); - uint32_t newSize = newNumElems/4 + (bool)(newNumElems % 4); - - if (oldSize >= newSize) { - numElems = std::max(newNumElems, numElems); - return; - } - - mp = (unsigned char*)realloc(mp, newSize*sizeof(unsigned char)); - numElems = newNumElems; - } - - inline BitIter operator[](const uint32_t at) - { - return BitIter(mp[at/4], (at%4)*2); - } - - inline const BitIterConst operator[](const uint32_t at) const - { - return BitIterConst(mp[at/4], (at%4)*2); - } - - inline void push(const lbool val) - { - growTo(numElems+1); - (*this)[numElems-1] = val; - } - - /*void clear(const uint32_t at) - { - mp[at/32] &= ~((uint64_t)3 << ((at%32)*2)); - }*/ - - private: - - Var numElems; - unsigned char *mp; -}; - -}; //NAMESPACE MINISAT - -#endif //DOUBLEPACKEDROW_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/FailedVarSearcher.cpp b/src/vendor/stp/src/sat/cryptominisat2/FailedVarSearcher.cpp deleted file mode 100644 index 0b98a1202..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/FailedVarSearcher.cpp +++ /dev/null @@ -1,765 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "FailedVarSearcher.h" - -#include -#include -#include -using std::make_pair; -using std::set; - -#include "Solver.h" -#include "ClauseCleaner.h" -#include "time_mem.h" -#include "VarReplacer.h" -#include "ClauseCleaner.h" -#include "StateSaver.h" - -#ifdef _MSC_VER -#define __builtin_prefetch(a,b,c) -#endif //_MSC_VER - -//#define VERBOSE_DEUBUG - -namespace MINISAT -{ -using namespace MINISAT; - -FailedVarSearcher::FailedVarSearcher(Solver& _solver): - solver(_solver) - , tmpPs(2) - , finishedLastTimeVar(true) - , lastTimeWentUntilVar(0) - , finishedLastTimeBin(true) - , lastTimeWentUntilBin(0) - , numPropsMultiplier(1.0) - , lastTimeFoundTruths(0) - , numCalls(0) -{ -} - -void FailedVarSearcher::addFromSolver(const vec< XorClause* >& cs) -{ - xorClauseSizes.clear(); - xorClauseSizes.growTo(cs.size()); - occur.resize(solver.nVars()); - for (Var var = 0; var < solver.nVars(); var++) { - occur[var].clear(); - } - - uint32_t i = 0; - for (XorClause * const*it = cs.getData(), * const*end = it + cs.size(); it != end; it++, i++) { - if (it+1 != end) - __builtin_prefetch(*(it+1), 0, 0); - - const XorClause& cl = **it; - xorClauseSizes[i] = cl.size(); - for (const Lit *l = cl.getData(), *end2 = l + cl.size(); l != end2; l++) { - occur[l->var()].push_back(i); - } - } -} - -inline void FailedVarSearcher::removeVarFromXors(const Var var) -{ - vector& occ = occur[var]; - if (occ.empty()) return; - - for (uint32_t *it = &occ[0], *end = it + occ.size(); it != end; it++) { - xorClauseSizes[*it]--; - if (!xorClauseTouched[*it]) { - xorClauseTouched.setBit(*it); - investigateXor.push(*it); - } - } -} - -inline void FailedVarSearcher::addVarFromXors(const Var var) -{ - vector& occ = occur[var]; - if (occ.empty()) return; - - for (uint32_t *it = &occ[0], *end = it + occ.size(); it != end; it++) { - xorClauseSizes[*it]++; - } -} - -const TwoLongXor FailedVarSearcher::getTwoLongXor(const XorClause& c) -{ - TwoLongXor tmp; - uint32_t num = 0; - tmp.inverted = c.xor_clause_inverted(); - - for(const Lit *l = c.getData(), *end = l + c.size(); l != end; l++) { - if (solver.assigns[l->var()] == l_Undef) { - assert(num < 2); - tmp.var[num] = l->var(); - num++; - } else { - tmp.inverted ^= (solver.assigns[l->var()] == l_True); - } - } - - #ifdef VERBOSE_DEUBUG - if (num != 2) { - std::cout << "Num:" << num << std::endl; - c.plainPrint(); - } - #endif - - std::sort(&tmp.var[0], &tmp.var[0]+2); - assert(num == 2); - return tmp; -} - -const bool FailedVarSearcher::search(uint64_t numProps) -{ - assert(solver.decisionLevel() == 0); - solver.testAllClauseAttach(); - double myTime = cpuTime(); - uint32_t origHeapSize = solver.order_heap.size(); - StateSaver savedState(solver); - Heap order_heap_copy(solver.order_heap); //for hyperbin - uint64_t origBinClauses = solver.binaryClauses.size(); - - //General Stats - numFailed = 0; - goodBothSame = 0; - numCalls++; - - //If failed var searching is going good, do successively more and more of it - if (lastTimeFoundTruths > 500 || (double)lastTimeFoundTruths > (double)solver.order_heap.size() * 0.03) std::max(numPropsMultiplier*1.7, 5.0); - else numPropsMultiplier = 1.0; - numProps = (uint64_t) ((double)numProps * numPropsMultiplier *3); - - //For BothSame - propagated.resize(solver.nVars(), 0); - propValue.resize(solver.nVars(), 0); - - //For calculating how many variables have really been set - origTrailSize = solver.trail.size(); - - //For 2-long xor (rule 6 of Equivalent literal propagation in the DLL procedure by Chu-Min Li) - toReplaceBefore = solver.varReplacer->getNewToReplaceVars(); - lastTrailSize = solver.trail.size(); - binXorFind = true; - twoLongXors.clear(); - if (solver.xorclauses.size() < 5 || - solver.xorclauses.size() > 30000 || - solver.order_heap.size() > 30000 || - solver.nClauses() > 100000) - binXorFind = false; - if (binXorFind) { - solver.clauseCleaner->cleanClauses(solver.xorclauses, ClauseCleaner::xorclauses); - addFromSolver(solver.xorclauses); - } - xorClauseTouched.resize(solver.xorclauses.size(), 0); - newBinXor = 0; - - //For 2-long xor through Le Berre paper - bothInvert = 0; - - //For HyperBin - unPropagatedBin.resize(solver.nVars(), 0); - myimplies.resize(solver.nVars(), 0); - hyperbinProps = 0; - if (solver.addExtraBins && !orderLits()) return false; - maxHyperBinProps = numProps/8; - - //uint32_t fromBin; - uint32_t fromVar; - if (finishedLastTimeVar || lastTimeWentUntilVar >= solver.nVars()) - fromVar = 0; - else - fromVar = lastTimeWentUntilVar; - finishedLastTimeVar = true; - lastTimeWentUntilVar = solver.nVars(); - origProps = solver.propagations; - for (Var var = fromVar; var < solver.nVars(); var++) { - if (solver.assigns[var] != l_Undef || !solver.decision_var[var]) - continue; - if (solver.propagations - origProps >= numProps) { - finishedLastTimeVar = false; - lastTimeWentUntilVar = var; - break; - } - if (!tryBoth(Lit(var, false), Lit(var, true))) - goto end; - } - - numProps = (double)numProps * 1.2; - hyperbinProps = 0; - while (!order_heap_copy.empty()) { - Var var = order_heap_copy.removeMin(); - if (solver.assigns[var] != l_Undef || !solver.decision_var[var]) - continue; - if (solver.propagations - origProps >= numProps) { - finishedLastTimeVar = false; - lastTimeWentUntilVar = var; - break; - } - if (!tryBoth(Lit(var, false), Lit(var, true))) - goto end; - } - - /*if (solver.verbosity >= 1) printResults(myTime); - if (finishedLastTimeBin || lastTimeWentUntilBin >= solver.binaryClauses.size()) - fromBin = 0; - else - fromBin = lastTimeWentUntilBin; - finishedLastTimeBin = true; - lastTimeWentUntilBin = solver.nVars(); - for (uint32_t binCl = 0; binCl < solver.binaryClauses.size(); binCl++) { - if ((double)(solver.propagations - origProps) >= 1.1*(double)numProps) { - finishedLastTimeBin = false; - lastTimeWentUntilBin = binCl; - break; - } - - Clause& cl = *solver.binaryClauses[binCl]; - if (solver.value(cl[0]) == l_Undef && solver.value(cl[1]) == l_Undef) { - if (!tryBoth(cl[0], cl[1])) - goto end; - } - }*/ - - /*for (Clause **it = solver.clauses.getData(), **end = solver.clauses.getDataEnd(); it != end; it++) { - Clause& c = **it; - for (uint i = 0; i < c.size(); i++) { - if (solver.value(c[i]) != l_Undef) goto next; - } - if (!tryAll(c.getData(), c.getDataEnd())) - goto end; - - next:; - } - - for (Clause **it = solver.learnts.getData(), **end = solver.learnts.getDataEnd(); it != end; it++) { - Clause& c = **it; - for (uint i = 0; i < c.size(); i++) { - if (solver.value(c[i]) != l_Undef) goto next2; - } - if (!tryAll(c.getData(), c.getDataEnd())) - goto end; - - next2:; - }*/ - -end: - bool removedOldLearnts = false; - binClauseAdded = solver.binaryClauses.size() - origBinClauses; - //Print results - if (solver.verbosity >= 1) printResults(myTime); - - solver.order_heap.filter(Solver::VarFilter(solver)); - - if (solver.ok && (numFailed || goodBothSame)) { - double time = cpuTime(); - if ((int)origHeapSize - (int)solver.order_heap.size() > (int)origHeapSize/15 && solver.nClauses() + solver.learnts.size() > 500000) { - completelyDetachAndReattach(); - removedOldLearnts = true; - } else { - solver.clauseCleaner->removeAndCleanAll(); - } - if (solver.verbosity >= 1 && numFailed + goodBothSame > 100) { - std::cout << "c | Cleaning up after failed var search: " << std::setw(8) << std::fixed << std::setprecision(2) << cpuTime() - time << " s " - << std::setw(39) << " | " << std::endl; - } - } - - lastTimeFoundTruths = solver.trail.size() - origTrailSize; - - savedState.restore(); - - solver.testAllClauseAttach(); - return solver.ok; -} - -void FailedVarSearcher::completelyDetachAndReattach() -{ - solver.clauses_literals = 0; - solver.learnts_literals = 0; - for (uint32_t i = 0; i < solver.nVars(); i++) { - solver.binwatches[i*2].clear(); - solver.binwatches[i*2+1].clear(); - solver.watches[i*2].clear(); - solver.watches[i*2+1].clear(); - solver.xorwatches[i].clear(); - } - solver.varReplacer->reattachInternalClauses(); - cleanAndAttachClauses(solver.binaryClauses); - cleanAndAttachClauses(solver.clauses); - cleanAndAttachClauses(solver.learnts); - cleanAndAttachClauses(solver.xorclauses); -} - -void FailedVarSearcher::printResults(const double myTime) const -{ - std::cout << "c | Flit: "<< std::setw(5) << numFailed << - " Blit: " << std::setw(6) << goodBothSame << - " bXBeca: " << std::setw(4) << newBinXor << - " bXProp: " << std::setw(4) << bothInvert << - " Bins:" << std::setw(7) << binClauseAdded << - " P: " << std::setw(4) << std::fixed << std::setprecision(1) << (double)(solver.propagations - origProps)/1000000.0 << "M" - " T: " << std::setw(5) << std::fixed << std::setprecision(2) << cpuTime() - myTime << - std::setw(5) << " |" << std::endl; -} - -const bool FailedVarSearcher::orderLits() -{ - uint64_t oldProps = solver.propagations; - double myTime = cpuTime(); - uint32_t numChecked = 0; - if (litDegrees.size() != solver.nVars()) - litDegrees.resize(solver.nVars()*2, 0); - BitArray alreadyTested; - alreadyTested.resize(solver.nVars()*2, 0); - uint32_t i; - - for (i = 0; i < 3*solver.order_heap.size(); i++) { - if (solver.propagations - oldProps > 1500000) break; - Var var = solver.order_heap[solver.mtrand.randInt(solver.order_heap.size()-1)]; - if (solver.assigns[var] != l_Undef || !solver.decision_var[var]) continue; - - Lit randLit(var, solver.mtrand.randInt(1)); - if (alreadyTested[randLit.toInt()]) continue; - alreadyTested.setBit(randLit.toInt()); - - numChecked++; - solver.newDecisionLevel(); - solver.uncheckedEnqueueLight(randLit); - failed = (!solver.propagateBin().isNULL()); - if (failed) { - solver.cancelUntil(0); - solver.uncheckedEnqueue(~randLit); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) return false; - continue; - } - assert(solver.decisionLevel() > 0); - for (int c = solver.trail.size()-1; c > (int)solver.trail_lim[0]; c--) { - Lit x = solver.trail[c]; - litDegrees[x.toInt()]++; - } - solver.cancelUntil(0); - } - if (solver.verbosity >= 1) { - std::cout << "c binary deg approx." - << " time: " << std::fixed << std::setw(5) << std::setprecision(2) << cpuTime() - myTime << " s" - << " num checked: " << std::setw(6) << numChecked - << " i: " << std::setw(7) << i - << " props: " << std::setw(4) << (solver.propagations - oldProps)/1000 << "k" - << std::setw(13) << " |" << std::endl; - } - solver.propagations = oldProps; - - return true; -} - -const bool FailedVarSearcher::tryBoth(const Lit lit1, const Lit lit2) -{ - if (binXorFind) { - if (lastTrailSize < solver.trail.size()) { - for (uint32_t i = lastTrailSize; i != solver.trail.size(); i++) { - removeVarFromXors(solver.trail[i].var()); - } - } - lastTrailSize = solver.trail.size(); - xorClauseTouched.setZero(); - investigateXor.clear(); - } - - propagated.setZero(); - twoLongXors.clear(); - propagatedVars.clear(); - unPropagatedBin.setZero(); - bothSame.clear(); - - solver.newDecisionLevel(); - solver.uncheckedEnqueueLight(lit1); - failed = (!solver.propagate().isNULL()); - if (failed) { - solver.cancelUntil(0); - numFailed++; - solver.uncheckedEnqueue(~lit1); - solver.ok = (solver.propagate(false).isNULL()); - if (!solver.ok) return false; - return true; - } else { - assert(solver.decisionLevel() > 0); - for (int c = solver.trail.size()-1; c >= (int)solver.trail_lim[0]; c--) { - Var x = solver.trail[c].var(); - propagated.setBit(x); - if (solver.addExtraBins) { - unPropagatedBin.setBit(x); - propagatedVars.push(x); - } - if (solver.assigns[x].getBool()) propValue.setBit(x); - else propValue.clearBit(x); - - if (binXorFind) removeVarFromXors(x); - } - - if (binXorFind) { - for (uint32_t *it = investigateXor.getData(), *end = investigateXor.getDataEnd(); it != end; it++) { - if (xorClauseSizes[*it] == 2) - twoLongXors.insert(getTwoLongXor(*solver.xorclauses[*it])); - } - for (int c = solver.trail.size()-1; c >= (int)solver.trail_lim[0]; c--) { - addVarFromXors(solver.trail[c].var()); - } - xorClauseTouched.setZero(); - investigateXor.clear(); - } - - solver.cancelUntil(0); - } - - if (solver.addExtraBins && hyperbinProps < maxHyperBinProps) addBinClauses(lit1); - propagatedVars.clear(); - unPropagatedBin.setZero(); - - solver.newDecisionLevel(); - solver.uncheckedEnqueueLight(lit2); - failed = (!solver.propagate().isNULL()); - if (failed) { - solver.cancelUntil(0); - numFailed++; - solver.uncheckedEnqueue(~lit2); - solver.ok = (solver.propagate(false).isNULL()); - if (!solver.ok) return false; - return true; - } else { - assert(solver.decisionLevel() > 0); - for (int c = solver.trail.size()-1; c >= (int)solver.trail_lim[0]; c--) { - Var x = solver.trail[c].var(); - if (propagated[x]) { - if (solver.addExtraBins) { - unPropagatedBin.setBit(x); - propagatedVars.push(x); - } - if (propValue[x] == solver.assigns[x].getBool()) { - //they both imply the same - bothSame.push(Lit(x, !propValue[x])); - } else if (c != (int)solver.trail_lim[0]) { - bool invert; - if (lit1.var() == lit2.var()) { - assert(lit1.sign() == false && lit2.sign() == true); - tmpPs[0] = Lit(lit1.var(), false); - tmpPs[1] = Lit(x, false); - invert = propValue[x]; - } else { - tmpPs[0] = Lit(lit1.var(), false); - tmpPs[1] = Lit(lit2.var(), false); - invert = lit1.sign() ^ lit2.sign(); - } - if (!solver.varReplacer->replace(tmpPs, invert, 0)) - return false; - bothInvert += solver.varReplacer->getNewToReplaceVars() - toReplaceBefore; - toReplaceBefore = solver.varReplacer->getNewToReplaceVars(); - } - } - if (solver.assigns[x].getBool()) propValue.setBit(x); - else propValue.clearBit(x); - if (binXorFind) removeVarFromXors(x); - } - - if (binXorFind) { - if (twoLongXors.size() > 0) { - for (uint32_t *it = investigateXor.getData(), *end = it + investigateXor.size(); it != end; it++) { - if (xorClauseSizes[*it] == 2) { - TwoLongXor tmp = getTwoLongXor(*solver.xorclauses[*it]); - if (twoLongXors.find(tmp) != twoLongXors.end()) { - tmpPs[0] = Lit(tmp.var[0], false); - tmpPs[1] = Lit(tmp.var[1], false); - if (!solver.varReplacer->replace(tmpPs, tmp.inverted, solver.xorclauses[*it]->getGroup())) - return false; - newBinXor += solver.varReplacer->getNewToReplaceVars() - toReplaceBefore; - toReplaceBefore = solver.varReplacer->getNewToReplaceVars(); - } - } - } - } - for (int c = solver.trail.size()-1; c >= (int)solver.trail_lim[0]; c--) { - addVarFromXors(solver.trail[c].var()); - } - } - - solver.cancelUntil(0); - } - - if (solver.addExtraBins && hyperbinProps < maxHyperBinProps) addBinClauses(lit2); - - for(uint32_t i = 0; i != bothSame.size(); i++) { - solver.uncheckedEnqueue(bothSame[i]); - } - goodBothSame += bothSame.size(); - solver.ok = (solver.propagate(false).isNULL()); - if (!solver.ok) return false; - - return true; -} - -struct litOrder -{ - litOrder(const vector& _litDegrees) : - litDegrees(_litDegrees) - {} - - bool operator () (const Lit& x, const Lit& y) { - return litDegrees[x.toInt()] > litDegrees[y.toInt()]; - } - - const vector& litDegrees; -}; - -void FailedVarSearcher::addBinClauses(const Lit& lit) -{ - uint64_t oldProps = solver.propagations; - #ifdef VERBOSE_DEBUG - std::cout << "Checking one BTC vs UP" << std::endl; - #endif //VERBOSE_DEBUG - vec toVisit; - - solver.newDecisionLevel(); - solver.uncheckedEnqueueLight(lit); - failed = (!solver.propagateBin().isNULL()); - assert(!failed); - - assert(solver.decisionLevel() > 0); - if (propagatedVars.size() - (solver.trail.size()-solver.trail_lim[0]) == 0) { - solver.cancelUntil(0); - goto end; - } - for (int c = solver.trail.size()-1; c >= (int)solver.trail_lim[0]; c--) { - Lit x = solver.trail[c]; - unPropagatedBin.clearBit(x.var()); - toVisit.push(x); - } - solver.cancelUntil(0); - - std::sort(toVisit.getData(), toVisit.getDataEnd(), litOrder(litDegrees)); - /************************* - //To check that the ordering is the right way - // --> i.e. to avoid mistake present in Glucose's ordering - for (uint32_t i = 0; i < toVisit.size(); i++) { - std::cout << "i:" << std::setw(8) << i << " degree:" << litDegrees[toVisit[i].toInt()] << std::endl; - } - std::cout << std::endl; - ***************************/ - - //difference between UP and BTC is in unPropagatedBin - for (Lit *l = toVisit.getData(), *end = toVisit.getDataEnd(); l != end; l++) { - #ifdef VERBOSE_DEBUG - std::cout << "Checking visit level " << end-l-1 << std::endl; - uint32_t thisLevel = 0; - #endif //VERBOSE_DEBUG - fillImplies(*l); - if (unPropagatedBin.nothingInCommon(myimplies)) goto next; - for (const Var *var = propagatedVars.getData(), *end2 = propagatedVars.getDataEnd(); var != end2; var++) { - if (unPropagatedBin[*var] && myimplies[*var]) { - #ifdef VERBOSE_DEBUG - thisLevel++; - #endif //VERBOSE_DEBUG - addBin(~*l, Lit(*var, !propValue[*var])); - unPropagatedBin.removeThese(myImpliesSet); - if (unPropagatedBin.isZero()) { - myimplies.removeThese(myImpliesSet); - myImpliesSet.clear(); - goto end; - } - } - } - next: - myimplies.removeThese(myImpliesSet); - myImpliesSet.clear(); - #ifdef VERBOSE_DEBUG - if (thisLevel > 0) { - std::cout << "Added " << thisLevel << " level diff:" << end-l-1 << std::endl; - } - #endif //VERBOSE_DEBUG - } - assert(unPropagatedBin.isZero()); - - end: - hyperbinProps += solver.propagations - oldProps; -} - -void FailedVarSearcher::fillImplies(const Lit& lit) -{ - solver.newDecisionLevel(); - solver.uncheckedEnqueue(lit); - failed = (!solver.propagate().isNULL()); - assert(!failed); - - assert(solver.decisionLevel() > 0); - for (int c = solver.trail.size()-1; c >= (int)solver.trail_lim[0]; c--) { - Lit x = solver.trail[c]; - myimplies.setBit(x.var()); - myImpliesSet.push(x.var()); - } - solver.cancelUntil(0); -} - -void FailedVarSearcher::addBin(const Lit& lit1, const Lit& lit2) -{ - #ifdef VERBOSE_DEBUG - std::cout << "Adding extra bin: "; - lit1.print(); std::cout << " "; lit2.printFull(); - #endif //VERBOSE_DEBUG - - tmpPs[0] = lit1; - tmpPs[1] = lit2; - solver.addLearntClause(tmpPs, 0, 0); - tmpPs.growTo(2); - assert(solver.ok); -} - -template -inline void FailedVarSearcher::cleanAndAttachClauses(vec& cs) -{ - T **i = cs.getData(); - T **j = i; - for (T **end = cs.getDataEnd(); i != end; i++) { - if (cleanClause(**i)) { - solver.attachClause(**i); - *j++ = *i; - } else { - solver.clauseAllocator.clauseFree(*i); - } - } - cs.shrink(i-j); -} - -inline const bool FailedVarSearcher::cleanClause(Clause& ps) -{ - uint32_t origSize = ps.size(); - - Lit *i = ps.getData(); - Lit *j = i; - for (Lit *end = ps.getDataEnd(); i != end; i++) { - if (solver.value(*i) == l_True) return false; - if (solver.value(*i) == l_Undef) { - *j++ = *i; - } - } - ps.shrink(i-j); - assert(ps.size() > 1); - - if (ps.size() != origSize) ps.setStrenghtened(); - if (origSize != 2 && ps.size() == 2) - solver.becameBinary++; - - return true; -} - -inline const bool FailedVarSearcher::cleanClause(XorClause& ps) -{ - uint32_t origSize = ps.size(); - - Lit *i = ps.getData(), *j = i; - for (Lit *end = ps.getDataEnd(); i != end; i++) { - if (solver.assigns[i->var()] == l_True) ps.invert(true); - if (solver.assigns[i->var()] == l_Undef) { - *j++ = *i; - } - } - ps.shrink(i-j); - - if (ps.size() == 0) return false; - assert(ps.size() > 1); - - if (ps.size() != origSize) ps.setStrenghtened(); - if (ps.size() == 2) { - ps[0] = ps[0].unsign(); - ps[1] = ps[1].unsign(); - solver.varReplacer->replace(ps, ps.xor_clause_inverted(), ps.getGroup()); - return false; - } - - return true; -} - -/*************** -UNTESTED CODE -***************** -const bool FailedVarSearcher::tryAll(const Lit* begin, const Lit* end) -{ - propagated.setZero(); - BitArray propagated2; - propagated2.resize(solver.nVars(), 0); - propValue.resize(solver.nVars(), 0); - bool first = true; - bool last = false; - - for (const Lit *it = begin; it != end; it++, first = false) { - if (it+1 == end) last = true; - - if (!first && !last) propagated2.setZero(); - solver.newDecisionLevel(); - solver.uncheckedEnqueue(*it); - failed = (solver.propagate(false) != NULL); - if (failed) { - solver.cancelUntil(0); - numFailed++; - solver.uncheckedEnqueue(~(*it)); - solver.ok = (solver.propagate(false) == NULL); - if (!solver.ok) return false; - return true; - } else { - assert(solver.decisionLevel() > 0); - for (int c = solver.trail.size()-1; c >= (int)solver.trail_lim[0]; c--) { - Var x = solver.trail[c].var(); - if (last) { - if (propagated[x] && propValue[x] == solver.assigns[x].getBool()) - bothSame.push_back(make_pair(x, !propValue[x])); - } else { - if (first) { - propagated.setBit(x); - if (solver.assigns[x].getBool()) - propValue.setBit(x); - else - propValue.clearBit(x); - } else if (propValue[x] == solver.assigns[x].getBool()) { - propagated2.setBit(x); - } - } - } - solver.cancelUntil(0); - } - if (!last && !first) { - propagated &= propagated2; - if (propagated.isZero()) return true; - } - } - - for(uint32_t i = 0; i != bothSame.size(); i++) { - solver.uncheckedEnqueue(Lit(bothSame[i].first, bothSame[i].second)); - } - goodBothSame += bothSame.size(); - bothSame.clear(); - solver.ok = (solver.propagate(false) == NULL); - if (!solver.ok) return false; - - return true; -} -************** -Untested code end -**************/ - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/FailedVarSearcher.h b/src/vendor/stp/src/sat/cryptominisat2/FailedVarSearcher.h deleted file mode 100644 index 5ea4c1e0f..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/FailedVarSearcher.h +++ /dev/null @@ -1,155 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef FAILEDVARSEARCHER_H -#define FAILEDVARSEARCHER_H - -#include -#include -using std::map; - -#include "SolverTypes.h" -#include "Clause.h" -#include "BitArray.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class Solver; - -class TwoLongXor -{ - public: - const bool operator==(const TwoLongXor& other) const - { - if (var[0] == other.var[0] && var[1] == other.var[1] && inverted == other.inverted) - return true; - return false; - } - const bool operator<(const TwoLongXor& other) const - { - if (var[0] < other.var[0]) return true; - if (var[0] > other.var[0]) return false; - - if (var[1] < other.var[1]) return true; - if (var[1] > other.var[1]) return false; - - if (inverted < other.inverted) return true; - if (inverted > other.inverted) return false; - - return false; - } - - Var var[2]; - bool inverted; -}; - -class FailedVarSearcher { - public: - FailedVarSearcher(Solver& _solver); - - const bool search(uint64_t numProps); - - private: - //For 2-long xor - const TwoLongXor getTwoLongXor(const XorClause& c); - void addFromSolver(const vec& cs); - uint32_t newBinXor; - - //For detach&re-attach (when lots of vars found) - template - void cleanAndAttachClauses(vec& cs); - const bool cleanClause(Clause& ps); - const bool cleanClause(XorClause& ps); - void completelyDetachAndReattach(); - - //For re-adding old removed learnt clauses - const bool readdRemovedLearnts(); - void removeOldLearnts(); - - //Main - const bool tryBoth(const Lit lit1, const Lit lit2); - const bool tryAll(const Lit* begin, const Lit* end); - void printResults(const double myTime) const; - - Solver& solver; - - //For failure - bool failed; - - //bothprop finding - BitArray propagated; - BitArray propValue; - vec bothSame; - - //2-long xor-finding - vec xorClauseSizes; - vector > occur; - void removeVarFromXors(const Var var); - void addVarFromXors(const Var var); - BitArray xorClauseTouched; - vec investigateXor; - std::set twoLongXors; - bool binXorFind; - uint32_t lastTrailSize; - - //2-long xor-finding no.2 through - // 1) (a->b, ~a->~b) -> a=b - // 2) binary clause (a,c): (a->g, c->~g) -> a = ~c - uint32_t bothInvert; - - //finding HyperBins - void addBinClauses(const Lit& lit); - BitArray unPropagatedBin; - vec propagatedVars; - void addBin(const Lit& lit1, const Lit& lit2); - void fillImplies(const Lit& lit); - BitArray myimplies; - vec myImpliesSet; - uint64_t hyperbinProps; - vector litDegrees; - const bool orderLits(); - uint64_t maxHyperBinProps; - uint64_t binClauseAdded; - - //Temporaries - vec tmpPs; - - //State for this run - uint32_t toReplaceBefore; - uint32_t origTrailSize; - uint64_t origProps; - uint32_t numFailed; - uint32_t goodBothSame; - - //State between runs - bool finishedLastTimeVar; - uint32_t lastTimeWentUntilVar; - bool finishedLastTimeBin; - uint32_t lastTimeWentUntilBin; - - double numPropsMultiplier; - uint32_t lastTimeFoundTruths; - - uint32_t numCalls; -}; - -}; //NAMESPACE MINISAT - -#endif //FAILEDVARSEARCHER_H - diff --git a/src/vendor/stp/src/sat/cryptominisat2/FindUndef.cpp b/src/vendor/stp/src/sat/cryptominisat2/FindUndef.cpp deleted file mode 100644 index 84d8a6c49..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/FindUndef.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "FindUndef.h" - -#include "Solver.h" -#include "VarReplacer.h" -#include - -namespace MINISAT -{ -using namespace MINISAT; - -FindUndef::FindUndef(Solver& _solver) : - solver(_solver) - , isPotentialSum(0) -{ -} - -void FindUndef::fillPotential() -{ - int trail = solver.decisionLevel()-1; - - while(trail > 0) { - assert(trail < (int)solver.trail_lim.size()); - uint at = solver.trail_lim[trail]; - - assert(at > 0); - Var v = solver.trail[at].var(); - if (solver.assigns[v] != l_Undef) { - isPotential[v] = true; - isPotentialSum++; - } - - trail--; - } - - for (XorClause** it = solver.xorclauses.getData(), **end = it + solver.xorclauses.size(); it != end; it++) { - XorClause& c = **it; - for (Lit *l = c.getData(), *end = l + c.size(); l != end; l++) { - if (isPotential[l->var()]) { - isPotential[l->var()] = false; - isPotentialSum--; - } - assert(!solver.value(*l).isUndef()); - } - } - - vector replacingVars = solver.varReplacer->getReplacingVars(); - for (Var *it = &replacingVars[0], *end = it + replacingVars.size(); it != end; it++) { - if (isPotential[*it]) { - isPotential[*it] = false; - isPotentialSum--; - } - } -} - -void FindUndef::unboundIsPotentials() -{ - for (uint i = 0; i < isPotential.size(); i++) - if (isPotential[i]) - solver.assigns[i] = l_Undef; -} - -void FindUndef::moveBinToNormal() -{ - binPosition = solver.clauses.size(); - for (uint i = 0; i != solver.binaryClauses.size(); i++) - solver.clauses.push(solver.binaryClauses[i]); - solver.binaryClauses.clear(); -} - -void FindUndef::moveBinFromNormal() -{ - for (uint i = binPosition; i != solver.clauses.size(); i++) - solver.binaryClauses.push(solver.clauses[i]); - solver.clauses.shrink(solver.clauses.size() - binPosition); -} - -const uint FindUndef::unRoll() -{ - if (solver.decisionLevel() == 0) return 0; - - moveBinToNormal(); - - dontLookAtClause.resize(solver.clauses.size(), false); - isPotential.resize(solver.nVars(), false); - fillPotential(); - satisfies.resize(solver.nVars(), 0); - - while(!updateTables()) { - assert(isPotentialSum > 0); - - uint32_t maximum = 0; - Var v = var_Undef; - for (uint i = 0; i < isPotential.size(); i++) { - if (isPotential[i] && satisfies[i] >= maximum) { - maximum = satisfies[i]; - v = i; - } - } - assert(v != var_Undef); - - isPotential[v] = false; - isPotentialSum--; - - std::fill(satisfies.begin(), satisfies.end(), 0); - } - - unboundIsPotentials(); - moveBinFromNormal(); - - return isPotentialSum; -} - -bool FindUndef::updateTables() -{ - bool allSat = true; - - uint i = 0; - for (Clause** it = solver.clauses.getData(), **end = it + solver.clauses.size(); it != end; it++, i++) { - if (dontLookAtClause[i]) - continue; - - Clause& c = **it; - bool definitelyOK = false; - Var v = var_Undef; - uint numTrue = 0; - for (Lit *l = c.getData(), *end = l + c.size(); l != end; l++) { - if (solver.value(*l) == l_True) { - if (!isPotential[l->var()]) { - dontLookAtClause[i] = true; - definitelyOK = true; - break; - } else { - numTrue ++; - v = l->var(); - } - } - } - if (definitelyOK) - continue; - - if (numTrue == 1) { - assert(v != var_Undef); - isPotential[v] = false; - isPotentialSum--; - dontLookAtClause[i] = true; - continue; - } - - //numTrue > 1 - allSat = false; - for (Lit *l = c.getData(), *end = l + c.size(); l != end; l++) { - if (solver.value(*l) == l_True) - satisfies[l->var()]++; - } - } - - return allSat; -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/FindUndef.h b/src/vendor/stp/src/sat/cryptominisat2/FindUndef.h deleted file mode 100644 index d3612ac6f..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/FindUndef.h +++ /dev/null @@ -1,59 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef FINDUNDEF_H -#define FINDUNDEF_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER -#include -using std::vector; - -#include "Solver.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class FindUndef { - public: - FindUndef(Solver& _solver); - const uint unRoll(); - - private: - Solver& solver; - - void moveBinToNormal(); - void moveBinFromNormal(); - bool updateTables(); - void fillPotential(); - void unboundIsPotentials(); - - vector dontLookAtClause; //If set to TRUE, then that clause already has only 1 lit that is true, so it can be skipped during updateFixNeed() - vector satisfies; - vector isPotential; - uint32_t isPotentialSum; - uint32_t binPosition; - -}; - -}; //NAMESPACE MINISAT - -#endif // \ No newline at end of file diff --git a/src/vendor/stp/src/sat/cryptominisat2/Gaussian.cpp b/src/vendor/stp/src/sat/cryptominisat2/Gaussian.cpp deleted file mode 100644 index e5edc506f..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Gaussian.cpp +++ /dev/null @@ -1,1161 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "Gaussian.h" - -#include -#include -#include "Clause.h" -#include -#include "ClauseCleaner.h" - -using std::ostream; -using std::cout; -using std::endl; - -#ifdef VERBOSE_DEBUG -#include -#endif - -namespace MINISAT -{ -using namespace MINISAT; -static const uint16_t unassigned_col = std::numeric_limits::max(); -static const Var unassigned_var = std::numeric_limits::max(); - -ostream& operator << (ostream& os, const vec& v) -{ - for (uint32_t i = 0; i != v.size(); i++) { - if (v[i].sign()) os << "-"; - os << v[i].var()+1 << " "; - } - - return os; -} - -Gaussian::Gaussian(Solver& _solver, const GaussianConfig& _config, const uint _matrix_no, const vector& _xorclauses) : - solver(_solver) - , config(_config) - , matrix_no(_matrix_no) - , xorclauses(_xorclauses) - , messed_matrix_vars_since_reversal(true) - , gauss_last_level(0) - , disabled(false) - , useful_prop(0) - , useful_confl(0) - , called(0) - , unit_truths(0) -{ -} - -Gaussian::~Gaussian() -{ - for (uint i = 0; i < clauses_toclear.size(); i++) - solver.clauseAllocator.clauseFree(clauses_toclear[i].first); -} - -inline void Gaussian::set_matrixset_to_cur() -{ - uint level = solver.decisionLevel() / config.only_nth_gauss_save; - assert(level <= matrix_sets.size()); - - if (level == matrix_sets.size()) - matrix_sets.push_back(cur_matrixset); - else - matrix_sets[level] = cur_matrixset; -} - -const bool Gaussian::full_init() -{ - assert(solver.ok); - - if (!should_init()) return true; - reset_stats(); - uint32_t last_trail_size = solver.trail.size(); - - bool do_again_gauss = true; - while (do_again_gauss) { - do_again_gauss = false; - solver.clauseCleaner->cleanClauses(solver.xorclauses, ClauseCleaner::xorclauses); - if (!solver.ok) return false; - init(); - Clause* confl; - gaussian_ret g = gaussian(confl); - switch (g) { - case unit_conflict: - case conflict: - solver.ok = false; - return false; - case unit_propagation: - case propagation: - unit_truths += last_trail_size - solver.trail.size(); - do_again_gauss = true; - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) return false; - break; - case nothing: - break; - } - } - - return true; -} - -void Gaussian::init() -{ - assert(solver.decisionLevel() == 0); - - fill_matrix(cur_matrixset); - if (!cur_matrixset.num_rows || !cur_matrixset.num_cols) { - disabled = true; - badlevel = 0; - return; - } - - matrix_sets.clear(); - matrix_sets.push_back(cur_matrixset); - gauss_last_level = solver.trail.size(); - messed_matrix_vars_since_reversal = false; - badlevel = UINT_MAX; - - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Gaussian init finished." << endl; - #endif -} - -uint Gaussian::select_columnorder(vector& var_to_col, matrixset& origMat) -{ - var_to_col.resize(solver.nVars(), unassigned_col); - - uint num_xorclauses = 0; - for (uint32_t i = 0; i != xorclauses.size(); i++) { - XorClause& c = *xorclauses[i]; - if (c.removed()) continue; - num_xorclauses++; - - for (uint i2 = 0; i2 < c.size(); i2++) { - assert(solver.assigns[c[i2].var()].isUndef()); - var_to_col[c[i2].var()] = unassigned_col - 1; - } - } - - uint largest_used_var = 0; - for (uint i = 0; i < var_to_col.size(); i++) - if (var_to_col[i] != unassigned_col) - largest_used_var = i; - var_to_col.resize(largest_used_var + 1); - - var_is_in.resize(var_to_col.size(), 0); - origMat.var_is_set.resize(var_to_col.size(), 0); - - origMat.col_to_var.clear(); - vector vars(solver.nVars()); - if (!config.orderCols) { - for (uint32_t i = 0; i < solver.nVars(); i++) { - vars.push_back(i); - } - std::random_shuffle(vars.begin(), vars.end()); - } - - Heap order_heap(solver.order_heap); - uint32_t iterReduceIt = 0; - while ((config.orderCols && !order_heap.empty()) || (!config.orderCols && iterReduceIt < vars.size())) - { - Var v; - if (config.orderCols) v = order_heap.removeMin(); - else v = vars[iterReduceIt++]; - if (var_to_col[v] == 1) { - #ifdef DEBUG_GAUSS - vector::iterator it = - std::find(origMat.col_to_var.begin(), origMat.col_to_var.end(), v); - assert(it == origMat.col_to_var.end()); - #endif - - origMat.col_to_var.push_back(v); - var_to_col[v] = origMat.col_to_var.size()-1; - var_is_in.setBit(v); - } - } - - //for the ones that were not in the order_heap, but are marked in var_to_col - for (uint v = 0; v != var_to_col.size(); v++) { - if (var_to_col[v] == unassigned_col - 1) { - origMat.col_to_var.push_back(v); - var_to_col[v] = origMat.col_to_var.size() -1; - var_is_in.setBit(v); - } - } - - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")col_to_var:"; - std::copy(origMat.col_to_var.begin(), origMat.col_to_var.end(), std::ostream_iterator(cout, ",")); - cout << endl; - #endif - - return num_xorclauses; -} - -void Gaussian::fill_matrix(matrixset& origMat) -{ - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Filling matrix" << endl; - #endif - - vector var_to_col; - origMat.num_rows = select_columnorder(var_to_col, origMat); - origMat.num_cols = origMat.col_to_var.size(); - col_to_var_original = origMat.col_to_var; - changed_rows.resize(origMat.num_rows); - memset(&changed_rows[0], 0, sizeof(char)*changed_rows.size()); - - origMat.last_one_in_col.resize(origMat.num_cols); - std::fill(origMat.last_one_in_col.begin(), origMat.last_one_in_col.end(), origMat.num_rows); - origMat.first_one_in_row.resize(origMat.num_rows); - - origMat.removeable_cols = 0; - origMat.least_column_changed = -1; - origMat.matrix.resize(origMat.num_rows, origMat.num_cols); - - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")matrix size:" << origMat.num_rows << "," << origMat.num_cols << endl; - #endif - - uint matrix_row = 0; - for (uint32_t i = 0; i != xorclauses.size(); i++) { - const XorClause& c = *xorclauses[i]; - if (c.removed()) continue; - - origMat.matrix.getVarsetAt(matrix_row).set(c, var_to_col, origMat.num_cols); - origMat.matrix.getMatrixAt(matrix_row).set(c, var_to_col, origMat.num_cols); - matrix_row++; - } - assert(origMat.num_rows == matrix_row); -} - -void Gaussian::update_matrix_col(matrixset& m, const Var var, const uint col) -{ - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Updating matrix var " << var+1 << " (col " << col << ", m.last_one_in_col[col]: " << m.last_one_in_col[col] << ")" << endl; - cout << "m.num_rows:" << m.num_rows << endl; - #endif - - #ifdef DEBUG_GAUSS - assert(col < m.num_cols); - #endif - - m.least_column_changed = std::min(m.least_column_changed, (int)col); - PackedMatrix::iterator this_row = m.matrix.beginMatrix(); - uint row_num = 0; - - if (solver.assigns[var].getBool()) { - for (uint end = m.last_one_in_col[col]; row_num != end; ++this_row, row_num++) { - if ((*this_row)[col]) { - changed_rows[row_num] = true; - (*this_row).invert_is_true(); - (*this_row).clearBit(col); - } - } - } else { - for (uint end = m.last_one_in_col[col]; row_num != end; ++this_row, row_num++) { - if ((*this_row)[col]) { - changed_rows[row_num] = true; - (*this_row).clearBit(col); - } - } - } - - #ifdef DEBUG_GAUSS - bool c = false; - for(PackedMatrix::iterator r = m.matrix.beginMatrix(), end = r + m.matrix.getSize(); r != end; ++r) - c |= (*r)[col]; - assert(!c); - #endif - - m.removeable_cols++; - m.col_to_var[col] = unassigned_var; - m.var_is_set.setBit(var); -} - -void Gaussian::update_matrix_by_col_all(matrixset& m) -{ - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Updating matrix." << endl; - print_matrix(m); - uint num_updated = 0; - #endif - - #ifdef DEBUG_GAUSS - assert(nothing_to_propagate(cur_matrixset)); - assert(solver.decisionLevel() == 0 || check_last_one_in_cols(m)); - #endif - - memset(&changed_rows[0], 0, sizeof(char)*changed_rows.size()); - - uint last = 0; - uint col = 0; - for (const Var *it = &m.col_to_var[0], *end = it + m.num_cols; it != end; col++, it++) { - if (*it != unassigned_var && solver.assigns[*it].isDef()) { - update_matrix_col(m, *it, col); - last++; - #ifdef VERBOSE_DEBUG - num_updated++; - #endif - } else - last = 0; - } - m.num_cols -= last; - - #ifdef DEBUG_GAUSS - check_matrix_against_varset(m.matrix, m); - #endif - - #ifdef VERBOSE_DEBUG - cout << "Matrix update finished, updated " << num_updated << " cols" << endl; - print_matrix(m); - #endif - - /*cout << "num_rows:" << m.num_rows; - cout << " num_rows diff:" << origMat.num_rows - m.num_rows << endl; - cout << "num_cols:" << col_to_var_original.size(); - cout << " num_cols diff:" << col_to_var_original.size() - m.col_to_var.size() << endl; - cout << "removeable cols:" << m.removeable_cols << endl;*/ -} - -inline void Gaussian::update_last_one_in_col(matrixset& m) -{ - for (uint16_t* i = &m.last_one_in_col[0]+m.last_one_in_col.size()-1, *end = &m.last_one_in_col[0]-1; i != end && *i >= m.num_rows; i--) - *i = m.num_rows; -} - -Gaussian::gaussian_ret Gaussian::gaussian(Clause*& confl) -{ - if (solver.decisionLevel() >= badlevel) - return nothing; - - if (messed_matrix_vars_since_reversal) { - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")matrix needs copy before update" << endl; - #endif - - const uint level = solver.decisionLevel() / config.only_nth_gauss_save; - assert(level < matrix_sets.size()); - cur_matrixset = matrix_sets[level]; - } - update_last_one_in_col(cur_matrixset); - update_matrix_by_col_all(cur_matrixset); - - messed_matrix_vars_since_reversal = false; - gauss_last_level = solver.trail.size(); - badlevel = UINT_MAX; - - propagatable_rows.clear(); - uint conflict_row = UINT_MAX; - uint last_row = eliminate(cur_matrixset, conflict_row); - #ifdef DEBUG_GAUSS - check_matrix_against_varset(cur_matrixset.matrix, cur_matrixset); - #endif - - gaussian_ret ret; - //There is no early abort, so this is unneeded - /*if (conflict_row != UINT_MAX) { - uint maxlevel = UINT_MAX; - uint size = UINT_MAX; - uint best_row = UINT_MAX; - analyse_confl(cur_matrixset, conflict_row, maxlevel, size, best_row); - ret = handle_matrix_confl(confl, cur_matrixset, size, maxlevel, best_row); - } else {*/ - ret = handle_matrix_prop_and_confl(cur_matrixset, last_row, confl); - //} - #ifdef DEBUG_GAUSS - assert(ret == conflict || nothing_to_propagate(cur_matrixset)); - #endif - - if (!cur_matrixset.num_cols || !cur_matrixset.num_rows) { - badlevel = solver.decisionLevel(); - return nothing; - } - - if (ret == nothing && - solver.decisionLevel() % config.only_nth_gauss_save == 0) - set_matrixset_to_cur(); - - #ifdef VERBOSE_DEBUG - if (ret == nothing) - cout << "(" << matrix_no << ")Useless. "; - else - cout << "(" << matrix_no << ")Useful. "; - cout << "(" << matrix_no << ")Useful prop in " << ((double)useful_prop/(double)called)*100.0 << "%" << endl; - cout << "(" << matrix_no << ")Useful confl in " << ((double)useful_confl/(double)called)*100.0 << "%" << endl; - #endif - - return ret; -} - -uint Gaussian::eliminate(matrixset& m, uint& conflict_row) -{ - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")"; - cout << "Starting elimination" << endl; - cout << "m.least_column_changed:" << m.least_column_changed << endl; - print_last_one_in_cols(m); - - uint number_of_row_additions = 0; - uint no_exchanged = 0; - #endif - - if (m.least_column_changed == INT_MAX) { - #ifdef VERBOSE_DEBUG - cout << "Nothing to eliminate" << endl; - #endif - - return m.num_rows; - } - - - #ifdef DEBUG_GAUSS - assert(solver.decisionLevel() == 0 || check_last_one_in_cols(m)); - #endif - - uint i = 0; - uint j = (config.iterativeReduce) ? m.least_column_changed + 1 : 0; - PackedMatrix::iterator beginIt = m.matrix.beginMatrix(); - PackedMatrix::iterator rowIt = m.matrix.beginMatrix(); - - #ifdef DEBUG_GAUSS - check_first_one_in_row(m, j); - #endif - - if (j) { - uint16_t until = std::min(m.last_one_in_col[m.least_column_changed] - 1, (int)m.num_rows); - if (j-1 > m.first_one_in_row[m.num_rows-1]) - until = m.num_rows; - for (;i != until; i++, ++rowIt) if (changed_rows[i] && (*rowIt).popcnt_is_one(m.first_one_in_row[i])) - propagatable_rows.push(i); - } - - #ifdef VERBOSE_DEBUG - cout << "At while() start: i,j = " << i << ", " << j << endl; - cout << "num_rows:" << m.num_rows << " num_cols:" << m.num_cols << endl; - #endif - - if (j > m.num_cols) { - #ifdef VERBOSE_DEBUG - cout << "Going straight to finish" << endl; - #endif - goto finish; - } - - #ifdef DEBUG_GAUSS - assert(i <= m.num_rows && j <= m.num_cols); - #endif - - while (i != m.num_rows && j != m.num_cols) { - //Find pivot in column j, starting in row i: - - if (m.col_to_var[j] == unassigned_var) { - j++; - continue; - } - - PackedMatrix::iterator this_matrix_row = rowIt; - PackedMatrix::iterator end = beginIt + m.last_one_in_col[j]; - for (; this_matrix_row != end; ++this_matrix_row) { - if ((*this_matrix_row)[j]) - break; - } - - if (this_matrix_row != end) { - - //swap rows i and maxi, but do not change the value of i; - if (this_matrix_row != rowIt) { - #ifdef VERBOSE_DEBUG - no_exchanged++; - #endif - - //Would early abort, but would not find the best conflict (and would be expensive) - //if (matrix_row_i.is_true() && matrix_row_i.isZero()) { - // conflict_row = i; - // return 0; - //} - (*rowIt).swapBoth(*this_matrix_row); - } - #ifdef DEBUG_GAUSS - assert(m.matrix.getMatrixAt(i).popcnt(j) == m.matrix.getMatrixAt(i).popcnt()); - assert(m.matrix.getMatrixAt(i)[j]); - #endif - - if ((*rowIt).popcnt_is_one(j)) - propagatable_rows.push(i); - - //Now A[i,j] will contain the old value of A[maxi,j]; - ++this_matrix_row; - for (; this_matrix_row != end; ++this_matrix_row) if ((*this_matrix_row)[j]) { - //subtract row i from row u; - //Now A[u,j] will be 0, since A[u,j] - A[i,j] = A[u,j] -1 = 0. - #ifdef VERBOSE_DEBUG - number_of_row_additions++; - #endif - - (*this_matrix_row).xorBoth(*rowIt); - //Would early abort, but would not find the best conflict (and would be expensive) - //if (it->is_true() &&it->isZero()) { - // conflict_row = i2; - // return 0; - //} - } - m.first_one_in_row[i] = j; - i++; - ++rowIt; - m.last_one_in_col[j] = i; - } else { - m.first_one_in_row[i] = j; - m.last_one_in_col[j] = i + 1; - } - j++; - } - - finish: - - m.least_column_changed = INT_MAX; - - #ifdef VERBOSE_DEBUG - cout << "Finished elimination" << endl; - cout << "Returning with i,j:" << i << ", " << j << "(" << m.num_rows << ", " << m.num_cols << ")" << endl; - print_matrix(m); - print_last_one_in_cols(m); - cout << "(" << matrix_no << ")Exchanged:" << no_exchanged << " row additions:" << number_of_row_additions << endl; - #endif - - #ifdef DEBUG_GAUSS - assert(check_last_one_in_cols(m)); - uint row = 0; - uint col = 0; - for (; col < m.num_cols && row < m.num_rows && row < i ; col++) { - assert(m.matrix.getMatrixAt(row).popcnt() == m.matrix.getMatrixAt(row).popcnt(col)); - assert(!(m.col_to_var[col] == unassigned_var && m.matrix.getMatrixAt(row)[col])); - if (m.col_to_var[col] == unassigned_var || !m.matrix.getMatrixAt(row)[col]) { - #ifdef VERBOSE_DEBUG - cout << "row:" << row << " col:" << col << " m.last_one_in_col[col]-1: " << m.last_one_in_col[col]-1 << endl; - #endif - assert(m.col_to_var[col] == unassigned_var || std::min((uint16_t)(m.last_one_in_col[col]-1), m.num_rows) == row); - continue; - } - row++; - } - #endif - - return i; -} - -Gaussian::gaussian_ret Gaussian::handle_matrix_confl(Clause*& confl, const matrixset& m, const uint size, const uint maxlevel, const uint best_row) -{ - assert(best_row != UINT_MAX); - - m.matrix.getVarsetAt(best_row).fill(tmp_clause, solver.assigns, col_to_var_original); - confl = (Clause*)solver.clauseAllocator.XorClause_new(tmp_clause, false, solver.learnt_clause_group++); - Clause& cla = *confl; - #ifdef STATS_NEEDED - if (solver.dynamic_behaviour_analysis) - solver.logger.set_group_name(confl->getGroup(), "learnt gauss clause"); - #endif - - if (cla.size() <= 1) { - solver.ok = false; - return unit_conflict; - } - - assert(cla.size() >= 2); - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Found conflict:"; - cla.plainPrint(); - #endif - - if (maxlevel != solver.decisionLevel()) { - #ifdef STATS_NEEDED - if (solver.dynamic_behaviour_analysis) - solver.logger.conflict(Logger::gauss_confl_type, maxlevel, confl->getGroup(), *confl); - #endif - solver.cancelUntil(maxlevel); - } - const uint curr_dec_level = solver.decisionLevel(); - assert(maxlevel == curr_dec_level); - - uint maxsublevel = 0; - uint maxsublevel_at = UINT_MAX; - for (uint i = 0, size = cla.size(); i != size; i++) if (solver.level[cla[i].var()] == (int32_t)curr_dec_level) { - uint tmp = find_sublevel(cla[i].var()); - if (tmp >= maxsublevel) { - maxsublevel = tmp; - maxsublevel_at = i; - } - } - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ") || Sublevel of confl: " << maxsublevel << " (due to var:" << cla[maxsublevel_at].var()-1 << ")" << endl; - #endif - - Lit tmp(cla[maxsublevel_at]); - cla[maxsublevel_at] = cla[1]; - cla[1] = tmp; - - cancel_until_sublevel(maxsublevel+1); - messed_matrix_vars_since_reversal = true; - return conflict; -} - -Gaussian::gaussian_ret Gaussian::handle_matrix_prop_and_confl(matrixset& m, uint last_row, Clause*& confl) -{ - int32_t maxlevel = std::numeric_limits::max(); - uint size = UINT_MAX; - uint best_row = UINT_MAX; - - for (uint row = last_row; row != m.num_rows; row++) { - #ifdef DEBUG_GAUSS - assert(m.matrix.getMatrixAt(row).isZero()); - #endif - if (m.matrix.getMatrixAt(row).is_true()) - analyse_confl(m, row, maxlevel, size, best_row); - } - - if (maxlevel != std::numeric_limits::max()) - return handle_matrix_confl(confl, m, size, maxlevel, best_row); - - #ifdef DEBUG_GAUSS - assert(check_no_conflict(m)); - assert(last_row == 0 || !m.matrix.getMatrixAt(last_row-1).isZero()); - #endif - - #ifdef VERBOSE_DEBUG - cout << "Resizing matrix to num_rows = " << last_row << endl; - #endif - m.num_rows = last_row; - m.matrix.resizeNumRows(m.num_rows); - - gaussian_ret ret = nothing; - - uint num_props = 0; - for (const uint* prop_row = propagatable_rows.getData(), *end = prop_row + propagatable_rows.size(); prop_row != end; prop_row++ ) { - //this is a "000..1..0000000X" row. I.e. it indicates a propagation - ret = handle_matrix_prop(m, *prop_row); - num_props++; - if (ret == unit_propagation) { - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Unit prop! Breaking from prop examination" << endl; - #endif - return unit_propagation; - } - } - #ifdef VERBOSE_DEBUG - if (num_props > 0) cout << "(" << matrix_no << ")Number of props during gauss:" << num_props << endl; - #endif - - return ret; -} - -uint Gaussian::find_sublevel(const Var v) const -{ - for (int i = solver.trail.size()-1; i >= 0; i --) - if (solver.trail[i].var() == v) return i; - - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Oooops! Var " << v+1 << " does not have a sublevel!! (so it must be undefined)" << endl; - #endif - - assert(false); - return 0; -} - -void Gaussian::cancel_until_sublevel(const uint until_sublevel) -{ - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Canceling until sublevel " << until_sublevel << endl; - #endif - - for (vector::iterator gauss = solver.gauss_matrixes.begin(), end= solver.gauss_matrixes.end(); gauss != end; gauss++) - if (*gauss != this) (*gauss)->canceling(until_sublevel); - - for (int sublevel = solver.trail.size()-1; sublevel >= (int)until_sublevel; sublevel--) { - Var var = solver.trail[sublevel].var(); - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Canceling var " << var+1 << endl; - #endif - - #ifdef USE_OLD_POLARITIES - solver.polarity[var] = solver.oldPolarity[var]; - #endif //USE_OLD_POLARITIES - solver.assigns[var] = l_Undef; - solver.insertVarOrder(var); - } - solver.trail.shrink(solver.trail.size() - until_sublevel); - - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Canceling sublevel finished." << endl; - #endif -} - -void Gaussian::analyse_confl(const matrixset& m, const uint row, int32_t& maxlevel, uint& size, uint& best_row) const -{ - assert(row < m.num_rows); - - //this is a "000...00000001" row. I.e. it indicates we are on the wrong branch - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")matrix conflict found!" << endl; - cout << "(" << matrix_no << ")conflict clause's vars: "; - print_matrix_row_with_assigns(m.matrix.getVarsetAt(row)); - cout << endl; - - cout << "(" << matrix_no << ")corresponding matrix's row (should be empty): "; - print_matrix_row(m.matrix.getMatrixAt(row)); - cout << endl; - #endif - - int32_t this_maxlevel = 0; - unsigned long int var = 0; - uint this_size = 0; - while (true) { - var = m.matrix.getVarsetAt(row).scan(var); - if (var == ULONG_MAX) break; - - const Var real_var = col_to_var_original[var]; - assert(real_var < solver.nVars()); - - if (solver.level[real_var] > this_maxlevel) - this_maxlevel = solver.level[real_var]; - var++; - this_size++; - } - - //the maximum of all lit's level must be lower than the max. level of the current best clause (or this clause must be either empty or unit clause) - if (!( - (this_maxlevel < maxlevel) - || (this_maxlevel == maxlevel && this_size < size) - || (this_size <= 1) - )) { - assert(maxlevel != std::numeric_limits::max()); - - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")Other found conflict just as good or better."; - cout << "(" << matrix_no << ") || Old maxlevel:" << maxlevel << " new maxlevel:" << this_maxlevel; - cout << "(" << matrix_no << ") || Old size:" << size << " new size:" << this_size << endl; - //assert(!(maxlevel != UINT_MAX && maxlevel != this_maxlevel)); //NOTE: only holds if gauss is executed at each level - #endif - - return; - } - - - #ifdef VERBOSE_DEBUG - if (maxlevel != std::numeric_limits::max()) - cout << "(" << matrix_no << ")Better conflict found."; - else - cout << "(" << matrix_no << ")Found a possible conflict."; - - cout << "(" << matrix_no << ") || Old maxlevel:" << maxlevel << " new maxlevel:" << this_maxlevel; - cout << "(" << matrix_no << ") || Old size:" << size << " new size:" << this_size << endl; - #endif - - maxlevel = this_maxlevel; - size = this_size; - best_row = row; -} - -Gaussian::gaussian_ret Gaussian::handle_matrix_prop(matrixset& m, const uint row) -{ - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")matrix prop found!" << endl; - cout << m.matrix.getMatrixAt(row) << endl; - cout << "(" << matrix_no << ")matrix row:"; - print_matrix_row(m.matrix.getMatrixAt(row)); - cout << endl; - #endif - - m.matrix.getVarsetAt(row).fill(tmp_clause, solver.assigns, col_to_var_original); - Clause& cla = *(Clause*)solver.clauseAllocator.XorClause_new(tmp_clause, false, solver.learnt_clause_group++); - #ifdef VERBOSE_DEBUG - cout << "(" << matrix_no << ")matrix prop clause: "; - cla.plainPrint(); - cout << endl; - #endif - - assert(m.matrix.getMatrixAt(row).is_true() == !cla[0].sign()); - assert(solver.assigns[cla[0].var()].isUndef()); - if (cla.size() == 1) { - solver.cancelUntil(0); - solver.uncheckedEnqueue(cla[0]); - solver.clauseAllocator.clauseFree(&cla); - return unit_propagation; - } - - clauses_toclear.push_back(std::make_pair(&cla, solver.trail.size()-1)); - #ifdef STATS_NEEDED - if (solver.dynamic_behaviour_analysis) - solver.logger.set_group_name(cla.getGroup(), "gauss prop clause"); - #endif - solver.uncheckedEnqueue(cla[0], &cla); - - return propagation; -} - -void Gaussian::disable_if_necessary() -{ - if (//nof_conflicts >= 0 - //&& conflictC >= nof_conflicts/8 - !config.dontDisable - && called > 50 - && useful_confl*2+useful_prop < (uint)((double)called*0.05) ) - disabled = true; -} - -llbool Gaussian::find_truths(vec& learnt_clause, int& conflictC) -{ - Clause* confl; - - disable_if_necessary(); - if (should_check_gauss(solver.decisionLevel(), solver.starts)) { - called++; - gaussian_ret g = gaussian(confl); - - switch (g) { - case conflict: { - useful_confl++; - llbool ret = solver.handle_conflict(learnt_clause, confl, conflictC, true); - solver.clauseAllocator.clauseFree(confl); - - if (ret != l_Nothing) return ret; - return l_Continue; - } - case unit_propagation: - unit_truths++; - case propagation: - useful_prop++; - return l_Continue; - case unit_conflict: { - unit_truths++; - useful_confl++; - if (confl->size() == 0) { - solver.clauseAllocator.clauseFree(confl); - return l_False; - } - - Lit lit = (*confl)[0]; - #ifdef STATS_NEEDED - if (solver.dynamic_behaviour_analysis) - solver.logger.conflict(Logger::gauss_confl_type, 0, confl->getGroup(), *confl); - #endif - - solver.cancelUntil(0); - - if (solver.assigns[lit.var()].isDef()) { - solver.clauseAllocator.clauseFree(confl); - return l_False; - } - - solver.uncheckedEnqueue(lit); - - solver.clauseAllocator.clauseFree(confl); - return l_Continue; - } - case nothing: - break; - } - } - - return l_Nothing; -} - -template -void Gaussian::print_matrix_row(const T& row) const -{ - unsigned long int var = 0; - while (true) { - var = row.scan(var); - if (var == ULONG_MAX) break; - - else cout << col_to_var_original[var]+1 << ", "; - var++; - } - cout << "final:" << row.is_true() << endl;; -} - -template -void Gaussian::print_matrix_row_with_assigns(const T& row) const -{ - unsigned long int col = 0; - while (true) { - col = row.scan(col); - if (col == ULONG_MAX) break; - - else { - Var var = col_to_var_original[col]; - cout << var+1 << "(" << lbool_to_string(solver.assigns[var]) << ")"; - cout << ", "; - } - col++; - } - if (!row.is_true()) cout << "xor_clause_inverted"; -} - -const string Gaussian::lbool_to_string(const lbool toprint) -{ - if (toprint == l_True) - return "true"; - if (toprint == l_False) - return "false"; - if (toprint == l_Undef) - return "undef"; - - assert(false); - return ""; -} - - -void Gaussian::print_stats() const -{ - if (called > 0) { - cout.setf(std::ios::fixed); - std::cout << " Gauss(" << matrix_no << ") useful"; - cout << " prop: " << std::setprecision(2) << std::setw(5) << ((double)useful_prop/(double)called)*100.0 << "% "; - cout << " confl: " << std::setprecision(2) << std::setw(5) << ((double)useful_confl/(double)called)*100.0 << "% "; - if (disabled) std::cout << "disabled"; - } else - std::cout << " Gauss(" << matrix_no << ") not called."; -} - -void Gaussian::print_matrix_stats() const -{ - cout << "matrix size: " << cur_matrixset.num_rows << " x " << cur_matrixset.num_cols << endl; -} - - -void Gaussian::reset_stats() -{ - useful_prop = 0; - useful_confl = 0; - called = 0; - disabled = false; -} - -bool Gaussian::check_no_conflict(matrixset& m) const -{ - uint row = 0; - for(PackedMatrix::iterator r = m.matrix.beginMatrix(), end = m.matrix.endMatrix(); r != end; ++r, ++row) { - if ((*r).is_true() && (*r).isZero()) { - cout << "Conflict at row " << row << endl; - return false; - } - } - return true; -} - -void Gaussian::print_matrix(matrixset& m) const -{ - uint row = 0; - for (PackedMatrix::iterator it = m.matrix.beginMatrix(); it != m.matrix.endMatrix(); ++it, row++) { - cout << *it << " -- row:" << row; - if (row >= m.num_rows) - cout << " (considered past the end)"; - cout << endl; - } -} - -void Gaussian::print_last_one_in_cols(matrixset& m) const -{ - for (uint i = 0; i < m.num_cols; i++) { - cout << "last_one_in_col[" << i << "]-1 = " << m.last_one_in_col[i]-1 << endl; - } -} - -const bool Gaussian::nothing_to_propagate(matrixset& m) const -{ - for(PackedMatrix::iterator r = m.matrix.beginMatrix(), end = m.matrix.endMatrix(); r != end; ++r) { - if ((*r).popcnt_is_one() - && solver.assigns[m.col_to_var[(*r).scan(0)]].isUndef()) - return false; - } - for(PackedMatrix::iterator r = m.matrix.beginMatrix(), end = m.matrix.endMatrix(); r != end; ++r) { - if ((*r).isZero() && (*r).is_true()) - return false; - } - return true; -} - -const bool Gaussian::check_last_one_in_cols(matrixset& m) const -{ - for(uint i = 0; i < m.num_cols; i++) { - const uint last = std::min(m.last_one_in_col[i] - 1, (int)m.num_rows); - uint real_last = 0; - uint i2 = 0; - for (PackedMatrix::iterator it = m.matrix.beginMatrix(); it != m.matrix.endMatrix(); ++it, i2++) { - if ((*it)[i]) - real_last = i2; - } - if (real_last > last) - return false; - } - - return true; -} - -void Gaussian::check_matrix_against_varset(PackedMatrix& matrix, const matrixset& m) const -{ - for (uint i = 0; i < matrix.getSize(); i++) { - const PackedRow mat_row = matrix.getMatrixAt(i); - const PackedRow var_row = matrix.getVarsetAt(i); - - unsigned long int col = 0; - bool final = false; - while (true) { - col = var_row.scan(col); - if (col == ULONG_MAX) break; - - const Var var = col_to_var_original[col]; - assert(var < solver.nVars()); - - if (solver.assigns[var] == l_True) { - assert(!mat_row[col]); - assert(m.col_to_var[col] == unassigned_var); - assert(m.var_is_set[var]); - final = !final; - } else if (solver.assigns[var] == l_False) { - assert(!mat_row[col]); - assert(m.col_to_var[col] == unassigned_var); - assert(m.var_is_set[var]); - } else if (solver.assigns[var] == l_Undef) { - assert(m.col_to_var[col] != unassigned_var); - assert(!m.var_is_set[var]); - assert(mat_row[col]); - } else assert(false); - - col++; - } - if ((final^!mat_row.is_true()) != !var_row.is_true()) { - cout << "problem with row:"; print_matrix_row_with_assigns(var_row); cout << endl; - assert(false); - } - } -} - -const void Gaussian::check_first_one_in_row(matrixset& m, const uint j) -{ - if (j) { - uint16_t until2 = std::min(m.last_one_in_col[m.least_column_changed] - 1, (int)m.num_rows); - if (j-1 > m.first_one_in_row[m.num_rows-1]) { - until2 = m.num_rows; - #ifdef VERBOSE_DEBUG - cout << "j-1 > m.first_one_in_row[m.num_rows-1]" << "j:" << j << " m.first_one_in_row[m.num_rows-1]:" << m.first_one_in_row[m.num_rows-1] << endl; - #endif - } - for (uint i2 = 0; i2 != until2; i2++) { - #ifdef VERBOSE_DEBUG - cout << endl << "row " << i2 << " (num rows:" << m.num_rows << ")" << endl; - cout << m.matrix.getMatrixAt(i2) << endl; - cout << " m.first_one_in_row[m.num_rows-1]:" << m.first_one_in_row[m.num_rows-1] << endl; - cout << "first_one_in_row:" << m.first_one_in_row[i2] << endl; - cout << "num_cols:" << m.num_cols << endl; - cout << "popcnt:" << m.matrix.getMatrixAt(i2).popcnt() << endl; - cout << "popcnt_is_one():" << m.matrix.getMatrixAt(i2).popcnt_is_one() << endl; - cout << "popcnt_is_one("<< m.first_one_in_row[i2] <<"): " << m.matrix.getMatrixAt(i2).popcnt_is_one(m.first_one_in_row[i2]) << endl; - #endif - - for (uint i3 = 0; i3 < m.first_one_in_row[i2]; i3++) { - assert(m.matrix.getMatrixAt(i2)[i3] == 0); - } - assert(m.matrix.getMatrixAt(i2)[m.first_one_in_row[i2]]); - assert(m.matrix.getMatrixAt(i2).popcnt_is_one() == - m.matrix.getMatrixAt(i2).popcnt_is_one(m.first_one_in_row[i2])); - } - } -} - -//old functions - -/*void Gaussian::update_matrix_by_row(matrixset& m) const -{ -#ifdef VERBOSE_DEBUG - cout << "Updating matrix." << endl; - uint num_updated = 0; -#endif -#ifdef DEBUG_GAUSS - assert(nothing_to_propagate(cur_matrixset)); -#endif - - mpz_class toclear, tocount; - uint last_col = 0; - - for (uint col = 0; col < m.num_cols; col ++) { - Var var = m.col_to_var[col]; - - if (var != UINT_MAX && !solver.assigns[var].isUndef()) { - toclear.setBit(col); - if (solver.assigns[var].getBool()) tocount.setBit(col); - -#ifdef DEBUG_GAUSS - assert(m.var_to_col[var] < UINT_MAX-1); -#endif - last_col = col; - m.least_column_changed = std::min(m.least_column_changed, (int)col); - - m.removeable_cols++; - m.col_to_var[col] = UINT_MAX; - m.var_to_col[var] = UINT_MAX-1; -#ifdef VERBOSE_DEBUG - num_updated++; -#endif - } - } - - toclear.invert(); - mpz_class tmp; - mpz_class* this_row = &m.matrix[0]; - for(uint i = 0, until = std::min(m.num_rows, m.last_one_in_col[last_col]+1); i < until; i++, this_row++) { - mpz_class& r = *this_row; - mpz_and(tmp.get_mp(), tocount.get_mp(), r.get_mp()); - r.invert_is_true(tmp.popcnt() % 2); - r &= toclear; -} - -#ifdef VERBOSE_DEBUG - cout << "Updated " << num_updated << " matrix cols. Could remove " << m.removeable_cols << " cols " <= last_level; level--){ - Var var = solver.trail[level].var(); - const uint col = m.var_to_col[var]; - if ( col < UINT_MAX-1) { - update_matrix_col(m, var, col); -#ifdef VERBOSE_DEBUG - num_updated++; -#endif - } - } - -#ifdef VERBOSE_DEBUG - cout << "Updated " << num_updated << " matrix cols. Could remove " << m.removeable_cols << " cols (out of " << m.num_cols << " )" <. -**************************************************************************************************/ - -#ifndef GAUSSIAN_H -#define GAUSSIAN_H - -#include -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "SolverTypes.h" -#include "Solver.h" -#include "GaussianConfig.h" -#include "PackedMatrix.h" -#include "BitArray.h" - -//#define VERBOSE_DEBUG -//#define DEBUG_GAUSS - -#ifdef VERBOSE_DEBUG -using std::vector; -using std::cout; -using std::endl; -#endif - -namespace MINISAT -{ -using namespace MINISAT; - -class Clause; - -class Gaussian -{ -public: - Gaussian(Solver& solver, const GaussianConfig& config, const uint matrix_no, const vector& xorclauses); - ~Gaussian(); - - const bool full_init(); - llbool find_truths(vec& learnt_clause, int& conflictC); - - //statistics - void print_stats() const; - void print_matrix_stats() const; - const uint get_called() const; - const uint get_useful_prop() const; - const uint get_useful_confl() const; - const bool get_disabled() const; - const uint32_t get_unit_truths() const; - void set_disabled(const bool toset); - - //functions used throughout the Solver - void canceling(const uint sublevel); - -protected: - Solver& solver; - - //Gauss high-level configuration - const GaussianConfig& config; - const uint matrix_no; - vector xorclauses; - - enum gaussian_ret {conflict, unit_conflict, propagation, unit_propagation, nothing}; - gaussian_ret gaussian(Clause*& confl); - - vector col_to_var_original; //Matches columns to variables - BitArray var_is_in; //variable is part of the the matrix. var_is_in's size is _minimal_ so you should check whether var_is_in.getSize() < var before issuing var_is_in[var] - uint badlevel; - - class matrixset - { - public: - PackedMatrix matrix; // The matrix, updated to reflect variable assignements - BitArray var_is_set; - vector col_to_var; // col_to_var[COL] tells which variable is at a given column in the matrix. Gives unassigned_var if the COL has been zeroed (i.e. the variable assigned) - uint16_t num_rows; // number of active rows in the matrix. Unactive rows are rows that contain only zeros (and if they are conflicting, then the conflict has been treated) - uint num_cols; // number of active columns in the matrix. The columns at the end that have all be zeroed are no longer active - int least_column_changed; // when updating the matrix, this value contains the smallest column number that has been updated (Gauss elim. can start from here instead of from column 0) - vector last_one_in_col; //last_one_in_col[COL] tells the last row+1 that has a '1' in that column. Used to reduce the burden of Gauss elim. (it only needs to look until that row) - vector first_one_in_row; - uint removeable_cols; // the number of columns that have been zeroed out (i.e. assigned) - }; - - //Saved states - vector matrix_sets; // The matrixsets for depths 'decision_from' + 0, 'decision_from' + only_nth_gaussian_save, 'decision_from' + 2*only_nth_gaussian_save, ... 'decision_from' + 'decision_until'. - matrixset cur_matrixset; // The current matrixset, i.e. the one we are working on, or the last one we worked on - - //Varibales to keep Gauss state - bool messed_matrix_vars_since_reversal; - int gauss_last_level; - vector > clauses_toclear; - bool disabled; // Gauss is disabled - - //State of current elimnation - vec propagatable_rows; //used to store which rows were deemed propagatable during elimination - vector changed_rows; //used to store which rows were deemed propagatable during elimination - - //Statistics - uint useful_prop; //how many times Gauss gave propagation as a result - uint useful_confl; //how many times Gauss gave conflict as a result - uint called; //how many times called the Gauss - uint32_t unit_truths; //how many unitary (i.e. decisionLevel 0) truths have been found - - //gauss init functions - void init(); // Initalise gauss state - void fill_matrix(matrixset& origMat); // Fills the origMat matrix - uint select_columnorder(vector& var_to_col, matrixset& origMat); // Fills var_to_col and col_to_var of the origMat matrix. - - //Main function - uint eliminate(matrixset& matrix, uint& conflict_row); //does the actual gaussian elimination - - //matrix update functions - void update_matrix_col(matrixset& matrix, const Var x, const uint col); // Update one matrix column - void update_matrix_by_col_all(matrixset& m); // Update all columns, column-by-column (and not row-by-row) - void set_matrixset_to_cur(); // Save the current matrixset, the cur_matrixset to matrix_sets - //void update_matrix_by_row(matrixset& matrix) const; - //void update_matrix_by_col(matrixset& matrix, const uint last_level) const; - - //conflict&propagation handling - gaussian_ret handle_matrix_prop_and_confl(matrixset& m, uint row, Clause*& confl); - void analyse_confl(const matrixset& m, const uint row, int32_t& maxlevel, uint& size, uint& best_row) const; // analyse conflcit to find the best conflict. Gets & returns the best one in 'maxlevel', 'size' and 'best row' (these are all UINT_MAX when calling this function first, i.e. when there is no other possible conflict to compare to the new in 'row') - gaussian_ret handle_matrix_confl(Clause*& confl, const matrixset& m, const uint size, const uint maxlevel, const uint best_row); - gaussian_ret handle_matrix_prop(matrixset& m, const uint row); // Handle matrix propagation at row 'row' - vec tmp_clause; - - //propagation&conflict handling - void cancel_until_sublevel(const uint until_sublevel); // cancels until sublevel 'until_sublevel'. The var 'until_sublevel' must NOT go over the current level. I.e. this function is ONLY for moving inside the current level - uint find_sublevel(const Var v) const; // find the sublevel (i.e. trail[X]) of a given variable - - //helper functions - bool at_first_init() const; - bool should_init() const; - bool should_check_gauss(const uint decisionlevel, const uint starts) const; - void disable_if_necessary(); - void reset_stats(); - void update_last_one_in_col(matrixset& m); - -private: - - //debug functions - bool check_no_conflict(matrixset& m) const; // Are there any conflicts that the matrixset 'm' causes? - const bool nothing_to_propagate(matrixset& m) const; // Are there any conflicts of propagations that matrixset 'm' clauses? - template - void print_matrix_row(const T& row) const; // Print matrix row 'row' - template - void print_matrix_row_with_assigns(const T& row) const; - void check_matrix_against_varset(PackedMatrix& matrix,const matrixset& m) const; - const bool check_last_one_in_cols(matrixset& m) const; - const void check_first_one_in_row(matrixset& m, const uint j); - void print_matrix(matrixset& m) const; - void print_last_one_in_cols(matrixset& m) const; - static const string lbool_to_string(const lbool toprint); -}; - -inline bool Gaussian::should_init() const -{ - return (config.decision_until > 0); -} - -inline bool Gaussian::should_check_gauss(const uint decisionlevel, const uint starts) const -{ - return (!disabled - && decisionlevel < config.decision_until); -} - -inline void Gaussian::canceling(const uint sublevel) -{ - if (disabled) - return; - uint a = 0; - for (int i = clauses_toclear.size()-1; i >= 0 && clauses_toclear[i].second > sublevel; i--) { - solver.clauseAllocator.clauseFree(clauses_toclear[i].first); - a++; - } - clauses_toclear.resize(clauses_toclear.size()-a); - - if (messed_matrix_vars_since_reversal) - return; - int c = std::min((int)gauss_last_level, (int)(solver.trail.size())-1); - for (; c >= (int)sublevel; c--) { - Var var = solver.trail[c].var(); - if (var < var_is_in.getSize() - && var_is_in[var] - && cur_matrixset.var_is_set[var]) { - messed_matrix_vars_since_reversal = true; - return; - } - } -} - -inline const uint32_t Gaussian::get_unit_truths() const -{ - return unit_truths; -} - -inline const uint Gaussian::get_called() const -{ - return called; -} - -inline const uint Gaussian::get_useful_prop() const -{ - return useful_prop; -} - -inline const uint Gaussian::get_useful_confl() const -{ - return useful_confl; -} - -inline const bool Gaussian::get_disabled() const -{ - return disabled; -} - -inline void Gaussian::set_disabled(const bool toset) -{ - disabled = toset; -} - -std::ostream& operator << (std::ostream& os, const vec& v); - -}; //NAMESPACE MINISAT - -#endif //GAUSSIAN_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/GaussianConfig.h b/src/vendor/stp/src/sat/cryptominisat2/GaussianConfig.h deleted file mode 100644 index 0806f83e0..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/GaussianConfig.h +++ /dev/null @@ -1,62 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef GAUSSIANCONFIG_H -#define GAUSSIANCONFIG_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "PackedRow.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class GaussianConfig -{ - public: - - GaussianConfig() : - only_nth_gauss_save(2) - , decision_until(0) - , dontDisable(false) - , noMatrixFind(false) - , orderCols(true) - , iterativeReduce(true) - , maxMatrixRows(1000) - , minMatrixRows(20) - { - } - - //tuneable gauss parameters - uint only_nth_gauss_save; //save only every n-th gauss matrix - uint decision_until; //do Gauss until this level - bool dontDisable; //If activated, gauss elimination is never disabled - bool noMatrixFind; //Put all xor-s into one matrix, don't find matrixes - bool orderCols; //Order columns according to activity - bool iterativeReduce; //Don't minimise matrix work - uint32_t maxMatrixRows; //The maximum matrix size -- no. of rows - uint32_t minMatrixRows; //The minimum matrix size -- no. of rows -}; - -}; //NAMESPACE MINISAT - -#endif //GAUSSIANCONFIG_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/Logger.cpp b/src/vendor/stp/src/sat/cryptominisat2/Logger.cpp deleted file mode 100644 index 59013e51c..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Logger.cpp +++ /dev/null @@ -1,909 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -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 -#include -using std::cout; -using std::endl; -using std::ofstream; - -#include "Logger.h" -#include "SolverTypes.h" -#include "Solver.h" -#include "Gaussian.h" - -#define FST_WIDTH 10 -#define SND_WIDTH 35 -#define TRD_WIDTH 10 - -namespace MINISAT -{ -using namespace MINISAT; - -Logger::Logger(int& _verbosity) : - proof_graph_on(false) - , mini_proof(false) - , statistics_on(false) - - , max_print_lines(20) - , uniqueid(1) - - , proof(NULL) - - , sum_conflict_depths(0) - , no_conflicts(0) - , no_decisions(0) - , no_propagations(0) - , sum_decisions_on_branches(0) - , sum_propagations_on_branches(0) - - , verbosity(_verbosity) - , begin_called(false) - , proofStarts(0) -{ - runid /= 10; - runid = time(NULL) % 10000; - if (verbosity >= 1) printf("c RunID is: #%d\n",runid); -} - -void Logger::setSolver(const Solver* _s) -{ - S = _s; -} - -// Adds a new variable to the knowledge of the logger -void Logger::new_var(const Var var) -{ - if (!statistics_on && !proof_graph_on) - return; - - if (varnames.size() <= var) { - varnames.resize(var+1, "Noname"); - times_var_propagated.resize(var+1, 0); - times_var_guessed.resize(var+1, 0); - depths_of_assigns_for_var.resize(var+1); - depths_of_assigns_unit.resize(var+1, false); - } -} - -// Resizes the groupnames and other, related vectors to accomodate for a new group -void Logger::new_group(const uint group) -{ - if (groupnames.size() <= group) { - groupnames.resize(group+1, "Noname"); - times_group_caused_conflict.resize(group+1, 0); - times_group_caused_propagation.resize(group+1, 0); - depths_of_propagations_for_group.resize(group+1); - depths_of_propagations_unit.resize(group+1, false); - depths_of_conflicts_for_group.resize(group+1); - } -} - -string Logger::cut_name_to_size(const string& name) const -{ - string ret = name; - uint len = name.length(); - while(len > 0 && (name[len-1] == ' ' || name[len-1] == 0x0A || name[len-1] == 0x0D)) { - ret.resize(len-1); - len--; - } - - if (len > SND_WIDTH-3) { - ret[SND_WIDTH-3] = '\0'; - ret[SND_WIDTH-4] = '.'; - ret[SND_WIDTH-5] = '.'; - } - - return ret; -} - -// Adds the new clause group's name to the information stored -void Logger::set_group_name(const uint group, const char* name_tmp) -{ - if (!statistics_on && !proof_graph_on) - return; - - string name; - if (name_tmp == NULL) return; - else name = name_tmp; - - set_group_name(group, name); -} - -void Logger::set_group_name(const uint group, string& name) -{ - new_group(group); - - if (name == "Noname") return; - - if (groupnames[group] == "Noname") { - groupnames[group] = name; - } else if (groupnames[group] != name) { - std::cout << "Error! Group no. " << group << "has been named twice. First, as '" << groupnames[group] << "', then second as '" << name << "'. Name the same group the same always, or don't give a name to the second iteration of the same group (i.e just write 'c g groupnumber' on the line" << std::endl; - exit(-1); - } -} - -string Logger::get_group_name(const uint group) const -{ - assert(group < groupnames.size()); - return groupnames[group]; -} - -string Logger::get_var_name(const Var var) const -{ - if (var >= varnames.size()) return "unknown"; - return varnames[var]; -} - -// sets the variable's name -void Logger::set_variable_name(const uint var, char* name_tmp) -{ - if (!statistics_on && !proof_graph_on) - return; - - new_var(var); - - string name; - if (name_tmp == NULL) - name = ""; - else - name = name_tmp; - - if (varnames[var] == "Noname") { - varnames[var] = name; - } else if (varnames[var] != name) { - printf("Error! Variable no. %d has been named twice. First, as '%s', then second as '%s'. Name the same group the same always, or don't give a name to the second iteration of the same group (i.e just write 'c g groupnumber' on the line\n", var+1, varnames[var].c_str(), name.c_str()); - exit(-1); - } -} - -void Logger::first_begin() -{ - if (begin_called) - return; - - begin(); -} - -void Logger::begin() -{ - begin_called = true; - if (proof_graph_on) { - std::stringstream filename; - filename << "proofs/" << runid << "-proof" << proofStarts++ << "-" << S->starts << ".dot"; - - if (S->starts == 0) - history.push_back(uniqueid); - else { - if (mini_proof) - history.resize(S->decisionLevel()+1); - else - history.resize(S->trail.size()+1); - } - - proof = fopen(filename.str().c_str(),"w"); - if (!proof) printf("Couldn't open proof file '%s' for writing\n", filename.str().c_str()), exit(-1); - fprintf(proof, "digraph G {\n"); - fprintf(proof,"node%d [shape=circle, label=\"BEGIN\", root];\n", history[history.size()-1]); - } - - if (statistics_on) - reset_statistics(); -} - -// For noting conflicts. Updates the proof graph and the statistics. -template -void Logger::conflict(const confl_type type, const uint goback_level, const uint group, const T& learnt_clause) -{ - first_begin(); - assert(!(proof == NULL && proof_graph_on)); - - const uint goback_sublevel = S->trail_lim[goback_level]; - - if (proof_graph_on) { - uniqueid++; - fprintf(proof,"node%d [shape=polygon,sides=5,label=\"",uniqueid); - - if (!mini_proof) { - for (uint32_t i = 0; i != learnt_clause.size(); i++) { - if (learnt_clause[i].sign()) fprintf(proof,"-"); - int myvar = learnt_clause[i].var(); - if (varnames[myvar] != "Noname") - fprintf(proof,"%s\\n",varnames[myvar].c_str()); - else - fprintf(proof,"Var: %d\\n",myvar); - } - } - fprintf(proof,"\"];\n"); - - fprintf(proof,"node%d -> node%d [label=\"",history[history.size()-1],uniqueid); - if (type == gauss_confl_type) - fprintf(proof,"Gauss\",style=bold"); - else - fprintf(proof,"%s\"", groupnames[group].c_str()); - fprintf(proof,"];\n"); - - if (!mini_proof) - history.resize(goback_sublevel+1); - else - history.resize(goback_level+1); - fprintf(proof,"node%d -> node%d [style=dotted];\n",uniqueid,history[history.size()-1]); - } - - if (statistics_on) { - times_group_caused_conflict[group]++; - depths_of_conflicts_for_group[group].sum += S->decisionLevel(); - depths_of_conflicts_for_group[group].num ++; - - no_conflicts++; - sum_conflict_depths += S->trail.size() - S->trail_lim[0]; - sum_decisions_on_branches += S->decisionLevel(); - sum_propagations_on_branches += S->trail.size() - S->trail_lim[0] - S->decisionLevel(); - - if (branch_depth_distrib.size() <= S->decisionLevel()) - branch_depth_distrib.resize(S->decisionLevel()+1, 0); - branch_depth_distrib[S->decisionLevel()]++; - } -} - -template void Logger::conflict(const confl_type type, const uint goback_level, const uint group, const Clause& learnt_clause); - -template void Logger::conflict(const confl_type type, const uint goback_level, const uint group, const vec& learnt_clause); - -// Propagating a literal. Type of literal and the (learned clause's)/(propagating clause's)/(etc) group must be given. Updates the proof graph and the statistics. note: the meaning of the variable 'group' depends on the type -void Logger::propagation(const Lit lit, Clause* c) -{ - first_begin(); - assert(!(proof == NULL && proof_graph_on)); - - uint group; - prop_type type; - if (c == NULL) { - if (S->decisionLevel() == 0) - type = add_clause_type; - else - type = guess_type; - group = std::numeric_limits::max(); - } else { - type = simple_propagation_type; - group = c->getGroup(); - } - - //graph - if (proof_graph_on && (!mini_proof || type == guess_type)) { - uniqueid++; - - fprintf(proof,"node%d [shape=box, label=\"",uniqueid);; - if (lit.sign()) - fprintf(proof,"-"); - if (varnames[lit.var()] != "Noname") - fprintf(proof,"%s\"];\n",varnames[lit.var()].c_str()); - else - fprintf(proof,"Var: %d\"];\n",lit.var()); - - fprintf(proof,"node%d -> node%d [label=\"",history[history.size()-1],uniqueid); - - switch (type) { - case simple_propagation_type: - fprintf(proof,"%s\"];\n", groupnames[group].c_str()); - break; - - case add_clause_type: - fprintf(proof,"red. from clause\"];\n"); - break; - - case guess_type: - fprintf(proof,"guess\",style=bold];\n"); - break; - } - history.push_back(uniqueid); - } - - if (statistics_on) { - switch (type) { - case simple_propagation_type: - depths_of_propagations_for_group[group].sum += S->decisionLevel(); - depths_of_propagations_for_group[group].num ++; - if (S->decisionLevel() == 0) depths_of_propagations_unit[group] = true; - times_group_caused_propagation[group]++; - case add_clause_type: - no_propagations++; - times_var_propagated[lit.var()]++; - depths_of_assigns_for_var[lit.var()].sum += S->decisionLevel(); - depths_of_assigns_for_var[lit.var()].num ++; - if (S->decisionLevel() == 0) depths_of_assigns_unit[lit.var()] = true; - break; - case guess_type: - no_decisions++; - times_var_guessed[lit.var()]++; - - depths_of_assigns_for_var[lit.var()].sum += S->decisionLevel(); - depths_of_assigns_for_var[lit.var()].num ++; - break; - } - } -} - -// Ending of a restart iteration -void Logger::end(const finish_type finish) -{ - first_begin(); - assert(!(proof == NULL && proof_graph_on)); - - if (proof_graph_on) { - uniqueid++; - switch (finish) { - case model_found: - fprintf(proof,"node%d [shape=doublecircle, label=\"MODEL\"];\n",uniqueid); - break; - case unsat_model_found: - fprintf(proof,"node%d [shape=doublecircle, label=\"UNSAT\"];\n",uniqueid); - break; - case restarting: - fprintf(proof,"node%d [shape=doublecircle, label=\"Re-starting\\nsearch\"];\n",uniqueid); - break; - } - - fprintf(proof,"node%d -> node%d;\n",history[history.size()-1],uniqueid); - fprintf(proof,"}\n"); - history.push_back(uniqueid); - - proof = (FILE*)fclose(proof); - assert(proof == NULL); - } - - if (statistics_on) { - printstats(); - if (finish == restarting) - reset_statistics(); - } - - if (model_found || unsat_model_found) - begin_called = false; -} - -void Logger::print_footer() const -{ - cout << "+" << std::setfill('-') << std::setw(FST_WIDTH+SND_WIDTH+TRD_WIDTH+4) << "-" << std::setfill(' ') << "+" << endl; -} - -void Logger::print_assign_var_order() const -{ - vector > prop_ordered; - for (uint i = 0; i < depths_of_assigns_for_var.size(); i++) { - double avg = (double)depths_of_assigns_for_var[i].sum - /(double)depths_of_assigns_for_var[i].num; - if (depths_of_assigns_for_var[i].num > 0 && !depths_of_assigns_unit[i]) - prop_ordered.push_back(std::make_pair(avg, i)); - } - - if (!prop_ordered.empty()) { - print_footer(); - print_simple_line(" Variables are assigned in the following order"); - print_simple_line(" (unitary clauses not shown)"); - print_header("var", "var name", "avg order"); - std::sort(prop_ordered.begin(), prop_ordered.end()); - print_vars(prop_ordered); - } -} - -void Logger::print_prop_order() const -{ - vector > prop_ordered; - for (uint i = 0; i < depths_of_propagations_for_group.size(); i++) { - double avg = (double)depths_of_propagations_for_group[i].sum - /(double)depths_of_propagations_for_group[i].num; - if (depths_of_propagations_for_group[i].num > 0 && !depths_of_propagations_unit[i]) - prop_ordered.push_back(std::make_pair(avg, i)); - } - - if (!prop_ordered.empty()) { - print_footer(); - print_simple_line(" Propagation depth order of clause groups"); - print_simple_line(" (unitary clauses not shown)"); - print_header("group", "group name", "avg order"); - std::sort(prop_ordered.begin(), prop_ordered.end()); - print_groups(prop_ordered); - } -} - -void Logger::print_confl_order() const -{ - vector > confl_ordered; - for (uint i = 0; i < depths_of_conflicts_for_group.size(); i++) { - double avg = (double)depths_of_conflicts_for_group[i].sum - /(double)depths_of_conflicts_for_group[i].num; - if (depths_of_conflicts_for_group[i].num > 0) - confl_ordered.push_back(std::make_pair(avg, i)); - } - - if (!confl_ordered.empty()) { - print_footer(); - print_simple_line(" Avg. conflict depth order of clause groups"); - print_header("groupno", "group name", "avg. depth"); - std::sort(confl_ordered.begin(), confl_ordered.end()); - print_groups(confl_ordered); - } -} - - -void Logger::print_times_var_guessed() const -{ - vector > times_var_ordered; - for (uint32_t i = 0; i != varnames.size(); i++) if (times_var_guessed[i] > 0) - times_var_ordered.push_back(std::make_pair(times_var_guessed[i], i)); - - if (!times_var_ordered.empty()) { - print_footer(); - print_simple_line(" No. times variable branched on"); - print_header("var", "var name", "no. times"); - std::sort(times_var_ordered.rbegin(), times_var_ordered.rend()); - print_vars(times_var_ordered); - } -} - -void Logger::print_times_group_caused_propagation() const -{ - vector > props_group_ordered; - for (uint i = 0; i < times_group_caused_propagation.size(); i++) - if (times_group_caused_propagation[i] > 0) - props_group_ordered.push_back(std::make_pair(times_group_caused_propagation[i], i)); - - if (!props_group_ordered.empty()) { - print_footer(); - print_simple_line(" No. propagations made by clause groups"); - print_header("group", "group name", "no. props"); - std::sort(props_group_ordered.rbegin(),props_group_ordered.rend()); - print_groups(props_group_ordered); - } -} - -void Logger::print_times_group_caused_conflict() const -{ - vector > confls_group_ordered; - for (uint i = 0; i < times_group_caused_conflict.size(); i++) - if (times_group_caused_conflict[i] > 0) - confls_group_ordered.push_back(std::make_pair(times_group_caused_conflict[i], i)); - - if (!confls_group_ordered.empty()) { - print_footer(); - print_simple_line(" No. conflicts made by clause groups"); - print_header("group", "group name", "no. confl"); - std::sort(confls_group_ordered.rbegin(), confls_group_ordered.rend()); - print_groups(confls_group_ordered); - } -} - -template -void Logger::print_line(const uint& number, const string& name, const T& value) const -{ - cout << "|" << std::setw(FST_WIDTH) << number << " " << std::setw(SND_WIDTH) << name << " " << std::setw(TRD_WIDTH) << value << "|" << endl; -} - -void Logger::print_header(const string& first, const string& second, const string& third) const -{ - cout << "|" << std::setw(FST_WIDTH) << first << " " << std::setw(SND_WIDTH) << second << " " << std::setw(TRD_WIDTH) << third << "|" << endl; - print_footer(); -} - -void Logger::print_groups(const vector >& to_print) const -{ - uint i = 0; - typedef vector >::const_iterator myiterator; - for (myiterator it = to_print.begin(); it != to_print.end() && i < max_print_lines; it++, i++) { - print_line(it->second+1, cut_name_to_size(groupnames[it->second]), it->first); - } - print_footer(); -} - -void Logger::print_groups(const vector >& to_print) const -{ - uint i = 0; - typedef vector >::const_iterator myiterator; - for (myiterator it = to_print.begin(); it != to_print.end() && i < max_print_lines; it++, i++) { - print_line(it->second+1, cut_name_to_size(groupnames[it->second]), it->first); - } - print_footer(); -} - -void Logger::print_vars(const vector >& to_print) const -{ - uint i = 0; - for (vector >::const_iterator it = to_print.begin(); it != to_print.end() && i < max_print_lines; it++, i++) - print_line(it->second+1, cut_name_to_size(varnames[it->second]), it->first); - - print_footer(); -} - -void Logger::print_vars(const vector >& to_print) const -{ - uint i = 0; - for (vector >::const_iterator it = to_print.begin(); it != to_print.end() && i < max_print_lines; it++, i++) { - print_line(it->second+1, cut_name_to_size(varnames[it->second]), it->first); - } - - print_footer(); -} - -template -void Logger::print_line(const string& str, const T& num) const -{ - cout << "|" << std::setw(FST_WIDTH+SND_WIDTH+4) << str << std::setw(TRD_WIDTH) << num << "|" << endl; -} - -void Logger::print_simple_line(const string& str) const -{ - cout << "|" << std::setw(FST_WIDTH+SND_WIDTH+TRD_WIDTH+4) << str << "|" << endl; -} - -void Logger::print_center_line(const string& str) const -{ - uint middle = (FST_WIDTH+SND_WIDTH+TRD_WIDTH+4-str.size())/2; - int rest = FST_WIDTH+SND_WIDTH+TRD_WIDTH+4-middle*2-str.size(); - cout << "|" << std::setw(middle) << " " << str << std::setw(middle + rest) << " " << "|" << endl; -} - -void Logger::print_branch_depth_distrib() const -{ - //cout << "--- Branch depth stats ---" << endl; - - const uint range = 20; - map range_stat; - - uint i = 0; - for (vector::const_iterator it = branch_depth_distrib.begin(); it != branch_depth_distrib.end(); it++, i++) { - range_stat[i/range] += *it; - } - - print_footer(); - print_simple_line(" No. search branches with branch depth between"); - print_line("Branch depth between", "no. br.-s"); - print_footer(); - - std::stringstream ss; - ss << "branch_depths/branch_depth_file" << runid << "-" << S->starts << ".txt"; - ofstream branch_depth_file; - branch_depth_file.open(ss.str().c_str()); - i = 0; - - for (map::iterator it = range_stat.begin(); it != range_stat.end(); it++, i++) { - std::stringstream ss2; - ss2 << it->first*range << " - " << it->first*range + range-1; - print_line(ss2.str(), it->second); - - if (branch_depth_file.is_open()) { - branch_depth_file << i << "\t" << it->second << "\t"; - if (i % 5 == 0) - branch_depth_file << "\"" << it->first*range << "\""; - else - branch_depth_file << "\"\""; - branch_depth_file << endl; - } - } - if (branch_depth_file.is_open()) - branch_depth_file.close(); - print_footer(); - -} - -void Logger::print_learnt_clause_distrib() const -{ - map learnt_sizes; - const vec& learnts = S->get_learnts(); - - uint maximum = 0; - - for (uint i = 0; i < learnts.size(); i++) - { - uint size = learnts[i]->size(); - maximum = std::max(maximum, size); - - map::iterator it = learnt_sizes.find(size); - if (it == learnt_sizes.end()) - learnt_sizes[size] = 1; - else - it->second++; - } - - learnt_sizes[0] = S->get_unitary_learnts_num(); - - uint slice = (maximum+1)/max_print_lines + (bool)((maximum+1)%max_print_lines); - - print_footer(); - print_simple_line(" Learnt clause length distribution"); - print_line("Length between", "no. cl."); - print_footer(); - - uint until = slice; - uint from = 0; - while(until < maximum+1) { - std::stringstream ss2; - ss2 << from << " - " << until-1; - - uint sum = 0; - for (; from < until; from++) { - map::const_iterator it = learnt_sizes.find(from); - if (it != learnt_sizes.end()) - sum += it->second; - } - - print_line(ss2.str(), sum); - - until += slice; - } - - print_footer(); - - print_leearnt_clause_graph_distrib(maximum, learnt_sizes); -} - -void Logger::print_leearnt_clause_graph_distrib(const uint maximum, const map& learnt_sizes) const -{ - uint no_slices = FST_WIDTH + SND_WIDTH + TRD_WIDTH + 4-3; - uint slice = (maximum+1)/no_slices + (bool)((maximum+1)%no_slices); - uint until = slice; - uint from = 0; - vector slices; - uint hmax = 0; - while(until < maximum+1) { - uint sum = 0; - for (; from < until; from++) { - map::const_iterator it = learnt_sizes.find(from); - if (it != learnt_sizes.end()) - sum += it->second; - } - slices.push_back(sum); - until += slice; - hmax = std::max(hmax, sum); - } - slices.resize(no_slices, 0); - - uint height = max_print_lines; - uint hslice = (hmax+1)/height + (bool)((hmax+1)%height); - if (hslice == 0) return; - - print_simple_line(" Learnt clause distribution in graph form"); - print_footer(); - string yaxis = "Number"; - uint middle = (height-yaxis.size())/2; - - for (int i = height-1; i > 0; i--) { - cout << "| "; - if (height-1-i >= middle && height-1-i-middle < yaxis.size()) - cout << yaxis[height-1-i-middle] << " "; - else - cout << " "; - for (uint i2 = 0; i2 != no_slices; i2++) { - if (slices[i2]/hslice >= (uint)i) cout << "+"; - else cout << " "; - } - cout << "|" << endl; - } - print_center_line(" Learnt clause size"); - print_footer(); -} - -void Logger::print_general_stats() const -{ - print_footer(); - print_simple_line(" Standard MiniSat stats -- for all restarts until now"); - print_footer(); - print_line("Restart number", S->starts); - print_line("Number of conflicts", S->conflicts); - print_line("Number of decisions", S->decisions); - print_line("Number of variables", S->order_heap.size()); - print_line("Number of clauses", S->nClauses()); - print_line("Number of literals in clauses",S->clauses_literals); - print_line("Avg. literals per learnt clause",(double)S->learnts_literals/(double)S->nLearnts()); - print_line("Progress estimate (%):", S->progress_estimate*100.0); - print_line("All unitary learnts until now", S->get_unitary_learnts_num()); - print_footer(); -} - -void Logger::print_learnt_unitaries(const uint from, const string display) const -{ - print_footer(); - print_simple_line(display); - print_header("var", "name", "value"); - uint32_t until; - if (S->decisionLevel() > 0) - until = S->trail_lim[0]; - else - until = S->trail.size(); - for (uint i = from; i < until; i++) { - Var var = S->trail[i].var(); - bool value = !(S->trail[i].sign()); - print_line(var+1, cut_name_to_size(varnames[var]), value); - } - print_footer(); -} - - -// Prints statistics on the console -void Logger::printstats() const -{ - assert(statistics_on); - assert(varnames.size() == times_var_guessed.size()); - assert(varnames.size() == times_var_propagated.size()); - - const uint fullwidth = FST_WIDTH+SND_WIDTH+TRD_WIDTH+4; - cout << endl; - cout << "+" << std::setfill('=') << std::setw(fullwidth) << "=" << "+" << endl; - std::stringstream tmp; - tmp << " STATS FOR RESTART NO. " << std::setw(3) << S->starts << " BEGIN "; - uint len = (fullwidth-2)/2-tmp.str().length()/2; - uint len2 = len + tmp.str().length()%2 + (fullwidth-2)%2; - cout << "||" << std::setfill('*') << std::setw(len) << "*" << tmp.str() << std::setw(len2) << "*" << "||" << endl; - cout << "+" << std::setfill('=') << std::setw(fullwidth) << "=" << std::setfill(' ') << "+" << endl; - - cout.setf(std::ios_base::left); - cout.precision(2); - print_statistics_note(); - print_times_var_guessed(); - print_times_group_caused_propagation(); - print_times_group_caused_conflict(); - print_prop_order(); - print_confl_order(); - print_assign_var_order(); - print_branch_depth_distrib(); - print_learnt_clause_distrib(); - #ifdef USE_GAUSS - print_matrix_stats(); - #endif //USE_GAUSS - print_learnt_unitaries(0," Unitary clauses learnt until now"); - print_learnt_unitaries(last_unitary_learnt_clauses, " Unitary clauses during this restart"); - print_advanced_stats(); - print_general_stats(); -} - -#ifdef USE_GAUSS -void Logger::print_matrix_stats() const -{ - print_footer(); - print_simple_line(" Matrix statistics"); - print_footer(); - - uint i = 0; - for (vector::const_iterator it = S->gauss_matrixes.begin(), end = S->gauss_matrixes.end(); it != end; it++, i++) { - std::stringstream s; - s << "Matrix " << i << " enabled"; - std::stringstream tmp; - tmp << std::boolalpha << !(*it)->get_disabled(); - print_line(s.str(), tmp.str()); - - s.str(""); - s << "Matrix " << i << " called"; - print_line(s.str(), (*it)->get_called()); - - s.str(""); - s << "Matrix " << i << " propagations"; - print_line(s.str(), (*it)->get_useful_prop()); - - s.str(""); - s << "Matrix " << i << " conflicts"; - print_line(s.str(), (*it)->get_useful_confl()); - } - - print_footer(); -} -#endif //USE_GAUSS - -void Logger::print_advanced_stats() const -{ - print_footer(); - print_simple_line(" Advanced statistics - for only this restart"); - print_footer(); - print_line("Unitary learnts", S->get_unitary_learnts_num() - last_unitary_learnt_clauses); - print_line("No. branches visited", no_conflicts); - print_line("Avg. branch depth", (double)sum_conflict_depths/(double)no_conflicts); - print_line("No. decisions", no_decisions); - print_line("No. propagations",no_propagations); - - //printf("no progatations/no decisions (i.e. one decision gives how many propagations on average *for the whole search graph*): %f\n", (double)no_propagations/(double)no_decisions); - //printf("no propagations/sum decisions on branches (if you look at one specific branch, what is the average number of propagations you will find?): %f\n", (double)no_propagations/(double)sum_decisions_on_branches); - - print_simple_line("sum decisions on branches/no. branches"); - print_simple_line(" (in a given branch, what is the avg."); - print_line(" no. of decisions?)",(double)sum_decisions_on_branches/(double)no_conflicts); - - print_simple_line("sum propagations on branches/no. branches"); - print_simple_line(" (in a given branch, what is the"); - print_line(" avg. no. of propagations?)",(double)sum_propagations_on_branches/(double)no_conflicts); - - print_footer(); -} - -void Logger::print_statistics_note() const -{ - print_footer(); - print_simple_line("Statistics note: If you used CryptoMiniSat as"); - print_simple_line("a library then vars are all shifted by 1 here"); - print_simple_line("and in every printed output of the solver."); - print_simple_line("This does not apply when you use CryptoMiniSat"); - print_simple_line("as a stand-alone program."); - print_footer(); -} - -// resets all stored statistics. Might be useful, to generate statistics for each restart and not for the whole search in general -void Logger::reset_statistics() -{ - assert(S->decisionLevel() == 0); - assert(times_var_guessed.size() == times_var_propagated.size()); - assert(times_group_caused_conflict.size() == times_group_caused_propagation.size()); - - typedef vector::iterator vecit; - for (vecit it = times_var_guessed.begin(); it != times_var_guessed.end(); it++) - *it = 0; - - for (vecit it = times_var_propagated.begin(); it != times_var_propagated.end(); it++) - *it = 0; - - for (vecit it = times_group_caused_conflict.begin(); it != times_group_caused_conflict.end(); it++) - *it = 0; - - for (vecit it = times_group_caused_propagation.begin(); it != times_group_caused_propagation.end(); it++) - *it = 0; - - for (vecit it = confls_by_group.begin(); it != confls_by_group.end(); it++) - *it = 0; - - for (vecit it = props_by_group.begin(); it != props_by_group.end(); it++) - *it = 0; - - typedef vector::iterator avgIt; - - for (avgIt it = depths_of_propagations_for_group.begin(); it != depths_of_propagations_for_group.end(); it++) { - it->sum = 0; - it->num = 0; - } - - for (avgIt it = depths_of_conflicts_for_group.begin(); it != depths_of_conflicts_for_group.end(); it++) { - it->sum = 0; - it->num = 0; - } - - for (avgIt it = depths_of_assigns_for_var.begin(); it != depths_of_assigns_for_var.end(); it++) { - it->sum = 0; - it->num = 0; - } - for (uint i = 0; i < depths_of_assigns_unit.size(); i++) - depths_of_assigns_unit[i] = false; - - for (uint i = 0; i < depths_of_propagations_unit.size(); i++) - depths_of_propagations_unit[i] = false; - - sum_conflict_depths = 0; - no_conflicts = 0; - no_decisions = 0; - no_propagations = 0; - sum_decisions_on_branches = 0; - sum_propagations_on_branches = 0; - branch_depth_distrib.clear(); - last_unitary_learnt_clauses = S->get_unitary_learnts_num(); -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/Logger.h b/src/vendor/stp/src/sat/cryptominisat2/Logger.h deleted file mode 100644 index 7567c7a38..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Logger.h +++ /dev/null @@ -1,190 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -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 LOGGER_H -#define LOGGER_H - -#include -#include -#include -#include -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Vec.h" -#include "Heap.h" -#include "Alg.h" -#include "SolverTypes.h" -#include "limits.h" -#include "Clause.h" - -using std::vector; -using std::pair; -using std::string; -using std::map; - -namespace MINISAT -{ -using namespace MINISAT; - -class Solver; - -class MyAvg { -public: - MyAvg() : - sum(0) - , num(0) - {} - - uint sum; - uint num; -}; - -class Logger -{ -public: - Logger(int& vebosity); - void setSolver(const Solver* S); - - //types of props, confl, and finish - enum prop_type { add_clause_type, guess_type, simple_propagation_type}; - enum confl_type { simple_confl_type, gauss_confl_type }; - enum finish_type { model_found, unsat_model_found, restarting}; - - //Conflict and propagation(guess is also a proapgation...) - template - void conflict(const confl_type type, const uint goback_level, const uint group, const T& learnt_clause); - void propagation(const Lit lit, Clause* c); - - //functions to add/name variables - void new_var(const Var var); - void set_variable_name(const uint var, char* name_tmp); - - //function to name clause groups - void set_group_name(const uint group, const char* name_tmp); - void set_group_name(const uint group, string& name); - string get_group_name(const uint group) const; - string get_var_name(const Var var) const; - - void begin(); - void end(const finish_type finish); - - void newclause(const vec& ps, const bool xor_clause, const uint group); - - bool proof_graph_on; - bool mini_proof; - bool statistics_on; - -private: - void new_group(const uint group); - string cut_name_to_size(const string& name) const; - - void print_groups(const vector >& to_print) const; - void print_groups(const vector >& to_print) const; - void print_vars(const vector >& to_print) const; - void print_vars(const vector >& to_print) const; - void print_times_var_guessed() const; - void print_times_group_caused_propagation() const; - void print_times_group_caused_conflict() const; - void print_branch_depth_distrib() const; - void print_learnt_clause_distrib() const; - void print_leearnt_clause_graph_distrib(const uint maximum, const map& learnt_sizes) const; - void print_advanced_stats() const; - void print_statistics_note() const; - void print_matrix_stats() const; - void print_general_stats() const; - void print_learnt_unitaries(const uint from, const string display) const; - - uint max_print_lines; - template - void print_line(const uint& number, const string& name, const T& value) const; - void print_header(const string& first, const string& second, const string& third) const; - void print_footer() const; - template - void print_line(const string& str, const T& num) const; - void print_simple_line(const string& str) const; - void print_center_line(const string& str) const; - - void print_confl_order() const; - void print_prop_order() const; - void print_assign_var_order() const; - void printstats() const; - void reset_statistics(); - - //internal data structures - uint uniqueid; //used to store the last unique ID given to a node - vector history; //stores the node uniqueIDs - - //graph drawing - FILE* proof; //The file to store the proof - uint runid; - - //--------------------- - //statistics collection - //--------------------- - - //group and var names - vector groupnames; - vector varnames; - - //confls and props grouped by clause groups - vector confls_by_group; - vector props_by_group; - - //props and guesses grouped by vars - vector times_var_guessed; - vector times_var_propagated; - - vector times_group_caused_conflict; - vector times_group_caused_propagation; - - vector depths_of_propagations_for_group; - vector depths_of_propagations_unit; - vector depths_of_conflicts_for_group; - vector depths_of_assigns_for_var; - vector depths_of_assigns_unit; - - //the distribution of branch depths. first = depth, second = number of occurances - vector branch_depth_distrib; - - uint64_t sum_conflict_depths; - uint64_t no_conflicts; - uint64_t no_decisions; - uint64_t no_propagations; - uint64_t sum_decisions_on_branches; - uint64_t sum_propagations_on_branches; - uint64_t last_unitary_learnt_clauses; - - //message display properties - const int& verbosity; - - const Solver* S; - - void first_begin(); - bool begin_called; - uint proofStarts; -}; - -}; //NAMESPACE MINISAT - -#endif //LOGGER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/MTRand/MersenneTwister.h b/src/vendor/stp/src/sat/cryptominisat2/MTRand/MersenneTwister.h deleted file mode 100644 index 964ecc736..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/MTRand/MersenneTwister.h +++ /dev/null @@ -1,427 +0,0 @@ -// MersenneTwister.h -// Mersenne Twister random number generator -- a C++ class MTRand -// Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// Richard J. Wagner v1.0 15 May 2003 rjwagner@writeme.com - -// The Mersenne Twister is an algorithm for generating random numbers. It -// was designed with consideration of the flaws in various other generators. -// The period, 2^19937-1, and the order of equidistribution, 623 dimensions, -// are far greater. The generator is also fast; it avoids multiplication and -// division, and it benefits from caches and pipelines. For more information -// see the inventors' web page at http://www.math.keio.ac.jp/~matumoto/emt.html - -// Reference -// M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally -// Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on -// Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. - -// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, -// Copyright (C) 2000 - 2003, Richard J. Wagner -// 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. The names of its contributors may not be used to endorse or promote -// products derived from this software without specific prior written -// permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT OWNER 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 original code included the following notice: -// -// When you use this, send an email to: matumoto@math.keio.ac.jp -// with an appropriate reference to your work. -// -// It would be nice to CC: rjwagner@writeme.com and Cokus@math.washington.edu -// when you write. - -#ifndef MERSENNETWISTER_H -#define MERSENNETWISTER_H - -#include -#include -#include -#include -#include - -namespace MINISAT -{ - -// Not thread safe (unless auto-initialization is avoided and each thread has -// its own MTRand object) - -class MTRand { -// Data -public: - typedef unsigned long uint32; // unsigned integer type, at least 32 bits - - enum { N = 624 }; // length of state vector - enum { SAVE = N + 1 }; // length of array for save() - -protected: - enum { M = 397 }; // period parameter - - uint32 state[N]; // internal state - uint32 *pNext; // next value to get from state - int left; // number of values left before reload needed - - -//Methods -public: - MTRand( const uint32& oneSeed ); // initialize with a simple uint32 - MTRand( uint32 *const bigSeed, uint32 const seedLength = N ); // or an array - MTRand(); // auto-initialize with /dev/urandom or time() and clock() - - // Do NOT use for CRYPTOGRAPHY without securely hashing several returned - // values together, otherwise the generator state can be learned after - // reading 624 consecutive values. - - // Access to 32-bit random numbers - double rand(); // real number in [0,1] - double rand( const double& n ); // real number in [0,n] - double randExc(); // real number in [0,1) - double randExc( const double& n ); // real number in [0,n) - double randDblExc(); // real number in (0,1) - double randDblExc( const double& n ); // real number in (0,n) - uint32 randInt(); // integer in [0,2^32-1] - uint32 randInt( const uint32& n ); // integer in [0,n] for n < 2^32 - double operator()() { return rand(); } // same as rand() - - // Access to 53-bit random numbers (capacity of IEEE double precision) - double rand53(); // real number in [0,1) - - // Access to nonuniform random number distributions - double randNorm( const double& mean = 0.0, const double& variance = 0.0 ); - - // Re-seeding functions with same behavior as initializers - void seed( const uint32 oneSeed ); - void seed( uint32 *const bigSeed, const uint32 seedLength = N ); - void seed(); - - // Saving and loading generator state - void save( uint32* saveArray ) const; // to array of size SAVE - void load( uint32 *const loadArray ); // from such array - friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ); - friend std::istream& operator>>( std::istream& is, MTRand& mtrand ); - -protected: - void initialize( const uint32 oneSeed ); - void reload(); - uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; } - uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; } - uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; } - uint32 mixBits( const uint32& u, const uint32& v ) const - { return hiBit(u) | loBits(v); } - uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const - { return m ^ (mixBits(s0,s1)>>1) ^ (-loBit(s1) & 0x9908b0dfUL); } - static uint32 hash( time_t t, clock_t c ); -}; - - -inline MTRand::MTRand( const uint32& oneSeed ) - { seed(oneSeed); } - -inline MTRand::MTRand( uint32 *const bigSeed, const uint32 seedLength ) - { seed(bigSeed,seedLength); } - -inline MTRand::MTRand() - { seed(); } - -inline double MTRand::rand() - { return double(randInt()) * (1.0/4294967295.0); } - -inline double MTRand::rand( const double& n ) - { return rand() * n; } - -inline double MTRand::randExc() - { return double(randInt()) * (1.0/4294967296.0); } - -inline double MTRand::randExc( const double& n ) - { return randExc() * n; } - -inline double MTRand::randDblExc() - { return ( double(randInt()) + 0.5 ) * (1.0/4294967296.0); } - -inline double MTRand::randDblExc( const double& n ) - { return randDblExc() * n; } - -inline double MTRand::rand53() -{ - uint32 a = randInt() >> 5, b = randInt() >> 6; - return ( a * 67108864.0 + b ) * (1.0/9007199254740992.0); // by Isaku Wada -} - -inline double MTRand::randNorm( const double& mean, const double& variance ) -{ - // Return a real number from a normal (Gaussian) distribution with given - // mean and variance by Box-Muller method - double r = sqrt( -2.0 * log( 1.0-randDblExc()) ) * variance; - double phi = 2.0 * 3.14159265358979323846264338328 * randExc(); - return mean + r * cos(phi); -} - -inline MTRand::uint32 MTRand::randInt() -{ - // Pull a 32-bit integer from the generator state - // Every other access function simply transforms the numbers extracted here - - if( left == 0 ) reload(); - --left; - - register uint32 s1; - s1 = *pNext++; - s1 ^= (s1 >> 11); - s1 ^= (s1 << 7) & 0x9d2c5680UL; - s1 ^= (s1 << 15) & 0xefc60000UL; - return ( s1 ^ (s1 >> 18) ); -} - -inline MTRand::uint32 MTRand::randInt( const uint32& n ) -{ - // Find which bits are used in n - // Optimized by Magnus Jonsson (magnus@smartelectronix.com) - uint32 used = n; - used |= used >> 1; - used |= used >> 2; - used |= used >> 4; - used |= used >> 8; - used |= used >> 16; - - // Draw numbers until one is found in [0,n] - uint32 i; - do - i = randInt() & used; // toss unused bits to shorten search - while( i > n ); - return i; -} - - -inline void MTRand::seed( const uint32 oneSeed ) -{ - // Seed the generator with a simple uint32 - initialize(oneSeed); - reload(); -} - - -inline void MTRand::seed( uint32 *const bigSeed, const uint32 seedLength ) -{ - // Seed the generator with an array of uint32's - // There are 2^19937-1 possible initial states. This function allows - // all of those to be accessed by providing at least 19937 bits (with a - // default seed length of N = 624 uint32's). Any bits above the lower 32 - // in each element are discarded. - // Just call seed() if you want to get array from /dev/urandom - initialize(19650218UL); - register int i = 1; - register uint32 j = 0; - register int k = ( N > seedLength ? N : seedLength ); - for( ; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1664525UL ); - state[i] += ( bigSeed[j] & 0xffffffffUL ) + j; - state[i] &= 0xffffffffUL; - ++i; ++j; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - if( j >= seedLength ) j = 0; - } - for( k = N - 1; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL ); - state[i] -= i; - state[i] &= 0xffffffffUL; - ++i; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - } - state[0] = 0x80000000UL; // MSB is 1, assuring non-zero initial array - reload(); -} - - -inline void MTRand::seed() -{ - // Seed the generator with an array from /dev/urandom if available - // Otherwise use a hash of time() and clock() values - - // First try getting an array from /dev/urandom - FILE* urandom = fopen( "/dev/urandom", "rb" ); - if( urandom ) - { - uint32 bigSeed[N]; - register uint32 *s = bigSeed; - register int i = N; - register bool success = true; - while( success && i-- ) - success = fread( s++, sizeof(uint32), 1, urandom ); - fclose(urandom); - if( success ) { seed( bigSeed, N ); return; } - } - - // Was not successful, so use time() and clock() instead - seed( hash( time(NULL), clock() ) ); -} - - -inline void MTRand::initialize( const uint32 seed ) -{ - // Initialize generator state with seed - // See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. - // In previous versions, most significant bits (MSBs) of the seed affect - // only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. - register uint32 *s = state; - register uint32 *r = state; - register int i = 1; - *s++ = seed & 0xffffffffUL; - for( ; i < N; ++i ) - { - *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL; - r++; - } -} - - -inline void MTRand::reload() -{ - // Generate N new values in state - // Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) - register uint32 *p = state; - register int i; - for( i = N - M; i--; ++p ) - *p = twist( p[M], p[0], p[1] ); - for( i = M; --i; ++p ) - *p = twist( p[M-N], p[0], p[1] ); - *p = twist( p[M-N], p[0], state[0] ); - - left = N, pNext = state; -} - - -inline MTRand::uint32 MTRand::hash( time_t t, clock_t c ) -{ - // Get a uint32 from t and c - // Better than uint32(x) in case x is floating point in [0,1] - // Based on code by Lawrence Kirby (fred@genesis.demon.co.uk) - - static uint32 differ = 0; // guarantee time-based seeds will change - - uint32 h1 = 0; - unsigned char *p = (unsigned char *) &t; - for( size_t i = 0; i < sizeof(t); ++i ) - { - h1 *= UCHAR_MAX + 2U; - h1 += p[i]; - } - uint32 h2 = 0; - p = (unsigned char *) &c; - for( size_t j = 0; j < sizeof(c); ++j ) - { - h2 *= UCHAR_MAX + 2U; - h2 += p[j]; - } - return ( h1 + differ++ ) ^ h2; -} - - -inline void MTRand::save( uint32* saveArray ) const -{ - register uint32 *sa = saveArray; - register const uint32 *s = state; - register int i = N; - for( ; i--; *sa++ = *s++ ) {} - *sa = left; -} - - -inline void MTRand::load( uint32 *const loadArray ) -{ - register uint32 *s = state; - register uint32 *la = loadArray; - register int i = N; - for( ; i--; *s++ = *la++ ) {} - left = *la; - pNext = &state[N-left]; -} - - -inline std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ) -{ - register const MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for( ; i--; os << *s++ << "\t" ) {} - return os << mtrand.left; -} - - -inline std::istream& operator>>( std::istream& is, MTRand& mtrand ) -{ - register MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for( ; i--; is >> *s++ ) {} - is >> mtrand.left; - mtrand.pNext = &mtrand.state[mtrand.N-mtrand.left]; - return is; -} -}; - -#endif // MERSENNETWISTER_H - -// Change log: -// -// v0.1 - First release on 15 May 2000 -// - Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// - Translated from C to C++ -// - Made completely ANSI compliant -// - Designed convenient interface for initialization, seeding, and -// obtaining numbers in default or user-defined ranges -// - Added automatic seeding from /dev/urandom or time() and clock() -// - Provided functions for saving and loading generator state -// -// v0.2 - Fixed bug which reloaded generator one step too late -// -// v0.3 - Switched to clearer, faster reload() code from Matthew Bellew -// -// v0.4 - Removed trailing newline in saved generator format to be consistent -// with output format of built-in types -// -// v0.5 - Improved portability by replacing static const int's with enum's and -// clarifying return values in seed(); suggested by Eric Heimburg -// - Removed MAXINT constant; use 0xffffffffUL instead -// -// v0.6 - Eliminated seed overflow when uint32 is larger than 32 bits -// - Changed integer [0,n] generator to give better uniformity -// -// v0.7 - Fixed operator precedence ambiguity in reload() -// - Added access for real numbers in (0,1) and (0,n) -// -// v0.8 - Included time.h header to properly support time_t and clock_t -// -// v1.0 - Revised seeding to match 26 Jan 2002 update of Nishimura and Matsumoto -// - Allowed for seeding with arrays of any length -// - Added access for real numbers in [0,1) with 53-bit resolution -// - Added access for real numbers from normal (Gaussian) distributions -// - Increased overall speed by optimizing twist() -// - Doubled speed of integer [0,n] generation -// - Fixed out-of-range number generation on 64-bit machines -// - Improved portability by substituting literal constants for long enum's -// - Changed license from GNU LGPL to BSD diff --git a/src/vendor/stp/src/sat/cryptominisat2/Main.cpp b/src/vendor/stp/src/sat/cryptominisat2/Main.cpp deleted file mode 100644 index 393961192..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Main.cpp +++ /dev/null @@ -1,882 +0,0 @@ -/******************************************************************************************[Main.C] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -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 -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include - -#ifndef DISABLE_ZLIB -#include -#endif // DISABLE_ZLIB - -#include "Logger.h" -#include "Solver.h" -#include "time_mem.h" -#include "constants.h" - -using std::cout; -using std::endl; - -/*************************************************************************************/ -#if defined(__linux__) -#include -#endif - -using namespace MINISAT; - -namespace MINISAT -{ - -static bool grouping = false; -static bool debugLib = false; -static bool debugNewVar = false; -static char learnts_filename[500]; -static bool dumpLearnts = false; -static uint32_t maxLearntsSize = std::numeric_limits::max(); -static bool printResult = true; - -//================================================================================================= -// DIMACS Parser: - -#define CHUNK_LIMIT 1048576 -#define MAX_NAMES_SIZE 1000 - -class StreamBuffer -{ -#ifdef DISABLE_ZLIB - FILE * in; -#else - gzFile in; -#endif // DISABLE_ZLIB - char buf[CHUNK_LIMIT]; - int pos; - int size; - - void assureLookahead() { - if (pos >= size) { - pos = 0; -#ifdef DISABLE_ZLIB - #ifdef VERBOSE_DEBUG - printf("buf = %08X\n", buf); - printf("sizeof(buf) = %u\n", sizeof(buf)); - #endif //VERBOSE_DEBUG - size = fread(buf, 1, sizeof(buf), in); -#else - size = gzread(in, buf, sizeof(buf)); -#endif // DISABLE_ZLIB - } - } - -public: -#ifdef DISABLE_ZLIB - StreamBuffer(FILE * i) : in(i), pos(0), size(0) { -#else - StreamBuffer(gzFile i) : in(i), pos(0), size(0) { -#endif // DISABLE_ZLIB - assureLookahead(); - } - - int operator * () { - return (pos >= size) ? EOF : buf[pos]; - } - void operator ++ () { - pos++; - assureLookahead(); - } -}; - -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -template -static void skipWhitespace(B& in) -{ - while ((*in >= 9 && *in <= 13) || *in == 32) - ++in; -} - -template -static void skipLine(B& in) -{ - for (;;) { - if (*in == EOF || *in == '\0') return; - if (*in == '\n') { - ++in; - return; - } - ++in; - } -} - -template -static void untilEnd(B& in, char* ret) -{ - uint32_t sizeRead = 0; - for (;sizeRead < MAX_NAMES_SIZE-1; sizeRead++) { - if (*in == EOF || *in == '\0') return; - if (*in == '\n') { - return; - } - *ret = *in; - ret++; - *ret = '\0'; - ++in; - } -} - - -template -static int parseInt(B& in) -{ - int val = 0; - bool neg = false; - skipWhitespace(in); - if (*in == '-') neg = true, ++in; - else if (*in == '+') ++in; - if (*in < '0' || *in > '9') printf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3); - while (*in >= '0' && *in <= '9') - val = val*10 + (*in - '0'), - ++in; - return neg ? -val : val; -} - -inline std::string stringify(uint x) -{ - std::ostringstream o; - o << x; - return o.str(); -} - -template -static void parseString(B& in, std::string& str) -{ - str.clear(); - skipWhitespace(in); - while (*in != ' ' && *in != '\n') { - str += *in; - ++in; - } -} - -template -static void readClause(B& in, Solver& S, vec& lits) -{ - int parsed_lit; - Var var; - lits.clear(); - for (;;) { - parsed_lit = parseInt(in); - if (parsed_lit == 0) break; - var = abs(parsed_lit)-1; - if (!debugNewVar) { - while (var >= S.nVars()) S.newVar(); - } - lits.push( (parsed_lit > 0) ? Lit(var, false) : Lit(var, true) ); - } -} - -template -static bool match(B& in, const char* str) -{ - for (; *str != 0; ++str, ++in) - if (*str != *in) - return false; - return true; -} - - -template -static void parse_DIMACS_main(B& in, Solver& S) -{ - vec lits; - int group = 0; - string str; - uint debugLibPart = 1; - char name[MAX_NAMES_SIZE]; - - - for (;;) { - skipWhitespace(in); - switch (*in) { - case EOF: - return; - case 'p': - if (match(in, "p cnf")) { - int vars = parseInt(in); - int clauses = parseInt(in); - if (S.verbosity >= 1) { - printf("c | Number of variables: %-12d |\n", vars); - printf("c | Number of clauses: %-12d |\n", clauses); - } - } else { - printf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3); - } - break; - case 'c': - ++in; - parseString(in, str); - if (str == "v" || str == "var") { - int var = parseInt(in); - skipWhitespace(in); - if (var <= 0) cout << "PARSE ERROR! Var number must be a positive integer" << endl, exit(3); - name[0] = '\0'; - untilEnd(in, name); - S.setVariableName(var-1, name); - } else if (debugLib && str == "Solver::solve()") { - lbool ret = S.solve(); - std::string s = "debugLibPart" + stringify(debugLibPart) +".output"; - FILE* res = fopen(s.c_str(), "w"); - if (ret == l_True) { - fprintf(res, "SAT\n"); - for (Var i = 0; i != S.nVars(); i++) - if (S.model[i] != l_Undef) - fprintf(res, "%s%s%d", (i==0)?"":" ", (S.model[i]==l_True)?"":"-", i+1); - fprintf(res, " 0\n"); - } else if (ret == l_False) { - fprintf(res, "UNSAT\n"); - } else if (ret == l_Undef) { - assert(false); - } else { - assert(false); - } - fclose(res); - debugLibPart++; - } else if (debugNewVar && str == "Solver::newVar()") { - S.newVar(); - } else { - //printf("didn't understand in CNF file: 'c %s'\n", str.c_str()); - skipLine(in); - } - break; - default: - bool xor_clause = false; - if ( *in == 'x') xor_clause = true, ++in; - readClause(in, S, lits); - skipLine(in); - - name[0] = '\0'; - - if (!grouping) group++; - else { - if (*in != 'c') { - cout << "PARSE ERROR! Group must be present after earch clause ('c' missing after clause line)" << endl; - exit(3); - } - ++in; - - parseString(in, str); - if (str != "g" && str != "group") { - cout << "PARSE ERROR! Group must be present after each clause('group' missing)!" << endl; - cout << "Instead of 'group' there was:" << str << endl; - exit(3); - } - - group = parseInt(in); - if (group <= 0) printf("PARSE ERROR! Group number must be a positive integer\n"), exit(3); - - skipWhitespace(in); - untilEnd(in, name); - } - - if (xor_clause) { - bool xor_clause_inverted = false; - for (uint32_t i = 0; i < lits.size(); i++) { - xor_clause_inverted ^= lits[i].sign(); - } - S.addXorClause(lits, xor_clause_inverted, group, name); - } else - S.addClause(lits, group, name); - break; - } - } -} - -// Inserts problem into solver. -// -#ifdef DISABLE_ZLIB -static void parse_DIMACS(FILE * input_stream, Solver& S) -#else -static void parse_DIMACS(gzFile input_stream, Solver& S) -#endif // DISABLE_ZLIB -{ - StreamBuffer in(input_stream); - parse_DIMACS_main(in, S); -} - - -//================================================================================================= - -template -inline void printStatsLine(string left, T value, T2 value2, string extra) -{ - cout << std::fixed << std::left << std::setw(24) << left << ": " << std::setw(11) << std::setprecision(2) << value << " (" << std::left << std::setw(9) << std::setprecision(2) << value2 << " " << extra << ")" << std::endl; -} - -template -inline void printStatsLine(string left, T value, string extra = "") -{ - cout << std::fixed << std::left << std::setw(24) << left << ": " << std::setw(11) << std::setprecision(2) << value << extra << std::endl; -} - - -void printStats(Solver& solver) -{ - double cpu_time = cpuTime(); - uint64_t mem_used = memUsed(); - - //Restarts stats - printStatsLine("c restarts", solver.starts); - printStatsLine("c dynamic restarts", solver.dynStarts); - printStatsLine("c static restarts", solver.staticStarts); - printStatsLine("c full restarts", solver.fullStarts); - - //Learnts stats - printStatsLine("c learnts DL2", solver.nbDL2); - printStatsLine("c learnts size 2", solver.nbBin); - printStatsLine("c learnts size 1", solver.get_unitary_learnts_num(), (double)solver.get_unitary_learnts_num()/(double)solver.nVars()*100.0, "% of vars"); - - //Subsumer stats - printStatsLine("c v-elim SatELite", solver.getNumElimSubsume(), (double)solver.getNumElimSubsume()/(double)solver.nVars()*100.0, "% vars"); - printStatsLine("c SatELite time", solver.getTotalTimeSubsumer(), solver.getTotalTimeSubsumer()/cpu_time*100.0, "% time"); - - //XorSubsumer stats - printStatsLine("c v-elim xor", solver.getNumElimXorSubsume(), (double)solver.getNumElimXorSubsume()/(double)solver.nVars()*100.0, "% vars"); - printStatsLine("c xor elim time", solver.getTotalTimeXorSubsumer(), solver.getTotalTimeXorSubsumer()/cpu_time*100.0, "% time"); - - //VarReplacer stats - printStatsLine("c num binary xor trees", solver.getNumXorTrees()); - printStatsLine("c binxor trees' crown", solver.getNumXorTreesCrownSize(), (double)solver.getNumXorTreesCrownSize()/(double)solver.getNumXorTrees(), "leafs/tree"); - - //OTF clause improvement stats - printStatsLine("c OTF clause improved", solver.improvedClauseNo, (double)solver.improvedClauseNo/(double)solver.conflicts, "clauses/conflict"); - printStatsLine("c OTF impr. size diff", solver.improvedClauseSize, (double)solver.improvedClauseSize/(double)solver.improvedClauseNo, " lits/clause"); - - #ifdef USE_GAUSS - if (solver.gaussconfig.decision_until > 0) { - std::cout << "c " << std::endl; - printStatsLine("c gauss unit truths ", solver.get_sum_gauss_unit_truths()); - printStatsLine("c gauss called", solver.get_sum_gauss_called()); - printStatsLine("c gauss conflicts ", solver.get_sum_gauss_confl(), (double)solver.get_sum_gauss_confl() / (double)solver.get_sum_gauss_called() * 100.0, " %"); - printStatsLine("c gauss propagations ", solver.get_sum_gauss_prop(), (double)solver.get_sum_gauss_prop() / (double)solver.get_sum_gauss_called() * 100.0, " %"); - printStatsLine("c gauss useful", ((double)solver.get_sum_gauss_prop() + (double)solver.get_sum_gauss_confl())/ (double)solver.get_sum_gauss_called() * 100.0, " %"); - std::cout << "c " << std::endl; - } - #endif - - //Search stats - printStatsLine("c conflicts", solver.conflicts, (double)solver.conflicts/cpu_time, "/ sec"); - printStatsLine("c decisions", solver.decisions, (double)solver.rnd_decisions*100.0/(double)solver.decisions, "% random"); - printStatsLine("c propagations", solver.propagations, (double)solver.propagations/cpu_time, "/ sec"); - printStatsLine("c conflict literals", solver.tot_literals, (double)(solver.max_literals - solver.tot_literals)*100.0/ (double)solver.max_literals, "% deleted"); - - //General stats - printStatsLine("c Memory used", (double)mem_used / 1048576.0, " MB"); - printStatsLine("c CPU time", cpu_time, " s"); -} - -Solver* solver; -static void SIGINT_handler(int signum) -{ - printf("\n"); - printf("*** INTERRUPTED ***\n"); - printStats(*solver); - if (dumpLearnts) { - solver->dumpSortedLearnts(learnts_filename, maxLearntsSize); - cout << "c Sorted learnt clauses dumped to file '" << learnts_filename << "'" << endl; - } - printf("\n"); - printf("*** INTERRUPTED ***\n"); - exit(1); -} - - -//================================================================================================= -// Main: - -void printUsage(char** argv, Solver& S) -{ -#ifdef DISABLE_ZLIB - printf("USAGE: %s [options] \n\n where input is plain DIMACS.\n\n", argv[0]); -#else - printf("USAGE: %s [options] \n\n where input may be either in plain or gzipped DIMACS.\n\n", argv[0]); -#endif // DISABLE_ZLIB - printf("OPTIONS:\n\n"); - printf(" --polarity-mode = {true,false,rnd,auto} [default: auto]. Selects the default\n"); - printf(" polarity mode. Auto is the Jeroslow&Wang method\n"); - //printf(" -decay = [ 0 - 1 ]\n"); - printf(" --rnd-freq = [ 0 - 1 ]\n"); - printf(" --verbosity = {0,1,2}\n"); - #ifdef STATS_NEEDED - printf(" --proof-log = Logs the proof into files 'proofN.dot', where N is the\n"); - printf(" restart number. The log can then be visualized using\n"); - printf(" the 'dot' program from the graphviz package\n"); - printf(" --grouping = Lets you group clauses, and customize the groups' names.\n"); - printf(" This helps when printing statistics\n"); - printf(" --stats = Computes and prints statistics during the search\n"); - #endif - printf(" --randomize = [0 - 2^32-1] Sets random seed, used for picking\n"); - printf(" decision variables (default = 0)\n"); - printf(" --restrict = [1 - varnum] when picking random variables to branch\n"); - printf(" on, pick one that in the 'num' most active vars useful\n"); - printf(" for cryptographic problems, where the question is the key,\n"); - printf(" which is usually small (e.g. 80 bits)\n"); - printf(" --gaussuntil = Depth until which Gaussian elimination is active.\n"); - printf(" Giving 0 switches off Gaussian elimination\n"); - printf(" --restarts = [1 - 2^32-1] No more than the given number of\n"); - printf(" restarts will be performed during search\n"); - printf(" --nonormxorfind = Don't find and collect >2-long xor-clauses from\n"); - printf(" regular clauses\n"); - printf(" --nobinxorfind = Don't find and collect 2-long xor-clauses from\n"); - printf(" regular clauses\n"); - printf(" --noregbxorfind = Don't regularly find and collect 2-long xor-clauses\n"); - printf(" from regular clauses\n"); - printf(" --noconglomerate = Don't conglomerate 2 xor clauses when one var is dependent\n"); - printf(" --nosimplify = Don't do regular simplification rounds\n"); - printf(" --greedyunbound = Greedily unbound variables that are not needed for SAT\n"); - printf(" --debuglib = Solve at specific 'c Solver::solve()' points in the CNF\n"); - printf(" file. Used to debug file generated by Solver's\n"); - printf(" needLibraryCNFFile() function\n"); - printf(" --debugnewvar = Add new vars at specific 'c Solver::newVar()' points in \n"); - printf(" the CNF file. Used to debug file generated by Solver's\n"); - printf(" needLibraryCNFFile() function.\n"); - printf(" --novarreplace = Don't perform variable replacement. Needed for programmable\n"); - printf(" solver feature\n"); - printf(" --restart = {auto, static, dynamic} Which kind of restart strategy to\n"); - printf(" follow. Default is auto\n"); - printf(" --dumplearnts = If interrupted or reached restart limit, dump\n"); - printf(" the learnt clauses to the specified file. Maximum size of\n"); - printf(" dumped clauses can be specified with next option.\n"); - printf(" --maxdumplearnts = [0 - 2^32-1] When dumping the learnts to file, what\n"); - printf(" should be maximum length of the clause dumped. Useful\n"); - printf(" to make the resulting file smaller. Default is 2^32-1\n"); - printf(" note: 2-long XOR-s are always dumped.\n"); - printf(" --maxsolutions = Search for given amount of solutions\n"); - printf(" --nofailedvar = Don't search for failed vars, and don't search for vars\n"); - printf(" doubly propagated to the same value\n"); - printf(" --noheuleprocess = Don't try to minimise XORs by XOR-ing them together.\n"); - printf(" Algo. as per global/local substitution in Heule's thesis\n"); - printf(" --nosatelite = Don't do clause subsumption, clause strengthening and\n"); - printf(" variable elimination (implies -novarelim and -nosubsume1).\n"); - printf(" --noxorsubs = Don't try to subsume xor-clauses.\n"); - printf(" --nohyperbinres = Don't carry out hyper-binary resolution\n"); - printf(" --nosolprint = Don't print the satisfying assignment if the solution\n"); - printf(" is SAT\n"); - printf(" --novarelim = Don't perform variable elimination as per Een and Biere\n"); - printf(" --nosubsume1 = Don't perform clause contraction through resolution\n"); - printf(" --noparthander = Don't find and solve subroblems with subsolvers\n"); - printf(" --nomatrixfind = Don't find distinct matrixes. Put all xors into one\n"); - printf(" big matrix\n"); - printf(" --noordercol = Don't order variables in the columns of Gaussian\n"); - printf(" elimination. Effectively disables iterative reduction\n"); - printf(" of the matrix\n"); - printf(" --noiterreduce = Don't reduce iteratively the matrix that is updated\n"); - printf(" --maxmatrixrows = [0 - 2^32-1] Set maximum no. of rows for gaussian matrix.\n"); - printf(" Too large matrixes should bee discarded for\n"); - printf(" reasons of efficiency. Default: %d\n", S.gaussconfig.maxMatrixRows); - printf(" --minmatrixrows = [0 - 2^32-1] Set minimum no. of rows for gaussian matrix.\n"); - printf(" Normally, too small matrixes are discarded for\n"); - printf(" reasons of efficiency. Default: %d\n", S.gaussconfig.minMatrixRows); - printf(" --savematrix = [0 - 2^32-1] Save matrix every Nth decision level.\n"); - printf(" Default: %d\n", S.gaussconfig.only_nth_gauss_save); - //printf(" --addoldlearnts = Readd old learnts for failed variable searching.\n"); - //printf(" These learnts are usually deleted, but may help\n"); - printf(" --noextrabins = Don't add binary clauses when doing failed lit probing.\n"); - printf(" --noremovebins = Don't remove useless binary clauses\n"); - printf(" --noregremovebins= Don't remove useless binary clauses regularly\n"); - printf(" --nosubswithbins = Don't subsume with non-existent bins\n"); - printf(" --norsubswithbins= Don't subsume regularly with non-existent bins\n"); - printf("\n"); -} - - -const char* hasPrefix(const char* str, const char* prefix) -{ - int len = strlen(prefix); - if (strncmp(str, prefix, len) == 0) - return str + len; - else - return NULL; -} - -}; //NAMESPACE MINISAT - -int main(int argc, char** argv) -{ - Solver S; - S.verbosity = 2; - - const char* value; - int j = 0; - unsigned long max_nr_of_solutions = 1; - unsigned long current_nr_of_solutions = 1; - - for (int i = 0; i < argc; i++) { - if ((value = hasPrefix(argv[i], "--polarity-mode="))) { - if (strcmp(value, "true") == 0) - S.polarity_mode = Solver::polarity_true; - else if (strcmp(value, "false") == 0) - S.polarity_mode = Solver::polarity_false; - else if (strcmp(value, "rnd") == 0) - S.polarity_mode = Solver::polarity_rnd; - else if (strcmp(value, "auto") == 0) - S.polarity_mode = Solver::polarity_auto; - else { - printf("ERROR! unknown polarity-mode %s\n", value); - exit(0); - } - - } else if ((value = hasPrefix(argv[i], "--rnd-freq="))) { - double rnd; - if (sscanf(value, "%lf", &rnd) <= 0 || rnd < 0 || rnd > 1) { - printf("ERROR! illegal rnd-freq constant %s\n", value); - exit(0); - } - S.random_var_freq = rnd; - - /*} else if ((value = hasPrefix(argv[i], "--decay="))) { - double decay; - if (sscanf(value, "%lf", &decay) <= 0 || decay <= 0 || decay > 1) { - printf("ERROR! illegal decay constant %s\n", value); - exit(0); - } - S.var_decay = 1 / decay;*/ - - } else if ((value = hasPrefix(argv[i], "--verbosity="))) { - int verbosity = (int)strtol(value, NULL, 10); - if (verbosity == EINVAL || verbosity == ERANGE) { - printf("ERROR! illegal verbosity level %s\n", value); - exit(0); - } - S.verbosity = verbosity; - #ifdef STATS_NEEDED - } else if ((value = hasPrefix(argv[i], "--grouping"))) { - grouping = true; - } else if ((value = hasPrefix(argv[i], "--proof-log"))) { - S.needProofGraph(); - - } else if ((value = hasPrefix(argv[i], "--stats"))) { - S.needStats(); - #endif - - } else if ((value = hasPrefix(argv[i], "--randomize="))) { - uint32_t seed; - if (sscanf(value, "%d", &seed) < 0) { - printf("ERROR! illegal seed %s\n", value); - exit(0); - } - cout << "c seed:" << seed << endl; - S.setSeed(seed); - } else if ((value = hasPrefix(argv[i], "--restrict="))) { - uint branchTo; - if (sscanf(value, "%d", &branchTo) < 0 || branchTo < 1) { - printf("ERROR! illegal restricted pick branch number %d\n", branchTo); - exit(0); - } - S.restrictedPickBranch = branchTo; - } else if ((value = hasPrefix(argv[i], "--gaussuntil="))) { - uint32_t until; - if (sscanf(value, "%d", &until) < 0) { - printf("ERROR! until %s\n", value); - exit(0); - } - S.gaussconfig.decision_until = until; - } else if ((value = hasPrefix(argv[i], "--restarts="))) { - uint maxrest; - if (sscanf(value, "%d", &maxrest) < 0 || maxrest == 0) { - printf("ERROR! illegal maximum restart number %d\n", maxrest); - exit(0); - } - S.setMaxRestarts(maxrest); - } else if ((value = hasPrefix(argv[i], "--dumplearnts="))) { - if (sscanf(value, "%400s", learnts_filename) < 0 || strlen(learnts_filename) == 0) { - printf("ERROR! wrong filename '%s'\n", learnts_filename); - exit(0); - } - dumpLearnts = true; - } else if ((value = hasPrefix(argv[i], "--maxdumplearnts="))) { - if (!dumpLearnts) { - printf("ERROR! -dumplearnts= must be first activated before issuing -maxdumplearnts=\n"); - exit(0); - } - int tmp; - if (sscanf(value, "%d", &tmp) < 0 || tmp < 0) { - cout << "ERROR! wrong maximum dumped learnt clause size is illegal: " << tmp << endl; - exit(0); - } - maxLearntsSize = (uint32_t)tmp; - } else if ((value = hasPrefix(argv[i], "--maxsolutions="))) { - int tmp; - if (sscanf(value, "%d", &tmp) < 0 || tmp < 0) { - cout << "ERROR! wrong maximum number of solutions is illegal: " << tmp << endl; - exit(0); - } - max_nr_of_solutions = (uint32_t)tmp; - } else if ((value = hasPrefix(argv[i], "--greedyunbound"))) { - S.greedyUnbound = true; - } else if ((value = hasPrefix(argv[i], "--nonormxorfind"))) { - S.findNormalXors = false; - } else if ((value = hasPrefix(argv[i], "--nobinxorfind"))) { - S.findBinaryXors = false; - } else if ((value = hasPrefix(argv[i], "--noregbxorfind"))) { - S.regularlyFindBinaryXors = false; - } else if ((value = hasPrefix(argv[i], "--noconglomerate"))) { - S.conglomerateXors = false; - } else if ((value = hasPrefix(argv[i], "--nosimplify"))) { - S.schedSimplification = false; - } else if ((value = hasPrefix(argv[i], "--debuglib"))) { - debugLib = true; - } else if ((value = hasPrefix(argv[i], "--debugnewvar"))) { - debugNewVar = true; - } else if ((value = hasPrefix(argv[i], "--novarreplace"))) { - S.performReplace = false; - } else if ((value = hasPrefix(argv[i], "--nofailedvar"))) { - S.failedVarSearch = false; - } else if ((value = hasPrefix(argv[i], "--nodisablegauss"))) { - S.gaussconfig.dontDisable = true; - } else if ((value = hasPrefix(argv[i], "--noheuleprocess"))) { - S.heuleProcess = false; - } else if ((value = hasPrefix(argv[i], "--nosatelite"))) { - S.doSubsumption = false; - } else if ((value = hasPrefix(argv[i], "--noparthandler"))) { - S.doPartHandler = false; - } else if ((value = hasPrefix(argv[i], "--noxorsubs"))) { - S.doXorSubsumption = false; - } else if ((value = hasPrefix(argv[i], "--nohyperbinres"))) { - S.doHyperBinRes = false; - } else if ((value = hasPrefix(argv[i], "--noblockedclause"))) { - S.doBlockedClause = false; - } else if ((value = hasPrefix(argv[i], "--novarelim"))) { - S.doVarElim = false; - } else if ((value = hasPrefix(argv[i], "--nosubsume1"))) { - S.doSubsume1 = false; - } else if ((value = hasPrefix(argv[i], "--nomatrixfind"))) { - S.gaussconfig.noMatrixFind = true; - } else if ((value = hasPrefix(argv[i], "--noiterreduce"))) { - S.gaussconfig.iterativeReduce = false; - } else if ((value = hasPrefix(argv[i], "--noiterreduce"))) { - S.gaussconfig.iterativeReduce = false; - } else if ((value = hasPrefix(argv[i], "--noordercol"))) { - S.gaussconfig.orderCols = false; - } else if ((value = hasPrefix(argv[i], "--maxmatrixrows"))) { - uint32_t rows; - if (sscanf(value, "%d", &rows) < 0) { - printf("ERROR! maxmatrixrows: %s\n", value); - exit(0); - } - S.gaussconfig.maxMatrixRows = rows; - } else if ((value = hasPrefix(argv[i], "--minmatrixrows"))) { - uint32_t rows; - if (sscanf(value, "%d", &rows) < 0) { - printf("ERROR! minmatrixrows: %s\n", value); - exit(0); - } - S.gaussconfig.minMatrixRows = rows; - } else if ((value = hasPrefix(argv[i], "--savematrix"))) { - uint32_t every; - if (sscanf(value, "%d", &every) < 0) { - printf("ERROR! savematrix: %s\n", value); - exit(0); - } - cout << "c Matrix saved every " << every << " decision levels" << endl; - S.gaussconfig.only_nth_gauss_save = every; - } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0) { - printUsage(argv, S); - exit(0); - } else if ((value = hasPrefix(argv[i], "--restart="))) { - if (strcmp(value, "auto") == 0) - S.fixRestartType = auto_restart; - else if (strcmp(value, "static") == 0) - S.fixRestartType = static_restart; - else if (strcmp(value, "dynamic") == 0) - S.fixRestartType = dynamic_restart; - else { - printf("ERROR! unknown restart type %s\n", value); - exit(0); - } - } else if ((value = hasPrefix(argv[i], "--nosolprint"))) { - printResult = false; - //} else if ((value = hasPrefix(argv[i], "--addoldlearnts"))) { - // S.readdOldLearnts = true; - } else if ((value = hasPrefix(argv[i], "--noextrabins"))) { - S.addExtraBins = false; - } else if ((value = hasPrefix(argv[i], "--noremovebins"))) { - S.removeUselessBins = false; - } else if ((value = hasPrefix(argv[i], "--noregremovebins"))) { - S.regularRemoveUselessBins = false; - } else if ((value = hasPrefix(argv[i], "--nosubswithbins"))) { - S.subsumeWithNonExistBinaries = false; - } else if ((value = hasPrefix(argv[i], "--norsubswithbins"))) { - S.regularSubsumeWithNonExistBinaries = false; - } else if (strncmp(argv[i], "-", 1) == 0 || strncmp(argv[i], "--", 2) == 0) { - printf("ERROR! unknown flag %s\n", argv[i]); - exit(0); - } else - argv[j++] = argv[i]; - } - argc = j; - if (!debugLib) S.libraryUsage = false; - - if (S.verbosity >= 1) - printf("c This is CryptoMiniSat %s\n", VERSION); -#if defined(__linux__) - fpu_control_t oldcw, newcw; - _FPU_GETCW(oldcw); - newcw = (oldcw & ~_FPU_EXTENDED) | _FPU_DOUBLE; - _FPU_SETCW(newcw); - if (S.verbosity >= 1) printf("c WARNING: for repeatability, setting FPU to use double precision\n"); -#endif - double cpu_time = cpuTime(); - - solver = &S; - signal(SIGINT,SIGINT_handler); - //signal(SIGHUP,SIGINT_handler); - - if (argc == 1) - printf("c Reading from standard input... Use '-h' or '--help' for help.\n"); - -#ifdef DISABLE_ZLIB - FILE * in = (argc == 1) ? fopen(0, "rb") : fopen(argv[1], "rb"); -#else - gzFile in = (argc == 1) ? gzdopen(0, "rb") : gzopen(argv[1], "rb"); -#endif // DISABLE_ZLIB - if (in == NULL) { - printf("ERROR! Could not open file: %s\n", argc == 1 ? "" : argv[1]); - exit(1); - } - - if (S.verbosity >= 1) { - printf("c =================================[ Problem Statistics ]==================================\n"); - printf("c | |\n"); - } - - parse_DIMACS(in, S); - -#ifdef DISABLE_ZLIB - fclose(in); -#else - gzclose(in); -#endif // DISABLE_ZLIB - if (argc >= 3) - printf("c Outputting solution to file: %s\n" , argv[2]); - - double parse_time = cpuTime() - cpu_time; - if (S.verbosity >= 1) - printf("c | Parsing time: %-12.2f s |\n", parse_time); - - lbool ret; - - while(1) - { - ret = S.solve(); - if ( ret != l_True ) break; - - std::cout << "c " << std::setw(8) << current_nr_of_solutions++ << " solution(s) found" << std::endl; - - if (current_nr_of_solutions > max_nr_of_solutions) break; - printf("c Prepare for next run...\n"); - - vec lits; - if (printResult) printf("v "); - for (Var var = 0; var != S.nVars(); var++) { - if (S.model[var] != l_Undef) { - lits.push( Lit(var, (S.model[var] == l_True)? true : false) ); - if (printResult) printf("%s%d ", (S.model[var] == l_True)? "" : "-", var+1); - } - } - if (printResult) printf("\n"); - - S.addClause(lits); - } - - printStats(S); - printf("c \n"); - if (dumpLearnts) { - S.dumpSortedLearnts(learnts_filename, maxLearntsSize); - cout << "c Sorted learnt clauses dumped to file '" << learnts_filename << "'" << endl; - } - if (ret == l_Undef) - printf("c Not finished running -- maximum restart reached\n"); - - FILE* res = NULL; - if (argc >= 3) { - res = fopen(argv[2], "wb"); - if (res == NULL) { - int backup_errno = errno; - printf("Cannot open %s for writing. Problem: %s", argv[2], strerror(backup_errno)); - exit(1); - } - } - - if (res != NULL) { - if (ret == l_True) { - printf("c SAT\n"); - fprintf(res, "SAT\n"); - if (printResult) { - for (Var var = 0; var != S.nVars(); var++) - if (S.model[var] != l_Undef) - fprintf(res, "%s%d ", (S.model[var] == l_True)? "" : "-", var+1); - fprintf(res, "0\n"); - } - } else if (ret == l_False) { - printf("c UNSAT\n"); - fprintf(res, "UNSAT\n"); - } else { - printf("c INCONCLUSIVE\n"); - fprintf(res, "INCONCLUSIVE\n"); - } - fclose(res); - } else { - if (ret == l_True) - printf("s SATISFIABLE\n"); - else if (ret == l_False) - printf("s UNSATISFIABLE\n"); - - if(ret == l_True && printResult) { - printf("v "); - for (Var var = 0; var != S.nVars(); var++) - if (S.model[var] != l_Undef) - printf("%s%d ", (S.model[var] == l_True)? "" : "-", var+1); - printf("0\n"); - } - } - -#ifdef NDEBUG - exit(ret == l_True ? 10 : 20); // (faster than "return", which will invoke the destructor for 'Solver') -#endif - - if (ret == l_True) return 10; - if (ret == l_False) return 20; - if (ret == l_Undef) return 15; - assert(false); - - return 0; -} - diff --git a/src/vendor/stp/src/sat/cryptominisat2/Makefile b/src/vendor/stp/src/sat/cryptominisat2/Makefile deleted file mode 100644 index 8c6eaec64..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -SRCTOP = ../.. -include $(SRCTOP)/Makefile.common - -MTL = mtl -MTRAND = MTRand -SOURCES = Logger.cpp Solver.cpp PackedRow.cpp \ - XorFinder.cpp VarReplacer.cpp \ - FindUndef.cpp ClauseCleaner.cpp RestartTypeChooser.cpp \ - FailedVarSearcher.cpp PartFinder.cpp \ - Subsumer.cpp PartHandler.cpp XorSubsumer.cpp \ - Gaussian.cpp MatrixFinder.cpp StateSaver.cpp \ - ClauseAllocator.cpp UselessBinRemover.cpp \ - OnlyNonLearntBins.cpp -OBJECTS = $(SOURCES:.cpp=.o) -LIB = libminisat.a -CFLAGS += -I../.. -I$(MTL) -I$(MTRAND) -DEXT_HASH_MAP -ffloat-store $(CFLAGS_M32) -c -EXEC = minisat -LFLAGS = -lz - - -all: $(LIB) #$(EXEC) -lib: $(LIB) - -$(LIB): $(OBJECTS) - $(RM) $@ - $(AR) qcs $@ $^ - -clean: - $(RM) *.o *~ *.a .#* depend - -depend: $(SOURCES) - @$(call makedepend,$@,$(SOURCES)) - --include depend diff --git a/src/vendor/stp/src/sat/cryptominisat2/MatrixFinder.cpp b/src/vendor/stp/src/sat/cryptominisat2/MatrixFinder.cpp deleted file mode 100644 index 35443a7ba..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/MatrixFinder.cpp +++ /dev/null @@ -1,249 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "MatrixFinder.h" - -#include "Solver.h" -#include "Gaussian.h" -#include "GaussianConfig.h" -#include "ClauseCleaner.h" -#include "time_mem.h" - -#include -#include -#include -#include -using std::set; -using std::map; - -//#define VERBOSE_DEBUG - -using std::cout; -using std::endl; - -namespace MINISAT -{ -using namespace MINISAT; - -//#define PART_FINDING - -MatrixFinder::MatrixFinder(Solver& _solver) : - solver(_solver) -{ -} - -inline const Var MatrixFinder::fingerprint(const XorClause& c) const -{ - Var fingerprint = 0; - - for (const Lit* a = &c[0], *end = a + c.size(); a != end; a++) - fingerprint |= a->var(); - - return fingerprint; -} - -inline const bool MatrixFinder::firstPartOfSecond(const XorClause& c1, const XorClause& c2) const -{ - uint i1, i2; - for (i1 = 0, i2 = 0; i1 < c1.size() && i2 < c2.size();) { - if (c1[i1].var() != c2[i2].var()) - i2++; - else { - i1++; - i2++; - } - } - - return (i1 == c1.size()); -} - -const bool MatrixFinder::findMatrixes() -{ - table.clear(); - table.resize(solver.nVars(), var_Undef); - reverseTable.clear(); - matrix_no = 0; - double myTime = cpuTime(); - - if (solver.xorclauses.size() < MIN_GAUSS_XOR_CLAUSES || - solver.gaussconfig.decision_until <= 0 || - solver.xorclauses.size() > MAX_GAUSS_XOR_CLAUSES - ) - return true; - - solver.clauseCleaner->cleanClauses(solver.xorclauses, ClauseCleaner::xorclauses); - if (!solver.ok) return false; - - if (solver.gaussconfig.noMatrixFind) { - if (solver.verbosity >=1) - cout << "c | Matrix finding disabled through switch. Putting all xors into matrix." << endl; - vector xorclauses; - xorclauses.reserve(solver.xorclauses.size()); - for (uint32_t i = 0; i < solver.xorclauses.size(); i++) - xorclauses.push_back(solver.xorclauses[i]); - solver.gauss_matrixes.push_back(new Gaussian(solver, solver.gaussconfig, 0, xorclauses)); - return true; - } - - for (XorClause** c = solver.xorclauses.getData(), **end = c + solver.xorclauses.size(); c != end; c++) { - set tomerge; - vector newSet; - for (Lit *l = &(**c)[0], *end2 = l + (**c).size(); l != end2; l++) { - if (table[l->var()] != var_Undef) - tomerge.insert(table[l->var()]); - else - newSet.push_back(l->var()); - } - if (tomerge.size() == 1) { - const uint into = *tomerge.begin(); - map >::iterator intoReverse = reverseTable.find(into); - for (uint i = 0; i < newSet.size(); i++) { - intoReverse->second.push_back(newSet[i]); - table[newSet[i]] = into; - } - continue; - } - - for (set::iterator it = tomerge.begin(); it != tomerge.end(); it++) { - newSet.insert(newSet.end(), reverseTable[*it].begin(), reverseTable[*it].end()); - reverseTable.erase(*it); - } - for (uint i = 0; i < newSet.size(); i++) - table[newSet[i]] = matrix_no; - reverseTable[matrix_no] = newSet; - matrix_no++; - } - - #ifdef VERBOSE_DEBUG - for (map >::iterator it = reverseTable.begin(), end = reverseTable.end(); it != end; it++) { - cout << "-- set begin --" << endl; - for (vector::iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; it2++) { - cout << *it2 << ", "; - } - cout << "-------" << endl; - } - #endif - - uint32_t numMatrixes = setMatrixes(); - - if (solver.verbosity >=1) - std::cout << "c | Finding matrixes : " << cpuTime() - myTime << " s (found " << numMatrixes << ") |" << endl; - - for (vector::iterator gauss = solver.gauss_matrixes.begin(), end = solver.gauss_matrixes.end(); gauss != end; gauss++) { - if (!(*gauss)->full_init()) return false; - } - - return true; -} - -const uint MatrixFinder::setMatrixes() -{ - vector > numXorInMatrix; - for (uint i = 0; i < matrix_no; i++) - numXorInMatrix.push_back(std::make_pair(i, 0)); - - vector sumXorSizeInMatrix(matrix_no, 0); - vector > xorSizesInMatrix(matrix_no); - vector > xorsInMatrix(matrix_no); - - #ifdef PART_FINDING - vector > xorFingerprintInMatrix(matrix_no); - #endif - - for (XorClause** c = solver.xorclauses.getData(), **end = c + solver.xorclauses.size(); c != end; c++) { - XorClause& x = **c; - const uint matrix = table[x[0].var()]; - assert(matrix < matrix_no); - - //for stats - numXorInMatrix[matrix].second++; - sumXorSizeInMatrix[matrix] += x.size(); - xorSizesInMatrix[matrix].push_back(x.size()); - xorsInMatrix[matrix].push_back(&x); - - #ifdef PART_FINDING - xorFingerprintInMatrix[matrix].push_back(fingerprint(x)); - #endif //PART_FINDING - } - - std::sort(numXorInMatrix.begin(), numXorInMatrix.end(), mysorter()); - - #ifdef PART_FINDING - for (uint i = 0; i < matrix_no; i++) - findParts(xorFingerprintInMatrix[i], xorsInMatrix[i]); - #endif //PART_FINDING - - uint realMatrixNum = 0; - for (int a = matrix_no-1; a != -1; a--) { - uint i = numXorInMatrix[a].first; - - if (numXorInMatrix[a].second < 3) - continue; - - const uint totalSize = reverseTable[i].size()*numXorInMatrix[a].second; - const double density = (double)sumXorSizeInMatrix[i]/(double)totalSize*100.0; - double avg = (double)sumXorSizeInMatrix[i]/(double)numXorInMatrix[a].second; - double variance = 0.0; - for (uint i2 = 0; i2 < xorSizesInMatrix[i].size(); i2++) - variance += pow((double)xorSizesInMatrix[i][i2]-avg, 2); - variance /= (double)xorSizesInMatrix.size(); - const double stdDeviation = sqrt(variance); - - if (numXorInMatrix[a].second >= solver.gaussconfig.minMatrixRows - && numXorInMatrix[a].second <= solver.gaussconfig.maxMatrixRows - && realMatrixNum < 3) - { - if (solver.verbosity >=1) - cout << "c | Matrix no " << std::setw(2) << realMatrixNum; - solver.gauss_matrixes.push_back(new Gaussian(solver, solver.gaussconfig, realMatrixNum, xorsInMatrix[i])); - realMatrixNum++; - - } else { - if (solver.verbosity >=1 /*&& numXorInMatrix[a].second >= 20*/) - cout << "c | Unused Matrix "; - } - if (solver.verbosity >=1 /*&& numXorInMatrix[a].second >= 20*/) { - cout << std::setw(7) << numXorInMatrix[a].second << " x" << std::setw(5) << reverseTable[i].size(); - cout << " density:" << std::setw(5) << std::fixed << std::setprecision(1) << density << "%"; - cout << " xorlen avg:" << std::setw(5) << std::fixed << std::setprecision(2) << avg; - cout << " stdev:" << std::setw(6) << std::fixed << std::setprecision(2) << stdDeviation << " |" << endl; - } - } - - return realMatrixNum; -} - -void MatrixFinder::findParts(vector& xorFingerprintInMatrix, vector& xorsInMatrix) -{ - uint ai = 0; - for (XorClause **a = &xorsInMatrix[0], **end = a + xorsInMatrix.size(); a != end; a++, ai++) { - const Var fingerprint = xorFingerprintInMatrix[ai]; - uint ai2 = 0; - for (XorClause **a2 = &xorsInMatrix[0]; a2 != end; a2++, ai2++) { - if (ai == ai2) continue; - const Var fingerprint2 = xorFingerprintInMatrix[ai2]; - if (((fingerprint & fingerprint2) == fingerprint) && firstPartOfSecond(**a, **a2)) { - cout << "First part of second:" << endl; - (*a)->plainPrint(); - (*a2)->plainPrint(); - cout << "END" << endl; - } - } - } -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/MatrixFinder.h b/src/vendor/stp/src/sat/cryptominisat2/MatrixFinder.h deleted file mode 100644 index 293630bd7..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/MatrixFinder.h +++ /dev/null @@ -1,72 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef MATRIXFINDER_H -#define MATRIXFINDER_H - -#include -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Clause.h" -#include "Solver.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class Solver; - -using std::map; -using std::vector; -using std::pair; - -class MatrixFinder { - - public: - MatrixFinder(Solver& solver); - const bool findMatrixes(); - - private: - const uint setMatrixes(); - - struct mysorter - { - bool operator () (const pair& left, const pair& right) - { - return left.second < right.second; - } - }; - - void findParts(vector& xorFingerprintInMatrix, vector& xorsInMatrix); - inline const Var fingerprint(const XorClause& c) const; - inline const bool firstPartOfSecond(const XorClause& c1, const XorClause& c2) const; - - map > reverseTable; //matrix -> vars - vector table; //var -> matrix - uint matrix_no; - - Solver& solver; -}; - -}; //NAMESPACE MINISAT - -#endif //MATRIXFINDER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/MersenneTwister.h b/src/vendor/stp/src/sat/cryptominisat2/MersenneTwister.h deleted file mode 100644 index 964ecc736..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/MersenneTwister.h +++ /dev/null @@ -1,427 +0,0 @@ -// MersenneTwister.h -// Mersenne Twister random number generator -- a C++ class MTRand -// Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// Richard J. Wagner v1.0 15 May 2003 rjwagner@writeme.com - -// The Mersenne Twister is an algorithm for generating random numbers. It -// was designed with consideration of the flaws in various other generators. -// The period, 2^19937-1, and the order of equidistribution, 623 dimensions, -// are far greater. The generator is also fast; it avoids multiplication and -// division, and it benefits from caches and pipelines. For more information -// see the inventors' web page at http://www.math.keio.ac.jp/~matumoto/emt.html - -// Reference -// M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally -// Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on -// Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. - -// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, -// Copyright (C) 2000 - 2003, Richard J. Wagner -// 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. The names of its contributors may not be used to endorse or promote -// products derived from this software without specific prior written -// permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT OWNER 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 original code included the following notice: -// -// When you use this, send an email to: matumoto@math.keio.ac.jp -// with an appropriate reference to your work. -// -// It would be nice to CC: rjwagner@writeme.com and Cokus@math.washington.edu -// when you write. - -#ifndef MERSENNETWISTER_H -#define MERSENNETWISTER_H - -#include -#include -#include -#include -#include - -namespace MINISAT -{ - -// Not thread safe (unless auto-initialization is avoided and each thread has -// its own MTRand object) - -class MTRand { -// Data -public: - typedef unsigned long uint32; // unsigned integer type, at least 32 bits - - enum { N = 624 }; // length of state vector - enum { SAVE = N + 1 }; // length of array for save() - -protected: - enum { M = 397 }; // period parameter - - uint32 state[N]; // internal state - uint32 *pNext; // next value to get from state - int left; // number of values left before reload needed - - -//Methods -public: - MTRand( const uint32& oneSeed ); // initialize with a simple uint32 - MTRand( uint32 *const bigSeed, uint32 const seedLength = N ); // or an array - MTRand(); // auto-initialize with /dev/urandom or time() and clock() - - // Do NOT use for CRYPTOGRAPHY without securely hashing several returned - // values together, otherwise the generator state can be learned after - // reading 624 consecutive values. - - // Access to 32-bit random numbers - double rand(); // real number in [0,1] - double rand( const double& n ); // real number in [0,n] - double randExc(); // real number in [0,1) - double randExc( const double& n ); // real number in [0,n) - double randDblExc(); // real number in (0,1) - double randDblExc( const double& n ); // real number in (0,n) - uint32 randInt(); // integer in [0,2^32-1] - uint32 randInt( const uint32& n ); // integer in [0,n] for n < 2^32 - double operator()() { return rand(); } // same as rand() - - // Access to 53-bit random numbers (capacity of IEEE double precision) - double rand53(); // real number in [0,1) - - // Access to nonuniform random number distributions - double randNorm( const double& mean = 0.0, const double& variance = 0.0 ); - - // Re-seeding functions with same behavior as initializers - void seed( const uint32 oneSeed ); - void seed( uint32 *const bigSeed, const uint32 seedLength = N ); - void seed(); - - // Saving and loading generator state - void save( uint32* saveArray ) const; // to array of size SAVE - void load( uint32 *const loadArray ); // from such array - friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ); - friend std::istream& operator>>( std::istream& is, MTRand& mtrand ); - -protected: - void initialize( const uint32 oneSeed ); - void reload(); - uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; } - uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; } - uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; } - uint32 mixBits( const uint32& u, const uint32& v ) const - { return hiBit(u) | loBits(v); } - uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const - { return m ^ (mixBits(s0,s1)>>1) ^ (-loBit(s1) & 0x9908b0dfUL); } - static uint32 hash( time_t t, clock_t c ); -}; - - -inline MTRand::MTRand( const uint32& oneSeed ) - { seed(oneSeed); } - -inline MTRand::MTRand( uint32 *const bigSeed, const uint32 seedLength ) - { seed(bigSeed,seedLength); } - -inline MTRand::MTRand() - { seed(); } - -inline double MTRand::rand() - { return double(randInt()) * (1.0/4294967295.0); } - -inline double MTRand::rand( const double& n ) - { return rand() * n; } - -inline double MTRand::randExc() - { return double(randInt()) * (1.0/4294967296.0); } - -inline double MTRand::randExc( const double& n ) - { return randExc() * n; } - -inline double MTRand::randDblExc() - { return ( double(randInt()) + 0.5 ) * (1.0/4294967296.0); } - -inline double MTRand::randDblExc( const double& n ) - { return randDblExc() * n; } - -inline double MTRand::rand53() -{ - uint32 a = randInt() >> 5, b = randInt() >> 6; - return ( a * 67108864.0 + b ) * (1.0/9007199254740992.0); // by Isaku Wada -} - -inline double MTRand::randNorm( const double& mean, const double& variance ) -{ - // Return a real number from a normal (Gaussian) distribution with given - // mean and variance by Box-Muller method - double r = sqrt( -2.0 * log( 1.0-randDblExc()) ) * variance; - double phi = 2.0 * 3.14159265358979323846264338328 * randExc(); - return mean + r * cos(phi); -} - -inline MTRand::uint32 MTRand::randInt() -{ - // Pull a 32-bit integer from the generator state - // Every other access function simply transforms the numbers extracted here - - if( left == 0 ) reload(); - --left; - - register uint32 s1; - s1 = *pNext++; - s1 ^= (s1 >> 11); - s1 ^= (s1 << 7) & 0x9d2c5680UL; - s1 ^= (s1 << 15) & 0xefc60000UL; - return ( s1 ^ (s1 >> 18) ); -} - -inline MTRand::uint32 MTRand::randInt( const uint32& n ) -{ - // Find which bits are used in n - // Optimized by Magnus Jonsson (magnus@smartelectronix.com) - uint32 used = n; - used |= used >> 1; - used |= used >> 2; - used |= used >> 4; - used |= used >> 8; - used |= used >> 16; - - // Draw numbers until one is found in [0,n] - uint32 i; - do - i = randInt() & used; // toss unused bits to shorten search - while( i > n ); - return i; -} - - -inline void MTRand::seed( const uint32 oneSeed ) -{ - // Seed the generator with a simple uint32 - initialize(oneSeed); - reload(); -} - - -inline void MTRand::seed( uint32 *const bigSeed, const uint32 seedLength ) -{ - // Seed the generator with an array of uint32's - // There are 2^19937-1 possible initial states. This function allows - // all of those to be accessed by providing at least 19937 bits (with a - // default seed length of N = 624 uint32's). Any bits above the lower 32 - // in each element are discarded. - // Just call seed() if you want to get array from /dev/urandom - initialize(19650218UL); - register int i = 1; - register uint32 j = 0; - register int k = ( N > seedLength ? N : seedLength ); - for( ; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1664525UL ); - state[i] += ( bigSeed[j] & 0xffffffffUL ) + j; - state[i] &= 0xffffffffUL; - ++i; ++j; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - if( j >= seedLength ) j = 0; - } - for( k = N - 1; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL ); - state[i] -= i; - state[i] &= 0xffffffffUL; - ++i; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - } - state[0] = 0x80000000UL; // MSB is 1, assuring non-zero initial array - reload(); -} - - -inline void MTRand::seed() -{ - // Seed the generator with an array from /dev/urandom if available - // Otherwise use a hash of time() and clock() values - - // First try getting an array from /dev/urandom - FILE* urandom = fopen( "/dev/urandom", "rb" ); - if( urandom ) - { - uint32 bigSeed[N]; - register uint32 *s = bigSeed; - register int i = N; - register bool success = true; - while( success && i-- ) - success = fread( s++, sizeof(uint32), 1, urandom ); - fclose(urandom); - if( success ) { seed( bigSeed, N ); return; } - } - - // Was not successful, so use time() and clock() instead - seed( hash( time(NULL), clock() ) ); -} - - -inline void MTRand::initialize( const uint32 seed ) -{ - // Initialize generator state with seed - // See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. - // In previous versions, most significant bits (MSBs) of the seed affect - // only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. - register uint32 *s = state; - register uint32 *r = state; - register int i = 1; - *s++ = seed & 0xffffffffUL; - for( ; i < N; ++i ) - { - *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL; - r++; - } -} - - -inline void MTRand::reload() -{ - // Generate N new values in state - // Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) - register uint32 *p = state; - register int i; - for( i = N - M; i--; ++p ) - *p = twist( p[M], p[0], p[1] ); - for( i = M; --i; ++p ) - *p = twist( p[M-N], p[0], p[1] ); - *p = twist( p[M-N], p[0], state[0] ); - - left = N, pNext = state; -} - - -inline MTRand::uint32 MTRand::hash( time_t t, clock_t c ) -{ - // Get a uint32 from t and c - // Better than uint32(x) in case x is floating point in [0,1] - // Based on code by Lawrence Kirby (fred@genesis.demon.co.uk) - - static uint32 differ = 0; // guarantee time-based seeds will change - - uint32 h1 = 0; - unsigned char *p = (unsigned char *) &t; - for( size_t i = 0; i < sizeof(t); ++i ) - { - h1 *= UCHAR_MAX + 2U; - h1 += p[i]; - } - uint32 h2 = 0; - p = (unsigned char *) &c; - for( size_t j = 0; j < sizeof(c); ++j ) - { - h2 *= UCHAR_MAX + 2U; - h2 += p[j]; - } - return ( h1 + differ++ ) ^ h2; -} - - -inline void MTRand::save( uint32* saveArray ) const -{ - register uint32 *sa = saveArray; - register const uint32 *s = state; - register int i = N; - for( ; i--; *sa++ = *s++ ) {} - *sa = left; -} - - -inline void MTRand::load( uint32 *const loadArray ) -{ - register uint32 *s = state; - register uint32 *la = loadArray; - register int i = N; - for( ; i--; *s++ = *la++ ) {} - left = *la; - pNext = &state[N-left]; -} - - -inline std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ) -{ - register const MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for( ; i--; os << *s++ << "\t" ) {} - return os << mtrand.left; -} - - -inline std::istream& operator>>( std::istream& is, MTRand& mtrand ) -{ - register MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for( ; i--; is >> *s++ ) {} - is >> mtrand.left; - mtrand.pNext = &mtrand.state[mtrand.N-mtrand.left]; - return is; -} -}; - -#endif // MERSENNETWISTER_H - -// Change log: -// -// v0.1 - First release on 15 May 2000 -// - Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// - Translated from C to C++ -// - Made completely ANSI compliant -// - Designed convenient interface for initialization, seeding, and -// obtaining numbers in default or user-defined ranges -// - Added automatic seeding from /dev/urandom or time() and clock() -// - Provided functions for saving and loading generator state -// -// v0.2 - Fixed bug which reloaded generator one step too late -// -// v0.3 - Switched to clearer, faster reload() code from Matthew Bellew -// -// v0.4 - Removed trailing newline in saved generator format to be consistent -// with output format of built-in types -// -// v0.5 - Improved portability by replacing static const int's with enum's and -// clarifying return values in seed(); suggested by Eric Heimburg -// - Removed MAXINT constant; use 0xffffffffUL instead -// -// v0.6 - Eliminated seed overflow when uint32 is larger than 32 bits -// - Changed integer [0,n] generator to give better uniformity -// -// v0.7 - Fixed operator precedence ambiguity in reload() -// - Added access for real numbers in (0,1) and (0,n) -// -// v0.8 - Included time.h header to properly support time_t and clock_t -// -// v1.0 - Revised seeding to match 26 Jan 2002 update of Nishimura and Matsumoto -// - Allowed for seeding with arrays of any length -// - Added access for real numbers in [0,1) with 53-bit resolution -// - Added access for real numbers from normal (Gaussian) distributions -// - Increased overall speed by optimizing twist() -// - Doubled speed of integer [0,n] generation -// - Fixed out-of-range number generation on 64-bit machines -// - Improved portability by substituting literal constants for long enum's -// - Changed license from GNU LGPL to BSD diff --git a/src/vendor/stp/src/sat/cryptominisat2/OnlyNonLearntBins.cpp b/src/vendor/stp/src/sat/cryptominisat2/OnlyNonLearntBins.cpp deleted file mode 100644 index 785d7e92e..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/OnlyNonLearntBins.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/*********************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -************************************************************************/ - -#include "OnlyNonLearntBins.h" - -#include -#include "Solver.h" -#include "Clause.h" -#include "VarReplacer.h" -#include "ClauseCleaner.h" -#include "time_mem.h" - -namespace MINISAT -{ -using namespace MINISAT; - -OnlyNonLearntBins::OnlyNonLearntBins(Solver& _solver) : - solver(_solver) -{} - -const bool OnlyNonLearntBins::propagate() -{ - while (solver.qhead < solver.trail.size()) { - Lit p = solver.trail[solver.qhead++]; - vec & wbin = binwatches[p.toInt()]; - solver.propagations += wbin.size()/2; - for(WatchedBin *k = wbin.getData(), *end = wbin.getDataEnd(); k != end; k++) { - lbool val = solver.value(k->impliedLit); - if (val.isUndef()) { - solver.uncheckedEnqueueLight(k->impliedLit); - } else if (val == l_False) { - return false; - } - } - } - - return true; -} - -const bool OnlyNonLearntBins::propagateBinExcept(const Lit& exceptLit) -{ - while (solver.qhead < solver.trail.size()) { - Lit p = solver.trail[solver.qhead++]; - vec & wbin = binwatches[p.toInt()]; - solver.propagations += wbin.size()/2; - for(WatchedBin *k = wbin.getData(), *end = wbin.getDataEnd(); k != end; k++) { - lbool val = solver.value(k->impliedLit); - if (val.isUndef() && k->impliedLit != exceptLit) { - solver.uncheckedEnqueueLight(k->impliedLit); - } else if (val == l_False) { - return false; - } - } - } - - return true; -} - -const bool OnlyNonLearntBins::propagateBinOneLevel() -{ - Lit p = solver.trail[solver.qhead]; - vec & wbin = binwatches[p.toInt()]; - solver.propagations += wbin.size()/2; - for(WatchedBin *k = wbin.getData(), *end = wbin.getDataEnd(); k != end; k++) { - lbool val = solver.value(k->impliedLit); - if (val.isUndef()) { - solver.uncheckedEnqueueLight(k->impliedLit); - } else if (val == l_False) { - return false; - } - } - - return true; -} - -const bool OnlyNonLearntBins::fill() -{ - double myTime = cpuTime(); - assert(solver.performReplace); - while (solver.performReplace && solver.varReplacer->getClauses().size() > 0) { - if (!solver.varReplacer->performReplace(true)) return false; - solver.clauseCleaner->removeAndCleanAll(true); - } - assert(solver.varReplacer->getClauses().size() == 0); - solver.clauseCleaner->moveBinClausesToBinClauses(); - binwatches.growTo(solver.nVars()*2); - - for(Clause **i = solver.binaryClauses.getData(), **end = solver.binaryClauses.getDataEnd(); i != end; i++) { - Clause& c = **i; - if (c.learnt()) continue; - - binwatches[(~c[0]).toInt()].push(WatchedBin(c[1])); - binwatches[(~c[1]).toInt()].push(WatchedBin(c[0])); - } - - if (solver.verbosity >= 2) { - std::cout << "c Time to fill non-learnt binary watchlists:" - << std::fixed << std::setprecision(2) << std::setw(5) - << cpuTime() - myTime << " s" << std::endl; - } - - return true; -} - -void OnlyNonLearntBins::removeBin(Lit lit1, Lit lit2) -{ - uint32_t index0 = lit1.toInt(); - uint32_t index1 = lit2.toInt(); - if (index1 > index0) std::swap(index0, index1); - uint64_t final = index0; - final |= ((uint64_t)index1) << 32; - toRemove.insert(final); - - solver.removeWatchedBinClAll(binwatches[(~lit1).toInt()], lit2); - solver.removeWatchedBinClAll(binwatches[(~lit2).toInt()], lit1); -} - -const uint32_t OnlyNonLearntBins::removeBins() -{ - Clause **i, **j; - i = j = solver.binaryClauses.getData(); - uint32_t num = 0; - for (Clause **end = solver.binaryClauses.getDataEnd(); i != end; i++, num++) { - Clause& c = **i; - uint32_t index0 = c[0].toInt(); - uint32_t index1 = c[1].toInt(); - if (index1 > index0) std::swap(index0, index1); - uint64_t final = index0; - final |= ((uint64_t)index1) << 32; - - if (toRemove.find(final) == toRemove.end()) { - *j++ = *i; - } else { - solver.clauseAllocator.clauseFree(*i); - } - } - solver.binaryClauses.shrink(i-j); - return (i - j); -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/OnlyNonLearntBins.h b/src/vendor/stp/src/sat/cryptominisat2/OnlyNonLearntBins.h deleted file mode 100644 index ed73cc2ca..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/OnlyNonLearntBins.h +++ /dev/null @@ -1,54 +0,0 @@ -/*********************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -************************************************************************/ - -#ifndef ONLYNONLEARNTBINS_H -#define ONLYNONLEARNTBINS_H - -#include "Solver.h" -#include -using std::set; - -namespace MINISAT -{ -using namespace MINISAT; - -class OnlyNonLearntBins { - public: - OnlyNonLearntBins(Solver& solver); - - //propagation - const bool propagate(); - const bool propagateBinExcept(const Lit& exceptLit); - const bool propagateBinOneLevel(); - - //Management of clauses - const bool fill(); - void removeBin(Lit lit1, Lit lit2); - void removeClause(Clause& c); - const uint32_t removeBins(); - - private: - vec > binwatches; - set toRemove; - - Solver& solver; -}; - -}; //NAMESPACE MINISAT - -#endif //ONLYNONLEARNTBINS_H - diff --git a/src/vendor/stp/src/sat/cryptominisat2/PackedMatrix.h b/src/vendor/stp/src/sat/cryptominisat2/PackedMatrix.h deleted file mode 100644 index 9c7f117d1..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/PackedMatrix.h +++ /dev/null @@ -1,224 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef PACKEDMATRIX_H -#define PACKEDMATRIX_H - -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "PackedRow.h" - -//#define DEBUG_MATRIX - -namespace MINISAT -{ -using namespace MINISAT; - -class PackedMatrix -{ -public: - PackedMatrix() : - mp(NULL) - , numRows(0) - , numCols(0) - { - } - - PackedMatrix(const PackedMatrix& b) : - numRows(b.numRows) - , numCols(b.numCols) - { - #ifdef DEBUG_MATRIX - assert(b.numRows > 0 && b.numCols > 0); - #endif - - mp = new uint64_t[numRows*2*(numCols+1)]; - memcpy(mp, b.mp, sizeof(uint64_t)*numRows*2*(numCols+1)); - } - - ~PackedMatrix() - { - delete[] mp; - } - - void resize(const uint num_rows, uint num_cols) - { - num_cols = num_cols / 64 + (bool)(num_cols % 64); - if (numRows*2*(numCols+1) < num_rows*2*(num_cols+1)) { - delete[] mp; - mp = new uint64_t[num_rows*2*(num_cols+1)]; - } - numRows = num_rows; - numCols = num_cols; - } - - void resizeNumRows(const uint num_rows) - { - #ifdef DEBUG_MATRIX - assert(num_rows <= numRows); - #endif - - numRows = num_rows; - } - - PackedMatrix& operator=(const PackedMatrix& b) - { - #ifdef DEBUG_MATRIX - //assert(b.numRows > 0 && b.numCols > 0); - #endif - - if (numRows*2*(numCols+1) < b.numRows*2*(b.numCols+1)) { - delete[] mp; - mp = new uint64_t[b.numRows*2*(b.numCols+1)]; - } - - numRows = b.numRows; - numCols = b.numCols; - memcpy(mp, b.mp, sizeof(uint64_t)*numRows*2*(numCols+1)); - - return *this; - } - - inline PackedRow getMatrixAt(const uint i) - { - #ifdef DEBUG_MATRIX - assert(i <= numRows); - #endif - - return PackedRow(numCols, mp+i*2*(numCols+1)); - } - inline PackedRow getVarsetAt(const uint i) - { - #ifdef DEBUG_MATRIX - assert(i <= numRows); - #endif - - return PackedRow(numCols, mp+i*2*(numCols+1)+(numCols+1)); - } - - inline const PackedRow getMatrixAt(const uint i) const - { - #ifdef DEBUG_MATRIX - assert(i <= numRows); - #endif - - return PackedRow(numCols, mp+i*2*(numCols+1)); - } - - inline const PackedRow getVarsetAt(const uint i) const - { - #ifdef DEBUG_MATRIX - assert(i <= numRows); - #endif - - return PackedRow(numCols, mp+i*2*(numCols+1)+(numCols+1)); - } - - class iterator - { - public: - PackedRow operator*() - { - return PackedRow(numCols, mp); - } - - iterator& operator++() - { - mp += 2*(numCols+1); - return *this; - } - - iterator operator+(const uint num) const - { - iterator ret(*this); - ret.mp += 2*(numCols+1)*num; - return ret; - } - - const uint operator-(const iterator& b) const - { - return (mp - b.mp)/(2*(numCols+1)); - } - - void operator+=(const uint num) - { - mp += 2*(numCols+1)*num; - } - - const bool operator!=(const iterator& it) const - { - return mp != it.mp; - } - - const bool operator==(const iterator& it) const - { - return mp == it.mp; - } - - private: - friend class PackedMatrix; - - iterator(uint64_t* _mp, const uint _numCols) : - mp(_mp) - , numCols(_numCols) - {} - - uint64_t* mp; - const uint numCols; - }; - - inline iterator beginMatrix() - { - return iterator(mp, numCols); - } - - inline iterator endMatrix() - { - return iterator(mp+numRows*2*(numCols+1), numCols); - } - - inline iterator beginVarset() - { - return iterator(mp+(numCols+1), numCols); - } - - inline iterator endVarset() - { - return iterator(mp+(numCols+1)+numRows*2*(numCols+1), numCols); - } - - inline const uint getSize() const - { - return numRows; - } - -private: - - uint64_t* mp; - uint numRows; - uint numCols; -}; - -}; //NAMESPACE MINISAT - -#endif //PACKEDMATRIX_H - diff --git a/src/vendor/stp/src/sat/cryptominisat2/PackedRow.cpp b/src/vendor/stp/src/sat/cryptominisat2/PackedRow.cpp deleted file mode 100644 index 59a4e4332..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/PackedRow.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "PackedRow.h" - -namespace MINISAT -{ -using namespace MINISAT; - -std::ostream& operator << (std::ostream& os, const PackedRow& m) -{ - for(uint32_t i = 0; i < m.size*64; i++) { - os << m[i]; - } - os << " -- xor: " << m.is_true(); - return os; -} - -bool PackedRow::operator ==(const PackedRow& b) const -{ - #ifdef DEBUG_ROW - assert(size > 0); - assert(b.size > 0); - assert(size == b.size); - #endif - - return (std::equal(b.mp-1, b.mp+size, mp-1)); -} - -bool PackedRow::operator !=(const PackedRow& b) const -{ - #ifdef DEBUG_ROW - assert(size > 0); - assert(b.size > 0); - assert(size == b.size); - #endif - - return (!std::equal(b.mp-1, b.mp+size, mp-1)); -} - -uint32_t PackedRow::popcnt() const -{ - uint32_t popcnt = 0; - for (uint32_t i = 0; i < size; i++) if (mp[i]) { - uint64_t tmp = mp[i]; - for (uint i2 = 0; i2 < 64; i2++) { - popcnt += (tmp & 1); - tmp >>= 1; - } - } - return popcnt; -} - -uint32_t PackedRow::popcnt(const uint32_t from) const -{ - uint32_t popcnt = 0; - for (uint32_t i = from/64; i != size; i++) if (mp[i]) { - uint64_t tmp = mp[i]; - uint32_t i2; - if (i == from/64) { - i2 = from%64; - tmp >>= i2; - } else - i2 = 0; - for (; i2 < 64; i2++) { - popcnt += (tmp & 1); - tmp >>= 1; - } - } - return popcnt; -} - -void PackedRow::fill(vec& tmp_clause, const vec& assigns, const vector& col_to_var_original) const -{ - bool final = !is_true_internal; - - tmp_clause.clear(); - uint32_t col = 0; - bool wasundef = false; - for (uint32_t i = 0; i < size; i++) for (uint32_t i2 = 0; i2 < 64; i2++) { - if ((mp[i] >> i2) &1) { - const Var& var = col_to_var_original[col]; - assert(var != std::numeric_limits::max()); - - const lbool& val = assigns[var]; - const bool val_bool = val.getBool(); - tmp_clause.push(Lit(var, val_bool)); - final ^= val_bool; - if (val.isUndef()) { - assert(!wasundef); - Lit tmp(tmp_clause[0]); - tmp_clause[0] = tmp_clause.last(); - tmp_clause.last() = tmp; - wasundef = true; - } - } - col++; - } - if (wasundef) { - tmp_clause[0] ^= final; - //assert(ps != ps_first+1); - } else - assert(!final); -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/PackedRow.h b/src/vendor/stp/src/sat/cryptominisat2/PackedRow.h deleted file mode 100644 index 876099886..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/PackedRow.h +++ /dev/null @@ -1,248 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef PACKEDROW_H -#define PACKEDROW_H - -//#define DEBUG_ROW - -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "SolverTypes.h" -#include "Vec.h" -#include -#include -#include -#include -#ifndef uint -#define uint unsigned int -#endif - -using std::vector; - -namespace MINISAT -{ -using namespace MINISAT; - - -class PackedMatrix; - -class PackedRow -{ -public: - bool operator ==(const PackedRow& b) const; - bool operator !=(const PackedRow& b) const; - - PackedRow& operator=(const PackedRow& b) - { - #ifdef DEBUG_ROW - assert(size > 0); - assert(b.size > 0); - assert(size == b.size); - #endif - - memcpy(mp-1, b.mp-1, size+1); - return *this; - } - - PackedRow& operator^=(const PackedRow& b) - { - #ifdef DEBUG_ROW - assert(size > 0); - assert(b.size > 0); - assert(b.size == size); - #endif - - for (uint32_t i = 0; i != size; i++) { - *(mp + i) ^= *(b.mp + i); - } - - is_true_internal ^= b.is_true_internal; - return *this; - } - - void xorBoth(const PackedRow& b) - { - #ifdef DEBUG_ROW - assert(size > 0); - assert(b.size > 0); - assert(b.size == size); - #endif - - for (uint32_t i = 0; i != 2*size+1; i++) { - *(mp + i) ^= *(b.mp + i); - } - - is_true_internal ^= b.is_true_internal; - } - - - uint32_t popcnt() const; - uint32_t popcnt(uint32_t from) const; - - bool popcnt_is_one() const - { - char popcount = 0; - for (uint32_t i = 0; i != size; i++) { - uint64_t tmp = mp[i]; - while(tmp) { - popcount += tmp & 1; - tmp >>= 1; - } - } - return popcount == 1; - } - - bool popcnt_is_one(uint32_t from) const - { - from++; - - uint64_t tmp = mp[from/64]; - tmp >>= from%64; - if (tmp) return false; - - for (uint32_t i = from/64+1; i != size; i++) - if (mp[i]) return false; - return true; - } - - inline const uint64_t& is_true() const - { - return is_true_internal; - } - - inline const bool isZero() const - { - for (uint32_t i = 0; i != size; i++) { - if (mp[i]) return false; - } - return true; - } - - inline void setZero() - { - memset(mp, 0, sizeof(uint64_t)*size); - } - - inline void clearBit(const uint32_t i) - { - mp[i/64] &= ~((uint64_t)1 << (i%64)); - } - - inline void invert_is_true(const bool b = true) - { - is_true_internal ^= (uint64_t)b; - } - - inline void setBit(const uint32_t i) - { - mp[i/64] |= ((uint64_t)1 << (i%64)); - } - - void swapBoth(PackedRow b) - { - #ifdef DEBUG_ROW - assert(size > 0); - assert(b.size > 0); - assert(b.size == size); - #endif - - uint64_t * __restrict mp1 = mp-1; - uint64_t * __restrict mp2 = b.mp-1; - - uint32_t i = 2*(size+1); - - while(i != 0) { - std::swap(*mp1, *mp2); - mp1++; - mp2++; - i--; - } - } - - inline const bool operator[](const uint32_t& i) const - { - #ifdef DEBUG_ROW - assert(size*64 > i); - #endif - - return (mp[i/64] >> (i%64)) & 1; - } - - template - void set(const T& v, const vector& var_to_col, const uint32_t matrix_size) - { - assert(size == (matrix_size/64) + ((bool)(matrix_size % 64))); - //mp = new uint64_t[size]; - setZero(); - for (uint32_t i = 0; i != v.size(); i++) { - const uint32_t toset_var = var_to_col[v[i].var()]; - assert(toset_var != std::numeric_limits::max()); - - setBit(toset_var); - } - - is_true_internal = !v.xor_clause_inverted(); - } - - void fill(vec& tmp_clause, const vec& assigns, const vector& col_to_var_original) const; - - inline unsigned long int scan(const unsigned long int var) const - { - #ifdef DEBUG_ROW - assert(size > 0); - #endif - - for(uint32_t i = var; i != size*64; i++) - if (this->operator[](i)) return i; - return std::numeric_limits::max(); - } - - friend std::ostream& operator << (std::ostream& os, const PackedRow& m); - -#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 0)) -// Workaround for GCC 4.0 which doesn't extend friendship to nested classes. See -// http://stackoverflow.com/questions/3584385/friend-access-to-protected-nested-class -// for details. -public: -#else -private: - friend class PackedMatrix; -#endif - PackedRow(const uint32_t _size, uint64_t* const _mp) : - mp(_mp+1) - , is_true_internal(*_mp) - , size(_size) - {} - -private: - uint64_t* __restrict const mp; - uint64_t& is_true_internal; - const uint32_t size; -}; - -std::ostream& operator << (std::ostream& os, const PackedRow& m); - -}; //NAMESPACE MINISAT - -#endif //PACKEDROW_H - diff --git a/src/vendor/stp/src/sat/cryptominisat2/PartFinder.cpp b/src/vendor/stp/src/sat/cryptominisat2/PartFinder.cpp deleted file mode 100644 index 969afe6d2..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/PartFinder.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "PartFinder.h" - -#include "Solver.h" -#include "Gaussian.h" -#include "GaussianConfig.h" -#include "ClauseCleaner.h" -#include "time_mem.h" -#include "VarReplacer.h" - -#include -#include -#include -#include -#include "FailedVarSearcher.h" -using std::set; -using std::map; - -//#define VERBOSE_DEBUG - -using std::cout; -using std::endl; - -//#define PART_FINDING - -namespace MINISAT -{ -using namespace MINISAT; - -PartFinder::PartFinder(Solver& _solver) : - solver(_solver) -{ -} - -const bool PartFinder::findParts() -{ - assert(solver.performReplace); - - double time = cpuTime(); - - table.clear(); - table.resize(solver.nVars(), std::numeric_limits::max()); - reverseTable.clear(); - part_no = 0; - - solver.clauseCleaner->removeAndCleanAll(true); - if (!solver.ok) return false; - while (solver.varReplacer->getNewToReplaceVars() > 0) { - if (solver.performReplace && !solver.varReplacer->performReplace(true)) - return false; - solver.clauseCleaner->removeAndCleanAll(true); - if (!solver.ok) return false; - } - assert(solver.varReplacer->getClauses().size() == 0); - - addToPart(solver.clauses); - addToPart(solver.binaryClauses); - addToPart(solver.xorclauses); - - const uint parts = setParts(); - - #ifndef NDEBUG - for (map >::const_iterator it = reverseTable.begin(); it != reverseTable.end(); it++) { - for (uint i2 = 0; i2 < it->second.size(); i2++) { - assert(table[(it->second)[i2]] == it->first); - } - } - #endif - - if (solver.verbosity >= 2 || (solver.verbosity >=1 && parts > 1)) { - std::cout << "c | Found parts: " << std::setw(10) << parts - << " time: " << std::setprecision(2) << std::setw(4) << cpuTime() - time - << " s" << std::setw(51) << " |" << std::endl; - } - - return true; -} - -template -void PartFinder::addToPart(const vec& cs) -{ - set tomerge; - vector newSet; - for (T* const* c = cs.getData(), * const*end = c + cs.size(); c != end; c++) { - if ((*c)->learnt()) continue; - tomerge.clear(); - newSet.clear(); - for (const Lit *l = (*c)->getData(), *end2 = l + (*c)->size(); l != end2; l++) { - if (table[l->var()] != std::numeric_limits::max()) - tomerge.insert(table[l->var()]); - else - newSet.push_back(l->var()); - } - if (tomerge.size() == 1) { - //no trees to merge, only merge the clause into one tree - - const uint into = *tomerge.begin(); - map >::iterator intoReverse = reverseTable.find(into); - for (uint i = 0; i < newSet.size(); i++) { - intoReverse->second.push_back(newSet[i]); - table[newSet[i]] = into; - } - continue; - } - - for (set::iterator it = tomerge.begin(); it != tomerge.end(); it++) { - newSet.insert(newSet.end(), reverseTable[*it].begin(), reverseTable[*it].end()); - reverseTable.erase(*it); - } - - for (uint i = 0; i < newSet.size(); i++) - table[newSet[i]] = part_no; - reverseTable[part_no] = newSet; - part_no++; - } -} - -const uint PartFinder::setParts() -{ - vector numClauseInPart(part_no, 0); - vector sumLitsInPart(part_no, 0); - - calcIn(solver.clauses, numClauseInPart, sumLitsInPart); - calcIn(solver.binaryClauses, numClauseInPart, sumLitsInPart); - calcIn(solver.xorclauses, numClauseInPart, sumLitsInPart); - - uint parts = 0; - for (uint i = 0; i < numClauseInPart.size(); i++) { - if (sumLitsInPart[i] == 0) continue; - if (solver.verbosity >= 2 || ( solver.verbosity >= 1 && reverseTable.size() > 1) ) { - std::cout << "c | Found part " << std::setw(8) << i - << " vars: " << std::setw(10) << reverseTable[i].size() - << " clauses:" << std::setw(10) << numClauseInPart[i] - << " lits size:" << std::setw(10) << sumLitsInPart[i] - << std::setw(12) << " | " << std::endl; - } - parts++; - } - - if (parts > 1) { - #ifdef VERBOSE_DEBUG - for (map >::iterator it = reverseTable.begin(), end = reverseTable.end(); it != end; it++) { - cout << "-- set begin --" << endl; - for (vector::iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; it2++) { - cout << *it2 << ", "; - } - cout << "-------" << endl; - } - #endif - } - - return parts; -} - -template -void PartFinder::calcIn(const vec& cs, vector& numClauseInPart, vector& sumLitsInPart) -{ - for (T*const* c = cs.getData(), *const*end = c + cs.size(); c != end; c++) { - if ((*c)->learnt()) continue; - T& x = **c; - const uint part = table[x[0].var()]; - assert(part < part_no); - - //for stats - numClauseInPart[part]++; - sumLitsInPart[part] += x.size(); - } -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/PartFinder.h b/src/vendor/stp/src/sat/cryptominisat2/PartFinder.h deleted file mode 100644 index a3261d74b..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/PartFinder.h +++ /dev/null @@ -1,98 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef PARTFINDER_H -#define PARTFINDER_H - -#include -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Clause.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class Solver; - -using std::map; -using std::vector; -using std::pair; - -class PartFinder { - - public: - PartFinder(Solver& solver); - const bool findParts(); - - const map >& getReverseTable() const; // part->var - const uint32_t getVarPart(const Var var) const; - const vector& getTable() const; //var -> part - const vector& getPartVars(const uint32_t part); - - private: - const uint setParts(); - template - void addToPart(const vec& cs); - - struct mysorter - { - bool operator () (const pair& left, const pair& right) - { - return left.second < right.second; - } - }; - - //const bool findParts(vector& xorFingerprintInMatrix, vector& xorsInMatrix); - template - void calcIn(const vec& cs, vector& numClauseInPart, vector& sumLitsInPart); - - map > reverseTable; //part -> vars - vector table; //var -> part - uint32_t part_no; - - Solver& solver; -}; - -inline const map >& PartFinder::getReverseTable() const -{ - return reverseTable; -} - -inline const vector& PartFinder::getTable() const -{ - return table; -} - -inline const uint32_t PartFinder::getVarPart(const Var var) const -{ - return table[var]; -} - -inline const vector& PartFinder::getPartVars(const uint32_t part) -{ - return reverseTable[part]; -} - -}; //NAMESPACE MINISAT - -#endif //PARTFINDER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/PartHandler.cpp b/src/vendor/stp/src/sat/cryptominisat2/PartHandler.cpp deleted file mode 100644 index 75032fe2c..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/PartHandler.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "PartHandler.h" -#include "VarReplacer.h" -#include -#include -#include - -//#define VERBOSE_DEBUG - -namespace MINISAT -{ -using namespace MINISAT; - -PartHandler::PartHandler(Solver& s) : - solver(s) -{ -} - - -const bool PartHandler::handle() -{ - if (solver.performReplace == false) - return true; - - PartFinder partFinder(solver); - if (!partFinder.findParts()) { - #ifdef VERBOSE_DEBUG - std::cout << "c findParts() found UNSAT. Whole problem is unsat." << std::endl; - #endif //VERBOSE_DEBUG - return false; - } - - uint32_t num_parts = partFinder.getReverseTable().size(); - if (num_parts == 1) - return true; - - map > reverseTable = partFinder.getReverseTable(); - assert(num_parts == partFinder.getReverseTable().size()); - - vector > sizes; - for (map >::iterator it = reverseTable.begin(); it != reverseTable.end(); it++) - sizes.push_back(std::make_pair(it->first, (uint32_t)it->second.size())); - - std::sort(sizes.begin(), sizes.end(), sort_pred()); - assert(sizes.size() > 1); - - for (uint32_t it = 0; it < sizes.size()-1; it++) { - uint32_t part = sizes[it].first; - vector vars = reverseTable[part]; - if (solver.verbosity >= 1) - std::cout << "c Solving part " << part << std::endl; - - Solver newSolver; - newSolver.mtrand.seed(solver.mtrand.randInt()); - newSolver.random_var_freq = solver.random_var_freq; - newSolver.verbosity = solver.verbosity; - newSolver.restrictedPickBranch = solver.restrictedPickBranch; - newSolver.greedyUnbound = solver.greedyUnbound; - newSolver.findNormalXors = solver.findNormalXors; - newSolver.findBinaryXors = solver.findBinaryXors; - newSolver.regularlyFindBinaryXors = solver.regularlyFindBinaryXors; - newSolver.conglomerateXors = solver.conglomerateXors; - newSolver.schedSimplification = solver.schedSimplification; - newSolver.performReplace = solver.performReplace; - newSolver.failedVarSearch = solver.failedVarSearch; - newSolver.gaussconfig.dontDisable = solver.gaussconfig.dontDisable; - newSolver.heuleProcess = solver.heuleProcess; - newSolver.doSubsumption = solver.doSubsumption; - newSolver.doPartHandler = solver.doPartHandler; - newSolver.fixRestartType = solver.fixRestartType; - newSolver.var_inc = solver.var_inc; - newSolver.polarity_mode = solver.polarity_mode; - - //Memory-usage reduction - newSolver.schedSimplification = false; - newSolver.doSubsumption = false; - newSolver.doXorSubsumption = false; - newSolver.doPartHandler = false; - newSolver.subsumeWithNonExistBinaries = false; - newSolver.regularSubsumeWithNonExistBinaries = false; - - std::sort(vars.begin(), vars.end()); - uint32_t i2 = 0; - for (Var var = 0; var < solver.nVars(); var++) { - if (i2 < vars.size() && vars[i2] == var) { - #ifdef VERBOSE_DEBUG - if (!solver.decision_var[var]) { - std::cout << "var " << var + 1 << " is non-decision, but in part... strange." << std::endl; - } - #endif //VERBOSE_DEBUG - newSolver.newVar(solver.decision_var[var]); - newSolver.activity[var] = solver.activity[var]; - newSolver.order_heap.update(var); - assert(partFinder.getVarPart(var) == part); - if (solver.decision_var[var]) { - solver.setDecisionVar(var, false); - decisionVarRemoved.push(var); - } - i2++; - } else { - assert(partFinder.getVarPart(var) != part); - newSolver.newVar(false); - } - } - solver.order_heap.filter(Solver::VarFilter(solver)); - - assert(solver.varReplacer->getClauses().size() == 0); - moveClauses(solver.clauses, newSolver, part, partFinder); - moveClauses(solver.binaryClauses, newSolver, part, partFinder); - moveClauses(solver.xorclauses, newSolver, part, partFinder); - moveLearntClauses(solver.binaryClauses, newSolver, part, partFinder); - moveLearntClauses(solver.learnts, newSolver, part, partFinder); - assert(checkClauseMovement(newSolver, part, partFinder)); - - lbool status = newSolver.solve(); - if (status == l_False) { - #ifdef VERBOSE_DEBUG - std::cout << "c One of the sub-problems was UNSAT. Whole problem is unsat." << std::endl; - #endif //VERBOSE_DEBUG - return false; - } - assert(status != l_Undef); - - for (Var var = 0; var < newSolver.nVars(); var++) { - if (newSolver.model[var] != l_Undef) { - assert(solver.assigns[var] == l_Undef); - } - } - - assert(newSolver.decisionLevel() == 0); - for (uint32_t i = 0; i < newSolver.trail.size(); i++) { - solver.uncheckedEnqueue(newSolver.trail[i]); - } - solver.ok = (solver.propagate().isNULL()); - assert(solver.ok); - - for (Var var = 0; var < newSolver.nVars(); var++) { - if (newSolver.model[var] != l_Undef) { - //Must have been decision var in the old solver!?? - //assert(std::find(decisionVarRemoved.getData(), decisionVarRemoved.getDataEnd(), var) != decisionVarRemoved.getDataEnd()); - assert(savedState[var] == l_Undef); - assert(partFinder.getVarPart(var) == part); - if (newSolver.assigns[var] == l_Undef) { - savedState[var] = newSolver.model[var]; - } - } - } - - if (solver.verbosity >= 1) - std::cout << "c Solved part" << std::endl; - } - if (solver.verbosity >= 1) - std::cout << "c Coming back to original instance" - << std::setw(57) << " |" << std::endl; - - solver.order_heap.filter(Solver::VarFilter(solver)); - - //Checking that all variables that are not in the remaining part are all non-decision vars, and none have been set - for (Var var = 0; var < solver.nVars(); var++) { - if (savedState[var] != l_Undef) { - assert(solver.decision_var[var] == false); - assert(solver.assigns[var] == l_Undef || solver.level[var] == 0); - } - } - - //Checking that all remaining clauses contain only variables that are in the remaining part - assert(checkClauseMovement(solver, sizes[sizes.size()-1].first, partFinder)); - - return true; -} - -const bool PartHandler::checkClauseMovement(const Solver& thisSolver, const uint32_t part, const PartFinder& partFinder) const -{ - if (!checkOnlyThisPart(thisSolver.clauses, part, partFinder)) - return false; - if (!checkOnlyThisPart(thisSolver.learnts, part, partFinder)) - return false; - if (!checkOnlyThisPart(thisSolver.binaryClauses, part, partFinder)) - return false; - if (!checkOnlyThisPart(thisSolver.xorclauses, part, partFinder)) - return false; - - return true; -} - -template -const bool PartHandler::checkOnlyThisPart(const vec& cs, const uint32_t part, const PartFinder& partFinder) const -{ - for(T * const*it = cs.getData(), * const*end = it + cs.size(); it != end; it++) { - const T& c = **it; - for(const Lit *l = c.getData(), *end2 = l + c.size(); l != end2; l++) { - if (partFinder.getVarPart(l->var()) != part) return false; - } - } - - return true; -} - -void PartHandler::moveClauses(vec& cs, Solver& newSolver, const uint32_t part, PartFinder& partFinder) -{ - Clause **i, **j, **end; - for (i = j = cs.getData(), j = i , end = i + cs.size(); i != end; i++) { - if ((**i).learnt() || partFinder.getVarPart((**i)[0].var()) != part) { - *j++ = *i; - continue; - } - solver.detachClause(**i); - #ifdef VERBOSE_DEBUG - std::cout << "clause in this part:"; (**i).plainPrint(); - #endif - - Clause& c = **i; - vec tmp(c.size()); - std::copy(c.getData(), c.getDataEnd(), tmp.getData()); - newSolver.addClause(tmp, c.getGroup()); - //NOTE: we need the CS because otherwise, the addClause could have changed **i, which we need to re-add later! - clausesRemoved.push(*i); - } - cs.shrink(i-j); -} - -void PartHandler::moveClauses(vec& cs, Solver& newSolver, const uint32_t part, PartFinder& partFinder) -{ - XorClause **i, **j, **end; - for (i = j = cs.getData(), end = i + cs.size(); i != end; i++) { - if (partFinder.getVarPart((**i)[0].var()) != part) { - *j++ = *i; - continue; - } - solver.detachClause(**i); - #ifdef VERBOSE_DEBUG - std::cout << "xor clause in this part:"; (**i).plainPrint(); - #endif - - XorClause& c = **i; - vec tmp(c.size()); - std::copy(c.getData(), c.getDataEnd(), tmp.getData()); - newSolver.addXorClause(tmp, c.xor_clause_inverted(), c.getGroup()); - //NOTE: we need the CS because otherwise, the addXorClause could have changed **i, which we need to re-add later! - xorClausesRemoved.push(*i); - } - cs.shrink(i-j); -} - -void PartHandler::moveLearntClauses(vec& cs, Solver& newSolver, const uint32_t part, PartFinder& partFinder) -{ - Clause **i, **j, **end; - for (i = j = cs.getData(), end = i + cs.size() ; i != end; i++) { - if (!(**i).learnt()) { - *j++ = *i; - continue; - } - - Clause& c = **i; - assert(c.size() > 0); - uint32_t clause_part = partFinder.getVarPart(c[0].var()); - bool removed = false; - for (const Lit* l = c.getData(), *end = l + c.size(); l != end; l++) { - if (partFinder.getVarPart(l->var()) != clause_part) { - #ifdef VERBOSE_DEBUG - std::cout << "Learnt clause in both parts:"; c.plainPrint(); - #endif - - removed = true; - solver.removeClause(c); - break; - } - } - if (removed) continue; - if (clause_part == part) { - #ifdef VERBOSE_DEBUG - //std::cout << "Learnt clause in this part:"; c.plainPrint(); - #endif - - solver.detachClause(c); - newSolver.addLearntClause(c, c.getGroup(), c.activity()); - solver.clauseAllocator.clauseFree(&c); - } else { - #ifdef VERBOSE_DEBUG - std::cout << "Learnt clause in other part:"; c.plainPrint(); - #endif - - *j++ = *i; - } - } - cs.shrink(i-j); -} - -void PartHandler::addSavedState() -{ - //Don't add these (non-0-decison-level!) solutions to the 0th decision level - solver.newDecisionLevel(); - for (Var var = 0; var < savedState.size(); var++) { - if (savedState[var] != l_Undef) { - assert(solver.assigns[var] == l_Undef); - solver.uncheckedEnqueue(Lit(var, savedState[var] == l_False)); - assert(solver.assigns[var] == savedState[var]); - savedState[var] = l_Undef; - solver.polarity[var] = (solver.assigns[var] == l_False); - } - } - - for (uint32_t i = 0; i < decisionVarRemoved.size(); i++) - solver.setDecisionVar(decisionVarRemoved[i], true); - decisionVarRemoved.clear(); -} - -void PartHandler::readdRemovedClauses() -{ - FILE* backup_libraryCNFfile = solver.libraryCNFFile; - solver.libraryCNFFile = NULL; - for (Clause **it = clausesRemoved.getData(), **end = clausesRemoved.getDataEnd(); it != end; it++) { - solver.addClause(**it, (*it)->getGroup()); - assert(solver.ok); - } - clausesRemoved.clear(); - - for (XorClause **it = xorClausesRemoved.getData(), **end = xorClausesRemoved.getDataEnd(); it != end; it++) { - solver.addXorClause(**it, (**it).xor_clause_inverted(), (*it)->getGroup()); - assert(solver.ok); - } - xorClausesRemoved.clear(); - solver.libraryCNFFile = backup_libraryCNFfile; -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/PartHandler.h b/src/vendor/stp/src/sat/cryptominisat2/PartHandler.h deleted file mode 100644 index f73bc98f1..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/PartHandler.h +++ /dev/null @@ -1,84 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef PARTHANDLER_H -#define PARTHANDLER_H - -#include "Solver.h" -#include "PartFinder.h" -#include "Vec.h" -#include "SolverTypes.h" - -#include -#include -using std::map; -using std::vector; -using std::pair; - -namespace MINISAT -{ -using namespace MINISAT; - -class PartHandler -{ - public: - PartHandler(Solver& solver); - const bool handle(); - const vec& getSavedState(); - void newVar(); - void addSavedState(); - void readdRemovedClauses(); - - friend class ClauseAllocator; - - private: - struct sort_pred { - bool operator()(const std::pair &left, const std::pair &right) { - return left.second < right.second; - } - }; - - //For moving clauses - void moveClauses(vec& cs, Solver& newSolver, const uint32_t part, PartFinder& partFinder); - void moveClauses(vec& cs, Solver& newSolver, const uint32_t part, PartFinder& partFinder); - void moveLearntClauses(vec& cs, Solver& newSolver, const uint32_t part, PartFinder& partFinder); - - //Checking moved clauses - const bool checkClauseMovement(const Solver& thisSolver, const uint32_t part, const PartFinder& partFinder) const; - template - const bool checkOnlyThisPart(const vec& cs, const uint32_t part, const PartFinder& partFinder) const; - - Solver& solver; - vec savedState; - vec decisionVarRemoved; //variables whose decision-ness has been removed - vec clausesRemoved; - vec xorClausesRemoved; -}; - -inline const vec& PartHandler::getSavedState() -{ - return savedState; -} - -inline void PartHandler::newVar() -{ - savedState.push(l_Undef); -} - -}; //NAMESPACE MINISAT - -#endif //PARTHANDLER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/RestartTypeChooser.cpp b/src/vendor/stp/src/sat/cryptominisat2/RestartTypeChooser.cpp deleted file mode 100644 index 739c4499c..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/RestartTypeChooser.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "RestartTypeChooser.h" -#include "Solver.h" - -//#define VERBOSE_DEBUG -//#define PRINT_VARS - -namespace MINISAT -{ -using namespace MINISAT; - -RestartTypeChooser::RestartTypeChooser(const Solver& s) : - solver(s) - , topX(100) - , limit(40) -{ -} - -void RestartTypeChooser::addInfo() -{ - firstVarsOld = firstVars; - calcHeap(); - uint sameIn = 0; - if (!firstVarsOld.empty()) { - uint thisTopX = std::min(firstVarsOld.size(), (size_t)topX); - for (uint i = 0; i != thisTopX; i++) { - if (std::find(firstVars.begin(), firstVars.end(), firstVarsOld[i]) != firstVars.end()) - sameIn++; - } - #ifdef VERBOSE_DEBUG - std::cout << " Same vars in first&second first 100: " << sameIn << std::endl; - #endif - sameIns.push_back(sameIn); - } - - #ifdef VERBOSE_DEBUG - std::cout << "Avg same vars in first&second first 100: " << avg() << " standard Deviation:" << stdDeviation(sameIns) < mypair = countVarsDegreeStDev(); - if ((mypair.second < 80 && - (avg() > (double)limit || ((avg() > (double)(limit*0.9) && stdDeviation(sameIns) < 5)))) - || - (mypair.second < 80 && (double)solver.xorclauses.size() > (double)solver.nClauses()*0.1)) - return static_restart; - else - return dynamic_restart; -} - -const double RestartTypeChooser::avg() const -{ - double sum = 0.0; - for (uint i = 0; i != sameIns.size(); i++) - sum += sameIns[i]; - return (sum/(double)sameIns.size()); -} - -const double RestartTypeChooser::stdDeviation(vector& measure) const -{ - double average = avg(); - double variance = 0.0; - for (uint i = 0; i != measure.size(); i++) - variance += pow((double)measure[i]-average, 2); - variance /= (double)measure.size(); - - return sqrt(variance); -} - -void RestartTypeChooser::calcHeap() -{ - firstVars.clear(); - firstVars.reserve(topX); - #ifdef PRINT_VARS - std::cout << "First vars:" << std::endl; - #endif - Heap tmp(solver.order_heap); - uint32_t thisTopX = std::min(tmp.size(), topX); - for (uint32_t i = 0; i != thisTopX; i++) { - #ifdef PRINT_VARS - std::cout << tmp.removeMin()+1 << ", "; - #endif - firstVars.push_back(tmp.removeMin()); - } - #ifdef PRINT_VARS - std::cout << std::endl; - #endif -} - -const std::pair RestartTypeChooser::countVarsDegreeStDev() const -{ - vector degrees; - degrees.resize(solver.nVars(), 0); - addDegrees(solver.clauses, degrees); - addDegrees(solver.binaryClauses, degrees); - addDegrees(solver.xorclauses, degrees); - uint32_t sum = 0; - uint32_t *i = °rees[0], *j = i; - for (uint32_t *end = i + degrees.size(); i != end; i++) { - if (*i != 0) { - sum += *i; - *j++ = *i; - } - } - degrees.resize(degrees.size() - (i-j)); - - double avg = (double)sum/(double)degrees.size(); - double stdDev = stdDeviation(degrees); - - #ifdef VERBOSE_DEBUG - std::cout << "varsDegree avg:" << avg << " stdDev:" << stdDev << std::endl; - #endif - - return std::make_pair(avg, stdDev); -} - -template -void RestartTypeChooser::addDegrees(const vec& cs, vector& degrees) const -{ - for (T * const*c = cs.getData(), * const*end = c + cs.size(); c != end; c++) { - T& cl = **c; - if (cl.learnt()) continue; - - for (const Lit *l = cl.getData(), *end2 = l + cl.size(); l != end2; l++) { - degrees[l->var()]++; - } - } -} - -template void RestartTypeChooser::addDegrees(const vec& cs, vector& degrees) const; -template void RestartTypeChooser::addDegrees(const vec& cs, vector& degrees) const; - -}; //NAMESPACE MINISAT - diff --git a/src/vendor/stp/src/sat/cryptominisat2/RestartTypeChooser.h b/src/vendor/stp/src/sat/cryptominisat2/RestartTypeChooser.h deleted file mode 100644 index 4c0628d48..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/RestartTypeChooser.h +++ /dev/null @@ -1,71 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef RESTARTTYPECHOOSER_H -#define RESTARTTYPECHOOSER_H - -#include "Solver.h" -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "SolverTypes.h" - -using std::vector; - -namespace MINISAT -{ -using namespace MINISAT; - -class Solver; - -class RestartTypeChooser -{ - public: - RestartTypeChooser(const Solver& s); - void addInfo(); - const RestartType choose(); - void reset(); - - private: - void calcHeap(); - const double avg() const; - const std::pair countVarsDegreeStDev() const; - const double stdDeviation(vector& measure) const; - - template - void addDegrees(const vec& cs, vector& degrees) const; - - const Solver& solver; - const uint32_t topX; - const uint32_t limit; - vector sameIns; - - vector firstVars, firstVarsOld; -}; - -inline void RestartTypeChooser::reset() -{ - sameIns.clear(); -} - -}; //NAMESPACE MINISAT - -#endif //RESTARTTYPECHOOSER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/Solver.cpp b/src/vendor/stp/src/sat/cryptominisat2/Solver.cpp deleted file mode 100644 index d3c353f95..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Solver.cpp +++ /dev/null @@ -1,2568 +0,0 @@ -/****************************************************************************************[Solver.C] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -CryptoMiniSat -- Copyright (c) 2009 Mate Soos -glucose -- Gilles Audemard, Laurent Simon (2008) - -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 "Solver.h" -#include -#include -#include -#include -#include -#include - -#include "Clause.h" -#include "time_mem.h" - -#include "VarReplacer.h" -#include "FindUndef.h" -#include "XorFinder.h" -#include "ClauseCleaner.h" -#include "RestartTypeChooser.h" -#include "FailedVarSearcher.h" -#include "Subsumer.h" -#include "PartHandler.h" -#include "XorSubsumer.h" -#include "StateSaver.h" -#include "UselessBinRemover.h" -#include "OnlyNonLearntBins.h" - -#ifdef USE_GAUSS -#include "Gaussian.h" -#include "MatrixFinder.h" -#endif //USE_GAUSS - -#ifdef _MSC_VER -#define __builtin_prefetch(a,b,c) -//#define __builtin_prefetch(a,b) -#endif //_MSC_VER - -//#define DEBUG_UNCHECKEDENQUEUE_LEVEL0 -//#define VERBOSE_DEBUG_POLARITIES -//#define DEBUG_DYNAMIC_RESTART - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// Constructor/Destructor: - - -Solver::Solver() : - // Parameters: (formerly in 'SearchParams') - random_var_freq(0.02) - , clause_decay (1 / 0.999) - , restart_first(100), restart_inc(1.5), learntsize_factor((double)1/(double)3), learntsize_inc(1) - - // More parameters: - // - , expensive_ccmin (true) - , polarity_mode (polarity_auto) - , verbosity (0) - , restrictedPickBranch(0) - , findNormalXors (true) - , findBinaryXors (true) - , regularlyFindBinaryXors(true) - , performReplace (true) - , conglomerateXors (true) - , heuleProcess (true) - , schedSimplification(true) - , doSubsumption (true) - , doXorSubsumption (true) - , doPartHandler (true) - , doHyperBinRes (true) - , doBlockedClause (true) - , doVarElim (true) - , doSubsume1 (true) - , failedVarSearch (true) - , addExtraBins (true) - , removeUselessBins(true) - , regularRemoveUselessBins(true) - , subsumeWithNonExistBinaries(true) - , regularSubsumeWithNonExistBinaries(true) - , libraryUsage (true) - , greedyUnbound (false) - , fixRestartType (auto_restart) - - // Statistics: (formerly in 'SolverStats') - // - , starts(0), dynStarts(0), staticStarts(0), fullStarts(0), decisions(0), rnd_decisions(0), propagations(0), conflicts(0) - , clauses_literals(0), learnts_literals(0), max_literals(0), tot_literals(0) - , nbDL2(0), nbBin(0), lastNbBin(0), becameBinary(0), lastSearchForBinaryXor(0), nbReduceDB(0) - , improvedClauseNo(0), improvedClauseSize(0) - - #ifdef USE_GAUSS - , sum_gauss_called (0) - , sum_gauss_confl (0) - , sum_gauss_prop (0) - , sum_gauss_unit_truths (0) - #endif //USE_GAUSS - , ok (true) - , var_inc (128) - , cla_inc (1) - - , curRestart (1) - , nbclausesbeforereduce (NBCLAUSESBEFOREREDUCE) - , nbCompensateSubsumer (0) - - , qhead (0) - , simpDB_assigns (-1) - , simpDB_props (0) - , order_heap (VarOrderLt(activity)) - , progress_estimate(0) - , remove_satisfied (true) - , mtrand((unsigned long int)0) - , restartType (static_restart) - , lastSelectedRestartType (static_restart) - #ifdef STATS_NEEDED - , logger(verbosity) - , dynamic_behaviour_analysis(false) //do not document the proof as default - #endif - , maxRestarts(UINT_MAX) - , MYFLAG (0) - , learnt_clause_group(0) - , libraryCNFFile (NULL) - , simplifying (false) -{ - varReplacer = new VarReplacer(*this); - clauseCleaner = new ClauseCleaner(*this); - failedVarSearcher = new FailedVarSearcher(*this); - partHandler = new PartHandler(*this); - subsumer = new Subsumer(*this); - xorSubsumer = new XorSubsumer(*this); - restartTypeChooser = new RestartTypeChooser(*this); - #ifdef USE_GAUSS - matrixFinder = new MatrixFinder(*this); - #endif //USE_GAUSS - - #ifdef STATS_NEEDED - logger.setSolver(this); - #endif -} - -Solver::~Solver() -{ - #ifdef USE_GAUSS - clearGaussMatrixes(); - delete matrixFinder; - #endif - - delete varReplacer; - delete clauseCleaner; - delete failedVarSearcher; - delete partHandler; - delete subsumer; - delete xorSubsumer; - delete restartTypeChooser; - - if (libraryCNFFile) - fclose(libraryCNFFile); -} - -//================================================================================================= -// Minor methods: - - -// Creates a new SAT variable in the solver. If 'decision_var' is cleared, variable will not be -// used as a decision variable (NOTE! This has effects on the meaning of a SATISFIABLE result). -Var Solver::newVar(bool dvar) -{ - Var v = nVars(); - watches .push(); // (list for positive literal) - watches .push(); // (list for negative literal) - binwatches.push(); // (list for positive literal) - binwatches.push(); // (list for negative literal) - xorwatches.push(); // (list for variables in xors) - reason .push(PropagatedFrom()); - assigns .push(l_Undef); - level .push(-1); - activity .push(0); - seen .push_back(0); - seen .push_back(0); - permDiff .push(0); - - polarity .push_back(defaultPolarity()); - #ifdef USE_OLD_POLARITIES - oldPolarity.push_back(defaultPolarity()); - #endif //USE_OLD_POLARITIES - - decision_var.push_back(dvar); - insertVarOrder(v); - - varReplacer->newVar(); - if (doPartHandler) partHandler->newVar(); - if (doSubsumption || subsumeWithNonExistBinaries || regularSubsumeWithNonExistBinaries) subsumer->newVar(); - if (doXorSubsumption) xorSubsumer->newVar(); - - insertVarOrder(v); - - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - logger.new_var(v); - #endif - - if (libraryCNFFile) - fprintf(libraryCNFFile, "c Solver::newVar() called\n"); - - return v; -} - -template -XorClause* Solver::addXorClauseInt(T& ps, bool xor_clause_inverted, const uint32_t group) -{ - assert(qhead == trail.size()); - assert(decisionLevel() == 0); - - if (ps.size() > (0x01UL << 18)) { - std::cout << "Too long clause!" << std::endl; - exit(-1); - } - std::sort(ps.getData(), ps.getDataEnd()); - Lit p; - uint32_t i, j; - for (i = j = 0, p = lit_Undef; i != ps.size(); i++) { - if (ps[i].var() == p.var()) { - //added, but easily removed - j--; - p = lit_Undef; - if (!assigns[ps[i].var()].isUndef()) - xor_clause_inverted ^= assigns[ps[i].var()].getBool(); - } else if (assigns[ps[i].var()].isUndef()) //just add - ps[j++] = p = ps[i]; - else //modify xor_clause_inverted instead of adding - xor_clause_inverted ^= (assigns[ps[i].var()].getBool()); - } - ps.shrink(i - j); - - switch(ps.size()) { - case 0: { - if (!xor_clause_inverted) ok = false; - return NULL; - } - case 1: { - uncheckedEnqueue(Lit(ps[0].var(), xor_clause_inverted)); - ok = (propagate().isNULL()); - return NULL; - } - case 2: { - #ifdef VERBOSE_DEBUG - cout << "--> xor is 2-long, replacing var " << ps[0].var()+1 << " with " << (!xor_clause_inverted ? "-" : "") << ps[1].var()+1 << endl; - #endif - - ps[0] = ps[0].unsign(); - ps[1] = ps[1].unsign(); - varReplacer->replace(ps, xor_clause_inverted, group); - return NULL; - } - default: { - XorClause* c = clauseAllocator.XorClause_new(ps, xor_clause_inverted, group); - attachClause(*c); - return c; - } - } -} - -template XorClause* Solver::addXorClauseInt(vec& ps, bool xor_clause_inverted, const uint32_t group); -template XorClause* Solver::addXorClauseInt(XorClause& ps, bool xor_clause_inverted, const uint32_t group); - -template -bool Solver::addXorClause(T& ps, bool xor_clause_inverted, const uint group, char* group_name) -{ - assert(decisionLevel() == 0); - if (ps.size() > (0x01UL << 18)) { - std::cout << "Too long clause!" << std::endl; - exit(-1); - } - - if (libraryCNFFile) { - fprintf(libraryCNFFile, "x"); - for (uint32_t i = 0; i < ps.size(); i++) ps[i].print(libraryCNFFile); - fprintf(libraryCNFFile, "0\n"); - } - - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) { - logger.set_group_name(group, group_name); - learnt_clause_group = std::max(group+1, learnt_clause_group); - } - #endif - - if (!ok) - return false; - assert(qhead == trail.size()); - - // Check if clause is satisfied and remove false/duplicate literals: - if (varReplacer->getNumLastReplacedVars() || subsumer->getNumElimed() || xorSubsumer->getNumElimed()) { - for (uint32_t i = 0; i != ps.size(); i++) { - if (subsumer->getVarElimed()[ps[i].var()] && !subsumer->unEliminate(ps[i].var())) - return false; - else if (xorSubsumer->getVarElimed()[ps[i].var()] && !xorSubsumer->unEliminate(ps[i].var())) - return false; - else { - Lit otherLit = varReplacer->getReplaceTable()[ps[i].var()]; - if (otherLit.var() != ps[i].var()) { - ps[i] = Lit(otherLit.var(), false); - xor_clause_inverted ^= otherLit.sign(); - } - } - } - } - - XorClause* c = addXorClauseInt(ps, xor_clause_inverted, group); - if (c != NULL) xorclauses.push(c); - - return ok; -} - -template bool Solver::addXorClause(vec& ps, bool xor_clause_inverted, const uint group, char* group_name); -template bool Solver::addXorClause(XorClause& ps, bool xor_clause_inverted, const uint group, char* group_name); - - -template -bool Solver::addLearntClause(T& ps, const uint group, const uint32_t activity) -{ - Clause* c = addClauseInt(ps, group); - if (c == NULL) return ok; - - //compensate for addClauseInt's attachClause, which doesn't know - //that this is a learnt clause. - clauses_literals -= c->size(); - learnts_literals += c->size(); - - c->makeLearnt(activity); - if (c->size() > 2) learnts.push(c); - else { - nbBin++; - binaryClauses.push(c); - } - return ok; -} -template bool Solver::addLearntClause(Clause& ps, const uint group, const uint32_t activity); -template bool Solver::addLearntClause(vec& ps, const uint group, const uint32_t activity); - -template -Clause* Solver::addClauseInt(T& ps, uint group) -{ - assert(ok); - - std::sort(ps.getData(), ps.getDataEnd()); - Lit p = lit_Undef; - uint32_t i, j; - for (i = j = 0; i != ps.size(); i++) { - if (value(ps[i]).getBool() || ps[i] == ~p) - return NULL; - else if (value(ps[i]) != l_False && ps[i] != p) - ps[j++] = p = ps[i]; - } - ps.shrink(i - j); - - if (ps.size() == 0) { - ok = false; - return NULL; - } else if (ps.size() == 1) { - uncheckedEnqueue(ps[0]); - ok = (propagate().isNULL()); - return NULL; - } - - Clause* c = clauseAllocator.Clause_new(ps, group); - attachClause(*c); - - return c; -} - -template Clause* Solver::addClauseInt(Clause& ps, const uint group); -template Clause* Solver::addClauseInt(vec& ps, const uint group); - -template -bool Solver::addClause(T& ps, const uint group, char* group_name) -{ - assert(decisionLevel() == 0); - if (ps.size() > (0x01UL << 18)) { - std::cout << "Too long clause!" << std::endl; - exit(-1); - } - - if (libraryCNFFile) { - for (uint32_t i = 0; i != ps.size(); i++) ps[i].print(libraryCNFFile); - fprintf(libraryCNFFile, "0\n"); - } - - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) { - logger.set_group_name(group, group_name); - learnt_clause_group = std::max(group+1, learnt_clause_group); - } - #endif - - if (!ok) - return false; - assert(qhead == trail.size()); - - // Check if clause is satisfied and remove false/duplicate literals: - if (varReplacer->getNumLastReplacedVars() || subsumer->getNumElimed() || xorSubsumer->getNumElimed()) { - for (uint32_t i = 0; i != ps.size(); i++) { - ps[i] = varReplacer->getReplaceTable()[ps[i].var()] ^ ps[i].sign(); - if (subsumer->getVarElimed()[ps[i].var()] && !subsumer->unEliminate(ps[i].var())) - return false; - if (xorSubsumer->getVarElimed()[ps[i].var()] && !xorSubsumer->unEliminate(ps[i].var())) - return false; - } - } - - Clause* c = addClauseInt(ps, group); - if (c != NULL) { - if (c->size() > 2) - clauses.push(c); - else - binaryClauses.push(c); - } - - return ok; -} - -template bool Solver::addClause(vec& ps, const uint group, char* group_name); -template bool Solver::addClause(Clause& ps, const uint group, char* group_name); - -void Solver::attachClause(XorClause& c) -{ - assert(c.size() > 2); - #ifdef DEBUG_ATTACH - assert(assigns[c[0].var()] == l_Undef); - assert(assigns[c[1].var()] == l_Undef); - #endif //DEBUG_ATTACH - - xorwatches[c[0].var()].push(clauseAllocator.getOffset((Clause*)&c)); - xorwatches[c[1].var()].push(clauseAllocator.getOffset((Clause*)&c)); - - clauses_literals += c.size(); -} - -void Solver::attachClause(Clause& c) -{ - assert(c.size() > 1); - uint32_t index0 = (~c[0]).toInt(); - uint32_t index1 = (~c[1]).toInt(); - - if (c.size() == 2) { - binwatches[index0].push(WatchedBin(c[1])); - binwatches[index1].push(WatchedBin(c[0])); - } else { - ClauseOffset offset = clauseAllocator.getOffset(&c); - watches[index0].push(Watched(offset, c[c.size()/2])); - watches[index1].push(Watched(offset, c[c.size()/2])); - } - - if (c.learnt()) learnts_literals += c.size(); - else clauses_literals += c.size(); -} - - -void Solver::detachClause(const XorClause& c) -{ - assert(c.size() > 1); - ClauseOffset offset = clauseAllocator.getOffset(&c); - assert(find(xorwatches[c[0].var()], offset)); - assert(find(xorwatches[c[1].var()], offset)); - remove(xorwatches[c[0].var()], offset); - remove(xorwatches[c[1].var()], offset); - - clauses_literals -= c.size(); -} - -void Solver::detachClause(const Clause& c) -{ - assert(c.size() > 1); - if (c.size() == 2) { - assert(findWatchedBinCl(binwatches[(~c[0]).toInt()], c[1])); - assert(findWatchedBinCl(binwatches[(~c[1]).toInt()], c[0])); - - removeWatchedBinCl(binwatches[(~c[0]).toInt()], c[1]); - removeWatchedBinCl(binwatches[(~c[1]).toInt()], c[0]); - } else { - ClauseOffset offset = clauseAllocator.getOffset(&c); - - assert(findWatchedCl(watches[(~c[0]).toInt()], offset)); - assert(findWatchedCl(watches[(~c[1]).toInt()], offset)); - - removeWatchedCl(watches[(~c[0]).toInt()], offset); - removeWatchedCl(watches[(~c[1]).toInt()], offset); - } - - if (c.learnt()) learnts_literals -= c.size(); - else clauses_literals -= c.size(); -} - -void Solver::detachModifiedClause(const Lit lit1, const Lit lit2, const uint origSize, const Clause* address) -{ - assert(origSize > 1); - - if (origSize == 2) { - assert(findWatchedBinCl(binwatches[(~lit1).toInt()], lit2)); - assert(findWatchedBinCl(binwatches[(~lit2).toInt()], lit1)); - removeWatchedBinCl(binwatches[(~lit1).toInt()], lit2); - removeWatchedBinCl(binwatches[(~lit2).toInt()], lit1); - } else { - ClauseOffset offset = clauseAllocator.getOffset(address); - assert(findW(watches[(~lit1).toInt()], offset)); - assert(findW(watches[(~lit2).toInt()], offset)); - removeW(watches[(~lit1).toInt()], offset); - removeW(watches[(~lit2).toInt()], offset); - } - if (address->learnt()) learnts_literals -= origSize; - else clauses_literals -= origSize; -} - -void Solver::detachModifiedClause(const Var var1, const Var var2, const uint origSize, const XorClause* address) -{ - assert(origSize > 2); - - ClauseOffset offset = clauseAllocator.getOffset(address); - assert(find(xorwatches[var1], offset)); - assert(find(xorwatches[var2], offset)); - remove(xorwatches[var1], offset); - remove(xorwatches[var2], offset); - - clauses_literals -= origSize; -} - -// Revert to the state at given level (keeping all assignment at 'level' but not beyond). -// -void Solver::cancelUntil(int level) -{ - #ifdef VERBOSE_DEBUG - cout << "Canceling until level " << level; - if (level > 0) cout << " sublevel: " << trail_lim[level]; - cout << endl; - #endif - - if ((int)decisionLevel() > level) { - - #ifdef USE_GAUSS - for (vector::iterator gauss = gauss_matrixes.begin(), end= gauss_matrixes.end(); gauss != end; gauss++) - (*gauss)->canceling(trail_lim[level]); - #endif //USE_GAUSS - - for (int sublevel = trail.size()-1; sublevel >= (int)trail_lim[level]; sublevel--) { - Var var = trail[sublevel].var(); - #ifdef VERBOSE_DEBUG - cout << "Canceling var " << var+1 << " sublevel: " << sublevel << endl; - #endif - #ifdef USE_OLD_POLARITIES - polarity[var] = oldPolarity[var]; - #endif //USE_OLD_POLARITIES - assigns[var] = l_Undef; - insertVarOrder(var); - } - qhead = trail_lim[level]; - trail.shrink_(trail.size() - trail_lim[level]); - trail_lim.shrink_(trail_lim.size() - level); - } - - #ifdef VERBOSE_DEBUG - cout << "Canceling finished. (now at level: " << decisionLevel() << " sublevel: " << trail.size()-1 << ")" << endl; - #endif -} - -void Solver::printLit(const Lit l) const -{ - printf("%s%d:%c", l.sign() ? "-" : "", l.var()+1, value(l) == l_True ? '1' : (value(l) == l_False ? '0' : 'X')); -} - -void Solver::needLibraryCNFFile(const char* fileName) -{ - libraryCNFFile = fopen(fileName, "w"); - assert(libraryCNFFile != NULL); -} - -#ifdef USE_GAUSS -void Solver::clearGaussMatrixes() -{ - for (uint i = 0; i < gauss_matrixes.size(); i++) - delete gauss_matrixes[i]; - gauss_matrixes.clear(); -} -#endif //USE_GAUSS - -inline bool Solver::defaultPolarity() -{ - switch(polarity_mode) { - case polarity_false: - return true; - case polarity_true: - return false; - case polarity_rnd: - return mtrand.randInt(1); - case polarity_auto: - return true; - default: - assert(false); - } - - return true; -} - -void Solver::tallyVotes(const vec& cs, vector& votes) const -{ - for (const Clause * const*it = cs.getData(), * const*end = it + cs.size(); it != end; it++) { - const Clause& c = **it; - if (c.learnt()) continue; - - double divider; - if (c.size() > 63) divider = 0.0; - else divider = 1.0/(double)((uint64_t)1<<(c.size()-1)); - - for (const Lit *it2 = &c[0], *end2 = it2 + c.size(); it2 != end2; it2++) { - if (it2->sign()) votes[it2->var()] += divider; - else votes[it2->var()] -= divider; - } - } -} - -void Solver::tallyVotes(const vec& cs, vector& votes) const -{ - for (const XorClause * const*it = cs.getData(), * const*end = it + cs.size(); it != end; it++) { - const XorClause& c = **it; - double divider; - if (c.size() > 63) divider = 0.0; - else divider = 1.0/(double)((uint64_t)1<<(c.size()-1)); - - for (const Lit *it2 = &c[0], *end2 = it2 + c.size(); it2 != end2; it2++) - votes[it2->var()] += divider; - } -} - -void Solver::calculateDefaultPolarities() -{ - #ifdef VERBOSE_DEBUG_POLARITIES - std::cout << "Default polarities: " << std::endl; - #endif - - assert(decisionLevel() == 0); - if (polarity_mode == polarity_auto) { - double time = cpuTime(); - - vector votes; - votes.resize(nVars(), 0.0); - - tallyVotes(clauses, votes); - tallyVotes(binaryClauses, votes); - tallyVotes(varReplacer->getClauses(), votes); - tallyVotes(xorclauses, votes); - - Var i = 0; - uint32_t posPolars = 0; - uint32_t undecidedPolars = 0; - for (vector::const_iterator it = votes.begin(), end = votes.end(); it != end; it++, i++) { - polarity[i] = (*it >= 0.0); - posPolars += (*it < 0.0); - undecidedPolars += (*it == 0.0); - #ifdef VERBOSE_DEBUG_POLARITIES - std::cout << !defaultPolarities[i] << ", "; - #endif //VERBOSE_DEBUG_POLARITIES - } - - if (verbosity >= 2) { - std::cout << "c | Calc default polars - " - << " time: " << std::fixed << std::setw(6) << std::setprecision(2) << cpuTime()-time << " s" - << " pos: " << std::setw(7) << posPolars - << " undec: " << std::setw(7) << undecidedPolars - << " neg: " << std::setw(7) << nVars()- undecidedPolars - posPolars - << std::setw(8) << " |" << std:: endl; - } - } else { - std::fill(polarity.begin(), polarity.end(), defaultPolarity()); - } - - #ifdef VERBOSE_DEBUG_POLARITIES - std::cout << std::endl; - #endif //VERBOSE_DEBUG_POLARITIES -} - -//================================================================================================= -// Major methods: - - -Lit Solver::pickBranchLit() -{ - #ifdef VERBOSE_DEBUG - cout << "decision level: " << decisionLevel() << " "; - #endif - - Var next = var_Undef; - - - bool random = mtrand.randDblExc() < random_var_freq; - - // Random decision: - if (random && !order_heap.empty()) { - if (restrictedPickBranch == 0) next = order_heap[mtrand.randInt(order_heap.size()-1)]; - else next = order_heap[mtrand.randInt(std::min((uint32_t)order_heap.size()-1, restrictedPickBranch))]; - - if (assigns[next] == l_Undef && decision_var[next]) - rnd_decisions++; - } - - // Activity based decision: - while (next == var_Undef || assigns[next] != l_Undef || !decision_var[next]) - if (order_heap.empty()) { - next = var_Undef; - break; - } else { - next = order_heap.removeMin(); - } - - bool sign; - if (next != var_Undef) { - if (simplifying && random) - sign = mtrand.randInt(1); - #ifdef RANDOM_LOOKAROUND_SEARCHSPACE - else if (avgBranchDepth.isvalid()) - sign = polarity[next] ^ (mtrand.randInt(avgBranchDepth.getavg() * ((lastSelectedRestartType == static_restart) ? 2 : 1) ) == 1); - #endif - else - sign = polarity[next]; - } - - assert(next == var_Undef || value(next) == l_Undef); - - if (next == var_Undef) { - #ifdef VERBOSE_DEBUG - cout << "SAT!" << endl; - #endif - return lit_Undef; - } else { - Lit lit(next,sign); - #ifdef VERBOSE_DEBUG - assert(decision_var[lit.var()]); - cout << "decided on: " << lit.var()+1 << " to set:" << !lit.sign() << endl; - #endif - return lit; - } -} - -// Assumes 'seen' is cleared (will leave it cleared) -template -bool subset(const T1& A, const T2& B, vector& seen) -{ - for (uint i = 0; i != B.size(); i++) - seen[B[i].toInt()] = 1; - for (uint i = 0; i != A.size(); i++) { - if (!seen[A[i].toInt()]) { - for (uint i = 0; i != B.size(); i++) - seen[B[i].toInt()] = 0; - return false; - } - } - for (uint i = 0; i != B.size(); i++) - seen[B[i].toInt()] = 0; - return true; -} - - -/*_________________________________________________________________________________________________ -| -| analyze : (confl : Clause*) (out_learnt : vec&) (out_btlevel : int&) -> [void] -| -| Description: -| Analyze conflict and produce a reason clause. -| -| Pre-conditions: -| * 'out_learnt' is assumed to be cleared. -| * Current decision level must be greater than root level. -| -| Post-conditions: -| * 'out_learnt[0]' is the asserting literal at level 'out_btlevel'. -| -| Effect: -| Will undo part of the trail, upto but not beyond the assumption of the current decision level. -|________________________________________________________________________________________________@*/ -Clause* Solver::analyze(PropagatedFrom confl, vec& out_learnt, int& out_btlevel, uint32_t &nbLevels, const bool update) -{ - int pathC = 0; - Lit p = lit_Undef; - - // Generate conflict clause: - // - out_learnt.push(); // (leave room for the asserting literal) - int index = trail.size() - 1; - out_btlevel = 0; - - PropagatedFrom oldConfl; - - do { - assert(!confl.isNULL()); // (otherwise should be UIP) - - if (update && restartType == static_restart && !confl.isBinary() && confl.getClause()->learnt()) - claBumpActivity(*confl.getClause()); - - for (uint j = (p == lit_Undef) ? 0 : 1, size = confl.size(); j != size; j++) { - Lit q; - if (j == 0 && confl.isBinary()) q = failBinLit; - else q = confl[j]; - const Var my_var = q.var(); - - if (!seen[my_var] && level[my_var] > 0) { - varBumpActivity(my_var); - seen[my_var] = 1; - if (level[my_var] >= (int)decisionLevel()) { - pathC++; - #ifdef UPDATEVARACTIVITY - if (lastSelectedRestartType == dynamic_restart - && !reason[q.var()].isBinary() - && !reason[q.var()].isNULL() - && reason[q.var()].getClause()->learnt()) - lastDecisionLevel.push(q.var()); - #endif - } else { - out_learnt.push(q); - if (level[my_var] > out_btlevel) - out_btlevel = level[my_var]; - } - } - } - - // Select next clause to look at: - while (!seen[trail[index--].var()]); - p = trail[index+1]; - oldConfl = confl; - confl = reason[p.var()]; - if (!confl.isBinary()) __builtin_prefetch(confl.getClause(), 1, 0); - seen[p.var()] = 0; - pathC--; - - } while (pathC > 0); - out_learnt[0] = ~p; - - // Simplify conflict clause: - // - uint32_t i, j; - if (expensive_ccmin) { - uint32_t abstract_level = 0; - for (i = 1; i < out_learnt.size(); i++) - abstract_level |= abstractLevel(out_learnt[i].var()); // (maintain an abstraction of levels involved in conflict) - - out_learnt.copyTo(analyze_toclear); - for (i = j = 1; i < out_learnt.size(); i++) - if (reason[out_learnt[i].var()].isNULL() || !litRedundant(out_learnt[i], abstract_level)) - out_learnt[j++] = out_learnt[i]; - } else { - out_learnt.copyTo(analyze_toclear); - for (i = j = 1; i < out_learnt.size(); i++) { - PropagatedFrom c(reason[out_learnt[i].var()]); - - for (uint k = 1, size = c.size(); k < size; k++) { - if (!seen[c[k].var()] && level[c[k].var()] > 0) { - out_learnt[j++] = out_learnt[i]; - break; - } - } - } - } - max_literals += out_learnt.size(); - out_learnt.shrink(i - j); - tot_literals += out_learnt.size(); - - // Find correct backtrack level: - // - if (out_learnt.size() == 1) - out_btlevel = 0; - else { - uint32_t max_i = 1; - for (uint32_t i = 2; i < out_learnt.size(); i++) - if (level[out_learnt[i].var()] > level[out_learnt[max_i].var()]) - max_i = i; - Lit p = out_learnt[max_i]; - out_learnt[max_i] = out_learnt[1]; - out_learnt[1] = p; - out_btlevel = level[p.var()]; - } - - if (lastSelectedRestartType == dynamic_restart) { - nbLevels = calcNBLevels(out_learnt); - #ifdef UPDATEVARACTIVITY - for(uint32_t i = 0; i != lastDecisionLevel.size(); i++) { - PropagatedFrom cl = reason[lastDecisionLevel[i]]; - if (!cl.isBinary() && cl.getClause()->activity() < nbLevels) - varBumpActivity(lastDecisionLevel[i]); - } - lastDecisionLevel.clear(); - #endif - } else { - nbLevels = 1000; - } - - for (uint32_t j = 0; j != analyze_toclear.size(); j++) - seen[analyze_toclear[j].var()] = 0; // ('seen[]' is now cleared) - - if (out_learnt.size() == 1) return NULL; - - if (!oldConfl.isBinary() && !oldConfl.getClause()->isXor() - && out_learnt.size() < oldConfl.getClause()->size()) { - if (!subset(out_learnt, *oldConfl.getClause(), seen)) - return NULL; - improvedClauseNo++; - improvedClauseSize += oldConfl.getClause()->size() - out_learnt.size(); - return oldConfl.getClause(); - } - - return NULL; -} - - -// Check if 'p' can be removed. 'abstract_levels' is used to abort early if the algorithm is -// visiting literals at levels that cannot be removed later. -bool Solver::litRedundant(Lit p, uint32_t abstract_levels) -{ - analyze_stack.clear(); - analyze_stack.push(p); - int top = analyze_toclear.size(); - while (analyze_stack.size() > 0) { - assert(!reason[analyze_stack.last().var()].isNULL()); - PropagatedFrom c(reason[analyze_stack.last().var()]); - - analyze_stack.pop(); - - for (uint i = 1, size = c.size(); i < size; i++) { - Lit p = c[i]; - if (!seen[p.var()] && level[p.var()] > 0) { - if (!reason[p.var()].isNULL() && (abstractLevel(p.var()) & abstract_levels) != 0) { - seen[p.var()] = 1; - analyze_stack.push(p); - analyze_toclear.push(p); - } else { - for (uint32_t j = top; j != analyze_toclear.size(); j++) - seen[analyze_toclear[j].var()] = 0; - analyze_toclear.shrink(analyze_toclear.size() - top); - return false; - } - } - } - } - - return true; -} - - -/*_________________________________________________________________________________________________ -| -| analyzeFinal : (p : Lit) -> [void] -| -| Description: -| Specialized analysis procedure to express the final conflict in terms of assumptions. -| Calculates the (possibly empty) set of assumptions that led to the assignment of 'p', and -| stores the result in 'out_conflict'. -|________________________________________________________________________________________________@*/ -void Solver::analyzeFinal(Lit p, vec& out_conflict) -{ - out_conflict.clear(); - out_conflict.push(p); - - if (decisionLevel() == 0) - return; - - seen[p.var()] = 1; - - for (int32_t i = (int32_t)trail.size()-1; i >= (int32_t)trail_lim[0]; i--) { - Var x = trail[i].var(); - if (seen[x]) { - if (reason[x].isNULL()) { - assert(level[x] > 0); - out_conflict.push(~trail[i]); - } else { - PropagatedFrom c = reason[x]; - for (uint j = 1, size = c.size(); j < size; j++) - if (level[c[j].var()] > 0) - seen[c[j].var()] = 1; - } - seen[x] = 0; - } - } - - seen[p.var()] = 0; -} - - -void Solver::uncheckedEnqueue(const Lit p, const PropagatedFrom& from) -{ - - #ifdef DEBUG_UNCHECKEDENQUEUE_LEVEL0 - #ifndef VERBOSE_DEBUG - if (decisionLevel() == 0) - #endif //VERBOSE_DEBUG - std::cout << "uncheckedEnqueue var " << p.var()+1 << " to " << !p.sign() << " level: " << decisionLevel() << " sublevel: " << trail.size() << std::endl; - #endif //DEBUG_UNCHECKEDENQUEUE_LEVEL0 - - //assert(decisionLevel() == 0 || !subsumer->getVarElimed()[p.var()]); - - assert(assigns[p.var()].isUndef()); - const Var v = p.var(); - assigns [v] = boolToLBool(!p.sign());//lbool(!sign(p)); // <<== abstract but not uttermost effecient - level [v] = decisionLevel(); - reason [v] = from; - #ifdef USE_OLD_POLARITIES - oldPolarity[p.var()] = polarity[p.var()]; - #endif //USE_OLD_POLARITIES - polarity[p.var()] = p.sign(); - trail.push(p); - - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - logger.propagation(p, from); - #endif -} - -/*_________________________________________________________________________________________________ -| -| propagate : [void] -> [Clause*] -| -| Description: -| Propagates all enqueued facts. If a conflict arises, the conflicting clause is returned, -| otherwise NULL. -| -| Post-conditions: -| * the propagation queue is empty, even if there was a conflict. -|________________________________________________________________________________________________@*/ -PropagatedFrom Solver::propagate(const bool update) -{ - PropagatedFrom confl; - uint32_t num_props = 0; - - #ifdef VERBOSE_DEBUG - cout << "Propagation started" << endl; - #endif - uint32_t qheadBin = qhead; - - while (qhead < trail.size()) { - - //First propagate binary clauses - while (qheadBin < trail.size()) { - Lit p = trail[qheadBin++]; - vec & wbin = binwatches[p.toInt()]; - num_props += wbin.size()/2; - for(WatchedBin *k = wbin.getData(), *end = wbin.getDataEnd(); k != end; k++) { - lbool val = value(k->impliedLit); - if (val.isUndef()) { - uncheckedEnqueue(k->impliedLit, PropagatedFrom(p)); - } else if (val == l_False) { - confl = PropagatedFrom(p); - failBinLit = k->impliedLit; - //goto EndPropagate; - } - } - } - if (!confl.isNULL()) { - goto EndPropagate; - } - - //Next, propagate normal clauses - Lit p = trail[qhead++]; // 'p' is enqueued fact to propagate. - vec& ws = watches[p.toInt()]; - Watched *i, *j, *end; - num_props += ws.size(); - - #ifdef VERBOSE_DEBUG - cout << "Propagating lit " << (p.sign() ? '-' : ' ') << p.var()+1 << endl; - #endif - - for (i = j = ws.getData(), end = ws.getDataEnd(); i != end;) { - if (i+1 != end && !value((i+1)->blockedLit).getBool()) - __builtin_prefetch(clauseAllocator.getPointer((i+1)->clause), 1, 0); - - if(value(i->blockedLit).getBool()) { // Clause is sat - *j++ = *i++; - continue; - } - Lit bl = i->blockedLit; - Clause& c = *clauseAllocator.getPointer(i->clause); - ClauseOffset origClauseOffset = i->clause; - i++; - - // Make sure the false literal is data[1]: - const Lit false_lit(~p); - if (c[0] == false_lit) - c[0] = c[1], c[1] = false_lit; - - assert(c[1] == false_lit); - - // If 0th watch is true, then clause is already satisfied. - const Lit& first = c[0]; - if (value(first).getBool()) { - j->clause = origClauseOffset; - j->blockedLit = first; - j++; - } else { - // Look for new watch: - for (Lit *k = &c[2], *end2 = c.getDataEnd(); k != end2; k++) { - if (value(*k) != l_False) { - c[1] = *k; - *k = false_lit; - watches[(~c[1]).toInt()].push(Watched(origClauseOffset, c[0])); - goto FoundWatch; - } - } - - // Did not find watch -- clause is unit under assignment: - j->clause = origClauseOffset; - j->blockedLit = bl; - j++; - if (value(first) == l_False) { - confl = PropagatedFrom(&c); - qhead = trail.size(); - // Copy the remaining watches: - while (i < end) - *j++ = *i++; - } else { - uncheckedEnqueue(first, &c); - #ifdef DYNAMICNBLEVEL - if (update && c.learnt() && c.activity() > 2) { // GA - uint32_t nbLevels = calcNBLevels(c); - if (nbLevels+1 < c.activity()) - c.setActivity(nbLevels); - } - #endif - } - } -FoundWatch: - ; - } - ws.shrink_(i - j); - - //Finally, propagate XOR-clauses - if (xorclauses.size() > 0 && confl.isNULL()) confl = propagate_xors(p); - } -EndPropagate: - propagations += num_props; - simpDB_props -= num_props; - - #ifdef VERBOSE_DEBUG - cout << "Propagation ended." << endl; - #endif - - return confl; -} - -PropagatedFrom Solver::propagateBin() -{ - while (qhead < trail.size()) { - Lit p = trail[qhead++]; - vec & wbin = binwatches[p.toInt()]; - propagations += wbin.size()/2; - for(WatchedBin *k = wbin.getData(), *end = wbin.getDataEnd(); k != end; k++) { - lbool val = value(k->impliedLit); - if (val.isUndef()) { - //uncheckedEnqueue(k->impliedLit, k->clause); - uncheckedEnqueueLight(k->impliedLit); - } else if (val == l_False) { - return PropagatedFrom(p); - } - } - } - - return PropagatedFrom(); -} - -template -inline const uint32_t Solver::calcNBLevels(const T& ps) -{ - MYFLAG++; - uint32_t nbLevels = 0; - for(const Lit *l = ps.getData(), *end = ps.getDataEnd(); l != end; l++) { - int32_t lev = level[l->var()]; - if (permDiff[lev] != MYFLAG) { - permDiff[lev] = MYFLAG; - nbLevels++; - } - } - return nbLevels; -} - -PropagatedFrom Solver::propagate_xors(const Lit& p) -{ - #ifdef VERBOSE_DEBUG_XOR - cout << "Xor-Propagating variable " << p.var()+1 << endl; - #endif - - PropagatedFrom confl; - - vec& ws = xorwatches[p.var()]; - ClauseOffset *i, *j, *end; - for (i = j = ws.getData(), end = i + ws.size(); i != end;) { - XorClause& c = *(XorClause*)clauseAllocator.getPointer(*i); - ClauseOffset origClauseOffset = *i; - i++; - if (i != end) - __builtin_prefetch(clauseAllocator.getPointer(*i), 1, 0); - - // Make sure the false literal is data[1]: - if (c[0].var() == p.var()) { - Lit tmp(c[0]); - c[0] = c[1]; - c[1] = tmp; - } - assert(c[1].var() == p.var()); - - #ifdef VERBOSE_DEBUG_XOR - cout << "--> xor thing -- " << endl; - printClause(c); - cout << endl; - #endif - bool final = c.xor_clause_inverted(); - for (uint32_t k = 0, size = c.size(); k != size; k++ ) { - const lbool& val = assigns[c[k].var()]; - if (val.isUndef() && k >= 2) { - Lit tmp(c[1]); - c[1] = c[k]; - c[k] = tmp; - #ifdef VERBOSE_DEBUG_XOR - cout << "new watch set" << endl << endl; - #endif - xorwatches[c[1].var()].push(origClauseOffset); - goto FoundWatch; - } - - c[k] = c[k].unsign() ^ val.getBool(); - final ^= val.getBool(); - } - - - { - // Did not find watch -- clause is unit under assignment: - *j++ = origClauseOffset; - - #ifdef VERBOSE_DEBUG_XOR - cout << "final: " << std::boolalpha << final << " - "; - #endif - if (assigns[c[0].var()].isUndef()) { - c[0] = c[0].unsign()^final; - - #ifdef VERBOSE_DEBUG_XOR - cout << "propagating "; - printLit(c[0]); - cout << endl; - cout << "propagation clause -- "; - printClause(*(Clause*)&c); - cout << endl << endl; - #endif - - uncheckedEnqueue(c[0], (Clause*)&c); - } else if (!final) { - - #ifdef VERBOSE_DEBUG_XOR - printf("conflict clause -- "); - printClause(*(Clause*)&c); - cout << endl << endl; - #endif - - confl = PropagatedFrom((Clause*)&c); - qhead = trail.size(); - // Copy the remaining watches: - while (i < end) - *j++ = *i++; - } else { - #ifdef VERBOSE_DEBUG_XOR - printf("xor satisfied\n"); - #endif - - Lit tmp(c[0]); - c[0] = c[1]; - c[1] = tmp; - } - } -FoundWatch: - ; - } - ws.shrink_(i - j); - - return confl; -} - - -/*_________________________________________________________________________________________________ -| -| reduceDB : () -> [void] -| -| Description: -| Remove half of the learnt clauses, minus the clauses locked by the current assignment. Locked -| clauses are clauses that are reason to some assignment. Binary clauses are never removed. -|________________________________________________________________________________________________@*/ -bool reduceDB_ltMiniSat::operator () (const Clause* x, const Clause* y) { - const uint xsize = x->size(); - const uint ysize = y->size(); - - // First criteria - if (xsize > 2 && ysize == 2) return 1; - if (ysize > 2 && xsize == 2) return 0; - - if (x->oldActivity() == y->oldActivity()) - return xsize > ysize; - else return x->oldActivity() < y->oldActivity(); -} - -bool reduceDB_ltGlucose::operator () (const Clause* x, const Clause* y) { - const uint xsize = x->size(); - const uint ysize = y->size(); - - // First criteria - if (xsize > 2 && ysize == 2) return 1; - if (ysize > 2 && xsize == 2) return 0; - - if (x->activity() > y->activity()) return 1; - if (x->activity() < y->activity()) return 0; - return xsize > ysize; -} - -void Solver::reduceDB() -{ - uint32_t i, j; - - nbReduceDB++; - if (lastSelectedRestartType == dynamic_restart) - std::sort(learnts.getData(), learnts.getData()+learnts.size(), reduceDB_ltGlucose()); - else - std::sort(learnts.getData(), learnts.getData()+learnts.size(), reduceDB_ltMiniSat()); - - #ifdef VERBOSE_DEBUG - std::cout << "Cleaning clauses" << std::endl; - for (uint i = 0; i != learnts.size(); i++) { - std::cout << "activity:" << learnts[i]->activity() - << " \toldActivity:" << learnts[i]->oldActivity() - << " \tsize:" << learnts[i]->size() << std::endl; - } - #endif - - - const uint removeNum = (double)learnts.size() / (double)RATIOREMOVECLAUSES; - for (i = j = 0; i != removeNum; i++){ - //NOTE: The next instruciton only works if removeNum < learnts.size() (strictly smaller!!) - __builtin_prefetch(learnts[i+1], 0, 0); - if (learnts[i]->size() > 2 && !locked(*learnts[i]) && learnts[i]->activity() > 2) { - removeClause(*learnts[i]); - } else - learnts[j++] = learnts[i]; - } - for (; i < learnts.size(); i++) { - learnts[j++] = learnts[i]; - } - learnts.shrink(i - j); - - clauseAllocator.consolidate(this); -} - -const vec& Solver::get_learnts() const -{ - return learnts; -} - -const vec& Solver::get_sorted_learnts() -{ - if (lastSelectedRestartType == dynamic_restart) - std::sort(learnts.getData(), learnts.getData()+learnts.size(), reduceDB_ltGlucose()); - else - std::sort(learnts.getData(), learnts.getData()+learnts.size(), reduceDB_ltMiniSat()); - return learnts; -} - -const vector Solver::get_unitary_learnts() const -{ - vector unitaries; - if (decisionLevel() > 0) { - for (uint32_t i = 0; i != trail_lim[0]; i++) { - unitaries.push_back(trail[i]); - } - } - - return unitaries; -} - -void Solver::dumpSortedLearnts(const char* file, const uint32_t maxSize) -{ - FILE* outfile = fopen(file, "w"); - if (!outfile) { - printf("Error: Cannot open file '%s' to write learnt clauses!\n", file); - exit(-1); - } - - fprintf(outfile, "c \nc ---------\n"); - fprintf(outfile, "c unitaries\n"); - fprintf(outfile, "c ---------\n"); - for (uint32_t i = 0, end = (trail_lim.size() > 0) ? trail_lim[0] : trail.size() ; i < end; i++) { - trail[i].printFull(outfile); - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - fprintf(outfile, "c name of var: %s\n", logger.get_var_name(trail[i].var()).c_str()); - #endif //STATS_NEEDED - } - - fprintf(outfile, "c conflicts %lu\n", (unsigned long)conflicts); - if (maxSize == 1) goto end; - - fprintf(outfile, "c \nc ---------------------------------\n"); - fprintf(outfile, "c learnt clauses from binaryClauses\n"); - fprintf(outfile, "c ---------------------------------\n"); - for (uint i = 0; i != binaryClauses.size(); i++) { - if (binaryClauses[i]->learnt()) { - binaryClauses[i]->print(outfile); - } - } - - fprintf(outfile, "c \nc ---------------------------------------\n"); - fprintf(outfile, "c clauses representing 2-long XOR clauses\n"); - fprintf(outfile, "c ---------------------------------------\n"); - { - const vector& table = varReplacer->getReplaceTable(); - for (Var var = 0; var != table.size(); var++) { - Lit lit = table[var]; - if (lit.var() == var) - continue; - - fprintf(outfile, "%s%d %d 0\n", (!lit.sign() ? "-" : ""), lit.var()+1, var+1); - fprintf(outfile, "%s%d -%d 0\n", (lit.sign() ? "-" : ""), lit.var()+1, var+1); - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - fprintf(outfile, "c name of two vars that are anti/equivalent: '%s' and '%s'\n", logger.get_var_name(lit.var()).c_str(), logger.get_var_name(var).c_str()); - #endif //STATS_NEEDED - } - } - fprintf(outfile, "c \nc --------------------n"); - fprintf(outfile, "c clauses from learnts\n"); - fprintf(outfile, "c --------------------n"); - if (lastSelectedRestartType == dynamic_restart) - std::sort(learnts.getData(), learnts.getData()+learnts.size(), reduceDB_ltGlucose()); - else - std::sort(learnts.getData(), learnts.getData()+learnts.size(), reduceDB_ltMiniSat()); - for (int i = learnts.size()-1; i >= 0 ; i--) { - if (learnts[i]->size() <= maxSize) { - learnts[i]->print(outfile); - } - } - - end: - - fclose(outfile); -} - -const uint32_t Solver::getNumElimSubsume() const -{ - return subsumer->getNumElimed(); -} - -const uint32_t Solver::getNumElimXorSubsume() const -{ - return xorSubsumer->getNumElimed(); -} - -const uint32_t Solver::getNumXorTrees() const -{ - return varReplacer->getNumTrees(); -} - -const uint32_t Solver::getNumXorTreesCrownSize() const -{ - return varReplacer->getNumReplacedVars(); -} - -const double Solver::getTotalTimeSubsumer() const -{ - return subsumer->getTotalTime(); -} - -const double Solver::getTotalTimeXorSubsumer() const -{ - return xorSubsumer->getTotalTime(); -} - - -void Solver::setMaxRestarts(const uint num) -{ - maxRestarts = num; -} - -inline int64_t abs64(int64_t a) -{ - if (a < 0) return -a; - return a; -} - -/*_________________________________________________________________________________________________ -| -| simplify : [void] -> [bool] -| -| Description: -| Simplify the clause database according to the current top-level assigment. Currently, the only -| thing done here is the removal of satisfied clauses, but more things can be put here. -|________________________________________________________________________________________________@*/ -const bool Solver::simplify() -{ - testAllClauseAttach(); - assert(decisionLevel() == 0); - - if (!ok || !propagate().isNULL()) { - ok = false; - return false; - } - - if (simpDB_props > 0) { - return true; - } - - double slowdown = (100000.0/(double)binaryClauses.size()); - slowdown = std::min(3.5, slowdown); - slowdown = std::max(0.2, slowdown); - - double speedup = 50000000.0/(double)(propagations-lastSearchForBinaryXor); - speedup = std::min(3.5, speedup); - speedup = std::max(0.2, speedup); - - /*std::cout << "new:" << nbBin - lastNbBin + becameBinary << std::endl; - std::cout << "left:" << ((double)(nbBin - lastNbBin + becameBinary)/BINARY_TO_XOR_APPROX) * slowdown << std::endl; - std::cout << "right:" << (double)order_heap.size() * PERCENTAGEPERFORMREPLACE * speedup << std::endl;*/ - - if (findBinaryXors && regularlyFindBinaryXors && - (((double)abs64((int64_t)nbBin - (int64_t)lastNbBin + (int64_t)becameBinary)/BINARY_TO_XOR_APPROX) * slowdown) > - ((double)order_heap.size() * PERCENTAGEPERFORMREPLACE * speedup)) { - lastSearchForBinaryXor = propagations; - - clauseCleaner->cleanClauses(clauses, ClauseCleaner::clauses); - clauseCleaner->cleanClauses(learnts, ClauseCleaner::learnts); - clauseCleaner->removeSatisfied(binaryClauses, ClauseCleaner::binaryClauses); - if (!ok) return false; - testAllClauseAttach(); - - XorFinder xorFinder(*this, binaryClauses, ClauseCleaner::binaryClauses); - if (!xorFinder.doNoPart(2, 2)) return false; - testAllClauseAttach(); - - lastNbBin = nbBin; - becameBinary = 0; - } - - // Remove satisfied clauses: - clauseCleaner->removeAndCleanAll(); - testAllClauseAttach(); - if (!ok) return false; - - if (performReplace && !varReplacer->performReplace()) - return false; - - // Remove fixed variables from the variable heap: - order_heap.filter(VarFilter(*this)); - - #ifdef USE_GAUSS - for (vector::iterator gauss = gauss_matrixes.begin(), end = gauss_matrixes.end(); gauss != end; gauss++) { - if (!(*gauss)->full_init()) return false; - } - #endif //USE_GAUSS - - simpDB_assigns = nAssigns(); - simpDB_props = clauses_literals + learnts_literals; // (shouldn't depend on stats really, but it will do for now) - - testAllClauseAttach(); - return true; -} - - -/*_________________________________________________________________________________________________ -| -| search : (nof_conflicts : int) (nof_learnts : int) (params : const SearchParams&) -> [lbool] -| -| Description: -| Search for a model the specified number of conflicts, keeping the number of learnt clauses -| below the provided limit. NOTE! Use negative value for 'nof_conflicts' or 'nof_learnts' to -| indicate infinity. -| -| Output: -| 'l_True' if a partial assigment that is consistent with respect to the clauseset is found. If -| all variables are decision variables, this means that the clause set is satisfiable. 'l_False' -| if the clause set is unsatisfiable. 'l_Undef' if the bound on number of conflicts is reached. -|________________________________________________________________________________________________@*/ -lbool Solver::search(int nof_conflicts, int nof_conflicts_fullrestart, const bool update) -{ - assert(ok); - int conflictC = 0; - vec learnt_clause; - llbool ret; - - starts++; - if (restartType == static_restart) - staticStarts++; - else - dynStarts++; - - #ifdef USE_GAUSS - for (vector::iterator gauss = gauss_matrixes.begin(), end = gauss_matrixes.end(); gauss != end; gauss++) { - if (!(*gauss)->full_init()) - return l_False; - } - #endif //USE_GAUSS - - testAllClauseAttach(); - findAllAttach(); - for (;;) { - PropagatedFrom confl = propagate(update); - - if (!confl.isNULL()) { - ret = handle_conflict(learnt_clause, confl, conflictC, update); - if (ret != l_Nothing) return ret; - } else { - #ifdef USE_GAUSS - bool at_least_one_continue = false; - for (vector::iterator gauss = gauss_matrixes.begin(), end= gauss_matrixes.end(); gauss != end; gauss++) { - ret = (*gauss)->find_truths(learnt_clause, conflictC); - if (ret == l_Continue) at_least_one_continue = true; - else if (ret != l_Nothing) return ret; - } - if (at_least_one_continue) continue; - #endif //USE_GAUSS - ret = new_decision(nof_conflicts, nof_conflicts_fullrestart, conflictC); - if (ret != l_Nothing) return ret; - } - } -} - -llbool Solver::new_decision(const int& nof_conflicts, const int& nof_conflicts_fullrestart, int& conflictC) -{ - - // Reached bound on number of conflicts? - switch (restartType) { - case dynamic_restart: - if (nbDecisionLevelHistory.isvalid() && - ((nbDecisionLevelHistory.getavg()) > (totalSumOfDecisionLevel / (double)(conflicts - conflictsAtLastSolve)))) { - - #ifdef DEBUG_DYNAMIC_RESTART - if (nbDecisionLevelHistory.isvalid()) { - std::cout << "nbDecisionLevelHistory.getavg():" << nbDecisionLevelHistory.getavg() <= 0 && conflictC >= nof_conflicts) { - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - progress_estimate = progressEstimate(); - #endif - cancelUntil(0); - return l_Undef; - } - break; - case auto_restart: - assert(false); - break; - } - if (nof_conflicts_fullrestart >= 0 && (int)conflicts >= nof_conflicts_fullrestart) { - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - progress_estimate = progressEstimate(); - #endif - cancelUntil(0); - return l_Undef; - } - - // Simplify the set of problem clauses: - if (decisionLevel() == 0 && !simplify()) { - return l_False; - } - - // Reduce the set of learnt clauses: - if (conflicts >= curRestart * nbclausesbeforereduce + nbCompensateSubsumer) { - curRestart ++; - reduceDB(); - nbclausesbeforereduce += 500; - } - - Lit next = lit_Undef; - while (decisionLevel() < assumptions.size()) { - // Perform user provided assumption: - Lit p = assumptions[decisionLevel()]; - if (value(p) == l_True) { - // Dummy decision level: - newDecisionLevel(); - } else if (value(p) == l_False) { - analyzeFinal(~p, conflict); - return l_False; - } else { - next = p; - break; - } - } - - if (next == lit_Undef) { - // New variable decision: - decisions++; - next = pickBranchLit(); - - if (next == lit_Undef) - return l_True; - } - - // Increase decision level and enqueue 'next' - assert(value(next) == l_Undef); - newDecisionLevel(); - uncheckedEnqueue(next); - - return l_Nothing; -} - -llbool Solver::handle_conflict(vec& learnt_clause, PropagatedFrom confl, int& conflictC, const bool update) -{ - #ifdef VERBOSE_DEBUG - cout << "Handling conflict: "; - for (uint i = 0; i < learnt_clause.size(); i++) - cout << learnt_clause[i].var()+1 << ","; - cout << endl; - #endif - - int backtrack_level; - uint32_t nbLevels; - - conflicts++; - conflictC++; - if (decisionLevel() == 0) - return l_False; - learnt_clause.clear(); - Clause* c = analyze(confl, learnt_clause, backtrack_level, nbLevels, update); - if (update) { - #ifdef RANDOM_LOOKAROUND_SEARCHSPACE - avgBranchDepth.push(decisionLevel()); - #endif //RANDOM_LOOKAROUND_SEARCHSPACE - if (restartType == dynamic_restart) - nbDecisionLevelHistory.push(nbLevels); - - totalSumOfDecisionLevel += nbLevels; - } else { - conflictsAtLastSolve++; - } - - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - logger.conflict(Logger::simple_confl_type, backtrack_level, confl->getGroup(), learnt_clause); - #endif - cancelUntil(backtrack_level); - - #ifdef VERBOSE_DEBUG - cout << "Learning:"; - for (uint i = 0; i < learnt_clause.size(); i++) printLit(learnt_clause[i]), cout << " "; - cout << endl; - cout << "reverting var " << learnt_clause[0].var()+1 << " to " << !learnt_clause[0].sign() << endl; - #endif - - assert(value(learnt_clause[0]) == l_Undef); - //Unitary learnt - if (learnt_clause.size() == 1) { - uncheckedEnqueue(learnt_clause[0]); - assert(backtrack_level == 0 && "Unit clause learnt, so must cancel until level 0, right?"); - - #ifdef VERBOSE_DEBUG - cout << "Unit clause learnt." << endl; - #endif - //Normal learnt - } else { - if (c) { - detachClause(*c); - for (uint32_t i = 0; i != learnt_clause.size(); i++) - (*c)[i] = learnt_clause[i]; - c->resize(learnt_clause.size()); - if (c->learnt()) { - if (c->activity() > nbLevels) - c->setActivity(nbLevels); // LS - if (c->size() == 2) - nbBin++; - } - c->setStrenghtened(); - } else { - c = clauseAllocator.Clause_new(learnt_clause, learnt_clause_group++, true); - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) - logger.set_group_name(c->getGroup(), "learnt clause"); - #endif - if (c->size() > 2) { - learnts.push(c); - c->setActivity(nbLevels); // LS - } else { - binaryClauses.push(c); - nbBin++; - } - } - if (nbLevels <= 2) nbDL2++; - attachClause(*c); - uncheckedEnqueue(learnt_clause[0], c); - } - - varDecayActivity(); - if (update && restartType == static_restart) claDecayActivity(); - - return l_Nothing; -} - -double Solver::progressEstimate() const -{ - double progress = 0; - double F = 1.0 / nVars(); - - for (uint32_t i = 0; i <= decisionLevel(); i++) { - int beg = i == 0 ? 0 : trail_lim[i - 1]; - int end = i == decisionLevel() ? trail.size() : trail_lim[i]; - progress += pow(F, (int)i) * (end - beg); - } - - return progress / nVars(); -} - -#ifdef USE_GAUSS -void Solver::print_gauss_sum_stats() -{ - if (gauss_matrixes.size() == 0 && verbosity >= 2) { - printf(" no matrixes found |\n"); - return; - } - - uint called = 0; - uint useful_prop = 0; - uint useful_confl = 0; - uint disabled = 0; - for (vector::const_iterator gauss = gauss_matrixes.begin(), end= gauss_matrixes.end(); gauss != end; gauss++) { - disabled += (*gauss)->get_disabled(); - called += (*gauss)->get_called(); - useful_prop += (*gauss)->get_useful_prop(); - useful_confl += (*gauss)->get_useful_confl(); - sum_gauss_unit_truths += (*gauss)->get_unit_truths(); - //gauss->print_stats(); - //gauss->print_matrix_stats(); - } - sum_gauss_called += called; - sum_gauss_confl += useful_confl; - sum_gauss_prop += useful_prop; - - if (verbosity >= 2) { - if (called == 0) { - printf(" disabled |\n"); - } else { - printf(" %3.0lf%% |", (double)useful_prop/(double)called*100.0); - printf(" %3.0lf%% |", (double)useful_confl/(double)called*100.0); - printf(" %3.0lf%% |\n", 100.0-(double)disabled/(double)gauss_matrixes.size()*100.0); - } - } -} -#endif //USE_GAUSS - -const bool Solver::chooseRestartType(const uint& lastFullRestart) -{ - uint relativeStart = starts - lastFullRestart; - - if (relativeStart > RESTART_TYPE_DECIDER_FROM && relativeStart < RESTART_TYPE_DECIDER_UNTIL) { - if (fixRestartType == auto_restart) - restartTypeChooser->addInfo(); - - if (relativeStart == (RESTART_TYPE_DECIDER_UNTIL-1)) { - RestartType tmp; - if (fixRestartType == auto_restart) - tmp = restartTypeChooser->choose(); - else - tmp = fixRestartType; - - if (tmp == dynamic_restart) { - nbDecisionLevelHistory.fastclear(); - nbDecisionLevelHistory.initSize(100); - if (verbosity >= 2) - printf("c | Decided on dynamic restart strategy |\n"); - } else { - if (verbosity >= 2) - printf("c | Decided on static restart strategy |\n"); - - #ifdef USE_GAUSS - if (!matrixFinder->findMatrixes()) return false; - #endif //USE_GAUSS - } - lastSelectedRestartType = tmp; - restartType = tmp; - restartTypeChooser->reset(); - } - } - - return true; -} - -inline void Solver::setDefaultRestartType() -{ - if (fixRestartType != auto_restart) restartType = fixRestartType; - else restartType = static_restart; - - if (restartType == dynamic_restart) { - nbDecisionLevelHistory.fastclear(); - nbDecisionLevelHistory.initSize(100); - } - - lastSelectedRestartType = restartType; -} - -const lbool Solver::simplifyProblem(const uint32_t numConfls) -{ - testAllClauseAttach(); - #ifdef USE_GAUSS - bool gauss_was_cleared = (gauss_matrixes.size() == 0); - clearGaussMatrixes(); - #endif //USE_GAUSS - - StateSaver savedState(*this);; - - #ifdef BURST_SEARCH - if (verbosity >= 2) - std::cout << "c | " << std::setw(24) << " " - << "Simplifying problem for " << std::setw(8) << numConfls << " confls" - << std::setw(24) << " |" << std::endl; - random_var_freq = 1; - simplifying = true; - uint64_t origConflicts = conflicts; - #endif //BURST_SEARCH - - lbool status = l_Undef; - - #ifdef BURST_SEARCH - restartType = static_restart; - - while(status == l_Undef && conflicts-origConflicts < numConfls) { - printRestartStat(); - status = search(100, -1, false); - starts--; - } - if (status != l_Undef) - goto end; - printRestartStat(); - #endif //BURST_SEARCH - - if (doXorSubsumption && !xorSubsumer->simplifyBySubsumption()) { - status = l_False; - goto end; - } - testAllClauseAttach(); - - if (failedVarSearch && !failedVarSearcher->search((nClauses() < 500000 && order_heap.size() < 50000) ? 9000000 : 3000000)) { - status = l_False; - goto end; - } - testAllClauseAttach(); - - if (performReplace && (regularRemoveUselessBins || regularSubsumeWithNonExistBinaries)) { - OnlyNonLearntBins onlyNonLearntBins(*this); - if (!onlyNonLearntBins.fill()) { - status = l_False; - goto end; - } - if (regularRemoveUselessBins) { - UselessBinRemover uselessBinRemover(*this, onlyNonLearntBins); - if (!uselessBinRemover.removeUslessBinFull()) { - status = l_False; - goto end; - } - } - if (regularSubsumeWithNonExistBinaries - && !subsumer->subsumeWithBinaries(&onlyNonLearntBins)) { - status = l_False; - goto end; - } - } - - if (doSubsumption && !subsumer->simplifyBySubsumption(false)) { - status = l_False; - goto end; - } - if (doSubsumption && !subsumer->simplifyBySubsumption(true)) { - status = l_False; - goto end; - } - testAllClauseAttach(); - - /*if (findNormalXors && xorclauses.size() > 200 && clauses.size() < MAX_CLAUSENUM_XORFIND/8) { - XorFinder xorFinder(*this, clauses, ClauseCleaner::clauses); - if (!xorFinder.doNoPart(3, 7)) { - status = l_False; - goto end; - } - } else*/ if (xorclauses.size() <= 200 && xorclauses.size() > 0 && nClauses() > 10000) { - XorFinder x(*this, clauses, ClauseCleaner::clauses); - x.addAllXorAsNorm(); - } - -end: - #ifdef BURST_SEARCH - if (verbosity >= 2) - printf("c Simplifying finished |\n"); - #endif //#ifdef BURST_SEARCH - - - savedState.restore(); - simplifying = false; - - #ifdef USE_GAUSS - if (status == l_Undef && !gauss_was_cleared && !matrixFinder->findMatrixes()) - status = l_False; - #endif //USE_GAUSS - - testAllClauseAttach(); - return status; -} - -const bool Solver::checkFullRestart(int& nof_conflicts, int& nof_conflicts_fullrestart, uint& lastFullRestart) -{ - if (nof_conflicts_fullrestart > 0 && (int)conflicts >= nof_conflicts_fullrestart) { - #ifdef USE_GAUSS - clearGaussMatrixes(); - #endif //USE_GAUSS - if (verbosity >= 2) - printf("c | Fully restarting |\n"); - nof_conflicts = restart_first + (double)restart_first*restart_inc; - nof_conflicts_fullrestart = (double)nof_conflicts_fullrestart * FULLRESTART_MULTIPLIER_MULTIPLIER; - restartType = static_restart; - lastFullRestart = starts; - - /*if (findNormalXors && clauses.size() < MAX_CLAUSENUM_XORFIND) { - XorFinder xorFinder(this, clauses, ClauseCleaner::clauses); - if (!xorFinder.doNoPart(3, 10)) - return false; - }*/ - - if (doPartHandler && !partHandler->handle()) - return false; - - //calculateDefaultPolarities(); - - fullStarts++; - } - - return true; -} - -inline void Solver::performStepsBeforeSolve() -{ - assert(qhead == trail.size()); - testAllClauseAttach(); - - if (performReplace && !varReplacer->performReplace()) return; - - if (doSubsumption && !subsumer->simplifyBySubsumption(true)) { - return; - } - - if (performReplace) { - OnlyNonLearntBins onlyNonLearntBins(*this); - if (!onlyNonLearntBins.fill()) return; - if (regularRemoveUselessBins) { - UselessBinRemover uselessBinRemover(*this, onlyNonLearntBins); - if (!uselessBinRemover.removeUslessBinFull()) return; - } - if (subsumeWithNonExistBinaries - && !subsumer->subsumeWithBinaries(&onlyNonLearntBins)) return; - } - - if (doSubsumption - && !libraryUsage - && clauses.size() + binaryClauses.size() + learnts.size() < 4800000 - && !subsumer->simplifyBySubsumption()) - return; - - /* - if (conflicts == 0 && learnts.size() == 0 - && noLearntBinaries()) { - if (subsumeWithNonExistBinaries && !subsumer->subsumeWithBinaries(true)) return; - OnlyNonLearntBins onlyNonLearntBins(*this); - if (!onlyNonLearntBins.fill()) return; - if (regularRemoveUselessBins) { - UselessBinRemover uselessBinRemover(*this, onlyNonLearntBins); - if (!uselessBinRemover.removeUslessBinFull()) return; - } - } - */ - - if (findBinaryXors && binaryClauses.size() < MAX_CLAUSENUM_XORFIND) { - XorFinder xorFinder(*this, binaryClauses, ClauseCleaner::binaryClauses); - if (!xorFinder.doNoPart(2, 2)) return; - if (performReplace && !varReplacer->performReplace(true)) return; - } - - if (findNormalXors && clauses.size() < MAX_CLAUSENUM_XORFIND) { - XorFinder xorFinder(*this, clauses, ClauseCleaner::clauses); - if (!xorFinder.doNoPart(3, 7)) return; - } - - if (xorclauses.size() > 1) { - testAllClauseAttach(); - if (doXorSubsumption && !xorSubsumer->simplifyBySubsumption()) - return; - - testAllClauseAttach(); - if (performReplace && !varReplacer->performReplace()) - return; - } -} - -void Solver::checkSolution() -{ - // Extend & check: - model.growTo(nVars()); - for (Var var = 0; var != nVars(); var++) model[var] = value(var); - verifyModel(); - model.clear(); -} - -lbool Solver::solve(const vec& assumps) -{ -#ifdef VERBOSE_DEBUG - std::cout << "Solver::solve() called" << std::endl; -#endif - if (!ok) return l_False; - assert(qhead == trail.size()); - - if (libraryCNFFile) - fprintf(libraryCNFFile, "c Solver::solve() called\n"); - - model.clear(); - conflict.clear(); - #ifdef USE_GAUSS - clearGaussMatrixes(); - #endif //USE_GAUSS - setDefaultRestartType(); - totalSumOfDecisionLevel = 0; - conflictsAtLastSolve = conflicts; - #ifdef RANDOM_LOOKAROUND_SEARCHSPACE - avgBranchDepth.fastclear(); - avgBranchDepth.initSize(500); - #endif //RANDOM_LOOKAROUND_SEARCHSPACE - starts = 0; - - assumps.copyTo(assumptions); - - int nof_conflicts = restart_first; - int nof_conflicts_fullrestart = restart_first * FULLRESTART_MULTIPLIER + conflicts; - //nof_conflicts_fullrestart = -1; - uint lastFullRestart = starts; - lbool status = l_Undef; - uint64_t nextSimplify = restart_first * SIMPLIFY_MULTIPLIER + conflicts; - - if (nClauses() * learntsize_factor < nbclausesbeforereduce) { - if (nClauses() * learntsize_factor < nbclausesbeforereduce/2) - nbclausesbeforereduce = nbclausesbeforereduce/4; - else - nbclausesbeforereduce = (nClauses() * learntsize_factor)/2; - } - testAllClauseAttach(); - findAllAttach(); - - if (conflicts == 0) { - performStepsBeforeSolve(); - if (!ok) return l_False; - - printStatHeader(); - } - calculateDefaultPolarities(); - - // Search: - while (status == l_Undef && starts < maxRestarts) { - #ifdef DEBUG_VARELIM - assert(subsumer->checkElimedUnassigned()); - assert(xorSubsumer->checkElimedUnassigned()); - #endif //DEBUG_VARELIM - - if (schedSimplification && conflicts >= nextSimplify) { - status = simplifyProblem(500); - nextSimplify = conflicts * 1.5; - if (status != l_Undef) break; - } - - printRestartStat(); - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) { - logger.end(Logger::restarting); - logger.begin(); - } - #endif - - status = search(nof_conflicts, nof_conflicts_fullrestart); - nof_conflicts = (double)nof_conflicts * restart_inc; - if (status != l_Undef) break; - if (!checkFullRestart(nof_conflicts, nof_conflicts_fullrestart, lastFullRestart)) - return l_False; - if (!chooseRestartType(lastFullRestart)) - return l_False; - #ifdef RANDOM_LOOKAROUND_SEARCHSPACE - //if (avgBranchDepth.isvalid()) - // std::cout << "avg branch depth:" << avgBranchDepth.getavg() << std::endl; - #endif //RANDOM_LOOKAROUND_SEARCHSPACE - } - printEndSearchStat(); - - #ifdef USE_GAUSS - for (uint i = 0; i < gauss_matrixes.size(); i++) - delete gauss_matrixes[i]; - gauss_matrixes.clear(); - #endif //USE_GAUSS - -#ifdef VERBOSE_DEBUG - if (status == l_True) - std::cout << "Solution is SAT" << std::endl; - else if (status == l_False) - std::cout << "Solution is UNSAT" << std::endl; - else - std::cout << "Solutions is UNKNOWN" << std::endl; -#endif //VERBOSE_DEBUG - - if (status == l_True) { - if (greedyUnbound) { - double time = cpuTime(); - FindUndef finder(*this); - const uint unbounded = finder.unRoll(); - if (verbosity >= 1) - printf("c Greedy unbounding :%5.2lf s, unbounded: %7d vars\n", cpuTime()-time, unbounded); - } - - partHandler->addSavedState(); - varReplacer->extendModelPossible(); -#ifndef NDEBUG - //checkSolution(); -#endif - - if (subsumer->getNumElimed() || xorSubsumer->getNumElimed()) { - if (verbosity >= 1) { - std::cout << "c Solution needs extension. Extending." << std::endl; - } - Solver s; - s.doSubsumption = false; - s.performReplace = false; - s.findBinaryXors = false; - s.findNormalXors = false; - s.failedVarSearch = false; - s.conglomerateXors = false; - s.subsumeWithNonExistBinaries = false; - s.regularSubsumeWithNonExistBinaries = false; - s.removeUselessBins = false; - s.regularRemoveUselessBins = false; - s.greedyUnbound = greedyUnbound; - for (Var var = 0; var < nVars(); var++) { - s.newVar(decision_var[var] || subsumer->getVarElimed()[var] || varReplacer->varHasBeenReplaced(var) || xorSubsumer->getVarElimed()[var]); - - //assert(!(xorSubsumer->getVarElimed()[var] && (decision_var[var] || subsumer->getVarElimed()[var] || varReplacer->varHasBeenReplaced(var)))); - - if (value(var) != l_Undef) { - vec tmp; - tmp.push(Lit(var, value(var) == l_False)); - s.addClause(tmp); - } - } - varReplacer->extendModelImpossible(s); - subsumer->extendModel(s); - xorSubsumer->extendModel(s); - - status = s.solve(); - if (status != l_True) { - printf("c ERROR! Extension of model failed!\n"); - assert(status == l_True); - exit(-1); - } -#ifdef VERBOSE_DEBUG - std::cout << "Solution extending finished." << std::endl; -#endif - for (Var var = 0; var < nVars(); var++) { - if (assigns[var] == l_Undef && s.model[var] != l_Undef) uncheckedEnqueue(Lit(var, s.model[var] == l_False)); - } - ok = (propagate().isNULL()); - if (!ok) { - printf("c ERROR! Extension of model failed!\n"); - assert(ok); - exit(-1); - } - } -#ifndef NDEBUG - //checkSolution(); -#endif - //Copy model: - model.growTo(nVars()); - for (Var var = 0; var != nVars(); var++) model[var] = value(var); - } - - if (status == l_False) { - if (conflict.size() == 0) - ok = false; - } - - #ifdef STATS_NEEDED - if (dynamic_behaviour_analysis) { - if (status == l_True) - logger.end(Logger::model_found); - else if (status == l_False) - logger.end(Logger::unsat_model_found); - else if (status == l_Undef) - logger.end(Logger::restarting); - } - #endif - - #ifdef LS_STATS_NBBUMP - for(int i=0;isize(),learnts[i]->activity(), - (uint)learnts[i]->nbBump()); - #endif - - cancelUntil(0); - if (doPartHandler && status != l_False) partHandler->readdRemovedClauses(); - restartTypeChooser->reset(); - -#ifdef VERBOSE_DEBUG - std::cout << "Solver::solve() finished" << std::endl; -#endif - return status; -} - -//================================================================================================= -// Debug methods: - -bool Solver::verifyXorClauses(const vec& cs) const -{ - #ifdef VERBOSE_DEBUG - cout << "Checking xor-clauses whether they have been properly satisfied." << endl;; - #endif - - bool failed = false; - - for (uint32_t i = 0; i != xorclauses.size(); i++) { - XorClause& c = *xorclauses[i]; - bool final = c.xor_clause_inverted(); - - #ifdef VERBOSE_DEBUG - XorClause* c2 = XorClause_new(c, c.xor_clause_inverted(), c.getGroup()); - std::sort(c2->getData(), c2->getData()+ c2->size()); - c2->plainPrint(); - clauseFree(c2); - #endif - - for (uint j = 0; j < c.size(); j++) { - assert(modelValue(c[j].unsign()) != l_Undef); - final ^= (modelValue(c[j].unsign()) == l_True); - } - if (!final) { - printf("unsatisfied clause: "); - xorclauses[i]->plainPrint(); - failed = true; - } - } - - return failed; -} - -bool Solver::verifyClauses(const vec& cs) const -{ - #ifdef VERBOSE_DEBUG - cout << "Checking clauses whether they have been properly satisfied." << endl;; - #endif - - bool failed = false; - - for (uint32_t i = 0; i != cs.size(); i++) { - Clause& c = *cs[i]; - for (uint j = 0; j < c.size(); j++) - if (modelValue(c[j]) == l_True) - goto next; - - printf("unsatisfied clause: "); - cs[i]->plainPrint(); - failed = true; - next: - ; - } - - return failed; -} - -void Solver::verifyModel() -{ - assert(!verifyClauses(clauses)); - assert(!verifyClauses(binaryClauses)); - assert(!verifyXorClauses(xorclauses)); - - if (verbosity >=1) - printf("c Verified %d clauses.\n", clauses.size() + xorclauses.size()); -} - - -void Solver::checkLiteralCount() -{ - // Check that sizes are calculated correctly: - int cnt = 0; - for (uint32_t i = 0; i != clauses.size(); i++) - cnt += clauses[i]->size(); - - for (uint32_t i = 0; i != xorclauses.size(); i++) - cnt += xorclauses[i]->size(); - - if ((int)clauses_literals != cnt) { - fprintf(stderr, "literal count: %d, real value = %d\n", (int)clauses_literals, cnt); - assert((int)clauses_literals == cnt); - } -} - -void Solver::printStatHeader() const -{ - #ifdef STATS_NEEDED - if (verbosity >= 1 && !(dynamic_behaviour_analysis && logger.statistics_on)) { - #else - if (verbosity >= 1) { - #endif - printf("c ============================[ Search Statistics ]========================================\n"); - printf("c | Conflicts | ORIGINAL | LEARNT | GAUSS |\n"); - printf("c | | Vars Clauses Literals | Limit Clauses Lit/Cl | Prop Confl On |\n"); - printf("c =========================================================================================\n"); - } -} - -void Solver::printRestartStat() -{ - if (verbosity >= 2) { - printf("c | %9d | %7d %8d %8d | %8d %8d %6.0f |", (int)conflicts, (int)order_heap.size(), (int)(nClauses()-nbBin), (int)clauses_literals, (int)(nbclausesbeforereduce*curRestart+nbCompensateSubsumer), (int)(nLearnts()+nbBin), (double)learnts_literals/(double)(nLearnts()+nbBin)); - } - - #ifdef USE_GAUSS - print_gauss_sum_stats(); - #else //USE_GAUSS - if (verbosity >= 2) { - printf(" |\n"); - } - #endif //USE_GAUSS -} - -void Solver::printEndSearchStat() -{ - #ifdef STATS_NEEDED - if (verbosity >= 1 && !(dynamic_behaviour_analysis && logger.statistics_on)) { - #else - if (verbosity >= 1) { - #endif //STATS_NEEDED - printf("c ===================================================================="); - #ifdef USE_GAUSS - print_gauss_sum_stats(); - if (verbosity == 1) printf("=====================\n"); - #else //USE_GAUSS - printf("\n"); - #endif //USE_GAUSS - } -} - -#ifdef DEBUG_ATTACH -void Solver::testAllClauseAttach() const -{ - for (Clause *const*it = clauses.getData(), *const*end = clauses.getDataEnd(); it != end; it++) { - const Clause& c = **it; - if (c.size() > 2) { - assert(findWatchedCl(watches[(~c[0]).toInt()], &c)); - assert(findWatchedCl(watches[(~c[1]).toInt()], &c)); - } else { - assert(findWatchedBinCl(binwatches[(~c[0]).toInt()], &c)); - assert(findWatchedBinCl(binwatches[(~c[1]).toInt()], &c)); - } - } - - for (Clause *const*it = binaryClauses.getData(), *const*end = binaryClauses.getDataEnd(); it != end; it++) { - const Clause& c = **it; - assert(c.size() == 2); - assert(findWatchedBinCl(binwatches[(~c[0]).toInt()], &c)); - assert(findWatchedBinCl(binwatches[(~c[1]).toInt()], &c)); - } - - for (XorClause *const*it = xorclauses.getData(), *const*end = xorclauses.getDataEnd(); it != end; it++) { - const XorClause& c = **it; - assert(find(xorwatches[c[0].var()], &c)); - assert(find(xorwatches[c[1].var()], &c)); - if (assigns[c[0].var()]!=l_Undef || assigns[c[1].var()]!=l_Undef) { - for (uint i = 0; i < c.size();i++) { - assert(assigns[c[i].var()] != l_Undef); - } - } - } -} - -void Solver::findAllAttach() const -{ - for (uint32_t i = 0; i < binwatches.size(); i++) { - for (uint32_t i2 = 0; i2 < binwatches[i].size(); i2++) { - assert(findClause(binwatches[i][i2].clause)); - } - } - for (uint32_t i = 0; i < watches.size(); i++) { - for (uint32_t i2 = 0; i2 < watches[i].size(); i2++) { - assert(findClause(watches[i][i2].clause)); - } - } - - for (uint32_t i = 0; i < xorwatches.size(); i++) { - for (uint32_t i2 = 0; i2 < xorwatches[i].size(); i2++) { - assert(findClause(xorwatches[i][i2])); - } - } -} - -const bool Solver::findClause(XorClause* c) const -{ - for (uint32_t i = 0; i < xorclauses.size(); i++) { - if (xorclauses[i] == c) return true; - } - return false; -} - -const bool Solver::findClause(Clause* c) const -{ - for (uint32_t i = 0; i < binaryClauses.size(); i++) { - if (binaryClauses[i] == c) return true; - } - for (uint32_t i = 0; i < clauses.size(); i++) { - if (clauses[i] == c) return true; - } - for (uint32_t i = 0; i < learnts.size(); i++) { - if (learnts[i] == c) return true; - } - vec cs = varReplacer->getClauses(); - for (uint32_t i = 0; i < cs.size(); i++) { - if (cs[i] == c) return true; - } - - return false; -} -#endif //DEBUG_ATTACH - -const bool Solver::noLearntBinaries() const -{ - for (uint32_t i = 0; i < binaryClauses.size(); i++) { - if (binaryClauses[i]->learnt()) return false; - } - - return true; -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/Solver.h b/src/vendor/stp/src/sat/cryptominisat2/Solver.h deleted file mode 100644 index 75daea63f..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Solver.h +++ /dev/null @@ -1,844 +0,0 @@ -/****************************************************************************************[Solver.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -CryptoMiniSat -- Copyright (c) 2009 Mate Soos -glucose -- Gilles Audemard, Laurent Simon (2008) - -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 SOLVER_H -#define SOLVER_H - -#include -#include -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "time_mem.h" -#include "Vec.h" -#include "Heap.h" -#include "Alg.h" -#include "MersenneTwister.h" -#include "SolverTypes.h" -#include "Clause.h" -#include "Logger.h" -#include "constants.h" -#include "BoundedQueue.h" -#include "GaussianConfig.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class Gaussian; -class MatrixFinder; -class Conglomerate; -class VarReplacer; -class XorFinder; -class FindUndef; -class ClauseCleaner; -class FailedVarSearcher; -class Subsumer; -class XorSubsumer; -class PartHandler; -class RestartTypeChooser; -class StateSaver; -class UselessBinRemover; - -#ifdef VERBOSE_DEBUG -#define DEBUG_UNCHECKEDENQUEUE_LEVEL0 -using std::cout; -using std::endl; -#endif - -//================================================================================================= -// Solver -- the main class: - -struct reduceDB_ltMiniSat -{ - bool operator () (const Clause* x, const Clause* y); -}; - -struct reduceDB_ltGlucose -{ - bool operator () (const Clause* x, const Clause* y); -}; - -//#define DEBUG_PROPAGATEFROM - -class PropagatedFrom -{ - private: - union {Clause* clause; uint32_t otherLit;}; - - public: - PropagatedFrom(Clause* c) - { - #ifdef DEBUG_PROPAGATEFROM - assert(c != NULL); - #endif - clause = c; - } - - PropagatedFrom(const Lit& _other) - { - otherLit = _other.toInt() << 1; - otherLit |= 1; - } - - PropagatedFrom() : - clause(NULL) - { - } - - const bool isBinary() const - { - return (otherLit&1); - } - - const Lit getOtherLit() const - { - #ifdef DEBUG_PROPAGATEFROM - assert(isBinary()); - #endif - return Lit::toLit(otherLit>>1); - } - - const Clause* getClause() const - { - #ifdef DEBUG_PROPAGATEFROM - assert(!isBinary()); - #endif - return clause; - } - - Clause* getClause() - { - return clause; - } - - const bool isNULL() const - { - if (isBinary()) return false; - return clause == NULL; - } - - const uint32_t size() const - { - if (isBinary()) return 2; - - #ifdef DEBUG_PROPAGATEFROM - assert(!isNULL()); - #endif - - return getClause()->size(); - } - - const Lit operator[](uint32_t i) const - { - if (isBinary()) { - #ifdef DEBUG_PROPAGATEFROM - assert(i == 1); - #endif - return getOtherLit(); - } - - #ifdef DEBUG_PROPAGATEFROM - assert(!isNULL()); - #endif - return (*getClause())[i]; - } -}; - -class Solver -{ -public: - - // Constructor/Destructor: - // - Solver(); - ~Solver(); - - // Problem specification: - // - Var newVar (bool dvar = true); // Add a new variable with parameters specifying variable mode. - template - bool addClause (T& ps, const uint group = 0, char* group_name = NULL); // Add a clause to the solver. NOTE! 'ps' may be shrunk by this method! - template - bool addXorClause (T& ps, bool xor_clause_inverted, const uint group = 0, char* group_name = NULL); // Add a xor-clause to the solver. NOTE! 'ps' may be shrunk by this method! - - // Solving: - // - lbool solve (const vec& assumps); // Search for a model that respects a given set of assumptions. - lbool solve (); // Search without assumptions. - bool okay () const; // FALSE means solver is in a conflicting state - - // Variable mode: - // - void setPolarity (Var v, bool b); // Declare which polarity the decision heuristic should use for a variable. Requires mode 'polarity_user'. - void setDecisionVar (Var v, bool b); // Declare if a variable should be eligible for selection in the decision heuristic. - void setSeed (const uint32_t seed); // Sets the seed to be the given number - void setMaxRestarts(const uint num); //sets the maximum number of restarts to given value - - // Read state: - // - lbool value (const Var& x) const; // The current value of a variable. - lbool value (const Lit& p) const; // The current value of a literal. - lbool modelValue (const Lit& p) const; // The value of a literal in the last model. The last call to solve must have been satisfiable. - uint32_t nAssigns () const; // The current number of assigned literals. - uint32_t nClauses () const; // The current number of original clauses. - uint32_t nLiterals () const; // The current number of total literals. - uint32_t nLearnts () const; // The current number of learnt clauses. - uint32_t nVars () const; // The current number of variables. - - // Extra results: (read-only member variable) - // - vec model; // If problem is satisfiable, this vector contains the model (if any). - vec conflict; // If problem is unsatisfiable (possibly under assumptions), - // this vector represent the final conflict clause expressed in the assumptions. - - // Mode of operation: - // - double random_var_freq; // The frequency with which the decision heuristic tries to choose a random variable. (default 0.02) - double clause_decay; // Inverse of the clause activity decay factor. (1 / 0.999) - int restart_first; // The initial restart limit. (default 100) - double restart_inc; // The factor with which the restart limit is multiplied in each restart. (default 1.5) - double learntsize_factor; // The intitial limit for learnt clauses is a factor of the original clauses. (default 1 / 3) - double learntsize_inc; // The limit for learnt clauses is multiplied with this factor each restart. (default 1.1) - bool expensive_ccmin; // Controls conflict clause minimization. (default TRUE) - int polarity_mode; // Controls which polarity the decision heuristic chooses. See enum below for allowed modes. (default polarity_false) - int verbosity; // Verbosity level. 0=silent, 1=some progress report (default 0) - Var restrictedPickBranch; // Pick variables to branch on preferentally from the highest [0, restrictedPickBranch]. If set to 0, preferentiality is turned off (i.e. picked randomly between [0, all]) - bool findNormalXors; // Automatically find non-binary xor-clauses and convert them - bool findBinaryXors; // Automatically find binary xor-clauses and convert them - bool regularlyFindBinaryXors; // Regularly find binary xor-clauses and convert them - bool performReplace; // Should var-replacing be performed? - bool conglomerateXors; // Conglomerate XORs - bool heuleProcess; // Process XORs according to Heule - bool schedSimplification;// Schedule simplification - bool doSubsumption; // Should try to subsume clauses - bool doXorSubsumption; // Should try to subsume xor clauses - bool doPartHandler; // Should try to subsume clauses - bool doHyperBinRes; // Should try carry out hyper-binary resolution - bool doBlockedClause; // Should try to remove blocked clauses - bool doVarElim; // Perform variable elimination - bool doSubsume1; // Perform clause contraction through resolution - bool failedVarSearch; // Should search for failed vars and doulbly propagated vars - bool addExtraBins; // Should add extra binaries in failed literal probing - bool removeUselessBins; // Should try to remove useless binary clauses - bool regularRemoveUselessBins; // Should try to remove useless binary clauses regularly - bool subsumeWithNonExistBinaries; - bool regularSubsumeWithNonExistBinaries; - bool libraryUsage; // Set true if not used as a library - friend class FindUndef; - bool greedyUnbound; //If set, then variables will be greedily unbounded (set to l_Undef) - RestartType fixRestartType; // If set, the solver will always choose the given restart strategy - GaussianConfig gaussconfig; - - - enum { polarity_true = 0, polarity_false = 1, polarity_rnd = 3, polarity_auto = 4}; - - // Statistics: (read-only member variable) - // - uint64_t starts, dynStarts, staticStarts, fullStarts, decisions, rnd_decisions, propagations, conflicts; - uint64_t clauses_literals, learnts_literals, max_literals, tot_literals; - uint64_t nbDL2, nbBin, lastNbBin, becameBinary, lastSearchForBinaryXor, nbReduceDB; - uint64_t improvedClauseNo, improvedClauseSize; - - //Logging - void needStats(); // Prepares the solver to output statistics - void needProofGraph(); // Prepares the solver to output proof graphs during solving - void setVariableName(Var var, char* name); // Sets the name of the variable 'var' to 'name'. Useful for statistics and proof logs (i.e. used by 'logger') - const vec& get_sorted_learnts(); //return the set of learned clauses, sorted according to the logic used in MiniSat to distinguish between 'good' and 'bad' clauses - const vec& get_learnts() const; //Get all learnt clauses that are >1 long - const vector get_unitary_learnts() const; //return the set of unitary learnt clauses - const uint get_unitary_learnts_num() const; //return the number of unitary learnt clauses - void dumpSortedLearnts(const char* file, const uint32_t maxSize); // Dumps all learnt clauses (including unitary ones) into the file - void needLibraryCNFFile(const char* fileName); //creates file in current directory with the filename indicated, and puts all calls from the library into the file. - - #ifdef USE_GAUSS - const uint32_t get_sum_gauss_called() const; - const uint32_t get_sum_gauss_confl() const; - const uint32_t get_sum_gauss_prop() const; - const uint32_t get_sum_gauss_unit_truths() const; - #endif //USE_GAUSS - - //Printing statistics - const uint32_t getNumElimSubsume() const; // Get variable elimination stats from Subsumer - const uint32_t getNumElimXorSubsume() const; // Get variable elimination stats from XorSubsumer - const uint32_t getNumXorTrees() const; // Get the number of trees built from 2-long XOR-s. This is effectively the number of variables that replace other variables - const uint32_t getNumXorTreesCrownSize() const; // Get the number of variables being replaced by other variables - const double getTotalTimeSubsumer() const; - const double getTotalTimeXorSubsumer() const; - -protected: - #ifdef USE_GAUSS - void print_gauss_sum_stats(); - void clearGaussMatrixes(); - vector gauss_matrixes; - - //stats - uint32_t sum_gauss_called; - uint32_t sum_gauss_confl; - uint32_t sum_gauss_prop; - uint32_t sum_gauss_unit_truths; - friend class Gaussian; - #endif //USE_GAUSS - - template - Clause* addClauseInt(T& ps, uint group); - template - XorClause* addXorClauseInt(T& ps, bool xor_clause_inverted, const uint32_t group); - template - bool addLearntClause(T& ps, const uint group, const uint32_t activity); - template - void removeWatchedCl(vec &ws, const ClauseOffset c); - template - bool findWatchedCl(const vec& ws, const ClauseOffset c) const; - template - void removeWatchedBinCl(vec &ws, const Lit impliedLit); - template - void removeWatchedBinClAll(vec &ws, const Lit impliedLit); - template - bool findWatchedBinCl(const vec& ws, const Lit impliedLit) const; - - // Helper structures: - // - struct VarOrderLt { - const vec& activity; - bool operator () (Var x, Var y) const { - return activity[x] > activity[y]; - } - VarOrderLt(const vec& act) : activity(act) { } - }; - - friend class VarFilter; - struct VarFilter { - const Solver& s; - VarFilter(const Solver& _s) : s(_s) {} - bool operator()(Var v) const { - return s.assigns[v].isUndef() && s.decision_var[v]; - } - }; - - // Solver state: - // - bool ok; // If FALSE, the constraints are already unsatisfiable. No part of the solver state may be used! - ClauseAllocator clauseAllocator; - vec clauses; // List of problem clauses. - vec binaryClauses; // Binary clauses are regularly moved here - vec xorclauses; // List of problem xor-clauses. Will be freed - vec learnts; // List of learnt clauses. - vec freeLater; // xor clauses that need to be freed later due to Gauss - vec activity; // A heuristic measurement of the activity of a variable. - uint32_t var_inc; // Amount to bump next variable with. - double cla_inc; // Amount to bump learnt clause oldActivity with - vec > watches; // 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true). - vec > xorwatches; // 'xorwatches[var]' is a list of constraints watching var in XOR clauses. - vec > binwatches; - vec assigns; // The current assignments - vector polarity; // The preferred polarity of each variable. - #ifdef USE_OLD_POLARITIES - vector oldPolarity; // The polarity before the last setting. Good for unsetting polairties that have been changed since the last conflict - #endif //USE_OLD_POLARITIES - vector decision_var; // Declares if a variable is eligible for selection in the decision heuristic. - vec trail; // Assignment stack; stores all assigments made in the order they were made. - vec trail_lim; // Separator indices for different decision levels in 'trail'. - vec reason; // 'reason[var]' is the clause that implied the variables current value, or 'NULL' if none. - vec level; // 'level[var]' contains the level at which the assignment was made. - uint64_t curRestart; - uint32_t nbclausesbeforereduce; - uint32_t nbCompensateSubsumer; // Number of learnt clauses that subsumed normal clauses last time subs. was executed - uint32_t qhead; // Head of queue (as index into the trail -- no more explicit propagation queue in MiniSat). - Lit failBinLit; - uint32_t simpDB_assigns; // Number of top-level assignments since last execution of 'simplify()'. - int64_t simpDB_props; // Remaining number of propagations that must be made before next execution of 'simplify()'. - vec assumptions; // Current set of assumptions provided to solve by the user. - Heap order_heap; // A priority queue of variables ordered with respect to the variable activity. - double progress_estimate;// Set by 'search()'. - bool remove_satisfied; // Indicates whether possibly inefficient linear scan for satisfied clauses should be performed in 'simplify'. - bqueue nbDecisionLevelHistory; // Set of last decision level in conflict clauses - double totalSumOfDecisionLevel; - uint64_t conflictsAtLastSolve; - #ifdef RANDOM_LOOKAROUND_SEARCHSPACE - bqueue avgBranchDepth; // Avg branch depth - #endif //RANDOM_LOOKAROUND_SEARCHSPACE - MTRand mtrand; // random number generaton - RestartType restartType; // Used internally to determine which restart strategy to choose - RestartType lastSelectedRestartType; //the last selected restart type - friend class Logger; - #ifdef STATS_NEEDED - Logger logger; // dynamic logging, statistics - bool dynamic_behaviour_analysis; // Is logger running? - #endif - uint maxRestarts; // More than this number of restarts will not be performed - - // Temporaries (to reduce allocation overhead). Each variable is prefixed by the method in which it is - // used, exept 'seen' wich is used in several places. - // - vector seen; - vec analyze_stack; - vec analyze_toclear; - vec add_tmp; - - - uint64_t MYFLAG; - template - const uint32_t calcNBLevels(const T& ps); - vec permDiff; // LS: permDiff[var] contains the current conflict number... Used to count the number of different decision level variables in learnt clause - #ifdef UPDATEVARACTIVITY - vec lastDecisionLevel; - #endif - - //Logging - uint learnt_clause_group; //the group number of learnt clauses. Incremented at each added learnt clause - FILE *libraryCNFFile; //The file that all calls from the library are logged - - // Main internal methods: - // - const bool simplify (); // Removes already satisfied clauses. - //int nbPropagated (int level); - void insertVarOrder (Var x); // Insert a variable in the decision order priority queue. - Lit pickBranchLit (); // Return the next decision variable. - void newDecisionLevel (); // Begins a new decision level. - void uncheckedEnqueue (const Lit p, const PropagatedFrom& from = PropagatedFrom()); // Enqueue a literal. Assumes value of literal is undefined. - void uncheckedEnqueueLight (const Lit p); - bool enqueue (Lit p, PropagatedFrom from = PropagatedFrom()); // Test if fact 'p' contradicts current state, enqueue otherwise. - PropagatedFrom propagate (const bool update = true); // Perform unit propagation. Returns possibly conflicting clause. - PropagatedFrom propagateBin(); - PropagatedFrom propagateBinNoLearnts(); - template - PropagatedFrom propagateBinExcept(const Lit& exceptLit); - template - PropagatedFrom propagateBinOneLevel(); - PropagatedFrom propagate_xors (const Lit& p); - void cancelUntil (int level); // Backtrack until a certain level. - Clause* analyze (PropagatedFrom confl, vec& out_learnt, int& out_btlevel, uint32_t &nblevels, const bool update); // (bt = backtrack) - void analyzeFinal (Lit p, vec& out_conflict); // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION? - bool litRedundant (Lit p, uint32_t abstract_levels); // (helper method for 'analyze()') - lbool search (int nof_conflicts, int nof_conflicts_fullrestart, const bool update = true); // Search for a given number of conflicts. - void reduceDB (); // Reduce the set of learnt clauses. - llbool handle_conflict (vec& learnt_clause, PropagatedFrom confl, int& conflictC, const bool update);// Handles the conflict clause - llbool new_decision (const int& nof_conflicts, const int& nof_conflicts_fullrestart, int& conflictC); // Handles the case when all propagations have been made, and now a decision must be made - - // Maintaining Variable/Clause activity: - // - void claBumpActivity (Clause& c); - void varDecayActivity (); // Decay all variables with the specified factor. Implemented by increasing the 'bump' value instead. - void varBumpActivity (Var v); // Increase a variable with the current 'bump' value. - void claDecayActivity (); // Decay all clauses with the specified factor. Implemented by increasing the 'bump' value instead. - - // Operations on clauses: - // - void attachClause (XorClause& c); - void attachClause (Clause& c); // Attach a clause to watcher lists. - void detachClause (const XorClause& c); - void detachClause (const Clause& c); // Detach a clause to watcher lists. - void detachModifiedClause(const Lit lit1, const Lit lit2, const uint size, const Clause* address); - void detachModifiedClause(const Var var1, const Var var2, const uint origSize, const XorClause* address); - template - void removeClause(T& c); // Detach and free a clause. - bool locked (const Clause& c) const; // Returns TRUE if a clause is a reason for some implication in the current state. - //void reverse_binary_clause(Clause& c) const; // Binary clauses --- the first Lit has to be true - void testAllClauseAttach() const; - void findAllAttach() const; - const bool findClause(XorClause* c) const; - const bool findClause(Clause* c) const; - - // Misc: - // - uint32_t decisionLevel () const; // Gives the current decisionlevel. - uint32_t abstractLevel (const Var& x) const; // Used to represent an abstraction of sets of decision levels. - - //Xor-finding related stuff - friend class XorFinder; - friend class Conglomerate; - friend class MatrixFinder; - friend class PartFinder; - friend class VarReplacer; - friend class ClauseCleaner; - friend class RestartTypeChooser; - friend class FailedVarSearcher; - friend class Subsumer; - friend class XorSubsumer; - friend class PartHandler; - friend class StateSaver; - friend class UselessBinRemover; - friend class OnlyNonLearntBins; - friend class ClauseAllocator; - Conglomerate* conglomerate; - VarReplacer* varReplacer; - ClauseCleaner* clauseCleaner; - FailedVarSearcher* failedVarSearcher; - PartHandler* partHandler; - Subsumer* subsumer; - XorSubsumer* xorSubsumer; - RestartTypeChooser* restartTypeChooser; - MatrixFinder* matrixFinder; - const bool chooseRestartType(const uint& lastFullRestart); - void setDefaultRestartType(); - const bool checkFullRestart(int& nof_conflicts, int& nof_conflicts_fullrestart, uint& lastFullRestart); - void performStepsBeforeSolve(); - const lbool simplifyProblem(const uint32_t numConfls); - bool simplifying; - - // Debug & etc: - void printLit (const Lit l) const; - void verifyModel (); - bool verifyClauses (const vec& cs) const; - bool verifyXorClauses (const vec& cs) const; - void checkSolution(); - void checkLiteralCount(); - void printStatHeader () const; - void printRestartStat (); - void printEndSearchStat(); - double progressEstimate () const; // DELETE THIS ?? IT'S NOT VERY USEFUL ... - const bool noLearntBinaries() const; - - // Polarity chooser - void calculateDefaultPolarities(); //Calculates the default polarity for each var, and fills defaultPolarities[] with it - bool defaultPolarity(); //if polarity_mode is not polarity_auto, this returns the default polarity of the variable - void tallyVotes(const vec& cs, vector& votes) const; - void tallyVotes(const vec& cs, vector& votes) const; -}; - - -//================================================================================================= -// Implementation of inline methods: - - -inline void Solver::insertVarOrder(Var x) -{ - if (!order_heap.inHeap(x) && decision_var[x]) order_heap.insert(x); -} - -inline void Solver::varDecayActivity() -{ - var_inc *= 11; - var_inc /= 10; -} -inline void Solver::varBumpActivity(Var v) -{ - if ( (activity[v] += var_inc) > (0x1U) << 24 ) { - //printf("RESCALE!!!!!!\n"); - //std::cout << "var_inc: " << var_inc << std::endl; - // Rescale: - for (Var var = 0; var != nVars(); var++) { - activity[var] >>= 14; - } - var_inc >>= 14; - //var_inc = 1; - //std::cout << "var_inc: " << var_inc << std::endl; - - /*Heap copy_order_heap2(order_heap); - while(!copy_order_heap2.empty()) { - Var v = copy_order_heap2.getmin(); - if (decision_var[v]) - std::cout << "var_" << v+1 << " act: " << activity[v] << std::endl; - }*/ - } - - // Update order_heap with respect to new activity: - if (order_heap.inHeap(v)) - order_heap.decrease(v); -} - -inline void Solver::claBumpActivity (Clause& c) -{ - if ( (c.oldActivity() += cla_inc) > 1e20 ) { - // Rescale: - for (uint32_t i = 0; i < learnts.size(); i++) - learnts[i]->oldActivity() *= 1e-17; - cla_inc *= 1e-20; - } -} - -inline void Solver::claDecayActivity() -{ - //cla_inc *= clause_decay; -} - -inline bool Solver::enqueue (Lit p, PropagatedFrom from) -{ - return value(p) != l_Undef ? value(p) != l_False : (uncheckedEnqueue(p, from), true); -} -inline bool Solver::locked (const Clause& c) const -{ - if (c.size() == 2) return true; //we don't know in this case :I - PropagatedFrom from(reason[c[0].var()]); - return !from.isBinary() && from.getClause() == &c && value(c[0]) == l_True; -} -inline void Solver::newDecisionLevel() -{ - trail_lim.push(trail.size()); - #ifdef VERBOSE_DEBUG - cout << "New decision level: " << trail_lim.size() << endl; - #endif -} -/*inline int Solver::nbPropagated(int level) { - if (level == decisionLevel()) - return trail.size() - trail_lim[level-1] - 1; - return trail_lim[level] - trail_lim[level-1] - 1; -}*/ -inline uint32_t Solver::decisionLevel () const -{ - return trail_lim.size(); -} -inline uint32_t Solver::abstractLevel (const Var& x) const -{ - return 1 << (level[x] & 31); -} -inline lbool Solver::value (const Var& x) const -{ - return assigns[x]; -} -inline lbool Solver::value (const Lit& p) const -{ - return assigns[p.var()] ^ p.sign(); -} -inline lbool Solver::modelValue (const Lit& p) const -{ - return model[p.var()] ^ p.sign(); -} -inline uint32_t Solver::nAssigns () const -{ - return trail.size(); -} -inline uint32_t Solver::nClauses () const -{ - return clauses.size() + xorclauses.size()+binaryClauses.size(); -} -inline uint32_t Solver::nLiterals () const -{ - return clauses_literals + learnts_literals; -} -inline uint32_t Solver::nLearnts () const -{ - return learnts.size(); -} -inline uint32_t Solver::nVars () const -{ - return assigns.size(); -} -inline void Solver::setPolarity (Var v, bool b) -{ - polarity [v] = (char)b; -} -inline void Solver::setDecisionVar(Var v, bool b) -{ - decision_var[v] = b; - if (b) { - insertVarOrder(v); - } -} -inline lbool Solver::solve () -{ - vec tmp; - return solve(tmp); -} -inline bool Solver::okay () const -{ - return ok; -} -inline void Solver::setSeed (const uint32_t seed) -{ - mtrand.seed(seed); // Set seed of the variable-selection and clause-permutation(if applicable) -} -#ifdef STATS_NEEDED -inline void Solver::needStats() -{ - dynamic_behaviour_analysis = true; // Sets the solver and the logger up to generate statistics - logger.statistics_on = true; -} -inline void Solver::needProofGraph() -{ - dynamic_behaviour_analysis = true; // Sets the solver and the logger up to generate proof graphs during solving - logger.proof_graph_on = true; -} -inline void Solver::setVariableName(Var var, char* name) -{ - while (var >= nVars()) newVar(); - if (dynamic_behaviour_analysis) - logger.set_variable_name(var, name); -} // Sets the varible 'var'-s name to 'name' in the logger -#else -inline void Solver::setVariableName(Var var, char* name) -{} -#endif - -#ifdef USE_GAUSS -inline const uint32_t Solver::get_sum_gauss_unit_truths() const -{ - return sum_gauss_unit_truths; -} - -inline const uint32_t Solver::get_sum_gauss_called() const -{ - return sum_gauss_called; -} - -inline const uint32_t Solver::get_sum_gauss_confl() const -{ - return sum_gauss_confl; -} - -inline const uint32_t Solver::get_sum_gauss_prop() const -{ - return sum_gauss_prop; -} -#endif - -inline const uint Solver::get_unitary_learnts_num() const -{ - if (decisionLevel() > 0) - return trail_lim[0]; - else - return trail.size(); -} -template -inline void Solver::removeWatchedCl(vec &ws, const ClauseOffset c) { - uint32_t j = 0; - for (; j < ws.size() && ws[j].clause != c; j++); - assert(j < ws.size()); - for (; j < ws.size()-1; j++) ws[j] = ws[j+1]; - ws.pop(); -} -template -inline void Solver::removeWatchedBinCl(vec &ws, const Lit impliedLit) { - uint32_t j = 0; - for (; j < ws.size() && ws[j].impliedLit != impliedLit; j++); - assert(j < ws.size()); - for (; j < ws.size()-1; j++) ws[j] = ws[j+1]; - ws.pop(); -} -template -inline void Solver::removeWatchedBinClAll(vec &ws, const Lit impliedLit) { - T *i = ws.getData(); - T *j = i; - for (T* end = ws.getDataEnd(); i != end; i++) { - if (i->impliedLit != impliedLit) - *j++ = *i; - } - ws.shrink(i-j); -} -template -inline bool Solver::findWatchedCl(const vec& ws, const ClauseOffset c) const -{ - uint32_t j = 0; - for (; j < ws.size() && ws[j].clause != c; j++); - return j < ws.size(); -} -template -inline bool Solver::findWatchedBinCl(const vec& ws, const Lit impliedLit) const -{ - uint32_t j = 0; - for (; j < ws.size() && ws[j].impliedLit != impliedLit; j++); - return j < ws.size(); -} - -/* -inline void Solver::reverse_binary_clause(Clause& c) const { - if (c.size() == 2 && value(c[0]) == l_False) { - assert(value(c[1]) == l_True); - std::swap(c[0], c[1]); - } -} -*/ - -/*inline void Solver::calculate_xor_clause(Clause& c2) const { - if (c2.isXor() && ((XorClause*)&c2)->updateNeeded()) { - XorClause& c = *((XorClause*)&c2); - bool final = c.xor_clause_inverted(); - for (int k = 0, size = c.size(); k != size; k++ ) { - const lbool& val = assigns[c[k].var()]; - assert(val != l_Undef); - - c[k] = c[k].unsign() ^ val.getBool(); - final ^= val.getBool(); - } - if (final) - c[0] = c[0].unsign() ^ !assigns[c[0].var()].getBool(); - - c.setUpdateNeeded(false); - } -}*/ - -template -inline void Solver::removeClause(T& c) -{ - detachClause(c); - clauseAllocator.clauseFree(&c); -} - -//================================================================================================= -// Debug + etc: - -static inline void logLit(FILE* f, Lit l) -{ - fprintf(f, "%sx%d", l.sign() ? "~" : "", l.var()+1); -} - -static inline void logLits(FILE* f, const vec& ls) -{ - fprintf(f, "[ "); - if (ls.size() > 0) { - logLit(f, ls[0]); - for (uint32_t i = 1; i < ls.size(); i++) { - fprintf(f, ", "); - logLit(f, ls[i]); - } - } - fprintf(f, "] "); -} - -static inline const char* showBool(bool b) -{ - return b ? "true" : "false"; -} - - -// Just like 'assert()' but expression will be evaluated in the release version as well. -static inline void check(bool expr) -{ - assert(expr); -} - -#ifndef DEBUG_ATTACH -inline void Solver::testAllClauseAttach() const -{ - return; -} -inline void Solver::findAllAttach() const -{ - return; -} -#endif //DEBUG_ATTACH - -inline void Solver::uncheckedEnqueueLight(const Lit p) -{ - assigns [p.var()] = boolToLBool(!p.sign());//lbool(!sign(p)); // <<== abstract but not uttermost effecient - trail.push(p); -} - -//================================================================================================= - -}; //NAMESPACE MINISAT - -#endif //SOLVER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/SolverTypes.h b/src/vendor/stp/src/sat/cryptominisat2/SolverTypes.h deleted file mode 100644 index 6f38ed593..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/SolverTypes.h +++ /dev/null @@ -1,189 +0,0 @@ -/***********************************************************************************[SolverTypes.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -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 SOLVERTYPES_H -#define SOLVERTYPES_H - -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Alg.h" -#include - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// Variables, literals, lifted booleans, clauses: - - -// NOTE! Variables are just integers. No abstraction here. They should be chosen from 0..N, -// so that they can be used as array indices. - -typedef uint32_t Var; -#define var_Undef (0xffffffffU >>1) -enum RestartType {dynamic_restart, static_restart, auto_restart}; - -class Lit -{ - uint32_t x; - explicit Lit(uint32_t i) : x(i) { }; -public: - Lit() : x(2*var_Undef) {} // (lit_Undef) - explicit Lit(Var var, bool sign) : x((var+var) + (int)sign) { } - - const uint32_t& toInt() const { // Guarantees small, positive integers suitable for array indexing. - return x; - } - Lit operator~() const { - return Lit(x ^ 1); - } - Lit operator^(const bool b) const { - return Lit(x ^ (uint32_t)b); - } - Lit& operator^=(const bool b) { - x ^= (uint32_t)b; - return *this; - } - bool sign() const { - return x & 1; - } - Var var() const { - return x >> 1; - } - Lit unsign() const { - return Lit(x & ~1); - } - bool operator==(const Lit& p) const { - return x == p.x; - } - bool operator!= (const Lit& p) const { - return x != p.x; - } - bool operator < (const Lit& p) const { - return x < p.x; // '<' guarantees that p, ~p are adjacent in the ordering. - } - inline void print(FILE* outfile = stdout) const - { - fprintf(outfile,"%s%d", sign() ? "-" : "", var()+1); - } - inline void printFull(FILE* outfile = stdout) const - { - fprintf(outfile,"%s%d 0\n", sign() ? "-" : "", var()+1); - } - static Lit toLit(uint32_t data) - { - return Lit(data); - } -}; - -const Lit lit_Undef(var_Undef, false); // Useful special constants. -const Lit lit_Error(var_Undef, true ); // - -//================================================================================================= -// Lifted booleans: - -class llbool; - -class lbool -{ - char value; - explicit lbool(char v) : value(v) { } - -public: - lbool() : value(0) { }; - inline char getchar() const { - return value; - } - inline lbool(llbool b); - - inline const bool isUndef() const { - return !value; - } - inline const bool isDef() const { - return value; - } - inline const bool getBool() const { - return value == 1; - } - inline const bool operator==(lbool b) const { - return value == b.value; - } - inline const bool operator!=(lbool b) const { - return value != b.value; - } - lbool operator^(const bool b) const { - return b ? lbool(-value) : lbool(value); - } - //lbool operator ^ (const bool b) const { return b ? lbool(-value) : lbool(value); } - - friend lbool toLbool(const char v); - friend lbool boolToLBool(const bool b); - friend class llbool; -}; -inline lbool toLbool(const char v) -{ - return lbool(v); -} -inline lbool boolToLBool(const bool b) -{ - return lbool(2*b-1); -} - -const lbool l_True = toLbool( 1); -const lbool l_False = toLbool(-1); -const lbool l_Undef = toLbool( 0); - - -class llbool -{ - char value; - -public: - llbool(): value(0) {}; - llbool(lbool v) : - value(v.value) {}; - llbool(char a) : - value(a) {} - - inline const bool operator!=(const llbool& v) const { - return (v.value != value); - } - - inline const bool operator==(const llbool& v) const { - return (v.value == value); - } - - friend class lbool; -}; -const llbool l_Nothing = toLbool(2); -const llbool l_Continue = toLbool(3); - -lbool::lbool(llbool b) : value(b.value) {}; - -}; //NAMESPACE MINISAT - -#endif //SOLVERTYPES_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/StateSaver.cpp b/src/vendor/stp/src/sat/cryptominisat2/StateSaver.cpp deleted file mode 100644 index ceb5eab7d..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/StateSaver.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "StateSaver.h" - -namespace MINISAT -{ -using namespace MINISAT; - -StateSaver::StateSaver(Solver& _solver) : - solver(_solver) - , backup_order_heap(Solver::VarOrderLt(solver.activity)) -{ - //Saving Solver state - backup_var_inc = solver.var_inc; - backup_activity.growTo(solver.activity.size()); - std::copy(solver.activity.getData(), solver.activity.getDataEnd(), backup_activity.getData()); - backup_order_heap = solver.order_heap; - backup_polarities = solver.polarity; - backup_restartType = solver.restartType; - backup_random_var_freq = solver.random_var_freq; - backup_propagations = solver.propagations; -} - -void StateSaver::restore() -{ - //Restore Solver state - solver.var_inc = backup_var_inc; - std::copy(backup_activity.getData(), backup_activity.getDataEnd(), solver.activity.getData()); - solver.order_heap = backup_order_heap; - solver.polarity = backup_polarities; - solver.restartType = backup_restartType; - solver.random_var_freq = backup_random_var_freq; - - //Finally, clear the order_heap from variables set/non-decisionned - solver.order_heap.filter(Solver::VarFilter(solver)); - solver.propagations = backup_propagations; -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/StateSaver.h b/src/vendor/stp/src/sat/cryptominisat2/StateSaver.h deleted file mode 100644 index 7d1f1c377..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/StateSaver.h +++ /dev/null @@ -1,46 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef STATESAVER__H -#define STATESAVER__H - -#include "Solver.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class StateSaver -{ - public: - StateSaver(Solver& _solver); - void restore(); - - private: - Solver& solver; - Heap backup_order_heap; - vector backup_polarities; - vec backup_activity; - uint32_t backup_var_inc; - RestartType backup_restartType; - uint32_t backup_random_var_freq; - uint64_t backup_propagations; -}; - -}; //NAMESPACE MINISAT - -#endif //STATESAVER__H diff --git a/src/vendor/stp/src/sat/cryptominisat2/Subsumer.cpp b/src/vendor/stp/src/sat/cryptominisat2/Subsumer.cpp deleted file mode 100644 index 149e57971..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Subsumer.cpp +++ /dev/null @@ -1,1889 +0,0 @@ -/************************************************************************************************** -Originally From: Solver.C -- (C) Niklas Een, Niklas Sorensson, 2004 -Substantially modified by: Mate Soos (2010) -**************************************************************************************************/ - -#include "Solver.h" -#include "Subsumer.h" -#include "ClauseCleaner.h" -#include "time_mem.h" -#include "assert.h" -#include -#include -#include -#include "VarReplacer.h" -#include "XorFinder.h" -#include "OnlyNonLearntBins.h" - -#ifdef _MSC_VER -#define __builtin_prefetch(a,b,c) -#endif //_MSC_VER - -//#define VERBOSE_DEBUG -#ifdef VERBOSE_DEBUG -#define BIT_MORE_VERBOSITY -#endif - -//#define BIT_MORE_VERBOSITY -//#define TOUCH_LESS - -#ifdef VERBOSE_DEBUG -using std::cout; -using std::endl; -#endif //VERBOSE_DEBUG - -namespace MINISAT -{ -using namespace MINISAT; - -Subsumer::Subsumer(Solver& s): - solver(s) - , totalTime(0.0) - , numElimed(0) - , numCalls(0) -{ -}; - -Subsumer::~Subsumer() -{ -} - -void Subsumer::extendModel(Solver& solver2) -{ - assert(checkElimedUnassigned()); - vec tmp; - typedef map > elimType; - for (elimType::iterator it = elimedOutVar.begin(), end = elimedOutVar.end(); it != end; it++) { - #ifndef NDEBUG - Var var = it->first; - #ifdef VERBOSE_DEBUG - std::cout << "Reinserting elimed var: " << var+1 << std::endl; - #endif - assert(!solver.decision_var[var]); - assert(solver.assigns[var] == l_Undef); - assert(!solver.order_heap.inHeap(var)); - #endif - - for (vector::iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; it2++) { - Clause& c = **it2; - tmp.clear(); - tmp.growTo(c.size()); - std::copy(c.getData(), c.getDataEnd(), tmp.getData()); - - #ifdef VERBOSE_DEBUG - std::cout << "Reinserting Clause: "; - c.plainPrint(); - #endif - - solver2.addClause(tmp); - assert(solver2.ok); - } - } -} - -const bool Subsumer::unEliminate(const Var var) -{ - assert(var_elimed[var]); - vec tmp; - typedef map > elimType; - elimType::iterator it = elimedOutVar.find(var); - - //it MUST have been decision var, otherwise we would - //never have removed it - solver.setDecisionVar(var, true); - var_elimed[var] = false; - numElimed--; - - //If the variable was removed because of - //pure literal removal (by blocked clause - //elimination, there are no clauses to re-insert - if (it == elimedOutVar.end()) return solver.ok; - - FILE* backup_libraryCNFfile = solver.libraryCNFFile; - solver.libraryCNFFile = NULL; - for (vector::iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; it2++) { - solver.addClause(**it2); - solver.clauseAllocator.clauseFree(*it2); - } - solver.libraryCNFFile = backup_libraryCNFfile; - elimedOutVar.erase(it); - - return solver.ok; -} - -bool selfSubset(uint32_t A, uint32_t B) -{ - uint32_t B_tmp = B | ((B & 0xAAAAAAAALL) >> 1) | ((B & 0x55555555LL) << 1); - if ((A & ~B_tmp) == 0){ - uint32_t C = A & ~B; - return (C & (C-1)) == 0; - }else - return false; -} - -// Assumes 'seen' is cleared (will leave it cleared) -bool selfSubset(Clause& A, Clause& B, vec& seen) -{ - for (uint32_t i = 0; i < B.size(); i++) - seen[B[i].toInt()] = 1; - - bool flip = false; - for (uint32_t i = 0; i < A.size(); i++) { - if (!seen[A[i].toInt()]) { - if (flip == true || !seen[(~A[i]).toInt()]) { - for (uint32_t i = 0; i < B.size(); i++) seen[B[i].toInt()] = 0; - return false; - } - flip = true; - } - } - for (uint32_t i = 0; i < B.size(); i++) - seen[B[i].toInt()] = 0; - return flip; -} - -template <> -inline uint32_t Subsumer::subsume0(Clause& ps, uint32_t abs) -{ - ps.subsume0Finished(); - ps.unsetVarChanged(); - #ifdef VERBOSE_DEBUG - cout << "subsume0 orig clause: "; - ps.plainPrint(); - #endif - return subsume0Orig(ps, abs); -} - -template -inline uint32_t Subsumer::subsume0(T& ps, uint32_t abs) -{ - #ifdef VERBOSE_DEBUG - cout << "subsume0 orig vec: "; - ps[0].print(); std::cout << " "; - ps[1].printFull(); - #endif - return subsume0Orig(ps, abs); -} - -// Will put NULL in 'cs' if clause removed. -template -uint32_t Subsumer::subsume0Orig(const T& ps, uint32_t abs) -{ - subsumedNonLearnt = false; - uint32_t retIndex = std::numeric_limits::max(); - vec subs; - findSubsumed(ps, abs, subs); - for (uint32_t i = 0; i < subs.size(); i++){ - clauses_subsumed++; - #ifdef VERBOSE_DEBUG - cout << "-> subsume0 removing:"; - subs[i].clause->plainPrint(); - #endif - - Clause* tmp = subs[i].clause; - subsumedNonLearnt |= !tmp->learnt(); - retIndex = subs[i].index; - unlinkClause(subs[i]); - solver.clauseAllocator.clauseFree(tmp); - } - - return retIndex; -} - -void Subsumer::subsume0BIN(const Lit lit1, const vec& lits) -{ - vec subs; - vec subs2; - vec subs2Lit; - - vec& cs = occur[lit1.toInt()]; - for (ClauseSimp *it = cs.getData(), *end = it + cs.size(); it != end; it++){ - if (it+1 != end) - __builtin_prefetch((it+1)->clause, 0, 1); - if (it->clause == NULL) continue; - Clause& c = *it->clause; - bool removed = false; - for (uint32_t i = 0; i < c.size(); i++) { - if (lits[c[i].toInt()]) { - subs.push(*it); - removed = true; - break; - } - } - if (!removed) { - for (uint32_t i = 0; i < c.size(); i++) { - if (lits[(~c[i]).toInt()]) { - subs2.push(*it); - subs2Lit.push(c[i]); - break; - } - } - } - } - - for (uint32_t i = 0; i < subs.size(); i++){ - clauses_subsumed++; - #ifdef VERBOSE_DEBUG - cout << "-> subsume0 removing:"; - subs[i].clause->plainPrint(); - #endif - - Clause* tmp = subs[i].clause; - unlinkClause(subs[i]); - solver.clauseAllocator.clauseFree(tmp); - } - - if (subs2.size() == 0) return; - registerIteration(subs2); - for (uint32_t j = 0; j < subs2.size(); j++){ - if (subs2[j].clause == NULL) continue; - ClauseSimp c = subs2[j]; - Clause& cl = *c.clause; - #ifdef VERBOSE_DEBUG - cout << "-> Strenghtening clause :"; - cl.plainPrint(); - #endif - unlinkClause(c); - - literals_removed++; - cl.strengthen(subs2Lit[j]); - Lit *a, *b, *end; - for (a = b = cl.getData(), end = a + cl.size(); a != end; a++) { - lbool val = solver.value(*a); - if (val == l_Undef) - *b++ = *a; - - if (val == l_True) { - #ifdef VERBOSE_DEBUG - std::cout << "--> Clause was satisfied." << std::endl; - #endif - solver.clauseAllocator.clauseFree(&cl); - goto endS; - } - } - cl.shrink(a-b); - cl.setStrenghtened(); - - #ifdef VERBOSE_DEBUG - cout << "--> Strenghtened clause:"; - cl.plainPrint(); - #endif - - if (cl.size() == 0) { - solver.ok = false; - unregisterIteration(subs2); - solver.clauseAllocator.clauseFree(&cl); - return; - } - if (cl.size() > 2) { - cl.calcAbstractionClause(); - linkInAlreadyClause(c); - clauses[c.index] = c; - solver.attachClause(cl); - updateClause(c); - } else if (cl.size() == 2) { - cl.calcAbstractionClause(); - solver.attachClause(cl); - solver.becameBinary++; - addBinaryClauses.push(&cl); - //updateClause(c); - } else { - assert(cl.size() == 1); - solver.uncheckedEnqueue(cl[0]); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - unregisterIteration(subs2); - return; - } - #ifdef VERBOSE_DEBUG - cout << "--> Found that var " << cl[0].var()+1 << " must be " << std::boolalpha << !cl[0].sign() << endl; - #endif - solver.clauseAllocator.clauseFree(&cl); - } - endS:; - } - unregisterIteration(subs2); -} - -void Subsumer::unlinkClause(ClauseSimp c, Var elim) -{ - Clause& cl = *c.clause; - - if (elim != var_Undef) { - assert(!cl.learnt()); - #ifdef VERBOSE_DEBUG - std::cout << "Eliminating clause: "; c.clause->plainPrint(); - std::cout << "On variable: " << elim+1 << std::endl; - #endif //VERBOSE_DEBUG - elimedOutVar[elim].push_back(c.clause); - } - - for (uint32_t i = 0; i < cl.size(); i++) { - maybeRemove(occur[cl[i].toInt()], &cl); - #ifndef TOUCH_LESS - touch(cl[i]); - #endif - } - - solver.detachClause(cl); - - // Remove from iterator vectors/sets: - for (uint32_t i = 0; i < iter_vecs.size(); i++) { - vec& cs = *iter_vecs[i]; - for (uint32_t j = 0; j < cs.size(); j++) - if (cs[j].clause == &cl) - cs[j].clause = NULL; - } - for (uint32_t i = 0; i < iter_sets.size(); i++) { - CSet& cs = *iter_sets[i]; - cs.exclude(c); - } - - // Remove clause from clause touched set: - cl_touched.exclude(c); - cl_added.exclude(c); - - clauses[c.index].clause = NULL; -} - -void Subsumer::unlinkModifiedClause(vec& origClause, ClauseSimp c, bool detachAndNull) -{ - for (uint32_t i = 0; i < origClause.size(); i++) { - maybeRemove(occur[origClause[i].toInt()], c.clause); - #ifndef TOUCH_LESS - touch(origClause[i]); - #endif - } - - // Remove from iterator vectors/sets: - for (uint32_t i = 0; i < iter_vecs.size(); i++){ - vec& cs = *iter_vecs[i]; - for (uint32_t j = 0; j < cs.size(); j++) - if (cs[j].clause == c.clause) - cs[j].clause = NULL; - } - for (uint32_t i = 0; i < iter_sets.size(); i++){ - CSet& cs = *iter_sets[i]; - cs.exclude(c); - } - - // Remove clause from clause touched set: - cl_touched.exclude(c); - cl_added.exclude(c); - - if (detachAndNull) { - solver.detachModifiedClause(origClause[0], origClause[1], origClause.size(), c.clause); - clauses[c.index].clause = NULL; - } -} - -void Subsumer::subsume1(ClauseSimp& ps) -{ - vec Q; - vec subs; - vec qs; - uint32_t q; - - ps.clause->unsetStrenghtened(); - registerIteration(Q); - registerIteration(subs); - - Q.push(ps); - q = 0; - while (q < Q.size()){ - if (Q[q].clause == NULL) { q++; continue; } - #ifdef VERBOSE_DEBUG - cout << "subsume1 with clause:"; - Q[q].clause->plainPrint(); - #endif - - qs.clear(); - for (uint32_t i = 0; i < Q[q].clause->size(); i++) - qs.push((*Q[q].clause)[i]); - - for (uint32_t i = 0; i < qs.size(); i++){ - qs[i] = ~qs[i]; - - uint32_t abst = calcAbstraction(qs); - - findSubsumed(qs, abst, subs); - for (uint32_t j = 0; j < subs.size(); j++){ - /*#ifndef NDEBUG - if (&counter != NULL && counter == -1){ - dump(*subs[j].clause); - qs[i] = ~qs[i]; - dump(qs); - printf(L_LIT"\n", L_lit(qs[i])); - exit(0); - } - #endif*/ - if (subs[j].clause == NULL) continue; - ClauseSimp c = subs[j]; - Clause& cl = *c.clause; - #ifdef VERBOSE_DEBUG - cout << "-> Strenghtening clause :"; - cl.plainPrint(); - #endif - unlinkClause(c); - - literals_removed++; - cl.strengthen(qs[i]); - Lit *a, *b, *end; - for (a = b = cl.getData(), end = a + cl.size(); a != end; a++) { - lbool val = solver.value(*a); - if (val == l_Undef) - *b++ = *a; - - if (val == l_True) { - #ifdef VERBOSE_DEBUG - std::cout << "--> Clause was satisfied." << std::endl; - #endif - solver.clauseAllocator.clauseFree(&cl); - goto endS; - } - } - cl.shrink(a-b); - cl.setStrenghtened(); - - #ifdef VERBOSE_DEBUG - cout << "--> Strenghtened clause:"; - cl.plainPrint(); - #endif - - if (cl.size() == 0) { - solver.ok = false; - unregisterIteration(Q); - unregisterIteration(subs); - solver.clauseAllocator.clauseFree(&cl); - return; - } - if (cl.size() > 1) { - cl.calcAbstractionClause(); - linkInAlreadyClause(c); - clauses[c.index] = c; - solver.attachClause(cl); - if (cl.size() == 2) solver.becameBinary++; - updateClause(c); - Q.push(c); - } else { - assert(cl.size() == 1); - solver.uncheckedEnqueue(cl[0]); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - unregisterIteration(Q); - unregisterIteration(subs); - return; - } - #ifdef VERBOSE_DEBUG - cout << "--> Found that var " << cl[0].var()+1 << " must be " << std::boolalpha << !cl[0].sign() << endl; - #endif - solver.clauseAllocator.clauseFree(&cl); - } - endS:; - } - - qs[i] = ~qs[i]; - subs.clear(); - } - q++; - } - - unregisterIteration(Q); - unregisterIteration(subs); -} - -template -void Subsumer::subsume1Partial(const T& ps) -{ - assert(solver.decisionLevel() == 0); - registerIteration(subsume1PartialSubs); - - #ifdef VERBOSE_DEBUG - cout << "-> Strenghtening using clause :"; - ps[0].print(); std::cout << " "; - ps[1].printFull(); - #endif - - assert(ps.size() == 2); - subsume1PartialQs.clear(); - for (uint8_t i = 0; i < 2; i++) - subsume1PartialQs.push(ps[i]); - - for (uint8_t i = 0; i < 2; i++){ - subsume1PartialQs[i] = ~subsume1PartialQs[i]; - - uint32_t abst = calcAbstraction(subsume1PartialQs); - - findSubsumed(subsume1PartialQs, abst, subsume1PartialSubs); - for (uint32_t j = 0; j < subsume1PartialSubs.size(); j++){ - if (subsume1PartialSubs[j].clause == NULL) continue; - ClauseSimp c = subsume1PartialSubs[j]; - Clause& cl = *c.clause; - #ifdef VERBOSE_DEBUG - cout << "-> Strenghtening clause :"; - cl.plainPrint(); - #endif - unlinkClause(subsume1PartialSubs[j]); - - literals_removed++; - cl.strengthen(subsume1PartialQs[i]); - Lit *a, *b, *end; - for (a = b = cl.getData(), end = a + cl.size(); a != end; a++) { - lbool val = solver.value(*a); - if (val == l_Undef) - *b++ = *a; - - if (val == l_True) { - #ifdef VERBOSE_DEBUG - std::cout << "--> Clause was satisfied." << std::endl; - #endif - solver.clauseAllocator.clauseFree(&cl); - goto endS; - } - } - cl.shrink(a-b); - cl.setStrenghtened(); - - #ifdef VERBOSE_DEBUG - cout << "--> Strenghtened clause:"; - cl.plainPrint(); - #endif - - if (cl.size() == 0) { - solver.ok = false; - unregisterIteration(subsume1PartialSubs); - solver.clauseAllocator.clauseFree(&cl); - return; - } - if (cl.size() > 2) { - cl.calcAbstractionClause(); - linkInAlreadyClause(c); - clauses[c.index] = c; - solver.attachClause(cl); - updateClause(c); - } else if (cl.size() == 2) { - cl.calcAbstractionClause(); - solver.attachClause(cl); - solver.becameBinary++; - addBinaryClauses.push(&cl); - //updateClause(c); - } else { - assert(cl.size() == 1); - solver.uncheckedEnqueue(cl[0]); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - unregisterIteration(subsume1PartialSubs); - return; - } - #ifdef VERBOSE_DEBUG - cout << "--> Found that var " << cl[0].var()+1 << " must be " << std::boolalpha << !cl[0].sign() << endl; - #endif - solver.clauseAllocator.clauseFree(&cl); - } - endS:; - } - - subsume1PartialQs[i] = ~subsume1PartialQs[i]; - subsume1PartialSubs.clear(); - } - unregisterIteration(subsume1PartialSubs); -} - -void Subsumer::updateClause(ClauseSimp c) -{ - subsume0(*c.clause, c.clause->getAbst()); - if (c.clause->learnt() && subsumedNonLearnt) - c.clause->makeNonLearnt(); - - cl_touched.add(c); -} - -void Subsumer::almost_all_database() -{ - #ifdef BIT_MORE_VERBOSITY - std::cout << "c Larger database" << std::endl; - #endif - // Optimized variant when virtually whole database is involved: - cl_added .clear(); - cl_touched.clear(); - - for (uint32_t i = 0; i < clauses.size(); i++) { - if (numMaxSubsume1 == 0) break; - if (clauses[i].clause != NULL) { - subsume1(clauses[i]); - numMaxSubsume1--; - if (!solver.ok) return; - } - } - - assert(solver.ok); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - return; - } - solver.clauseCleaner->cleanClausesBewareNULL(clauses, ClauseCleaner::simpClauses, *this); - - #ifdef VERBOSE_DEBUG - cout << "subsume1 part 1 finished" << endl; - #endif - - CSet s1; - registerIteration(s1); - while (cl_touched.size() > 0 && numMaxSubsume1 > 0){ - #ifdef VERBOSE_DEBUG - std::cout << "c cl_touched was > 0, new iteration" << std::endl; - #endif - for (CSet::iterator it = cl_touched.begin(), end = cl_touched.end(); it != end; ++it) { - if (it->clause != NULL) - s1.add(*it); - } - cl_touched.clear(); - - for (CSet::iterator it = s1.begin(), end = s1.end(); it != end; ++it) { - if (numMaxSubsume1 == 0) break; - if (it->clause != NULL) { - subsume1(*it); - numMaxSubsume1--; - if (!solver.ok) return; - } - } - s1.clear(); - - if (!solver.ok) return; - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - unregisterIteration(s1); - return; - } - solver.clauseCleaner->cleanClausesBewareNULL(clauses, ClauseCleaner::simpClauses, *this); - } - unregisterIteration(s1); -} - -void Subsumer::smaller_database() -{ - #ifdef BIT_MORE_VERBOSITY - std::cout << "c Smaller database" << std::endl; - #endif - // Set used in 1-subs: - // (1) clauses containing a negated literal of an added clause. - // (2) all added or strengthened ("touched") clauses. - // - // Set used in 0-subs: - // (1) clauses containing a (non-negated) literal of an added clause, including the added clause itself. - // (2) all strenghtened clauses -- REMOVED!! We turned on eager backward subsumption which supersedes this. - - #ifdef BIT_MORE_VERBOSITY - printf(" PREPARING\n"); - #endif - - CSet s0, s1; // 's0' is used for 0-subsumption, 's1' for 1-subsumption - vec ol_seen(solver.nVars()*2, 0); - for (CSet::iterator it = cl_added.begin(), end = cl_added.end(); it != end; ++it) { - if (it->clause == NULL) continue; - ClauseSimp& c = *it; - Clause& cl = *it->clause; - - s1.add(c); - for (uint32_t j = 0; j < cl.size(); j++){ - if (ol_seen[cl[j].toInt()]) continue; - ol_seen[cl[j].toInt()] = 1; - - vec& n_occs = occur[(~cl[j]).toInt()]; - for (uint32_t k = 0; k < n_occs.size(); k++) - if (n_occs[k].clause != c.clause && n_occs[k].clause->size() <= cl.size() && selfSubset(n_occs[k].clause->getAbst(), c.clause->getAbst()) && selfSubset(*n_occs[k].clause, cl, seen_tmp)) - s1.add(n_occs[k]); - - vec& p_occs = occur[cl[j].toInt()]; - for (uint32_t k = 0; k < p_occs.size(); k++) - if (subsetAbst(p_occs[k].clause->getAbst(), c.clause->getAbst())) - s0.add(p_occs[k]); - } - } - cl_added.clear(); - - registerIteration(s0); - registerIteration(s1); - - #ifdef BIT_MORE_VERBOSITY - printf("c FIXED-POINT\n"); - #endif - - // Fixed-point for 1-subsumption: - while (s1.size() > 0 || cl_touched.size() > 0){ - for (CSet::iterator it = cl_touched.begin(), end = cl_touched.end(); it != end; ++it) { - if (it->clause != NULL) { - s1.add(*it); - s0.add(*it); - } - } - - cl_touched.clear(); - assert(solver.qhead == solver.trail.size()); - - #ifdef BIT_MORE_VERBOSITY - printf("c s1.size()=%d cl_touched.size()=%d\n", s1.size(), cl_touched.size()); - #endif - - for (CSet::iterator it = s1.begin(), end = s1.end(); it != end; ++it) { - if (numMaxSubsume1 == 0) break; - if (it->clause != NULL) { - subsume1(*it); - numMaxSubsume1--; - if (!solver.ok) return; - } - } - s1.clear(); - - if (!solver.ok) return; - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok){ - unregisterIteration(s1); - unregisterIteration(s0); - return; - } - solver.clauseCleaner->cleanClausesBewareNULL(clauses, ClauseCleaner::simpClauses, *this); - } - unregisterIteration(s1); - - // Iteration pass for 0-subsumption: - for (CSet::iterator it = s0.begin(), end = s0.end(); it != end; ++it) { - if (it->clause != NULL) { - subsume0(*it->clause, it->clause->getAbst()); - if (subsumedNonLearnt && it->clause->learnt()) it->clause->makeNonLearnt(); - } - } - s0.clear(); - unregisterIteration(s0); -} - -ClauseSimp Subsumer::linkInClause(Clause& cl) -{ - ClauseSimp c(&cl, clauseID++); - clauses.push(c); - for (uint32_t i = 0; i < cl.size(); i++) { - occur[cl[i].toInt()].push(c); - touch(cl[i].var()); - } - cl_added.add(c); - - return c; -} - -void Subsumer::linkInAlreadyClause(ClauseSimp& c) -{ - Clause& cl = *c.clause; - for (uint32_t i = 0; i < cl.size(); i++) { - occur[cl[i].toInt()].push(c); - touch(cl[i].var()); - } -} - -template -void Subsumer::addFromSolver(vec& cs, bool alsoLearnt) -{ - Clause **i = cs.getData(); - Clause **j = i; - for (Clause **end = i + cs.size(); i != end; i++) { - if (i+1 != end) - __builtin_prefetch(*(i+1), 1, 1); - - if (!alsoLearnt && (*i)->learnt()) { - *j++ = *i; - (*i)->setUnsorted(); - continue; - } - - if (!UseCL && (*i)->size() == 2) { - //don't add binary clauses in this case - *j++ = *i; - (*i)->setUnsorted(); - continue; - } - - ClauseSimp c(*i, clauseID++); - clauses.push(c); - Clause& cl = *c.clause; - for (uint32_t i = 0; i < cl.size(); i++) { - occur[cl[i].toInt()].push(c); - touch(cl[i].var()); - } - if (UseCL) { - if (fullSubsume || cl.getVarChanged()) cl_added.add(c); - else if (cl.getStrenghtened()) cl_touched.add(c); - } - - if (!cl.learnt() && (cl.getVarChanged() || cl.getStrenghtened())) - cl.calcAbstractionClause(); - } - cs.shrink(i-j); -} - -void Subsumer::freeMemory() -{ - for (uint32_t i = 0; i < occur.size(); i++) { - occur[i].clear(true); - } -} - -void Subsumer::addBackToSolver() -{ - #ifdef HYPER_DEBUG2 - uint32_t binaryLearntAdded = 0; - #endif - - assert(solver.clauses.size() == 0); - for (uint32_t i = 0; i < clauses.size(); i++) { - if (clauses[i].clause != NULL) { - assert(clauses[i].clause->size() > 1); - if (clauses[i].clause->size() == 2) { - #ifdef HYPER_DEBUG2 - if (clauses[i].clause->learnt()) - binaryLearntAdded++; - #endif - Clause* c = clauses[i].clause; - if (!c->wasBin()) { - solver.detachClause(*c); - Clause *c2 = solver.clauseAllocator.Clause_new(*c); - solver.clauseAllocator.clauseFree(c); - solver.attachClause(*c2); - solver.becameBinary++; - c = c2; - } - solver.binaryClauses.push(c); - } else { - if (clauses[i].clause->learnt()) - solver.learnts.push(clauses[i].clause); - else - solver.clauses.push(clauses[i].clause); - } - } - } - - #ifdef HYPER_DEBUG2 - std::cout << "Binary learnt added:" << binaryLearntAdded << std::endl; - #endif -} - -void Subsumer::removeWrong(vec& cs) -{ - Clause **i = cs.getData(); - Clause **j = i; - for (Clause **end = i + cs.size(); i != end; i++) { - Clause& c = **i; - if (!c.learnt()) { - *j++ = *i; - continue; - } - bool remove = false; - for (Lit *l = c.getData(), *end2 = l+c.size(); l != end2; l++) { - if (var_elimed[l->var()]) { - remove = true; - solver.detachClause(c); - solver.clauseAllocator.clauseFree(&c); - break; - } - } - if (!remove) - *j++ = *i; - } - cs.shrink(i-j); -} - -void Subsumer::fillCannotEliminate() -{ - std::fill(cannot_eliminate.getData(), cannot_eliminate.getDataEnd(), false); - for (uint32_t i = 0; i < solver.xorclauses.size(); i++) { - const XorClause& c = *solver.xorclauses[i]; - for (uint32_t i2 = 0; i2 < c.size(); i2++) - cannot_eliminate[c[i2].var()] = true; - } - - const vec& tmp = solver.varReplacer->getClauses(); - for (uint32_t i = 0; i < tmp.size(); i++) { - const Clause& c = *tmp[i]; - for (uint32_t i2 = 0; i2 < c.size(); i2++) - cannot_eliminate[c[i2].var()] = true; - } - - #ifdef VERBOSE_DEBUG - uint32_t tmpNum = 0; - for (uint32_t i = 0; i < cannot_eliminate.size(); i++) - if (cannot_eliminate[i]) - tmpNum++; - std::cout << "Cannot eliminate num:" << tmpNum << std::endl; - #endif -} - -const bool Subsumer::subsumeWithBinaries(OnlyNonLearntBins* onlyNonLearntBins) -{ - clearAll(); - clauseID = 0; - fullSubsume = true; - addBinaryClauses.clear(); - - //Clearing stats - subsNonExistentumFailed = 0; - clauses_subsumed = 0; - literals_removed = 0; - double myTime = cpuTime(); - uint32_t origTrailSize = solver.trail.size(); - - clauses.reserve(solver.clauses.size()); - solver.clauseCleaner->cleanClauses(solver.clauses, ClauseCleaner::clauses); - addFromSolver(solver.clauses); - #ifdef DEBUG_BINARIES - for (uint32_t i = 0; i < clauses.size(); i++) { - assert(clauses[i].clause->size() != 2); - } - #endif //DEBUG_BINARIES - - numMaxSubsume0 = 300000 * (1+numCalls/2); - numMaxSubsume1 = 10000 * (1+numCalls); - - for (uint32_t i = 0; i < solver.binaryClauses.size(); i++) { - if (!solver.binaryClauses[i]->learnt() && numMaxSubsume0 > 0) { - Clause& c = *solver.binaryClauses[i]; - subsume0(c, c.getAbst()); - numMaxSubsume0--; - } - } - for (uint32_t i = 0; i < solver.binaryClauses.size(); i++) { - if (numMaxSubsume1 > 0) { - Clause& c = *solver.binaryClauses[i]; - subsume1Partial(c); - if (!solver.ok) return false; - numMaxSubsume1--; - } - } - if (solver.verbosity >= 1) { - std::cout << "c subs with bin: " << std::setw(8) << clauses_subsumed - << " lits-rem: " << std::setw(9) << literals_removed - << " v-fix: " << std::setw(4) <size() != 2); - } - #endif //DEBUG_BINARIES - addBackToSolver(); - for (uint32_t i = 0; i < addBinaryClauses.size(); i++) { - Clause& c = *addBinaryClauses[i]; - solver.detachClause(c); - Clause *c2 = solver.clauseAllocator.Clause_new(c); - solver.clauseAllocator.clauseFree(&c); - solver.attachClause(*c2); - solver.becameBinary++; - solver.binaryClauses.push(c2); - } - addBinaryClauses.clear(); - freeMemory(); - - if (solver.verbosity >= 1) { - std::cout << "c Subs w/ non-existent bins: " << std::setw(6) << subsNonExistentNum - << " l-rem: " << std::setw(6) << subsNonExistentLitsRemoved - << " v-fix: " << std::setw(5) << subsNonExistentumFailed - << " done: " << std::setw(6) << doneNum - << " time: " << std::fixed << std::setprecision(2) << std::setw(5) << subsNonExistentTime << " s" - << std::setw(2) << " |" << std::endl; - } - totalTime += cpuTime() - myTime; - solver.order_heap.filter(Solver::VarFilter(solver)); - - return true; -} - -#define MAX_BINARY_PROP 40000000 - -const bool Subsumer::subsWNonExistBinsFull(OnlyNonLearntBins* onlyNonLearntBins) -{ - uint32_t oldClausesSubusmed = clauses_subsumed; - uint32_t oldLitsRemoved = literals_removed; - double myTime = cpuTime(); - uint64_t oldProps = solver.propagations; - uint32_t oldTrailSize = solver.trail.size(); - uint64_t maxProp = MAX_BINARY_PROP; - //if (!startUp) maxProp /= 3; - if (clauses.size() > 2000000) maxProp /= 2; - ps2.clear(); - ps2.growTo(2); - toVisitAll.growTo(solver.nVars()*2, false); - - doneNum = 0; - uint32_t startFrom = solver.mtrand.randInt(solver.order_heap.size()); - for (uint32_t i = 0; i < solver.order_heap.size(); i++) { - Var var = solver.order_heap[(i+startFrom)%solver.order_heap.size()]; - if (solver.propagations - oldProps > maxProp) break; - if (solver.assigns[var] != l_Undef || !solver.decision_var[var]) continue; - doneNum++; - - Lit lit(var, true); - if (!subsWNonExistBins(lit, onlyNonLearntBins)) { - if (!solver.ok) return false; - solver.cancelUntil(0); - solver.uncheckedEnqueue(~lit); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) return false; - continue; - } - - //in the meantime it could have got assigned - if (solver.assigns[var] != l_Undef) continue; - lit = ~lit; - if (!subsWNonExistBins(lit, onlyNonLearntBins)) { - if (!solver.ok) return false; - solver.cancelUntil(0); - solver.uncheckedEnqueue(~lit); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) return false; - continue; - } - } - subsNonExistentNum = clauses_subsumed - oldClausesSubusmed; - subsNonExistentTime = cpuTime() - myTime; - subsNonExistentumFailed = solver.trail.size() - oldTrailSize; - subsNonExistentLitsRemoved = literals_removed - oldLitsRemoved; - - return true; -} - -const bool Subsumer::subsWNonExistBins(const Lit& lit, OnlyNonLearntBins* onlyNonLearntBins) -{ - #ifdef VERBOSE_DEBUG - std::cout << "subsWNonExistBins called with lit "; lit.print(); - std::cout << std::endl; - #endif //VERBOSE_DEBUG - toVisit.clear(); - solver.newDecisionLevel(); - solver.uncheckedEnqueueLight(lit); - bool failed = !onlyNonLearntBins->propagate(); - if (failed) return false; - - assert(solver.decisionLevel() > 0); - for (int c = solver.trail.size()-1; c > (int)solver.trail_lim[0]; c--) { - Lit x = solver.trail[c]; - toVisit.push(x); - toVisitAll[x.toInt()] = true; - } - solver.cancelUntil(0); - - if (toVisit.size() <= 1) { - ps2[0] = ~lit; - for (Lit *l = toVisit.getData(), *end = toVisit.getDataEnd(); l != end; l++) { - ps2[1] = *l; - assert(ps2[0] != ps2[1]); - #ifdef VERBOSE_DEBUG - std::cout << "Non-existent bin. lit1: "; ps2[0].print(); - std::cout << " lit2: "; ps2[1].print(); std::cout << std::endl; - #endif //VERBOSE_DEBUG - subsume0(ps2, calcAbstraction(ps2)); - subsume1Partial(ps2); - if (!solver.ok) goto end; - } - } else { - subsume0BIN(~lit, toVisitAll); - if (!solver.ok) goto end; - } - - end: - for (uint32_t i = 0; i < toVisit.size(); i++) - toVisitAll[toVisit[i].toInt()] = false; - - return solver.ok; -} - -void Subsumer::clearAll() -{ - touched_list.clear(); - touched.clear(); - touched.growTo(solver.nVars(), false); - for (Var var = 0; var < solver.nVars(); var++) { - if (solver.decision_var[var] && solver.assigns[var] == l_Undef) touch(var); - occur[2*var].clear(); - occur[2*var+1].clear(); - } - clauses.clear(); - cl_added.clear(); - cl_touched.clear(); -} - -const bool Subsumer::simplifyBySubsumption(const bool alsoLearnt) -{ - if (solver.nClauses() > 20000000) return true; - - double myTime = cpuTime(); - uint32_t origTrailSize = solver.trail.size(); - clauses_subsumed = 0; - literals_removed = 0; - numblockedClauseRemoved = 0; - numCalls++; - clauseID = 0; - numVarsElimed = 0; - blockTime = 0.0; - clearAll(); - - //if (solver.xorclauses.size() < 30000 && solver.clauses.size() < MAX_CLAUSENUM_XORFIND/10) addAllXorAsNorm(); - - if (solver.performReplace && !solver.varReplacer->performReplace(true)) - return false; - fillCannotEliminate(); - - uint32_t expected_size; - if (!alsoLearnt) - expected_size = solver.clauses.size() + solver.binaryClauses.size(); - else - expected_size = solver.clauses.size() + solver.binaryClauses.size() + solver.learnts.size(); - clauses.reserve(expected_size); - cl_added.reserve(expected_size); - cl_touched.reserve(expected_size); - - if (clauses.size() < 200000) fullSubsume = true; - else fullSubsume = false; - if (alsoLearnt) fullSubsume = true; - - //solver.clauseCleaner->cleanClauses(solver.learnts, ClauseCleaner::learnts); - //addFromSolver(solver.learnts, alsoLearnt); - solver.clauseCleaner->cleanClauses(solver.clauses, ClauseCleaner::clauses); - addFromSolver(solver.clauses, alsoLearnt); - - //It is IMPERATIVE to add binaryClauses last. The non-binary clauses can - //move to binaryClauses during cleaning!!!! - solver.clauseCleaner->removeSatisfied(solver.binaryClauses, ClauseCleaner::binaryClauses); - addFromSolver(solver.binaryClauses, alsoLearnt); - - //Limits - if (clauses.size() > 3500000) { - numMaxSubsume0 = 900000 * (1+numCalls/2); - numMaxElim = (uint32_t)((double)solver.order_heap.size() / 5.0 * (0.8+(double)(numCalls)/4.0)); - numMaxSubsume1 = 100000 * (1+numCalls/2); - numMaxBlockToVisit = (int64_t)(30000.0 * (0.8+(double)(numCalls)/3.0)); - } - if (clauses.size() <= 3500000 && clauses.size() > 1500000) { - numMaxSubsume0 = 2000000 * (1+numCalls/2); - numMaxElim = (uint32_t)((double)solver.order_heap.size() / 2.0 * (0.8+(double)(numCalls)/4.0)); - numMaxSubsume1 = 300000 * (1+numCalls/2); - numMaxBlockToVisit = (int64_t)(50000.0 * (0.8+(double)(numCalls)/3.0)); - } - if (clauses.size() <= 1500000) { - numMaxSubsume0 = 4000000 * (1+numCalls/2); - numMaxElim = (uint32_t)((double)solver.order_heap.size() / 2.0 * (0.8+(double)(numCalls)/2.0)); - numMaxSubsume1 = 400000 * (1+numCalls/2); - numMaxBlockToVisit = (int64_t)(80000.0 * (0.8+(double)(numCalls)/3.0)); - } - if (solver.order_heap.size() > 200000) - numMaxBlockVars = (uint32_t)((double)solver.order_heap.size() / 3.5 * (0.8+(double)(numCalls)/4.0)); - else - numMaxBlockVars = (uint32_t)((double)solver.order_heap.size() / 1.5 * (0.8+(double)(numCalls)/4.0)); - - if (numCalls == 1) numMaxSubsume1 = 0; - if (!solver.doSubsume1) numMaxSubsume1 = 0; - if (alsoLearnt) { - numMaxElim = 0; - numMaxSubsume1 = 0; - numMaxBlockVars = 0; - numMaxBlockToVisit = 0; - fullSubsume = true; - } - - //For debugging - //numMaxBlockToVisit = std::numeric_limits::max(); - //numMaxElim = std::numeric_limits::max(); - //numMaxSubsume0 = std::numeric_limits::max(); - //numMaxSubsume1 = std::numeric_limits::max(); - //numMaxBlockVars = std::numeric_limits::max(); - - #ifdef BIT_MORE_VERBOSITY - std::cout << "c num clauses:" << clauses.size() << std::endl; - std::cout << "c time to link in:" << cpuTime()-myTime << std::endl; - #endif - - for (uint32_t i = 0; i < clauses.size(); i++) { - if (numMaxSubsume0 == 0) break; - if (clauses[i].clause != NULL && - (fullSubsume - || !clauses[i].clause->subsume0IsFinished()) - ) - { - subsume0(*clauses[i].clause, clauses[i].clause->getAbst()); - if (subsumedNonLearnt && clauses[i].clause->learnt()) clauses[i].clause->makeNonLearnt(); - numMaxSubsume0--; - } - } - - origNClauses = clauses.size(); - - #ifdef BIT_MORE_VERBOSITY - std::cout << "c time until pre-subsume0 clauses and subsume1 2-learnts:" << cpuTime()-myTime << std::endl; - #endif - - if (!solver.ok) return false; - #ifdef VERBOSE_DEBUG - std::cout << "c pre-subsumed:" << clauses_subsumed << std::endl; - std::cout << "c cl_added:" << cl_added.size() << std::endl; - std::cout << "c cl_touched:" << cl_touched.size() << std::endl; - std::cout << "c clauses:" << clauses.size() << std::endl; - std::cout << "c origNClauses:" << origNClauses << std::endl; - #endif - - if (clauses.size() > 10000000) goto endSimplifyBySubsumption; - if (solver.doBlockedClause && numCalls % 3 == 1) blockedClauseRemoval(); - do{ - #ifdef BIT_MORE_VERBOSITY - std::cout << "c time before the start of almost_all/smaller: " << cpuTime() - myTime << std::endl; - #endif - if (numMaxSubsume0 > 0) { - if (cl_added.size() > origNClauses / 2) { - almost_all_database(); - if (!solver.ok) return false; - } else { - smaller_database(); - if (!solver.ok) return false; - } - } - cl_added.clear(); - assert(cl_added.size() == 0); - assert(solver.ok); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - return false; - } - solver.clauseCleaner->cleanClausesBewareNULL(clauses, ClauseCleaner::simpClauses, *this); - - #ifdef BIT_MORE_VERBOSITY - std::cout << "c time until the end of almost_all/smaller: " << cpuTime() - myTime << std::endl; - #endif - - if (!solver.doVarElim) break; - - #ifdef BIT_MORE_VERBOSITY - printf("c VARIABLE ELIMINIATION\n"); - std::cout << "c toucheds list size:" << touched_list.size() << std::endl; - #endif - vec init_order; - orderVarsForElim(init_order); // (will untouch all variables) - - for (bool first = true; numMaxElim > 0; first = false){ - uint32_t vars_elimed = 0; - vec order; - - if (first) { - //init_order.copyTo(order); - for (uint32_t i = 0; i < init_order.size(); i++) { - const Var var = init_order[i]; - if (!cannot_eliminate[var] && solver.decision_var[var]) - order.push(var); - } - } else { - for (uint32_t i = 0; i < touched_list.size(); i++) { - const Var var = touched_list[i]; - if (!cannot_eliminate[var] && solver.decision_var[var]) - order.push(var); - touched[var] = false; - } - touched_list.clear(); - } - #ifdef VERBOSE_DEBUG - std::cout << "Order size:" << order.size() << std::endl; - #endif - - assert(solver.qhead == solver.trail.size()); - for (uint32_t i = 0; i < order.size() && numMaxElim > 0; i++, numMaxElim--) { - if (maybeEliminate(order[i])) { - if (!solver.ok) { - return false; - } - vars_elimed++; - } - } - assert(solver.qhead == solver.trail.size()); - - if (vars_elimed == 0) break; - - numVarsElimed += vars_elimed; - #ifdef BIT_MORE_VERBOSITY - printf("c #var-elim: %d\n", vars_elimed); - std::cout << "c time until the end of varelim: " << cpuTime() - myTime << std::endl; - #endif - } - }while (cl_added.size() > 100 && numMaxElim > 0); - endSimplifyBySubsumption: - - if (!solver.ok) return false; - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - return false; - } - - #ifndef NDEBUG - verifyIntegrity(); - #endif - - removeWrong(solver.learnts); - removeWrong(solver.binaryClauses); - removeAssignedVarsFromEliminated(); - - solver.order_heap.filter(Solver::VarFilter(solver)); - - addBackToSolver(); - freeMemory(); - - if (solver.verbosity >= 1) { - std::cout << "c | lits-rem: " << std::setw(9) << literals_removed - << " cl-subs: " << std::setw(8) << clauses_subsumed - << " v-elim: " << std::setw(6) << numVarsElimed - << " v-fix: " << std::setw(4) < 0 || blockTime > 0.0) { - std::cout - << "c | Blocked clauses removed: " << std::setw(8) << numblockedClauseRemoved - << " Time: " << std::fixed << std::setprecision(2) << std::setw(4) << blockTime << " s" - << " |" << std::endl; - } - } - totalTime += cpuTime() - myTime; - - solver.testAllClauseAttach(); - return true; -} - -void Subsumer::removeAssignedVarsFromEliminated() -{ - for (Var var = 0; var < var_elimed.size(); var++) { - if (var_elimed[var] && solver.assigns[var] != l_Undef) { - var_elimed[var] = false; - solver.setDecisionVar(var, true); - numElimed--; - map >::iterator it = elimedOutVar.find(var); - if (it != elimedOutVar.end()) { - //TODO memory loss here - elimedOutVar.erase(it); - } - } - } -} - -template -void Subsumer::findSubsumed(const T& ps, uint32_t abs, vec& out_subsumed) -{ - #ifdef VERBOSE_DEBUG - cout << "findSubsumed: "; - for (uint32_t i = 0; i < ps.size(); i++) { - if (ps[i].sign()) printf("-"); - printf("%d ", ps[i].var() + 1); - } - printf("0\n"); - #endif - - uint32_t min_i = 0; - for (uint32_t i = 1; i < ps.size(); i++){ - if (occur[ps[i].toInt()].size() < occur[ps[min_i].toInt()].size()) - min_i = i; - } - - vec& cs = occur[ps[min_i].toInt()]; - for (ClauseSimp *it = cs.getData(), *end = it + cs.size(); it != end; it++){ - if (it+1 != end) - __builtin_prefetch((it+1)->clause, 1, 1); - - if (it->clause != (Clause*)&ps && subsetAbst(abs, it->clause->getAbst()) && ps.size() <= it->clause->size() && subset(ps, *it->clause)) { - out_subsumed.push(*it); - #ifdef VERBOSE_DEBUG - cout << "subsumed: "; - it->clause->plainPrint(); - #endif - } - } -} - -void inline Subsumer::MigrateToPsNs(vec& poss, vec& negs, vec& ps, vec& ns, const Var x) -{ - poss.moveTo(ps); - negs.moveTo(ns); - - for (uint32_t i = 0; i < ps.size(); i++) - unlinkClause(ps[i], x); - for (uint32_t i = 0; i < ns.size(); i++) - unlinkClause(ns[i], x); -} - -void inline Subsumer::DeallocPsNs(vec& ps, vec& ns) -{ - for (uint32_t i = 0; i < ps.size(); i++) { - //clauses[ps[i].index].clause = NULL; - //clauseFree(ps[i].clause); - } - for (uint32_t i = 0; i < ns.size(); i++) { - //clauses[ns[i].index].clause = NULL; - //clauseFree(ns[i].clause); - } -} - -// Returns TRUE if variable was eliminated. -bool Subsumer::maybeEliminate(const Var x) -{ - assert(solver.qhead == solver.trail.size()); - assert(!var_elimed[x]); - assert(!cannot_eliminate[x]); - assert(solver.decision_var[x]); - if (solver.value(x) != l_Undef) return false; - if (occur[Lit(x, false).toInt()].size() == 0 && occur[Lit(x, true).toInt()].size() == 0) - return false; - - vec& poss = occur[Lit(x, false).toInt()]; - vec& negs = occur[Lit(x, true).toInt()]; - - // Heuristic CUT OFF: - if (poss.size() >= 10 && negs.size() >= 10) - return false; - - // Count clauses/literals before elimination: - int before_clauses = poss.size() + negs.size(); - uint32_t before_literals = 0; - for (uint32_t i = 0; i < poss.size(); i++) before_literals += poss[i].clause->size(); - for (uint32_t i = 0; i < negs.size(); i++) before_literals += negs[i].clause->size(); - - // Heuristic CUT OFF2: - if ((poss.size() >= 3 && negs.size() >= 3 && before_literals > 300) - && clauses.size() > 1500000) - return false; - if ((poss.size() >= 5 && negs.size() >= 5 && before_literals > 400) - && clauses.size() <= 1500000 && clauses.size() > 200000) - return false; - if ((poss.size() >= 8 && negs.size() >= 8 && before_literals > 700) - && clauses.size() <= 200000) - return false; - - // Count clauses/literals after elimination: - int after_clauses = 0; - vec dummy; - for (uint32_t i = 0; i < poss.size(); i++) for (uint32_t j = 0; j < negs.size(); j++){ - // Merge clauses. If 'y' and '~y' exist, clause will not be created. - dummy.clear(); - bool ok = merge(*poss[i].clause, *negs[j].clause, Lit(x, false), Lit(x, true), dummy); - if (ok){ - after_clauses++; - if (after_clauses > before_clauses) goto Abort; - } - } - Abort:; - - //Eliminate: - if (after_clauses <= before_clauses) { - vec ps, ns; - MigrateToPsNs(poss, negs, ps, ns, x); - for (uint32_t i = 0; i < ps.size(); i++) for (uint32_t j = 0; j < ns.size(); j++){ - dummy.clear(); - bool ok = merge(*ps[i].clause, *ns[j].clause, Lit(x, false), Lit(x, true), dummy); - if (ok){ - uint32_t group_num = 0; - #ifdef STATS_NEEDED - group_num = solver.learnt_clause_group++; - if (solver.dynamic_behaviour_analysis) { - string name = solver.logger.get_group_name(ps[i].clause->getGroup()) + " " + solver.logger.get_group_name(ns[j].clause->getGroup()); - solver.logger.set_group_name(group_num, name); - } - #endif - Clause* cl = solver.addClauseInt(dummy, group_num); - if (cl != NULL) { - ClauseSimp c = linkInClause(*cl); - subsume0(*cl, cl->getAbst()); - } - if (!solver.ok) return true; - } - } - DeallocPsNs(ps, ns); - goto Eliminated; - } - - return false; - - Eliminated: - assert(occur[Lit(x, false).toInt()].size() + occur[Lit(x, true).toInt()].size() == 0); - var_elimed[x] = true; - numElimed++; - solver.setDecisionVar(x, false); - return true; -} - -// Returns FALSE if clause is always satisfied ('out_clause' should not be used). 'seen' is assumed to be cleared. -bool Subsumer::merge(const Clause& ps, const Clause& qs, const Lit without_p, const Lit without_q, vec& out_clause) -{ - for (uint32_t i = 0; i < ps.size(); i++){ - if (ps[i] != without_p){ - seen_tmp[ps[i].toInt()] = 1; - out_clause.push(ps[i]); - } - } - - for (uint32_t i = 0; i < qs.size(); i++){ - if (qs[i] != without_q){ - if (seen_tmp[(~qs[i]).toInt()]){ - for (uint32_t i = 0; i < ps.size(); i++) - seen_tmp[ps[i].toInt()] = 0; - return false; - } - if (!seen_tmp[qs[i].toInt()]) - out_clause.push(qs[i]); - } - } - - for (uint32_t i = 0; i < ps.size(); i++) - seen_tmp[ps[i].toInt()] = 0; - - return true; -} - -struct myComp { - bool operator () (const pair& x, const pair& y) { - return x.first < y.first || - (!(y.first < x.first) && x.second < y.second); - } -}; - -// Side-effect: Will untouch all variables. -void Subsumer::orderVarsForElim(vec& order) -{ - order.clear(); - vec > cost_var; - for (uint32_t i = 0; i < touched_list.size(); i++){ - Var x = touched_list[i]; - touched[x] = 0; - cost_var.push(std::make_pair( occur[Lit(x, false).toInt()].size() * occur[Lit(x, true).toInt()].size() , x )); - } - - touched_list.clear(); - std::sort(cost_var.getData(), cost_var.getData()+cost_var.size(), myComp()); - - for (uint32_t x = 0; x < cost_var.size(); x++) { - if (cost_var[x].first != 0) - order.push(cost_var[x].second); - } -} - -void Subsumer::verifyIntegrity() -{ - vector occurNum(solver.nVars()*2, 0); - - for (uint32_t i = 0; i < clauses.size(); i++) { - if (clauses[i].clause == NULL) continue; - Clause& c = *clauses[i].clause; - for (uint32_t i2 = 0; i2 < c.size(); i2++) - occurNum[c[i2].toInt()]++; - } - - for (uint32_t i = 0; i < occurNum.size(); i++) { - assert(occurNum[i] == occur[i].size()); - } -} - -const bool Subsumer::allTautology(const vec& ps, const Lit lit) -{ - #ifdef VERBOSE_DEBUG - cout << "allTautology: "; - for (uint32_t i = 0; i < ps.size(); i++) { - if (ps[i].sign()) printf("-"); - printf("%d ", ps[i].var() + 1); - } - printf("0\n"); - #endif - - vec& cs = occur[lit.toInt()]; - if (cs.size() == 0) return true; - - for (const Lit *l = ps.getData(), *end = ps.getDataEnd(); l != end; l++) { - seen_tmp[l->toInt()] = true; - } - - bool allIsTautology = true; - for (ClauseSimp *it = cs.getData(), *end = cs.getDataEnd(); it != end; it++){ - if (it+1 != end) - __builtin_prefetch((it+1)->clause, 1, 1); - - Clause& c = *it->clause; - for (Lit *l = c.getData(), *end2 = l + c.size(); l != end2; l++) { - if (*l != lit && seen_tmp[(~(*l)).toInt()]) { - goto next; - } - } - allIsTautology = false; - break; - - next:; - } - - for (const Lit *l = ps.getData(), *end = ps.getDataEnd(); l != end; l++) { - seen_tmp[l->toInt()] = false; - } - - return allIsTautology; -} - -void Subsumer::blockedClauseRemoval() -{ - if (numMaxBlockToVisit < 0) return; - if (solver.order_heap.size() < 1) return; - double myTime = cpuTime(); - vec toRemove; - - touchedBlockedVars = priority_queue, MyComp>(); - touchedBlockedVarsBool.clear(); - touchedBlockedVarsBool.growTo(solver.nVars(), false); - for (uint32_t i = 0; i < solver.order_heap.size() && i < numMaxBlockVars; i++) { - touchBlockedVar(solver.order_heap[solver.mtrand.randInt(solver.order_heap.size()-1)]); - } - - while (touchedBlockedVars.size() > 100 && numMaxBlockToVisit > 0) { - VarOcc vo = touchedBlockedVars.top(); - touchedBlockedVars.pop(); - - if (solver.assigns[vo.var] != l_Undef || !solver.decision_var[vo.var] || cannot_eliminate[vo.var]) - continue; - touchedBlockedVarsBool[vo.var] = false; - Lit lit = Lit(vo.var, false); - Lit negLit = Lit(vo.var, true); - - numMaxBlockToVisit -= (int64_t)occur[lit.toInt()].size(); - numMaxBlockToVisit -= (int64_t)occur[negLit.toInt()].size(); - //if (!tryOneSetting(lit, negLit)) { - tryOneSetting(negLit, lit); - // } - } - blockTime += cpuTime() - myTime; - - #ifdef BIT_MORE_VERBOSITY - std::cout << "c Total fime for block until now: " << blockTime << std::endl; - #endif -} - -const bool Subsumer::tryOneSetting(const Lit lit, const Lit negLit) -{ - uint32_t toRemove = 0; - bool returnVal = false; - vec cl; - - for(ClauseSimp *it = occur[lit.toInt()].getData(), *end = occur[lit.toInt()].getDataEnd(); it != end; it++) { - cl.clear(); - cl.growTo(it->clause->size()-1); - for (uint32_t i = 0, i2 = 0; i < it->clause->size(); i++) { - if ((*it->clause)[i] != lit) { - cl[i2] = (*it->clause)[i]; - i2++; - } - } - - if (allTautology(cl, negLit)) { - toRemove++; - } else { - break; - } - } - - if (toRemove == occur[lit.toInt()].size()) { - var_elimed[lit.var()] = true; - solver.setDecisionVar(lit.var(), false); - vec toRemove(occur[lit.toInt()]); - for (ClauseSimp *it = toRemove.getData(), *end = toRemove.getDataEnd(); it != end; it++) { - #ifdef VERBOSE_DEBUG - std::cout << "Next varelim because of block clause elim" << std::endl; - #endif //VERBOSE_DEBUG - unlinkClause(*it, lit.var()); - numblockedClauseRemoved++; - } - - vec toRemove2(occur[negLit.toInt()]); - for (ClauseSimp *it = toRemove2.getData(), *end = toRemove2.getDataEnd(); it != end; it++) { - #ifdef VERBOSE_DEBUG - std::cout << "Next varelim because of block clause elim" << std::endl; - #endif //VERBOSE_DEBUG - unlinkClause(*it, lit.var()); - numblockedClauseRemoved++; - } - returnVal = true; - } - - return returnVal; -} - -const bool Subsumer::checkElimedUnassigned() const -{ - for (uint32_t i = 0; i < var_elimed.size(); i++) { - if (var_elimed[i]) { - assert(solver.assigns[i] == l_Undef); - if (solver.assigns[i] != l_Undef) return false; - } - } - - return true; -} - -/* -int hash32shift(int key) -{ - key = ~key + (key << 15); // key = (key << 15) - key - 1; - key = key ^ (key >> 12); - key = key + (key << 2); - key = key ^ (key >> 4); - key = key * 2057; // key = (key + (key << 3)) + (key << 11); - key = key ^ (key >> 16); - return key; -} - -vector Subsumer::merge() -{ - vector var_merged(solver.nVars(), false); - double myTime = cpuTime(); - - vector varData(solver.nVars()); - - for (Var var = 0; var < solver.nVars(); var++) if (solver.decision_var[var] && solver.assigns[var] == l_Undef && !cannot_eliminate[var]) { - varDataStruct thisVar; - - vec& toCountPos = occur[Lit(var, false).toInt()]; - thisVar.numPosClauses = toCountPos.size(); - for (uint32_t i2 = 0; i2 < toCountPos.size(); i2++) { - thisVar.sumPosClauseSize += toCountPos[i2].clause->size(); - for (Lit *l = toCountPos[i2].clause->getData(), *end = l + toCountPos[i2].clause->size(); l != end; l++) { - if (l->var() != var) thisVar.posHash ^= hash32shift(l->toInt()); - } - } - - vec& toCountNeg = occur[Lit(var, true).toInt()]; - thisVar.numNegClauses = toCountNeg.size(); - for (uint32_t i2 = 0; i2 < toCountNeg.size(); i2++) { - thisVar.sumNegClauseSize += toCountNeg[i2].clause->size(); - for (Lit *l = toCountNeg[i2].clause->getData(), *end = l + toCountNeg[i2].clause->size(); l != end; l++) { - if (l->var() != var) thisVar.negHash ^= hash32shift(l->toInt()); - } - } - - varData[var] = thisVar; - } - - map > dataToVar; - for (Var var = 0; var < solver.nVars(); var++) if (solver.decision_var[var] && solver.assigns[var] == l_Undef) { - dataToVar[varData[var]].push_back(var); - assert(dataToVar[varData[var]].size() > 0); - } - - for (map >::iterator it = dataToVar.begin(); it != dataToVar.end(); it++) { - //std::cout << "size: " << it->second.size() << std::endl; - for (uint i = 0; i < it->second.size()-1; i++) { - assert(it->second.size() > i+1); - assert(varData[it->second[i]] == varData[it->second[i+1]]); - } - } - - uint64_t checked = 0; - uint64_t replaced = 0; - for (Var var = 0; var < solver.nVars(); var++) if (solver.decision_var[var] && solver.assigns[var] == l_Undef && !cannot_eliminate[var]) { - varDataStruct tmp = varData[var]; - assert(dataToVar[tmp].size() > 0); - - if (dataToVar[tmp].size() > 0) { - map >::iterator it = dataToVar.find(tmp); - for (uint i = 0; i < it->second.size(); i++) if (it->second[i] != var) { - checked ++; - if (checkIfSame(Lit(var, false), Lit(it->second[i], false)) && - (checkIfSame(Lit(var, true), Lit(it->second[i], true)))) - { - vec ps(2); - ps[0] = Lit(var, false); - ps[1] = Lit(it->second[i], false); - solver.varReplacer->replace(ps, true, 0); - replaced++; - goto next; - - } - } - } - - tmp.reversePolarity(); - if (dataToVar[tmp].size() > 0) { - map >::iterator it = dataToVar.find(tmp); - for (uint i = 0; i < it->second.size(); i++) if (it->second[i] != var) { - checked ++; - if (checkIfSame(Lit(var, true), Lit(it->second[i], false)) && - (checkIfSame(Lit(var, false), Lit(it->second[i], true)))) - { - vec ps(2); - ps[0] = Lit(var, false); - ps[1] = Lit(it->second[i], false); - solver.varReplacer->replace(ps, false, 0); - replaced++; - goto next; - } - } - } - - next:; - } - - std::cout << "c | Merging vars in same clauses. checked: " << std::setw(5) << checked << " replaced: " << std::setw(5) << replaced << " time: " << std::setprecision(2) << std::setw(5) << cpuTime()-myTime << std::endl; - - return var_merged; -}*/ - -/*const bool Subsumer::checkIfSame(const Lit lit1, const Lit lit2) -{ - assert(lit1.var() != lit2.var()); - #ifdef VERBOSE_DEBUG - std::cout << "checking : " << lit1.var()+1 << " , " << lit2.var()+1 << std::endl; - #endif - - vec& occSet1 = occur[lit1.toInt()]; - vec& occSet2 = occur[lit2.toInt()]; - vec tmp; - - for (ClauseSimp *it = occSet1.getData(), *end = it + occSet1.size(); it != end; it++) { - bool found = false; - tmp.clear(); - uint32_t clauseSize = it->clause->size(); - - for (Lit *l = it->clause->getData(), *end2 = l + it->clause->size(); l != end2; l++) { - if (l->var() != lit1.var()) { - tmp.push(*l); - seen_tmp[l->toInt()] = true; - } - } - #ifdef VERBOSE_DEBUG - std::cout << "orig: "; - it->clause->plainPrint(); - #endif - - for (ClauseSimp *it2 = occSet2.getData(), *end2 = it2 + occSet2.size(); (it2 != end2 && !found); it2++) { - if (it2->clause->size() != clauseSize) continue; - - for (Lit *l = it2->clause->getData(), *end3 = l + tmp.size(); l != end3; l++) if (l->var() != lit1.var()) { - if (!seen_tmp[l->toInt()]) goto next; - } - found = true; - - #ifdef VERBOSE_DEBUG - std::cout << "OK: "; - it2->clause->plainPrint(); - #endif - next:; - } - - for (Lit *l = tmp.getData(), *end2 = l + tmp.size(); l != end2; l++) { - seen_tmp[l->toInt()] = false; - } - - if (!found) return false; - } - #ifdef VERBOSE_DEBUG - std::cout << "OK" << std::endl; - #endif - - return true; -}*/ - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/Subsumer.h b/src/vendor/stp/src/sat/cryptominisat2/Subsumer.h deleted file mode 100644 index a36ea7a18..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/Subsumer.h +++ /dev/null @@ -1,274 +0,0 @@ -/************************************************************************************************** -Originally From: Solver.C -- (C) Niklas Een, Niklas Sorensson, 2004 -Substantially modified by: Mate Soos (2010) -**************************************************************************************************/ - -#ifndef SIMPLIFIER_H -#define SIMPLIFIER_H - -#include "Solver.h" -#include "Queue.h" -#include "CSet.h" -#include "BitArray.h" -#include -#include -#include -using std::vector; -using std::map; -using std::priority_queue; - -namespace MINISAT -{ -using namespace MINISAT; - -class ClauseCleaner; -class OnlyNonLearntBins; - -class Subsumer -{ -public: - - //Construct-destruct - Subsumer(Solver& S2); - ~Subsumer(); - - //Called from main - const bool simplifyBySubsumption(const bool alsoLearnt = false); - const bool subsumeWithBinaries(OnlyNonLearntBins* onlyNonLearntBins); - void newVar(); - - //Used by cleaner - void unlinkModifiedClause(vec& origClause, ClauseSimp c, const bool detachAndNull); - void unlinkClause(ClauseSimp cc, Var elim = var_Undef); - ClauseSimp linkInClause(Clause& cl); - void linkInAlreadyClause(ClauseSimp& c); - void updateClause(ClauseSimp c); - - - //UnElimination - void extendModel(Solver& solver2); - const bool unEliminate(const Var var); - - - //Get-functions - const vec& getVarElimed() const; - const uint32_t getNumElimed() const; - const bool checkElimedUnassigned() const; - const double getTotalTime() const; - -private: - - friend class ClauseCleaner; - friend class ClauseAllocator; - - //Main - vec clauses; - CSet learntClauses; - vec touched; // Is set to true when a variable is part of a removed clause. Also true initially (upon variable creation). - vec touched_list; // A list of the true elements in 'touched'. - CSet cl_touched; // Clauses strengthened. - CSet cl_added; // Clauses created. - vec > occur; // 'occur[index(lit)]' is a list of constraints containing 'lit'. - vec* > iter_vecs; // Vectors currently used for iterations. Removed clauses will be looked up and replaced by 'Clause_NULL'. - vec iter_sets; // Sets currently used for iterations. - vec cannot_eliminate;// - - //Global stats - Solver& solver; - vec var_elimed; //TRUE if var has been eliminated - double totalTime; - uint32_t numElimed; - map > elimedOutVar; - - // Temporaries (to reduce allocation overhead): - // - vec seen_tmp; // (used in various places) - - - //Limits - uint32_t numVarsElimed; - uint32_t numMaxSubsume1; - uint32_t numMaxSubsume0; - uint32_t numMaxElim; - int64_t numMaxBlockToVisit; - uint32_t numMaxBlockVars; - - //Start-up - template - void addFromSolver(vec& cs, bool alsoLearnt = false); - void fillCannotEliminate(); - void clearAll(); - - //Finish-up - void freeMemory(); - void addBackToSolver(); - void removeWrong(vec& cs); - void removeAssignedVarsFromEliminated(); - - //Iterations - void registerIteration (CSet& iter_set) { iter_sets.push(&iter_set); } - void unregisterIteration(CSet& iter_set) { remove(iter_sets, &iter_set); } - void registerIteration (vec& iter_vec) { iter_vecs.push(&iter_vec); } - void unregisterIteration(vec& iter_vec) { remove(iter_vecs, &iter_vec); } - - // Subsumption: - void touch(const Var x); - void touch(const Lit p); - template - void findSubsumed(const T& ps, const uint32_t abst, vec& out_subsumed); - bool isSubsumed(Clause& ps); - template - uint32_t subsume0(T& ps, uint32_t abs); - template - uint32_t subsume0Orig(const T& ps, uint32_t abs); - bool subsumedNonLearnt; - void subsume0BIN(const Lit lit, const vec& lits); - void subsume1(ClauseSimp& ps); - void smaller_database(); - void almost_all_database(); - template - bool subset(const T1& A, const T2& B); - bool subsetAbst(uint32_t A, uint32_t B); - - void orderVarsForElim(vec& order); - bool maybeEliminate(Var x); - void MigrateToPsNs(vec& poss, vec& negs, vec& ps, vec& ns, const Var x); - void DeallocPsNs(vec& ps, vec& ns); - bool merge(const Clause& ps, const Clause& qs, const Lit without_p, const Lit without_q, vec& out_clause); - - //Subsume with Nonexistent Bins - const bool subsWNonExistBinsFull(OnlyNonLearntBins* onlyNonLearntBins); - const bool subsWNonExistBins(const Lit& lit, OnlyNonLearntBins* onlyNonLearntBins); - template - void subsume1Partial(const T& ps); - uint32_t subsNonExistentNum; - uint32_t subsNonExistentumFailed; - bool subsNonExistentFinish; - double subsNonExistentTime; - uint32_t subsNonExistentLitsRemoved; - vec addBinaryClauses; - uint32_t doneNum; - vec subsume1PartialSubs; - vec subsume1PartialQs; - vec toVisit; - vec toVisitAll; - vec ps2; - - class VarOcc { - public: - VarOcc(const Var& v, const uint32_t num) : - var(v) - , occurnum(num) - {} - Var var; - uint32_t occurnum; - }; - - struct MyComp { - const bool operator() (const VarOcc& l1, const VarOcc& l2) const { - return l1.occurnum > l2.occurnum; - } - }; - - void blockedClauseRemoval(); - const bool allTautology(const vec& ps, const Lit lit); - uint32_t numblockedClauseRemoved; - const bool tryOneSetting(const Lit lit, const Lit negLit); - priority_queue, MyComp> touchedBlockedVars; - vec touchedBlockedVarsBool; - void touchBlockedVar(const Var x); - double blockTime; - - - //validity checking - void verifyIntegrity(); - - uint32_t clauses_subsumed; - uint32_t literals_removed; - uint32_t origNClauses; - uint32_t numCalls; - bool fullSubsume; - uint32_t clauseID; -}; - -template -void maybeRemove(vec& ws, const T2& elem) -{ - if (ws.size() > 0) - removeW(ws, elem); -} - -inline void Subsumer::touch(const Var x) -{ - if (!touched[x]) { - touched[x] = 1; - touched_list.push(x); - } -} - -inline void Subsumer::touchBlockedVar(const Var x) -{ - if (!touchedBlockedVarsBool[x]) { - touchedBlockedVars.push(VarOcc(x, occur[Lit(x, false).toInt()].size()*occur[Lit(x, true).toInt()].size())); - touchedBlockedVarsBool[x] = 1; - } -} - -inline void Subsumer::touch(const Lit p) -{ - touch(p.var()); -} - -inline bool Subsumer::subsetAbst(uint32_t A, uint32_t B) -{ - return !(A & ~B); -} - -// Assumes 'seen' is cleared (will leave it cleared) -template -bool Subsumer::subset(const T1& A, const T2& B) -{ - for (uint32_t i = 0; i != B.size(); i++) - seen_tmp[B[i].toInt()] = 1; - for (uint32_t i = 0; i != A.size(); i++) { - if (!seen_tmp[A[i].toInt()]) { - for (uint32_t i = 0; i != B.size(); i++) - seen_tmp[B[i].toInt()] = 0; - return false; - } - } - for (uint32_t i = 0; i != B.size(); i++) - seen_tmp[B[i].toInt()] = 0; - return true; -} - -inline void Subsumer::newVar() -{ - occur .push(); - occur .push(); - seen_tmp .push(0); // (one for each polarity) - seen_tmp .push(0); - touched .push(1); - var_elimed .push(0); - touchedBlockedVarsBool.push(0); - cannot_eliminate.push(0); -} - -inline const vec& Subsumer::getVarElimed() const -{ - return var_elimed; -} - -inline const uint32_t Subsumer::getNumElimed() const -{ - return numElimed; -} - -inline const double Subsumer::getTotalTime() const -{ - return totalTime; -} - -}; //NAMESPACE MINISAT - -#endif //SIMPLIFIER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/UselessBinRemover.cpp b/src/vendor/stp/src/sat/cryptominisat2/UselessBinRemover.cpp deleted file mode 100644 index 56fb654f1..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/UselessBinRemover.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include -#include "UselessBinRemover.h" -#include "VarReplacer.h" -#include "ClauseCleaner.h" -#include "time_mem.h" -#include "OnlyNonLearntBins.h" - -namespace MINISAT -{ -using namespace MINISAT; - -UselessBinRemover::UselessBinRemover(Solver& _solver, OnlyNonLearntBins& _onlyNonLearntBins) : - solver(_solver) - , onlyNonLearntBins(_onlyNonLearntBins) -{ -} - -#define MAX_REMOVE_BIN_FULL_PROPS 20000000 -#define EXTRATIME_DIVIDER 2 - -const bool UselessBinRemover::removeUslessBinFull() -{ - double myTime = cpuTime(); - toDeleteSet.clear(); - toDeleteSet.growTo(solver.nVars()*2, 0); - uint32_t origHeapSize = solver.order_heap.size(); - uint64_t origProps = solver.propagations; - bool fixed = false; - uint32_t extraTime = solver.binaryClauses.size() / EXTRATIME_DIVIDER; - - uint32_t startFrom = solver.mtrand.randInt(solver.order_heap.size()); - for (uint32_t i = 0; i != solver.order_heap.size(); i++) { - Var var = solver.order_heap[(i+startFrom)%solver.order_heap.size()]; - if (solver.propagations - origProps + extraTime > MAX_REMOVE_BIN_FULL_PROPS) break; - if (solver.assigns[var] != l_Undef || !solver.decision_var[var]) continue; - - Lit lit(var, true); - if (!removeUselessBinaries(lit)) { - fixed = true; - solver.cancelUntil(0); - solver.uncheckedEnqueue(~lit); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) return false; - continue; - } - - lit = ~lit; - if (!removeUselessBinaries(lit)) { - fixed = true; - solver.cancelUntil(0); - solver.uncheckedEnqueue(~lit); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) return false; - continue; - } - } - - uint32_t removedUselessBin = onlyNonLearntBins.removeBins(); - - if (fixed) solver.order_heap.filter(Solver::VarFilter(solver)); - - if (solver.verbosity >= 1) { - std::cout - << "c Removed useless bin:" << std::setw(8) << removedUselessBin - << " fixed: " << std::setw(5) << (origHeapSize - solver.order_heap.size()) - << " props: " << std::fixed << std::setprecision(2) << std::setw(6) << (double)(solver.propagations - origProps)/1000000.0 << "M" - << " time: " << std::fixed << std::setprecision(2) << std::setw(5) << cpuTime() - myTime << " s" - << std::setw(16) << " |" << std::endl; - } - - return true; -} - -const bool UselessBinRemover::removeUselessBinaries(const Lit& lit) -{ - solver.newDecisionLevel(); - solver.uncheckedEnqueueLight(lit); - failed = !onlyNonLearntBins.propagateBinOneLevel(); - if (failed) return false; - bool ret = true; - - oneHopAway.clear(); - assert(solver.decisionLevel() > 0); - int c; - if (solver.trail.size()-solver.trail_lim[0] == 0) { - solver.cancelUntil(0); - goto end; - } - extraTime += (solver.trail.size() - solver.trail_lim[0]) / EXTRATIME_DIVIDER; - for (c = solver.trail.size()-1; c > (int)solver.trail_lim[0]; c--) { - Lit x = solver.trail[c]; - toDeleteSet[x.toInt()] = true; - oneHopAway.push(x); - solver.assigns[x.var()] = l_Undef; - } - solver.assigns[solver.trail[c].var()] = l_Undef; - - solver.qhead = solver.trail_lim[0]; - solver.trail.shrink_(solver.trail.size() - solver.trail_lim[0]); - solver.trail_lim.clear(); - //solver.cancelUntil(0); - - wrong.clear(); - for(uint32_t i = 0; i < oneHopAway.size(); i++) { - //no need to visit it if it already queued for removal - //basically, we check if it's in 'wrong' - if (toDeleteSet[oneHopAway[i].toInt()]) { - if (!fillBinImpliesMinusLast(lit, oneHopAway[i], wrong)) { - ret = false; - goto end; - } - } - } - - for (uint32_t i = 0; i < wrong.size(); i++) { - removeBin(~lit, wrong[i]); - } - - end: - for(uint32_t i = 0; i < oneHopAway.size(); i++) { - toDeleteSet[oneHopAway[i].toInt()] = false; - } - - return ret; -} - -void UselessBinRemover::removeBin(const Lit& lit1, const Lit& lit2) -{ - /******************* - Lit litFind1 = lit_Undef; - Lit litFind2 = lit_Undef; - - if (solver.binwatches[(~lit1).toInt()].size() < solver.binwatches[(~lit2).toInt()].size()) { - litFind1 = lit1; - litFind2 = lit2; - } else { - litFind1 = lit2; - litFind2 = lit1; - } - ********************/ - - //Find AND remove from watches - #ifdef VERBOSE_DEBUG - std::cout << "Removing useless bin: "; - lit1.print(); lit2.printFull(); - #endif //VERBOSE_DEBUG - - solver.removeWatchedBinClAll(solver.binwatches[(~lit1).toInt()], lit2); - solver.removeWatchedBinClAll(solver.binwatches[(~lit2).toInt()], lit1); - onlyNonLearntBins.removeBin(lit1, lit2); -} - -const bool UselessBinRemover::fillBinImpliesMinusLast(const Lit& origLit, const Lit& lit, vec& wrong) -{ - solver.newDecisionLevel(); - solver.uncheckedEnqueueLight(lit); - //if it's a cycle, it doesn't work, so don't propagate origLit - failed = !onlyNonLearntBins.propagateBinExcept(origLit); - if (failed) return false; - - assert(solver.decisionLevel() > 0); - int c; - extraTime += (solver.trail.size() - solver.trail_lim[0]) / EXTRATIME_DIVIDER; - for (c = solver.trail.size()-1; c > (int)solver.trail_lim[0]; c--) { - Lit x = solver.trail[c]; - if (toDeleteSet[x.toInt()]) { - wrong.push(x); - toDeleteSet[x.toInt()] = false; - }; - solver.assigns[x.var()] = l_Undef; - } - solver.assigns[solver.trail[c].var()] = l_Undef; - - solver.qhead = solver.trail_lim[0]; - solver.trail.shrink_(solver.trail.size() - solver.trail_lim[0]); - solver.trail_lim.clear(); - //solver.cancelUntil(0); - - return true; -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/UselessBinRemover.h b/src/vendor/stp/src/sat/cryptominisat2/UselessBinRemover.h deleted file mode 100644 index 771bd1b19..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/UselessBinRemover.h +++ /dev/null @@ -1,53 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef USELESSBINREMOVER_H -#define USELESSBINREMOVER_H - -#include "Vec.h" -#include "Solver.h" -#include "OnlyNonLearntBins.h" -#include - -namespace MINISAT -{ -using namespace MINISAT; - -class UselessBinRemover { - public: - UselessBinRemover(Solver& solver, OnlyNonLearntBins& onlyNonLearntBins); - const bool removeUslessBinFull(); - - private: - bool failed; - uint32_t extraTime; - - //Remove useless binaries - const bool fillBinImpliesMinusLast(const Lit& origLit, const Lit& lit, vec& wrong); - const bool removeUselessBinaries(const Lit& lit); - void removeBin(const Lit& lit1, const Lit& lit2); - vec toDeleteSet; - vec oneHopAway; - vec wrong; - - Solver& solver; - OnlyNonLearntBins& onlyNonLearntBins; -}; - -#endif //USELESSBINREMOVER_H - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/VERSION b/src/vendor/stp/src/sat/cryptominisat2/VERSION deleted file mode 100644 index 92f1ee215..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/VERSION +++ /dev/null @@ -1,2 +0,0 @@ -CryptoMiniSat -GIT revision: e540792aa3a01ec047b005b6351247fa87ae6eb6 diff --git a/src/vendor/stp/src/sat/cryptominisat2/VarReplacer.cpp b/src/vendor/stp/src/sat/cryptominisat2/VarReplacer.cpp deleted file mode 100644 index fd82cdefa..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/VarReplacer.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "VarReplacer.h" -#include -#include - -#include "ClauseCleaner.h" -#include "PartHandler.h" -#include "time_mem.h" - -//#define VERBOSE_DEBUG -//#define DEBUG_REPLACER -//#define REPLACE_STATISTICS - -#ifdef VERBOSE_DEBUG -#include -using std::cout; -using std::endl; -#endif - -namespace MINISAT -{ -using namespace MINISAT; - -VarReplacer::VarReplacer(Solver& _solver) : - replacedLits(0) - , replacedVars(0) - , lastReplacedVars(0) - , solver(_solver) -{ -} - -VarReplacer::~VarReplacer() -{ - for (uint i = 0; i != clauses.size(); i++) - solver.clauseAllocator.clauseFree(clauses[i]); -} - -const bool VarReplacer::performReplaceInternal() -{ - #ifdef VERBOSE_DEBUG - cout << "Replacer started." << endl; - #endif - double time = cpuTime(); - - #ifdef REPLACE_STATISTICS - uint numRedir = 0; - for (uint i = 0; i < table.size(); i++) { - if (table[i].var() != i) - numRedir++; - } - std::cout << "Number of trees:" << reverseTable.size() << std::endl; - std::cout << "Number of redirected nodes:" << numRedir << std::endl; - /*map >::iterator it = reverseTable.begin(); - map >::iterator end = reverseTable.end(); - for (;it != end; it++) { - std::cout << "Tree size: " << it->second.size() << std::endl; - }*/ - #endif //REPLACE_STATISTICS - - solver.clauseCleaner->removeAndCleanAll(true); - if (!solver.ok) return false; - solver.testAllClauseAttach(); - - #ifdef VERBOSE_DEBUG - { - uint i = 0; - for (vector::const_iterator it = table.begin(); it != table.end(); it++, i++) { - if (it->var() == i) continue; - cout << "Replacing var " << i+1 << " with Lit " << (it->sign() ? "-" : "") << it->var()+1 << endl; - } - } - #endif - - Var var = 0; - const vec* removedVars = solver.doXorSubsumption ? &solver.xorSubsumer->getVarElimed() : NULL; - const vec* removedVars2 = solver.doPartHandler ? &solver.partHandler->getSavedState() : NULL; - const vec* removedVars3 = solver.doSubsumption ? &solver.subsumer->getVarElimed() : NULL; - for (vector::const_iterator it = table.begin(); it != table.end(); it++, var++) { - if (it->var() == var - || (removedVars != NULL && (*removedVars)[it->var()]) - || (removedVars2 != NULL && (*removedVars2)[it->var()] != l_Undef) - || (removedVars3!= NULL && (*removedVars3)[it->var()]) - ) continue; - #ifdef VERBOSE_DEBUG - cout << "Setting var " << var+1 << " to a non-decision var" << endl; - #endif - bool wasDecisionVar = solver.decision_var[var]; - solver.setDecisionVar(var, false); - solver.setDecisionVar(it->var(), true); - - uint32_t& activity1 = solver.activity[var]; - uint32_t& activity2 = solver.activity[it->var()]; - if (wasDecisionVar && activity1 > activity2) { - activity2 = activity1; - solver.order_heap.update(it->var()); - solver.polarity[it->var()] = solver.polarity[var]^it->sign(); - } - - activity1 = 0.0; - solver.order_heap.update(var); - } - assert(solver.order_heap.heapProperty()); - - if (solver.verbosity >= 2) - std::cout << "c | Replacing " << std::setw(8) << replacedVars-lastReplacedVars << " vars" << std::flush; - - lastReplacedVars = replacedVars; - - solver.testAllClauseAttach(); - if (!replace_set(solver.binaryClauses, true)) goto end; - if (!replace_set(solver.clauses, false)) goto end; - if (!replace_set(solver.learnts, false)) goto end; - if (!replace_set(solver.xorclauses)) goto end; - solver.testAllClauseAttach(); - -end: - for (uint i = 0; i != clauses.size(); i++) - solver.removeClause(*clauses[i]); - clauses.clear(); - - if (solver.verbosity >= 2) { - std::cout << " Replaced " << std::setw(8) << replacedLits<< " lits" - << " Time: " << std::setw(8) << std::fixed << std::setprecision(2) << cpuTime()-time << " s " - << std::setw(10) << " |" << std::endl; - } - - replacedLits = 0; - - solver.order_heap.filter(Solver::VarFilter(solver)); - - return solver.ok; -} - -const bool VarReplacer::replace_set(vec& cs) -{ - XorClause **a = cs.getData(); - XorClause **r = a; - for (XorClause **end = a + cs.size(); r != end; r++) { - XorClause& c = **r; - - bool changed = false; - Var origVar1 = c[0].var(); - Var origVar2 = c[1].var(); - - for (Lit *l = &c[0], *end2 = l + c.size(); l != end2; l++) { - Lit newlit = table[l->var()]; - if (newlit.var() != l->var()) { - changed = true; - *l = Lit(newlit.var(), false); - c.invert(newlit.sign()); - c.setVarChanged(); - replacedLits++; - } - } - - if (changed && handleUpdatedClause(c, origVar1, origVar2)) { - if (!solver.ok) { - for(;r != end; r++) solver.clauseAllocator.clauseFree(*r); - cs.shrink(r-a); - return false; - } - c.setRemoved(); - solver.freeLater.push(&c); - } else { - *a++ = *r; - } - } - cs.shrink(r-a); - - return solver.ok; -} - -const bool VarReplacer::handleUpdatedClause(XorClause& c, const Var origVar1, const Var origVar2) -{ - uint origSize = c.size(); - std::sort(c.getData(), c.getDataEnd()); - Lit p; - uint32_t i, j; - for (i = j = 0, p = lit_Undef; i != c.size(); i++) { - if (c[i].var() == p.var()) { - //added, but easily removed - j--; - p = lit_Undef; - if (!solver.assigns[c[i].var()].isUndef()) - c.invert(solver.assigns[c[i].var()].getBool()); - } else if (solver.assigns[c[i].var()].isUndef()) //just add - c[j++] = p = c[i]; - else c.invert(solver.assigns[c[i].var()].getBool()); //modify xor_clause_inverted instead of adding - } - c.shrink(i - j); - - #ifdef VERBOSE_DEBUG - cout << "xor-clause after replacing: "; - c.plainPrint(); - #endif - - switch (c.size()) { - case 0: - solver.detachModifiedClause(origVar1, origVar2, origSize, &c); - if (!c.xor_clause_inverted()) - solver.ok = false; - return true; - case 1: - solver.detachModifiedClause(origVar1, origVar2, origSize, &c); - solver.uncheckedEnqueue(Lit(c[0].var(), c.xor_clause_inverted())); - solver.ok = (solver.propagate().isNULL()); - return true; - case 2: { - solver.detachModifiedClause(origVar1, origVar2, origSize, &c); - c[0] = c[0].unsign(); - c[1] = c[1].unsign(); - addBinaryXorClause(c, c.xor_clause_inverted(), c.getGroup(), true); - return true; - } - default: - solver.detachModifiedClause(origVar1, origVar2, origSize, &c); - solver.attachClause(c); - return false; - } - - assert(false); - return false; -} - -const bool VarReplacer::replace_set(vec& cs, const bool binClauses) -{ - Clause **a = cs.getData(); - Clause **r = a; - for (Clause **end = a + cs.size(); r != end; r++) { - Clause& c = **r; - bool changed = false; - Lit origLit1 = c[0]; - Lit origLit2 = c[1]; - for (Lit *l = c.getData(), *end2 = l + c.size(); l != end2; l++) { - if (table[l->var()].var() != l->var()) { - changed = true; - *l = table[l->var()] ^ l->sign(); - c.setVarChanged(); - replacedLits++; - } - } - - if (changed && handleUpdatedClause(c, origLit1, origLit2)) { - if (!solver.ok) { - for(;r != end; r++) solver.clauseAllocator.clauseFree(*r); - cs.shrink(r-a); - return false; - } - } else { - if (!binClauses && c.size() == 2) { - solver.detachClause(c); - Clause *c2 = solver.clauseAllocator.Clause_new(c); - solver.clauseAllocator.clauseFree(&c); - solver.attachClause(*c2); - solver.becameBinary++; - solver.binaryClauses.push(c2); - } else - *a++ = *r; - } - } - cs.shrink(r-a); - - return solver.ok; -} - -const bool VarReplacer::handleUpdatedClause(Clause& c, const Lit origLit1, const Lit origLit2) -{ - bool satisfied = false; - std::sort(c.getData(), c.getData() + c.size()); - Lit p; - uint32_t i, j; - const uint origSize = c.size(); - for (i = j = 0, p = lit_Undef; i != origSize; i++) { - if (solver.value(c[i]) == l_True || c[i] == ~p) { - satisfied = true; - break; - } - else if (solver.value(c[i]) != l_False && c[i] != p) - c[j++] = p = c[i]; - } - c.shrink(i - j); - - if (satisfied) { - solver.detachModifiedClause(origLit1, origLit2, origSize, &c); - return true; - } - - switch(c.size()) { - case 0: - solver.detachModifiedClause(origLit1, origLit2, origSize, &c); - solver.ok = false; - return true; - case 1 : - solver.detachModifiedClause(origLit1, origLit2, origSize, &c); - solver.uncheckedEnqueue(c[0]); - solver.ok = (solver.propagate().isNULL()); - return true; - default: - solver.detachModifiedClause(origLit1, origLit2, origSize, &c); - solver.attachClause(c); - - return false; - } - - assert(false); - return false; -} - -const vector VarReplacer::getReplacingVars() const -{ - vector replacingVars; - - for(map >::const_iterator it = reverseTable.begin(), end = reverseTable.end(); it != end; it++) { - replacingVars.push_back(it->first); - } - - return replacingVars; -} - -void VarReplacer::extendModelPossible() const -{ - #ifdef VERBOSE_DEBUG - std::cout << "extendModelPossible() called" << std::endl; - #endif //VERBOSE_DEBUG - uint i = 0; - for (vector::const_iterator it = table.begin(); it != table.end(); it++, i++) { - if (it->var() == i) continue; - - #ifdef VERBOSE_DEBUG - cout << "Extending model: var "; solver.printLit(Lit(i, false)); - cout << " to "; solver.printLit(*it); - cout << endl; - #endif - - if (solver.assigns[it->var()] != l_Undef) { - if (solver.assigns[i] == l_Undef) { - bool val = (solver.assigns[it->var()] == l_False); - solver.uncheckedEnqueue(Lit(i, val ^ it->sign())); - } else { - assert(solver.assigns[i].getBool() == (solver.assigns[it->var()].getBool() ^ it->sign())); - } - } - solver.ok = (solver.propagate().isNULL()); - assert(solver.ok); - } -} - -void VarReplacer::extendModelImpossible(Solver& solver2) const -{ - - #ifdef VERBOSE_DEBUG - std::cout << "extendModelImpossible() called" << std::endl; - #endif //VERBOSE_DEBUG - - vec tmpClause; - uint i = 0; - for (vector::const_iterator it = table.begin(); it != table.end(); it++, i++) { - if (it->var() == i) continue; - if (solver.assigns[it->var()] == l_Undef) { - assert(solver.assigns[it->var()] == l_Undef); - assert(solver.assigns[i] == l_Undef); - - tmpClause.clear(); - tmpClause.push(Lit(it->var(), true)); - tmpClause.push(Lit(i, it->sign())); - solver2.addClause(tmpClause); - assert(solver2.ok); - - tmpClause.clear(); - tmpClause.push(Lit(it->var(), false)); - tmpClause.push(Lit(i, it->sign()^true)); - solver2.addClause(tmpClause); - assert(solver2.ok); - } - } -} - -template -const bool VarReplacer::replace(T& ps, const bool xor_clause_inverted, const uint group) -{ - #ifdef VERBOSE_DEBUG - std::cout << "replace() called with var " << ps[0].var()+1 << " and var " << ps[1].var()+1 << " with xor_clause_inverted " << xor_clause_inverted << std::endl; - #endif - - assert(ps.size() == 2); - assert(!ps[0].sign()); - assert(!ps[1].sign()); - #ifdef DEBUG_REPLACER - assert(solver.assigns[ps[0].var()].isUndef()); - assert(solver.assigns[ps[1].var()].isUndef()); - #endif - - - Var var = ps[0].var(); - Lit lit = Lit(ps[1].var(), !xor_clause_inverted); - assert(var != lit.var()); - - //Detect circle - if (alreadyIn(var, lit)) return solver.ok; - - Lit lit1 = table[var]; - bool inverted = false; - - //This pointer is already set, try to invert - if (lit1.var() != var) { - Var tmp_var = var; - - var = lit.var(); - lit = Lit(tmp_var, lit.sign()); - inverted = true; - } - - if (inverted) { - Lit lit2 = table[var]; - - //Inversion is also set, triangular cycle - //A->B, A->C, B->C. There is nothing to add - if (lit1.var() == lit2.var()) { - if ((lit1.sign() ^ lit2.sign()) != lit.sign()) { - #ifdef VERBOSE_DEBUG - cout << "Inverted cycle in var-replacement -> UNSAT" << endl; - #endif - return (solver.ok = false); - } - return true; - } - - //Inversion is also set - if (lit2.var() != var) { - assert(table[lit1.var()].var() == lit1.var()); - setAllThatPointsHereTo(lit1.var(), Lit(lit.var(), lit1.sign())); - - assert(table[lit2.var()].var() == lit2.var()); - setAllThatPointsHereTo(lit2.var(), lit ^ lit2.sign()); - - table[lit.var()] = Lit(lit.var(), false); - replacedVars++; - addBinaryXorClause(ps, xor_clause_inverted, group); - return true; - } - } - - //Follow forwards - Lit litX = table[lit.var()]; - if (litX.var() != lit.var()) - lit = litX ^ lit.sign(); - - //Follow backwards - setAllThatPointsHereTo(var, lit); - replacedVars++; - addBinaryXorClause(ps, xor_clause_inverted, group); - - return true; -} - -template const bool VarReplacer::replace(vec& ps, const bool xor_clause_inverted, const uint group); -template const bool VarReplacer::replace(XorClause& ps, const bool xor_clause_inverted, const uint group); - -template -void VarReplacer::addBinaryXorClause(T& ps, const bool xor_clause_inverted, const uint group, const bool internal) -{ - assert(internal || (replacedVars > lastReplacedVars)); - #ifdef DEBUG_REPLACER - assert(!ps[0].sign()); - assert(!ps[1].sign()); - #endif - - Clause* c; - ps[0] ^= xor_clause_inverted; - - c = solver.clauseAllocator.Clause_new(ps, group, false); - if (internal) { - solver.binaryClauses.push(c); - solver.becameBinary++; - } else - clauses.push(c); - solver.attachClause(*c); - - ps[0] ^= true; - ps[1] ^= true; - c = solver.clauseAllocator.Clause_new(ps, group, false); - if (internal) { - solver.binaryClauses.push(c); - solver.becameBinary++; - } else - clauses.push(c); - solver.attachClause(*c); -} - -template void VarReplacer::addBinaryXorClause(vec& ps, const bool xor_clause_inverted, const uint group, const bool internal); -template void VarReplacer::addBinaryXorClause(XorClause& ps, const bool xor_clause_inverted, const uint group, const bool internal); - -bool VarReplacer::alreadyIn(const Var var, const Lit lit) -{ - Lit lit2 = table[var]; - if (lit2.var() == lit.var()) { - if (lit2.sign() != lit.sign()) { - #ifdef VERBOSE_DEBUG - cout << "Inverted cycle in var-replacement -> UNSAT" << endl; - #endif - solver.ok = false; - } - return true; - } - - lit2 = table[lit.var()]; - if (lit2.var() == var) { - if (lit2.sign() != lit.sign()) { - #ifdef VERBOSE_DEBUG - cout << "Inverted cycle in var-replacement -> UNSAT" << endl; - #endif - solver.ok = false; - } - return true; - } - - return false; -} - -void VarReplacer::setAllThatPointsHereTo(const Var var, const Lit lit) -{ - map >::iterator it = reverseTable.find(var); - if (it != reverseTable.end()) { - for(vector::const_iterator it2 = it->second.begin(), end = it->second.end(); it2 != end; it2++) { - assert(table[*it2].var() == var); - if (lit.var() != *it2) { - table[*it2] = lit ^ table[*it2].sign(); - reverseTable[lit.var()].push_back(*it2); - } - } - reverseTable.erase(it); - } - table[var] = lit; - reverseTable[lit.var()].push_back(var); -} - -void VarReplacer::newVar() -{ - table.push_back(Lit(table.size(), false)); -} - -void VarReplacer::reattachInternalClauses() -{ - Clause **i = clauses.getData(); - Clause **j = i; - for (Clause **end = clauses.getDataEnd(); i != end; i++) { - if (solver.value((**i)[0]) == l_Undef && - solver.value((**i)[1]) == l_Undef) { - solver.attachClause(**i); - *j++ = *i; - } - } - clauses.shrink(i-j); -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/VarReplacer.h b/src/vendor/stp/src/sat/cryptominisat2/VarReplacer.h deleted file mode 100644 index 4d54d9d86..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/VarReplacer.h +++ /dev/null @@ -1,157 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef VARREPLACER_H -#define VARREPLACER_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include -#include -using std::map; -using std::vector; - -#include "Solver.h" -#include "SolverTypes.h" -#include "Clause.h" -#include "Vec.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class VarReplacer -{ - public: - VarReplacer(Solver& solver); - ~VarReplacer(); - const bool performReplace(const bool always = false); - const bool needsReplace(); - template - const bool replace(T& ps, const bool xor_clause_inverted, const uint group); - - void extendModelPossible() const; - void extendModelImpossible(Solver& solver2) const; - void reattachInternalClauses(); - - const uint getNumReplacedLits() const; - const uint getNumReplacedVars() const; - const uint getNumLastReplacedVars() const; - const uint getNewToReplaceVars() const; - const uint32_t getNumTrees() const; - const vector getReplacingVars() const; - const vector& getReplaceTable() const; - const vec& getClauses() const; - const bool varHasBeenReplaced(const Var var) const; - const bool replacingVar(const Var var) const; - void newVar(); - - //No need to update, only stores binary clauses, that - //have been allocated within pool - //friend class ClauseAllocator; - - private: - const bool performReplaceInternal(); - - const bool replace_set(vec& cs, const bool binClauses); - const bool replace_set(vec& cs); - const bool handleUpdatedClause(Clause& c, const Lit origLit1, const Lit origLit2); - const bool handleUpdatedClause(XorClause& c, const Var origVar1, const Var origVar2); - template - void addBinaryXorClause(T& ps, const bool xor_clause_inverted, const uint group, const bool internal = false); - - void setAllThatPointsHereTo(const Var var, const Lit lit); - bool alreadyIn(const Var var, const Lit lit); - - vector table; - map > reverseTable; - vec clauses; - - uint replacedLits; - uint replacedVars; - uint lastReplacedVars; - Solver& solver; -}; - -inline const bool VarReplacer::performReplace(const bool always) -{ - //uint32_t limit = std::min((uint32_t)((double)solver.order_heap.size()*PERCENTAGEPERFORMREPLACE), FIXCLEANREPLACE); - uint32_t limit = (uint32_t)((double)solver.order_heap.size()*PERCENTAGEPERFORMREPLACE); - if ((always && getNewToReplaceVars() > 0) || getNewToReplaceVars() > limit) - return performReplaceInternal(); - - return true; -} - -inline const bool VarReplacer::needsReplace() -{ - uint32_t limit = (uint32_t)((double)solver.order_heap.size()*PERCENTAGEPERFORMREPLACE); - return (getNewToReplaceVars() > limit); -} - -inline const uint VarReplacer::getNumReplacedLits() const -{ - return replacedLits; -} - -inline const uint VarReplacer::getNumReplacedVars() const -{ - return replacedVars; -} - -inline const uint VarReplacer::getNumLastReplacedVars() const -{ - return lastReplacedVars; -} - -inline const uint VarReplacer::getNewToReplaceVars() const -{ - return replacedVars-lastReplacedVars; -} - -inline const vector& VarReplacer::getReplaceTable() const -{ - return table; -} - -inline const vec& VarReplacer::getClauses() const -{ - return clauses; -} - -inline const bool VarReplacer::varHasBeenReplaced(const Var var) const -{ - return table[var].var() != var; -} - -inline const bool VarReplacer::replacingVar(const Var var) const -{ - return (reverseTable.find(var) != reverseTable.end()); -} - -inline const uint32_t VarReplacer::getNumTrees() const -{ - return reverseTable.size(); -} - -}; //NAMESPACE MINISAT - -#endif //VARREPLACER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/XSet.h b/src/vendor/stp/src/sat/cryptominisat2/XSet.h deleted file mode 100644 index 13fb3154f..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/XSet.h +++ /dev/null @@ -1,136 +0,0 @@ -/************************************************************************************************** -From: Solver.C -- (C) Niklas Een, Niklas Sorensson, 2004 -**************************************************************************************************/ - -#ifndef XSET_H -#define XSET_H - -#include "Vec.h" -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -namespace MINISAT -{ -using namespace MINISAT; - -class XorClause; - -template -uint32_t calcXorAbstraction(const T& ps) { - uint32_t abstraction = 0; - for (uint32_t i = 0; i != ps.size(); i++) - abstraction |= 1 << (ps[i].var() & 31); - return abstraction; -} - -//#pragma pack(push) -//#pragma pack(1) -class XorClauseSimp -{ - public: - XorClauseSimp(XorClause* c, const uint32_t _index) : - clause(c) - , index(_index) - {} - - XorClause* clause; - uint32_t index; -}; -//#pragma pack(pop) - -class XSet { - vec where; // Map clause ID to position in 'which'. - vec which; // List of clauses (for fast iteration). May contain 'Clause_NULL'. - vec free; // List of positions holding 'Clause_NULL'. - - public: - //XorClauseSimp& operator [] (uint32_t index) { return which[index]; } - void reserve(uint32_t size) { where.reserve(size);} - uint32_t size(void) const { return which.size(); } - uint32_t nElems(void) const { return which.size() - free.size(); } - - bool add(const XorClauseSimp& c) { - assert(c.clause != NULL); - where.growTo(c.index+1, std::numeric_limits::max()); - if (where[c.index] != std::numeric_limits::max()) { - return true; - } - if (free.size() > 0){ - where[c.index] = free.last(); - which[free.last()] = c; - free.pop(); - }else{ - where[c.index] = which.size(); - which.push(c); - } - return false; - } - - bool exclude(const XorClauseSimp& c) { - assert(c.clause != NULL); - if (c.index >= where.size() || where[c.index] == std::numeric_limits::max()) { - //not inside - return false; - } - free.push(where[c.index]); - which[where[c.index]].clause = NULL; - where[c.index] = std::numeric_limits::max(); - return true; - } - - void clear(void) { - for (uint32_t i = 0; i < which.size(); i++) { - if (which[i].clause != NULL) { - where[which[i].index] = std::numeric_limits::max(); - } - } - which.clear(); - free.clear(); - } - - class iterator - { - public: - iterator(XorClauseSimp* _it) : - it(_it) - {} - - void operator++() - { - it++; - } - - const bool operator!=(const iterator& iter) const - { - return (it != iter.it);; - } - - XorClauseSimp& operator*() { - return *it; - } - - XorClauseSimp*& operator->() { - return it; - } - private: - XorClauseSimp* it; - }; - - iterator begin() - { - return iterator(which.getData()); - } - - iterator end() - { - return iterator(which.getData() + which.size()); - } -}; - -}; //NAMESPACE MINISAT - -#endif //XSET_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/XorFinder.cpp b/src/vendor/stp/src/sat/cryptominisat2/XorFinder.cpp deleted file mode 100644 index 13c1e6537..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/XorFinder.cpp +++ /dev/null @@ -1,497 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#include "XorFinder.h" - -#include -#include -#include -#include "Solver.h" -#include "VarReplacer.h" -#include "ClauseCleaner.h" -#include "time_mem.h" - -//#define VERBOSE_DEBUG -#ifdef _MSC_VER -#define __builtin_prefetch(a,b) -#endif //_MSC_VER - -#ifdef VERBOSE_DEBUG -#include -using std::cout; -using std::endl; -#endif - -namespace MINISAT -{ -using namespace MINISAT; - -using std::make_pair; - -XorFinder::XorFinder(Solver& _solver, vec& _cls, ClauseCleaner::ClauseSetType _type) : - cls(_cls) - , type(_type) - , solver(_solver) -{ -} - -const bool XorFinder::doNoPart(const uint minSize, const uint maxSize) -{ - uint sumLengths = 0; - double time = cpuTime(); - foundXors = 0; - solver.clauseCleaner->cleanClauses(solver.clauses, ClauseCleaner::clauses); - if (type == ClauseCleaner::binaryClauses) { - solver.clauseCleaner->cleanClauses(solver.binaryClauses, ClauseCleaner::binaryClauses); - } - if (!solver.ok) return false; - - toRemove.clear(); - toRemove.resize(cls.size(), false); - toLeaveInPlace.clear(); - toLeaveInPlace.resize(cls.size(), false); - - table.clear(); - table.reserve(cls.size()); - - ClauseTable unsortedTable; - unsortedTable.reserve(cls.size()); - ClauseTable sortedTable; - sortedTable.reserve(cls.size()); - - for (Clause **it = cls.getData(), **end = it + cls.size(); it != end; it ++) { - if (it+1 != end) - __builtin_prefetch(*(it+1), 0); - //if ((**it)[0].toInt() < (**it)[1].toInt()) - // std::swap((**it)[0], (**it)[1]); - Clause& c = (**it); - if ((*it)->size() != 2) { - bool sorted = true; - for (uint i = 0, size = c.size(); i+1 < size ; i++) { - sorted = (c[i].var() <= c[i+1].var()); - if (!sorted) break; - } - if (!sorted) { - solver.detachClause(c); - std::sort(c.getData(), c.getDataEnd()); - solver.attachClause(c); - } - } else { - std::sort(c.getData(), c.getData()+c.size()); - } - } - - uint i = 0; - for (Clause **it = cls.getData(), **end = it + cls.size(); it != end; it++, i++) { - const uint size = (*it)->size(); - if ( size > maxSize || size < minSize) { - toLeaveInPlace[i] = true; - continue; - } - if ((*it)->getSorted()) sortedTable.push_back(make_pair(*it, i)); - else unsortedTable.push_back(make_pair(*it, i)); - } - - clause_sorter_primary sorter; - - std::sort(unsortedTable.begin(), unsortedTable.end(), clause_sorter_primary()); - //std::sort(sortedTable.begin(), sortedTable.end(), clause_sorter_primary()); - #ifdef DEBUG_XORFIND - for (uint i = 0; i+1 < unsortedTable.size(); i++) { - assert(!sorter(unsortedTable[i+1], unsortedTable[i])); - } - for (uint i = 0; i+1 < sortedTable.size(); i++) { - assert(!sorter(sortedTable[i+1], sortedTable[i])); - } - #endif //DEBUG_XORFIND - - for (uint i = 0, j = 0; i < unsortedTable.size() || j < sortedTable.size();) { - if (j == sortedTable.size()) { - table.push_back(unsortedTable[i++]); - continue; - } - if (i == unsortedTable.size()) { - table.push_back(sortedTable[j++]); - continue; - } - if (sorter(unsortedTable[i], sortedTable[j])) { - table.push_back(unsortedTable[i++]); - } else { - table.push_back(sortedTable[j++]); - } - } - #ifdef DEBUG_XORFIND - for (uint i = 0; i+1 < table.size(); i++) { - assert(!sorter(table[i+1], table[i])); - //table[i].first->plainPrint(); - } - #endif //DEBUG_XORFIND - - if (findXors(sumLengths) == false) goto end; - solver.ok = (solver.propagate().isNULL()); - -end: - if (minSize == maxSize && minSize == 2) { - if (solver.verbosity >= 2 || (solver.conflicts == 0 && solver.verbosity >= 1)) { - printf("c | Finding binary XORs: %5.2lf s (found: %7d, avg size: %3.1lf) |\n", cpuTime()-time, foundXors, (double)sumLengths/(double)foundXors); - } - } else { - if (solver.verbosity >= 2 || (solver.verbosity >= 1 && foundXors > 0)) { - printf("c | Finding non-binary XORs: %5.2lf s (found: %7d, avg size: %3.1lf) |\n", cpuTime()-time, foundXors, (double)sumLengths/(double)foundXors); - } - } - - i = 0; - uint32_t j = 0; - uint32_t toSkip = 0; - for (uint end = cls.size(); i != end; i++) { - if (toLeaveInPlace[i]) { - cls[j] = cls[i]; - j++; - toSkip++; - continue; - } - if (!toRemove[table[i-toSkip].second]) { - table[i-toSkip].first->setSorted(); - cls[j] = table[i-toSkip].first; - j++; - } - } - cls.shrink(i-j); - - return solver.ok; -} - -const bool XorFinder::findXors(uint& sumLengths) -{ - #ifdef VERBOSE_DEBUG - cout << "Finding Xors started" << endl; - #endif - - sumLengths = 0; - - ClauseTable::iterator begin = table.begin(); - ClauseTable::iterator end = table.begin(); - vec lits; - bool impair; - while (getNextXor(begin, end, impair)) { - const Clause& c = *(begin->first); - lits.clear(); - for (const Lit *it = &c[0], *cend = it+c.size() ; it != cend; it++) { - lits.push(Lit(it->var(), false)); - } - uint old_group = c.getGroup(); - - #ifdef VERBOSE_DEBUG - cout << "- Found clauses:" << endl; - #endif - - for (ClauseTable::iterator it = begin; it != end; it++) - if (impairSigns(*it->first) == impair){ - #ifdef VERBOSE_DEBUG - it->first->plainPrint(); - #endif - toRemove[it->second] = true; - solver.removeClause(*it->first); - } - - switch(lits.size()) { - case 2: { - solver.varReplacer->replace(lits, impair, old_group); - - #ifdef VERBOSE_DEBUG - XorClause* x = XorClause_new(lits, impair, old_group); - cout << "- Final 2-long xor-clause: "; - x->plainPrint(); - clauseFree(x); - #endif - break; - } - default: { - XorClause* x = solver.clauseAllocator.XorClause_new(lits, impair, old_group); - solver.xorclauses.push(x); - solver.attachClause(*x); - - #ifdef VERBOSE_DEBUG - cout << "- Final xor-clause: "; - x->plainPrint(); - #endif - } - } - - foundXors++; - sumLengths += lits.size(); - } - - return solver.ok; -} - -void XorFinder::clearToRemove() -{ - assert(toRemove.size() == cls.size()); - - Clause **a = cls.getData(); - Clause **r = cls.getData(); - Clause **cend = cls.getData() + cls.size(); - for (uint i = 0; r != cend; i++) { - if (!toRemove[i]) - *a++ = *r++; - else - r++; - } - cls.shrink(r-a); -} - -bool XorFinder::getNextXor(ClauseTable::iterator& begin, ClauseTable::iterator& end, bool& impair) -{ - ClauseTable::iterator tableEnd = table.end(); - - while(begin != tableEnd && end != tableEnd) { - begin = end; - end++; - uint32_t size = (end == tableEnd ? 0:1); - while(end != tableEnd && clause_vareq(begin->first, end->first)) { - size++; - end++; - } - if (size > 0 && isXor(size, begin, end, impair)) - return true; - } - - return false; -} - -bool XorFinder::clauseEqual(const Clause& c1, const Clause& c2) const -{ - assert(c1.size() == c2.size()); - for (uint i = 0, size = c1.size(); i < size; i++) - if (c1[i].sign() != c2[i].sign()) return false; - - return true; -} - -bool XorFinder::impairSigns(const Clause& c) const -{ - uint num = 0; - for (const Lit *it = &c[0], *end = it + c.size(); it != end; it++) - num += it->sign(); - - return num % 2; -} - -bool XorFinder::isXor(const uint32_t size, const ClauseTable::iterator& begin, const ClauseTable::iterator& end, bool& impair) -{ - const uint requiredSize = 1 << (begin->first->size()-1); - - if (size < requiredSize) - return false; - - #ifdef DEBUG_XORFIND2 - { - vec vars; - Clause& c = *begin->first; - for (uint i = 0; i < c.size(); i++) - vars.push(c[i].var()); - for (ClauseTable::iterator it = begin; it != end; it++) { - Clause& c = *it->first; - for (uint i = 0; i < c.size(); i++) - assert(vars[i] == c[i].var()); - } - clause_sorter_primary sorter; - - for (ClauseTable::iterator it = begin; it != end; it++) { - ClauseTable::iterator it2 = it; - it2++; - if (it2 == end) break; - assert(!sorter(*it2, *it)); - } - } - #endif //DEBUG_XORFIND - - std::sort(begin, end, clause_sorter_secondary()); - - uint numPair = 0; - uint numImpair = 0; - countImpairs(begin, end, numImpair, numPair); - - if (numImpair == requiredSize) { - impair = true; - - return true; - } - - if (numPair == requiredSize) { - impair = false; - - return true; - } - - return false; -} - -void XorFinder::countImpairs(const ClauseTable::iterator& begin, const ClauseTable::iterator& end, uint& numImpair, uint& numPair) const -{ - numImpair = 0; - numPair = 0; - - ClauseTable::const_iterator it = begin; - ClauseTable::const_iterator it2 = begin; - it2++; - - bool impair = impairSigns(*it->first); - numImpair += impair; - numPair += !impair; - - for (; it2 != end;) { - if (!clauseEqual(*it->first, *it2->first)) { - bool impair = impairSigns(*it2->first); - numImpair += impair; - numPair += !impair; - } - it++; - it2++; - } -} - -void XorFinder::addAllXorAsNorm() -{ - uint32_t added = 0; - XorClause **i = solver.xorclauses.getData(), **j = i; - for (XorClause **end = solver.xorclauses.getDataEnd(); i != end; i++) { - if ((*i)->size() > 3) { - *j++ = *i; - continue; - } - added++; - if ((*i)->size() == 3) addXorAsNormal3(**i); - //if ((*i)->size() == 4) addXorAsNormal4(**i); - solver.removeClause(**i); - } - solver.xorclauses.shrink(i-j); - if (solver.verbosity >= 1) { - std::cout << "c | Added XOR as norm:" << added << std::endl; - } -} - -void XorFinder::addXorAsNormal3(XorClause& c) -{ - assert(c.size() == 3); - Clause *tmp; - vec vars; - vec vars2(c.size()); - const bool inverted = c.xor_clause_inverted(); - - for (uint32_t i = 0; i < c.size(); i++) { - vars.push(c[i].var()); - } - - vars2[0] = Lit(vars[0], false ^ inverted); - vars2[1] = Lit(vars[1], false ^ inverted); - vars2[2] = Lit(vars[2], false ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], true ^ inverted); - vars2[1] = Lit(vars[1], true ^ inverted); - vars2[2] = Lit(vars[2], false ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], true ^ inverted); - vars2[1] = Lit(vars[1], false ^ inverted); - vars2[2] = Lit(vars[2], true ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], false ^ inverted); - vars2[1] = Lit(vars[1], true ^ inverted); - vars2[2] = Lit(vars[2], true ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); -} - -void XorFinder::addXorAsNormal4(XorClause& c) -{ - assert(c.size() == 4); - Clause *tmp; - vec vars; - vec vars2(c.size()); - const bool inverted = !c.xor_clause_inverted(); - - for (uint32_t i = 0; i < c.size(); i++) { - vars.push(c[i].var()); - } - - vars2[0] = Lit(vars[0], false ^ inverted); - vars2[1] = Lit(vars[1], false ^ inverted); - vars2[2] = Lit(vars[2], false ^ inverted); - vars2[3] = Lit(vars[3], true ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], false ^ inverted); - vars2[1] = Lit(vars[1], true ^ inverted); - vars2[2] = Lit(vars[2], false ^ inverted); - vars2[3] = Lit(vars[3], false ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], false ^ inverted); - vars2[1] = Lit(vars[1], false ^ inverted); - vars2[2] = Lit(vars[2], true ^ inverted); - vars2[3] = Lit(vars[3], false ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], false ^ inverted); - vars2[1] = Lit(vars[1], false ^ inverted); - vars2[2] = Lit(vars[2], false ^ inverted); - vars2[3] = Lit(vars[3], true ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], false ^ inverted); - vars2[1] = Lit(vars[1], true ^ inverted); - vars2[2] = Lit(vars[2], true ^ inverted); - vars2[3] = Lit(vars[3], true ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], true ^ inverted); - vars2[1] = Lit(vars[1], false ^ inverted); - vars2[2] = Lit(vars[2], true ^ inverted); - vars2[3] = Lit(vars[3], true ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], true ^ inverted); - vars2[1] = Lit(vars[1], true ^ inverted); - vars2[2] = Lit(vars[2], false ^ inverted); - vars2[3] = Lit(vars[3], true ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); - - vars2[0] = Lit(vars[0], true ^ inverted); - vars2[1] = Lit(vars[1], true ^ inverted); - vars2[2] = Lit(vars[2], true ^ inverted); - vars2[3] = Lit(vars[3], false ^ inverted); - tmp = solver.addClauseInt(vars2, c.getGroup()); - if (tmp) solver.clauses.push(tmp); -} - - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/XorFinder.h b/src/vendor/stp/src/sat/cryptominisat2/XorFinder.h deleted file mode 100644 index 038afa07f..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/XorFinder.h +++ /dev/null @@ -1,147 +0,0 @@ -/*********************************************************************************** -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -**************************************************************************************************/ - -#ifndef XORFINDER_H -#define XORFINDER_H - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#define DEBUG_XORFIND -//#define DEBUG_XORFIND2 - -#include "Clause.h" -#include "VarReplacer.h" -#include "ClauseCleaner.h" - -class Solver; - -using std::pair; - -namespace MINISAT -{ -using namespace MINISAT; - -class XorFinder -{ - public: - - XorFinder(Solver& _solver, vec& cls, ClauseCleaner::ClauseSetType _type); - const bool doNoPart(const uint minSize, const uint maxSize); - void addAllXorAsNorm(); - - private: - typedef vector > ClauseTable; - - const bool findXors(uint& sumLengths); - bool getNextXor(ClauseTable::iterator& begin, ClauseTable::iterator& end, bool& impair); - - struct clause_hasher { - size_t operator()(const Clause* c) const - { - size_t hash = 5381; - hash = ((hash << 5) + hash) ^ c->size(); - for (uint i = 0, size = c->size(); i < size; i++) - hash = ((hash << 5) + hash) ^ (*c)[i].var(); - - return hash; - } - }; - - struct clause_sorter_primary { - bool operator()(const pair& c11, const pair& c22) - { - if (c11.first->size() != c22.first->size()) - return (c11.first->size() < c22.first->size()); - - #ifdef DEBUG_XORFIND2 - Clause& c1 = *c11.first; - for (uint i = 0; i+1 < c1.size(); i++) - assert(c1[i].var() <= c1[i+1].var()); - - Clause& c2 = *c22.first; - for (uint i = 0; i+1 < c2.size(); i++) - assert(c2[i].var() <= c2[i+1].var()); - #endif //DEBUG_XORFIND2 - - for (a = c11.first->getData(), b = c22.first->getData(), end = a + c11.first->size(); a != end; a++, b++) { - if (a->var() != b->var()) - return (a->var() > b->var()); - } - - return false; - } - - Lit const *a; - Lit const *b; - Lit const *end; - }; - - struct clause_sorter_secondary { - bool operator()(const pair& c11, const pair& c22) const - { - const Clause& c1 = *(c11.first); - const Clause& c2 = *(c22.first); - - for (uint i = 0, size = c1.size(); i < size; i++) { - if (c1[i].sign() != c2[i].sign()) - return c1[i].sign(); - } - - return false; - } - }; - - bool clause_vareq(const Clause* c1, const Clause* c2) const - { - if (c1->size() != c2->size()) - return false; - - for (uint i = 0, size = c1->size(); i < size; i++) - if ((*c1)[i].var() != (*c2)[i].var()) - return false; - - return true; - } - - ClauseTable table; - vector toRemove; - vector toLeaveInPlace; - void clearToRemove(); - uint32_t foundXors; - - //For adding xor as norm - void addXorAsNormal3(XorClause& c); - void addXorAsNormal4(XorClause& c); - - vec& cls; - ClauseCleaner::ClauseSetType type; - - bool clauseEqual(const Clause& c1, const Clause& c2) const; - bool impairSigns(const Clause& c) const; - void countImpairs(const ClauseTable::iterator& begin, const ClauseTable::iterator& end, uint& numImpair, uint& numPair) const; - bool isXor(const uint32_t size, const ClauseTable::iterator& begin, const ClauseTable::iterator& end, bool& impair); - - Solver& solver; -}; - -}; //NAMESPACE MINISAT - -#endif //XORFINDER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/XorSubsumer.cpp b/src/vendor/stp/src/sat/cryptominisat2/XorSubsumer.cpp deleted file mode 100644 index dc5c4fbbe..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/XorSubsumer.cpp +++ /dev/null @@ -1,594 +0,0 @@ -/************************************************************************************************** -Originally From: Solver.C -- (C) Niklas Een, Niklas Sorensson, 2004 -Substantially modified by: Mate Soos (2010) -**************************************************************************************************/ - -#include "Solver.h" -#include "XorSubsumer.h" -#include "ClauseCleaner.h" -#include "time_mem.h" -#include "assert.h" -#include -#include "VarReplacer.h" - -#ifdef _MSC_VER -#define __builtin_prefetch(a,b,c) -#endif //_MSC_VER - -//#define VERBOSE_DEBUG -#ifdef VERBOSE_DEBUG -#define VERBOSE_DEBUGSUBSUME0 -#define BIT_MORE_VERBOSITY -#endif - -#ifdef VERBOSE_DEBUG -using std::cout; -using std::endl; -#endif //VERBOSE_DEBUG - -namespace MINISAT -{ -using namespace MINISAT; - -XorSubsumer::XorSubsumer(Solver& s): - solver(s) - , totalTime(0.0) - , numElimed(0) - , localSubstituteUseful(0) -{ -}; - -// Will put NULL in 'cs' if clause removed. -void XorSubsumer::subsume0(XorClauseSimp ps) -{ - #ifdef VERBOSE_DEBUGSUBSUME0 - cout << "subsume0 orig clause:"; - ps.clause->plainPrint(); - #endif - - vec unmatchedPart; - vec subs; - - findSubsumed(*ps.clause, subs); - for (uint32_t i = 0; i < subs.size(); i++){ - XorClause* tmp = subs[i].clause; - findUnMatched(*ps.clause, *tmp, unmatchedPart); - if (unmatchedPart.size() == 0) { - #ifdef VERBOSE_DEBUGSUBSUME0 - cout << "subsume0 removing:"; - subs[i].clause->plainPrint(); - #endif - clauses_subsumed++; - assert(tmp->size() == ps.clause->size()); - if (ps.clause->xor_clause_inverted() == tmp->xor_clause_inverted()) { - unlinkClause(subs[i]); - solver.clauseAllocator.clauseFree(tmp); - } else { - solver.ok = false; - return; - } - } else { - assert(unmatchedPart.size() > 0); - clauses_cut++; - #ifdef VERBOSE_DEBUG - std::cout << "Cutting xor-clause:"; - subs[i].clause->plainPrint(); - #endif //VERBOSE_DEBUG - XorClause *c = solver.addXorClauseInt(unmatchedPart, tmp->xor_clause_inverted() ^ !ps.clause->xor_clause_inverted(), tmp->getGroup()); - if (c != NULL) - linkInClause(*c); - unlinkClause(subs[i]); - if (!solver.ok) return; - } - unmatchedPart.clear(); - } -} - -template -void XorSubsumer::findUnMatched(const T& A, const T& B, vec& unmatchedPart) -{ - for (uint32_t i = 0; i != B.size(); i++) - seen_tmp[B[i].var()] = 1; - for (uint32_t i = 0; i != A.size(); i++) - seen_tmp[A[i].var()] = 0; - for (uint32_t i = 0; i != B.size(); i++) { - if (seen_tmp[B[i].var()] == 1) { - unmatchedPart.push(Lit(B[i].var(), false)); - seen_tmp[B[i].var()] = 0; - } - } -} - -void XorSubsumer::unlinkClause(XorClauseSimp c, const Var elim) -{ - XorClause& cl = *c.clause; - - for (uint32_t i = 0; i < cl.size(); i++) { - removeW(occur[cl[i].var()], &cl); - } - - if (elim != var_Undef) - elimedOutVar[elim].push_back(c.clause); - - solver.detachClause(cl); - - clauses[c.index].clause = NULL; -} - -void XorSubsumer::unlinkModifiedClause(vec& origClause, XorClauseSimp c) -{ - for (uint32_t i = 0; i < origClause.size(); i++) { - removeW(occur[origClause[i].var()], c.clause); - } - - solver.detachModifiedClause(origClause[0].var(), origClause[1].var(), origClause.size(), c.clause); - - clauses[c.index].clause = NULL; -} - -void XorSubsumer::unlinkModifiedClauseNoDetachNoNULL(vec& origClause, XorClauseSimp c) -{ - for (uint32_t i = 0; i < origClause.size(); i++) { - removeW(occur[origClause[i].var()], c.clause); - } -} - -XorClauseSimp XorSubsumer::linkInClause(XorClause& cl) -{ - XorClauseSimp c(&cl, clauseID++); - clauses.push(c); - for (uint32_t i = 0; i < cl.size(); i++) { - occur[cl[i].var()].push(c); - } - - return c; -} - -void XorSubsumer::linkInAlreadyClause(XorClauseSimp& c) -{ - XorClause& cl = *c.clause; - - for (uint32_t i = 0; i < c.clause->size(); i++) { - occur[cl[i].var()].push(c); - } -} - -void XorSubsumer::addFromSolver(vec& cs) -{ - clauseID = 0; - clauses.clear(); - XorClause **i = cs.getData(); - for (XorClause **end = i + cs.size(); i != end; i++) { - if (i+1 != end) - __builtin_prefetch(*(i+1), 1, 1); - - linkInClause(**i); - if ((*i)->getVarChanged() || (*i)->getStrenghtened()) - (*i)->calcXorAbstraction(); - } - cs.clear(); - cs.push(NULL); //HACK --to force xor-propagation -} - -void XorSubsumer::addBackToSolver() -{ - solver.xorclauses.pop(); //HACK --to force xor-propagation - for (uint32_t i = 0; i < clauses.size(); i++) { - if (clauses[i].clause != NULL) { - solver.xorclauses.push(clauses[i].clause); - clauses[i].clause->unsetStrenghtened(); - clauses[i].clause->unsetVarChanged(); - } - } - for (Var var = 0; var < solver.nVars(); var++) { - occur[var].clear(); - } - clauses.clear(); - clauseID = 0; -} - -void XorSubsumer::fillCannotEliminate() -{ - std::fill(cannot_eliminate.getData(), cannot_eliminate.getDataEnd(), false); - for (uint32_t i = 0; i < solver.clauses.size(); i++) - addToCannotEliminate(solver.clauses[i]); - - for (uint32_t i = 0; i < solver.binaryClauses.size(); i++) - if (!(*solver.binaryClauses[i]).learnt()) addToCannotEliminate(solver.binaryClauses[i]); - - const vec& tmp = solver.varReplacer->getClauses(); - for (uint32_t i = 0; i < tmp.size(); i++) - addToCannotEliminate(tmp[i]); - - #ifdef VERBOSE_DEBUG - uint32_t tmpNum = 0; - for (uint32_t i = 0; i < cannot_eliminate.size(); i++) - if (cannot_eliminate[i]) - tmpNum++; - std::cout << "Cannot eliminate num:" << tmpNum << std::endl; - #endif -} - -void XorSubsumer::extendModel(Solver& solver2) -{ - assert(checkElimedUnassigned()); - vec tmp; - typedef map > elimType; - for (elimType::iterator it = elimedOutVar.begin(), end = elimedOutVar.end(); it != end; it++) { - #ifdef VERBOSE_DEBUG - Var var = it->first; - std::cout << "Reinserting elimed var: " << var+1 << std::endl; - #endif - - for (vector::iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; it2++) { - XorClause& c = **it2; - #ifdef VERBOSE_DEBUG - std::cout << "Reinserting Clause: "; - c.plainPrint(); - #endif - tmp.clear(); - tmp.growTo(c.size()); - std::copy(c.getData(), c.getDataEnd(), tmp.getData()); - bool inverted = c.xor_clause_inverted(); - solver2.addXorClause(tmp, inverted); - assert(solver2.ok); - } - } -} - -const bool XorSubsumer::localSubstitute() -{ - vec tmp; - for (Var var = 0; var < occur.size(); var++) { - vec& occ = occur[var]; - - if (occ.size() <= 1) continue; - for (uint32_t i = 0; i < occ.size(); i++) { - XorClause& c1 = *occ[i].clause; - for (uint32_t i2 = i+1; i2 < occ.size(); i2++) { - XorClause& c2 = *occ[i2].clause; - tmp.clear(); - xorTwoClauses(c1, c2, tmp); - if (tmp.size() <= 2) { - #ifdef VERBOSE_DEBUG - std::cout << "Local substiuting. Clause1:"; c1.plainPrint(); - std::cout << "Clause 2:"; c2.plainPrint(); - #endif //VERBOSE_DEBUG - localSubstituteUseful++; - uint32_t lastSize = solver.varReplacer->getClauses().size(); - solver.addXorClauseInt(tmp, c1.xor_clause_inverted() ^ !c2.xor_clause_inverted(), c1.getGroup()); - for (uint32_t i = lastSize; i < solver.varReplacer->getClauses().size(); i++) - addToCannotEliminate(solver.varReplacer->getClauses()[i]); - if (!solver.ok) { - #ifdef VERBOSE_DEBUG - std::cout << "solver.ok is false after local substitution" << std::endl; - #endif //VERBOSE_DEBUG - return false; - } - } - } - } - } - - return true; -} - -template -void XorSubsumer::xorTwoClauses(const T& c1, const T& c2, vec& xored) -{ - for (uint32_t i = 0; i != c1.size(); i++) - seen_tmp[c1[i].var()] = 1; - for (uint32_t i = 0; i != c2.size(); i++) - seen_tmp[c2[i].var()] ^= 1; - - for (uint32_t i = 0; i != c1.size(); i++) { - if (seen_tmp[c1[i].var()] == 1) { - xored.push(Lit(c1[i].var(), false)); - seen_tmp[c1[i].var()] = 0; - } - } - for (uint32_t i = 0; i != c2.size(); i++) { - if (seen_tmp[c2[i].var()] == 1) { - xored.push(Lit(c2[i].var(), false)); - seen_tmp[c2[i].var()] = 0; - } - } -} - -void XorSubsumer::removeWrong(vec& cs) -{ - Clause **i = cs.getData(); - Clause **j = i; - for (Clause **end = i + cs.size(); i != end; i++) { - Clause& c = **i; - if (!c.learnt()) { - *j++ = *i; - continue; - } - bool remove = false; - for (Lit *l = c.getData(), *end2 = l+c.size(); l != end2; l++) { - if (var_elimed[l->var()]) { - remove = true; - solver.detachClause(c); - solver.clauseAllocator.clauseFree(&c); - break; - } - } - if (!remove) - *j++ = *i; - } - cs.shrink(i-j); -} - - -const bool XorSubsumer::removeDependent() -{ - for (Var var = 0; var < occur.size(); var++) { - if (cannot_eliminate[var] || !solver.decision_var[var] || solver.assigns[var] != l_Undef) continue; - vec& occ = occur[var]; - - if (occ.size() == 1) { - #ifdef VERBOSE_DEBUG - std::cout << "Eliminating dependent var " << var + 1 << std::endl; - std::cout << "-> Removing dependent clause "; occ[0].clause->plainPrint(); - #endif //VERBOSE_DEBUG - unlinkClause(occ[0], var); - solver.setDecisionVar(var, false); - var_elimed[var] = true; - numElimed++; - } else if (occ.size() == 2) { - vec lits; - XorClause& c1 = *(occ[0].clause); - lits.growTo(c1.size()); - std::copy(c1.getData(), c1.getDataEnd(), lits.getData()); - bool inverted = c1.xor_clause_inverted(); - - XorClause& c2 = *(occ[1].clause); - lits.growTo(lits.size() + c2.size()); - std::copy(c2.getData(), c2.getDataEnd(), lits.getData() + c1.size()); - inverted ^= !c2.xor_clause_inverted(); - uint32_t group = c2.getGroup(); - - #ifdef VERBOSE_DEBUG - std::cout << "Eliminating var " << var + 1 << " present in 2 xor-clauses" << std::endl; - std::cout << "-> Removing xor clause "; occ[0].clause->plainPrint(); - std::cout << "-> Removing xor clause "; occ[1].clause->plainPrint(); - #endif //VERBOSE_DEBUG - XorClauseSimp toUnlink0 = occ[0]; - XorClauseSimp toUnlink1 = occ[1]; - unlinkClause(toUnlink0); - solver.clauseAllocator.clauseFree(toUnlink0.clause); - unlinkClause(toUnlink1, var); - solver.setDecisionVar(var, false); - var_elimed[var] = true; - numElimed++; - - uint32_t lastSize = solver.varReplacer->getClauses().size(); - XorClause* c = solver.addXorClauseInt(lits, inverted, group); - #ifdef VERBOSE_DEBUG - if (c != NULL) { - std::cout << "-> Added combined xor clause:"; c->plainPrint(); - } else - std::cout << "-> Combined xor clause is NULL" << std::endl; - #endif - if (c != NULL) linkInClause(*c); - for (uint32_t i = lastSize; i < solver.varReplacer->getClauses().size(); i++) - addToCannotEliminate(solver.varReplacer->getClauses()[i]); - if (!solver.ok) { - #ifdef VERBOSE_DEBUG - std::cout << "solver.ok is false after var-elim through xor" << std::endl; - #endif //VERBOSE_DEBUG - return false; - } - } - } - - return true; -} - -inline void XorSubsumer::addToCannotEliminate(Clause* it) -{ - const Clause& c = *it; - for (uint32_t i2 = 0; i2 < c.size(); i2++) - cannot_eliminate[c[i2].var()] = true; -} - -const bool XorSubsumer::unEliminate(const Var var) -{ - assert(var_elimed[var]); - typedef map > elimType; - elimType::iterator it = elimedOutVar.find(var); - - //MUST set to decision, since it would never have been eliminated - //had it not been decision var - solver.setDecisionVar(var, true); - var_elimed[var] = false; - numElimed--; - assert(it != elimedOutVar.end()); - - FILE* backup_libraryCNFfile = solver.libraryCNFFile; - solver.libraryCNFFile = NULL; - for (vector::iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; it2++) { - XorClause& c = **it2; - solver.addXorClause(c, c.xor_clause_inverted()); - solver.clauseAllocator.clauseFree(&c); - } - solver.libraryCNFFile = backup_libraryCNFfile; - elimedOutVar.erase(it); - - return solver.ok; -} - - -const bool XorSubsumer::simplifyBySubsumption(const bool doFullSubsume) -{ - double myTime = cpuTime(); - uint32_t origTrailSize = solver.trail.size(); - clauses_subsumed = 0; - clauses_cut = 0; - clauseID = 0; - uint32_t lastNumElimed = numElimed; - localSubstituteUseful = 0; - while (solver.performReplace && solver.varReplacer->needsReplace()) { - if (!solver.varReplacer->performReplace()) - return false; - } - - for (Var var = 0; var < solver.nVars(); var++) { - occur[var].clear(); - } - solver.findAllAttach(); - - solver.clauseCleaner->cleanClauses(solver.xorclauses, ClauseCleaner::xorclauses); - if (!solver.ok) return false; - solver.testAllClauseAttach(); - - clauses.clear(); - clauses.reserve(solver.xorclauses.size()); - addFromSolver(solver.xorclauses); - #ifdef BIT_MORE_VERBOSITY - std::cout << "c time to link in:" << cpuTime()-myTime << std::endl; - #endif - - origNClauses = clauses.size(); - - if (!solver.ok) return false; - #ifdef VERBOSE_DEBUG - std::cout << "c clauses:" << clauses.size() << std::endl; - #endif - - bool replaced = true; - bool propagated = false; - while (replaced || propagated) { - replaced = propagated = false; - for (uint32_t i = 0; i < clauses.size(); i++) { - if (clauses[i].clause != NULL) { - subsume0(clauses[i]); - if (!solver.ok) { - addBackToSolver(); - return false; - } - } - } - - propagated = (solver.qhead != solver.trail.size()); - solver.ok = (solver.propagate().isNULL()); - if (!solver.ok) { - return false; - } - solver.clauseCleaner->cleanXorClausesBewareNULL(clauses, ClauseCleaner::xorSimpClauses, *this); - if (!solver.ok) return false; - testAllClauseAttach(); - - fillCannotEliminate(); - if (solver.conglomerateXors && !removeDependent()) { - addBackToSolver(); - return false; - } - testAllClauseAttach(); - - if (solver.heuleProcess && !localSubstitute()) { - addBackToSolver(); - return false; - } - testAllClauseAttach(); - - /*if (solver.performReplace && solver.varReplacer->needsReplace()) { - addBackToSolver(); - while (solver.performReplace && solver.varReplacer->needsReplace()) { - replaced = true; - if (!solver.varReplacer->performReplace()) - return false; - } - addFromSolver(solver.xorclauses); - }*/ - } - - solver.order_heap.filter(Solver::VarFilter(solver)); - - removeWrong(solver.learnts); - removeWrong(solver.binaryClauses); - addBackToSolver(); - - if (solver.verbosity >= 1) { - std::cout << "c | x-sub: " << std::setw(5) << clauses_subsumed - << " x-cut: " << std::setw(6) << clauses_cut - << " vfix: " << std::setw(6) <clause == NULL) continue; - const XorClause& c = *it->clause; - assert(find(solver.xorwatches[c[0].var()], &c)); - assert(find(solver.xorwatches[c[1].var()], &c)); - if (solver.assigns[c[0].var()]!=l_Undef || solver.assigns[c[1].var()]!=l_Undef) { - for (uint i = 0; i < c.size();i++) { - assert(solver.assigns[c[i].var()] != l_Undef); - } - } - } -} -#else -inline void XorSubsumer::testAllClauseAttach() const -{ - return; -} -#endif //DEBUG_ATTACH - -void XorSubsumer::findSubsumed(XorClause& ps, vec& out_subsumed) -{ - #ifdef VERBOSE_DEBUGSUBSUME0 - cout << "findSubsumed: "; - for (uint32_t i = 0; i < ps.size(); i++) { - if (ps[i].sign()) printf("-"); - printf("%d ", ps[i].var() + 1); - } - printf("0\n"); - #endif - - uint32_t min_i = 0; - for (uint32_t i = 1; i < ps.size(); i++){ - if (occur[ps[i].var()].size() < occur[ps[min_i].var()].size()) - min_i = i; - } - - vec& cs = occur[ps[min_i].var()]; - for (XorClauseSimp *it = cs.getData(), *end = it + cs.size(); it != end; it++){ - if (it+1 != end) - __builtin_prefetch((it+1)->clause, 1, 1); - - if (it->clause != &ps && subsetAbst(ps.getAbst(), it->clause->getAbst()) && ps.size() <= it->clause->size() && subset(ps, *it->clause)) { - out_subsumed.push(*it); - #ifdef VERBOSE_DEBUGSUBSUME0 - cout << "subsumed: "; - it->clause->plainPrint(); - #endif - } - } -} - -const bool XorSubsumer::checkElimedUnassigned() const -{ - for (uint32_t i = 0; i < var_elimed.size(); i++) { - if (var_elimed[i]) { - assert(solver.assigns[i] == l_Undef); - if (solver.assigns[i] != l_Undef) return false; - } - } - - return true; -} - -}; //NAMESPACE MINISAT diff --git a/src/vendor/stp/src/sat/cryptominisat2/XorSubsumer.h b/src/vendor/stp/src/sat/cryptominisat2/XorSubsumer.h deleted file mode 100644 index 43867fa52..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/XorSubsumer.h +++ /dev/null @@ -1,142 +0,0 @@ -/************************************************************************************************** -Originally From: Solver.C -- (C) Niklas Een, Niklas Sorensson, 2004 -Substantially modified by: Mate Soos (2010) -**************************************************************************************************/ - -#ifndef XORSIMPLIFIER_H -#define XORSIMPLIFIER_H - -#include "Solver.h" -#include "Vec.h" -#include "XSet.h" - -namespace MINISAT -{ -using namespace MINISAT; - -class ClauseCleaner; - -class XorSubsumer -{ -public: - - XorSubsumer(Solver& S2); - const bool simplifyBySubsumption(const bool doFullSubsume = false); - void unlinkModifiedClause(vec& origClause, XorClauseSimp c); - void unlinkModifiedClauseNoDetachNoNULL(vec& origClause, XorClauseSimp c); - void unlinkClause(XorClauseSimp cc, Var elim = var_Undef); - XorClauseSimp linkInClause(XorClause& cl); - void linkInAlreadyClause(XorClauseSimp& c); - void newVar(); - void extendModel(Solver& solver2); - const uint32_t getNumElimed() const; - const vec& getVarElimed() const; - const bool unEliminate(const Var var); - const bool checkElimedUnassigned() const; - const double getTotalTime() const; - -private: - - friend class ClauseCleaner; - friend class ClauseAllocator; - - //Main - vec clauses; - vec > occur; // 'occur[index(lit)]' is a list of constraints containing 'lit'. - Solver& solver; // The Solver - - // Temporaries (to reduce allocation overhead): - // - vec seen_tmp; // (used in various places) - - //Start-up - void addFromSolver(vec& cs); - void addBackToSolver(); - - // Subsumption: - void findSubsumed(XorClause& ps, vec& out_subsumed); - bool isSubsumed(XorClause& ps); - void subsume0(XorClauseSimp ps); - template - bool subset(const T1& A, const T2& B); - bool subsetAbst(uint32_t A, uint32_t B); - template - void findUnMatched(const T& A, const T& B, vec& unmatchedPart); - - //helper - void testAllClauseAttach() const; - - //dependent removal - const bool removeDependent(); - void fillCannotEliminate(); - vec cannot_eliminate; - void addToCannotEliminate(Clause* it); - void removeWrong(vec& cs); - - //Global stats - double totalTime; - map > elimedOutVar; - vec var_elimed; - uint32_t numElimed; - - //Heule-process - template - void xorTwoClauses(const T& c1, const T& c2, vec& xored); - const bool localSubstitute(); - uint32_t localSubstituteUseful; - - uint32_t clauses_subsumed; - uint32_t clauses_cut; - uint32_t origNClauses; - uint32_t clauseID; -}; - -inline bool XorSubsumer::subsetAbst(uint32_t A, uint32_t B) -{ - return !(A & ~B); -} - -// Assumes 'seen' is cleared (will leave it cleared) -template -bool XorSubsumer::subset(const T1& A, const T2& B) -{ - for (uint32_t i = 0; i != B.size(); i++) - seen_tmp[B[i].var()] = 1; - for (uint32_t i = 0; i != A.size(); i++) { - if (!seen_tmp[A[i].var()]) { - for (uint32_t i = 0; i != B.size(); i++) - seen_tmp[B[i].var()] = 0; - return false; - } - } - for (uint32_t i = 0; i != B.size(); i++) - seen_tmp[B[i].var()] = 0; - return true; -} - -inline void XorSubsumer::newVar() -{ - occur .push(); - seen_tmp .push(0); - cannot_eliminate.push(0); - var_elimed.push(0); -} - -inline const vec& XorSubsumer::getVarElimed() const -{ - return var_elimed; -} - -inline const uint32_t XorSubsumer::getNumElimed() const -{ - return numElimed; -} - -inline const double XorSubsumer::getTotalTime() const -{ - return totalTime; -} - -}; //NAMESPACE MINISAT - -#endif //XORSIMPLIFIER_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/constants.h b/src/vendor/stp/src/sat/cryptominisat2/constants.h deleted file mode 100644 index 436128d18..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/constants.h +++ /dev/null @@ -1,50 +0,0 @@ -/****************************************************************************************[Solver.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -glucose -- Gilles Audemard, Laurent Simon (2008) - -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. -**************************************************************************************************/ - -#define RATIOREMOVECLAUSES 2 -#define NBCLAUSESBEFOREREDUCE 20000 -#define DYNAMICNBLEVEL -#define UPDATEVARACTIVITY -#define FIXCLEANREPLACE 30U -#define PERCENTAGEPERFORMREPLACE 0.01 -#define PERCENTAGECLEANCLAUSES 0.01 -#define MAX_CLAUSENUM_XORFIND 5000000 -#define BINARY_TO_XOR_APPROX 4.0 -#define FULLRESTART_MULTIPLIER 250 -#define SIMPLIFY_MULTIPLIER 300 -#define FULLRESTART_MULTIPLIER_MULTIPLIER 3.5 -#define RESTART_TYPE_DECIDER_FROM 2 -#define RESTART_TYPE_DECIDER_UNTIL 7 -//#define VERBOSE_DEBUG_XOR -//#define VERBOSE_DEBUG -#define USE_GAUSS -#define MIN_GAUSS_XOR_CLAUSES 5 -#define MAX_GAUSS_XOR_CLAUSES 30000 -#define MAX_OLD_LEARNTS 2000000 -//#define DEBUG_ATTACH -#define RANDOM_LOOKAROUND_SEARCHSPACE -//#define USE_OLD_POLARITIES -//#define DEBUG_VARELIM -#define BURST_SEARCH -//#define DEBUG_PROPAGATEFROM - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif //HAVE_CONFIG_H diff --git a/src/vendor/stp/src/sat/cryptominisat2/msvc/stdint.h b/src/vendor/stp/src/sat/cryptominisat2/msvc/stdint.h deleted file mode 100644 index fee624db1..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/msvc/stdint.h +++ /dev/null @@ -1,250 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// 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. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - -#ifndef uint -#define uint unsigned int -#endif - -#endif // _MSC_STDINT_H_ ] diff --git a/src/vendor/stp/src/sat/cryptominisat2/mtl/Alg.h b/src/vendor/stp/src/sat/cryptominisat2/mtl/Alg.h deleted file mode 100644 index 2825a9c17..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/mtl/Alg.h +++ /dev/null @@ -1,75 +0,0 @@ -/*******************************************************************************************[Alg.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 Alg_h -#define Alg_h - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// Useful functions on vectors - - -template -static inline void remove(V& ts, const T& t) -{ - uint32_t j = 0; - for (; j < ts.size() && ts[j] != t; j++); - assert(j < ts.size()); - for (; j < ts.size()-1; j++) ts[j] = ts[j+1]; - ts.pop(); -} - -template -static inline void removeW(V& ts, const T& t) -{ - uint32_t j = 0; - for (; j < ts.size() && ts[j].clause != t; j++); - assert(j < ts.size()); - for (; j < ts.size()-1; j++) ts[j] = ts[j+1]; - ts.pop(); -} - -template -static inline bool find(V& ts, const T& t) -{ - uint32_t j = 0; - for (; j < ts.size() && ts[j] != t; j++); - return j < ts.size(); -} - -template -static inline bool findW(V& ts, const T& t) -{ - uint32_t j = 0; - for (; j < ts.size() && ts[j].clause != t; j++); - return j < ts.size(); -} - -}; //NAMESPACE MINISAT - -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/mtl/BasicHeap.h b/src/vendor/stp/src/sat/cryptominisat2/mtl/BasicHeap.h deleted file mode 100644 index 8748d2a3d..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/mtl/BasicHeap.h +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************************[Heap.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 BasicHeap_h -#define BasicHeap_h - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VERs - -#include "Vec.h" - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// A heap implementation with support for decrease/increase key. - - -template -class BasicHeap { - Comp lt; - vec heap; // heap of ints - - // Index "traversal" functions - static inline int left (int i) { return i*2+1; } - static inline int right (int i) { return (i+1)*2; } - static inline int parent(int i) { return (i-1) >> 1; } - - inline void percolateUp(int i) - { - int x = heap[i]; - while (i != 0 && lt(x, heap[parent(i)])){ - heap[i] = heap[parent(i)]; - i = parent(i); - } - heap [i] = x; - } - - - inline void percolateDown(int i) - { - int x = heap[i]; - while (left(i) < heap.size()){ - int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); - if (!lt(heap[child], x)) break; - heap[i] = heap[child]; - i = child; - } - heap[i] = x; - } - - - bool heapProperty(int i) { - return i >= heap.size() - || ((i == 0 || !lt(heap[i], heap[parent(i)])) && heapProperty(left(i)) && heapProperty(right(i))); } - - - public: - BasicHeap(const C& c) : comp(c) { } - - int size () const { return heap.size(); } - bool empty () const { return heap.size() == 0; } - int operator[](int index) const { return heap[index+1]; } - void clear (bool dealloc = false) { heap.clear(dealloc); } - void insert (int n) { heap.push(n); percolateUp(heap.size()-1); } - - - int removeMin() { - int r = heap[0]; - heap[0] = heap.last(); - heap.pop(); - if (heap.size() > 1) percolateDown(0); - return r; - } - - - // DEBUG: consistency checking - bool heapProperty() { - return heapProperty(1); } - - - // COMPAT: should be removed - int getmin () { return removeMin(); } -}; - -}; //NAMESPACE MINISAT - -//================================================================================================= -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/mtl/BoxedVec.h b/src/vendor/stp/src/sat/cryptominisat2/mtl/BoxedVec.h deleted file mode 100644 index 63b8c6d4a..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/mtl/BoxedVec.h +++ /dev/null @@ -1,152 +0,0 @@ -/*******************************************************************************************[Vec.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 BoxedVec_h -#define BoxedVec_h - -#include -#include -#include - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// Automatically resizable arrays -// -// NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) - -template -class bvec { - - static inline int imin(int x, int y) { - int mask = (x-y) >> (sizeof(int)*8-1); - return (x&mask) + (y&(~mask)); } - - static inline int imax(int x, int y) { - int mask = (y-x) >> (sizeof(int)*8-1); - return (x&mask) + (y&(~mask)); } - - struct Vec_t { - int sz; - int cap; - T data[0]; - - static Vec_t* alloc(Vec_t* x, int size){ - x = (Vec_t*)realloc((void*)x, sizeof(Vec_t) + sizeof(T)*size); - x->cap = size; - return x; - } - - }; - - Vec_t* ref; - - static const int init_size = 2; - static int nextSize (int current) { return (current * 3 + 1) >> 1; } - static int fitSize (int needed) { int x; for (x = init_size; needed > x; x = nextSize(x)); return x; } - - void fill (int size) { - assert(ref != NULL); - for (T* i = ref->data; i < ref->data + size; i++) - new (i) T(); - } - - void fill (int size, const T& pad) { - assert(ref != NULL); - for (T* i = ref->data; i < ref->data + size; i++) - new (i) T(pad); - } - - // Don't allow copying (error prone): - altvec& operator = (altvec& other) { assert(0); } - altvec (altvec& other) { assert(0); } - -public: - void clear (bool dealloc = false) { - if (ref != NULL){ - for (int i = 0; i < ref->sz; i++) - (*ref).data[i].~T(); - - if (dealloc) { - free(ref); ref = NULL; - }else - ref->sz = 0; - } - } - - // Constructors: - altvec(void) : ref (NULL) { } - altvec(int size) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size); ref->sz = size; } - altvec(int size, const T& pad) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size, pad); ref->sz = size; } - ~altvec(void) { clear(true); } - - // Ownership of underlying array: - operator T* (void) { return ref->data; } // (unsafe but convenient) - operator const T* (void) const { return ref->data; } - - // Size operations: - int size (void) const { return ref != NULL ? ref->sz : 0; } - - void pop (void) { assert(ref != NULL && ref->sz > 0); int last = --ref->sz; ref->data[last].~T(); } - void push (const T& elem) { - int size = ref != NULL ? ref->sz : 0; - int cap = ref != NULL ? ref->cap : 0; - if (size == cap){ - cap = cap != 0 ? nextSize(cap) : init_size; - ref = Vec_t::alloc(ref, cap); - } - //new (&ref->data[size]) T(elem); - ref->data[size] = elem; - ref->sz = size+1; - } - - void push () { - int size = ref != NULL ? ref->sz : 0; - int cap = ref != NULL ? ref->cap : 0; - if (size == cap){ - cap = cap != 0 ? nextSize(cap) : init_size; - ref = Vec_t::alloc(ref, cap); - } - new (&ref->data[size]) T(); - ref->sz = size+1; - } - - void shrink (int nelems) { for (int i = 0; i < nelems; i++) pop(); } - void shrink_(int nelems) { for (int i = 0; i < nelems; i++) pop(); } - void growTo (int size) { while (this->size() < size) push(); } - void growTo (int size, const T& pad) { while (this->size() < size) push(pad); } - void capacity (int size) { growTo(size); } - - const T& last (void) const { return ref->data[ref->sz-1]; } - T& last (void) { return ref->data[ref->sz-1]; } - - // Vector interface: - const T& operator [] (int index) const { return ref->data[index]; } - T& operator [] (int index) { return ref->data[index]; } - - void copyTo(altvec& copy) const { copy.clear(); for (int i = 0; i < size(); i++) copy.push(ref->data[i]); } - void moveTo(altvec& dest) { dest.clear(true); dest.ref = ref; ref = NULL; } - -}; - -}; //NAMESPACE MINISAT - -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/mtl/Heap.h b/src/vendor/stp/src/sat/cryptominisat2/mtl/Heap.h deleted file mode 100644 index a2ae468fa..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/mtl/Heap.h +++ /dev/null @@ -1,205 +0,0 @@ -/******************************************************************************************[Heap.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 Heap_h -#define Heap_h - -#include "Vec.h" -#include - -#include "string.h" -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// A heap implementation with support for decrease/increase key. - - -template -class Heap { - Comp lt; - vec heap; // heap of ints - vec indices; // int -> index in heap - - // Index "traversal" functions - static inline uint32_t left (uint32_t i) { return i*2+1; } - static inline uint32_t right (uint32_t i) { return (i+1)*2; } - static inline uint32_t parent(uint32_t i) { return (i-1) >> 1; } - - - inline void percolateUp(uint32_t i) - { - uint32_t x = heap[i]; - while (i != 0 && lt(x, heap[parent(i)])){ - heap[i] = heap[parent(i)]; - indices[heap[i]] = i; - i = parent(i); - } - heap [i] = x; - indices[x] = i; - } - - - inline void percolateDown(uint32_t i) - { - uint32_t x = heap[i]; - while (left(i) < heap.size()){ - uint32_t child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); - if (!lt(heap[child], x)) break; - heap[i] = heap[child]; - indices[heap[i]] = i; - i = child; - } - heap [i] = x; - indices[x] = i; - } - - - bool heapProperty (uint32_t i) const { - return i >= heap.size() - || ((i == 0 || !lt(heap[i], heap[parent(i)])) && heapProperty(left(i)) && heapProperty(right(i))); } - - - public: - Heap(const Comp& c) : lt(c) { } - Heap(const Heap& other) : lt(other.lt) { - heap.growTo(other.heap.size()); - std::copy(other.heap.getData(), other.heap.getDataEnd(), heap.getData()); - indices.growTo(other.indices.size()); - std::copy(other.indices.getData(), other.indices.getDataEnd(), indices.getData()); - } - - void operator=(const Heap& other) - { - if (other.heap.size() > heap.size()) - heap.growTo(other.heap.size()); - else - heap.shrink(heap.size()-other.heap.size()); - std::copy(other.heap.getData(), other.heap.getDataEnd(), heap.getData()); - - if (other.indices.size() > indices.size()) - indices.growTo(other.indices.size()); - else - indices.shrink(indices.size() - other.indices.size()); - std::copy(other.indices.getData(), other.indices.getDataEnd(), indices.getData()); - } - - uint32_t size () const { return heap.size(); } - bool empty () const { return heap.size() == 0; } - bool inHeap (uint32_t n) const { return n < indices.size() && indices[n] != std::numeric_limits::max(); } - uint32_t operator[](uint32_t index) const { assert(index < heap.size()); return heap[index]; } - - void decrease (uint32_t n) { assert(inHeap(n)); percolateUp(indices[n]); } - - // RENAME WHEN THE DEPRECATED INCREASE IS REMOVED. - void increase_ (uint32_t n) { assert(inHeap(n)); percolateDown(indices[n]); } - - - void insert(uint32_t n) - { - indices.growTo(n+1, std::numeric_limits::max()); - assert(!inHeap(n)); - - indices[n] = heap.size(); - heap.push(n); - percolateUp(indices[n]); - } - - - uint32_t removeMin() - { - uint32_t x = heap[0]; - heap[0] = heap.last(); - indices[heap[0]] = 0; - indices[x] = std::numeric_limits::max(); - heap.pop(); - if (heap.size() > 1) percolateDown(0); - return x; - } - - - void clear(bool dealloc = false) - { - for (uint32_t i = 0; i != heap.size(); i++) - indices[heap[i]] = std::numeric_limits::max(); -#ifndef NDEBUG - for (uint32_t i = 0; i != indices.size(); i++) - assert(indices[i] == std::numeric_limits::max()); -#endif - heap.clear(dealloc); - } - - - // Fool proof variant of insert/decrease/increase - void update (uint32_t n) - { - if (!inHeap(n)) - insert(n); - else { - percolateUp(indices[n]); - percolateDown(indices[n]); - } - } - - - // Delete elements from the heap using a given filter function (-object). - // *** this could probaly be replaced with a more general "buildHeap(vec&)" method *** - template - void filter(const F& filt) { - uint32_t i,j; - for (i = j = 0; i != heap.size(); i++) - if (filt(heap[i])){ - heap[j] = heap[i]; - indices[heap[i]] = j++; - }else - indices[heap[i]] = std::numeric_limits::max(); - - heap.shrink(i - j); - for (int i = heap.size() / 2 - 1; i >= 0; i--) - percolateDown(i); - - assert(heapProperty()); - } - - - // DEBUG: consistency checking - bool heapProperty() const { - return heapProperty(1); } - - - // COMPAT: should be removed - void setBounds (uint32_t n) { } - void increase (uint32_t n) { decrease(n); } - uint32_t getmin () { return removeMin(); } - -}; - -//================================================================================================= - -}; //NAMESPACE MINISAT - -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/mtl/Map.h b/src/vendor/stp/src/sat/cryptominisat2/mtl/Map.h deleted file mode 100644 index bd791c3e9..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/mtl/Map.h +++ /dev/null @@ -1,128 +0,0 @@ -/*******************************************************************************************[Map.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 Map_h -#define Map_h - -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -#include "Vec.h" - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// Default hash/equals functions -// - -template struct Hash { uint32_t operator()(const K& k) const { return hash(k); } }; -template struct Equal { bool operator()(const K& k1, const K& k2) const { return k1 == k2; } }; - -template struct DeepHash { uint32_t operator()(const K* k) const { return hash(*k); } }; -template struct DeepEqual { bool operator()(const K* k1, const K* k2) const { return *k1 == *k2; } }; - -//================================================================================================= -// Some primes -// - -static const int nprimes = 25; -static const int primes [nprimes] = { 31, 73, 151, 313, 643, 1291, 2593, 5233, 10501, 21013, 42073, 84181, 168451, 337219, 674701, 1349473, 2699299, 5398891, 10798093, 21596719, 43193641, 86387383, 172775299, 345550609, 691101253 }; - -//================================================================================================= -// Hash table implementation of Maps -// - -template, class E = Equal > -class Map { - struct Pair { K key; D data; }; - - H hash; - E equals; - - vec* table; - int cap; - int size; - - // Don't allow copying (error prone): - Map& operator = (Map& other) { assert(0); } - Map (Map& other) { assert(0); } - - int32_t index (const K& k) const { return hash(k) % cap; } - void _insert (const K& k, const D& d) { table[index(k)].push(); table[index(k)].last().key = k; table[index(k)].last().data = d; } - void rehash () { - const vec* old = table; - - int newsize = primes[0]; - for (int i = 1; newsize <= cap && i < nprimes; i++) - newsize = primes[i]; - - table = new vec[newsize]; - - for (int i = 0; i < cap; i++){ - for (int j = 0; j < old[i].size(); j++){ - _insert(old[i][j].key, old[i][j].data); }} - - delete [] old; - - cap = newsize; - } - - - public: - - Map () : table(NULL), cap(0), size(0) {} - Map (const H& h, const E& e) : Map(), hash(h), equals(e) {} - ~Map () { delete [] table; } - - void insert (const K& k, const D& d) { if (size+1 > cap / 2) rehash(); _insert(k, d); size++; } - bool peek (const K& k, D& d) { - if (size == 0) return false; - const vec& ps = table[index(k)]; - for (int i = 0; i < ps.size(); i++) - if (equals(ps[i].key, k)){ - d = ps[i].data; - return true; } - return false; - } - - void remove (const K& k) { - assert(table != NULL); - vec& ps = table[index(k)]; - int j = 0; - for (; j < ps.size() && !equals(ps[j].key, k); j++); - assert(j < ps.size()); - ps[j] = ps.last(); - ps.pop(); - } - - void clear () { - cap = size = 0; - delete [] table; - table = NULL; - } -}; - -}; //NAMESPACE MINISAT - -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/mtl/Queue.h b/src/vendor/stp/src/sat/cryptominisat2/mtl/Queue.h deleted file mode 100644 index 413855921..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/mtl/Queue.h +++ /dev/null @@ -1,89 +0,0 @@ -/*****************************************************************************************[Queue.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 Queue_h -#define Queue_h - -#include "Vec.h" - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= - - -template -class Queue { - vec elems; - int first; - -public: - Queue(void) : first(0) { } - - void insert(T x) { elems.push(x); } - T peek () const { return elems[first]; } - void pop () { first++; } - - void clear(bool dealloc = false) { elems.clear(dealloc); first = 0; } - int size(void) { return elems.size() - first; } - - //bool has(T x) { for (int i = first; i < elems.size(); i++) if (elems[i] == x) return true; return false; } - - const T& operator [] (int index) const { return elems[first + index]; } - -}; - -//template -//class Queue { -// vec buf; -// int first; -// int end; -// -//public: -// typedef T Key; -// -// Queue() : buf(1), first(0), end(0) {} -// -// void clear () { buf.shrinkTo(1); first = end = 0; } -// int size () { return (end >= first) ? end - first : end - first + buf.size(); } -// -// T peek () { assert(first != end); return buf[first]; } -// void pop () { assert(first != end); first++; if (first == buf.size()) first = 0; } -// void insert(T elem) { // INVARIANT: buf[end] is always unused -// buf[end++] = elem; -// if (end == buf.size()) end = 0; -// if (first == end){ // Resize: -// vec tmp((buf.size()*3 + 1) >> 1); -// //**/printf("queue alloc: %d elems (%.1f MB)\n", tmp.size(), tmp.size() * sizeof(T) / 1000000.0); -// int i = 0; -// for (int j = first; j < buf.size(); j++) tmp[i++] = buf[j]; -// for (int j = 0 ; j < end ; j++) tmp[i++] = buf[j]; -// first = 0; -// end = buf.size(); -// tmp.moveTo(buf); -// } -// } -//}; - -//================================================================================================= - -}; //NAMESPACE MINISAT - -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/mtl/Vec.h b/src/vendor/stp/src/sat/cryptominisat2/mtl/Vec.h deleted file mode 100644 index 1c6c1aeda..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/mtl/Vec.h +++ /dev/null @@ -1,147 +0,0 @@ -/*******************************************************************************************[Vec.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 Vec_h -#define Vec_h - -#include -#include -#include -#ifdef _MSC_VER -#include -#else -#include -#endif //_MSC_VER - -namespace MINISAT -{ -using namespace MINISAT; - -//================================================================================================= -// Automatically resizable arrays -// -// NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) - -template -class vec { - T* data; - uint32_t sz; - uint32_t cap; - - void init(uint32_t size, const T& pad); - void grow(uint32_t min_cap); - - // Don't allow copying (error prone): - vec& operator = (vec& other) { assert(0); return *this; } - //vec (vec& other) { assert(0); } - - static inline uint32_t imax(int x, int y) { - int mask = (y-x) >> (sizeof(int)*8-1); - return (x&mask) + (y&(~mask)); } - - void myCopy (const vec& other); - -public: - // Types: - typedef uint32_t Key; - typedef T Datum; - - // Constructors: - vec(void) : data(NULL) , sz(0) , cap(0) { } - vec(uint32_t size) : data(NULL) , sz(0) , cap(0) { growTo(size); } - vec(uint32_t size, const T& pad) : data(NULL) , sz(0) , cap(0) { growTo(size, pad); } - vec(T* array, uint32_t size) : data(array), sz(size), cap(size) { } // (takes ownership of array -- will be deallocated with 'free()') - vec(const vec& other) : data(NULL) , sz(0) , cap(0) { myCopy(other); } - ~vec(void) { clear(true); } - - // Ownership of underlying array: - T* release (void) { T* ret = data; data = NULL; sz = 0; cap = 0; return ret; } - const T* getData() const {return data; } - const T* getDataEnd() const {return data + size(); } - T* getData() {return data; } - T* getDataEnd() {return data + size(); } - - // Size operations: - uint32_t size (void) const { return sz; } - void shrink (uint32_t nelems) { assert(nelems <= sz); for (uint32_t i = 0; i != nelems; i++) sz--, data[sz].~T(); } - void shrink_(uint32_t nelems) { assert(nelems <= sz); sz -= nelems; } - void pop (void) { sz--, data[sz].~T(); } - void growTo (uint32_t size); - void growTo (uint32_t size, const T& pad); - void clear (bool dealloc = false); - void capacity (uint32_t size) { grow(size); } - - // Stack interface: - void reserve(uint32_t res) { if (cap < res) {cap = res; data = (T*)realloc(data, cap * sizeof(T));}} - void push (void) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } new (&data[sz]) T(); sz++; } - void push (const T& elem) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } data[sz++] = elem; } - void push_ (const T& elem) { assert(sz < cap); data[sz++] = elem; } - - const T& last (void) const { return data[sz-1]; } - T& last (void) { return data[sz-1]; } - - // Vector interface: - const T& operator [] (uint32_t index) const { return data[index]; } - T& operator [] (uint32_t index) { return data[index]; } - - - // Duplicatation (preferred instead): - void copyTo(vec& copy) const { copy.clear(); copy.growTo(sz); for (uint32_t i = 0; i != sz; i++) new (©[i]) T(data[i]); } - void moveTo(vec& dest) { dest.clear(true); dest.data = data; dest.sz = sz; dest.cap = cap; data = NULL; sz = 0; cap = 0; } -}; - -template -void vec::grow(uint32_t min_cap) { - if (min_cap <= cap) return; - if (cap == 0) cap = (min_cap >= 2) ? min_cap : 2; - else do cap = (cap*3+1) >> 1; while (cap < min_cap); - data = (T*)realloc(data, cap * sizeof(T)); } - -template -void vec::growTo(uint32_t size, const T& pad) { - if (sz >= size) return; - grow(size); - for (uint32_t i = sz; i != size; i++) new (&data[i]) T(pad); - sz = size; } - -template -void vec::growTo(uint32_t size) { - if (sz >= size) return; - grow(size); - for (uint32_t i = sz; i != size; i++) new (&data[i]) T(); - sz = size; } - -template -void vec::myCopy(const vec& other) { - assert(sz == 0); - grow(other.size()); - for (uint32_t i = sz; i != other.size(); i++) new (&data[i]) T(other[i]); - sz = other.size(); } - -template -void vec::clear(bool dealloc) { - if (data != NULL){ - for (uint32_t i = 0; i != sz; i++) data[i].~T(); - sz = 0; - if (dealloc) free(data), data = NULL, cap = 0; } } - - -}; //NAMESPACE MINISAT - -#endif diff --git a/src/vendor/stp/src/sat/cryptominisat2/time_mem.h b/src/vendor/stp/src/sat/cryptominisat2/time_mem.h deleted file mode 100644 index f923c9a07..000000000 --- a/src/vendor/stp/src/sat/cryptominisat2/time_mem.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************************[Solver.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -CryptoMiniSat -- Copyright (c) 2009 Mate Soos - -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 TIME_MEM_H -#define TIME_MEM_H - -#ifdef _MSC_VER - #include - #include -#else - #include - #include - #include - #include -#endif - -namespace MINISAT -{ -using namespace MINISAT; - -/*************************************************************************************/ -#ifdef _MSC_VER - -static inline double cpuTime(void) { - return (double)clock() / CLOCKS_PER_SEC; } -#else - -static inline double cpuTime(void) { - struct rusage ru; - getrusage(RUSAGE_SELF, &ru); - return (double)ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec / 1000000; } -#endif - -#if defined(__linux__) -static inline int memReadStat(int field) -{ - char name[256]; - pid_t pid = getpid(); - sprintf(name, "/proc/%d/statm", pid); - FILE* in = fopen(name, "rb"); - if (in == NULL) return 0; - int value; - for (; field >= 0; field--) - fscanf(in, "%d", &value); - fclose(in); - return value; -} -static inline uint64_t memUsed() { return (uint64_t)memReadStat(0) * (uint64_t)getpagesize(); } - - -#elif defined(__FreeBSD__) -static inline uint64_t memUsed(void) { - struct rusage ru; - getrusage(RUSAGE_SELF, &ru); - return ru.ru_maxrss*1024; } - - -#else -static inline uint64_t memUsed() { return 0; } -#endif - -#if defined(__linux__) -#include -#endif - -}; - -#endif //TIME_MEM_H diff --git a/src/vendor/stp/src/sat/doc/ReleaseNotes-2.2.0.txt b/src/vendor/stp/src/sat/doc/ReleaseNotes-2.2.0.txt deleted file mode 100644 index 7f084de2b..000000000 --- a/src/vendor/stp/src/sat/doc/ReleaseNotes-2.2.0.txt +++ /dev/null @@ -1,79 +0,0 @@ -Release Notes for MiniSat 2.2.0 -=============================== - -Changes since version 2.0: - - * Started using a more standard release numbering. - - * Includes some now well-known heuristics: phase-saving and luby - restarts. The old heuristics are still present and can be activated - if needed. - - * Detection/Handling of out-of-memory and vector capacity - overflow. This is fairly new and relatively untested. - - * Simple resource controls: CPU-time, memory, number of - conflicts/decisions. - - * CPU-time limiting is implemented by a more general, but simple, - asynchronous interruption feature. This means that the solving - procedure can be interrupted from another thread or in a signal - handler. - - * Improved portability with respect to building on Solaris and with - Visual Studio. This is not regularly tested and chances are that - this have been broken since, but should be fairly easy to fix if - so. - - * Changed C++ file-extention to the less problematic ".cc". - - * Source code is now namespace-protected - - * Introducing a new Clause Memory Allocator that brings reduced - memory consumption on 64-bit architechtures and improved - performance (to some extent). The allocator uses a region-based - approach were all references to clauses are represented as a 32-bit - index into a global memory region that contains all clauses. To - free up and compact memory it uses a simple copying garbage - collector. - - * Improved unit-propagation by Blocking Literals. For each entry in - the watcher lists, pair the pointer to a clause with some - (arbitrary) literal from the clause. The idea is that if the - literal is currently true (i.e. the clause is satisfied) the - watchers of the clause does not need to be altered. This can thus - be detected without touching the clause's memory at all. As often - as can be done cheaply, the blocking literal for entries to the - watcher list of a literal 'p' is set to the other literal watched - in the corresponding clause. - - * Basic command-line/option handling system. Makes it easy to specify - options in the class that they affect, and whenever that class is - used in an executable, parsing of options and help messages are - brought in automatically. - - * General clean-up and various minor bug-fixes. - - * Changed implementation of variable-elimination/model-extension: - - - The interface is changed so that arbitrary remembering is no longer - possible. If you need to mention some variable again in the future, - this variable has to be frozen. - - - When eliminating a variable, only clauses that contain the variable - with one sign is necessary to store. Thereby making the other sign - a "default" value when extending models. - - - The memory consumption for eliminated clauses is further improved - by storing all eliminated clauses in a single contiguous vector. - - * Some common utility code (I/O, Parsing, CPU-time, etc) is ripped - out and placed in a separate "utils" directory. - - * The DIMACS parse is refactored so that it can be reused in other - applications (not very elegant, but at least possible). - - * Some simple improvements to scalability of preprocessing, using - more lazy clause removal from data-structures and a couple of - ad-hoc limits (the longest clause that can be produced in variable - elimination, and the longest clause used in backward subsumption). diff --git a/src/vendor/stp/src/sat/mtl/Alg.h b/src/vendor/stp/src/sat/mtl/Alg.h deleted file mode 100644 index 547f574f9..000000000 --- a/src/vendor/stp/src/sat/mtl/Alg.h +++ /dev/null @@ -1,84 +0,0 @@ -/*******************************************************************************************[Alg.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Alg_h -#define Minisat_Alg_h - -#include "../mtl/Vec.h" - -namespace Minisat { - -//================================================================================================= -// Useful functions on vector-like types: - -//================================================================================================= -// Removing and searching for elements: -// - -template -static inline void remove(V& ts, const T& t) -{ - int j = 0; - for (; j < ts.size() && ts[j] != t; j++); - assert(j < ts.size()); - for (; j < ts.size()-1; j++) ts[j] = ts[j+1]; - ts.pop(); -} - - -template -static inline bool find(V& ts, const T& t) -{ - int j = 0; - for (; j < ts.size() && ts[j] != t; j++); - return j < ts.size(); -} - - -//================================================================================================= -// Copying vectors with support for nested vector types: -// - -// Base case: -template -static inline void copy(const T& from, T& to) -{ - to = from; -} - -// Recursive case: -template -static inline void copy(const vec& from, vec& to, bool append = false) -{ - if (!append) - to.clear(); - for (int i = 0; i < from.size(); i++){ - to.push(); - copy(from[i], to.last()); - } -} - -template -static inline void append(const vec& from, vec& to){ copy(from, to, true); } - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/Alloc.h b/src/vendor/stp/src/sat/mtl/Alloc.h deleted file mode 100644 index 12f32a0ed..000000000 --- a/src/vendor/stp/src/sat/mtl/Alloc.h +++ /dev/null @@ -1,131 +0,0 @@ -/*****************************************************************************************[Alloc.h] -Copyright (c) 2008-2010, Niklas Sorensson - -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 Minisat_Alloc_h -#define Minisat_Alloc_h - -#include "../mtl/XAlloc.h" -#include "../mtl/Vec.h" - -namespace Minisat { - -//================================================================================================= -// Simple Region-based memory allocator: - -template -class RegionAllocator -{ - T* memory; - uint32_t sz; - uint32_t cap; - uint32_t wasted_; - - void capacity(uint32_t min_cap); - - public: - // TODO: make this a class for better type-checking? - typedef uint32_t Ref; - enum { Ref_Undef = UINT32_MAX }; - enum { Unit_Size = sizeof(uint32_t) }; - - explicit RegionAllocator(uint32_t start_cap = 1024*1024) : memory(NULL), sz(0), cap(0), wasted_(0){ capacity(start_cap); } - ~RegionAllocator() - { - if (memory != NULL) - ::free(memory); - } - - - uint32_t size () const { return sz; } - uint32_t wasted () const { return wasted_; } - - Ref alloc (int size); - void free (int size) { wasted_ += size; } - - // Deref, Load Effective Address (LEA), Inverse of LEA (AEL): - T& operator[](Ref r) { assert(r >= 0 && r < sz); return memory[r]; } - const T& operator[](Ref r) const { assert(r >= 0 && r < sz); return memory[r]; } - - T* lea (Ref r) { assert(r >= 0 && r < sz); return &memory[r]; } - const T* lea (Ref r) const { assert(r >= 0 && r < sz); return &memory[r]; } - Ref ael (const T* t) { assert((void*)t >= (void*)&memory[0] && (void*)t < (void*)&memory[sz-1]); - return (Ref)(t - &memory[0]); } - - void moveTo(RegionAllocator& to) { - if (to.memory != NULL) ::free(to.memory); - to.memory = memory; - to.sz = sz; - to.cap = cap; - to.wasted_ = wasted_; - - memory = NULL; - sz = cap = wasted_ = 0; - } - - -}; - -template -void RegionAllocator::capacity(uint32_t min_cap) -{ - if (cap >= min_cap) return; - - uint32_t prev_cap = cap; - while (cap < min_cap){ - // NOTE: Multiply by a factor (13/8) without causing overflow, then add 2 and make the - // result even by clearing the least significant bit. The resulting sequence of capacities - // is carefully chosen to hit a maximum capacity that is close to the '2^32-1' limit when - // using 'uint32_t' as indices so that as much as possible of this space can be used. - uint32_t delta = ((cap >> 1) + (cap >> 3) + 2) & ~1; - cap += delta; - - if (cap <= prev_cap) - throw OutOfMemoryException(); - } - // printf(" .. (%p) cap = %u\n", this, cap); - - assert(cap > 0); - memory = (T*)xrealloc(memory, sizeof(T)*cap); -} - - -template -typename RegionAllocator::Ref -RegionAllocator::alloc(int size) -{ - // printf("ALLOC called (this = %p, size = %d)\n", this, size); fflush(stdout); - assert(size > 0); - capacity(sz + size); - - uint32_t prev_sz = sz; - sz += size; - - // Handle overflow: - if (sz < prev_sz) - throw OutOfMemoryException(); - - return prev_sz; -} - - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/BasicHeap.h b/src/vendor/stp/src/sat/mtl/BasicHeap.h deleted file mode 100644 index a07ad3aaf..000000000 --- a/src/vendor/stp/src/sat/mtl/BasicHeap.h +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************************[Heap.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 BasicHeap_h -#define BasicHeap_h - -#include "../Vec.h" - -namespace Minisat { - -//================================================================================================= -// A heap implementation with support for decrease/increase key. - - -template -class BasicHeap { - Comp lt; - vec heap; // heap of ints - - // Index "traversal" functions - static inline int left (int i) { return i*2+1; } - static inline int right (int i) { return (i+1)*2; } - static inline int parent(int i) { return (i-1) >> 1; } - - inline void percolateUp(int i) - { - int x = heap[i]; - while (i != 0 && lt(x, heap[parent(i)])){ - heap[i] = heap[parent(i)]; - i = parent(i); - } - heap [i] = x; - } - - - inline void percolateDown(int i) - { - int x = heap[i]; - while (left(i) < heap.size()){ - int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); - if (!lt(heap[child], x)) break; - heap[i] = heap[child]; - i = child; - } - heap[i] = x; - } - - - bool heapProperty(int i) { - return i >= heap.size() - || ((i == 0 || !lt(heap[i], heap[parent(i)])) && heapProperty(left(i)) && heapProperty(right(i))); } - - - public: - BasicHeap(const C& c) : comp(c) { } - - int size () const { return heap.size(); } - bool empty () const { return heap.size() == 0; } - int operator[](int index) const { return heap[index+1]; } - void clear (bool dealloc = false) { heap.clear(dealloc); } - void insert (int n) { heap.push(n); percolateUp(heap.size()-1); } - - - int removeMin() { - int r = heap[0]; - heap[0] = heap.last(); - heap.pop(); - if (heap.size() > 1) percolateDown(0); - return r; - } - - - // DEBUG: consistency checking - bool heapProperty() { - return heapProperty(1); } - - - // COMPAT: should be removed - int getmin () { return removeMin(); } -}; - - -//================================================================================================= -}; -#endif diff --git a/src/vendor/stp/src/sat/mtl/BoxedVec.h b/src/vendor/stp/src/sat/mtl/BoxedVec.h deleted file mode 100644 index 747c634e6..000000000 --- a/src/vendor/stp/src/sat/mtl/BoxedVec.h +++ /dev/null @@ -1,149 +0,0 @@ -/*******************************************************************************************[Vec.h] -MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson - -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 BoxedVec_h -#define BoxedVec_h - -#include -#include -#include - -namespace Minisat { -//================================================================================================= -// Automatically resizable arrays -// -// NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) - -template -class bvec { - - static inline int imin(int x, int y) { - int mask = (x-y) >> (sizeof(int)*8-1); - return (x&mask) + (y&(~mask)); } - - static inline int imax(int x, int y) { - int mask = (y-x) >> (sizeof(int)*8-1); - return (x&mask) + (y&(~mask)); } - - struct Vec_t { - int sz; - int cap; - T data[0]; - - static Vec_t* alloc(Vec_t* x, int size){ - x = (Vec_t*)realloc((void*)x, sizeof(Vec_t) + sizeof(T)*size); - x->cap = size; - return x; - } - - }; - - Vec_t* ref; - - static const int init_size = 2; - static int nextSize (int current) { return (current * 3 + 1) >> 1; } - static int fitSize (int needed) { int x; for (x = init_size; needed > x; x = nextSize(x)); return x; } - - void fill (int size) { - assert(ref != NULL); - for (T* i = ref->data; i < ref->data + size; i++) - new (i) T(); - } - - void fill (int size, const T& pad) { - assert(ref != NULL); - for (T* i = ref->data; i < ref->data + size; i++) - new (i) T(pad); - } - - // Don't allow copying (error prone): - altvec& operator = (altvec& other) { assert(0); } - altvec (altvec& other) { assert(0); } - -public: - void clear (bool dealloc = false) { - if (ref != NULL){ - for (int i = 0; i < ref->sz; i++) - (*ref).data[i].~T(); - - if (dealloc) { - free(ref); ref = NULL; - }else - ref->sz = 0; - } - } - - // Constructors: - altvec(void) : ref (NULL) { } - altvec(int size) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size); ref->sz = size; } - altvec(int size, const T& pad) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size, pad); ref->sz = size; } - ~altvec(void) { clear(true); } - - // Ownership of underlying array: - operator T* (void) { return ref->data; } // (unsafe but convenient) - operator const T* (void) const { return ref->data; } - - // Size operations: - int size (void) const { return ref != NULL ? ref->sz : 0; } - - void pop (void) { assert(ref != NULL && ref->sz > 0); int last = --ref->sz; ref->data[last].~T(); } - void push (const T& elem) { - int size = ref != NULL ? ref->sz : 0; - int cap = ref != NULL ? ref->cap : 0; - if (size == cap){ - cap = cap != 0 ? nextSize(cap) : init_size; - ref = Vec_t::alloc(ref, cap); - } - //new (&ref->data[size]) T(elem); - ref->data[size] = elem; - ref->sz = size+1; - } - - void push () { - int size = ref != NULL ? ref->sz : 0; - int cap = ref != NULL ? ref->cap : 0; - if (size == cap){ - cap = cap != 0 ? nextSize(cap) : init_size; - ref = Vec_t::alloc(ref, cap); - } - new (&ref->data[size]) T(); - ref->sz = size+1; - } - - void shrink (int nelems) { for (int i = 0; i < nelems; i++) pop(); } - void shrink_(int nelems) { for (int i = 0; i < nelems; i++) pop(); } - void growTo (int size) { while (this->size() < size) push(); } - void growTo (int size, const T& pad) { while (this->size() < size) push(pad); } - void capacity (int size) { growTo(size); } - - const T& last (void) const { return ref->data[ref->sz-1]; } - T& last (void) { return ref->data[ref->sz-1]; } - - // Vector interface: - const T& operator [] (int index) const { return ref->data[index]; } - T& operator [] (int index) { return ref->data[index]; } - - void copyTo(altvec& copy) const { copy.clear(); for (int i = 0; i < size(); i++) copy.push(ref->data[i]); } - void moveTo(altvec& dest) { dest.clear(true); dest.ref = ref; ref = NULL; } - -}; - - -}; -#endif diff --git a/src/vendor/stp/src/sat/mtl/Heap.h b/src/vendor/stp/src/sat/mtl/Heap.h deleted file mode 100644 index 97222a974..000000000 --- a/src/vendor/stp/src/sat/mtl/Heap.h +++ /dev/null @@ -1,148 +0,0 @@ -/******************************************************************************************[Heap.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Heap_h -#define Minisat_Heap_h - -#include "../mtl/Vec.h" - -namespace Minisat { - -//================================================================================================= -// A heap implementation with support for decrease/increase key. - - -template -class Heap { - Comp lt; // The heap is a minimum-heap with respect to this comparator - vec heap; // Heap of integers - vec indices; // Each integers position (index) in the Heap - - // Index "traversal" functions - static inline int left (int i) { return i*2+1; } - static inline int right (int i) { return (i+1)*2; } - static inline int parent(int i) { return (i-1) >> 1; } - - - void percolateUp(int i) - { - int x = heap[i]; - int p = parent(i); - - while (i != 0 && lt(x, heap[p])){ - heap[i] = heap[p]; - indices[heap[p]] = i; - i = p; - p = parent(p); - } - heap [i] = x; - indices[x] = i; - } - - - void percolateDown(int i) - { - int x = heap[i]; - while (left(i) < heap.size()){ - int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); - if (!lt(heap[child], x)) break; - heap[i] = heap[child]; - indices[heap[i]] = i; - i = child; - } - heap [i] = x; - indices[x] = i; - } - - - public: - Heap(const Comp& c) : lt(c) { } - - int size () const { return heap.size(); } - bool empty () const { return heap.size() == 0; } - bool inHeap (int n) const { return n < indices.size() && indices[n] >= 0; } - int operator[](int index) const { assert(index < heap.size()); return heap[index]; } - - - void decrease (int n) { assert(inHeap(n)); percolateUp (indices[n]); } - void increase (int n) { assert(inHeap(n)); percolateDown(indices[n]); } - - - // Safe variant of insert/decrease/increase: - void update(int n) - { - if (!inHeap(n)) - insert(n); - else { - percolateUp(indices[n]); - percolateDown(indices[n]); } - } - - - void insert(int n) - { - indices.growTo(n+1, -1); - assert(!inHeap(n)); - - indices[n] = heap.size(); - heap.push(n); - percolateUp(indices[n]); - } - - - int removeMin() - { - int x = heap[0]; - heap[0] = heap.last(); - indices[heap[0]] = 0; - indices[x] = -1; - heap.pop(); - if (heap.size() > 1) percolateDown(0); - return x; - } - - - // Rebuild the heap from scratch, using the elements in 'ns': - void build(vec& ns) { - for (int i = 0; i < heap.size(); i++) - indices[heap[i]] = -1; - heap.clear(); - - for (int i = 0; i < ns.size(); i++){ - indices[ns[i]] = i; - heap.push(ns[i]); } - - for (int i = heap.size() / 2 - 1; i >= 0; i--) - percolateDown(i); - } - - void clear(bool dealloc = false) - { - for (int i = 0; i < heap.size(); i++) - indices[heap[i]] = -1; - heap.clear(dealloc); - } -}; - - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/IntTypesMtl.h b/src/vendor/stp/src/sat/mtl/IntTypesMtl.h deleted file mode 100644 index c48816284..000000000 --- a/src/vendor/stp/src/sat/mtl/IntTypesMtl.h +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************************[IntTypes.h] -Copyright (c) 2009-2010, Niklas Sorensson - -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 Minisat_IntTypes_h -#define Minisat_IntTypes_h - -#ifdef __sun - // Not sure if there are newer versions that support C99 headers. The - // needed features are implemented in the headers below though: - -# include -# include -# include - -#else - -# include -# include - -#endif - -#include - -//================================================================================================= - -#endif diff --git a/src/vendor/stp/src/sat/mtl/Map.h b/src/vendor/stp/src/sat/mtl/Map.h deleted file mode 100644 index 38dee2d0b..000000000 --- a/src/vendor/stp/src/sat/mtl/Map.h +++ /dev/null @@ -1,193 +0,0 @@ -/*******************************************************************************************[Map.h] -Copyright (c) 2006-2010, Niklas Sorensson - -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 Minisat_Map_h -#define Minisat_Map_h - -#include "../mtl/IntTypesMtl.h" -#include "../mtl/Vec.h" - -namespace Minisat { - -//================================================================================================= -// Default hash/equals functions -// - -static inline uint32_t hash(uint32_t x){ return x; } -static inline uint32_t hash(uint64_t x){ return (uint32_t)x; } -static inline uint32_t hash(int32_t x) { return (uint32_t)x; } -static inline uint32_t hash(int64_t x) { return (uint32_t)x; } - -template struct Hash { uint32_t operator()(const K& k) const { return hash(k); } }; -template struct Equal { bool operator()(const K& k1, const K& k2) const { return k1 == k2; } }; - -template struct DeepHash { uint32_t operator()(const K* k) const { return hash(*k); } }; -template struct DeepEqual { bool operator()(const K* k1, const K* k2) const { return *k1 == *k2; } }; - - -//================================================================================================= -// Some primes -// - -static const int nprimes = 25; -static const int primes [nprimes] = { 31, 73, 151, 313, 643, 1291, 2593, 5233, 10501, 21013, 42073, 84181, 168451, 337219, 674701, 1349473, 2699299, 5398891, 10798093, 21596719, 43193641, 86387383, 172775299, 345550609, 691101253 }; - -//================================================================================================= -// Hash table implementation of Maps -// - -template, class E = Equal > -class Map { - public: - struct Pair { K key; D data; }; - - private: - H hash; - E equals; - - vec* table; - int cap; - int size; - - // Don't allow copying (error prone): - Map& operator = (Map& other) { assert(0); } - Map (Map& other) { assert(0); } - - bool checkCap(int new_size) const { return new_size > cap; } - - int32_t index (const K& k) const { return hash(k) % cap; } - void _insert (const K& k, const D& d) { - vec& ps = table[index(k)]; - ps.push(); ps.last().key = k; ps.last().data = d; } - - void rehash () { - const vec* old = table; - - int old_cap = cap; - int newsize = primes[0]; - for (int i = 1; newsize <= cap && i < nprimes; i++) - newsize = primes[i]; - - table = new vec[newsize]; - cap = newsize; - - for (int i = 0; i < old_cap; i++){ - for (int j = 0; j < old[i].size(); j++){ - _insert(old[i][j].key, old[i][j].data); }} - - delete [] old; - - // printf(" --- rehashing, old-cap=%d, new-cap=%d\n", cap, newsize); - } - - - public: - - Map () : table(NULL), cap(0), size(0) {} - Map (const H& h, const E& e) : hash(h), equals(e), table(NULL), cap(0), size(0){} - ~Map () { delete [] table; } - - // PRECONDITION: the key must already exist in the map. - const D& operator [] (const K& k) const - { - assert(size != 0); - const D* res = NULL; - const vec& ps = table[index(k)]; - for (int i = 0; i < ps.size(); i++) - if (equals(ps[i].key, k)) - res = &ps[i].data; - assert(res != NULL); - return *res; - } - - // PRECONDITION: the key must already exist in the map. - D& operator [] (const K& k) - { - assert(size != 0); - D* res = NULL; - vec& ps = table[index(k)]; - for (int i = 0; i < ps.size(); i++) - if (equals(ps[i].key, k)) - res = &ps[i].data; - assert(res != NULL); - return *res; - } - - // PRECONDITION: the key must *NOT* exist in the map. - void insert (const K& k, const D& d) { if (checkCap(size+1)) rehash(); _insert(k, d); size++; } - bool peek (const K& k, D& d) const { - if (size == 0) return false; - const vec& ps = table[index(k)]; - for (int i = 0; i < ps.size(); i++) - if (equals(ps[i].key, k)){ - d = ps[i].data; - return true; } - return false; - } - - bool has (const K& k) const { - if (size == 0) return false; - const vec& ps = table[index(k)]; - for (int i = 0; i < ps.size(); i++) - if (equals(ps[i].key, k)) - return true; - return false; - } - - // PRECONDITION: the key must exist in the map. - void remove(const K& k) { - assert(table != NULL); - vec& ps = table[index(k)]; - int j = 0; - for (; j < ps.size() && !equals(ps[j].key, k); j++); - assert(j < ps.size()); - ps[j] = ps.last(); - ps.pop(); - size--; - } - - void clear () { - cap = size = 0; - delete [] table; - table = NULL; - } - - int elems() const { return size; } - int bucket_count() const { return cap; } - - // NOTE: the hash and equality objects are not moved by this method: - void moveTo(Map& other){ - delete [] other.table; - - other.table = table; - other.cap = cap; - other.size = size; - - table = NULL; - size = cap = 0; - } - - // NOTE: given a bit more time, I could make a more C++-style iterator out of this: - const vec& bucket(int i) const { return table[i]; } -}; - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/Queue.h b/src/vendor/stp/src/sat/mtl/Queue.h deleted file mode 100644 index 6fb8a7d24..000000000 --- a/src/vendor/stp/src/sat/mtl/Queue.h +++ /dev/null @@ -1,69 +0,0 @@ -/*****************************************************************************************[Queue.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Queue_h -#define Minisat_Queue_h - -#include "../mtl/Vec.h" - -namespace Minisat { - -//================================================================================================= - -template -class Queue { - vec buf; - int first; - int end; - -public: - typedef T Key; - - Queue() : buf(1), first(0), end(0) {} - - void clear (bool dealloc = false) { buf.clear(dealloc); buf.growTo(1); first = end = 0; } - int size () const { return (end >= first) ? end - first : end - first + buf.size(); } - - const T& operator [] (int index) const { assert(index >= 0); assert(index < size()); return buf[(first + index) % buf.size()]; } - T& operator [] (int index) { assert(index >= 0); assert(index < size()); return buf[(first + index) % buf.size()]; } - - T peek () const { assert(first != end); return buf[first]; } - void pop () { assert(first != end); first++; if (first == buf.size()) first = 0; } - void insert(T elem) { // INVARIANT: buf[end] is always unused - buf[end++] = elem; - if (end == buf.size()) end = 0; - if (first == end){ // Resize: - vec tmp((buf.size()*3 + 1) >> 1); - //**/printf("queue alloc: %d elems (%.1f MB)\n", tmp.size(), tmp.size() * sizeof(T) / 1000000.0); - int i = 0; - for (int j = first; j < buf.size(); j++) tmp[i++] = buf[j]; - for (int j = 0 ; j < end ; j++) tmp[i++] = buf[j]; - first = 0; - end = buf.size(); - tmp.moveTo(buf); - } - } -}; - - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/Sort.h b/src/vendor/stp/src/sat/mtl/Sort.h deleted file mode 100644 index 33e43ad44..000000000 --- a/src/vendor/stp/src/sat/mtl/Sort.h +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************************[Sort.h] -Copyright (c) 2003-2007, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Sort_h -#define Minisat_Sort_h - -#include "../mtl/Vec.h" - -//================================================================================================= -// Some sorting algorithms for vec's - - -namespace Minisat { - -template -struct LessThan_default { - bool operator () (T x, T y) { return x < y; } -}; - - -template -void selectionSort(T* array, int size, LessThan lt) -{ - int i, j, best_i; - T tmp; - - for (i = 0; i < size-1; i++){ - best_i = i; - for (j = i+1; j < size; j++){ - if (lt(array[j], array[best_i])) - best_i = j; - } - tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp; - } -} -template static inline void selectionSort(T* array, int size) { - selectionSort(array, size, LessThan_default()); } - -template -void sort(T* array, int size, LessThan lt) -{ - if (size <= 15) - selectionSort(array, size, lt); - - else{ - T pivot = array[size / 2]; - T tmp; - int i = -1; - int j = size; - - for(;;){ - do i++; while(lt(array[i], pivot)); - do j--; while(lt(pivot, array[j])); - - if (i >= j) break; - - tmp = array[i]; array[i] = array[j]; array[j] = tmp; - } - - sort(array , i , lt); - sort(&array[i], size-i, lt); - } -} -template static inline void sort(T* array, int size) { - sort(array, size, LessThan_default()); } - - -//================================================================================================= -// For 'vec's: - - -template void sort(vec& v, LessThan lt) { - sort((T*)v, v.size(), lt); } -template void sort(vec& v) { - sort(v, LessThan_default()); } - - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/Vec.h b/src/vendor/stp/src/sat/mtl/Vec.h deleted file mode 100644 index 9974481e3..000000000 --- a/src/vendor/stp/src/sat/mtl/Vec.h +++ /dev/null @@ -1,130 +0,0 @@ -/*******************************************************************************************[Vec.h] -Copyright (c) 2003-2007, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_Vec_h -#define Minisat_Vec_h - -#include -#include - -#include "../mtl/IntTypesMtl.h" -#include "../mtl/XAlloc.h" - -namespace Minisat { - -//================================================================================================= -// Automatically resizable arrays -// -// NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) - -template -class vec { - T* data; - int sz; - int cap; - - // Don't allow copying (error prone): - vec& operator = (vec& other) { assert(0); return *this; } - vec (vec& other) { assert(0); } - - // Helpers for calculating next capacity: - static inline int imax (int x, int y) { int mask = (y-x) >> (sizeof(int)*8-1); return (x&mask) + (y&(~mask)); } - //static inline void nextCap(int& cap){ cap += ((cap >> 1) + 2) & ~1; } - static inline void nextCap(int& cap){ cap += ((cap >> 1) + 2) & ~1; } - -public: - // Constructors: - vec() : data(NULL) , sz(0) , cap(0) { } - explicit vec(int size) : data(NULL) , sz(0) , cap(0) { growTo(size); } - vec(int size, const T& pad) : data(NULL) , sz(0) , cap(0) { growTo(size, pad); } - ~vec() { clear(true); } - - // Pointer to first element: - operator T* (void) { return data; } - - // Size operations: - int size (void) const { return sz; } - void shrink (int nelems) { assert(nelems <= sz); for (int i = 0; i < nelems; i++) sz--, data[sz].~T(); } - void shrink_ (int nelems) { assert(nelems <= sz); sz -= nelems; } - int capacity (void) const { return cap; } - void capacity (int min_cap); - void growTo (int size); - void growTo (int size, const T& pad); - void clear (bool dealloc = false); - - // Stack interface: - void push (void) { if (sz == cap) capacity(sz+1); new (&data[sz]) T(); sz++; } - void push (const T& elem) { if (sz == cap) capacity(sz+1); data[sz++] = elem; } - void push_ (const T& elem) { assert(sz < cap); data[sz++] = elem; } - void pop (void) { assert(sz > 0); sz--, data[sz].~T(); } - // NOTE: it seems possible that overflow can happen in the 'sz+1' expression of 'push()', but - // in fact it can not since it requires that 'cap' is equal to INT_MAX. This in turn can not - // happen given the way capacities are calculated (below). Essentially, all capacities are - // even, but INT_MAX is odd. - - const T& last (void) const { return data[sz-1]; } - T& last (void) { return data[sz-1]; } - - // Vector interface: - const T& operator [] (int index) const { return data[index]; } - T& operator [] (int index) { return data[index]; } - - // Duplicatation (preferred instead): - void copyTo(vec& copy) const { copy.clear(); copy.growTo(sz); for (int i = 0; i < sz; i++) copy[i] = data[i]; } - void moveTo(vec& dest) { dest.clear(true); dest.data = data; dest.sz = sz; dest.cap = cap; data = NULL; sz = 0; cap = 0; } -}; - - -template -void vec::capacity(int min_cap) { - if (cap >= min_cap) return; - int add = imax((min_cap - cap + 1) & ~1, ((cap >> 1) + 2) & ~1); // NOTE: grow by approximately 3/2 - if (add > INT_MAX - cap || (((data = (T*)::realloc(data, (cap += add) * sizeof(T))) == NULL) && errno == ENOMEM)) - throw OutOfMemoryException(); - } - - -template -void vec::growTo(int size, const T& pad) { - if (sz >= size) return; - capacity(size); - for (int i = sz; i < size; i++) data[i] = pad; - sz = size; } - - -template -void vec::growTo(int size) { - if (sz >= size) return; - capacity(size); - for (int i = sz; i < size; i++) new (&data[i]) T(); - sz = size; } - - -template -void vec::clear(bool dealloc) { - if (data != NULL){ - for (int i = 0; i < sz; i++) data[i].~T(); - sz = 0; - if (dealloc) free(data), data = NULL, cap = 0; } } - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/XAlloc.h b/src/vendor/stp/src/sat/mtl/XAlloc.h deleted file mode 100644 index 1da176028..000000000 --- a/src/vendor/stp/src/sat/mtl/XAlloc.h +++ /dev/null @@ -1,45 +0,0 @@ -/****************************************************************************************[XAlloc.h] -Copyright (c) 2009-2010, Niklas Sorensson - -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 Minisat_XAlloc_h -#define Minisat_XAlloc_h - -#include -#include - -namespace Minisat { - -//================================================================================================= -// Simple layer on top of malloc/realloc to catch out-of-memory situtaions and provide some typing: - -class OutOfMemoryException{}; -static inline void* xrealloc(void *ptr, size_t size) -{ - void* mem = realloc(ptr, size); - if (mem == NULL && errno == ENOMEM){ - throw OutOfMemoryException(); - }else - return mem; -} - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/mtl/template.mk b/src/vendor/stp/src/sat/mtl/template.mk deleted file mode 100644 index 103582ea7..000000000 --- a/src/vendor/stp/src/sat/mtl/template.mk +++ /dev/null @@ -1,108 +0,0 @@ -## -## Template makefile for Standard, Profile, Debug, Release, and Release-static versions -## -## eg: "make rs" for a statically linked release version. -## "make d" for a debug version (no optimizations). -## "make" for the standard version (optimized, but with debug information and assertions active) - -PWD = $(shell pwd) -EXEC ?= $(notdir $(PWD)) - -CSRCS = $(wildcard $(PWD)/*.cc) -DSRCS = $(foreach dir, $(DEPDIR), $(filter-out $(MROOT)/$(dir)/Main.cc, $(wildcard $(MROOT)/$(dir)/*.cc))) -CHDRS = $(wildcard $(PWD)/*.h) -COBJS = $(CSRCS:.cc=.o) $(DSRCS:.cc=.o) - -PCOBJS = $(addsuffix p, $(COBJS)) -DCOBJS = $(addsuffix d, $(COBJS)) -RCOBJS = $(addsuffix r, $(COBJS)) - - -CXX ?= g++ -CFLAGS ?= -Wall -Wno-parentheses -LFLAGS ?= -Wall - -COPTIMIZE ?= -O3 - -CFLAGS += -I$(MROOT) -D __STDC_LIMIT_MACROS -D __STDC_FORMAT_MACROS -LFLAGS += -lz - -.PHONY : s p d r rs clean - -s: $(EXEC) -p: $(EXEC)_profile -d: $(EXEC)_debug -r: $(EXEC)_release -rs: $(EXEC)_static - -libs: lib$(LIB)_standard.a -libp: lib$(LIB)_profile.a -libd: lib$(LIB)_debug.a -libr: lib$(LIB)_release.a - -## Compile options -%.o: CFLAGS +=$(COPTIMIZE) -g -D DEBUG -%.op: CFLAGS +=$(COPTIMIZE) -pg -g -D NDEBUG -%.od: CFLAGS +=-O0 -g -D DEBUG -%.or: CFLAGS +=$(COPTIMIZE) -g -D NDEBUG - -## Link options -$(EXEC): LFLAGS += -g -$(EXEC)_profile: LFLAGS += -g -pg -$(EXEC)_debug: LFLAGS += -g -#$(EXEC)_release: LFLAGS += ... -$(EXEC)_static: LFLAGS += --static - -## Dependencies -$(EXEC): $(COBJS) -$(EXEC)_profile: $(PCOBJS) -$(EXEC)_debug: $(DCOBJS) -$(EXEC)_release: $(RCOBJS) -$(EXEC)_static: $(RCOBJS) - -lib$(LIB)_standard.a: $(filter-out %/Main.o, $(COBJS)) -lib$(LIB)_profile.a: $(filter-out %/Main.op, $(PCOBJS)) -lib$(LIB)_debug.a: $(filter-out %/Main.od, $(DCOBJS)) -lib$(LIB)_release.a: $(filter-out %/Main.or, $(RCOBJS)) - - -## Build rule -%.o %.op %.od %.or: %.cc - @echo Compiling: $(subst $(MROOT)/,,$@) - @$(CXX) $(CFLAGS) -c -o $@ $< - -## Linking rules (standard/profile/debug/release) -$(EXEC) $(EXEC)_profile $(EXEC)_debug $(EXEC)_release $(EXEC)_static: - @echo Linking: "$@ ( $(foreach f,$^,$(subst $(MROOT)/,,$f)) )" - @$(CXX) $^ $(LFLAGS) -o $@ - -## Library rules (standard/profile/debug/release) -lib$(LIB)_standard.a lib$(LIB)_profile.a lib$(LIB)_release.a lib$(LIB)_debug.a: - @echo Making library: "$@ ( $(foreach f,$^,$(subst $(MROOT)/,,$f)) )" - @$(AR) -rcsv $@ $^ - -## Library Soft Link rule: -libs libp libd libr: - @echo "Making Soft Link: $^ -> lib$(LIB).a" - @ln -sf $^ lib$(LIB).a - -## Clean rule -clean: - @$(RM) $(EXEC) $(EXEC)_profile $(EXEC)_debug $(EXEC)_release $(EXEC)_static \ - lib$(LIB).a lib$(LIB)_standard.a lib$(LIB)_profile.a lib$(LIB)_release.a lib$(LIB)_debug.a \ - $(COBJS) $(PCOBJS) $(DCOBJS) $(RCOBJS) *.core depend.mk - -## Make dependencies -depend.mk: $(CSRCS) $(CHDRS) - @echo Making dependencies - @$(CXX) $(CFLAGS) -I$(MROOT) \ - $(CSRCS) -MM | sed 's|\(.*\):|$(PWD)/\1 $(PWD)/\1r $(PWD)/\1d $(PWD)/\1p:|' > depend.mk - @for dir in $(DEPDIR); do \ - if [ -r $(MROOT)/$${dir}/depend.mk ]; then \ - echo Depends on: $${dir}; \ - cat $(MROOT)/$${dir}/depend.mk >> depend.mk; \ - fi; \ - done - --include $(MROOT)/mtl/config.mk --include depend.mk diff --git a/src/vendor/stp/src/sat/simp/Main.cc b/src/vendor/stp/src/sat/simp/Main.cc deleted file mode 100644 index 0f4e756b1..000000000 --- a/src/vendor/stp/src/sat/simp/Main.cc +++ /dev/null @@ -1,211 +0,0 @@ -/*****************************************************************************************[Main.cc] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007, Niklas Sorensson - -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 "../utils/System.h" -#include "../utils/ParseUtils.h" -#include "../utils/Options.h" -#include "../core/Dimacs.h" -#include "../simp/SimpSolver.h" - -using namespace Minisat; - -//================================================================================================= - - -void printStats(Solver& solver) -{ - double cpu_time = cpuTime(); - double mem_used = memUsedPeak(); - printf("restarts : %" PRIu64 "\n", solver.starts); - printf("conflicts : %-12" PRIu64 " (%.0f /sec)\n", solver.conflicts , solver.conflicts /cpu_time); - printf("decisions : %-12" PRIu64 " (%4.2f %% random) (%.0f /sec)\n", solver.decisions, (float)solver.rnd_decisions*100 / (float)solver.decisions, solver.decisions /cpu_time); - printf("propagations : %-12" PRIu64 " (%.0f /sec)\n", solver.propagations, solver.propagations/cpu_time); - printf("conflict literals : %-12" PRIu64 " (%4.2f %% deleted)\n", solver.tot_literals, (solver.max_literals - solver.tot_literals)*100 / (double)solver.max_literals); - if (mem_used != 0) printf("Memory used : %.2f MB\n", mem_used); - printf("CPU time : %g s\n", cpu_time); -} - - -static Solver* solver; -// Terminate by notifying the solver and back out gracefully. This is mainly to have a test-case -// for this feature of the Solver as it may take longer than an immediate call to '_exit()'. -static void SIGINT_interrupt(int signum) { solver->interrupt(); } - -// Note that '_exit()' rather than 'exit()' has to be used. The reason is that 'exit()' calls -// destructors and may cause deadlocks if a malloc/free function happens to be running (these -// functions are guarded by locks for multithreaded use). -static void SIGINT_exit(int signum) { - printf("\n"); printf("*** INTERRUPTED ***\n"); - if (solver->verbosity > 0){ - printStats(*solver); - printf("\n"); printf("*** INTERRUPTED ***\n"); } - _exit(1); } - - -//================================================================================================= -// Main: - -int main(int argc, char** argv) -{ - try { - setUsageHelp("USAGE: %s [options] \n\n where input may be either in plain or gzipped DIMACS.\n"); - // printf("This is MiniSat 2.0 beta\n"); - -#if defined(__linux__) - fpu_control_t oldcw, newcw; - _FPU_GETCW(oldcw); newcw = (oldcw & ~_FPU_EXTENDED) | _FPU_DOUBLE; _FPU_SETCW(newcw); - printf("WARNING: for repeatability, setting FPU to use double precision\n"); -#endif - // Extra options: - // - IntOption verb ("MAIN", "verb", "Verbosity level (0=silent, 1=some, 2=more).", 1, IntRange(0, 2)); - BoolOption pre ("MAIN", "pre", "Completely turn on/off any preprocessing.", true); - StringOption dimacs ("MAIN", "dimacs", "If given, stop after preprocessing and write the result to this file."); - IntOption cpu_lim("MAIN", "cpu-lim","Limit on CPU time allowed in seconds.\n", INT32_MAX, IntRange(0, INT32_MAX)); - IntOption mem_lim("MAIN", "mem-lim","Limit on memory usage in megabytes.\n", INT32_MAX, IntRange(0, INT32_MAX)); - - parseOptions(argc, argv, true); - - SimpSolver S; - double initial_time = cpuTime(); - - if (!pre) S.eliminate(true); - - S.verbosity = verb; - - solver = &S; - // Use signal handlers that forcibly quit until the solver will be able to respond to - // interrupts: - signal(SIGINT, SIGINT_exit); - signal(SIGXCPU,SIGINT_exit); - - // Set limit on CPU-time: - if (cpu_lim != INT32_MAX){ - rlimit rl; - getrlimit(RLIMIT_CPU, &rl); - if (rl.rlim_max == RLIM_INFINITY || (rlim_t)cpu_lim < rl.rlim_max){ - rl.rlim_cur = cpu_lim; - if (setrlimit(RLIMIT_CPU, &rl) == -1) - printf("WARNING! Could not set resource limit: CPU-time.\n"); - } } - - // Set limit on virtual memory: - if (mem_lim != INT32_MAX){ - rlim_t new_mem_lim = (rlim_t)mem_lim * 1024*1024; - rlimit rl; - getrlimit(RLIMIT_AS, &rl); - if (rl.rlim_max == RLIM_INFINITY || new_mem_lim < rl.rlim_max){ - rl.rlim_cur = new_mem_lim; - if (setrlimit(RLIMIT_AS, &rl) == -1) - printf("WARNING! Could not set resource limit: Virtual memory.\n"); - } } - - if (argc == 1) - printf("Reading from standard input... Use '--help' for help.\n"); - - gzFile in = (argc == 1) ? gzdopen(0, "rb") : gzopen(argv[1], "rb"); - if (in == NULL) - printf("ERROR! Could not open file: %s\n", argc == 1 ? "" : argv[1]), exit(1); - - if (S.verbosity > 0){ - printf("============================[ Problem Statistics ]=============================\n"); - printf("| |\n"); } - - parse_DIMACS(in, S); - gzclose(in); - FILE* res = (argc >= 3) ? fopen(argv[2], "wb") : NULL; - - if (S.verbosity > 0){ - printf("| Number of variables: %12d |\n", S.nVars()); - printf("| Number of clauses: %12d |\n", S.nClauses()); } - - double parsed_time = cpuTime(); - if (S.verbosity > 0) - printf("| Parse time: %12.2f s |\n", parsed_time - initial_time); - - // Change to signal-handlers that will only notify the solver and allow it to terminate - // voluntarily: - signal(SIGINT, SIGINT_interrupt); - signal(SIGXCPU,SIGINT_interrupt); - - S.eliminate(true); - double simplified_time = cpuTime(); - if (S.verbosity > 0){ - printf("| Simplification time: %12.2f s |\n", simplified_time - parsed_time); - printf("| |\n"); } - - if (!S.okay()){ - if (res != NULL) fprintf(res, "UNSAT\n"), fclose(res); - if (S.verbosity > 0){ - printf("===============================================================================\n"); - printf("Solved by simplification\n"); - printStats(S); - printf("\n"); } - printf("UNSATISFIABLE\n"); - exit(20); - } - - if (dimacs){ - if (S.verbosity > 0) - printf("==============================[ Writing DIMACS ]===============================\n"); - S.toDimacs((const char*)dimacs); - if (S.verbosity > 0) - printStats(S); - exit(0); - } - - vec dummy; - lbool ret = S.solveLimited(dummy); - - if (S.verbosity > 0){ - printStats(S); - printf("\n"); } - printf(ret == l_True ? "SATISFIABLE\n" : ret == l_False ? "UNSATISFIABLE\n" : "INDETERMINATE\n"); - if (res != NULL){ - if (ret == l_True){ - fprintf(res, "SAT\n"); - for (int i = 0; i < S.nVars(); i++) - if (S.model[i] != l_Undef) - fprintf(res, "%s%s%d", (i==0)?"":" ", (S.model[i]==l_True)?"":"-", i+1); - fprintf(res, " 0\n"); - }else if (ret == l_False) - fprintf(res, "UNSAT\n"); - else - fprintf(res, "INDET\n"); - fclose(res); - } - -#ifdef NDEBUG - exit(ret == l_True ? 10 : ret == l_False ? 20 : 0); // (faster than "return", which will invoke the destructor for 'Solver') -#else - return (ret == l_True ? 10 : ret == l_False ? 20 : 0); -#endif - } catch (OutOfMemoryException&){ - printf("===============================================================================\n"); - printf("INDETERMINATE\n"); - exit(0); - } -} diff --git a/src/vendor/stp/src/sat/simp/Makefile b/src/vendor/stp/src/sat/simp/Makefile deleted file mode 100644 index 7dc27a118..000000000 --- a/src/vendor/stp/src/sat/simp/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -EXEC = minisat -DEPDIR = mtl utils core -LIB = simp -MROOT =.. - -include $(MROOT)/mtl/template.mk diff --git a/src/vendor/stp/src/sat/simp/SimpSolver.cc b/src/vendor/stp/src/sat/simp/SimpSolver.cc deleted file mode 100644 index b91a8f1cd..000000000 --- a/src/vendor/stp/src/sat/simp/SimpSolver.cc +++ /dev/null @@ -1,718 +0,0 @@ -/***********************************************************************************[SimpSolver.cc] -Copyright (c) 2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 "../mtl/Sort.h" -#include "../simp/SimpSolver.h" -#include "../utils/System.h" - -using namespace Minisat; - -//================================================================================================= -// Options: - - -static const char* _cat = "SIMP"; - -static BoolOption opt_use_asymm (_cat, "asymm", "Shrink clauses by asymmetric branching.", false); -static BoolOption opt_use_rcheck (_cat, "rcheck", "Check if a clause is already implied. (costly)", false); -static BoolOption opt_use_elim (_cat, "elim", "Perform variable elimination.", true); -static IntOption opt_grow (_cat, "grow", "Allow a variable elimination step to grow by a number of clauses.", 0); -static IntOption opt_clause_lim (_cat, "cl-lim", "Variables are not eliminated if it produces a resolvent with a length above this limit. -1 means no limit", 20, IntRange(-1, INT32_MAX)); -static IntOption opt_subsumption_lim (_cat, "sub-lim", "Do not check if subsumption against a clause larger than this. -1 means no limit.", 1000, IntRange(-1, INT32_MAX)); -static DoubleOption opt_simp_garbage_frac(_cat, "simp-gc-frac", "The fraction of wasted memory allowed before a garbage collection is triggered during simplification.", 0.5, DoubleRange(0, false, HUGE_VAL, false)); - - -//================================================================================================= -// Constructor/Destructor: - - -SimpSolver::SimpSolver(volatile bool& interrupt) : - Solver(interrupt), - grow (opt_grow) - , clause_lim (opt_clause_lim) - , subsumption_lim (opt_subsumption_lim) - , simp_garbage_frac (opt_simp_garbage_frac) - , use_asymm (opt_use_asymm) - , use_rcheck (opt_use_rcheck) - , use_elim (opt_use_elim) - , merges (0) - , asymm_lits (0) - , eliminated_vars (0) - , elimorder (1) - , use_simplification (true) - , occurs (ClauseDeleted(ca)) - , elim_heap (ElimLt(n_occ)) - , bwdsub_assigns (0) - , n_touched (0) -{ - vec dummy(1,lit_Undef); - ca.extra_clause_field = true; // NOTE: must happen before allocating the dummy clause below. - bwdsub_tmpunit = ca.alloc(dummy); - remove_satisfied = false; -} - - -SimpSolver::~SimpSolver() -{ -} - - -Var SimpSolver::newVar(bool sign, bool dvar) { - Var v = Solver::newVar(sign, dvar); - - frozen .push((char)false); - eliminated.push((char)false); - - if (use_simplification){ - n_occ .push(0); - n_occ .push(0); - occurs .init(v); - touched .push(0); - elim_heap .insert(v); - } - return v; } - - - -lbool SimpSolver::solve_(bool do_simp, bool turn_off_simp) -{ - vec extra_frozen; - lbool result = l_True; - - do_simp &= use_simplification; - - if (do_simp){ - // Assumptions must be temporarily frozen to run variable elimination: - for (int i = 0; i < assumptions.size(); i++){ - Var v = var(assumptions[i]); - - // If an assumption has been eliminated, remember it. - assert(!isEliminated(v)); - - if (!frozen[v]){ - // Freeze and store. - setFrozen(v, true); - extra_frozen.push(v); - } } - - result = lbool(eliminate(turn_off_simp)); - } - - if (result == l_True) - result = Solver::solve_(); - else if (verbosity >= 1) - printf("===============================================================================\n"); - - if (result == l_True) - extendModel(); - - if (do_simp) - // Unfreeze the assumptions that were frozen: - for (int i = 0; i < extra_frozen.size(); i++) - setFrozen(extra_frozen[i], false); - - return result; -} - - - -bool SimpSolver::addClause_(vec& ps) -{ -#ifndef NDEBUG - for (int i = 0; i < ps.size(); i++) - assert(!isEliminated(var(ps[i]))); -#endif - - int nclauses = clauses.size(); - - if (use_rcheck && implied(ps)) - return true; - - if (!Solver::addClause_(ps)) - return false; - - if (use_simplification && clauses.size() == nclauses + 1){ - CRef cr = clauses.last(); - const Clause& c = ca[cr]; - - // NOTE: the clause is added to the queue immediately and then - // again during 'gatherTouchedClauses()'. If nothing happens - // in between, it will only be checked once. Otherwise, it may - // be checked twice unnecessarily. This is an unfortunate - // consequence of how backward subsumption is used to mimic - // forward subsumption. - subsumption_queue.insert(cr); - for (int i = 0; i < c.size(); i++){ - occurs[var(c[i])].push(cr); - n_occ[toInt(c[i])]++; - touched[var(c[i])] = 1; - n_touched++; - if (elim_heap.inHeap(var(c[i]))) - elim_heap.increase(var(c[i])); - } - } - - return true; -} - - -void SimpSolver::removeClause(CRef cr) -{ - const Clause& c = ca[cr]; - - if (use_simplification) - for (int i = 0; i < c.size(); i++){ - n_occ[toInt(c[i])]--; - updateElimHeap(var(c[i])); - occurs.smudge(var(c[i])); - } - - Solver::removeClause(cr); -} - - -bool SimpSolver::strengthenClause(CRef cr, Lit l) -{ - Clause& c = ca[cr]; - assert(decisionLevel() == 0); - assert(use_simplification); - - // FIX: this is too inefficient but would be nice to have (properly implemented) - // if (!find(subsumption_queue, &c)) - subsumption_queue.insert(cr); - - if (c.size() == 2){ - removeClause(cr); - c.strengthen(l); - }else{ - detachClause(cr, true); - c.strengthen(l); - attachClause(cr); - remove(occurs[var(l)], cr); - n_occ[toInt(l)]--; - updateElimHeap(var(l)); - } - - return c.size() == 1 ? enqueue(c[0]) && propagate() == CRef_Undef : true; -} - - -// Returns FALSE if clause is always satisfied ('out_clause' should not be used). -bool SimpSolver::merge(const Clause& _ps, const Clause& _qs, Var v, vec& out_clause) -{ - merges++; - out_clause.clear(); - - bool ps_smallest = _ps.size() < _qs.size(); - const Clause& ps = ps_smallest ? _qs : _ps; - const Clause& qs = ps_smallest ? _ps : _qs; - - for (int i = 0; i < qs.size(); i++){ - if (var(qs[i]) != v){ - for (int j = 0; j < ps.size(); j++) - if (var(ps[j]) == var(qs[i])) - if (ps[j] == ~qs[i]) - return false; - else - goto next; - out_clause.push(qs[i]); - } - next:; - } - - for (int i = 0; i < ps.size(); i++) - if (var(ps[i]) != v) - out_clause.push(ps[i]); - - return true; -} - - -// Returns FALSE if clause is always satisfied. -bool SimpSolver::merge(const Clause& _ps, const Clause& _qs, Var v, int& size) -{ - merges++; - - bool ps_smallest = _ps.size() < _qs.size(); - const Clause& ps = ps_smallest ? _qs : _ps; - const Clause& qs = ps_smallest ? _ps : _qs; - const Lit* __ps = (const Lit*)ps; - const Lit* __qs = (const Lit*)qs; - - size = ps.size()-1; - - for (int i = 0; i < qs.size(); i++){ - if (var(__qs[i]) != v){ - for (int j = 0; j < ps.size(); j++) - if (var(__ps[j]) == var(__qs[i])) - if (__ps[j] == ~__qs[i]) - return false; - else - goto next; - size++; - } - next:; - } - - return true; -} - - -void SimpSolver::gatherTouchedClauses() -{ - if (n_touched == 0) return; - - int i,j; - for (i = j = 0; i < subsumption_queue.size(); i++) - if (ca[subsumption_queue[i]].mark() == 0) - ca[subsumption_queue[i]].mark(2); - - for (i = 0; i < touched.size(); i++) - if (touched[i]){ - const vec& cs = occurs.lookup(i); - for (j = 0; j < cs.size(); j++) - if (ca[cs[j]].mark() == 0){ - subsumption_queue.insert(cs[j]); - ca[cs[j]].mark(2); - } - touched[i] = 0; - } - - for (i = 0; i < subsumption_queue.size(); i++) - if (ca[subsumption_queue[i]].mark() == 2) - ca[subsumption_queue[i]].mark(0); - - n_touched = 0; -} - - -bool SimpSolver::implied(const vec& c) -{ - assert(decisionLevel() == 0); - - trail_lim.push(trail.size()); - for (int i = 0; i < c.size(); i++) - if (value(c[i]) == l_True){ - cancelUntil(0); - return false; - }else if (value(c[i]) != l_False){ - assert(value(c[i]) == l_Undef); - uncheckedEnqueue(~c[i]); - } - - bool result = propagate() != CRef_Undef; - cancelUntil(0); - return result; -} - - -// Backward subsumption + backward subsumption resolution -bool SimpSolver::backwardSubsumptionCheck(bool verbose) -{ - int cnt = 0; - int subsumed = 0; - int deleted_literals = 0; - assert(decisionLevel() == 0); - - while (subsumption_queue.size() > 0 || bwdsub_assigns < trail.size()){ - - // Empty subsumption queue and return immediately on user-interrupt: - if (asynch_interrupt){ - subsumption_queue.clear(); - bwdsub_assigns = trail.size(); - break; } - - // Check top-level assignments by creating a dummy clause and placing it in the queue: - if (subsumption_queue.size() == 0 && bwdsub_assigns < trail.size()){ - Lit l = trail[bwdsub_assigns++]; - ca[bwdsub_tmpunit][0] = l; - ca[bwdsub_tmpunit].calcAbstraction(); - subsumption_queue.insert(bwdsub_tmpunit); } - - CRef cr = subsumption_queue.peek(); subsumption_queue.pop(); - Clause& c = ca[cr]; - - if (c.mark()) continue; - - if (verbose && verbosity >= 2 && cnt++ % 1000 == 0) - printf("subsumption left: %10d (%10d subsumed, %10d deleted literals)\r", subsumption_queue.size(), subsumed, deleted_literals); - - assert(c.size() > 1 || value(c[0]) == l_True); // Unit-clauses should have been propagated before this point. - - // Find best variable to scan: - Var best = var(c[0]); - for (int i = 1; i < c.size(); i++) - if (occurs[var(c[i])].size() < occurs[best].size()) - best = var(c[i]); - - // Search all candidates: - vec& _cs = occurs.lookup(best); - CRef* cs = (CRef*)_cs; - - for (int j = 0; j < _cs.size(); j++) - if (c.mark()) - break; - else if (!ca[cs[j]].mark() && cs[j] != cr && (subsumption_lim == -1 || ca[cs[j]].size() < subsumption_lim)){ - Lit l = c.subsumes(ca[cs[j]]); - - if (l == lit_Undef) - subsumed++, removeClause(cs[j]); - else if (l != lit_Error){ - deleted_literals++; - - if (!strengthenClause(cs[j], ~l)) - return false; - - // Did current candidate get deleted from cs? Then check candidate at index j again: - if (var(l) == best) - j--; - } - } - } - - return true; -} - - -bool SimpSolver::asymm(Var v, CRef cr) -{ - Clause& c = ca[cr]; - assert(decisionLevel() == 0); - - if (c.mark() || satisfied(c)) return true; - - trail_lim.push(trail.size()); - Lit l = lit_Undef; - for (int i = 0; i < c.size(); i++) - if (var(c[i]) != v && value(c[i]) != l_False) - uncheckedEnqueue(~c[i]); - else - l = c[i]; - - if (propagate() != CRef_Undef){ - cancelUntil(0); - asymm_lits++; - if (!strengthenClause(cr, l)) - return false; - }else - cancelUntil(0); - - return true; -} - - -bool SimpSolver::asymmVar(Var v) -{ - assert(use_simplification); - - const vec& cls = occurs.lookup(v); - - if (value(v) != l_Undef || cls.size() == 0) - return true; - - for (int i = 0; i < cls.size(); i++) - if (!asymm(v, cls[i])) - return false; - - return backwardSubsumptionCheck(); -} - - -static void mkElimClause(vec& elimclauses, Lit x) -{ - elimclauses.push(toInt(x)); - elimclauses.push(1); -} - - -static void mkElimClause(vec& elimclauses, Var v, Clause& c) -{ - int first = elimclauses.size(); - int v_pos = -1; - - // Copy clause to elimclauses-vector. Remember position where the - // variable 'v' occurs: - for (int i = 0; i < c.size(); i++){ - elimclauses.push(toInt(c[i])); - if (var(c[i]) == v) - v_pos = i + first; - } - assert(v_pos != -1); - - // Swap the first literal with the 'v' literal, so that the literal - // containing 'v' will occur first in the clause: - uint32_t tmp = elimclauses[v_pos]; - elimclauses[v_pos] = elimclauses[first]; - elimclauses[first] = tmp; - - // Store the length of the clause last: - elimclauses.push(c.size()); -} - - - -bool SimpSolver::eliminateVar(Var v) -{ - assert(!frozen[v]); - assert(!isEliminated(v)); - assert(value(v) == l_Undef); - - // Split the occurrences into positive and negative: - // - const vec& cls = occurs.lookup(v); - vec pos, neg; - for (int i = 0; i < cls.size(); i++) - (find(ca[cls[i]], mkLit(v)) ? pos : neg).push(cls[i]); - - // Check wether the increase in number of clauses stays within the allowed ('grow'). Moreover, no - // clause must exceed the limit on the maximal clause size (if it is set): - // - int cnt = 0; - int clause_size = 0; - - for (int i = 0; i < pos.size(); i++) - for (int j = 0; j < neg.size(); j++) - if (merge(ca[pos[i]], ca[neg[j]], v, clause_size) && - (++cnt > cls.size() + grow || (clause_lim != -1 && clause_size > clause_lim))) - return true; - - // Delete and store old clauses: - eliminated[v] = true; - setDecisionVar(v, false); - eliminated_vars++; - - if (pos.size() > neg.size()){ - for (int i = 0; i < neg.size(); i++) - mkElimClause(elimclauses, v, ca[neg[i]]); - mkElimClause(elimclauses, mkLit(v)); - }else{ - for (int i = 0; i < pos.size(); i++) - mkElimClause(elimclauses, v, ca[pos[i]]); - mkElimClause(elimclauses, ~mkLit(v)); - } - - for (int i = 0; i < cls.size(); i++) - removeClause(cls[i]); - - // Produce clauses in cross product: - vec& resolvent = add_tmp; - for (int i = 0; i < pos.size(); i++) - for (int j = 0; j < neg.size(); j++) - if (merge(ca[pos[i]], ca[neg[j]], v, resolvent) && !addClause_(resolvent)) - return false; - - // Free occurs list for this variable: - occurs[v].clear(true); - - // Free watchers lists for this variable, if possible: - if (watches[ mkLit(v)].size() == 0) watches[ mkLit(v)].clear(true); - if (watches[~mkLit(v)].size() == 0) watches[~mkLit(v)].clear(true); - - return backwardSubsumptionCheck(); -} - - -bool SimpSolver::substitute(Var v, Lit x) -{ - assert(!frozen[v]); - assert(!isEliminated(v)); - assert(value(v) == l_Undef); - - if (!ok) return false; - - eliminated[v] = true; - setDecisionVar(v, false); - const vec& cls = occurs.lookup(v); - - vec& subst_clause = add_tmp; - for (int i = 0; i < cls.size(); i++){ - Clause& c = ca[cls[i]]; - - subst_clause.clear(); - for (int j = 0; j < c.size(); j++){ - Lit p = c[j]; - subst_clause.push(var(p) == v ? x ^ sign(p) : p); - } - - removeClause(cls[i]); - - if (!addClause_(subst_clause)) - return ok = false; - } - - return true; -} - - -void SimpSolver::extendModel() -{ - int i, j; - Lit x; - - for (i = elimclauses.size()-1; i > 0; i -= j){ - for (j = elimclauses[i--]; j > 1; j--, i--) - if (modelValue(toLit(elimclauses[i])) != l_False) - goto next; - - x = toLit(elimclauses[i]); - model[var(x)] = lbool(!sign(x)); - next:; - } -} - - -bool SimpSolver::eliminate(bool turn_off_elim) -{ - if (!simplify()) - return false; - else if (!use_simplification) - return true; - - // Main simplification loop: - // - while (n_touched > 0 || bwdsub_assigns < trail.size() || elim_heap.size() > 0){ - - gatherTouchedClauses(); - // printf(" ## (time = %6.2f s) BWD-SUB: queue = %d, trail = %d\n", cpuTime(), subsumption_queue.size(), trail.size() - bwdsub_assigns); - if ((subsumption_queue.size() > 0 || bwdsub_assigns < trail.size()) && - !backwardSubsumptionCheck(true)){ - ok = false; goto cleanup; } - - // Empty elim_heap and return immediately on user-interrupt: - if (asynch_interrupt){ - assert(bwdsub_assigns == trail.size()); - assert(subsumption_queue.size() == 0); - assert(n_touched == 0); - elim_heap.clear(); - goto cleanup; } - - // printf(" ## (time = %6.2f s) ELIM: vars = %d\n", cpuTime(), elim_heap.size()); - for (int cnt = 0; !elim_heap.empty(); cnt++){ - Var elim = elim_heap.removeMin(); - - if (asynch_interrupt) break; - - if (isEliminated(elim) || value(elim) != l_Undef) continue; - - if (verbosity >= 2 && cnt % 100 == 0) - printf("elimination left: %10d\r", elim_heap.size()); - - if (use_asymm){ - // Temporarily freeze variable. Otherwise, it would immediately end up on the queue again: - bool was_frozen = frozen[elim]; - frozen[elim] = true; - if (!asymmVar(elim)){ - ok = false; goto cleanup; } - frozen[elim] = was_frozen; } - - // At this point, the variable may have been set by assymetric branching, so check it - // again. Also, don't eliminate frozen variables: - if (use_elim && value(elim) == l_Undef && !frozen[elim] && !eliminateVar(elim)){ - ok = false; goto cleanup; } - - checkGarbage(simp_garbage_frac); - } - - assert(subsumption_queue.size() == 0); - } - cleanup: - - // If no more simplification is needed, free all simplification-related data structures: - if (turn_off_elim){ - touched .clear(true); - occurs .clear(true); - n_occ .clear(true); - elim_heap.clear(true); - subsumption_queue.clear(true); - - use_simplification = false; - remove_satisfied = true; - ca.extra_clause_field = false; - - // Force full cleanup (this is safe and desirable since it only happens once): - rebuildOrderHeap(); - garbageCollect(); - }else{ - // Cheaper cleanup: - cleanUpClauses(); // TODO: can we make 'cleanUpClauses()' not be linear in the problem size somehow? - checkGarbage(); - } - - if (verbosity >= 1 && elimclauses.size() > 0) - printf("| Eliminated clauses: %10.2f Mb |\n", - double(elimclauses.size() * sizeof(uint32_t)) / (1024*1024)); - - return ok; -} - - -void SimpSolver::cleanUpClauses() -{ - occurs.cleanAll(); - int i,j; - for (i = j = 0; i < clauses.size(); i++) - if (ca[clauses[i]].mark() == 0) - clauses[j++] = clauses[i]; - clauses.shrink(i - j); -} - - -//================================================================================================= -// Garbage Collection methods: - - -void SimpSolver::relocAll(ClauseAllocator& to) -{ - if (!use_simplification) return; - - // All occurs lists: - // - for (int i = 0; i < nVars(); i++){ - vec& cs = occurs[i]; - for (int j = 0; j < cs.size(); j++) - ca.reloc(cs[j], to); - } - - // Subsumption queue: - // - for (int i = 0; i < subsumption_queue.size(); i++) - ca.reloc(subsumption_queue[i], to); - - // Temporary clause: - // - ca.reloc(bwdsub_tmpunit, to); -} - - -void SimpSolver::garbageCollect() -{ - // Initialize the next region to a size corresponding to the estimated utilization degree. This - // is not precise but should avoid some unnecessary reallocations for the new region: - ClauseAllocator to(ca.size() - ca.wasted()); - - cleanUpClauses(); - to.extra_clause_field = ca.extra_clause_field; // NOTE: this is important to keep (or lose) the extra fields. - relocAll(to); - Solver::relocAll(to); - if (verbosity >= 2) - printf("| Garbage collection: %12d bytes => %12d bytes |\n", - ca.size()*ClauseAllocator::Unit_Size, to.size()*ClauseAllocator::Unit_Size); - to.moveTo(ca); -} diff --git a/src/vendor/stp/src/sat/simp/SimpSolver.h b/src/vendor/stp/src/sat/simp/SimpSolver.h deleted file mode 100644 index f5beffa24..000000000 --- a/src/vendor/stp/src/sat/simp/SimpSolver.h +++ /dev/null @@ -1,197 +0,0 @@ -/************************************************************************************[SimpSolver.h] -Copyright (c) 2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_SimpSolver_h -#define Minisat_SimpSolver_h - -#include "../mtl/Queue.h" -#include "../core/Solver.h" - - -namespace Minisat { - -//================================================================================================= - - -class SimpSolver : public Solver { - public: - // Constructor/Destructor: - // - SimpSolver(volatile bool& interrupt); - ~SimpSolver(); - - // Problem specification: - // - Var newVar (bool polarity = true, bool dvar = true); - bool addClause (const vec& ps); - bool addEmptyClause(); // Add the empty clause to the solver. - bool addClause (Lit p); // Add a unit clause to the solver. - bool addClause (Lit p, Lit q); // Add a binary clause to the solver. - bool addClause (Lit p, Lit q, Lit r); // Add a ternary clause to the solver. - bool addClause_( vec& ps); - bool substitute(Var v, Lit x); // Replace all occurences of v with x (may cause a contradiction). - - // Variable mode: - // - void setFrozen (Var v, bool b); // If a variable is frozen it will not be eliminated. - bool isEliminated(Var v) const; - - // Solving: - // - bool solve (const vec& assumps, bool do_simp = true, bool turn_off_simp = false); - lbool solveLimited(const vec& assumps, bool do_simp = true, bool turn_off_simp = false); - bool solve ( bool do_simp = true, bool turn_off_simp = false); - bool solve (Lit p , bool do_simp = true, bool turn_off_simp = false); - bool solve (Lit p, Lit q, bool do_simp = true, bool turn_off_simp = false); - bool solve (Lit p, Lit q, Lit r, bool do_simp = true, bool turn_off_simp = false); - bool eliminate (bool turn_off_elim = false); // Perform variable elimination based simplification. - - // Memory managment: - // - virtual void garbageCollect(); - - - // Generate a (possibly simplified) DIMACS file: - // -#if 0 - void toDimacs (const char* file, const vec& assumps); - void toDimacs (const char* file); - void toDimacs (const char* file, Lit p); - void toDimacs (const char* file, Lit p, Lit q); - void toDimacs (const char* file, Lit p, Lit q, Lit r); -#endif - - // Mode of operation: - // - int grow; // Allow a variable elimination step to grow by a number of clauses (default to zero). - int clause_lim; // Variables are not eliminated if it produces a resolvent with a length above this limit. - // -1 means no limit. - int subsumption_lim; // Do not check if subsumption against a clause larger than this. -1 means no limit. - double simp_garbage_frac; // A different limit for when to issue a GC during simplification (Also see 'garbage_frac'). - - bool use_asymm; // Shrink clauses by asymmetric branching. - bool use_rcheck; // Check if a clause is already implied. Prett costly, and subsumes subsumptions :) - bool use_elim; // Perform variable elimination. - - // Statistics: - // - int merges; - int asymm_lits; - int eliminated_vars; - - protected: - - // Helper structures: - // - struct ElimLt { - const vec& n_occ; - explicit ElimLt(const vec& no) : n_occ(no) {} - - // TODO: are 64-bit operations here noticably bad on 32-bit platforms? Could use a saturating - // 32-bit implementation instead then, but this will have to do for now. - uint64_t cost (Var x) const { return (uint64_t)n_occ[toInt(mkLit(x))] * (uint64_t)n_occ[toInt(~mkLit(x))]; } - bool operator()(Var x, Var y) const { return cost(x) < cost(y); } - - // TODO: investigate this order alternative more. - // bool operator()(Var x, Var y) const { - // int c_x = cost(x); - // int c_y = cost(y); - // return c_x < c_y || c_x == c_y && x < y; } - }; - - struct ClauseDeleted { - const ClauseAllocator& ca; - explicit ClauseDeleted(const ClauseAllocator& _ca) : ca(_ca) {} - bool operator()(const CRef& cr) const { return ca[cr].mark() == 1; } }; - - // Solver state: - // - int elimorder; - bool use_simplification; - vec elimclauses; - vec touched; - OccLists, ClauseDeleted> - occurs; - vec n_occ; - Heap elim_heap; - Queue subsumption_queue; - vec frozen; - vec eliminated; - int bwdsub_assigns; - int n_touched; - - // Temporaries: - // - CRef bwdsub_tmpunit; - - // Main internal methods: - // - lbool solve_ (bool do_simp = true, bool turn_off_simp = false); - bool asymm (Var v, CRef cr); - bool asymmVar (Var v); - void updateElimHeap (Var v); - void gatherTouchedClauses (); - bool merge (const Clause& _ps, const Clause& _qs, Var v, vec& out_clause); - bool merge (const Clause& _ps, const Clause& _qs, Var v, int& size); - bool backwardSubsumptionCheck (bool verbose = false); - bool eliminateVar (Var v); - void extendModel (); - - void removeClause (CRef cr); - bool strengthenClause (CRef cr, Lit l); - void cleanUpClauses (); - bool implied (const vec& c); - void relocAll (ClauseAllocator& to); -}; - - -//================================================================================================= -// Implementation of inline methods: - - -inline bool SimpSolver::isEliminated (Var v) const { return eliminated[v]; } -inline void SimpSolver::updateElimHeap(Var v) { - assert(use_simplification); - // if (!frozen[v] && !isEliminated(v) && value(v) == l_Undef) - if (elim_heap.inHeap(v) || (!frozen[v] && !isEliminated(v) && value(v) == l_Undef)) - elim_heap.update(v); } - - -inline bool SimpSolver::addClause (const vec& ps) { ps.copyTo(add_tmp); return addClause_(add_tmp); } -inline bool SimpSolver::addEmptyClause() { add_tmp.clear(); return addClause_(add_tmp); } -inline bool SimpSolver::addClause (Lit p) { add_tmp.clear(); add_tmp.push(p); return addClause_(add_tmp); } -inline bool SimpSolver::addClause (Lit p, Lit q) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); return addClause_(add_tmp); } -inline bool SimpSolver::addClause (Lit p, Lit q, Lit r) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); add_tmp.push(r); return addClause_(add_tmp); } -inline void SimpSolver::setFrozen (Var v, bool b) { frozen[v] = (char)b; if (use_simplification && !b) { updateElimHeap(v); } } - -inline bool SimpSolver::solve ( bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); return solve_(do_simp, turn_off_simp) == l_True; } -inline bool SimpSolver::solve (Lit p , bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); return solve_(do_simp, turn_off_simp) == l_True; } -inline bool SimpSolver::solve (Lit p, Lit q, bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); return solve_(do_simp, turn_off_simp) == l_True; } -inline bool SimpSolver::solve (Lit p, Lit q, Lit r, bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); assumptions.push(r); return solve_(do_simp, turn_off_simp) == l_True; } -inline bool SimpSolver::solve (const vec& assumps, bool do_simp, bool turn_off_simp){ - budgetOff(); assumps.copyTo(assumptions); return solve_(do_simp, turn_off_simp) == l_True; } - -inline lbool SimpSolver::solveLimited (const vec& assumps, bool do_simp, bool turn_off_simp){ - assumps.copyTo(assumptions); return solve_(do_simp, turn_off_simp); } - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/utils/Makefile b/src/vendor/stp/src/sat/utils/Makefile deleted file mode 100644 index cee678557..000000000 --- a/src/vendor/stp/src/sat/utils/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -EXEC = system_test -DEPDIR = mtl -LIB = utils -MROOT = .. - -include $(MROOT)/mtl/template.mk diff --git a/src/vendor/stp/src/sat/utils/Options.cc b/src/vendor/stp/src/sat/utils/Options.cc deleted file mode 100644 index ec5a6e930..000000000 --- a/src/vendor/stp/src/sat/utils/Options.cc +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************************[Options.cc] -Copyright (c) 2008-2010, Niklas Sorensson - -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 "mtl/Sort.h" -#include "utils/Options.h" -#include "utils/ParseUtils.h" - -using namespace Minisat; - -void Minisat::parseOptions(int& argc, char** argv, bool strict) -{ - int i, j; - for (i = j = 1; i < argc; i++){ - const char* str = argv[i]; - if (match(str, "--") && match(str, Option::getHelpPrefixString()) && match(str, "help")){ - if (*str == '\0') - printUsageAndExit(argc, argv); - else if (match(str, "-verb")) - printUsageAndExit(argc, argv, true); - } else { - bool parsed_ok = false; - - for (int k = 0; !parsed_ok && k < Option::getOptionList().size(); k++){ - parsed_ok = Option::getOptionList()[k]->parse(argv[i]); - - // fprintf(stderr, "checking %d: %s against flag <%s> (%s)\n", i, argv[i], Option::getOptionList()[k]->name, parsed_ok ? "ok" : "skip"); - } - - if (!parsed_ok) - if (strict && match(argv[i], "-")) - fprintf(stderr, "ERROR! Unknown flag \"%s\". Use '--%shelp' for help.\n", argv[i], Option::getHelpPrefixString()), exit(1); - else - argv[j++] = argv[i]; - } - } - - argc -= (i - j); -} - - -void Minisat::setUsageHelp (const char* str){ Option::getUsageString() = str; } -void Minisat::setHelpPrefixStr (const char* str){ Option::getHelpPrefixString() = str; } -void Minisat::printUsageAndExit (int argc, char** argv, bool verbose) -{ - const char* usage = Option::getUsageString(); - if (usage != NULL) - fprintf(stderr, usage, argv[0]); - - sort(Option::getOptionList(), Option::OptionLt()); - - const char* prev_cat = NULL; - const char* prev_type = NULL; - - for (int i = 0; i < Option::getOptionList().size(); i++){ - const char* cat = Option::getOptionList()[i]->category; - const char* type = Option::getOptionList()[i]->type_name; - - if (cat != prev_cat) - fprintf(stderr, "\n%s OPTIONS:\n\n", cat); - else if (type != prev_type) - fprintf(stderr, "\n"); - - Option::getOptionList()[i]->help(verbose); - - prev_cat = Option::getOptionList()[i]->category; - prev_type = Option::getOptionList()[i]->type_name; - } - - fprintf(stderr, "\nHELP OPTIONS:\n\n"); - fprintf(stderr, " --%shelp Print help message.\n", Option::getHelpPrefixString()); - fprintf(stderr, " --%shelp-verb Print verbose help message.\n", Option::getHelpPrefixString()); - fprintf(stderr, "\n"); - exit(0); -} - diff --git a/src/vendor/stp/src/sat/utils/Options.h b/src/vendor/stp/src/sat/utils/Options.h deleted file mode 100644 index 0b6805803..000000000 --- a/src/vendor/stp/src/sat/utils/Options.h +++ /dev/null @@ -1,386 +0,0 @@ -/***************************************************************************************[Options.h] -Copyright (c) 2008-2010, Niklas Sorensson - -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 Minisat_Options_h -#define Minisat_Options_h - -#include -#include -#include -#include - -#include "../mtl/IntTypesMtl.h" -#include "../mtl/Vec.h" -#include "../utils/ParseUtils.h" - -namespace Minisat { - -//================================================================================================== -// Top-level option parse/help functions: - - -extern void parseOptions (int& argc, char** argv, bool strict = false); -extern void printUsageAndExit(int argc, char** argv, bool verbose = false); -extern void setUsageHelp (const char* str); -extern void setHelpPrefixStr (const char* str); - - -//================================================================================================== -// Options is an abstract class that gives the interface for all types options: - - -class Option -{ - protected: - const char* name; - const char* description; - const char* category; - const char* type_name; - - static vec& getOptionList () { static vec options; return options; } - static const char*& getUsageString() { static const char* usage_str; return usage_str; } - static const char*& getHelpPrefixString() { static const char* help_prefix_str = ""; return help_prefix_str; } - - struct OptionLt { - bool operator()(const Option* x, const Option* y) { - int test1 = strcmp(x->category, y->category); - return test1 < 0 || test1 == 0 && strcmp(x->type_name, y->type_name) < 0; - } - }; - - Option(const char* name_, - const char* desc_, - const char* cate_, - const char* type_) : - name (name_) - , description(desc_) - , category (cate_) - , type_name (type_) - { - getOptionList().push(this); - } - - public: - virtual ~Option() {} - - virtual bool parse (const char* str) = 0; - virtual void help (bool verbose = false) = 0; - - friend void parseOptions (int& argc, char** argv, bool strict); - friend void printUsageAndExit (int argc, char** argv, bool verbose); - friend void setUsageHelp (const char* str); - friend void setHelpPrefixStr (const char* str); -}; - - -//================================================================================================== -// Range classes with specialization for floating types: - - -struct IntRange { - int begin; - int end; - IntRange(int b, int e) : begin(b), end(e) {} -}; - -struct Int64Range { - int64_t begin; - int64_t end; - Int64Range(int64_t b, int64_t e) : begin(b), end(e) {} -}; - -struct DoubleRange { - double begin; - double end; - bool begin_inclusive; - bool end_inclusive; - DoubleRange(double b, bool binc, double e, bool einc) : begin(b), end(e), begin_inclusive(binc), end_inclusive(einc) {} -}; - - -//================================================================================================== -// Double options: - - -class DoubleOption : public Option -{ - protected: - DoubleRange range; - double value; - - public: - DoubleOption(const char* c, const char* n, const char* d, double def = double(), DoubleRange r = DoubleRange(-HUGE_VAL, false, HUGE_VAL, false)) - : Option(n, d, c, ""), range(r), value(def) { - // FIXME: set LC_NUMERIC to "C" to make sure that strtof/strtod parses decimal point correctly. - } - - operator double (void) const { return value; } - operator double& (void) { return value; } - DoubleOption& operator=(double x) { value = x; return *this; } - - virtual bool parse(const char* str){ - const char* span = str; - - if (!match(span, "-") || !match(span, name) || !match(span, "=")) - return false; - - char* end; - double tmp = strtod(span, &end); - - if (end == NULL) - return false; - else if (tmp >= range.end && (!range.end_inclusive || tmp != range.end)){ - fprintf(stderr, "ERROR! value <%s> is too large for option \"%s\".\n", span, name); - exit(1); - }else if (tmp <= range.begin && (!range.begin_inclusive || tmp != range.begin)){ - fprintf(stderr, "ERROR! value <%s> is too small for option \"%s\".\n", span, name); - exit(1); } - - value = tmp; - // fprintf(stderr, "READ VALUE: %g\n", value); - - return true; - } - - virtual void help (bool verbose = false){ - fprintf(stderr, " -%-12s = %-8s %c%4.2g .. %4.2g%c (default: %g)\n", - name, type_name, - range.begin_inclusive ? '[' : '(', - range.begin, - range.end, - range.end_inclusive ? ']' : ')', - value); - if (verbose){ - fprintf(stderr, "\n %s\n", description); - fprintf(stderr, "\n"); - } - } -}; - - -//================================================================================================== -// Int options: - - -class IntOption : public Option -{ - protected: - IntRange range; - int32_t value; - - public: - IntOption(const char* c, const char* n, const char* d, int32_t def = int32_t(), IntRange r = IntRange(INT32_MIN, INT32_MAX)) - : Option(n, d, c, ""), range(r), value(def) {} - - operator int32_t (void) const { return value; } - operator int32_t& (void) { return value; } - IntOption& operator= (int32_t x) { value = x; return *this; } - - virtual bool parse(const char* str){ - const char* span = str; - - if (!match(span, "-") || !match(span, name) || !match(span, "=")) - return false; - - char* end; - int32_t tmp = strtol(span, &end, 10); - - if (end == NULL) - return false; - else if (tmp > range.end){ - fprintf(stderr, "ERROR! value <%s> is too large for option \"%s\".\n", span, name); - exit(1); - }else if (tmp < range.begin){ - fprintf(stderr, "ERROR! value <%s> is too small for option \"%s\".\n", span, name); - exit(1); } - - value = tmp; - - return true; - } - - virtual void help (bool verbose = false){ - fprintf(stderr, " -%-12s = %-8s [", name, type_name); - if (range.begin == INT32_MIN) - fprintf(stderr, "imin"); - else - fprintf(stderr, "%4d", range.begin); - - fprintf(stderr, " .. "); - if (range.end == INT32_MAX) - fprintf(stderr, "imax"); - else - fprintf(stderr, "%4d", range.end); - - fprintf(stderr, "] (default: %d)\n", value); - if (verbose){ - fprintf(stderr, "\n %s\n", description); - fprintf(stderr, "\n"); - } - } -}; - - -// Leave this out for visual C++ until Microsoft implements C99 and gets support for strtoll. -#ifndef _MSC_VER - -class Int64Option : public Option -{ - protected: - Int64Range range; - int64_t value; - - public: - Int64Option(const char* c, const char* n, const char* d, int64_t def = int64_t(), Int64Range r = Int64Range(INT64_MIN, INT64_MAX)) - : Option(n, d, c, ""), range(r), value(def) {} - - operator int64_t (void) const { return value; } - operator int64_t& (void) { return value; } - Int64Option& operator= (int64_t x) { value = x; return *this; } - - virtual bool parse(const char* str){ - const char* span = str; - - if (!match(span, "-") || !match(span, name) || !match(span, "=")) - return false; - - char* end; - int64_t tmp = strtoll(span, &end, 10); - - if (end == NULL) - return false; - else if (tmp > range.end){ - fprintf(stderr, "ERROR! value <%s> is too large for option \"%s\".\n", span, name); - exit(1); - }else if (tmp < range.begin){ - fprintf(stderr, "ERROR! value <%s> is too small for option \"%s\".\n", span, name); - exit(1); } - - value = tmp; - - return true; - } - - virtual void help (bool verbose = false){ - fprintf(stderr, " -%-12s = %-8s [", name, type_name); - if (range.begin == INT64_MIN) - fprintf(stderr, "imin"); - else - fprintf(stderr, "%4" PRIi64, range.begin); - - fprintf(stderr, " .. "); - if (range.end == INT64_MAX) - fprintf(stderr, "imax"); - else - fprintf(stderr, "%4" PRIi64, range.end); - - fprintf(stderr, "] (default: %" PRIi64 ")\n", value); - if (verbose){ - fprintf(stderr, "\n %s\n", description); - fprintf(stderr, "\n"); - } - } -}; -#endif - -//================================================================================================== -// String option: - - -class StringOption : public Option -{ - const char* value; - public: - StringOption(const char* c, const char* n, const char* d, const char* def = NULL) - : Option(n, d, c, ""), value(def) {} - - operator const char* (void) const { return value; } - operator const char*& (void) { return value; } - StringOption& operator= (const char* x) { value = x; return *this; } - - virtual bool parse(const char* str){ - const char* span = str; - - if (!match(span, "-") || !match(span, name) || !match(span, "=")) - return false; - - value = span; - return true; - } - - virtual void help (bool verbose = false){ - fprintf(stderr, " -%-10s = %8s\n", name, type_name); - if (verbose){ - fprintf(stderr, "\n %s\n", description); - fprintf(stderr, "\n"); - } - } -}; - - -//================================================================================================== -// Bool option: - - -class BoolOption : public Option -{ - bool value; - - public: - BoolOption(const char* c, const char* n, const char* d, bool v) - : Option(n, d, c, ""), value(v) {} - - operator bool (void) const { return value; } - operator bool& (void) { return value; } - BoolOption& operator=(bool b) { value = b; return *this; } - - virtual bool parse(const char* str){ - const char* span = str; - - if (match(span, "-")){ - bool b = !match(span, "no-"); - - if (strcmp(span, name) == 0){ - value = b; - return true; } - } - - return false; - } - - virtual void help (bool verbose = false){ - - fprintf(stderr, " -%s, -no-%s", name, name); - - for (uint32_t i = 0; i < 32 - strlen(name)*2; i++) - fprintf(stderr, " "); - - fprintf(stderr, " "); - fprintf(stderr, "(default: %s)\n", value ? "on" : "off"); - if (verbose){ - fprintf(stderr, "\n %s\n", description); - fprintf(stderr, "\n"); - } - } -}; - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/utils/ParseUtils.h b/src/vendor/stp/src/sat/utils/ParseUtils.h deleted file mode 100644 index d3071649d..000000000 --- a/src/vendor/stp/src/sat/utils/ParseUtils.h +++ /dev/null @@ -1,122 +0,0 @@ -/************************************************************************************[ParseUtils.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_ParseUtils_h -#define Minisat_ParseUtils_h - -#include -#include - -#include - -namespace Minisat { - -//------------------------------------------------------------------------------------------------- -// A simple buffered character stream class: - -static const int buffer_size = 1048576; - - -class StreamBuffer { - gzFile in; - unsigned char buf[buffer_size]; - int pos; - int size; - - void assureLookahead() { - if (pos >= size) { - pos = 0; - size = gzread(in, buf, sizeof(buf)); } } - -public: - explicit StreamBuffer(gzFile i) : in(i), pos(0), size(0) { assureLookahead(); } - - int operator * () const { return (pos >= size) ? EOF : buf[pos]; } - void operator ++ () { pos++; assureLookahead(); } - int position () const { return pos; } -}; - - -//------------------------------------------------------------------------------------------------- -// End-of-file detection functions for StreamBuffer and char*: - - -static inline bool isEof(StreamBuffer& in) { return *in == EOF; } -static inline bool isEof(const char* in) { return *in == '\0'; } - -//------------------------------------------------------------------------------------------------- -// Generic parse functions parametrized over the input-stream type. - - -template -static void skipWhitespace(B& in) { - while ((*in >= 9 && *in <= 13) || *in == 32) - ++in; } - - -template -static void skipLine(B& in) { - for (;;){ - if (isEof(in)) return; - if (*in == '\n') { ++in; return; } - ++in; } } - - -template -static int parseInt(B& in) { - int val = 0; - bool neg = false; - skipWhitespace(in); - if (*in == '-') neg = true, ++in; - else if (*in == '+') ++in; - if (*in < '0' || *in > '9') fprintf(stderr, "PARSE ERROR! Unexpected char: %c\n", *in), exit(3); - while (*in >= '0' && *in <= '9') - val = val*10 + (*in - '0'), - ++in; - return neg ? -val : val; } - - -// String matching: in case of a match the input iterator will be advanced the corresponding -// number of characters. -template -static bool match(B& in, const char* str) { - int i; - for (i = 0; str[i] != '\0'; i++) - if (in[i] != str[i]) - return false; - - in += i; - - return true; -} - -// String matching: consumes characters eagerly, but does not require random access iterator. -template -static bool eagerMatch(B& in, const char* str) { - for (; *str != '\0'; ++str, ++in) - if (*str != *in) - return false; - return true; } - - -//================================================================================================= -} - -#endif diff --git a/src/vendor/stp/src/sat/utils/System.cc b/src/vendor/stp/src/sat/utils/System.cc deleted file mode 100644 index 929ac3238..000000000 --- a/src/vendor/stp/src/sat/utils/System.cc +++ /dev/null @@ -1,97 +0,0 @@ -/***************************************************************************************[System.cc] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 "../utils/System.h" - -#if defined(__linux__) - -#include -#include - -using namespace Minisat; - -// TODO: split the memory reading functions into two: one for reading high-watermark of RSS, and -// one for reading the current virtual memory size. - -static inline int memReadStat(int field) -{ - char name[256]; - pid_t pid = getpid(); - int value; - - sprintf(name, "/proc/%d/statm", pid); - FILE* in = fopen(name, "rb"); - if (in == NULL) return 0; - - for (; field >= 0; field--) - if (fscanf(in, "%d", &value) != 1) - printf("ERROR! Failed to parse memory statistics from \"/proc\".\n"), exit(1); - fclose(in); - return value; -} - - -static inline int memReadPeak(void) -{ - char name[256]; - pid_t pid = getpid(); - - sprintf(name, "/proc/%d/status", pid); - FILE* in = fopen(name, "rb"); - if (in == NULL) return 0; - - // Find the correct line, beginning with "VmPeak:": - int peak_kb = 0; - while (!feof(in) && fscanf(in, "VmPeak: %d kB", &peak_kb) != 1) - while (!feof(in) && fgetc(in) != '\n') - ; - fclose(in); - - return peak_kb; -} - -double Minisat::memUsed() { return (double)memReadStat(0) * (double)getpagesize() / (1024*1024); } -double Minisat::memUsedPeak() { - double peak = memReadPeak() / 1024; - return peak == 0 ? memUsed() : peak; } - -#elif defined(__FreeBSD__) - -double Minisat::memUsed(void) { - struct rusage ru; - getrusage(RUSAGE_SELF, &ru); - return (double)ru.ru_maxrss / 1024; } -double Minisat::memUsedPeak(void) { return memUsed(); } - - -#elif defined(__APPLE__) -#include - -double Minisat::memUsed(void) { - malloc_statistics_t t; - malloc_zone_statistics(NULL, &t); - return (double)t.max_size_in_use / (1024*1024); } -double Minisat::memUsedPeak(void) { return memUsed();} -#else -double Minisat::memUsed() { - return 0; } -double Minisat::memUsedPeak(void) -{ return 0;} -#endif diff --git a/src/vendor/stp/src/sat/utils/System.h b/src/vendor/stp/src/sat/utils/System.h deleted file mode 100644 index 72f4aa3f8..000000000 --- a/src/vendor/stp/src/sat/utils/System.h +++ /dev/null @@ -1,60 +0,0 @@ -/****************************************************************************************[System.h] -Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson -Copyright (c) 2007-2010, Niklas Sorensson - -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 Minisat_System_h -#define Minisat_System_h - -#if defined(__linux__) -#include -#endif - -#include "../mtl/IntTypesMtl.h" - -//------------------------------------------------------------------------------------------------- - -namespace Minisat { - -static inline double cpuTime(void); // CPU-time in seconds. -extern double memUsed(); // Memory in mega bytes (returns 0 for unsupported architectures). -extern double memUsedPeak(); // Peak-memory in mega bytes (returns 0 for unsupported architectures). - -} - -//------------------------------------------------------------------------------------------------- -// Implementation of inline functions: - -#if defined(_MSC_VER) || defined(__MINGW32__) -#include - -static inline double Minisat::cpuTime(void) { return (double)clock() / CLOCKS_PER_SEC; } - -#else -#include -#include -#include - -static inline double Minisat::cpuTime(void) { - struct rusage ru; - getrusage(RUSAGE_SELF, &ru); - return (double)ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec / 1000000; } - -#endif - -#endif diff --git a/src/vendor/stp/src/simplifier/AIGSimplifyPropositionalCore.h b/src/vendor/stp/src/simplifier/AIGSimplifyPropositionalCore.h deleted file mode 100644 index 354285f2c..000000000 --- a/src/vendor/stp/src/simplifier/AIGSimplifyPropositionalCore.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - * This takes the topmost propositional part of the input, simplifies it with DAG aware rewritting, - * then converts it back to ASTNodes. - * - * - * This has two problems: 1) It doesn't consider that the propositional variables that are introduced, - * might actually represent many thousands of AIG nodes, so it doesn't do the "DAG aware" part correctly. - * 2) The startup of the DAR takes about 150M instructions, which is agggeeesss for small problems. - */ - -#ifndef AIGSIMPLIFYPROPOSITIONALCORE_H_ -#define AIGSIMPLIFYPROPOSITIONALCORE_H_ - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "simplifier.h" -#include "../extlib-abc/aig.h" -#include "../extlib-abc/dar.h" -#include "../to-sat/AIG/BBNodeManagerAIG.h" -#include "../to-sat/BitBlaster.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ -class AIGSimplifyPropositionalCore : boost::noncopyable -{ - - ASTNodeMap varToNodeMap; - STPMgr * bm; - NodeFactory* nf; - -public: - AIGSimplifyPropositionalCore(STPMgr *_bm) - { - bm = _bm; - nf = _bm->defaultNodeFactory; - } - - -private: - - // Convert theory nodes to fresh variables. - ASTNode theoryToFresh(const ASTNode& n, ASTNodeMap& fromTo ) - { - if (n.isConstant()) - return n; - - const Kind k = n.GetKind(); - if (k == SYMBOL) - return n; - - ASTNodeMap::const_iterator it; - if ((it = fromTo.find(n)) != fromTo.end()) - return it->second; - - assert(n.GetValueWidth() ==0); - assert(n.GetIndexWidth() ==0); - - if (k == BVGT || k == BVGE || k == EQ || k == BVSGE || k == BVSGT || k == PARAMBOOL) // plus the rest. - { - ASTNode fresh = bm->CreateFreshVariable(n.GetIndexWidth(), n.GetValueWidth(),"theoryToFresh"); - varToNodeMap.insert(make_pair(fresh,n)); - fromTo.insert(make_pair(n,fresh)); - return fresh; - } - - const ASTVec& children = n.GetChildren(); - ASTVec new_children; - new_children.reserve(children.size()); - - for (ASTVec::const_iterator it = children.begin(); it != children.end(); it++) - new_children.push_back(theoryToFresh(*it,fromTo)); - - ASTNode result; - - if (children != new_children) - result = nf->CreateNode(k,new_children); - else - result = n; - - fromTo.insert(make_pair(n,result)); - return result; - } - - typedef map cacheType; - - // Convert the AIG back to an ASTNode. - ASTNode convert (BBNodeManagerAIG& mgr, Aig_Obj_t * obj, cacheType& cache) - { - cacheType::const_iterator it; - if ((it = cache.find(obj))!= cache.end()) - return it->second; - - if (Aig_IsComplement(obj)) - return nf->CreateNode(NOT, convert(mgr,Aig_Regular(obj),cache)); - else if (Aig_ObjIsAnd(obj)) - { - ASTNode result = nf->CreateNode(AND,convert(mgr,Aig_ObjChild0(obj),cache),convert(mgr,Aig_ObjChild1(obj),cache)); - cache.insert(make_pair(obj,result)); - return result; - } - else if (obj == Aig_ManConst1(mgr.aigMgr)) - return bm->ASTTrue; - else if (obj == Aig_ManConst0(mgr.aigMgr)) - return bm->ASTFalse; - else if (Aig_ObjIsPo(obj)) - return convert(mgr,Aig_ObjChild0(obj),cache); - else - FatalError("Unknown type"); - } -public: - - ASTNode topLevel(const ASTNode& top) - { - if (top.isConstant()) - return top; - - bm->GetRunTimes()->start(RunTimes::AIGSimplifyCore); - - ASTNodeMap fromTo; - - // Replace theory nodes with new variables. - ASTNode replaced = theoryToFresh(top,fromTo); - - Simplifier simplifier(bm); - BBNodeManagerAIG mgr; - BitBlaster bb(&mgr, &simplifier, bm->defaultNodeFactory,&bm->UserFlags); - BBNodeAIG blasted = bb.BBForm(replaced); - - Aig_ObjCreatePo(mgr.aigMgr, blasted.n); - Aig_ManCleanup( mgr.aigMgr); // remove nodes not connected to the PO. - Aig_ManCheck( mgr.aigMgr); // check that AIG looks ok. - - assert(Aig_ManPoNum(mgr.aigMgr) == 1); - - int initial_nodeCount = mgr.aigMgr->nObjs[AIG_OBJ_AND]; - //cerr << "Nodes before AIG rewrite:" << initial_nodeCount << endl; - - Dar_LibStart(); // About 150M instructions. Very expensive. - Aig_Man_t * pTemp; - Dar_RwrPar_t Pars, *pPars = &Pars; - Dar_ManDefaultRwrParams(pPars); - - // Assertion errors occur with this enabled. - pPars->fUseZeros = 1; - - const int iterations = 3; - - int lastNodeCount = initial_nodeCount; - for (int i = 0; i < iterations; i++) { - mgr.aigMgr = Aig_ManDup(pTemp = mgr.aigMgr, 0); - Aig_ManStop(pTemp); - Dar_ManRewrite(mgr.aigMgr, pPars); - - mgr.aigMgr = Aig_ManDup(pTemp = mgr.aigMgr, 0); - Aig_ManStop(pTemp); - - //cerr << "After rewrite [" << i << "] nodes:" - // << mgr.aigMgr->nObjs[AIG_OBJ_AND] << endl; - - if (lastNodeCount == mgr.aigMgr->nObjs[AIG_OBJ_AND]) - break; - lastNodeCount = mgr.aigMgr->nObjs[AIG_OBJ_AND]; - } - - - cacheType ptrToOrig; - // This needs to be done after bitblasting because the PI nodes will be altered. - - for (BBNodeManagerAIG::SymbolToBBNode::iterator it = mgr.symbolToBBNode.begin(); it!= mgr.symbolToBBNode.end();it++) - { - ASTNode fresh = it->first; // the fresh variable. - assert(fresh.GetKind() == SYMBOL); - - ASTNode result; - if (varToNodeMap.find(fresh)== varToNodeMap.end()) - result = it->first; // It's not a fresh variable. i.e. it's a propositional var. in the original formula. - else - result = varToNodeMap.find(fresh)->second; // what it replaced. - assert((it->second).size() == 1); // should be a propositional variable. - const int index = (it->second)[0].symbol_index; // This is the index of the pi. - Aig_Obj_t * pi = Aig_ManPi(mgr.aigMgr,index); - ptrToOrig.insert(make_pair(pi,result)); - } - - Aig_Obj_t * pObj = (Aig_Obj_t*)Vec_PtrEntry(mgr.aigMgr->vPos, 0); - - ASTNode result = convert(mgr, pObj,ptrToOrig); - - Dar_LibStop(); - - bm->GetRunTimes()->stop(RunTimes::AIGSimplifyCore); - return result; - //return simplifier.SimplifyFormula(result,false,NULL); - } - -}; -}; -#endif /* AIGSIMPLIFYPROPOSITIONALCORE_H_ */ diff --git a/src/vendor/stp/src/simplifier/AlwaysTrue.h b/src/vendor/stp/src/simplifier/AlwaysTrue.h deleted file mode 100644 index b56532472..000000000 --- a/src/vendor/stp/src/simplifier/AlwaysTrue.h +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef ALWAYSTRUE_H_ -#define ALWAYSTRUE_H_ - -//Applies the AlwaysTrueSet to the input node. - -#include -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../simplifier/simplifier.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - -class AlwaysTrue : boost::noncopyable -{ - Simplifier *simplifier; - STPMgr* stp; - NodeFactory *nf; - - enum State {AND_STATE, NOT_STATE, BOTTOM_STATE}; - -public: - AlwaysTrue(Simplifier *simplifier_, STPMgr* stp_, NodeFactory *nf_) - { - simplifier = simplifier_; - stp = stp_; - nf = nf_; - } - - ASTNode topLevel(ASTNode& n) - { - stp->GetRunTimes()->start(RunTimes::AlwaysTrue); - ASTNodeMap fromTo; - ASTNode result = visit(n,AND_STATE,fromTo); - stp->GetRunTimes()->stop(RunTimes::AlwaysTrue); - return result; - } - - // Replace nodes that aren't conjoined to the top with TRUE/FALSE, - // if that node is conjoined.. - // The "state" tracks whether we are still at nodes that are conjoined to the top, - // only after we get out of the top part can we replace nodes that we know to be - // true or false. - ASTNode visit(const ASTNode&n, State state, ASTNodeMap& fromTo) - { - if (n.isConstant()) - return n; - - if (fromTo.find(n) != fromTo.end()) - { - // It has been visited as BOTTOM_STATE once before. - return fromTo.find(n)->second; - } - - ASTVec newChildren; - newChildren.reserve(n.Degree()); - State new_state; - - if (state == BOTTOM_STATE) - { - bool result; - if (simplifier->CheckAlwaysTrueFormSet(n,result)) - { - cerr << "+"; - if (result) - return stp->ASTTrue; - else - return stp->ASTFalse; - } - } - - if (n.GetKind() == SYMBOL) - return n; - - if (n.GetKind() != AND && state == AND_STATE ) - { - if (n.GetKind() == NOT) - new_state = NOT_STATE; - else - new_state = BOTTOM_STATE; - } - else if (state == NOT_STATE) - new_state = BOTTOM_STATE; - else - new_state = state; - - for (int i=0; i < n.Degree(); i++) - { - newChildren.push_back(visit(n[i],new_state,fromTo)); - } - - ASTNode result = n; - if (newChildren != n.GetChildren()) - { - if (n.GetType() == BOOLEAN_TYPE) - result = nf->CreateNode(n.GetKind(), newChildren); - else - result = nf->CreateArrayTerm(n.GetKind(), n.GetIndexWidth(), n.GetValueWidth(), newChildren); - } - - if (state == BOTTOM_STATE) - { - fromTo.insert(make_pair(n,result)); - } - return result; - } -}; -}; -#endif diff --git a/src/vendor/stp/src/simplifier/EstablishIntervals.h b/src/vendor/stp/src/simplifier/EstablishIntervals.h deleted file mode 100644 index 7b720bf41..000000000 --- a/src/vendor/stp/src/simplifier/EstablishIntervals.h +++ /dev/null @@ -1,812 +0,0 @@ -/* - * Performs a basic unsigned interval analysis. - */ - -#ifndef ESTABLISHINTERVALS_H_ -#define ESTABLISHINTERVALS_H_ -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "simplifier.h" -#include "../AST/NodeFactory/SimplifyingNodeFactory.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - class EstablishIntervals : boost::noncopyable - { - private: - struct IntervalType - { - CBV minV; - CBV maxV; - IntervalType(CBV _min, CBV _max) - { - minV = _min; - maxV = _max; - assert(minV != NULL); - assert(maxV != NULL); - assert(size_(minV) == size_(maxV)); - } - - void print() - { - - unsigned char * a = CONSTANTBV::BitVector_to_Dec(minV); - unsigned char * b = CONSTANTBV::BitVector_to_Dec(maxV); - cerr << a << " " << b << endl; - free(a); - free(b); - - } - - bool isConstant() - { - return !CONSTANTBV::BitVector_Lexicompare(minV, maxV); - } - - bool isComplete() - { - return (CONSTANTBV::BitVector_is_empty(minV) && CONSTANTBV::BitVector_is_full(maxV)); - } - - void checkUnsignedInvariant() - { - assert( CONSTANTBV::BitVector_Lexicompare(minV, maxV) <=0); - - // We use NULL to represent the complete domain. - assert( !isComplete()); - } - - // If the interval is interpreted as a clockwise interval. - bool crossesSignedUnsigned(int width) - { - bool minMSB = CONSTANTBV::BitVector_bit_test(minV, width- 1); - bool maxMSB = CONSTANTBV::BitVector_bit_test(maxV, width- 1); - - // If the min is zero, and the max is one, then it must cross. - if (!minMSB && maxMSB) - return true; - if (!(minMSB ^ maxMSB)) // bits are the same. - return CONSTANTBV::BitVector_Compare(minV, maxV) >0; - return false; - } - - }; - - vector toDeleteLater; - vector likeAutoPtr; - - IntervalType * freshUnsignedInterval(int width) - { - assert(width > 0); - IntervalType *it = createInterval(makeCBV(width), makeCBV(width)); - CONSTANTBV::BitVector_Fill(it->maxV); - return it; - } - - IntervalType * createInterval(CBV min, CBV max) - { - IntervalType *it = new IntervalType(min,max); - toDeleteLater.push_back(it); - return it ; - } - - CBV makeCBV(int width) - { - CBV result = CONSTANTBV::BitVector_Create(width, true); - likeAutoPtr.push_back(result); - return result; - } - - // A special version that handles the lhs appearing in the rhs of the fromTo map. - ASTNode replace(const ASTNode& n, ASTNodeMap& fromTo, ASTNodeMap& cache) - { - if (n.isAtom()) - return n; - - if (cache.find(n) != cache.end()) - return (*(cache.find(n))).second; - - ASTNode result = n; - - if (fromTo.find(n) != fromTo.end()) - { - result = (*fromTo.find(n)).second; - fromTo.erase(n); // this is how it differs from the everyday replace. - } - - ASTVec new_children; - new_children.reserve(result.GetChildren().size()); - - for (int i =0; i < result.Degree();i++) - new_children.push_back(replace(result[i],fromTo,cache)); - - if (new_children == result.GetChildren()) - { - cache.insert(make_pair(n,result)); - return result; - } - - if (n.GetValueWidth() == 0) // n.GetType() == BOOLEAN_TYPE - { - result = nf->CreateNode(result.GetKind(), new_children); - } - else - { - // If the index and value width aren't saved, they are reset sometimes (??) - result = nf->CreateArrayTerm(result.GetKind(), result.GetIndexWidth(), result.GetValueWidth(), new_children); - } - - cache.insert(make_pair(n,result)); - return result; - } - - public: - // Replace some of the things that unsigned intervals can figure out for us. - // Reduce from signed to unsigned if possible. - ASTNode topLevel_unsignedIntervals(const ASTNode&top) - { - bm.GetRunTimes()->start(RunTimes::IntervalPropagation); - map visited; - map clockwise; - visit(top,visited, clockwise); - ASTNodeMap fromTo; - ASTNodeMap onePass; - for (map::const_iterator it = visited.begin(); it != visited.end(); it++) - { - const ASTNode& n = it->first; - IntervalType *interval = it->second; - const int width = n.GetValueWidth(); - - if (n.isConstant()) - continue; - - const Kind k = n.GetKind(); - - // We do this rule if we don't know for certain the result. - // If the leading bits are false then we can reduce from signed to unsigned comparison. - if ((interval == NULL || !interval->isConstant()) - && (k == BVSGT || k == BVSGE || k == SBVDIV || k == BVSRSHIFT || k == SBVREM || k == BVSX)) - { - map::const_iterator l = visited.find(n[0]); - map::const_iterator r = visited.find(n[1]); - - bool lhs, rhs; // isFalse. - - if (l == visited.end()) - lhs = false; - else - { - IntervalType * a = (*l).second; - if (a == NULL) - lhs = false; - else - { - lhs = !CONSTANTBV::BitVector_bit_test(a->maxV, n[0].GetValueWidth() - 1); - } - } - - if (r == visited.end()) - rhs = false; - else - { - IntervalType * b = (*r).second; - if (b == NULL) - rhs = false; - else - rhs = !CONSTANTBV::BitVector_bit_test(b->maxV, n[0].GetValueWidth() - 1); - } - - switch (n.GetKind()) - { - case BVSGT: - case BVSGE: - if (lhs && rhs) - { - ASTNode newN = nf->CreateNode(n.GetKind() == BVSGT ? BVGT : BVGE, n[0], n[1]); - fromTo.insert(make_pair(n, newN)); - } - break; - - case SBVDIV: - if (lhs && rhs) - { - ASTNode newN = nf->CreateTerm(BVDIV, n.GetValueWidth(), n[0], n[1]); - fromTo.insert(make_pair(n, newN)); - } - break; - - case SBVREM: - if (lhs && rhs) - { - ASTNode newN = nf->CreateTerm(BVMOD, n.GetValueWidth(), n[0], n[1]); - fromTo.insert(make_pair(n, newN)); - } - break; - - case BVSRSHIFT: - if (lhs) - { - ASTNode newN = nf->CreateTerm(BVRIGHTSHIFT, n.GetValueWidth(), n[0], n[1]); - fromTo.insert(make_pair(n, newN)); - } - break; - - case BVSX: - if (lhs && n[0].GetValueWidth() != n.GetValueWidth()) - { - // If it's really a zero extend.. - ASTNode copyN = nf->CreateTerm(BVCONCAT, n.GetValueWidth(), bm.CreateZeroConst(n.GetValueWidth() - n[0].GetValueWidth()),n[0]); - fromTo.insert(make_pair(n,copyN)); - } - break; - default: - FatalError("Never here"); - } - } - if (interval == NULL) - continue; - if (interval->isConstant() && n.GetType() == BOOLEAN_TYPE) - { - if (0 == CONSTANTBV::BitVector_Lexicompare(interval->maxV, littleOne)) - fromTo.insert(make_pair(n, bm.ASTTrue)); - else - fromTo.insert(make_pair(n, bm.ASTFalse)); - } - else if (interval->isConstant() && n.GetType() == BITVECTOR_TYPE) - { - CBV clone = CONSTANTBV::BitVector_Clone(interval->maxV); - ASTNode new_const = bm.CreateBVConst(clone, n.GetValueWidth()); - fromTo.insert(make_pair(n, new_const)); - } - else if (false && n.GetType() == BITVECTOR_TYPE && n.GetKind() != SYMBOL && n.GetKind() != BVCONCAT) - { - // Looks for leading or trailing zeroes/ones, and replaces the node with a - // concat and an extract. - - // This slows things down. I suspect because the extracts are "simplified" and split too many things. - bool leadingValue = CONSTANTBV::BitVector_bit_test(interval->maxV,width-1); - int leadingSame = 0; - for (int i=width-1; i >=0 ;i--) - { - if (CONSTANTBV::BitVector_bit_test(interval->maxV,i) ^ leadingValue) - break; - - if (CONSTANTBV::BitVector_bit_test(interval->minV,i) ^ leadingValue) - break; - leadingSame++; - } - - assert(leadingSame != width); // That'd be a constant (another case). - - if (leadingSame >0) - { - ASTNode prefix; - if (leadingValue) - prefix = bm.CreateMaxConst(leadingSame); - else - prefix = bm.CreateZeroConst(leadingSame); - - - ASTNode top = bm.CreateBVConst(32,width-leadingSame-1); - ASTNode bottom = bm.CreateZeroConst(32); - ASTNode remainder = nf->CreateTerm(BVEXTRACT, width-leadingSame, n, top,bottom); - ASTNode replaced = nf->CreateTerm(BVCONCAT, width, prefix,remainder); - onePass.insert(make_pair(n,replaced)); - } - } - } - - ASTNode result = top; - if (onePass.size() > 0) - { - // The rhs of the map contains the lhs, so it needs to be applied specially. - ASTNodeMap cache; - result = replace(top, onePass, cache); - } - - if (fromTo.size() > 0) - { - ASTNodeMap cache; - - bm.GetRunTimes()->stop(RunTimes::IntervalPropagation); - return SubstitutionMap::replace(result,fromTo,cache,top.GetSTPMgr()->defaultNodeFactory); - } - - bm.GetRunTimes()->stop(RunTimes::IntervalPropagation); - return result; - } - - - private: - // A single pass through the problem replacing things that must be true of false. - // clockwise are intervals that go clockwise around the circle from low to high. - IntervalType* visit(const ASTNode& n, map & visited, map & clockwise) - { - map::iterator it; - if ((it = visited.find(n)) != visited.end()) - return it->second; - - const int number_children = n.Degree(); - vector children; - children.reserve(number_children); - for (int i=0; i < number_children;i++) - { - children.push_back(visit(n[i],visited,clockwise)); - } - - IntervalType * result = NULL; - const unsigned int width = n.GetValueWidth(); - const bool knownC0 = number_children <1 ? false : (children[0] != NULL); - const bool knownC1 = number_children <2 ? false : (children[1] != NULL); - - switch (n.GetKind()) - { - case BVCONST: - case BITVECTOR: - { - // the CBV doesn't leak. it is a copy of the cbv inside the node. - CBV cbv = n.GetBVConst(); - result = createInterval(cbv, cbv); - } - break; - case TRUE: - result = createInterval(littleOne, littleOne); - break; - case FALSE: - result = createInterval(littleZero, littleZero); - break; - case NOT: - if (knownC0) - { - assert(children[0]->isConstant()); - if (!CONSTANTBV::BitVector_Lexicompare(children[0]->minV, littleOne)) - result = createInterval(littleZero,littleZero); - else - result = createInterval(littleOne,littleOne); - } - break; - case EQ: - if (knownC0 && knownC1) - { - if ((CONSTANTBV::BitVector_Lexicompare(children[1]->minV,children[0]->maxV) >0) - || (CONSTANTBV::BitVector_Lexicompare(children[0]->minV,children[1]->maxV) >0)) - result = createInterval(littleZero, littleZero); - } - break; - case BVGT: - case BVSGT: - if ( - (BVGT == n.GetKind() && knownC0 && knownC1) || - (BVSGT == n.GetKind() && knownC0 && knownC1 - && !CONSTANTBV::BitVector_bit_test(children[0]->maxV, n[0].GetValueWidth()-1) - && !CONSTANTBV::BitVector_bit_test(children[1]->maxV, n[0].GetValueWidth()-1) - )) - { - if (CONSTANTBV::BitVector_Lexicompare(children[0]->minV,children[1]->maxV) >0) - result = createInterval(littleOne, littleOne); - - if (CONSTANTBV::BitVector_Lexicompare(children[1]->minV,children[0]->maxV) >=0) - result = createInterval(littleZero, littleZero); - } - if (BVSGT == n.GetKind() && result ==NULL) - { - map::iterator clock_it; - clock_it = clockwise.find(n[0]); - IntervalType* clock0 = NULL; - IntervalType* clock1 = NULL; - if (clock_it != clockwise.end()) - clock0 = clock_it->second; - clock_it = clockwise.find(n[1]); - if (clock_it != clockwise.end()) - clock1 = clock_it->second; - - if (clock0 != NULL || clock1 !=NULL) - { - if (clock0 == NULL) - clock0 = children[0]; - if (clock1 == NULL) - clock1 = children[1]; - - if (clock0 != NULL && clock1 != NULL) - { -/* - clock0->print(); - clock1->print(); - cerr << clock0->crossesSignedUnsigned(n[0].GetValueWidth()) << endl; - cerr << clock1->crossesSignedUnsigned(n[0].GetValueWidth()) << endl; - cerr << n; -*/ - - // if the rhs doesn't cross +ve/-ve boundary, and the min > max - if (!clock0->crossesSignedUnsigned(n[0].GetValueWidth()) && !clock1->crossesSignedUnsigned(n[1].GetValueWidth())) - { - if (CONSTANTBV::BitVector_Compare(clock0->minV,clock1->maxV) >0) - result = createInterval(littleOne, littleOne); - - if (CONSTANTBV::BitVector_Compare(clock1->minV,clock0->maxV) >=0) - result = createInterval(littleZero, littleZero); - } - } - } - } - - break; - case BVGE: - case BVSGE: - if ((BVGE == n.GetKind() && knownC0 && knownC1) || - (BVSGE == n.GetKind() && knownC0 && knownC1 - && !CONSTANTBV::BitVector_bit_test(children[0]->maxV, n[0].GetValueWidth()-1) - && !CONSTANTBV::BitVector_bit_test(children[1]->maxV, n[0].GetValueWidth()-1) - )) - { - if (CONSTANTBV::BitVector_Lexicompare(children[0]->minV,children[1]->maxV) >=0) - result = createInterval(littleOne, littleOne); - if (CONSTANTBV::BitVector_Lexicompare(children[1]->minV,children[0]->maxV) > 0) - result = createInterval(littleZero, littleZero); - } - break; - case BVDIV: - if (knownC1) - { - // When we're dividing by zero, we know nothing. - if (!CONSTANTBV::BitVector_is_empty(children[1]->minV)) - { - IntervalType * top = (children[0] == NULL) ? freshUnsignedInterval(width) : children[0]; - result = freshUnsignedInterval(width); - - CBV remainder = CONSTANTBV::BitVector_Create(width, true); - - CBV tmp0 = CONSTANTBV::BitVector_Clone(top->minV); - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Div_Pos(result->minV, tmp0, children[1]->maxV, remainder); - assert(0 == e); - CONSTANTBV::BitVector_Destroy(tmp0); - - tmp0 = CONSTANTBV::BitVector_Clone(top->maxV); - e = CONSTANTBV::BitVector_Div_Pos(result->maxV, tmp0, children[1]->minV, remainder); - assert(0 == e); - - CONSTANTBV::BitVector_Destroy(tmp0); - CONSTANTBV::BitVector_Destroy(remainder); - } - } - break; - case BVMOD: - if (knownC1) - { - // When we're dividing by zero, we know nothing. - if (!CONSTANTBV::BitVector_is_empty(children[1]->minV)) - { - result = freshUnsignedInterval(n.GetValueWidth()); - CONSTANTBV::BitVector_Copy(result->maxV , children[1]->maxV); - CONSTANTBV::BitVector_decrement(result->maxV); - - // If the top is known, and it's maximum is less, use that. - if (knownC0 && CONSTANTBV::BitVector_Lexicompare(children[0]->maxV,result->maxV) < 0) - CONSTANTBV::BitVector_Copy(result->maxV , children[0]->maxV); - - } - } - break; - case BVSX: - if (knownC0 && knownC1) - { - // If the maximum doesn't have the top bit set, then zero extend it. - if (!CONSTANTBV::BitVector_bit_test(children[0]->maxV,n[0].GetValueWidth()-1)) - { - result = freshUnsignedInterval(n.GetValueWidth()); - - // Copy in the minimum and maximum. - for (int i=0; i < n[0].GetValueWidth();i++) - { - if (CONSTANTBV::BitVector_bit_test(children[0]->maxV,i)) - CONSTANTBV::BitVector_Bit_On(result->maxV,i); - else - CONSTANTBV::BitVector_Bit_Off(result->maxV,i); - - if (CONSTANTBV::BitVector_bit_test(children[0]->minV,i)) - CONSTANTBV::BitVector_Bit_On(result->minV,i); - else - CONSTANTBV::BitVector_Bit_Off(result->minV,i); - } - - for (int i=n[0].GetValueWidth(); i < n.GetValueWidth();i++) - CONSTANTBV::BitVector_Bit_Off(result->maxV,i); - } - } else if (knownC1) - { - // Ignores what's already there for now.. - - IntervalType * circ_result = freshUnsignedInterval(n.GetValueWidth()); - for (int i=0; i < n[0].GetValueWidth()-1;i++) - { - CONSTANTBV::BitVector_Bit_On(circ_result->maxV,i); - CONSTANTBV::BitVector_Bit_Off(circ_result->minV,i); - } - - for (int i=n[0].GetValueWidth()-1; i < n.GetValueWidth();i++) - { - CONSTANTBV::BitVector_Bit_Off(circ_result->maxV,i); - CONSTANTBV::BitVector_Bit_On(circ_result->minV,i); - } - - clockwise.insert(make_pair(n, circ_result)); - } - - break; - case BVNEG: - if (knownC0) // NOT of the bitvector. - { - result = freshUnsignedInterval(width); - CONSTANTBV::BitVector_Copy(result->maxV, children[0]->minV); - CONSTANTBV::BitVector_Flip(result->maxV); - CONSTANTBV::BitVector_Copy(result->minV, children[0]->maxV); - CONSTANTBV::BitVector_Flip(result->minV); - } - break; - case BVUMINUS: - if (knownC0) - { - // Imagine it's {00, 01}, the unary minus of these is: {00,11}, - // i.e. it's everything. When there's a zero, (except for [0,0]), - // it will be everything. - - if (!CONSTANTBV::BitVector_is_empty(children[0]->minV)) - { - result = freshUnsignedInterval(width); - CONSTANTBV::BitVector_Copy(result->maxV, children[0]->minV); - CONSTANTBV::BitVector_Flip(result->maxV); - CONSTANTBV::BitVector_increment(result->maxV); - - CONSTANTBV::BitVector_Copy(result->minV, children[0]->maxV); - CONSTANTBV::BitVector_Flip(result->minV); - CONSTANTBV::BitVector_increment(result->minV); - } - } - break; - case ITE: - if (children[1] != NULL && children[2] != NULL) - { - // Both terms and propositions. - result = freshUnsignedInterval(width==0? 1: width); - CBV min, max; - if (CONSTANTBV::BitVector_Lexicompare(children[1]->minV, children[2]->minV) >0) - min = children[2]->minV; - else - min = children[1]->minV; - - if (CONSTANTBV::BitVector_Lexicompare(children[1]->maxV, children[2]->maxV) >0) - max = children[1]->maxV; - else - max = children[2]->maxV; - - CONSTANTBV::BitVector_Copy(result->minV, min); - CONSTANTBV::BitVector_Copy(result->maxV, max); - } - break; - case BVMULT: - if (knownC0 && knownC1) - { - // >=2 arity. - CBV min,max; - min = CONSTANTBV::BitVector_Create(2*width, true); - max = CONSTANTBV::BitVector_Create(2*width, true); - - // Make the result interval 1. - result = freshUnsignedInterval(width); - CONSTANTBV::BitVector_increment(result->minV); - CONSTANTBV::BitVector_Flip(result->maxV); - CONSTANTBV::BitVector_increment(result->maxV); - - bool bad= false; - for (int i =0; i < children.size(); i++) - { - if (children[i] == NULL) - { - bad = true; - break; - } - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Multiply(min, result->minV, children[i]->minV); - assert (0 == e); - - e = CONSTANTBV::BitVector_Multiply(max, result->maxV, children[i]->maxV); - assert (0 == e); - - if (CONSTANTBV::Set_Max(max) >= width) - bad = true; - - for (int j = width; j < 2 * width; j++) - { - if (CONSTANTBV::BitVector_bit_test(min, j)) - bad = true; - } - - CONSTANTBV::BitVector_Interval_Copy(result->minV, min, 0, 0, width); - CONSTANTBV::BitVector_Interval_Copy(result->maxV, max, 0, 0, width); - } - CONSTANTBV::BitVector_Destroy(min); - CONSTANTBV::BitVector_Destroy(max); - if (bad) - result = NULL; - } - break; - //case BVLEFTSHIFT: - // case BVAND: - //case BVSRSHIFT: - { - // Todo two cases. - // 1) The maximum shift of the maximum value doesn't overflow, and, - // 2) The minimum shift of the minimum value completely overflows (to zero). - } - - case BVRIGHTSHIFT: - if (knownC0 || knownC1) - { - result = freshUnsignedInterval(width); - - if (children[0] == NULL) - children[0] = freshUnsignedInterval(width); - if (children[1] == NULL) - children[1] = freshUnsignedInterval(width); - - // The maximum result is the maximum >> (minimum shift). - if (CONSTANTBV::Set_Max(children[1]->minV) > 1 + log2(width) || *(children[1]->minV) > width) - { - // The maximum is zero. - CONSTANTBV::BitVector_Flip(result->maxV); - } - else - { - unsigned shift_amount = *(children[1]->minV); - CONSTANTBV::BitVector_Copy(result->maxV, children[0]->maxV); - while (shift_amount-- > 0) - { - CONSTANTBV::BitVector_shift_right(result->maxV,0); - } - } - - // The minimum result is the minimum >> (maximum shift). - if (CONSTANTBV::Set_Max(children[1]->maxV) > 1 + log2(width) || *(children[1]->maxV) > width) - { - // The mimimum is zero. (which it's set to by default.). - } - else - { - unsigned shift_amount = *(children[1]->maxV); - CONSTANTBV::BitVector_Copy(result->minV, children[0]->minV); - while (shift_amount-- > 0) - CONSTANTBV::BitVector_shift_right(result->minV,0); - } - } - break; - case BVPLUS: - if (knownC0 && knownC1) - { - // >=2 arity. - result = freshUnsignedInterval(width); - CONSTANTBV::BitVector_Flip(result->maxV); // make the max zero too. - - bool carry = false; - - for (int i =0; i < children.size(); i++) - { - if (children[i] == NULL) - { - carry = true; - break; - } - - CONSTANTBV::BitVector_add(result->maxV,result->maxV, children[i]->maxV, &carry); - if (carry) - break; - CONSTANTBV::BitVector_add(result->minV,result->minV, children[i]->minV, &carry); - if (carry) - break; - } - - if (carry) - result = NULL; - } - break; - case BVCONCAT: - if ( (knownC0 || knownC1)) - { - result = freshUnsignedInterval(n.GetValueWidth()); - - // Copy in the lower part. - if (knownC1) - { - // Copy in the minimum and maximum. - for (int i=0; i < n[1].GetValueWidth();i++) - { - if (CONSTANTBV::BitVector_bit_test(children[1]->maxV,i)) - CONSTANTBV::BitVector_Bit_On(result->maxV,i); - else - CONSTANTBV::BitVector_Bit_Off(result->maxV,i); - - if (CONSTANTBV::BitVector_bit_test(children[1]->minV,i)) - CONSTANTBV::BitVector_Bit_On(result->minV,i); - else - CONSTANTBV::BitVector_Bit_Off(result->minV,i); - } - } - - if (knownC0) - { - // Copy in the minimum and maximum. - for (int i=n[1].GetValueWidth(); i < n.GetValueWidth();i++) - { - if (CONSTANTBV::BitVector_bit_test(children[0]->maxV,i- n[1].GetValueWidth())) - CONSTANTBV::BitVector_Bit_On(result->maxV,i); - else - CONSTANTBV::BitVector_Bit_Off(result->maxV,i); - - if (CONSTANTBV::BitVector_bit_test(children[0]->minV,i - n[1].GetValueWidth())) - CONSTANTBV::BitVector_Bit_On(result->minV,i); - else - CONSTANTBV::BitVector_Bit_Off(result->minV,i); - } - } - } - break; - default: - { - // Debugging! - - bool nonNull = true; - // If all the children are known, output 'em. - for (int i=0; i < n.Degree();i++) - { - if (children[i]== NULL) - nonNull=false; - } - - if (false && nonNull && n.GetKind() != SYMBOL && n.GetKind() != AND) - { - cerr << n; - for (int i=0; i < n.Degree();i++) - children[i]->print(); - } - } - } - - if (result != NULL && result->isComplete()) - result = NULL; - - if (result != NULL) - result->checkUnsignedInvariant(); - - // result will often be null (which we take to mean the maximum range). - visited.insert(make_pair(n,result)); - return result; - } - - STPMgr& bm; - CBV littleOne; - CBV littleZero; - NodeFactory *nf; - - public: - EstablishIntervals(STPMgr& _bm) : bm(_bm) - { - littleZero = makeCBV(1); - littleOne = makeCBV(1); - CONSTANTBV::BitVector_Fill(littleOne); - nf = bm.defaultNodeFactory; - } - - ~EstablishIntervals() - { - for (int i =0; i < toDeleteLater.size();i++) - delete toDeleteLater[i]; - - for (int i =0; i < likeAutoPtr.size();i++) - CONSTANTBV::BitVector_Destroy(likeAutoPtr[i]); - - likeAutoPtr.clear(); - toDeleteLater.clear(); - } - }; -} -; -#endif /* ESTABLISHINTERVALS_H_ */ diff --git a/src/vendor/stp/src/simplifier/FindPureLiterals.h b/src/vendor/stp/src/simplifier/FindPureLiterals.h deleted file mode 100644 index d6a4a4643..000000000 --- a/src/vendor/stp/src/simplifier/FindPureLiterals.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * FindPureLiterals.h - * - * Created on: 09/02/2011 - * Author: thansen - */ - -/* - * This could very nicely run after unconstrained variable elmination. If we traversed from - * the root node, we could stop traversing whenever we met a node that wasn't an AND or OR, then - * we'd just check the number of parents of each boolean symbol that we found. - * - * I'm not sure that I've gotten all the polarities sorted. - */ - - -#ifndef FINDPURELITERALS_H_ -#define FINDPURELITERALS_H_ - -#include -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../simplifier/simplifier.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - -class FindPureLiterals : boost::noncopyable -{ - typedef char polarity_type; - const static polarity_type truePolarity = 1; - const static polarity_type falsePolarity = 2; - const static polarity_type bothPolarity = 3; - - map nodeToPolarity; - - int swap(polarity_type polarity) - { - if (polarity == truePolarity) - return falsePolarity; - - if (polarity == falsePolarity) - return truePolarity; - - if (polarity == bothPolarity) - return bothPolarity; - - throw "SADFSA2332"; - } - -public: - FindPureLiterals() - {} - virtual - ~FindPureLiterals() - {} - - // Build the polarities, then iterate through fixing them. - bool topLevel(ASTNode& n, Simplifier *simplifier, STPMgr *stp) - { - stp->GetRunTimes()->start(RunTimes::PureLiterals); - - build(n , truePolarity); - bool changed = false; - - map::const_iterator it = nodeToPolarity.begin(); - while (it != nodeToPolarity.end()) - { - const ASTNode& n = it->first; - const polarity_type polarity = it->second; - if (n.GetType() == BOOLEAN_TYPE && n.GetKind() == SYMBOL && polarity != bothPolarity) - { - if (polarity == truePolarity) - simplifier->UpdateSubstitutionMap(n,n.GetSTPMgr()->ASTTrue); - else - { - assert (polarity == falsePolarity); - simplifier->UpdateSubstitutionMap(n,n.GetSTPMgr()->ASTFalse); - } - changed = true; - } - it++; - } - stp->GetRunTimes()->stop(RunTimes::PureLiterals); - return changed; - } - - - void build(const ASTNode& n , polarity_type polarity) - { - if (n.isConstant()) - return; - - map::iterator it = nodeToPolarity.find(n); - if (it != nodeToPolarity.end()) - { - int lookupPolarity = it->second; - if ((polarity | lookupPolarity) == lookupPolarity ) - return; // already traversed. - - it->second |= polarity; - } - else - { - nodeToPolarity.insert(make_pair(n,polarity)); - } - const Kind k = n.GetKind(); - switch (k) - { - case AND: - case OR: - for (int i =0; i < n.Degree(); i ++) - build(n[i],polarity); - break; - - case NOT: - polarity = swap(polarity); - build(n[0],polarity); - break; - - default: - polarity = bothPolarity; // both - for (int i =0; i < n.Degree(); i ++) - build(n[i],polarity); - break; - } - } - - -}; -}; -#endif /* FINDPURELITERALS_H_ */ diff --git a/src/vendor/stp/src/simplifier/Makefile b/src/vendor/stp/src/simplifier/Makefile deleted file mode 100644 index 419baf9cb..000000000 --- a/src/vendor/stp/src/simplifier/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -SRCS += $(wildcard constantBitP/*.cpp) -OBJS = $(SRCS:.cpp=.o) - - -libsimplifier.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o */*.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend diff --git a/src/vendor/stp/src/simplifier/MutableASTNode.cpp b/src/vendor/stp/src/simplifier/MutableASTNode.cpp deleted file mode 100644 index 47e0d47ca..000000000 --- a/src/vendor/stp/src/simplifier/MutableASTNode.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* - * MutableASTNode.cpp - * - * Created on: 06/02/2011 - * Author: thansen - */ - -#include "MutableASTNode.h" -namespace BEEV -{ - - vector MutableASTNode::all; - -}; diff --git a/src/vendor/stp/src/simplifier/MutableASTNode.h b/src/vendor/stp/src/simplifier/MutableASTNode.h deleted file mode 100644 index b7a21bc47..000000000 --- a/src/vendor/stp/src/simplifier/MutableASTNode.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - * MutableASTNode.h - * - * This is mutable unlike the normal ASTNode. It can be converted lazily to a ASTNode. - */ - -#ifndef MUTABLEASTNODE_H_ -#define MUTABLEASTNODE_H_ -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "simplifier.h" - -namespace BEEV -{ - class MutableASTNode - { - static vector all; - - public: - typedef set ParentsType; - ParentsType parents; - -private: - MutableASTNode(const MutableASTNode&); // No definition - MutableASTNode& - operator=(const MutableASTNode &); // No definition - - MutableASTNode(const ASTNode& n_) : - n(n_) - { - dirty = false; - } - - // Make a mutable ASTNode graph like the ASTNode one, but with pointers back up too. - // It's convoluted because we want a post order traversal. The root node of a sub-tree - // will be created after its children. -public: - static MutableASTNode * - build(const ASTNode& n, map & visited) - { - if (visited.find(n) != visited.end()) - { - return visited.find(n)->second; - } - - vector tempChildren; - tempChildren.reserve(n.Degree()); - - for (int i = 0; i < n.Degree(); i++) - tempChildren.push_back(build(n[i], visited)); - - MutableASTNode * mut = createNode(n); - - for (int i = 0; i < n.Degree(); i++) - tempChildren[i]->parents.insert(mut); - - mut->children.insert(mut->children.end(),tempChildren.begin(),tempChildren.end()); - visited.insert(make_pair(n, mut)); - return mut; - } -private: - - bool dirty; - - public: - - bool checkInvariant() - { - // Symbols have no children. - if (n.GetKind() == SYMBOL) - { - assert(children.size() ==0); - } - - // all my parents have me as a child. - for (ParentsType::iterator it = parents.begin(); it != parents.end() ; it++) - { - vector::iterator it2 = (*it)->children.begin(); - bool found = false; - for (;it2!= (*it)->children.end();it2++) - { - assert (*it2 != NULL); - if (*it2 == this) - found = true; - } - assert(found); - } - - for (int i = 0; i < children.size(); i++) - { - // call check on all the children. - children[i]->checkInvariant(); - - // all my children have me as a parent. - assert (children[i]->parents.find(this) != children[i]->parents.end()); - } - - return true; // ignored. - } - - - - MutableASTNode& getParent() - { - assert (parents.size() == 1); - return **(parents.begin()); - } - - ASTNode - toASTNode(NodeFactory *nf) - { - if (!dirty) - return n; - - if (children.size() == 0) - return n; - - ASTVec newChildren; - for (int i = 0; i < children.size(); i++) - newChildren.push_back(children[i]->toASTNode(nf)); - - // Don't use the hashing node factory here. Imagine CreateNode simplified down, - // from (= 1 ite( x , 1,0)) to x (say). Then this node will become a symbol, - // but, this object will still have the equal's children. i.e. 1, and the ITE. - // So it becomes a SYMBOL with children... - - if (n.GetType() == BOOLEAN_TYPE) - { - n = n.GetSTPMgr()->hashingNodeFactory->CreateNode(n.GetKind(), newChildren); - } - else if (n.GetType() == BITVECTOR_TYPE) - { - n = n.GetSTPMgr()->hashingNodeFactory->CreateTerm(n.GetKind(), n.GetValueWidth(), newChildren); - } - else - { - n = n.GetSTPMgr()->hashingNodeFactory->CreateArrayTerm(n.GetKind(), n.GetIndexWidth(), n.GetValueWidth(), newChildren); - } - - dirty = false; - return n; - } - - ASTNode n; - vector children; - - static MutableASTNode * - createNode(ASTNode n) - { - MutableASTNode * result = new MutableASTNode(n); - all.push_back(result); - return result; - } - - bool - isSymbol() const - { - bool result = n.GetKind() == SYMBOL; - if (result) - { - assert(children.size() == 0); - } - return result; - } - - static MutableASTNode * - build(ASTNode n) - { - map visited; - return build(n, visited); - } - - void - propagateUpDirty() - { - if (dirty) - return; - - dirty = true; - for (ParentsType::iterator it = parents.begin(); it != parents.end() ; it++) - (*it)->propagateUpDirty(); - } - - void - replaceWithAnotherNode(MutableASTNode *newN) - { - n = newN->n; - vector vars; - removeChildren(vars); // ignore the result - children.clear(); - children.insert(children.begin(), newN->children.begin(), newN->children.end()); - for (int i = 0; i < children.size(); i++) - children[i]->parents.insert(this); - - propagateUpDirty(); - assert(newN->parents.size() == 0); // we don't copy 'em in you see. - newN->removeChildren(vars); - } - - - void - replaceWithVar(ASTNode newV, vector& variables) - { - assert(newV.GetKind() == SYMBOL); - n = newV; - removeChildren(variables); - children.clear(); - assert(isSymbol()); - if (parents.size() == 1) - variables.push_back(this); - propagateUpDirty(); - } - - void - removeChildren(vector& variables) - { - for (unsigned i = 0; i < children.size(); i++) - { - MutableASTNode * child = children[i]; - ParentsType& children_parents = child->parents; - children_parents.erase(this); - - if (children_parents.size() == 0) - { - child->removeChildren(variables); - } - - if (child->isUnconstrained()) - { - variables.push_back(child); - } - } - } - - // Variables that have >1 disjoint extract parents. - static void - getDisjointExtractVariables(vector & result) - { - const int size = all.size(); - for (int i = size-1; i >=0 ; i--) - { - if (!all[i]->isSymbol()) - continue; - - ParentsType* p = &(all[i]->parents); - - if (p->size() ==1 ) - continue; // the regular case. Don't consider here. - - ASTNode& node = all[i]->n; - bool found[node.GetValueWidth()]; - for (int j=0; j begin(); it!= p->end();it++) - { - ASTNode& parent_node = (*it)->n; - if (parent_node.GetKind() != BVEXTRACT) - break; - - const int lb = parent_node[2].GetUnsignedConst(); - const int ub = parent_node[1].GetUnsignedConst(); - assert(lb<=ub); - - int j; - for (j =lb ; j <=ub;j++) - { - if (found[j]) - break; - found[j] = true; - } - - // if didn't make it to the finish. Then it overlaps. - if (j<= ub) - { - break; - } - } - - if (it != p->end()) - continue; - - // All are extracts that don't overlap. - result.push_back(all[i]); - } - return; - } - - // Visit the parent before children. So that we hopefully prune parts of the - // tree. Ie given ( F(x_1,... x_10000) = v), where v is unconstrained, - // we don't spend time exploring F(..), but chop it out. - static void - getAllUnconstrainedVariables(vector & result) - { - const int size = all.size(); - for (int i = size-1; i >=0 ; i--) - { - if (all[i]->isUnconstrained()) - result.push_back(all[i]); - } - return; - } - - void - getAllVariablesRecursively(vector & result, set& visited) - { - if (!visited.insert(this).second) - return; - if (isSymbol()) - result.push_back(this); - const int size = children.size(); - for (int i = 0 ; i < size; i++) - { - children[i]->getAllVariablesRecursively(result,visited); - } - } - - - - bool - isUnconstrained() - { - if (!isSymbol()) - return false; - - return parents.size() == 1; - } - - static void - cleanup() - { - for (int i = 0; i < all.size(); i++) - delete all[i]; - all.clear(); - } - }; - -}; - -#endif /* MUTABLEASTNODE_H_ */ - diff --git a/src/vendor/stp/src/simplifier/PropagateEqualities.cpp b/src/vendor/stp/src/simplifier/PropagateEqualities.cpp deleted file mode 100644 index 09534ee75..000000000 --- a/src/vendor/stp/src/simplifier/PropagateEqualities.cpp +++ /dev/null @@ -1,309 +0,0 @@ -#include -#include "PropagateEqualities.h" -#include "simplifier.h" -#include "../AST/ArrayTransformer.h" - -namespace BEEV -{ - - /* The search functions look for variables that can be expressed in terms of variables. - * The most obvious case it doesn't check for is NOT (OR (.. .. )). - * I suspect this could take exponential time in the worst case, but on the benchmarks I've tested, - * it finishes in reasonable time. - * The obvious way to speed it up (if required), is to create the RHS lazily. - */ - - // The old XOR code used to use updateSolverMap instead of UpdateSubstitutionMap, I've no idea why. - - bool - PropagateEqualities::searchXOR(const ASTNode& lhs, const ASTNode& rhs) - { - Kind k = lhs.GetKind(); - - if (lhs == rhs) - return true; - - if (k == SYMBOL) - return simp->UpdateSubstitutionMap(lhs, rhs); // checks whether it's been solved for or loops. - - if (k == NOT) - return searchXOR(lhs[0], nf->CreateNode(NOT, rhs)); - - bool result = false; - if (k == XOR) - for (int i = 0; i < lhs.Degree(); i++) - { - ASTVec others; - for (int j = 0; j < lhs.Degree(); j++) - if (j != i) - others.push_back(lhs[j]); - - others.push_back(rhs); - assert (others.size() > 1); - ASTNode new_rhs = nf->CreateNode(XOR, others); - - result = searchXOR(lhs[i], new_rhs); - if (result) - return result; - } - - if (k == EQ && lhs[0].GetValueWidth() ==1) - { - bool result = searchTerm(lhs[0], nf->CreateTerm(ITE, 1,rhs, lhs[1], nf->CreateTerm(BVNEG, 1,lhs[1]))); - - if (!result) - result = searchTerm(lhs[1], nf->CreateTerm(ITE, 1,rhs, lhs[0], nf->CreateTerm(BVNEG, 1,lhs[0]))); - } - - return result; - } - - bool - PropagateEqualities::searchTerm(const ASTNode& lhs, const ASTNode& rhs) - { - const int width = lhs.GetValueWidth(); - - if (lhs == rhs) - return true; - - - if (lhs.GetKind() == SYMBOL) - return simp->UpdateSubstitutionMap(lhs, rhs); // checks whether it's been solved for, or if the RHS contains the LHS. - - if (lhs.GetKind() == BVUMINUS) - return searchTerm(lhs[0], nf->CreateTerm(BVUMINUS, width, rhs)); - - if (lhs.GetKind() == BVNEG) - return searchTerm(lhs[0], nf->CreateTerm(BVNEG, width, rhs)); - - if (lhs.GetKind() == BVXOR || lhs.GetKind() == BVPLUS) - for (int i = 0; i < lhs.Degree(); i++) - { - ASTVec others; - for (int j = 0; j < lhs.Degree(); j++) - if (j != i) - others.push_back(lhs[j]); - - ASTNode new_rhs; - if (lhs.GetKind() == BVXOR) - { - others.push_back(rhs); - assert (others.size() > 1); - new_rhs = nf->CreateTerm(lhs.GetKind(), width, others); - } - else if (lhs.GetKind() == BVPLUS) - { - if (others.size() >1) - new_rhs = nf->CreateTerm(BVPLUS, width, others); - else - new_rhs = others[0]; - - new_rhs = nf->CreateTerm(BVUMINUS,width,new_rhs); - new_rhs = nf->CreateTerm(BVPLUS,width,new_rhs, rhs); - } - else - FatalError("sdafasfsdf2q3234423"); - - bool result = searchTerm(lhs[i], new_rhs); - if (result) - return true; - } - - if (lhs.Degree() == 2 && lhs.GetKind() == BVMULT && lhs[0].isConstant() && simp->BVConstIsOdd(lhs[0])) - return searchTerm(lhs[1], nf->CreateTerm(BVMULT, width, simp->MultiplicativeInverse(lhs[0]), rhs)); - - return false; - } - - - // This doesn't rewrite changes through properly so needs to have a substitution applied to its output. - ASTNode - PropagateEqualities::propagate(const ASTNode& a, ArrayTransformer*at) - { - ASTNode output; - //if the variable has been solved for, then simply return it - if (simp->CheckSubstitutionMap(a, output)) - return output; - - if (!alreadyVisited.insert(a.GetNodeNum()).second) - { - return a; - } - - output = a; - - //traverse a and populate the SubstitutionMap - const Kind k = a.GetKind(); - if (SYMBOL == k && BOOLEAN_TYPE == a.GetType()) - { - bool updated = simp->UpdateSubstitutionMap(a, ASTTrue); - output = updated ? ASTTrue : a; - } - else if (NOT == k ) - { - bool updated = searchXOR(a[0], ASTFalse); - output = updated ? ASTTrue : a; - } - else if (IFF == k || EQ == k) - { - const ASTVec& c = a.GetChildren(); - - if (c[0] == c[1]) - return ASTTrue; - - bool updated = simp->UpdateSubstitutionMap(c[0], c[1]); - - if (updated) - { - //fill the arrayname readindices vector if e0 is a - //READ(Arr,index) and index is a BVCONST - int to; - if ((to = TermOrder(c[0], c[1])) == 1 && c[0].GetKind() == READ) - at->FillUp_ArrReadIndex_Vec(c[0], c[1]); - else if (to == -1 && c[1].GetKind() == READ) - at->FillUp_ArrReadIndex_Vec(c[1], c[0]); - } - - - if (!updated) - updated = searchTerm(c[0],c[1]); - - if (!updated) - updated = searchTerm(c[1],c[0]); - - output = updated ? ASTTrue : a; - - } - else if (XOR == k) - { - bool updated = searchXOR(a, ASTTrue); - output = updated ? ASTTrue : a; - - if (updated) - return output; - - // The below block should be subsumed by the searchXOR function which generalises it. - // So the below block should never do anything.. -#ifndef NDEBUG - if (a.Degree() != 2) - return output; - - int to = TermOrder(a[0], a[1]); - if (0 == to) - { - if (a[0].GetKind() == NOT && a[0][0].GetKind() == EQ && a[0][0][0].GetValueWidth() == 1 - && a[0][0][1].GetKind() == SYMBOL) - { - // (XOR (NOT(= (1 v))) ... ) - const ASTNode& symbol = a[0][0][1]; - const ASTNode newN = nf->CreateTerm(ITE, 1, a[1], a[0][0][0], - nf->CreateTerm(BVNEG, 1, a[0][0][0])); - - if (simp->UpdateSolverMap(symbol, newN)) - { - assert(false); - output = ASTTrue; - } - } - else if (a[1].GetKind() == NOT && a[1][0].GetKind() == EQ && a[1][0][0].GetValueWidth() == 1 - && a[1][0][1].GetKind() == SYMBOL) - { - const ASTNode& symbol = a[1][0][1]; - const ASTNode newN = nf->CreateTerm(ITE, 1, a[0], a[1][0][0], - nf->CreateTerm(BVNEG, 1, a[1][0][0])); - - if (simp->UpdateSolverMap(symbol, newN)) - { - assert(false); - output = ASTTrue; - } - } - else if (a[0].GetKind() == EQ && a[0][0].GetValueWidth() == 1 && a[0][1].GetKind() == SYMBOL) - { - // XOR ((= 1 v) ... ) - - const ASTNode& symbol = a[0][1]; - const ASTNode newN = nf->CreateTerm(ITE, 1, a[1], nf->CreateTerm(BVNEG, 1, a[0][0]), - a[0][0]); - - if (simp->UpdateSolverMap(symbol, newN)) - { - assert(false); - output = ASTTrue; - } - } - else if (a[1].GetKind() == EQ && a[1][0].GetValueWidth() == 1 && a[1][1].GetKind() == SYMBOL) - { - const ASTNode& symbol = a[1][1]; - const ASTNode newN = nf->CreateTerm(ITE, 1, a[0], nf->CreateTerm(BVNEG, 1, a[1][0]), - a[1][0]); - - if (simp->UpdateSolverMap(symbol, newN)) - { - assert(false); - output = ASTTrue; - } - } - else - return output; - } - else - { - ASTNode symbol, rhs; - if (to == 1) - { - symbol = a[0]; - rhs = a[1]; - } - else - { - symbol = a[1]; - rhs = a[0]; - } - - assert(symbol.GetKind() == SYMBOL); - - if (simp->UpdateSolverMap(symbol, nf->CreateNode(NOT, rhs))) - { - assert(false); - output = ASTTrue; - } - } -#endif - - } - else if (AND == k) - { - const ASTVec& c = a.GetChildren(); - ASTVec o; - o.reserve(c.size()); - - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - if (always_true) - simp->UpdateAlwaysTrueFormSet(*it); - ASTNode aaa = propagate(*it, at); - - if (ASTTrue != aaa) - { - if (ASTFalse == aaa) - return ASTFalse; - else - o.push_back(aaa); - } - } - if (o.size() == 0) - output = ASTTrue; - else if (o.size() == 1) - output = o[0]; - else if (o != c) - output = nf->CreateNode(AND, o); - else - output = a; - } - - return output; - } //end of CreateSubstitutionMap() - -} -; diff --git a/src/vendor/stp/src/simplifier/PropagateEqualities.h b/src/vendor/stp/src/simplifier/PropagateEqualities.h deleted file mode 100644 index 1fcf6d3e4..000000000 --- a/src/vendor/stp/src/simplifier/PropagateEqualities.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef PROPAGATEEQUALITIES_H_ -#define PROPAGATEEQUALITIES_H_ - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../simplifier/simplifier.h" -#include "../boost/noncopyable.hpp" - -//This finds conjuncts which are one of: (= SYMBOL BVCONST), (= BVCONST (READ SYMBOL BVCONST)), -// (IFF SYMBOL TRUE), (IFF SYMBOL FALSE), (IFF SYMBOL SYMBOL), (=SYMBOL SYMBOL) -// or (=SYMBOL BVCONST). -// It tries to remove the conjunct, storing it in the substitutionmap. It replaces it in the -// formula by true. - -namespace BEEV -{ - class Simplifier; - class ArrayTransformer; - - class PropagateEqualities : boost::noncopyable - { - - Simplifier *simp; - NodeFactory *nf; - STPMgr *bm; - const ASTNode ASTTrue, ASTFalse; - - bool searchXOR(const ASTNode& lhs, const ASTNode& rhs); - bool searchTerm(const ASTNode& lhs, const ASTNode& rhs); - - ASTNode - propagate(const ASTNode& a, ArrayTransformer*at); - HASHSET alreadyVisited; - - const bool always_true; - public: - - PropagateEqualities(Simplifier *simp_, NodeFactory *nf_, STPMgr *bm_) : - ASTTrue(bm_->ASTTrue), ASTFalse(bm_->ASTFalse), - always_true(bm_->UserFlags.isSet("always_true","1")) - { - simp = simp_; - nf = nf_; - bm = bm_; - } - - ASTNode - topLevel(const ASTNode& a, ArrayTransformer* at) - { - if (!bm->UserFlags.propagate_equalities) - return a; - - bm->GetRunTimes()->start(RunTimes::PropagateEqualities); - ASTNode result = propagate(a, at); - bm->GetRunTimes()->stop(RunTimes::PropagateEqualities); - return result; - } - - }; -} - -#endif diff --git a/src/vendor/stp/src/simplifier/RemoveUnconstrained.cpp b/src/vendor/stp/src/simplifier/RemoveUnconstrained.cpp deleted file mode 100644 index 482734b98..000000000 --- a/src/vendor/stp/src/simplifier/RemoveUnconstrained.cpp +++ /dev/null @@ -1,694 +0,0 @@ -/* - * Identifies unconstrained variables and remove them from the input. - * Robert Bruttomesso's & Robert Brummayer's dissertations describe this. - * - * Nb. this isn't finished. It doesn't do reads / writes. - * I don't think anything can be done for : bvsx, bvzx. - */ - -#include "RemoveUnconstrained.h" -#include "MutableASTNode.h" - -namespace BEEV -{ - using simplifier::constantBitP::Dependencies; - - RemoveUnconstrained::RemoveUnconstrained(STPMgr& _bm) : - bm(_bm) - { - nf = _bm.defaultNodeFactory; - } - - const bool debug_unconstrained = false; - - ASTNode - RemoveUnconstrained::topLevel(const ASTNode &n, Simplifier *simplifier) - { - ASTNode result(n); - - bm.GetRunTimes()->start(RunTimes::RemoveUnconstrained); - - if(simplifier->hasUnappliedSubstitutions()) - result = simplifier->applySubstitutionMap(result); - - // In some rare cases, the simplifier might not have removed a term - // that can be substituted away. e.g. read(A,0), if read(A,0) == 1, - // in the substitution map. - result = topLevel_other(result, simplifier); - - // It is idempotent if there are no big ANDS (we have a special hack), and, - // if we don't introduced any new "disjoint extracts." - - #if 0 - ASTNode result2 = topLevel_other(result, simplifier); - if (result2 != result) - { - cerr << n; - cerr << result; - cerr << result2; - assert(result2 == result); - } - #endif - bm.GetRunTimes()->stop(RunTimes::RemoveUnconstrained); - return result; - } - - bool allChildrenAreUnconstrained(vector children) - { - for (int i =0; i < children.size(); i++) - if (!children[i]->isUnconstrained()) - return false; - - return true; - } - - Simplifier *simplifier_convenient; - - ASTNode RemoveUnconstrained::replaceParentWithFresh(MutableASTNode& mute, vector& variables) - { - const ASTNode& parent = mute.n; - ASTNode v = bm.CreateFreshVariable(0, parent.GetValueWidth(), "unconstrained"); - mute.replaceWithVar(v,variables); - return v; - } - - // nb. This avoids the expensive checks that usually updating the substitution map - // entails. - void - RemoveUnconstrained::replace(const ASTNode& from, const ASTNode to) - { - assert(from.GetKind() == SYMBOL); - assert(from.GetValueWidth() == to.GetValueWidth()); - simplifier_convenient->UpdateSubstitutionMapFewChecks(from, to); - return; - } - - /* The most complicated handling is for EXTRACTS. If a variable has parents that - * are all extracts and each of those extracts is disjoint (i.e. reads different bits) - * Then each of the extracts are replaced by a fresh variable. This is the only case - * where a variable with multiple distinct parents is replaced by a fresh variable. - * + We perform this check upfront, so will miss any extra cases the the unconstrained - * variable elimination introduces. - * + It's all or nothing. So even if there's an extract of [0:2] [1:2] and [3:5], we wont - * replace the [3:5] (even though it could be). - */ - void - RemoveUnconstrained::splitExtractOnly(vector extracts) - { - assert(extracts.size() >0); - - // Going to be rebuilt later anyway, so discard. - vector variables; - - for (int i =0; i n; - assert(var.GetKind() == SYMBOL); - const int size = var.GetValueWidth(); - std::vector toVar(size); - - // Create a mutable copy that we can iterate over. - vector mut; - mut.insert(mut.end(), extracts[i]->parents.begin(), extracts[i]->parents.end()); - - for (vector::iterator it = mut.begin(); it != mut.end(); it++) - { - ASTNode parent_node = (*it)->n; - assert(((**it)).children[0] == extracts[i]); - assert(!parent_node.IsNull()); - assert(parent_node.GetKind() == BVEXTRACT); - - int lb = parent_node[2].GetUnsignedConst(); - // Replace each parent with a fresh. - toVar[lb] = replaceParentWithFresh(**it,variables); - } - - ASTVec concatVec; - int empty =0; - for (int j=0; j < size;j++) - { - if (toVar[j].IsNull()) - { - empty++; - continue; - } - - if (empty > 0) - { - concatVec.push_back(bm.CreateFreshVariable(0, empty, "extract_unc")); - empty = 0; - } - - concatVec.push_back(toVar[j]); - //cout << toVar[j]; - assert(toVar[j].GetValueWidth() > 0); - j+=toVar[j].GetValueWidth()-1; - } - - if (empty> 0) - { - concatVec.push_back(bm.CreateFreshVariable(0, empty, "extract_unc")); - } - - ASTNode concat = concatVec[0]; - for (int i=1; i < concatVec.size();i++) - { - assert(!concat.IsNull()); - concat = bm.CreateTerm(BVCONCAT, concat.GetValueWidth() + concatVec[i].GetValueWidth(),concatVec[i], concat); - } - - replace(var,concat); - } - } - - ASTNode - RemoveUnconstrained::topLevel_other(const ASTNode &n, Simplifier *simplifier) - { - if (n.GetKind() == SYMBOL) - return n; // top level is an unconstrained symbol/. - - simplifier_convenient = simplifier; - - ASTNodeSet noCheck; // We don't want to check some expensive nodes over and over again. - - vector variable_array; - - MutableASTNode* topMutable = MutableASTNode::build(n); - - vector extracts; - topMutable->getDisjointExtractVariables(extracts); - if (extracts.size() > 0) - { - splitExtractOnly(extracts); - } - - topMutable->getAllUnconstrainedVariables(variable_array); - - for (int i =0; i < variable_array.size() ; i++) - { - // Don't make this is a reference. If the vector gets resized, it will point to - // memory that no longer contains the object. - MutableASTNode& muteNode = *variable_array[i]; - - const ASTNode var = muteNode.n; - assert(var.GetKind() == SYMBOL); - - if (!muteNode.isUnconstrained()) - continue; - - MutableASTNode& muteParent = muteNode.getParent(); - - if (noCheck.find(muteParent.n) != noCheck.end()) - { - continue; - } - - vector mutable_children = muteParent.children; - - //nb. The children might be dirty. i.e. not have substitutions written through them yet. - ASTVec children; - children.reserve(mutable_children.size()); - for (int j = 0; j n); - - const size_t numberOfChildren = children.size(); - const Kind kind = muteNode.getParent().n.GetKind(); - unsigned width = muteNode.getParent().n.GetValueWidth(); - unsigned indexWidth = muteNode.getParent().n.GetIndexWidth(); - - ASTNode other; - MutableASTNode* muteOther; - - if(numberOfChildren == 2) - { - if (children[0] != var) - { - other = children[0]; - muteOther = mutable_children[0]; - } - else - { - other = children[1]; - muteOther = mutable_children[1]; - } - - if (kind != AND && kind != OR && kind != BVOR && kind != BVAND) - if (other == var) - continue; // Most rules don't like duplicate variables. - } - else - { - if (kind != AND && kind != OR && kind != BVOR && kind != BVAND) - { - int found = 0; - - for (int i = 0; i < numberOfChildren; i++) - { - if (children[i] == var) - found++; - } - - if (found != 1) - continue; // Most rules don't like duplicate variables. - } - } - - /* - cout << i << " " << kind << " " << variable_array.size() << " " << mutable_children.size() << endl; - cout << "children[0]" << children[0] << endl; - cout << "children[1]" << children[1] << endl; - cout << muteParent.n << endl; - - */ - - switch (kind) - { - case BVCONCAT: - assert(numberOfChildren == 2); - if (mutable_children[0]->isUnconstrained() && (mutable_children[1]->isUnconstrained())) - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTNode top_lhs = bm.CreateBVConst(32, width - 1); - ASTNode bottom_lhs = bm.CreateBVConst(32, children[1].GetValueWidth()); - - ASTNode top_rhs = bm.CreateBVConst(32, children[1].GetValueWidth()- 1); - ASTNode bottom_rhs = bm.CreateBVConst(32, 0); - - ASTNode lhs = nf->CreateTerm(BVEXTRACT, children[0].GetValueWidth(), v,top_lhs, bottom_lhs); - ASTNode rhs = nf->CreateTerm(BVEXTRACT, children[1].GetValueWidth(), v,top_rhs, bottom_rhs); - - replace(children[0],lhs); - replace(children[1],rhs); - } - break; - case NOT: - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[0], nf->CreateNode(NOT, v)); - } - break; - - case BVUMINUS: - case BVNEG: - { - assert(numberOfChildren ==1); - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(var, nf->CreateTerm(kind, width,v)); - } - break; - - case BVSGT: - case BVSGE: - case BVGT: - case BVGE: - { - width = var.GetValueWidth(); - if (width ==1) - continue; // Hard to get right, not used often. - - ASTNode biggestNumber, smallestNumber; - - if (kind == BVSGT || kind == BVSGE) - { - // 011111111 (most positive number.) - CBV max = CONSTANTBV::BitVector_Create(width, false); - CONSTANTBV::BitVector_Fill(max); - CONSTANTBV::BitVector_Bit_Off(max, width - 1); - biggestNumber = bm.CreateBVConst(max, width); - - // 1000000000 (most negative number.) - max = CONSTANTBV::BitVector_Create(width, true); - CONSTANTBV::BitVector_Bit_On(max, width - 1); - smallestNumber = bm.CreateBVConst(max, width); - } - else if (kind == BVGT || kind == BVGE) - { - biggestNumber = bm.CreateMaxConst(width); - smallestNumber = bm.CreateZeroConst(width); - } - else - FatalError("SDFA!@S"); - - - ASTNode c1,c2; - if (kind == BVSGT || kind == BVGT) - { - c1= biggestNumber; - c2 = smallestNumber; - } - else if (kind == BVSGE || kind == BVGE) - { - c1= smallestNumber; - c2 = biggestNumber; - } - else - FatalError("SDFA!@S"); - - if (mutable_children[0]->isUnconstrained() && mutable_children[1]->isUnconstrained()) - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTNode lhs = nf->CreateTerm(ITE, width, v, bm.CreateOneConst(width), bm.CreateZeroConst(width)); - ASTNode rhs = nf->CreateTerm(ITE, width, v, bm.CreateZeroConst(width), bm.CreateOneConst(width)); - replace(children[0], lhs); - replace(children[1], rhs); - } - else if (children[0] == var && children[1].isConstant()) - { - if (children[1] == c1) - continue; // always false. Or always false. - - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTNode rhs = nf->CreateTerm(ITE, width, v,biggestNumber, smallestNumber); - replace(var, rhs); - } - else if (children[1] == var && children[0].isConstant()) - { - if (children[0] == c2) - continue; // always false. Or always false. - - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTNode rhs = nf->CreateTerm(ITE, width, v, smallestNumber, biggestNumber); - replace(var, rhs); - } - else // One side is a variable. The other is anything. - { - bool varOnLHS = (var == children[0]); - - // All the ASTNode vars need to map to their existing MutableASTNodes. So we collect all the variables - vector vars; - set visited; - muteOther->getAllVariablesRecursively(vars, visited); - visited.clear(); - - map create; - for (vector::iterator it = vars.begin(); it != vars.end();it++) - create.insert(make_pair((*it)->n, *it)); - vars.clear(); - - ASTNode v= bm.CreateFreshVariable(0, 0, "STP_INTERNAL_comparison"); - - ASTNode rhs; - ASTNode n; - if (varOnLHS) - { - rhs = nf->CreateTerm(ITE, width, v, biggestNumber, smallestNumber); - - if (kind == BVSGE || kind == BVGE) - n= nf->CreateNode(OR, v, nf->CreateNode(EQ, mutable_children[1]->toASTNode(nf), c1)); - else - n= nf->CreateNode(AND, v, nf->CreateNode(NOT,nf->CreateNode(EQ, mutable_children[1]->toASTNode(nf), c1))); - } - else - { - rhs = nf->CreateTerm(ITE, width, v, smallestNumber, biggestNumber); - - if (kind == BVSGE || kind == BVGE) - n= nf->CreateNode(OR, v, nf->CreateNode(EQ, mutable_children[0]->toASTNode(nf), c2)); - else - n= nf->CreateNode(AND, v, nf->CreateNode(NOT,nf->CreateNode(EQ, mutable_children[0]->toASTNode(nf), c2))); - } - replace(var, rhs); - MutableASTNode *newN = MutableASTNode::build(n,create); - muteParent.replaceWithAnotherNode(newN); - //assert(muteParent.checkInvariant()); - } - } - break; - - - case AND: - case OR: - case BVOR: - case BVAND: - { - if (allChildrenAreUnconstrained(mutable_children)) - { - ASTNodeSet already; - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - for (int i =0; i < numberOfChildren;i++) - { - /* to avoid problems with: - 734:(AND - 732:unconstrained_4 - 716:unconstrained_2 - 732:unconstrained_4) - */ - if (already.find(children[i]) == already.end()) - { - replace(children[i], v); - already.insert(children[i]); - } - } - } - else - { - // Hack. ff.stp has a 325k node conjunction - // So we check if all the children are unconstrained each time - // we find a new unconstrained conjunct. This means that if - // eventually all the nodes become unconstrained we will miss it - // and not rewrite the AND to a fresh unconstrained variable. - - if (mutable_children.size() > 200) - noCheck.insert(muteParent.n); - } - } - break; - - case XOR: - case BVXOR: - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTVec others; - for (int i = 0; i < numberOfChildren; i++) - { - if (children[i] !=var) - others.push_back(mutable_children[i]->toASTNode(nf)); - } - assert(others.size() +1 == numberOfChildren); - assert(others.size() >=1); - - if (kind == XOR) - { - ASTNode xorNode = nf->CreateNode(XOR, others); - replace(var, nf->CreateNode(XOR, v, xorNode)); - } - else - { - ASTNode xorNode ; - if (others.size() > 1 ) - xorNode = nf->CreateTerm(BVXOR, width, others); - else - xorNode = others[0]; - - replace(var, nf->CreateTerm(BVXOR, width, v, xorNode)); - } - } - break; - - case ITE: - { - if (indexWidth > 0) - continue; // don't do arrays. - - if (mutable_children[0]->isUnconstrained() && mutable_children[1]->isUnconstrained() && children[0] != children[1]) - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[0], bm.ASTTrue); - replace(children[1], v); - - } - else if (mutable_children[0]->isUnconstrained() && mutable_children[2]->isUnconstrained() && children[0] != children[2]) - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[0], bm.ASTFalse); - replace(children[2], v); - } - else if (mutable_children[1]->isUnconstrained() && mutable_children[2]->isUnconstrained()) - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[1], v); - if (children[1] != children[2]) - replace(children[2], v); - } - } - break; - case BVLEFTSHIFT: - case BVRIGHTSHIFT: - case BVSRSHIFT: - { - assert(numberOfChildren == 2); - if (mutable_children[0]->isUnconstrained() && mutable_children[1]->isUnconstrained()) - { - assert(children[0] != children[1]); - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[1], bm.CreateZeroConst(width)); - replace(children[0], v); - } - } - break; - - case BVMOD: - { - assert(numberOfChildren == 2); - if (mutable_children[0]->isUnconstrained() && mutable_children[1]->isUnconstrained() && bm.UserFlags.isSet("unconstrained-bvmod", "0") ) - { - assert (children[0] != children[1]); - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[1], bm.CreateZeroConst(width)); - replace(children[0], v); - } - } - break; - - - case BVDIV: - { - assert(numberOfChildren == 2); - if (mutable_children[0]->isUnconstrained() && mutable_children[1]->isUnconstrained()) - { - assert (children[0] != children[1]); - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[1], bm.CreateOneConst(width)); - replace(children[0], v); - } - } - break; - case BVMULT: - { - assert(numberOfChildren == 2); - - if (mutable_children[1]->isUnconstrained() && mutable_children[0]->isUnconstrained()) // both are unconstrained - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - replace(children[0], bm.CreateOneConst(width)); - replace(children[1], v); - } - - if (other.isConstant() && simplifier->BVConstIsOdd(other)) - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - ASTNode inverse = simplifier->MultiplicativeInverse(other); - ASTNode rhs = nf->CreateTerm(BVMULT, width, inverse, v); - replace(var, rhs); - } - - break; - case IFF: - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTNode rhs = nf->CreateNode(ITE, v, muteOther->toASTNode(nf), nf->CreateNode(NOT, muteOther->toASTNode(nf))); - replace(var, rhs); - } - break; - case EQ: - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - width = var.GetValueWidth(); - ASTNode rhs = nf->CreateTerm(ITE, width, v, muteOther->toASTNode(nf), nf->CreateTerm(BVPLUS, width, muteOther->toASTNode(nf), - bm.CreateOneConst(width))); - - replace(var, rhs); - } - break; - case BVSUB: - { - assert(numberOfChildren == 2); - - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTNode rhs; - - if (children[0] == var) - rhs= nf->CreateTerm(BVPLUS, width, v, muteOther->toASTNode(nf)); - if (children[1] == var) - rhs= nf->CreateTerm(BVSUB, width, muteOther->toASTNode(nf), v); - - replace(var, rhs); - } - break; - - case BVPLUS: - { - ASTVec other; - for (int i = 0; i < children.size(); i++) - if (children[i] != var) - other.push_back(mutable_children[i]->toASTNode(nf)); - - assert(other.size() == children.size()-1); - assert(other.size() >=1); - - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - ASTNode rhs; - if (other.size() > 1) - rhs = nf->CreateTerm(BVSUB, width, v, nf->CreateTerm(BVPLUS, width, other)); - else - rhs = nf->CreateTerm(BVSUB, width, v, other[0]); - - replace(var, rhs); - } - break; - case BVEXTRACT: - { - ASTNode v =replaceParentWithFresh(muteParent, variable_array); - - const unsigned resultWidth = width; - const unsigned operandWidth = var.GetValueWidth(); - assert(children[0] == var); // It can't be anywhere else. - - // Create Fresh variables to pad the LHS and RHS. - const unsigned high = children[1].GetUnsignedConst(); - const unsigned low = children[2].GetUnsignedConst(); - assert(high >=low); - - const int rhsSize = low; - const int lhsSize = operandWidth - high - 1; - - ASTNode current = v; - int newWidth = v.GetValueWidth(); - - if (lhsSize > 0) - { - ASTNode lhsFresh = bm.CreateFreshVariable(0, lhsSize, "lhs_padding"); - current = nf->CreateTerm(BVCONCAT, newWidth + lhsSize, lhsFresh, current); - newWidth += lhsSize; - } - - if (rhsSize > 0) - { - ASTNode rhsFresh = bm.CreateFreshVariable(0, rhsSize, "rhs_padding"); - current = nf->CreateTerm(BVCONCAT, newWidth + rhsSize, current, rhsFresh); - newWidth += rhsSize; - } - - assert(newWidth == operandWidth); - replace(var, current); - } - break; - default: - { - //cerr << "!!!!" << kind << endl; - } - - // cerr << var; - // cerr << parent; - - } - } - } - - ASTNode result = topMutable->toASTNode(nf); - topMutable->cleanup(); - //cout << result; - return result; - } - -} -; diff --git a/src/vendor/stp/src/simplifier/RemoveUnconstrained.h b/src/vendor/stp/src/simplifier/RemoveUnconstrained.h deleted file mode 100644 index a7448130f..000000000 --- a/src/vendor/stp/src/simplifier/RemoveUnconstrained.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * RemoveUnconstrained.h - * - * Unconstrained variable elination. - */ - -#ifndef REMOVEUNCONSTRAINED_H_ -#define REMOVEUNCONSTRAINED_H_ -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "constantBitP/Dependencies.h" -#include "simplifier.h" -#include "MutableASTNode.h" -#include "../boost/noncopyable.hpp" - - -namespace BEEV -{ - using simplifier::constantBitP::Dependencies; - - class RemoveUnconstrained : boost::noncopyable - { - STPMgr& bm; - - ASTNode replaceParentWithFresh(MutableASTNode& mute, vector& variables); - - ASTNode - topLevel_other(const ASTNode &n, Simplifier *simplifier); - - void - splitExtractOnly(vector extracts); - - void - replace(MutableASTNode* from, const ASTNode to); - - - void - replace(const ASTNode& from, const ASTNode to); - - NodeFactory* nf; - - public: - - RemoveUnconstrained(STPMgr& bm); - - ASTNode - topLevel(const ASTNode &n, Simplifier *s); - - }; - -} -; - -#endif /* REMOVEUNCONSTRAINED_H_ */ diff --git a/src/vendor/stp/src/simplifier/SubstitutionMap.cpp b/src/vendor/stp/src/simplifier/SubstitutionMap.cpp deleted file mode 100644 index 7d6ca39ae..000000000 --- a/src/vendor/stp/src/simplifier/SubstitutionMap.cpp +++ /dev/null @@ -1,386 +0,0 @@ -#include "SubstitutionMap.h" -#include "simplifier.h" -#include "../AST/ArrayTransformer.h" - -namespace BEEV -{ - - SubstitutionMap::~SubstitutionMap() - { - delete SolverMap; - } - -// if false. Don't simplify while creating the substitution map. -// This makes it easier to spot how long is spent in the simplifier. - const bool simplify_during_create_subM = false; - -//if a is READ(Arr,const) and b is BVCONST then return 1. -//if a is a symbol SYMBOL, return 1. -//if b is READ(Arr,const) and a is BVCONST then return -1 -// if b is a symbol return -1. -// -//else return 0 by default - int - TermOrder(const ASTNode& a, const ASTNode& b) - { - const Kind k1 = a.GetKind(); - const Kind k2 = b.GetKind(); - - if (k1 == SYMBOL) - return 1; - - if (k2 == SYMBOL) - return -1; - - //a is of the form READ(Arr,const), and b is const, or - if ((k1 == READ && a[0].GetKind() == SYMBOL && a[1].GetKind() == BVCONST && (k2 == BVCONST))) - return 1; - - //b is of the form READ(Arr,const), and a is const, or - //b is of the form var, and a is const - if ((k1 == BVCONST) && ((k2 == READ && b[0].GetKind() == SYMBOL && b[1].GetKind() == BVCONST))) - return -1; - - return 0; - } //End of TermOrder() - -// idempotent. - ASTNode - SubstitutionMap::applySubstitutionMap(const ASTNode& n) - { - bm->GetRunTimes()->start(RunTimes::ApplyingSubstitutions); - ASTNodeMap cache; - ASTNode result = replace(n, *SolverMap, cache, nf, false, false); - - // NB. This is an expensive check. Remove it after it's been idempotent - // for a while. -#ifndef NDEBUG - cache.clear(); - assert( result == replace(result,*SolverMap,cache,nf, false,false)); -#endif - - bm->GetRunTimes()->stop(RunTimes::ApplyingSubstitutions); - return result; - } - -// not always idempotent. - ASTNode - SubstitutionMap::applySubstitutionMapUntilArrays(const ASTNode& n) - { - bm->GetRunTimes()->start(RunTimes::ApplyingSubstitutions); - ASTNodeMap cache; - ASTNode result = replace(n, *SolverMap, cache, nf, true, false); - bm->GetRunTimes()->stop(RunTimes::ApplyingSubstitutions); - return result; - } - - ASTNode - SubstitutionMap::replace(const ASTNode& n, ASTNodeMap& fromTo, ASTNodeMap& cache, NodeFactory * nf) - { - return replace(n, fromTo, cache, nf, false, false); - } - -// NOTE the fromTo map is changed as we traverse downwards. -// We call replace on each of the things in the fromTo map aswell. -// This is in case we have a fromTo map: (x maps to y), (y maps to 5), -// and pass the replace() function the node "x" to replace, then it -// will return 5, rather than y. - -// NB: You can't use this to map from "5" to the symbol "x" say. -// It's optimised for the symbol to something case. - - ASTNode - SubstitutionMap::replace(const ASTNode& n, ASTNodeMap& fromTo, ASTNodeMap& cache, NodeFactory * nf, bool stopAtArrays, - bool preventInfinite) - { - const Kind k = n.GetKind(); - if (k == BVCONST || k == TRUE || k == FALSE) - return n; - - ASTNodeMap::const_iterator it; - - if ((it = cache.find(n)) != cache.end()) - return it->second; - - if ((it = fromTo.find(n)) != fromTo.end()) - { - const ASTNode& r = it->second; - assert(r.GetIndexWidth() == n.GetIndexWidth()); - - if (preventInfinite) - cache.insert(make_pair(n, r)); - - ASTNode replaced = replace(r, fromTo, cache, nf, stopAtArrays, preventInfinite); - if (replaced != r) - { - fromTo.erase(n); - fromTo[n] = replaced; - } - - if (preventInfinite) - cache.erase(n); - - cache.insert(make_pair(n, replaced)); - return replaced; - } - - // These can't be created like regular nodes are - if (k == SYMBOL) - return n; - - const unsigned int indexWidth = n.GetIndexWidth(); - if (stopAtArrays && indexWidth > 0) // is an array. - { - return n; - } - - const ASTVec& children = n.GetChildren(); - assert(children.size() > 0); - // Should have no leaves left here. - - ASTVec new_children; - new_children.reserve(children.size()); - - for (ASTVec::const_iterator it = children.begin(); it != children.end(); it++) - { - new_children.push_back(replace(*it, fromTo, cache, nf, stopAtArrays, preventInfinite)); - } - - assert(new_children.size() == children.size()); - - // This code short-cuts if the children are the same. Nodes with the same children, - // won't have necessarily given the same node if the simplifyingNodeFactory is enabled - // now, but wasn't enabled when the node was created. Shortcutting saves lots of time. - if (new_children == children) - { - cache.insert(make_pair(n, n)); - return n; - } - - ASTNode result; - const unsigned int valueWidth = n.GetValueWidth(); - - if (valueWidth == 0) // n.GetType() == BOOLEAN_TYPE - { - result = nf->CreateNode(k, new_children); - } - else - { - // If the index and value width aren't saved, they are reset sometimes (??) - result = nf->CreateArrayTerm(k, indexWidth, valueWidth, new_children); - } - - // We may have created something that should be mapped. For instance, - // if n is READ(A, x), and the fromTo is: {x==0, READ(A,0) == 1}, then - // by here the result will be READ(A,0). Which needs to be mapped again.. - // I hope that this makes it idempotent. - - if (fromTo.find(result) != fromTo.end()) - { - // map n->result, if running replace() on result gives us 'n', it will not infinite loop. - // This is only currently required for the bitblast equivalence stuff. - if (preventInfinite) - cache.insert(make_pair(n, result)); - - result = replace(result, fromTo, cache, nf, stopAtArrays, preventInfinite); - } - - assert(result.GetValueWidth() == valueWidth); - assert(result.GetIndexWidth() == indexWidth); - - // If there is already an "n" element in the cache, the maps semantics are to ignore the next insertion. - if (preventInfinite) - cache.erase(n); - - cache.insert(make_pair(n, result)); - return result; - } - -// Adds to the dependency graph that n0 depends on the variables in n1. -// It's not the transitive closure of the dependencies. Just the variables in the expression "n1". -// This is only needed as long as all the substitution rules haven't been written through. - void - SubstitutionMap::buildDepends(const ASTNode& n0, const ASTNode& n1) - { - if (n0.GetKind() != SYMBOL) - return; - - if (n1.isConstant()) - return; - - vector av; - vars.VarSeenInTerm(vars.getSymbol(n1), rhs_visited, rhs, av); - - sort(av.begin(), av.end()); - for (int i = 0; i < av.size(); i++) - { - if (i != 0 && av[i] == av[i - 1]) - continue; // Treat it like a set of Symbol* in effect. - - ASTNodeSet* sym = (vars.TermsAlreadySeenMap.find(av[i])->second); - if (rhsAlreadyAdded.find(sym) != rhsAlreadyAdded.end()) - continue; - rhsAlreadyAdded.insert(sym); - - //cout << loopCount++ << " "; - //cout << "initial" << rhs.size() << " Adding: " <size(); - rhs.insert(sym->begin(), sym->end()); - //cout << "final:" << rhs.size(); - //cout << "added:" << sym << endl; - - } - - assert(dependsOn.find(n0) == dependsOn.end()); - dependsOn.insert(make_pair(n0, vars.getSymbol(n1))); - } - -// Take the transitive closure of the varsToCheck. Storing the result in visited. - void - SubstitutionMap::loops_helper(const set& varsToCheck, set& visited) - { - set::const_iterator visitedIt = visited.begin(); - - set toVisit; - vector visitedN; - - // for each variable. - for (set::const_iterator varIt = varsToCheck.begin(); varIt != varsToCheck.end(); varIt++) - { - while (visitedIt != visited.end() && *visitedIt < *varIt) - visitedIt++; - - if ((visitedIt != visited.end()) && *visitedIt == *varIt) - continue; - - visitedN.push_back(*varIt); - DependsType::iterator it; - if ((it = dependsOn.find(*varIt)) != dependsOn.end()) - { - Symbols* s = it->second; - bool destruct; - ASTNodeSet* varsSeen = vars.SetofVarsSeenInTerm(s, destruct); - toVisit.insert(varsSeen->begin(), varsSeen->end()); - - if (destruct) - delete varsSeen; - } - } - - visited.insert(visitedN.begin(), visitedN.end()); - - visitedN.clear(); - - if (toVisit.size() != 0) - loops_helper(toVisit, visited); - } - -// If n0 is replaced by n1 in the substitution map. Will it cause a loop? -// i.e. will the dependency graph be an acyclic graph still. -// For example, if we have x = F(y,z,w), it would make the substitutionMap loop -// if there's already z = F(x). - bool - SubstitutionMap::loops(const ASTNode& n0, const ASTNode& n1) - { - if (n0.GetKind() != SYMBOL) - return false; // sometimes this function is called with constants on the lhs. - - if (n1.isConstant()) - return false; // constants contain no variables. Can't loop. - - // We are adding an edge FROM n0, so unless there is already an edge TO n0, - // there is no change it can loop. Unless adding this would add a TO and FROM edge. - if (rhs.find(n0) == rhs.end()) - { - return vars.VarSeenInTerm(n0, n1); - } - - if (n1.GetKind() == SYMBOL && dependsOn.find(n1) == dependsOn.end()) - return false; // The rhs is a symbol and doesn't appear. - - if (debug_substn) - cout << loopCount++ << endl; - - bool destruct = true; - ASTNodeSet* dependN = vars.SetofVarsSeenInTerm(n1, destruct); - - if (debug_substn) - { - cout << n0 << " " << n1.GetNodeNum(); //<< " Expression size:" << bm->NodeSize(n1,true); - cout << "Variables in expression: " << dependN->size() << endl; - } - - set depend(dependN->begin(), dependN->end()); - - if (destruct) - delete dependN; - - set visited; - loops_helper(depend, visited); - - bool loops = visited.find(n0) != visited.end(); - - if (debug_substn) - cout << "Visited:" << visited.size() << "Loops:" << loops << endl; - - return (loops); - } - - bool - SubstitutionMap::UpdateSubstitutionMap(const ASTNode& e0, const ASTNode& e1) - { - int i = TermOrder(e0, e1); - if (0 == i) - return false; - - assert(e0 != e1); - assert(e0.GetValueWidth() == e1.GetValueWidth()); - assert(e0.GetIndexWidth() == e1.GetIndexWidth()); - - if (e0.GetKind() == SYMBOL) - { - if (CheckSubstitutionMap(e0)) - { - // e0 and e1 might both be variables, e0 is already substituted for, - // but maybe not e1. - if (e1.GetKind() == SYMBOL) - i = -1; - else - return false; // already in the map. - } - - if (loops(e0, e1)) - return false; // loops. - } - - if (e1.GetKind() == SYMBOL) - { - if (CheckSubstitutionMap(e1)) - return false; // already in the map. - - if (loops(e1, e0)) - return false; // loops - } - - //e0 is of the form READ(Arr,const), and e1 is const, or - //e0 is of the form var, and e1 is a function. - if (1 == i && !CheckSubstitutionMap(e0)) - { - buildDepends(e0, e1); - (*SolverMap)[e0] = e1; - return true; - } - - //e1 is of the form READ(Arr,const), and e0 is const, or - //e1 is of the form var, and e0 is const - if (-1 == i && !CheckSubstitutionMap(e1)) - { - buildDepends(e1, e0); - (*SolverMap)[e1] = e0; - return true; - } - - return false; - } - -} -; diff --git a/src/vendor/stp/src/simplifier/SubstitutionMap.h b/src/vendor/stp/src/simplifier/SubstitutionMap.h deleted file mode 100644 index 0a11f0bf9..000000000 --- a/src/vendor/stp/src/simplifier/SubstitutionMap.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef SUBSTITUTIONMAP_H_ -#define SUBSTITUTIONMAP_H_ - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../AST/NodeFactory/SimplifyingNodeFactory.h" -#include "VariablesInExpression.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - - class Simplifier; - class ArrayTransformer; - - const bool debug_substn = false; - - class SubstitutionMap : boost::noncopyable - { - - ASTNodeMap * SolverMap; - Simplifier *simp; - STPMgr* bm; - ASTNode ASTTrue, ASTFalse, ASTUndefined; - NodeFactory *nf; - - // These are used to avoid substituting {x = f(y,z), z = f(x)} - typedef hash_map DependsType; - DependsType dependsOn; // The lhs depends on the variables in the rhs. - ASTNodeSet rhs; // All the rhs that have been seeen. - set rhsAlreadyAdded; - VariablesInExpression::SymbolPtrSet rhs_visited; // the rhs contains all the variables in here already. - - int loopCount; - - void - buildDepends(const ASTNode& n0, const ASTNode& n1); - void - loops_helper(const set& varsToCheck, set& visited); - bool - loops(const ASTNode& n0, const ASTNode& n1); - - int substitutionsLastApplied; - public: - - bool - hasUnappliedSubstitutions() - { - return (substitutionsLastApplied != SolverMap->size()); - } - - // When the substitutionMap has been applied globally, then, - // these are no longer needed. - void - haveAppliedSubstitutionMap() - { - dependsOn.clear(); - rhs.clear(); - rhs_visited.clear(); - rhsAlreadyAdded.clear(); - substitutionsLastApplied = SolverMap->size(); - } - - VariablesInExpression vars; - - SubstitutionMap(Simplifier *_simp, STPMgr* _bm) - { - simp = _simp; - bm = _bm; - - ASTTrue = bm->CreateNode(TRUE); - ASTFalse = bm->CreateNode(FALSE); - ASTUndefined = bm->CreateNode(UNDEFINED); - - SolverMap = new ASTNodeMap(INITIAL_TABLE_SIZE); - loopCount = 0; - substitutionsLastApplied = 0; - nf = bm->defaultNodeFactory; - } - - void - clear() - { - SolverMap->clear(); - haveAppliedSubstitutionMap(); - } - - virtual - ~SubstitutionMap(); - - //check the solver map for 'key'. If key is present, then return the - //value by reference in the argument 'output' - bool - CheckSubstitutionMap(const ASTNode& key, ASTNode& output) - { - ASTNodeMap::iterator it = SolverMap->find(key); - if (it != SolverMap->end()) - { - output = it->second; - return true; - } - return false; - } - - //update solvermap with (key,value) pair - bool - UpdateSolverMap(const ASTNode& key, const ASTNode& value) - { - ASTNode var = (BVEXTRACT == key.GetKind()) ? key[0] : key; - - if (var.GetKind() == SYMBOL && loops(var, value)) - return false; - - if (!CheckSubstitutionMap(var) && key != value) - { - //cerr << "from" << key << "to" <find(key) != SolverMap->end()) - return true; - else - return false; - } - - // It's depressingly expensive to perform all of the loop checks etc. - // If you use this function you are promising: - // 1) That UpdateSubstitutionMap(e0,e1) would have returned true. - // 2) That all of the substitutions will be written in fully before other code - bool - UpdateSubstitutionMapFewChecks(const ASTNode& e0, const ASTNode& e1) - { - assert(e0.GetKind() == SYMBOL); - assert(!CheckSubstitutionMap(e0)); - (*SolverMap)[e0] = e1; - return true; - } - - // The substitutionMap will be updated, given x <-> f(w,z,y), iff, - // 1) x doesn't appear in the rhs. - // 2) x hasn't already been stored in the substitution map. - // 3) none of the variables in the transitive closure of the rhs depend on x. - bool - UpdateSubstitutionMap(const ASTNode& e0, const ASTNode& e1); - - ASTNode - applySubstitutionMap(const ASTNode& n); - - ASTNode - applySubstitutionMapUntilArrays(const ASTNode& n); - - // Replace any nodes in "n" that exist in the fromTo map. - // NB the fromTo map is changed. - static ASTNode - replace(const ASTNode& n, ASTNodeMap& fromTo, ASTNodeMap& cache, NodeFactory *nf); - static ASTNode - replace(const ASTNode& n, ASTNodeMap& fromTo, ASTNodeMap& cache, NodeFactory *nf, bool stopAtArrays, - bool preventInfiniteLoops); - - }; - -} -; -#endif /* SUBSTITUTIONMAP_H_ */ diff --git a/src/vendor/stp/src/simplifier/Symbols.h b/src/vendor/stp/src/simplifier/Symbols.h deleted file mode 100644 index c520925c9..000000000 --- a/src/vendor/stp/src/simplifier/Symbols.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef SYMBOLS_H -#define SYMBOLS_H - -#include "../boost/noncopyable.hpp" - -// Each node is either: empty, an ASTNode, or a vector of more than one child nodes. - -class Symbols : boost::noncopyable -{ - public: - - const ASTNode found; - const vector children; - - Symbols() { - } - - Symbols(const ASTNode& n): found(n) - { - assert(BEEV::SYMBOL == n.GetKind()); - } - - // This will create an "empty" node if the array is empty. - Symbols(const vector& s): - children(s.begin(), s.end()) - { - // Children should never be empty. They shouldn't be children. - for(vector::const_iterator it = children.begin(); it!= children.end(); it++) - { - assert(!(*it)->empty()); - } - - assert(children.size() != 1); - } - - bool isLeaf() - { - return !found.IsNull(); - } - - bool empty() const { - return (found.IsNull() && children.size() == 0); - } - }; - -class SymbolPtrHasher -{ -public: - size_t operator()(const Symbols * n) const - { - return (size_t) n; - } - ; -}; //End of ASTNodeHasher - - -#endif diff --git a/src/vendor/stp/src/simplifier/UseITEContext.h b/src/vendor/stp/src/simplifier/UseITEContext.h deleted file mode 100644 index 5d960c425..000000000 --- a/src/vendor/stp/src/simplifier/UseITEContext.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Descend through ITEs keeping a stack of what must be true/false. - * For instance. In the following: - * (ite (or a b) (not (or a b)) c ) - * - * In the lhs of the ITE, we know that a or b are true, so, we can rewrite it to: - * (ite (or a b) false c) - * - */ - -#ifndef UseITEContext_H_ -#define UseITEContext_H_ - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - class UseITEContext : boost::noncopyable - { - NodeFactory *nf; - RunTimes *runtimes; - ASTNode ASTTrue, ASTFalse; - - void addToContext(const ASTNode&n , ASTNodeSet& context) - { - if (n.GetKind() == NOT && n[0].GetKind() == OR) - { - ASTVec flat = FlattenKind(OR, n[0].GetChildren()); - for (int i = 0; i < flat.size(); i++) - context.insert(nf->CreateNode(NOT, flat[i])); - } - else if (n.GetKind() == AND) - { - ASTVec flat = FlattenKind(AND, n.GetChildren()); - context.insert(flat.begin(), flat.end()); - } - else - context.insert(n); - } - - // Unfortunately there can be a lot of paths through a small formula. - // So we limit how often each node is visited. - - ASTNode - visit(const ASTNode &n, map& visited, ASTNodeSet& visited_empty, ASTNodeSet& context) - { - if (n.isConstant()) - return n; - - if (context.size() == 0 && visited_empty.find(n) != visited_empty.end()) - return n; - - if (context.size() == 0) - visited_empty.insert(n); - - if (context.find(n) != context.end()) - return ASTTrue; - - if (context.find(nf->CreateNode(NOT,n)) != context.end()) - return ASTFalse; - - if (n.isAtom()) - return n; - - // Hacks to stop it blowing out.. - { - if (visited[n]++ > 10) - return n; - - if (context.size() > 20) - return n; - } - - ASTVec new_children; - - if (n.GetKind() == ITE) - { - ASTNodeSet lhsContext(context), rhsContext(context); - addToContext(n[0],lhsContext); - addToContext(nf->CreateNode(NOT,n[0]),rhsContext); - new_children.push_back(visit(n[0], visited,visited_empty, context)); - new_children.push_back(visit(n[1], visited,visited_empty, lhsContext)); - new_children.push_back(visit(n[2], visited,visited_empty, rhsContext)); - } - else - { - for (int i = 0; i < n.GetChildren().size(); i++) - new_children.push_back(visit(n[i], visited, visited_empty, context)); - } - - ASTNode result; - if (new_children != n.GetChildren()) - if (n.GetType() == BOOLEAN_TYPE) - result = nf->CreateNode(n.GetKind(), new_children); - else - result = nf->CreateArrayTerm(n.GetKind(), n.GetIndexWidth(), n.GetValueWidth(), new_children); - else - result = n; - - return result; - } - - public: - - ASTNode - topLevel(const ASTNode& n) - { - runtimes->start(RunTimes::UseITEContext); - map visited; - ASTNodeSet context; - ASTNodeSet empty; - ASTNode result= visit(n,visited,empty,context); - runtimes->stop(RunTimes::UseITEContext); - return result; - } - - UseITEContext(STPMgr *bm) - { - runtimes = bm->GetRunTimes(); - nf = bm->defaultNodeFactory; - ASTTrue = bm->ASTTrue; - ASTFalse = bm->ASTFalse; - } - - - }; -} -; - -#endif diff --git a/src/vendor/stp/src/simplifier/VariablesInExpression.cpp b/src/vendor/stp/src/simplifier/VariablesInExpression.cpp deleted file mode 100644 index ffabcf8de..000000000 --- a/src/vendor/stp/src/simplifier/VariablesInExpression.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * VariablesInExpression.cpp - */ - -#include "VariablesInExpression.h" - -namespace BEEV { - -VariablesInExpression::VariablesInExpression() { - // TODO Auto-generated constructor stub - -} - -VariablesInExpression::~VariablesInExpression() { - ClearAllTables(); -} - -void VariablesInExpression::insert(const ASTNode& n, Symbols *s) -{ - assert (s!= NULL); - symbol_graph.insert(make_pair(n.GetNodeNum(), s)); -} - -// This builds a reduced version of a graph, where there -// is only a new node if the number of non-array SYMBOLS -// in the descendents changes. For example (EXTRACT 0 1 n) -// will have the same "Symbols" node as n, because -// no new symbols are introduced. -Symbols* VariablesInExpression::getSymbol(const ASTNode& n) { - if (symbol_graph.find(n.GetNodeNum()) != symbol_graph.end()) { - return symbol_graph[n.GetNodeNum()]; - } - - Symbols* node; - - // Note we skip array variables. We never solve for them so - // can ignore them. - if (n.GetKind() == SYMBOL && n.GetIndexWidth() == 0) { - node = new Symbols(n); - insert(n, node); - return node; - } - - vector children; - for (int i = 0; i < n.Degree(); i++) { - Symbols* v = getSymbol(n[i]); - if (!v->empty()) - children.push_back(v); - } - - if (children.size() == 1) { - // If there is only a single child with a symbol. Then jump to it. - node = children.back(); - } else - node = new Symbols(children); - - insert(n, node); - - return node; -} - -// Builds a set of the SYMBOLS that were found under the "term". The symbols are the union of "found" and -// all the sets : TermsAlreadySeen(av[0]) union ... TermsAlreadySeen(av[n])". -void VariablesInExpression::VarSeenInTerm(Symbols* term, SymbolPtrSet& visited, - ASTNodeSet& found, vector& av) { - if (visited.find(term) != visited.end()) { - return; - } - - if (term->isLeaf()) { - found.insert(term->found); - return; - } - - visited.insert(term); - - SymbolPtrToNode::const_iterator it; - if ((it = TermsAlreadySeenMap.find(term)) != TermsAlreadySeenMap.end()) { - // We've previously built the set of variables below this "symbols". - // It's not added into "found" because its sometimes 70k variables - // big, and if there are no other symbols discovered it's a terrible - // waste to create a copy of the set. Instead we store (in effect) - // a pointer to the set. - av.push_back(term); - return; - } - - for (vector::const_iterator it = term->children.begin(), itend = - term->children.end(); it != itend; it++) { - VarSeenInTerm(*it, visited, found, av); - } - - return; -}//End of VarSeenInTerm - -ASTNodeSet * VariablesInExpression::SetofVarsSeenInTerm(Symbols* symbol, bool& destruct) -{ - assert(symbol != NULL); - - SymbolPtrToNode::iterator it = TermsAlreadySeenMap.find(symbol); - - if ( it != TermsAlreadySeenMap.end()) - { - destruct = false; - return it->second; - } - - SymbolPtrSet visited; - - ASTNodeSet *symbols = new ASTNodeSet(); - vector av; - VarSeenInTerm(symbol,visited,*symbols,av); - - for (int i =0; i < av.size();i++) - { - const ASTNodeSet& sym = *TermsAlreadySeenMap.find(av[i])->second; - symbols->insert(sym.begin(), sym.end()); - } - - destruct = true; - //TermsAlreadySeenMap.insert(make_pair(symbol,symbols)); - - return symbols; -} - -ASTNodeSet * VariablesInExpression::SetofVarsSeenInTerm(const ASTNode& term, bool& destruct) -{ - getSymbol(term); - return SetofVarsSeenInTerm(symbol_graph[term.GetNodeNum()], destruct); -} - -bool VariablesInExpression::VarSeenInTerm(const ASTNode& var, - const ASTNode& term) { - // This only returns true if we are searching for variables that aren't arrays. - assert(var.GetKind() == SYMBOL && var.GetIndexWidth() == 0); - if (term.isConstant()) - return false; - - getSymbol(term); - - SymbolPtrSet visited; - ASTNodeSet *symbols = new ASTNodeSet(); - vector av; - VarSeenInTerm(symbol_graph[term.GetNodeNum()], visited, *symbols, av); - - bool result = (symbols->count(var) != 0); - - //cerr << "visited:" << visited.size() << endl; - //cerr << "av:" << av.size() << endl; - //cerr << "Term is const" << term.isConstant() << endl; - - - if (visited.size() > 250) // No use caching it, unless we've done some work. - { - sort(av.begin(), av.end()); - - //cout << "===" << endl; - for (int i = 0; i < av.size(); i++) { - if (i!=0 && av[i] == av[i-1]) - continue; - - const ASTNodeSet& sym = *TermsAlreadySeenMap.find(av[i])->second; - //cout << "set: " << i << " " << sym.size() << endl; - symbols->insert(sym.begin(), sym.end()); - } - TermsAlreadySeenMap.insert(make_pair(symbol_graph[term.GetNodeNum()], symbols)); - //cout << "finish" << symbols->size() << endl; - //cout << "===" << endl; - result = (symbols->count(var) != 0); - } else { - const int size = av.size(); - for (int i = 0; i < size; i++) { - if (result) - break; - const ASTNodeSet& sym = *TermsAlreadySeenMap.find(av[i])->second; - result |= (sym.find(var) != sym.end()); - } - delete symbols; - } - return result; -} - -}; diff --git a/src/vendor/stp/src/simplifier/VariablesInExpression.h b/src/vendor/stp/src/simplifier/VariablesInExpression.h deleted file mode 100644 index 3373c5afe..000000000 --- a/src/vendor/stp/src/simplifier/VariablesInExpression.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * VariablesInExpression.h - * - */ - -#ifndef VARIABLESINEXPRESSION_H_ -#define VARIABLESINEXPRESSION_H_ - -#include "../AST/AST.h" -#include "Symbols.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - -class VariablesInExpression : boost::noncopyable -{ -private: - - void insert(const ASTNode& n, Symbols *s); - - typedef HASHMAP< - int, - Symbols* - > ASTNodeToNodes; - ASTNodeToNodes symbol_graph; - - -public: - VariablesInExpression(); - virtual ~VariablesInExpression(); - - - // When solving, we're interested in whether variables appear multiple times. - typedef HASHSET SymbolPtrSet; - - - Symbols* getSymbol(const ASTNode& n); - - //this map is useful while traversing terms and uniquely - //identifying variables in the those terms. Prevents double - //counting. - - typedef HASHMAP< - Symbols*, - ASTNodeSet*, - SymbolPtrHasher - > SymbolPtrToNode; - SymbolPtrToNode TermsAlreadySeenMap; - - //this function return true if the var occurs in term, else the - //function returns false - bool VarSeenInTerm(const ASTNode& var, const ASTNode& term); - ASTNodeSet * SetofVarsSeenInTerm(const ASTNode& term, bool& destruct); - ASTNodeSet * SetofVarsSeenInTerm(Symbols* symbol, bool& destruct); - void VarSeenInTerm(Symbols* term, SymbolPtrSet& visited, ASTNodeSet& found, vector& av); - - void ClearAllTables() - { - set deleted; - for (ASTNodeToNodes::iterator it = symbol_graph.begin(); it - != symbol_graph.end(); it++) { - if (deleted.find(it->second) == deleted.end()) { - deleted.insert(it->second); - delete it->second; - } - } - - for (SymbolPtrToNode::iterator it = TermsAlreadySeenMap.begin(); it - != TermsAlreadySeenMap.end(); it++) - delete (it->second); - - symbol_graph.clear(); - TermsAlreadySeenMap.clear(); - } -}; -}; - - - -#endif /* VARIABLESINEXPRESSION_H_ */ diff --git a/src/vendor/stp/src/simplifier/bvsolver.cpp b/src/vendor/stp/src/simplifier/bvsolver.cpp deleted file mode 100644 index 37c037d86..000000000 --- a/src/vendor/stp/src/simplifier/bvsolver.cpp +++ /dev/null @@ -1,886 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "bvsolver.h" - -//This file contains the implementation of member functions of -//bvsolver class, which represents the bitvector arithmetic linear -//solver. Please also refer the STP's CAV 2007 paper for the -//complete description of the linear solver algorithm -// -//The bitvector solver is a partial solver, i.e. it does not solve -//for all variables in the system of equations. it is -//best-effort. it relies on the SAT solver to be complete. -// -//The BVSolver assumes that the input equations are normalized, and -//have liketerms combined etc. It won't fail if the input isn't -// normalised. It just won't be able to simplify things, for example -// it cant simplify (3*3)*x = y. -// -//0. Traverse top-down over the input DAG, looking for a conjunction -//0. of equations. if you find one, then for each equation in the -//0. conjunction, do the following steps. -// -//1. check for Linearity of the input equation -// -//2. Solve for a "chosen" variable. The variable should occur -//2. exactly once and must have an odd coeff. Refer STP's CAV 2007 -//2. paper for actual solving procedure -// -//4. Outside the solver, Substitute and Re-normalize the input DAG -namespace BEEV -{ - const bool flatten_ands = true; - const bool sort_extracts_last = false; - const bool debug_bvsolver = false; - - // The simplify functions can increase the size of the DAG, - // so we have the option to disable simplifications. - ASTNode BVSolver::simplifyNode(const ASTNode n) - { - if (!simplify) - return n; - - if (n.GetType() == BOOLEAN_TYPE) - return _simp->SimplifyFormula(n,false,NULL); - else - return _simp->SimplifyTerm(n); - } - - - //check the solver map for 'key'. If key is present, then return the - //value by reference in the argument 'output' - bool BVSolver::CheckAlreadySolvedMap(const ASTNode& key, ASTNode& output) - { - ASTNodeMap::const_iterator it; - if ((it = FormulasAlreadySolvedMap.find(key)) - != FormulasAlreadySolvedMap.end()) - { - output = it->second; - return true; - } - return false; - } //CheckAlreadySolvedMap() - - void BVSolver::UpdateAlreadySolvedMap(const ASTNode& key, - const ASTNode& value) - { - assert(key.GetType() == BOOLEAN_TYPE); - FormulasAlreadySolvedMap[key] = value; - } //end of UpdateAlreadySolvedMap() - - //accepts an even number "in", and returns the location of - // the lowest bit that is turned on in that number. - void BVSolver::SplitEven_into_Oddnum_PowerOf2(const ASTNode& in, - unsigned int& number_shifts) { - assert (BVCONST == in.GetKind() && !_simp->BVConstIsOdd(in)); - - // location of the least significant bit turned on. - for (number_shifts = 0; number_shifts < in.GetValueWidth() - && !CONSTANTBV::BitVector_bit_test(in.GetBVConst(), number_shifts); number_shifts++) { - }; - assert(number_shifts >0); // shouldn't be odd. - } - - //chooses a variable in the lhs and returns the chosen variable - ASTNode BVSolver::ChooseMonom(const ASTNode& eq, ASTNode& modifiedlhs, ASTNodeSet& checked) - { - assert(EQ == eq.GetKind()); - assert(BVPLUS == eq[0].GetKind() || BVPLUS== eq[1].GetKind()); - - // Unfortunately, the bvsolver is written to expect nodes in the - // reverse order to how the simplifying node factory produces them. - // That is, the simplifying node factory sorts by arithless, i.e. - // with constants or symbols on the left. - const bool lhsIsPlus = (BVPLUS == eq[0].GetKind()); - const ASTNode& lhs = lhsIsPlus? eq[0] : eq[1]; - const ASTNode& rhs = lhsIsPlus? eq[1] : eq[0]; - - assert(BVPLUS == lhs.GetKind()); - - //collect all the vars in the lhs and rhs - vars.getSymbol(eq); - - //handle BVPLUS case - ASTVec c = FlattenKind(BVPLUS, lhs.GetChildren()); - ASTVec o; - ASTNode outmonom = ASTUndefined; - bool chosen_symbol = false; - - //choose variables with no coeffs - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - const ASTNode& monom = *it; - if ( - ( - SYMBOL == monom.GetKind() - && !chosen_symbol - && checked.find(monom)==checked.end() - && !vars.VarSeenInTerm(monom,rhs) - ) - || - ( - BVUMINUS == monom.GetKind() - && SYMBOL == monom[0].GetKind() - && !chosen_symbol - && checked.find(monom[0])==checked.end() - && !vars.VarSeenInTerm(monom[0],rhs) - ) - ) - { - // Look through all the children of the BVPLUS and check - // that the variable appears in none of them. - - ASTNode var = (SYMBOL == monom.GetKind())? monom: monom[0]; - bool duplicated = false; - for (ASTVec::const_iterator it2 = c.begin(); it2 != itend; it2++) - { - if (it2 == it) - continue; - if (vars.VarSeenInTerm(var,*it2)) - { - duplicated = true; - break; - } - } - if (!duplicated) - { - outmonom = monom; //nb. monom not var. - chosen_symbol = true; - checked.insert(var); - } - else - o.push_back(monom); - } - else - o.push_back(monom); - } - - //try to choose only odd coeffed variables first - if (!chosen_symbol) - { - ASTNode zero = _bm->CreateZeroConst(32); - - o.clear(); - for (ASTVec::const_iterator - it = c.begin(), itend = c.end(); it != itend; it++) - { - const ASTNode& monom = *it; - ASTNode var = - (BVMULT == monom.GetKind()) ? - monom[1] : - ASTUndefined; - - if (BVMULT == monom.GetKind() - && BVCONST == monom[0].GetKind() - && _simp->BVConstIsOdd(monom[0]) - && !chosen_symbol - && checked.find(var)==checked.end() - && ((SYMBOL == var.GetKind() - && !vars.VarSeenInTerm(var,rhs) - ) - || (BVEXTRACT == var.GetKind() - && SYMBOL == var[0].GetKind() - && BVCONST == var[1].GetKind() - && zero == var[2] - && !vars.VarSeenInTerm(var[0],rhs) - )) - ) - { - //monom[0] is odd. - outmonom = monom; - chosen_symbol = true; - checked.insert(var); - } - else if ( - !chosen_symbol - && monom.GetKind() == BVEXTRACT - && SYMBOL == monom[0].GetKind() - && BVCONST == monom[1].GetKind() - && zero == monom[2] - && checked.find(monom[0])==checked.end() - && !vars.VarSeenInTerm(monom[0],rhs) - ) - { - outmonom = monom; - chosen_symbol = true; - checked.insert(monom[0]); - } - else if ( - !chosen_symbol - && monom.GetKind() == BVUMINUS - && monom[0].GetKind() == BVEXTRACT - && SYMBOL == monom[0][0].GetKind() - && BVCONST == monom[0][1].GetKind() - && zero == monom[0][2] - && checked.find(monom[0][0])==checked.end() - && !vars.VarSeenInTerm(monom[0][0],rhs) - ) - { - outmonom = monom; - chosen_symbol = true; - checked.insert(monom[0][0]); - } - else - - { - o.push_back(monom); - } - } - } - - modifiedlhs = - (o.size() > 1) ? - _bm->CreateTerm(BVPLUS, lhs.GetValueWidth(), o) : - o[0]; - - if (debug_bvsolver) - { - cerr << "Initial:" << eq; - cerr << "Chosen Monomial:" << outmonom; - cerr << "Output LHS:" << modifiedlhs; - } - - // can be SYMBOL or (BVUMINUS SYMBOL) or (BVMULT ODD_BVCONST SYMBOL) or - // (BVMULT ODD_BVCONST (EXTRACT SYMBOL BV_CONST ZERO)) or - // BVUMINUS (EXTRACT SYMBOL BV_CONST ZERO) or - // (EXTRACT SYMBOL BV_CONST ZERO) - return outmonom; - } //end of choosemonom() - - // Manipulate the lhs and rhs to get just a variable on the lhs (if possible). Then add to the - // substitution map. - ASTNode BVSolver::substitute(const ASTNode& eq, const ASTNode& lhs, const ASTNode& rhs, const bool single) - { - - ASTNode output; - - switch (lhs.GetKind()) - { - case SYMBOL: - { - //input is of the form x = rhs first make sure that the lhs - //symbol does not occur on the rhs or that it has not been - //solved for - if (!single && vars.VarSeenInTerm(lhs, rhs)) - { - //found the lhs in the rhs. Abort! - return eq; - } - - if (!_simp->UpdateSolverMap(lhs, rhs)) - { - return eq; - } - - output = ASTTrue; - break; - } - - case BVEXTRACT: - { - const ASTNode zero = _bm->CreateZeroConst(32); - - if (!(SYMBOL == lhs[0].GetKind() - && BVCONST == lhs[1].GetKind() - && zero == lhs[2] - && !vars.VarSeenInTerm(lhs[0], rhs) - )) - { - return eq; - } - - if (vars.VarSeenInTerm(lhs[0], rhs)) - { - return eq; - } - - if (!_simp->UpdateSolverMap(lhs, rhs)) - { - return eq; - } - - if (lhs[0].GetValueWidth() != lhs.GetValueWidth()) - { - //if the extract of x[i:0] = t is entered into the solvermap, - //then also add another entry for x = x1@t - ASTNode var = lhs[0]; - ASTNode newvar = - _bm->CreateFreshVariable(0, var.GetValueWidth() - lhs.GetValueWidth(), "v_solver"); - newvar = - _bm->CreateTerm(BVCONCAT, var.GetValueWidth(), newvar, rhs); - assert(BVTypeCheck(newvar)); - _simp->UpdateSolverMap(var, newvar); - } - else - _simp->UpdateSolverMap(lhs[0], rhs); - output = ASTTrue; - break; - } - case BVMULT: - { - //the input is of the form a*x = t. If 'a' is odd, then compute - //its multiplicative inverse a^-1, multiply 't' with it, and - //update the solver map - if (BVCONST != lhs[0].GetKind()) - { - return eq; - } - - if (!(SYMBOL == lhs[1].GetKind() - || (BVEXTRACT == lhs[1].GetKind() - && SYMBOL == lhs[1][0].GetKind()))) - { - return eq; - } - - bool ChosenVar_Is_Extract = - (BVEXTRACT == lhs[1].GetKind()); - - //if coeff is even, then we know that all the coeffs in the eqn - //are even. Simply return the eqn - if (!_simp->BVConstIsOdd(lhs[0])) - { - return eq; - } - - ASTNode a = _simp->MultiplicativeInverse(lhs[0]); - ASTNode chosenvar = - ChosenVar_Is_Extract ? lhs[1][0] : lhs[1]; - ASTNode chosenvar_value = - simplifyNode(_bm->CreateTerm(BVMULT, - rhs.GetValueWidth(), - a, rhs)); - - //if chosenvar is seen in chosenvar_value then abort - if (vars.VarSeenInTerm(chosenvar, chosenvar_value)) - { - //abort solving - return eq; - } - - // It fails if it's a full-bitwidth extract. These are rare, and won't be - // present after simplification. So ignore them for now. - if (ChosenVar_Is_Extract && lhs[0].GetValueWidth() == lhs.GetValueWidth()) - return eq; - - //found a variable to solve - chosenvar = lhs[1]; - if (!_simp->UpdateSolverMap(chosenvar, chosenvar_value)) - { - return eq; - } - - if (ChosenVar_Is_Extract) - { - const ASTNode& var = lhs[1][0]; - - ASTNode newvar = - _bm->CreateFreshVariable(0, var.GetValueWidth() - lhs[1].GetValueWidth(), "v_solver"); - newvar = - _bm->CreateTerm(BVCONCAT, - var.GetValueWidth(), - newvar, chosenvar_value); - assert(BVTypeCheck(newvar)); - _simp->UpdateSolverMap(var, newvar); - - } - output = ASTTrue; - break; - } - default: - output = eq; - break; - } - return output; - } - - //solver function which solves for variables with odd coefficient - ASTNode BVSolver::BVSolve_Odd(const ASTNode& input) - { - ASTNode eq = input; - //cerr << "Input to BVSolve_Odd()" << eq << endl; - if (!(EQ == eq.GetKind())) - { - return input; - } - - ASTNode output = input; - - //get the lhs and the rhs, and case-split on the lhs kind - ASTNode lhs = eq[0]; - ASTNode rhs = eq[1]; - - - if ( - ((BVCONST == lhs.GetKind()) && (BVCONST != rhs.GetKind())) || // if only one side is a constant, it should be on the RHS. - ((SYMBOL == rhs.GetKind()) && (SYMBOL != lhs.GetKind())) // If there is only one variable. It should be on the left. - ) - { - lhs = eq[1]; - rhs = eq[0]; - eq = _bm->CreateNode(EQ, lhs, rhs); // If "return eq" is called, return the arguments in the correct order. - assert(BVTypeCheck(eq)); - } - - if (CheckAlreadySolvedMap(eq, output)) - { - return output; - } - - // ChooseMonom makes sure that the the LHS is not contained on the RHS, so we - // set this "single" to true in the branch that runs chooseMonomial. - bool single = false; - - if (BVPLUS == lhs.GetKind()) - { - - ASTNodeSet checked; - do - { - ASTNode chosen_monom = ASTUndefined; - ASTNode leftover_lhs; - - //choose monom makes sure that it gets only those vars that - //occur exactly once in lhs and rhs put together - chosen_monom = ChooseMonom(eq, leftover_lhs,checked); - if (chosen_monom == ASTUndefined) - { - //no monomial was chosen - return eq; - } - - //if control is here then it means that a monom was chosen - // - //construct: rhs - (lhs without the chosen monom) - unsigned int len = lhs.GetValueWidth(); - leftover_lhs = simplifyNode(_bm->CreateTerm(BVUMINUS,len, leftover_lhs)); - assert(BVTypeCheck(leftover_lhs)); - rhs = simplifyNode(_bm->CreateTerm(BVPLUS, len, rhs, leftover_lhs)); - assert(BVTypeCheck(rhs)); - lhs = chosen_monom; - single = true; - //This tries to substitute it.. But it might not work, in which case it will return eq. - output = substitute(eq, lhs, rhs,single); - } - while (output == eq); - - } //end of if(BVPLUS ...) - - else if (BVUMINUS == lhs.GetKind()) - { - //equation is of the form (-lhs0) = rhs - ASTNode lhs0 = lhs[0]; - rhs = simplifyNode(_bm->CreateTerm(BVUMINUS, rhs.GetValueWidth(), rhs)); - assert(BVTypeCheck(rhs)); - lhs = lhs0; - output = substitute(eq, lhs, rhs,single); - } - else - output = substitute(eq, lhs, rhs,single); - - UpdateAlreadySolvedMap(input, output); - return output; - } //end of BVSolve_Odd() - - - //The toplevel bvsolver(). Checks if the formula has already been - //solved. If not, the solver() is invoked. If yes, then simply drop - //the formula - ASTNode BVSolver::TopLevelBVSolve(const ASTNode& _input, const bool enable_simplify) - { - assert (_bm->UserFlags.wordlevel_solve_flag); - ASTNode input = _input; - simplify = enable_simplify; - - ASTNode output = input; - if (CheckAlreadySolvedMap(input, output)) - { - //output is TRUE. The formula is thus dropped - return output; - } - - Kind k = input.GetKind(); - - if (!(EQ == k || AND == k)) - { - return input; - } - - if (flatten_ands && AND == k) - { - ASTVec c = FlattenKind(AND,input.GetChildren()); - input = _bm->CreateNode(AND,c); - k = input.GetKind(); - - // When flattening simplifications will be applied to the node, potentially changing it's type: - // (AND x (ANY (not x) y)) gives us FALSE. - if (!(EQ == k || AND == k )) - return input; - - if (CheckAlreadySolvedMap(input, output)) - { - //output is TRUE. The formula is thus dropped - return output; - } - } - - _bm->GetRunTimes()->start(RunTimes::BVSolver); - ASTVec o; - ASTVec c; - if (EQ == k) - c.push_back(input); - else - c = input.GetChildren(); - - ASTVec eveneqns; - bool any_solved = false; - for (ASTVec::iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - /* - Calling applySubstitutionMapUntilArrays makes the required substitutions. For instance, if - first was : v = x, - then if the next formula is: x = v - calling applySubstitutionMapUntilArrays on the second formula will convert it into "true", avoiding a cycle. - - The problem with this is that applySubstitutionMapUntilArrays() doesn't normally simplify into array - operations. So given something like : - a = b - b = write(A,a,a) - - It will replace (a=b) with true, and store (a=b) in the solverMap. Then it will - store b = write(A,a,a) in the solver map. Which is wrong. What it should do is - rewrite a=b through the second expression, giving: - b = write(A,b,b), - which shouldn't be simplified. - */ - - ASTNode aaa = (any_solved && EQ == it->GetKind()) ? simplifyNode - (_simp->applySubstitutionMapUntilArrays(*it)) : *it; - - if (ASTFalse == aaa) - { - _bm->GetRunTimes()->stop(RunTimes::BVSolver); - return ASTFalse; // shortcut. It's unsatisfiable. - } - aaa = BVSolve_Odd(aaa); - - bool even = false; - aaa = CheckEvenEqn(aaa, even); - if (even) - { - eveneqns.push_back(aaa); - } - else - { - if (ASTTrue != aaa) - { - o.push_back(aaa); - } - } - if (ASTTrue == aaa) - { - any_solved=true; - } - } - - ASTNode evens; - if (eveneqns.size() > 0) - { - //if there is a system of even equations then solve them - evens = - (eveneqns.size() > 1) ? - _bm->CreateNode(AND, eveneqns) : - eveneqns[0]; - //evens = _simp->SimplifyFormula(evens,false); - evens = BVSolve_Even(evens); - _bm->ASTNodeStats("Printing after evensolver:", evens); - } - else - { - evens = ASTTrue; - } - output = - (o.size() > 0) ? - ((o.size() > 1) ? - nf->CreateNode(AND, o) : - o[0]) : - ASTTrue; - if (evens != ASTTrue) - output = nf->CreateNode(AND, output, evens); - - //if (_bm->UserFlags.isSet("xor-solve","1")) - // output = solveForAndOfXOR(output); - - // Imagine in the last conjunct A is replaced by B. But there could - // be variable A's in the first conjunct. This gets rid of 'em. - if (_simp->hasUnappliedSubstitutions()) - { - output = _simp->applySubstitutionMap(output); - _simp->haveAppliedSubstitutionMap(); - } - - UpdateAlreadySolvedMap(_input, output); - _bm->GetRunTimes()->stop(RunTimes::BVSolver); - return output; - } //end of TopLevelBVSolve() - - ASTNode BVSolver::CheckEvenEqn(const ASTNode& input, bool& evenflag) - { - ASTNode eq = input; - //cerr << "Input to BVSolve_Odd()" << eq << endl; - if (!(EQ == eq.GetKind())) - { - evenflag = false; - return eq; - } - - const ASTNode zero = _bm->CreateZeroConst(eq[0].GetValueWidth()); - - //lhs must be a BVPLUS, and rhs must be a BVCONST - const bool lhsIsPlus = (BVPLUS == eq[0].GetKind()); - ASTNode lhs = lhsIsPlus? eq[0] : eq[1]; - ASTNode rhs = lhsIsPlus? eq[1] : eq[0]; - - if (!(BVPLUS == lhs.GetKind() && zero == rhs)) - { - evenflag = false; - return eq; - } - - const ASTVec& lhs_c = lhs.GetChildren(); - ASTNode savetheconst = rhs; - for (ASTVec::const_iterator - it = lhs_c.begin(), itend = lhs_c.end(); it != itend; it++) - { - const ASTNode aaa = *it; - const Kind itk = aaa.GetKind(); - - if (BVCONST == itk) - { - assert(savetheconst == rhs); // Returns the wrong result if there are >1 constants. - - //check later if the constant is even or not - savetheconst = aaa; - continue; - } - - if (!(BVMULT == itk - && BVCONST == aaa[0].GetKind() - && SYMBOL == aaa[1].GetKind() - && !_simp->BVConstIsOdd(aaa[0]))) - { - //If the monomials of the lhs are NOT of the form 'a*x' where - //'a' is even, then return the false - evenflag = false; - return eq; - } - }//end of for loop - - //if control is here then it means that all coeffs are even. the - //only remaining thing is to check if the constant is even or not - if (_simp->BVConstIsOdd(savetheconst)) - { - //the constant turned out to be odd. we have UNSAT eqn - evenflag = false; - return ASTFalse; - } - - //all is clear. the eqn in even, through and through - evenflag = true; - return eq; - } //end of CheckEvenEqn - - //solve an eqn whose monomials have only even coefficients - ASTNode BVSolver::BVSolve_Even(const ASTNode& input) - { - - if (!(EQ == input.GetKind() || AND == input.GetKind())) - { - return input; - } - - ASTNode output; - if (CheckAlreadySolvedMap(input, output)) - { - return output; - } - - ASTVec input_c; - if (EQ == input.GetKind()) - { - input_c.push_back(input); - } - else - { - input_c = input.GetChildren(); - } - - //power_of_2 holds the exponent of 2 in the coeff - unsigned int power_of_2 = 0; - //we need this additional variable to find the lowest power of 2 - unsigned int power_of_2_lowest = ~0; - //the monom which has the least power of 2 in the coeff - //ASTNode monom_with_best_coeff; - for (ASTVec::iterator - jt = input_c.begin(), jtend = input_c.end(); - jt != jtend; jt++) - { - ASTNode eq = *jt; - assert(EQ == eq.GetKind()); - - const bool lhsIsPlus = (BVPLUS == eq[0].GetKind()); - ASTNode lhs = lhsIsPlus? eq[0] : eq[1]; - ASTNode rhs = lhsIsPlus? eq[1] : eq[0]; - - - ASTNode zero = _bm->CreateZeroConst(rhs.GetValueWidth()); - //lhs must be a BVPLUS, and rhs must be a BVCONST - if (!(BVPLUS == lhs.GetKind() && zero == rhs)) - { - return input; - } - - const ASTVec& lhs_c = lhs.GetChildren(); - for (ASTVec::const_iterator - it = lhs_c.begin(), itend = lhs_c.end(); - it != itend; it++) - { - const ASTNode aaa = *it; - const Kind itk = aaa.GetKind(); - if (!(BVCONST == itk - && !_simp->BVConstIsOdd(aaa)) - && !(BVMULT == itk - && BVCONST == aaa[0].GetKind() - && SYMBOL == aaa[1].GetKind() - && !_simp->BVConstIsOdd(aaa[0]))) - { - //If the monomials of the lhs are NOT of the form 'a*x' or 'a' - //where 'a' is even, then return the eqn - return input; - } - - //we are gauranteed that if control is here then the monomial is - //of the form 'a*x' or 'a', where 'a' is even - ASTNode coeff = (BVCONST == itk) ? aaa : aaa[0]; - SplitEven_into_Oddnum_PowerOf2(coeff, power_of_2); - if (power_of_2 < power_of_2_lowest) - { - power_of_2_lowest = power_of_2; - //monom_with_best_coeff = aaa; - } - power_of_2 = 0; - }//end of inner for loop - } //end of outer for loop - - //get the exponent - power_of_2 = power_of_2_lowest; - assert(power_of_2 > 0); - - //if control is here, we are gauranteed that we have chosen a - //monomial with fewest powers of 2 - ASTVec formula_out; - for (ASTVec::iterator - jt = input_c.begin(), jtend = input_c.end(); jt != jtend; jt++) - { - ASTNode eq = *jt; - - // Want the plus on the lhs. - const bool lhsIsPlus = (BVPLUS == eq[0].GetKind()); - ASTNode lhs = lhsIsPlus? eq[0] : eq[1]; - ASTNode rhs = lhsIsPlus? eq[1] : eq[0]; - - ASTNode zero = _bm->CreateZeroConst(rhs.GetValueWidth()); - //lhs must be a BVPLUS, and rhs must be a BVCONST - if (!(BVPLUS == lhs.GetKind() && zero == rhs)) - { - return input; - } - - unsigned len = lhs.GetValueWidth(); - ASTNode hi = _bm->CreateBVConst(32, len - 1); - ASTNode low = _bm->CreateBVConst(32, len - power_of_2); - ASTNode low_minus_one = _bm->CreateBVConst(32, len - power_of_2 - 1); - ASTNode low_zero = _bm->CreateZeroConst(32); - unsigned newlen = len - power_of_2; - ASTNode two_const = _bm->CreateTwoConst(len); - - unsigned count = power_of_2; - ASTNode two = two_const; - while (--count) - { - two = - _simp->BVConstEvaluator(_bm->CreateTerm(BVMULT, - len, - two_const, - two)); - } - const ASTVec& lhs_c = lhs.GetChildren(); - ASTVec lhs_out; - for (ASTVec::const_iterator - it = lhs_c.begin(), itend = lhs_c.end(); - it != itend; it++) - { - ASTNode aaa = *it; - const Kind itk = aaa.GetKind(); - if (BVCONST == itk) - { - aaa = - _simp->BVConstEvaluator(_bm->CreateTerm(BVDIV, - len, - aaa, two)); - aaa = - _simp->BVConstEvaluator(_bm->CreateTerm(BVEXTRACT, - newlen, - aaa, - low_minus_one, - low_zero)); - } - else - { - //it must be of the form a*x - ASTNode coeff = - _simp->BVConstEvaluator(_bm->CreateTerm(BVDIV, - len, - aaa[0], two)); - coeff = - _simp->BVConstEvaluator(_bm->CreateTerm(BVEXTRACT, - newlen, - coeff, - low_minus_one, - low_zero)); - ASTNode lower_x = - simplifyNode(_bm->CreateTerm(BVEXTRACT, - newlen, - aaa[1], - low_minus_one, - low_zero)); - aaa = _bm->CreateTerm(BVMULT, newlen, coeff, lower_x); - } - lhs_out.push_back(aaa); - }//end of inner forloop() - rhs = _bm->CreateZeroConst(newlen); - lhs = _bm->CreateTerm(BVPLUS, newlen, lhs_out); - formula_out.push_back(_simp->CreateSimplifiedEQ(lhs, rhs)); - } //end of outer forloop() - - output = - (formula_out.size() > 0) ? - (formula_out.size() > 1) ? - _bm->CreateNode(AND, formula_out) : - formula_out[0] : - ASTTrue; - - UpdateAlreadySolvedMap(input, output); - return output; - } //end of BVSolve_Even() -};//end of namespace BEEV diff --git a/src/vendor/stp/src/simplifier/bvsolver.h b/src/vendor/stp/src/simplifier/bvsolver.h deleted file mode 100644 index 5dcb4dec4..000000000 --- a/src/vendor/stp/src/simplifier/bvsolver.h +++ /dev/null @@ -1,141 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- - -#ifndef BVSOLVER_H -#define BVSOLVER_H - -#include "simplifier.h" -#include "Symbols.h" -#include "VariablesInExpression.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - - /****************************************************************** - * This class represents the bitvector arithmetic linear solver. - * - * The bitvector solver is a partial solver, i.e. it doesn't solve - * for all variables in the system of equations. it is - * best-effort. it relies on the SAT solver to be complete. - * - * The BVSolver assumes that the input equations are normalized, & - * have liketerms combined etc. - * - * 0. Traverse top-down over the input DAG, looking for a - * 0. conjunction of equations. if you find one, then for each - * 0. equation in the conjunction, do the following steps. - * - * 1. check for Linearity of the input equation - * - * 2. Solve for a "chosen" variable. The variable should occur - * 2. exactly once and must have an odd coeff. Refer CAV 2007 - * 2. paper on STP for actual solving procedure - * - * 4. Outside the solver, Substitute and Re-normalize the input DAG - ******************************************************************/ - - class BVSolver : boost::noncopyable - { - private: - // Ptr to toplevel manager that manages bit-vector expressions - // (i.e. construct various kinds of expressions), and also has - // member functions that simplify bit-vector expressions - STPMgr * _bm; - - // Ptr to Simplifier - Simplifier * _simp; - - // - ASTNode ASTTrue, ASTFalse, ASTUndefined; - - //choose a suitable var from the term - ASTNode ChooseMonom(const ASTNode& eq, ASTNode& modifiedterm, ASTNodeSet& checked); - //accepts an equation and solves for a variable or a monom in it - ASTNode BVSolve_Odd(const ASTNode& eq); - - //solves equations of the form a*x=t where 'a' is even. Has a - //return value, unlike the normal BVSolve() - ASTNode BVSolve_Even(const ASTNode& eq); - ASTNode CheckEvenEqn(const ASTNode& input, bool& evenflag); - - ASTNode substitute(const ASTNode& eq, const ASTNode& lhs, const ASTNode& rhs, const bool single); - - //takes an even number "in" as input, and returns an odd number - //(return value) and a power of 2 (as number_shifts by reference), - //such that in = (odd_number * power_of_2). - // - //Refer STP's CAV 2007 (or Clark Barrett's 1998 paper on - //bit-vector arithmetic published in DAC 1998) paper for precise - //understanding of the algorithm - void SplitEven_into_Oddnum_PowerOf2(const ASTNode& in, - unsigned int& number_shifts); - - - //Those formulas which have already been solved. If the same - //formula occurs twice then do not solve the second occurence, and - //instead drop it - ASTNodeMap FormulasAlreadySolvedMap; - - //Once a formula has been solved, then update the alreadysolvedmap - //with the formula, and the solved value. The solved value can be - //described using the following example: Suppose input to the - //solver is - // - // input key: x = 2 AND y = x + t - // - // output value: y = 2 + t - void UpdateAlreadySolvedMap(const ASTNode& key, const ASTNode& value); - - //This function checks if the key (formula) has already been - //solved for. - // - //If yes it returns TRUE and fills the "output" with the - //solved-value (call by reference argument), - // - //else returns FALSE - bool CheckAlreadySolvedMap(const ASTNode& key, ASTNode& output); - - VariablesInExpression& vars; - - bool simplify; //Whether to apply the simplifyTerm & simplifyFormula functions. - - ASTNode simplifyNode(const ASTNode n); - - NodeFactory* nf; - - public: - //constructor - BVSolver(STPMgr * bm, Simplifier * simp) : _bm(bm), _simp(simp), vars(simp->getVariablesInExpression()) - { - ASTTrue = _bm->CreateNode(TRUE); - ASTFalse = _bm->CreateNode(FALSE); - ASTUndefined = _bm->CreateNode(UNDEFINED); - simplify=true; - nf = bm->defaultNodeFactory; - }; - - //Destructor - ~BVSolver() - { - ClearAllTables(); - } - - //Top Level Solver: Goes over the input DAG, identifies the - //equation to be solved, solves them, - ASTNode TopLevelBVSolve(const ASTNode& a, const bool enable_simplify=true); - - void ClearAllTables(void) - { - FormulasAlreadySolvedMap.clear(); - } //End of ClearAllTables() - - }; //end of class bvsolver -};//end of namespace BEEV -#endif diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Arithmetic.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Arithmetic.cpp deleted file mode 100644 index ba926ee2e..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Arithmetic.cpp +++ /dev/null @@ -1,494 +0,0 @@ -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_Utility.h" - -// Add, subtract. -// Trevor Hansen. BSD License. - -namespace simplifier -{ -namespace constantBitP -{ - -// Subtract is implemented in terms of plus. -Result bvSubtractBothWays(vector& children, FixedBits& output) -{ - assert(children.size() ==2); - - FixedBits & a = *children[0]; - FixedBits & b = *children[1]; - - assert(a.getWidth() == b.getWidth()); - - const int bitWidth = a.getWidth(); - - FixedBits one(bitWidth, false); - one.fixToZero(); - one.setFixed(0, true); - one.setValue(0, true); - - FixedBits notB(bitWidth, false); - - vector Addargs; - Addargs.push_back(&a); - Addargs.push_back(¬B); - Addargs.push_back(&one); - - bool changed = false; - while (true) // until it fixed points - { - Result result; - FixedBits initialNotB(notB); - FixedBits initialA(a); - FixedBits initialOut(output); - - result = bvNotBothWays(b, notB); - if (CONFLICT == result) - return CONFLICT; - - result = bvAddBothWays(Addargs, output); - if (CONFLICT == result) - return CONFLICT; - - if (FixedBits::equals(initialNotB, notB) && FixedBits::equals(initialA, a) && FixedBits::equals(initialOut, output)) - break; - else - changed = true; - } - - return NOT_IMPLEMENTED; -} - -/////////////// ADDITION> - -const bool add_debug_messages = false; - -// For a given number of children. The maximum size of the carry in for addition. -// -// For five arguments (say). The carry can be as big as 4. But into the second column -// it can be no bigger than 2. -unsigned maximumCarryInForAddition(int numberOfChildren, int index) -{ - assert(numberOfChildren > 1); - assert(index >=0); - - if (0 == index) - return 0; - - - if (numberOfChildren==2) - return 1; // Case that the (index==0) is already handled. - - - unsigned result = 0; - unsigned currIndex = 0; - - while (currIndex < (unsigned)index) - { - result = (result + numberOfChildren) >> 1; - currIndex++; - } - - //cerr << "max carry" << numberOfChildren << " " << index << " " << result << endl; - return result; -} - -// Given the current fixings to a particular column, as well as the range of the columns inflow, -// deduce values. -// index: Column we are working on. -// sum: What the column must sum to. -// inflowMin: Minimum inflow expected, i.e. lowerbound of lower (index-1). - -Result fixIfCanForAddition(vector& children, const int index, const int sum, const int inflowMin, const int inflowMax) -{ - Result result = NO_CHANGE; - - assert(inflowMin <= inflowMax); - assert(inflowMin >=0); - assert(index >=0); - assert(index < children[0]->getWidth()); - - const int maxCarryIn = maximumCarryInForAddition(children.size(), index); - - assert(inflowMax <= maxCarryIn); - assert(sum <= (signed)children.size() + maxCarryIn ); - - if (add_debug_messages) - cerr << "fixIfCanForAddition " << index << " " << sum << endl; - - int unfixed = 0; - int ones = 0; - int zeroes = 0; - for (unsigned i = 0; i < children.size(); i++) - { - if (children[i]->isFixed(index)) - { - if (children[i]->getValue(index)) - ones++; - if (!children[i]->getValue(index)) - zeroes++; - } - else - { - unfixed++; - } - } - - assert(ones >=0 && unfixed >=0 && zeroes >=0); - assert(ones + unfixed + zeroes == (signed)children.size()); - - ones = ones + inflowMin; - - if ((ones == sum) && unfixed > 0) // set em all to false. Already have as many as we need. - { - for (unsigned i = 0; i < children.size(); i++) - { - if (!children[i]->isFixed(index)) - { - children[i]->setFixed(index, true); - children[i]->setValue(index, false); - result = CHANGED; - } - } - } - - int sumUnfixed = unfixed + inflowMax - inflowMin; - zeroes = zeroes + (maxCarryIn - inflowMax); - - assert(ones >=0 && sumUnfixed >=0 && zeroes >=0); - assert(ones+sumUnfixed+zeroes == (signed) children.size()+ maxCarryIn); - - if (sum == (sumUnfixed + ones) && unfixed > 0) // need 'em all fixed to ones. - { - for (unsigned i = 0; i < children.size(); i++) - { - if (!children[i]->isFixed(index)) - { - children[i]->setFixed(index, true); - children[i]->setValue(index, true); - result = CHANGED; - } - } - } - else if (sum > sumUnfixed + ones) - return CONFLICT; - - if (sum < ones) - return CONFLICT; - - return result; -} - -// Count the number of fixed ones, and zeroes. Update the low and high column counts. -// Counts should only be monitonically changed. So this can only be run once. -void initialiseColumnCounts(int columnL[], int columnH[], const int bitWidth, const int numberOfChildren, const vector& children) -{ - // setup the low and highs. - for (int i = 0; i < bitWidth; i++) - { - columnL[i] = 0; - columnH[i] = numberOfChildren; - } - - // Set the column totals. - for (int i = 0; i < bitWidth; i++) - { - for (int j = 0; j < numberOfChildren; j++) - { - if (children[j]->isFixed(i)) - { - if (children[j]->getValue(i)) - columnL[i]++; - else - columnH[i]--; - } - } - } -} - -void printArray(int f[], int width) -{ - for (int i = width - 1; i >= 0; i--) - std::cerr << f[i] << " "; - std::cerr << std::endl; -} - -void setValue(FixedBits& a, const int i, bool v) -{ - if (a.isFixed(i)) - return; - - a.setFixed(i,true); - a.setValue(i,v); -} - -// Specialisation for two operands. - Result - bvAddBothWays(FixedBits& x, FixedBits& y, FixedBits& output) - { - const int bitWidth = output.getWidth(); - FixedBits carry(bitWidth + 1, false); - carry.setFixed(0, true); - carry.setValue(0, false); - - //cerr << "input" << x << y << output << endl; - - for (int i = 0; i < bitWidth; i++) - { - //cerr << i << ":"<< x[i] << y[i] << carry[i] << "=" << output[i]<< endl; - - int lb = (x[i] == '1' ? 1 : 0) + (y[i] == '1' ? 1 : 0) + (carry[i] == '1' ? 1 : 0); - int ub = (x[i] == '0' ? 0 : 1) + (y[i] == '0' ? 0 : 1) + (carry[i] == '0' ? 0 : 1); - - const int lb_initial = lb; - const int ub_initial = ub; - - if (carry[i+1] == '1') // carry out is true. - lb = std::max(2, lb); - - if (carry[i+1] == '0') // carry out is false. - ub = std::min(1, ub); - - const char output_i = output[i]; - if (output_i == '1' && (lb % 2 == 0)) - lb++; - - if (output_i == '0' && (lb % 2 == 1)) - lb++; - - if (output_i == '1' && (ub % 2 == 0)) - ub--; - - if (output_i == '0' && (ub % 2 == 1)) - ub--; - - if (lb >= 2) - setValue(carry, i+1, true); - - if (ub <= 1) - setValue(carry, i+1, false); - - if (ub < lb) - return CONFLICT; - - if (lb == ub) - { - setValue(output, i, ((lb % 2) == 1)); - - if (lb_initial ==lb) - { - if (!x.isFixed(i)) - setValue(x, i, false); - if (!y.isFixed(i)) - setValue(y, i, false); - if (!carry.isFixed(i)) - { - setValue(carry, i, false); - i = std::max(i-2,-1); // go back to the prior column. - continue; - } - } - - if (ub_initial ==lb) - { - if (!x.isFixed(i)) - setValue(x, i, true); - if (!y.isFixed(i)) - setValue(y, i, true); - if (!carry.isFixed(i)) - { - setValue(carry, i, true); - i = std::max(i-2,-1); // go back to the prior column. - continue; - } - - } - } - //cerr << i << "[" << ub << ":" << lb << "]" << endl; - } - - return NOT_IMPLEMENTED; - } - -Result bvAddBothWays(vector& children, FixedBits& output) -{ - const int numberOfChildren = children.size(); - if (numberOfChildren==2) - { - return bvAddBothWays(*children[0],*children[1],output); - } - - Result result = NO_CHANGE; - - const int bitWidth = output.getWidth(); - - - for (int i = 0; i < numberOfChildren; i++) - { - assert(children[i]->getWidth() == bitWidth ); - } - - int columnL[bitWidth]; // minimum "" "" - int columnH[bitWidth]; // maximum number of true partial products. - - initialiseColumnCounts(columnL, columnH, bitWidth, numberOfChildren, children); - - int sumH[bitWidth]; - int sumL[bitWidth]; - sumL[0] = columnL[0]; - sumH[0] = columnH[0]; - - for (unsigned i = /**/1 /**/; i < (unsigned) bitWidth; i++) - { - assert((columnH[i] >= columnL[i]) && (columnL[i] >= 0)); - sumH[i] = columnH[i] + (sumH[i - 1] / 2); - sumL[i] = columnL[i] + (sumL[i - 1] / 2); - } - - // Now the sums counts are all updated. And consistent with each other. - - bool changed = true; - while (changed) - { - changed = false; - - // Make sure each column's sum is consistent with the output. - for (int i = 0; i < bitWidth; i++) - { - if (output.isFixed(i)) - { - int expected = output.getValue(i) ? 1 : 0; - - // output is true. So the maximum and minimum can only be even. - if (sumH[i] % 2 != expected) - { - sumH[i]--; - changed = true; - } - if (sumL[i] % 2 != expected) - { - sumL[i]++; - changed = true; - } - - if (changed && ((sumH[i] < sumL[i]) || (sumL[i] < 0))) - return CONFLICT; - } - } - - // update the column counts to make them consistent to the totals. - for (int i = /**/0 /**/; i < bitWidth; i++) - { - if (sumH[i] < columnH[i]) - { - columnH[i]--; - changed = true; - - if (columnH[i] < columnL[i]) - return CONFLICT; - } - } - - // Go from low to high making each of the sums consistent. - for (int i = /**/1 /**/; i < bitWidth; i++) - { - assert((columnH[i] >= columnL[i]) && (columnL[i] >= 0)); - if (sumH[i] > columnH[i] + (sumH[i - 1] / 2)) - { - sumH[i] = columnH[i] + (sumH[i - 1] / 2); - changed = true; - } - if (sumL[i] < columnL[i] + (sumL[i - 1] / 2)) - { - sumL[i] = columnL[i] + (sumL[i - 1] / 2); - changed = true; - } - - if (changed && (sumH[i] < sumL[i] || sumL[i] < 0)) - return CONFLICT; - - } - - // go from high to low, making each of the sums consistent. - for (int i = /**/bitWidth - 1 /**/; i >= 1; i--) - { - if ((sumH[i] == sumL[i])) - { - stats s = getStats(children, i); - - if (0 == s.unfixed) - { - // amount that the prior column needs to contribute. - int toContribute = (sumH[i] - s.fixedToOne) * 2; - - if (sumH[i - 1] > (toContribute + 1)) - { - changed = true; - sumH[i - 1] = toContribute + 1; // plus one because of rounding down. - } - - if (sumL[i - 1] < toContribute) - { - changed = true; - sumL[i - 1] = toContribute; - } - - if (sumH[i - 1] < sumL[i - 1]) - { - return CONFLICT; - } - } - } - } - - if (add_debug_messages) - { - std::cerr << "bottom" << std::endl; - cerr << "columnL:"; - printArray(columnL, bitWidth); - cerr << "columnH:"; - printArray(columnH, bitWidth); - cerr << "sumL:"; - printArray(sumL, bitWidth); - cerr << "sumH:"; - printArray(sumH, bitWidth); - } - - for (int column = 0; column < bitWidth; column++) - { - if (sumH[column] == sumL[column]) - { - // (1) If the low and high sum is equal. Then the output is know. - bool newResult = (sumH[column] % 2 == 0) ? false : true; - - if (!output.isFixed(column)) - { - output.setFixed(column, true); - output.setValue(column, newResult); - result = CHANGED; - changed = true; - } - else if (output.isFixed(column) && (output.getValue(column) != newResult)) - return CONFLICT; - - // (2) If this column has some unfixed values. Then we may be able to determine them. - Result tempResult; - if (0 == column) - tempResult = fixIfCanForAddition(children, column, sumH[column], 0, 0); - else - tempResult = fixIfCanForAddition(children, column, sumH[column], sumL[column - 1] / 2, sumH[column - 1] / 2); - - if (CONFLICT == tempResult) - return CONFLICT; - - if (CHANGED == tempResult) - changed = true; - - } - - } - } - return NOT_IMPLEMENTED; -} - -} -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Boolean.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Boolean.cpp deleted file mode 100644 index d51353181..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Boolean.cpp +++ /dev/null @@ -1,333 +0,0 @@ -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_Utility.h" - -// AND, OR, XOR, NOT Transfer functions. -// Trevor Hansen. BSD License. - - - -namespace simplifier -{ -namespace constantBitP -{ - -Result bvXorBothWays(vector& operands, FixedBits& output) -{ - Result result = NO_CHANGE; - const int bitWidth = output.getWidth(); - - for (int i = 0; i < bitWidth; i++) - { - const stats status = getStats(operands, i); - - if (status.unfixed == 0) // if they are all fixed. We know the answer. - { - bool answer = (status.fixedToOne % 2) != 0; - - if (!output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, answer); - result = CHANGED; - } - else if (output.getValue(i) != answer) - return CONFLICT; - } - else if (status.unfixed == 1 && output.isFixed(i)) - { - // If there is just one unfixed, and we have the answer --> We know the value. - bool soFar = ((status.fixedToOne % 2) != 0); - if (soFar != output.getValue(i)) - { // result needs to be flipped. - fixUnfixedTo(operands, i, true); - } - else - fixUnfixedTo(operands, i, false); - result = CHANGED; - } - } - return result; -} - -// if output bit is true. Fix all the operands. -// if all the operands are fixed. Fix the output. -// given 1,1,1,- == 0, fix - to 0. -Result bvAndBothWays(vector& operands, FixedBits& output) -{ - Result result = NO_CHANGE; - const int bitWidth = output.getWidth(); - - for (int i = 0; i < bitWidth; i++) - { - const stats status = getStats(operands, i); - - // output is fixed to one. But an input value is false! - if (output.isFixed(i) && output.getValue(i) && status.fixedToZero > 0) - return CONFLICT; - - // output is fixed to one. But an input value is false! - if (output.isFixed(i) && !output.getValue(i) && status.fixedToZero == 0 - && status.unfixed == 0) - return CONFLICT; - - // output is fixed to one. So all should be one. - if (output.isFixed(i) && output.getValue(i) && status.unfixed > 0) - { - fixUnfixedTo(operands, i, true); - result = CHANGED; - } - - // The output is unfixed. At least one input is false. - if (!output.isFixed(i) && status.fixedToZero > 0) - { - output.setFixed(i, true); - output.setValue(i, false); - result = CHANGED; - } - - // Everything is fixed to one! - if (!output.isFixed(i) && status.fixedToZero == 0 && status.unfixed - == 0) - { - output.setFixed(i, true); - output.setValue(i, true); - result = CHANGED; - } - - // If the output is false, and there is a single unfixed value with everything else true.. - if (output.isFixed(i) && !output.getValue(i) && status.fixedToZero == 0 - && status.unfixed == 1) - { - fixUnfixedTo(operands, i, false); - result = CHANGED; - } - } - return result; -} - -Result bvOrBothWays(vector& children, FixedBits& output) -{ - Result r = NO_CHANGE; - const int numberOfChildren = children.size(); - const int bitWidth = output.getWidth(); - - for (int i = 0; i < bitWidth; i++) - { - bool answerKnown = output.isFixed(i); - bool answer = false; - if (answerKnown) - answer = output.getValue(i); - - int unks = 0; - int ones = 0; - int zeroes = 0; - - for (int j = 0; j < numberOfChildren; j++) - { - assert(output.getWidth() == children[j]->getWidth()); - - if (!children[j]->isFixed(i)) - unks++; - else if (children[j]->getValue(i)) - ones++; - else - zeroes++; - } - - if (ones > 0) // Atleast a single one found! - - { - if (answerKnown && !answer) - return CONFLICT; - - if (!answerKnown) - { - output.setFixed(i, true); - output.setValue(i, true); - r = CHANGED; - } - } - - if (zeroes == numberOfChildren) // all zeroes. - - { - if (answerKnown && answer) - return CONFLICT; - - if (!answerKnown) - { - r = CHANGED; - output.setFixed(i, true); - output.setValue(i, false); - - } - } - - if (answerKnown && !answer) // known false - - { - if (ones > 0) - return CONFLICT; - - // set all the column to false. - - for (int j = 0; j < numberOfChildren; j++) - { - if (!children[j]->isFixed(i)) - { - r = CHANGED; - children[j]->setFixed(i, true); - children[j]->setValue(i, false); - } - } - - } - - if (unks == 1 && answerKnown && answer && (zeroes == (numberOfChildren - - 1))) - { - // A single unknown, everything else is false. The answer is true. So the unknown is true. - - for (int j = 0; j < numberOfChildren; j++) - { - if (!children[j]->isFixed(i)) - { - r = CHANGED; - children[j]->setFixed(i, true); - children[j]->setValue(i, true); - } - } - } - - } - return r; -} - -Result bvNotBothWays(vector& children, FixedBits& result) -{ - return bvNotBothWays(*(children[0]), result); -} - -Result bvImpliesBothWays(vector& children, FixedBits& result) -{ - - FixedBits& a = (*children[0]); - FixedBits& b = (*children[1]); - - assert(a.getWidth() == result.getWidth()); - const int bitWidth = a.getWidth(); - assert (bitWidth == 1); - - Result r = NO_CHANGE; - - int i = 0; - - // (false -> something) is always true. - // (something -> true ) is always true. - if (a.isFixedToZero(i) || b.isFixedToOne(i)) - { - if (!result.isFixed(i)) - { - result.setFixed(i, true); - result.setValue(i, true); - r = CHANGED; - } else if (result.isFixedToZero(i)) - return CONFLICT; - } - - // If the result is false. it must be (true -> false) - if (result.isFixedToZero(i)) - { - if (a.isFixedToZero(i) || b.isFixedToOne(i)) - return CONFLICT; - - if (!a.isFixed(i)) - { - a.setFixed(i, true); - a.setValue(i, true); - r = CHANGED; - } - if (!b.isFixed(i)) - { - b.setFixed(i, true); - b.setValue(i, false); - r = CHANGED; - } - } - - if (result.isFixedToOne(i)) - { - if (a.isFixedToOne(i)) - { - if (!b.isFixed(i)) - { - b.setFixed(i, true); - b.setValue(i, true); - r = CHANGED; - } - else if (b.isFixedToZero(i)) - return CONFLICT; - } - - if (b.isFixedToZero(i)) - { - if (!a.isFixed(i)) - { - a.setFixed(i, true); - a.setValue(i, false); - r = CHANGED; - } - } - } - - if (a.isFixedToOne(i) && b.isFixedToZero(i)) - { - if (result.isFixedToOne(i)) - return CONFLICT; - if (!result.isFixed(i)) - { - result.setFixed(i, true); - result.setValue(i, false); - r = CHANGED; - } - } - - return r; - -} - -Result bvNotBothWays(FixedBits& a, FixedBits& output) -{ - assert(a.getWidth() == output.getWidth()); - const int bitWidth = a.getWidth(); - - Result result = NO_CHANGE; - - for (int i = 0; i < bitWidth; i++) - { - // error if they are the same. - if (a.isFixed(i) && output.isFixed(i) && (a.getValue(i) - == output.getValue(i))) - { - return CONFLICT; - } - - if (a.isFixed(i) && !output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, !a.getValue(i)); - result = CHANGED; - } - - if (output.isFixed(i) && !a.isFixed(i)) - { - a.setFixed(i, true); - a.setValue(i, !output.getValue(i)); - result = CHANGED; - } - } - return result; -} - -} -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Comparison.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Comparison.cpp deleted file mode 100644 index 4f99030f5..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Comparison.cpp +++ /dev/null @@ -1,631 +0,0 @@ -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_Utility.h" -#include "../../extlib-constbv/constantbv.h" - - -// The signed and unsigned versions of the four comparison operations: > < >= <= - -// Establishes consistency over the intervals of the operations. Then -// increase the minimum value by turning on the highest unfixed bit. -// If that takes us past the other value's maximum. Then that bit -// must be zero. - -// Trevor Hansen. BSD License. - -namespace simplifier -{ -namespace constantBitP -{ - -Result bvSignedLessThanBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output); -Result bvSignedLessThanEqualsBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output); - -Result bvSignedLessThanBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 2); - return bvSignedLessThanBothWays(*children[0], *children[1], output); -} - -Result bvSignedGreaterThanBothWays(FixedBits & c0, FixedBits & c1, FixedBits& output) -{ - return bvSignedLessThanBothWays(c1, c0, output); -} - -Result bvSignedGreaterThanBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 2); - return bvSignedLessThanBothWays(*children[1], *children[0], output); -} - -Result bvSignedLessThanEqualsBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 2); - return bvSignedLessThanEqualsBothWays(*children[0], *children[1], output); -} - -Result bvSignedGreaterThanEqualsBothWays(FixedBits & c0, FixedBits & c1, FixedBits& output) -{ - return bvSignedLessThanEqualsBothWays(c1, c0, output); -} - -Result bvSignedGreaterThanEqualsBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 2); - return bvSignedLessThanEqualsBothWays(*children[1], *children[0], output); -} - -///////// UNSIGNED. - -Result bvLessThanBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output); -Result bvLessThanEqualsBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output); - -Result bvLessThanBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 2); - return bvLessThanBothWays(*children[0], *children[1], output); -} - -Result bvGreaterThanBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 2); - return bvLessThanBothWays(*children[1], *children[0], output); -} - -Result bvGreaterThanBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output) -{ - return bvLessThanBothWays(c1, c0, output); -} - -Result bvGreaterThanEqualsBothWays(vector& children, FixedBits& result) -{ - assert(children.size() == 2); - return bvLessThanEqualsBothWays(*children[1], *children[0], result); -} - -Result bvGreaterThanEqualsBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output) -{ - return bvLessThanEqualsBothWays(c1, c0, output); -} - -Result bvLessThanEqualsBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 2); - return bvLessThanEqualsBothWays(*children[0], *children[1], output); -} - -typedef unsigned int* CBV; - -void destroy(CBV a, CBV b, CBV c, CBV d) -{ - CONSTANTBV::BitVector_Destroy(a); - CONSTANTBV::BitVector_Destroy(b); - CONSTANTBV::BitVector_Destroy(c); - CONSTANTBV::BitVector_Destroy(d); -} - -///////// Signed operations. - - - - -Result bvSignedLessThanBothWays(FixedBits& c0, FixedBits& c1, FixedBits& output) -{ - Result r = NO_CHANGE; - - assert(c0.getWidth() == c1.getWidth()); - - CBV c0_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c0_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - - setSignedMinMax(c0, c0_min, c0_max); - setSignedMinMax(c1, c1_min, c1_max); - - // EG. [0,5] < [6,8]. i.e. max of first is less than min of second. - if (signedCompare(c0_max, c1_min) < 0) - { - if (output.isFixed(0) && !output.getValue(0)) // output is fixed to false. - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, true); - r = CHANGED; - } - } - - // EG. [3,5] < [0,1]. - if (signedCompare(c0_min, c1_max) >= 0) - { - // min is greater than max. - if (output.isFixed(0) && output.getValue(0)) - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, false); - r = CHANGED; - } - } - - if (output.isFixed(0) && !output.getValue(0)) - { - FixedBits t(1, true); - t.setFixed(0, true); - t.setValue(0, true); - destroy(c0_min, c0_max, c1_min, c1_max); - return bvSignedGreaterThanEqualsBothWays(c0, c1, t); - } - - const int msb = c0.getWidth() - 1; - - // The signed case. - if (output.isFixed(0) && output.getValue(0)) - { - //////////// MSB - // turn off the sign bit of c0's minimum. - // If that value is greater or equal to c1's max. SEt it. - if (!c0.isFixed(msb)) - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_Off(c0_min, msb); - if (signedCompare(c0_min, c1_max) >= 0) - { - c0.setFixed(msb, true); - c0.setValue(msb, true); - setSignedMinMax(c0, c0_min, c0_max); - r = CHANGED; - } - else - { - CONSTANTBV::BitVector_Bit_On(c0_min, msb); - } - } - - if (!c1.isFixed(msb)) - { - CONSTANTBV::BitVector_Bit_On(c1_max, msb); - if (signedCompare(c1_max, c0_min) <= 0) - { - c1.setFixed(msb, true); - c1.setValue(msb, false); - setSignedMinMax(c1, c1_min, c1_max); - r = CHANGED; - } - else - { - CONSTANTBV::BitVector_Bit_Off(c1_max, msb); - } - } - - ///////////// Bits other than the MSB - - if (output.isFixed(0) && output.getValue(0)) - { - for (int i = c0.getWidth() - 1 - 1; i >= 0; i--) - { - if (!c0.isFixed(i)) - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_On(c0_min, i); - if (signedCompare(c0_min, c1_max) >= 0) - { - c0.setFixed(i, true); - c0.setValue(i, false); - setSignedMinMax(c0, c0_min, c0_max); - r = CHANGED; - } - else - { - CONSTANTBV::BitVector_Bit_Off(c0_min, i); - break; - } - } - } - - for (int i = c1.getWidth() - 1 - 1; i >= 0; i--) - { - if (!c1.isFixed(i)) - { - CONSTANTBV::BitVector_Bit_Off(c1_max, i); - if (signedCompare(c1_max, c0_min) <= 0) - { - c1.setFixed(i, true); - c1.setValue(i, true); - setSignedMinMax(c1, c1_min, c1_max); - r = CHANGED; - } - else - { - CONSTANTBV::BitVector_Bit_On(c1_max, i); - break; - } - } - } - } - } - destroy(c0_min, c0_max, c1_min, c1_max); - return NOT_IMPLEMENTED; -} - -Result bvSignedLessThanEqualsBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output) -{ - Result r = NO_CHANGE; - - assert(c0.getWidth() == c1.getWidth()); - - CBV c0_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c0_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - - setSignedMinMax(c0, c0_min, c0_max); - setSignedMinMax(c1, c1_min, c1_max); - - if (signedCompare(c0_max, c1_min) <= 0) - { - if (output.isFixed(0) && !output.getValue(0)) - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, true); - r = CHANGED; - } - } - - if (signedCompare(c0_min, c1_max) > 0) - { - if (output.isFixed(0) && output.getValue(0)) - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, false); - r = CHANGED; - } - } - - // If true. Reverse and send to the other.. - if (output.isFixed(0) && !output.getValue(0)) - { - FixedBits t(1, true); - t.setFixed(0, true); - t.setValue(0, true); - destroy(c0_min, c0_max, c1_min, c1_max); - return bvSignedGreaterThanBothWays(c0, c1, t); - } - - const int msb = c0.getWidth() - 1; - - if (output.isFixed(0) && output.getValue(0)) - { - //////////// MSB - // turn off the sign bit of c0's minimum. - // If that value is greater or equal to c1's max. SEt it. - if (!c0.isFixed(msb)) - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_Off(c0_min, msb); - if (signedCompare(c0_min, c1_max) > 0) - { - c0.setFixed(msb, true); - c0.setValue(msb, true); - setSignedMinMax(c0, c0_min, c0_max); - r = CHANGED; - } - else - { - CONSTANTBV::BitVector_Bit_On(c0_min, msb); - } - } - - if (!c1.isFixed(msb)) - { - CONSTANTBV::BitVector_Bit_On(c1_max, msb); - if (signedCompare(c1_max, c0_min) < 0) - { - c1.setFixed(msb, true); - c1.setValue(msb, false); - setSignedMinMax(c1, c1_min, c1_max); - r = CHANGED; - } - else - { - CONSTANTBV::BitVector_Bit_Off(c1_max, msb); - } - } - //////////// Others. - - - // Starting from the high order. Turn on each bit in turn. If it being turned on pushes it past the max of the other side - // then we know it must be turned off. - for (int i = c0.getWidth() - 1 - 1; i >= 0; i--) - { - if (!c0.isFixed(i)) // bit is variable. - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_On(c0_min, i); - if (signedCompare(c0_min, c1_max) > 0) - { - c0.setFixed(i, true); - c0.setValue(i, false); - setSignedMinMax(c0, c0_min, c0_max); - } - else - { - CONSTANTBV::BitVector_Bit_Off(c0_min, i); - break; - } - } - } - - // Starting from the high order. Turn on each bit in turn. If it being turned on pushes it past the max of the other side - // then we know it must be turned off. - for (int i = c0.getWidth() - 1 - 1; i >= 0; i--) - { - if (!c1.isFixed(i)) // bit is variable. - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_Off(c1_max, i); - if (signedCompare(c1_max, c0_min) < 0) - { - c1.setFixed(i, true); - c1.setValue(i, true); - setSignedMinMax(c1, c1_min, c1_max); - } - else - { - CONSTANTBV::BitVector_Bit_On(c1_max, i); - break; - } - } - } - } - - destroy(c0_min, c0_max, c1_min, c1_max); - return NOT_IMPLEMENTED; -} - -///////////////////////// UNSIGNED. - - - - -// UNSIGNED!! -Result bvLessThanBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output) -{ - Result r = NO_CHANGE; - - assert(c0.getWidth() == c1.getWidth()); - - CBV c0_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c0_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - - setUnsignedMinMax(c0, c0_min, c0_max); - setUnsignedMinMax(c1, c1_min, c1_max); - - // EG. [0,5] < [6,8]. i.e. max of first is less than min of second. - if (unsignedCompare(c0_max, c1_min) < 0) - { - if (output.isFixed(0) && !output.getValue(0)) // output is fixed to false. - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, true); - } - } - - // EG. [3,5] < [0,1]. - if (unsignedCompare(c0_min, c1_max) >= 0) - { - // min is greater than max. - if (output.isFixed(0) && output.getValue(0)) - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, false); - } - } - - // If true. Reverse and send to the other. - if (output.isFixed(0) && !output.getValue(0)) - { - FixedBits t(1, true); - t.setFixed(0, true); - t.setValue(0, true); - destroy(c0_min, c0_max, c1_min, c1_max); - return bvGreaterThanEqualsBothWays(c0, c1, t); - } - - bool changed = false; - - if (output.isFixed(0) && output.getValue(0)) - { - // Starting from the high order. Turn on each bit in turn. If it being turned on pushes it past the max of the other side - // then we know it must be turned off. - for (int i = c0.getWidth() - 1; i >= 0; i--) - { - if (!c0.isFixed(i)) // bit is variable. - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_On(c0_min, i); - if (unsignedCompare(c0_min, c1_max) >= 0) - { - c0.setFixed(i, true); - c0.setValue(i, false); - setUnsignedMinMax(c0, c0_min, c0_max); - changed = true; - } - else - { - CONSTANTBV::BitVector_Bit_Off(c0_min, i); - break; - } - } - } - - for (int i = c1.getWidth() - 1; i >= 0; i--) - { - if (!c1.isFixed(i)) // bit is variable. - { - CONSTANTBV::BitVector_Bit_Off(c1_max, i); - if (unsignedCompare(c1_max, c0_min) <= 0) - { - c1.setFixed(i, true); - c1.setValue(i, true); - setUnsignedMinMax(c1, c1_min, c1_max); - changed = true; - } - else - { - CONSTANTBV::BitVector_Bit_On(c1_max, i); - break; - } - } - } - } - - destroy(c0_min, c0_max, c1_min, c1_max); - return NOT_IMPLEMENTED; -} - -Result bvLessThanEqualsBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output) -{ - Result r = NO_CHANGE; - - assert(c0.getWidth() == c1.getWidth()); - - CBV c0_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c0_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_min = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - CBV c1_max = CONSTANTBV::BitVector_Create(c0.getWidth(), true); - - setUnsignedMinMax(c0, c0_min, c0_max); - setUnsignedMinMax(c1, c1_min, c1_max); - - // EG. [0,5] <= [6,8]. i.e. max of first is less than min of second. - if (unsignedCompare(c0_max, c1_min) <= 0) - { - if (output.isFixed(0) && !output.getValue(0)) // output is fixed to false. - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, true); - } - } - - // EG. [3,5] <= [0,1]. - if (unsignedCompare(c0_min, c1_max) > 0) - { - if (output.isFixed(0) && output.getValue(0)) - { - destroy(c0_min, c0_max, c1_min, c1_max); - return CONFLICT; - } - - if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, false); - } - } - - // If true. Reverse and send to the other.. - if (output.isFixed(0) && !output.getValue(0)) - { - FixedBits t(1, true); - t.setFixed(0, true); - t.setValue(0, true); - destroy(c0_min, c0_max, c1_min, c1_max); - return bvGreaterThanBothWays(c0, c1, t); - } - - // We only deal with the true case in this function. - - if (output.isFixed(0) && output.getValue(0)) - { - // Starting from the high order. Turn on each bit in turn. If it being turned on pushes it past the max of the other side - // then we know it must be turned off. - for (int i = c0.getWidth() - 1; i >= 0; i--) - { - if (!c0.isFixed(i)) // bit is variable. - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_On(c0_min, i); - if (unsignedCompare(c0_min, c1_max) > 0) - { - c0.setFixed(i, true); - c0.setValue(i, false); - setUnsignedMinMax(c0, c0_min, c0_max); - } - else - { - CONSTANTBV::BitVector_Bit_Off(c0_min, i); - break; - } - } - } - - // Starting from the high order. Turn on each bit in turn. If it being turned on pushes it past the max of the other side - // then we know it must be turned off. - for (int i = c0.getWidth() - 1; i >= 0; i--) - { - if (!c1.isFixed(i)) // bit is variable. - { - // turn it on in the minimum. - CONSTANTBV::BitVector_Bit_Off(c1_max, i); - if (unsignedCompare(c1_max, c0_min) < 0) - { - c1.setFixed(i, true); - c1.setValue(i, true); - setUnsignedMinMax(c1, c1_min, c1_max); - } - else - { - CONSTANTBV::BitVector_Bit_On(c1_max, i); - break; - } - } - } - } - destroy(c0_min, c0_max, c1_min, c1_max); - return NOT_IMPLEMENTED; -} - -} -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Division.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Division.cpp deleted file mode 100644 index dea6eb196..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Division.cpp +++ /dev/null @@ -1,1135 +0,0 @@ -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_Utility.h" -#include -#include -#include "../../AST/AST.h" -#include "../../simplifier/simplifier.h" - -namespace simplifier { -namespace constantBitP { -using std::endl; -using std::pair; -using std::set; - -const bool debug_division = false; -extern std::ostream& log; - -using BEEV::STPMgr; - -enum WhatIsOutput { - REMAINDER_IS_OUTPUT, QUOTIENT_IS_OUTPUT -}; - -enum Operation { - SIGNED_DIVISION, SIGNED_REMAINDER, SIGNED_MODULUS -}; - -// For unsigned 3-bit exhaustive, there are 1119 differences for unsigned division. - - -// a/b and a%b. a=bq +r. Where b!=0 implies r= 0; i--) - { - if (CONSTANTBV::BitVector_bit_test(low, i)) - { - lowBits.setFixed(i, true); - lowBits.setValue(i, true); - } - else - { - lowBits.setFixed(i, true); - lowBits.setValue(i, false); - - } - } - return lowBits; - } - - -// The value "b" is in the range [low,high] inclusive. -// Unfortunately it's not idempotent, <....1> [5,6], doesn't completely set it. -Result fix(FixedBits& b, BEEV::CBV low, BEEV::CBV high) -{ - FixedBits init =b; - const int width = b.getWidth(); - - FixedBits highBits = cbvToFixedBits(high,width); - FixedBits lowBits = cbvToFixedBits(low,width); - - vector c; - c.push_back(&b); - c.push_back(&highBits); - - - FixedBits t(1,true); - t.setFixed(0,true); - t.setValue(0,true); - Result result1 = bvLessThanEqualsBothWays(c,t); - - c.clear(); - c.push_back(&lowBits); - c.push_back(&b); - Result result2 = bvLessThanEqualsBothWays(c,t); - - Result result = merge(result1, result2); - if (result == CONFLICT) - return CONFLICT; - - for (int i = width - 1; i >= 0; i--) { - if ((CONSTANTBV::BitVector_bit_test(low, i) - == CONSTANTBV::BitVector_bit_test(high, i))) { - bool toFix = CONSTANTBV::BitVector_bit_test(low, i); - if (b.isFixed(i)) { - if (b.getValue(i) != toFix) { - return CONFLICT; - } - } else { - b.setFixed(i, true); - b.setValue(i, toFix); - } - } else - break; - } - - if (!FixedBits::equals(init, b)) - return CHANGED; - return NO_CHANGE; -} - -Result bvUnsignedQuotientAndRemainder2(vector& children, - FixedBits& output, STPMgr* bm, WhatIsOutput whatIs); - - -Result bvUnsignedQuotientAndRemainder(vector& children, - FixedBits& output, STPMgr* bm, WhatIsOutput whatIs) { - assert(output.getWidth() == children[0]->getWidth()); - assert(output.getWidth() == children[1]->getWidth()); - assert(children.size() == 2); - - if (whatIs != QUOTIENT_IS_OUTPUT) - { - return bvUnsignedQuotientAndRemainder2(children, output, bm, whatIs); - } - - FixedBits& a = *children[0]; - FixedBits& b = *children[1]; - - const unsigned width = a.getWidth(); - - BEEV::CBV minTop = CONSTANTBV::BitVector_Create(width, true); - BEEV::CBV maxTop = CONSTANTBV::BitVector_Create(width, true); - - setUnsignedMinMax(a, minTop, maxTop); - - BEEV::CBV minBottom = CONSTANTBV::BitVector_Create(width, true); - BEEV::CBV maxBottom = CONSTANTBV::BitVector_Create(width, true); - - setUnsignedMinMax(b, minBottom, maxBottom); - - BEEV::CBV minQuotient = CONSTANTBV::BitVector_Create(width, true); - BEEV::CBV maxQuotient = CONSTANTBV::BitVector_Create(width, true); - - BEEV::CBV minRemainder = CONSTANTBV::BitVector_Create(width, true); - BEEV::CBV maxRemainder = CONSTANTBV::BitVector_Create(width, true); - - if (whatIs == QUOTIENT_IS_OUTPUT) { - setUnsignedMinMax(output, minQuotient, maxQuotient); - - for (int i = 0; i < width; i++) - CONSTANTBV::BitVector_Bit_On(maxRemainder, i); - } - else - { - setUnsignedMinMax(output, minRemainder, maxRemainder); - - for (int i =0; i < width;i++) - CONSTANTBV::BitVector_Bit_On(maxQuotient,i); - } - - // need to clean up these at end. - BEEV::CBV one = CONSTANTBV::BitVector_Create(width, true); - CONSTANTBV::BitVector_increment(one); - // quotient and remainder. - BEEV::CBV q = CONSTANTBV::BitVector_Create(width, true); - BEEV::CBV r = CONSTANTBV::BitVector_Create(width, true); - // misc. - BEEV::CBV copy = CONSTANTBV::BitVector_Create(width, true); - BEEV::CBV copy2 = CONSTANTBV::BitVector_Create(width, true); - BEEV::CBV multR = CONSTANTBV::BitVector_Create(width, true); - - if (debug_division) { - log << "--" << endl; - log << "initial" << endl; - log << "a:[" << *minTop << "," << *maxTop << "]"; - log << " / b:[" << *minBottom << "," << *maxBottom << "] = "; - log << "[" << *minQuotient << "," << *maxQuotient << "]"; - log << " rem [" << *minRemainder << "," << *maxRemainder << "]"; - log << endl; - } - - // If a bit is changed, then we fixed point again. - bool bitEverChanged = false; - bool bitJustChanged = true; - Result result = NO_CHANGE; - - // We loop. There are 6 cases. - while (bitJustChanged) { - bitJustChanged = false; - - bool changed = true; - - int iteration = 0; - while (changed) { - changed = false; - CONSTANTBV::ErrCode e; - - // The main loop doesn't work if there is a division by zero possible. - // If the minimum bottom is zero, but the minimum quotient is > 1, then in our semantics - // of 1/0 = 1 - if (CONSTANTBV::BitVector_is_empty(minBottom) && CONSTANTBV::BitVector_Lexicompare(minQuotient, one) > 0) - { - CONSTANTBV::BitVector_increment(minBottom); - if (CONSTANTBV::BitVector_Lexicompare(minBottom, maxBottom) > 0) - { - result = CONFLICT; - goto end; - } - } - - if (CONSTANTBV::BitVector_is_empty(minBottom)) - { - goto end; // Possible division by zero. Hard to work with.. - } - - bool carry_1 = false; - CONSTANTBV::BitVector_sub(copy, minTop, minRemainder, &carry_1); - if (!carry_1) // Not sure if it goes negative. - { - e = CONSTANTBV::BitVector_Div_Pos(q, copy, maxBottom, r); - assert(e == CONSTANTBV::ErrCode_Ok); - - if (CONSTANTBV::BitVector_Lexicompare(minQuotient, q) < 0) { - if (debug_division) { - log << "1 minQ) " << *minTop; - log << " / " << *maxBottom; - log << " = " << *q; - log << " r " << *r << endl; - } - - // min quotient is bigger. Bring in. - CONSTANTBV::BitVector_Copy(minQuotient, q); - changed = true; - } - } - - CONSTANTBV::BitVector_Copy(copy, maxTop); - //bool carry_2 = false; - //CONSTANTBV::BitVector_sub(copy,maxTop,minRemainder,&carry_2); - //assert(!carry_1); // Not sure if it goes negative. - - e = CONSTANTBV::BitVector_Div_Pos(q, copy, minBottom, r); - assert(e == CONSTANTBV::ErrCode_Ok); - - if (CONSTANTBV::BitVector_Lexicompare(maxQuotient, q) > 0) { - if (debug_division) { - log << "2 maxQ) " << *maxTop; - log << " / " << *minBottom; - log << " = " << *q; - log << " r " << *r << endl; - } - - CONSTANTBV::BitVector_Copy(maxQuotient, q); // copy the reduced value in. - changed = true; - } - - CONSTANTBV::BitVector_Copy(copy, maxQuotient); - e = CONSTANTBV::BitVector_Mul_Pos(multR, copy, maxBottom, true); - bool carry = false; - CONSTANTBV::BitVector_sub(copy, maxBottom, one, &carry); - CONSTANTBV::BitVector_add(copy2, multR, copy, &carry); - CONSTANTBV::BitVector_Copy(multR, copy2); - // involved. eek. - - - if (e == CONSTANTBV::ErrCode_Ok - && CONSTANTBV::BitVector_Lexicompare(maxTop, multR) > 0) { - if (debug_division) { - log << "3 maxT) " << *maxQuotient; - log << " * " << *maxBottom; - log << " = " << *multR << endl; - } - CONSTANTBV::BitVector_Copy(maxTop, multR); - changed = true; - } - - CONSTANTBV::BitVector_Copy(copy, minBottom); - - // If this is strict then it seems to be treated as signed, so it is considered to overflow - // if a bit moves into the top of multR. - e = CONSTANTBV::BitVector_Mul_Pos(multR, copy, minQuotient, false); - //cerr << e << endl; - - - if (e == CONSTANTBV::ErrCode_Ok && CONSTANTBV::BitVector_Lexicompare(minTop, multR) < 0) - { - if (debug_division) { - log << "4 minT) " << *minQuotient; - log << " * " << *minBottom; - log << " = " << *multR << endl; - } - CONSTANTBV::BitVector_Copy(minTop, multR); - changed = true; - } - - if (CONSTANTBV::BitVector_Lexicompare(minQuotient, one) >= 0) { - // not going to divide by zero. - - CONSTANTBV::BitVector_Copy(copy, maxTop); - e = CONSTANTBV::BitVector_Div_Pos(q, copy, minQuotient, r); - assert(e == CONSTANTBV::ErrCode_Ok); - - if (CONSTANTBV::BitVector_Lexicompare(maxBottom, q) > 0) { - if (debug_division) { - log << "5 maxB) " << *maxTop; - log << " / " << *minQuotient; - log << " = " << *q; - log << " r " << *r << endl; - } - - // min quotient is bigger. Bring in. - CONSTANTBV::BitVector_Copy(maxBottom, q); - changed = true; - } - } - - - // This rule increases the minimum of the bottom. - // let a be the min of the top, - // let q be the maximum of the quotient, - // let b be the min. of the bottom. - // then a= bq +r - // so a = bq + (b-1) // if the max. of r is one less than b. - // so (1+a) / (q+1) = b. - // We round the division up. - { - bool carry = false; - CONSTANTBV::BitVector_add(copy, minTop, one, &carry); - bool carry2 = false; - CONSTANTBV::BitVector_add(copy2, maxQuotient, one, &carry2); - if (!carry && !carry2) - { - e = CONSTANTBV::BitVector_Div_Pos(q, copy, copy2, r); - assert(e == CONSTANTBV::ErrCode_Ok); - if (CONSTANTBV::BitVector_Lexicompare(q, one) >= 0) - { - CONSTANTBV::BitVector_add(copy, q, one, &carry); - if (!carry && (CONSTANTBV::BitVector_Lexicompare(minBottom, q) < 0)) - { - - if (debug_division) - { - log << "6 min_3_B) "; - log << "minBottom" << *minBottom << " " ; - log << "q" << *q << endl; - } - - // min quotient is bigger. Bring in. - CONSTANTBV::BitVector_Copy(minBottom, q); - changed = true; - } - } - - - } - } - - // Don't know why we don't need to check the intervals on the others? - if (CONSTANTBV::BitVector_Lexicompare(minQuotient, maxQuotient) > 0) { - if (debug_division) { - log << "conflict" << endl; - log << "a:[" << *minTop << "," << *maxTop << "]"; - log << " / b:[" << *minBottom << "," << *maxBottom - << "] = "; - log << "[" << *minQuotient << "," << *maxQuotient << "]"; - log << endl; - } - - result = CONFLICT; - goto end; - } - - - if (debug_division) { - log << "intermediate" << endl; - log << "a:[" << *minTop << "," << *maxTop << "]"; - log << " / b:[" << *minBottom << "," << *maxBottom << "] = "; - log << "[" << *minQuotient << "," << *maxQuotient << "]"; - log << endl; - } - iteration++; - //if (iteration==2 && changed) - //exit(1); - } - - if (debug_division) { - log << "final" << endl; - log << "a:[" << *minTop << "," << *maxTop << "]"; - log << " / b:[" << *minBottom << "," << *maxBottom << "] = "; - log << "[" << *minQuotient << "," << *maxQuotient << "]"; - log << endl; - } - - { - Result r1 = fix(a, minTop, maxTop); - if (r1 == CHANGED) - r1 = merge(r1,fix(a, minTop, maxTop)); - - Result r2 = fix(b, minBottom, maxBottom); - if (r2 == CHANGED) // We call is a second time because it's not idepotent.. - r2 = merge(r2,fix(b, minBottom, maxBottom)); - - Result r3; - if (whatIs == QUOTIENT_IS_OUTPUT) - { - r3 = fix(output, minQuotient, maxQuotient); - if (r3 == CHANGED) - r3 = merge(r3,fix(output, minQuotient, maxQuotient)); - } - else - r3 = fix(output, minRemainder, maxRemainder); - - - if (r1 == CONFLICT || r2 == CONFLICT || r3 == CONFLICT) - { - result = CONFLICT; - goto end; - } - assert(result != CONFLICT); - - if (r1 == CHANGED || r2 == CHANGED || r3 == CHANGED) - result = CHANGED; - } - - // check that fixing bits hasn't tightened intervals. If it has we need to resolve. - if (result == CHANGED) { - bool tightened = false; - - setUnsignedMinMax(output, copy, copy2); - - if (whatIs == QUOTIENT_IS_OUTPUT) - { - if (CONSTANTBV::BitVector_Lexicompare(minQuotient, copy) < 0 - || CONSTANTBV::BitVector_Lexicompare(maxQuotient, copy2) - > 0) - tightened = true; - } - else - { - if (CONSTANTBV::BitVector_Lexicompare(minRemainder, copy) < 0 - || CONSTANTBV::BitVector_Lexicompare(maxRemainder, copy2) - > 0) - tightened = true; - } - - setUnsignedMinMax(b, copy, copy2); - if (CONSTANTBV::BitVector_Lexicompare(minBottom, copy) < 0 - || CONSTANTBV::BitVector_Lexicompare(maxBottom, copy2) > 0) - tightened = true; - - setUnsignedMinMax(a, copy, copy2); - if (CONSTANTBV::BitVector_Lexicompare(minTop, copy) < 0 - || CONSTANTBV::BitVector_Lexicompare(maxTop, copy2) > 0) - tightened = true; - - if (tightened) { - setUnsignedMinMax(a, minTop, maxTop); - setUnsignedMinMax(b, minBottom, maxBottom); - if (whatIs == QUOTIENT_IS_OUTPUT) - setUnsignedMinMax(output, minQuotient, maxQuotient); - else - setUnsignedMinMax(output, minRemainder, maxRemainder); - - bitEverChanged = true; - bitJustChanged = true; - } - } - - } - - end: - // Destroy range variables. - CONSTANTBV::BitVector_Destroy(minTop); - CONSTANTBV::BitVector_Destroy(maxTop); - CONSTANTBV::BitVector_Destroy(minBottom); - CONSTANTBV::BitVector_Destroy(maxBottom); - CONSTANTBV::BitVector_Destroy(minQuotient); - CONSTANTBV::BitVector_Destroy(maxQuotient); - CONSTANTBV::BitVector_Destroy(minRemainder); - CONSTANTBV::BitVector_Destroy(maxRemainder); - - - // Destroy helpers. - CONSTANTBV::BitVector_Destroy(copy); - CONSTANTBV::BitVector_Destroy(copy2); - CONSTANTBV::BitVector_Destroy(multR); - CONSTANTBV::BitVector_Destroy(q); - CONSTANTBV::BitVector_Destroy(r); - CONSTANTBV::BitVector_Destroy(one); - - if (result == CONFLICT) - return CONFLICT; - - if (bitEverChanged) - return CHANGED; - return result; -} - -// (a/b) = q -// Solving: (a = q * b + r) AND (r < b). -Result bvUnsignedQuotientAndRemainder2(vector& children, - FixedBits& output, STPMgr* bm, WhatIsOutput whatIs) { - assert(output.getWidth() == children[0]->getWidth()); - assert(output.getWidth() == children[1]->getWidth()); - assert(children.size() == 2); - - unsigned int newWidth = 2 * output.getWidth(); - // Create Widenend copies. - FixedBits a(newWidth, false); - FixedBits b(newWidth, false); - - FixedBits q(newWidth, false); - FixedBits r(newWidth, false); - - // intermediate values. - FixedBits times(newWidth, false); - - a.copyIn(*children[0]); - b.copyIn(*children[1]); - - assert(!b.containsZero()); - - if (whatIs == QUOTIENT_IS_OUTPUT) - q.copyIn(output); - else if (whatIs == REMAINDER_IS_OUTPUT) - r.copyIn(output); - else - throw std::runtime_error("sdjjfas"); - - FixedBits aCopy(newWidth, false); - FixedBits bCopy(newWidth, false); - FixedBits rCopy(newWidth, false); - FixedBits qCopy(newWidth, false); - - // Times and plus must not overflow. - for (unsigned i = (unsigned) output.getWidth(); i < newWidth; i++) { - //No overflow. - times.setFixed(i, true); - times.setValue(i, false); - - // Everything is zero extended. - a.setFixed(i, true); - a.setValue(i, false); - b.setFixed(i, true); - b.setValue(i, false); - - //Multiplication must not overflow. - r.setFixed(i, true); - r.setValue(i, false); - q.setFixed(i, true); - q.setValue(i, false); - } - - // True bit. - FixedBits trueBit(1, true); - trueBit.setFixed(0, true); - trueBit.setValue(0, true); - - Result result = NO_CHANGE; - - vector addChildren; - addChildren.push_back(×); - addChildren.push_back(&r); - - vector multiplicationChildren; - multiplicationChildren.push_back(&q); - multiplicationChildren.push_back(&b); - - do { - aCopy = a; - bCopy = b; - rCopy = r; - qCopy = q; - - if (debug_division) { - log << "p1:" << a << "/" << b << "=" << q << "rem(" << r << ")" - << endl; - log << "times" << times << endl; - } - - result = bvLessThanBothWays(r, b, trueBit); // (r < b) - if (result == CONFLICT) - return CONFLICT; - - result = bvMultiplyBothWays(multiplicationChildren, times, bm); - if (result == CONFLICT) - return CONFLICT; - - result = bvAddBothWays(addChildren, a); - if (result == CONFLICT) - return CONFLICT; - } while (!(FixedBits::equals(aCopy, a) && FixedBits::equals(bCopy, b) - && FixedBits::equals(rCopy, r) && FixedBits::equals(qCopy, q))); - - bool conflict = false; - for (int i = 0; i < output.getWidth(); i++) { - if (whatIs == QUOTIENT_IS_OUTPUT) - conflict |= fix(output, q, i); - else if (whatIs == REMAINDER_IS_OUTPUT) - conflict |= fix(output, r, i); - else - throw std::runtime_error("sdjjfas"); - - conflict |= fix(*children[0], a, i); - conflict |= fix(*children[1], b, i); - } - - if (debug_division) - cerr << endl; - - if (conflict) - return CONFLICT; - - return NOT_IMPLEMENTED; -} - -Result bvUnsignedModulusBothWays(vector& children, - FixedBits& output, STPMgr* bm) { - - - - Result r1 = NO_CHANGE; - vector v; - v.push_back(&output); - v.push_back(children[0]); - FixedBits truN(1,true); - truN.setFixed(0,true); - truN.setValue(0,true); - r1= bvLessThanEqualsBothWays(v, truN); - - - if (children[1]->containsZero()) - return r1; - - if (debug_division) - log << *(children[0]) << "bvmod" << *(children[1]) << "=" - << output << endl; - - Result r = bvUnsignedQuotientAndRemainder(children, output, bm, - REMAINDER_IS_OUTPUT); - - // Doesn't even do constant propagation. - // <10>bvmod<11>=<--> - if (r != CONFLICT && children[0]->isTotallyFixed() - && children[1]->isTotallyFixed() && !output.isTotallyFixed()) { - - if (debug_division) - { - log << "Not even constant prop!" << *(children[0]) << "bvmod" - << *(children[1]) << "=" << output << endl; - } - - //assert(output.isTotallyFixed()); - } - - if (r == CONFLICT || r==CHANGED) - return r; - - return r1; -} - - Result - bvUnsignedDivisionBothWays(vector& children, FixedBits& output, STPMgr* bm) - { - Result r0 = NO_CHANGE; - - // Enforce that the output must be less than the numerator. - // Make special allowance for 0/0 = 1. - for (int i = children[0]->getWidth() - 1; i > 0; i--) - { - if (children[0]->isFixedToZero(i)) - { - if (output.isFixedToOne(i)) - return CONFLICT; - else if (!output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, false); - r0 = CHANGED; - } - } - else - { - break; - } - } - - Result r = bvUnsignedQuotientAndRemainder(children, output, bm, QUOTIENT_IS_OUTPUT); - - return merge(r0,r); - } - -bool canBe(const FixedBits& b, int index, bool value) { - if (!b.isFixed(index)) - return true; - else - return (!(b.getValue(index) ^ value)); -} - -// This provides a way to call the process function with fewer arguments. -struct Data { - FixedBits &tempA; - FixedBits &tempB; - FixedBits &tempOutput; - FixedBits &workingA; - FixedBits &workingB; - FixedBits &workingOutput; - unsigned int signBit; - - Data(FixedBits &_tempA, FixedBits &_tempB, FixedBits &_tempOutput, - FixedBits &_workingA, FixedBits &_workingB, - FixedBits &_workingOutput) : - tempA(_tempA), tempB(_tempB), tempOutput(_tempOutput), workingA( - _workingA), workingB(_workingB), workingOutput(_workingOutput) { - signBit = tempOutput.getWidth() - 1; - } - - void process(bool& first) { - if (first) { - workingA = tempA; - workingB = tempB; - workingOutput = tempOutput; - } else { - workingA = FixedBits::meet(workingA, tempA); - workingB = FixedBits::meet(workingB, tempB); - workingOutput = FixedBits::meet(workingOutput, tempOutput); - } - first = false; - } - - void set(const FixedBits& a, const FixedBits&b, const FixedBits& output, - bool aTop, bool bTop) { - tempA = a; - tempB = b; - tempOutput = output; - tempA.setFixed(signBit, true); - tempA.setValue(signBit, aTop); - - tempB.setFixed(signBit, true); - tempB.setValue(signBit, bTop); - } - - void print() { - cerr << "Working: "; - cerr << workingA << "/"; - cerr << workingB << "="; - cerr << workingOutput << endl; - - cerr << "Temps: "; - cerr << tempA << "/"; - cerr << tempB << "="; - cerr << tempOutput << endl; - } -}; - -Result negate(FixedBits& input, FixedBits& output) { - vector negChildren; - - negChildren.push_back(&input); - return bvUnaryMinusBothWays(negChildren, output); -} - -// This is preposterously complicated. We execute four cases then take the union of them. -// -Result bvSignedDivisionRemainderBothWays(vector& children, - FixedBits& output, STPMgr* bm, Result(*tf)(vector&, - FixedBits&, STPMgr* bm), const Operation op) { - assert(output.getWidth() == children[0]->getWidth()); - assert(output.getWidth() == children[1]->getWidth()); - assert(children.size() == 2); - - const FixedBits& a = *children[0]; - const FixedBits& b = *children[1]; - - assert(&a != &b); - - const unsigned int inputWidth = output.getWidth(); - const unsigned int signBit = output.getWidth() - 1; - - FixedBits workingA(inputWidth, false); - FixedBits workingB(inputWidth, false); - FixedBits workingOutput(inputWidth, false); - - FixedBits tempA = a; - FixedBits tempB = b; - FixedBits tempOutput = output; - - vector tempChildren; - tempChildren.push_back(&tempA); - tempChildren.push_back(&tempB); - Result r = NO_CHANGE; - - if (b.containsZero()) - return NO_CHANGE; - - Data data(tempA, tempB, tempOutput, workingA, workingB, workingOutput); - - while (true) - { - if (debug_division) - { - cerr << "start:"; - cerr << a << "/"; - cerr << b << "="; - cerr << output << endl; - } - - bool first = true; - - if (canBe(a, signBit, false) && canBe(b, signBit, false)) { - // (bvudiv s t) - r = NO_CHANGE; - data.set(a, b, output, false, false); - - r = tf(tempChildren, tempOutput, bm); - if (r != CONFLICT) { - if (debug_division) - cerr << "case A" << endl; - data.process(first); - } - } - - if (canBe(a, signBit, true) && canBe(b, signBit, false)) { - // (bvneg (bvudiv (bvneg a) b)) - r = NO_CHANGE; - data.set(a, b, output, true, false); - - FixedBits negA(inputWidth, false); - - vector negChildren; - negChildren.push_back(&negA); - r = bvUnaryMinusBothWays(negChildren, tempA); // get NegA - //cerr << negA << " " << tempA << endl; - assert(r != CONFLICT); - - //modulus: (bvadd (bvneg (bvurem (bvneg s) t)) t) - FixedBits wO(inputWidth, false); - if (op == SIGNED_MODULUS) { - vector ch; - ch.push_back(&wO); - ch.push_back(&tempB); - r = bvAddBothWays(ch, tempOutput); - assert(r != CONFLICT); - } else - wO = tempOutput; - - FixedBits negOutput(inputWidth, false); - negChildren.clear(); - negChildren.push_back(&negOutput); - r = bvUnaryMinusBothWays(negChildren, wO); - assert(r != CONFLICT); - - negChildren.clear(); - negChildren.push_back(&negA); - negChildren.push_back(&tempB); - - r = tf(negChildren, negOutput, bm); - if (r != CONFLICT) { - negChildren.clear(); - negChildren.push_back(&wO); - r = bvUnaryMinusBothWays(negChildren, negOutput); - - if (r != CONFLICT) { - if (op == SIGNED_MODULUS) { - vector ch; - ch.push_back(&wO); - ch.push_back(&tempB); - r = bvAddBothWays(ch, tempOutput); - } else - tempOutput = wO; - - if (r != CONFLICT) { - negChildren.clear(); - negChildren.push_back(&tempA); - //cerr << negA << " " << tempA << endl; - r = bvUnaryMinusBothWays(negChildren, negA); - //data.print(); - if (r != CONFLICT) { - - if (debug_division) - cerr << "case B" << endl; - - data.process(first); - - } - } - } - } - } - - if (canBe(a, signBit, false) && canBe(b, signBit, true)) { - // (bvneg (bvudiv a (bvneg b))) - r = NO_CHANGE; - data.set(a, b, output, false, true); - - FixedBits negB(inputWidth, false); - //FixedBits negA(inputWidth, false); - - vector negChildren; - negChildren.push_back(&negB); - r = bvUnaryMinusBothWays(negChildren, tempB); // get NegB - assert(r != CONFLICT); - - // Create a negated version of the output if necessary. Modulus and remainder aren't both negated. Division is. - FixedBits wO(inputWidth, false); - if (op == SIGNED_DIVISION) { - r = negate(tempOutput, wO); - assert(r != CONFLICT); - } else if (op == SIGNED_REMAINDER || op == SIGNED_MODULUS) - wO = tempOutput; - - // (bvadd (bvurem s (bvneg t)) t) - if (op == SIGNED_MODULUS) { - FixedBits wTemp(inputWidth, false); - vector ch; - ch.push_back(&wTemp); - ch.push_back(&tempB); - r = bvAddBothWays(ch, tempOutput); - assert(r != CONFLICT); - wO = wTemp; - } - - negChildren.clear(); - negChildren.push_back(&tempA); - negChildren.push_back(&negB); - - r = tf(negChildren, wO, bm); - if (r != CONFLICT) { - FixedBits t(wO.getWidth(), false); - if (op == SIGNED_MODULUS) { - vector ch; - ch.push_back(&wO); - ch.push_back(&tempB); - r = bvAddBothWays(ch, tempOutput); - t = tempOutput; - } else - t = wO; - - if (r != CONFLICT) { - if (op == SIGNED_DIVISION) { - r = negate(tempOutput, t); - } else if (op == SIGNED_REMAINDER || op == SIGNED_MODULUS) { - tempOutput = t; - } - - if (r != CONFLICT) { - negChildren.clear(); - negChildren.push_back(&tempB); - r = bvUnaryMinusBothWays(negChildren, negB); - if (r != CONFLICT) { - if (debug_division) - cerr << "case C" << endl; - - data.process(first); - } - } - } - } - } - - if (canBe(a, signBit, true) && canBe(b, signBit, true)) { - // (bvudiv (bvneg a) (bvneg b))))))) - r = NO_CHANGE; - data.set(a, b, output, true, true); - - FixedBits negA(inputWidth, false); - FixedBits negB(inputWidth, false); - - vector negChildren; - negChildren.push_back(&negA); - r = bvUnaryMinusBothWays(negChildren, tempA); // get NegA - assert(r != CONFLICT); - - negChildren.clear(); - negChildren.push_back(&negB); - r = bvUnaryMinusBothWays(negChildren, tempB); // get NegB - assert(r != CONFLICT); - - negChildren.clear(); - negChildren.push_back(&negA); - negChildren.push_back(&negB); - - FixedBits wO(inputWidth, false); - if (op == SIGNED_REMAINDER || op == SIGNED_MODULUS) { - r = negate(tempOutput, wO); - assert(r != CONFLICT); - } else if (op == SIGNED_DIVISION) - wO = tempOutput; - - r = tf(negChildren, wO, bm); - if (r != CONFLICT) { - negChildren.clear(); - negChildren.push_back(&tempB); - r = bvUnaryMinusBothWays(negChildren, negB); - - if (r != CONFLICT) { - negChildren.clear(); - negChildren.push_back(&tempA); - r = bvUnaryMinusBothWays(negChildren, negA); - //data.print(); - if (r != CONFLICT) { - if (op == SIGNED_REMAINDER || op == SIGNED_MODULUS) { - r = negate(tempOutput, wO); - } else if (op == SIGNED_DIVISION) - tempOutput = wO; - - if (r != CONFLICT) { - if (debug_division) - cerr << "case D" << endl; - - data.process(first); - } - } - } - } - - } - - if (first) - return CONFLICT; // All are conflicts. - - // The results be subsets of the originals. - assert(FixedBits::in(workingA, *children[0])); - assert(FixedBits::in(workingB, *children[1])); - assert(FixedBits::in(workingOutput, output)); - - if (FixedBits::equals(a, workingA) && FixedBits::equals(b, workingB) - && FixedBits::equals(output, workingOutput)) - break; - else - { - *children[0] = workingA; - *children[1] = workingB; - output = workingOutput; - } - } - - return NOT_IMPLEMENTED; -} - -Result bvSignedModulusBothWays(vector& children, FixedBits& output, - STPMgr* bm) { - /* - (bvsmod s t) abbreviates - (let (?msb_s (extract[|m-1|:|m-1|] s)) - (let (?msb_t (extract[|m-1|:|m-1|] t)) - (ite (and (= ?msb_s bit0) (= ?msb_t bit0)) - (bvurem s t) - (ite (and (= ?msb_s bit1) (= ?msb_t bit0)) - (bvadd (bvneg (bvurem (bvneg s) t)) t) - (ite (and (= ?msb_s bit0) (= ?msb_t bit1)) - (bvadd (bvurem s (bvneg t)) t) - (bvneg (bvurem (bvneg s) (bvneg t))))))) - */ - - // I think this implements old style (broken) semantics, so avoiding it. - return NO_CHANGE; - - if (children[0] == children[1]) // same pointer. - { - return NO_CHANGE; - } - - return bvSignedDivisionRemainderBothWays(children, output, bm, - bvUnsignedModulusBothWays, SIGNED_MODULUS); -} - -Result bvSignedRemainderBothWays(vector& children, - FixedBits& output, STPMgr* bm) { - /* - (bvsrem s t) abbreviates - (let (?msb_s (extract[|m-1|:|m-1|] s)) - (let (?msb_t (extract[|m-1|:|m-1|] t)) - (ite (and (= ?msb_s bit0) (= ?msb_t bit0)) - (bvurem s t) - (ite (and (= ?msb_s bit1) (= ?msb_t bit0)) - (bvneg (bvurem (bvneg s) t)) - (ite (and (= ?msb_s bit0) (= ?msb_t bit1)) - (bvurem s (bvneg t))) - (bvneg (bvurem (bvneg s) (bvneg t))))))) - */ - - - if (children[0] == children[1]) // same pointer. - { - return NO_CHANGE; - } - - - return bvSignedDivisionRemainderBothWays(children, output, bm, - bvUnsignedModulusBothWays, SIGNED_REMAINDER); -} - -Result bvSignedDivisionBothWays(vector& children, - FixedBits& output, STPMgr* bm) { - /* - * (bvsdiv s t) abbreviates - (let (?msb_s (extract[|m-1|:|m-1|] s)) - (let (?msb_t (extract[|m-1|:|m-1|] t)) - (ite (and (= ?msb_s bit0) (= ?msb_t bit0)) - (bvudiv s t) - (ite (and (= ?msb_s bit1) (= ?msb_t bit0)) - (bvneg (bvudiv (bvneg s) t)) - (ite (and (= ?msb_s bit0) (= ?msb_t bit1)) - (bvneg (bvudiv s (bvneg t))) - (bvudiv (bvneg s) (bvneg t))))))) - * - */ - - if (children[0] == children[1]) // same pointer. - { - return NO_CHANGE; - } - - // unsigned division propagates much better than signed division does! - const int top = children[0]->getWidth(); - if ((*children[0])[top-1] == '0' && (*children[1])[top-1] == '0') - return bvUnsignedDivisionBothWays(children, output, bm); - else - return bvSignedDivisionRemainderBothWays(children, output, bm, - bvUnsignedDivisionBothWays, SIGNED_DIVISION); -} -} -} -; diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_MaxPrecision.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_MaxPrecision.cpp deleted file mode 100644 index 7d0452d95..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_MaxPrecision.cpp +++ /dev/null @@ -1,522 +0,0 @@ -#include "ConstantBitP_MaxPrecision.h" -#include "../../AST/AST.h" -#include "../../AST/ArrayTransformer.h" -#include "../../simplifier/simplifier.h" -#include "../../to-sat/BitBlaster.h" -#include "../../to-sat/AIG/BBNodeManagerAIG.h" -#include "../../absrefine_counterexample/AbsRefine_CounterExample.h" -#include "../../to-sat/ASTNode/ToSAT.h" -#include "../../to-sat/AIG/ToSATAIG.h" -#include "../../STPManager/STPManager.h" -#include "../../sat/MinisatCore.h" - -using namespace BEEV; - -namespace simplifier -{ - -namespace constantBitP -{ - -void print(const vector children, const FixedBits& output, Kind k); - -//// Help node creation functions. - -ASTNode createConstant(int bitWidth, int val, STPMgr* beev) -{ - CBV cbv = CONSTANTBV::BitVector_Create(bitWidth, true); - int max = bitWidth > ((int) sizeof(int) * 8) ? sizeof(int) * 8 : bitWidth; - for (int i = 0; i < max; i++) - if (val & (1 << i)) - CONSTANTBV::BitVector_Bit_On(cbv, i); - return beev->CreateBVConst(cbv, bitWidth); -} - -ASTNode createTerm(Kind k, int width, const ASTNode& n1, STPMgr* beev) -{ - ASTNode result = beev->CreateTerm(k, width, n1); - BVTypeCheck(result); - return result; -} - -ASTNode createTerm(Kind k, int width, const ASTNode& n1, const ASTNode& n2, STPMgr* beev) -{ - ASTNode result = beev->CreateTerm(k, width, n1, n2); - BVTypeCheck(result); - return result; -} - -ASTNode createNode(Kind k, const ASTNode& n1, const ASTNode& n2, STPMgr* beev) -{ - ASTNode result = beev->CreateNode(k, n1, n2); - BVTypeCheck(result); - return result; -} - -ASTNode createTerm(Kind k, int width, const ASTNode& n1, const ASTNode& n2, const ASTNode& n3, STPMgr* beev) -{ - ASTNode result = beev->CreateTerm(k, width, n1, n2, n3); - BVTypeCheck(result); - return result; -} - -////////////////////////////////////////////////// - -// Concretisation function. Gamma. -void concretise(const ASTNode& variable, const FixedBits& fixed, ASTVec& list, STPMgr* beev) -{ - if (BOOLEAN_TYPE == variable.GetType()) - { - assert(1 == fixed.getWidth()); - assert(fixed.isBoolean()); - - if (fixed.isFixed(0)) - { - ASTNode assert; - if (!fixed.getValue(0)) // if it's false, try to find a true assignment. - assert = variable; - else - assert = beev->CreateNode(NOT, variable); - list.push_back(assert); - } - } - else - { - assert(BITVECTOR_TYPE == variable.GetType()); - assert(variable.GetValueWidth() == (unsigned)fixed.getWidth()); - for (int i = 0; i < fixed.getWidth(); i++) - { - if (fixed.isFixed(i)) - { - ASTNode oneOrZero = createConstant(1, fixed.getValue(i) ? 0 : -1, beev); // NB: swapped. - ASTNode location = createConstant(32, i, beev); - ASTNode extract = createTerm(BVEXTRACT, 1, variable, location, location, beev); - ASTNode assert = createNode(EQ, extract, oneOrZero, beev); - list.push_back(assert); - } - } - } -} - - -// Concretisation function. Gamma. -void concretise(const ASTNode& variable, const FixedBits& fixed, SATSolver::vec_literals& satSolverClause, STPMgr* beev, ToSATBase::ASTNodeToSATVar& map) -{ - if (BOOLEAN_TYPE == variable.GetType()) - { - assert(1 == fixed.getWidth()); - assert(fixed.isBoolean()); - - if (fixed.isFixed(0)) - { - if (!fixed.getValue(0)) // if it's false, try to find a true assignment. - { - assert(map.find(variable) != map.end()); - int v = (map.find(variable)->second)[0]; - satSolverClause.push(SATSolver::mkLit(v, false)); - } - else - { - assert(map.find(variable) != map.end()); - int v = (map.find(variable)->second)[0]; - satSolverClause.push(SATSolver::mkLit(v, true)); - } - - } - } - else - { - assert(BITVECTOR_TYPE == variable.GetType()); - assert(variable.GetValueWidth() == (unsigned)fixed.getWidth()); - for (int i = 0; i < fixed.getWidth(); i++) - { - if (fixed.isFixed(i)) - { - assert(map.find(variable) != map.end()); - int v = (map.find(variable)->second)[i]; - satSolverClause.push(SATSolver::mkLit(v, fixed.getValue(i))); - } - } - } -} - - -// Concretisation function. Gamma. -void concretiseB(const ASTNode& variable, const ASTNode& min, const ASTNode& max, ASTVec& list, STPMgr* beev) -{ - assert(min.isConstant()); - assert(max.isConstant()); - - if (BOOLEAN_TYPE == variable.GetType()) - { - assert(false); // not yet implemented. - } - else - { - assert(BITVECTOR_TYPE == variable.GetType()); - ASTNode assert = createNode(BVLT, variable, min, beev); - list.push_back(assert); - - assert = createNode(BVGT, variable, max, beev); - list.push_back(assert); - } -} - - - - -bool fix(FixedBits& a, const FixedBits& b, const int i); - - -Result fix(FixedBits& b, BEEV::CBV low, BEEV::CBV high); - - - -// The bitWidth isn't necessarily the same for all children. e.g. ITE(boolean, x-bit, x-bit) -bool maxBoundsPrecision(vector children, FixedBits& output, Kind kind, STPMgr* beev) -{ - const int numberOfChildren = children.size(); - - bool disabledProp = !beev->UserFlags.bitConstantProp_flag; - bool printOutput = beev->UserFlags.print_output_flag; - - beev->UserFlags.bitConstantProp_flag = false; - beev->UserFlags.print_output_flag = false; - - ASTVec initialFixing; - - //Create a variable to represent each input, and one for the output. - ASTVec variables; - for (int i = 0; i < numberOfChildren; i++) - { - std::stringstream out; - out << "v" << i; - - unsigned valueWidth; - - if (children[i]->isBoolean()) - valueWidth = 0; - else - valueWidth = (children[i]->getWidth()); - - ASTNode node = beev->CreateSymbol(out.str().c_str(), 0, valueWidth); - variables.push_back(node); - - // constrain the fixed bits of each input variable not to change. - concretise(node, *children[i], initialFixing, beev); - } - - unsigned outputWidth = output.isBoolean()? 0: output.getWidth(); - ASTNode outputNode = beev->CreateSymbol("result",0,outputWidth); - - ASTNode expr; - if (output.isBoolean()) - { - ASTNode p1 = beev->CreateNode(kind, variables); - BVTypeCheck(p1); - expr = createNode(IFF, p1, outputNode, beev); - } - else - { - ASTNode p1 = beev->CreateTerm(kind, output.getWidth(), variables); - BVTypeCheck(p1); - expr = createNode(EQ, p1, outputNode, beev); - } - - // constrain the input to equal the output. - BVTypeCheck(expr); - - // constrain the fixed parts of the output node not to change. - concretise(outputNode, output, initialFixing, beev); - - ASTVec notted; - for (ASTVec::const_iterator i = initialFixing.begin(); i != initialFixing.end(); i++) - notted.push_back(beev->CreateNode(NOT, *i)); - - if (notted.size() > 0) // some are specified. - { - expr = beev->CreateNode(BEEV::AND, expr, beev->CreateNode(BEEV::AND, notted)); - } - - bool first = true; - ASTVec ors; - ASTNode total = beev->ASTTrue; - Simplifier simp(beev); - ArrayTransformer at(beev,&simp); - AbsRefine_CounterExample ce(beev,&simp,&at); - ToSAT tosat(beev); - bool timeout = false; - MinisatCore newS(timeout); - - vector min_children(children.size()); - vector max_children(children.size()); - ASTNode min_output; - ASTNode max_output; - - - while (true) - { - ASTNode toSolve; - - if (first) - { - toSolve = expr; - } - else - { - assert(ors.size() !=0); - if (ors.size() > 1) - toSolve = beev->CreateNode(BEEV::OR, ors); - else - toSolve = ors[0]; - ors.clear(); - } - - BVTypeCheck(toSolve); - - // Some operations aren't bitblasted directly. For example sbvmod is converted into - // other operations first. - //ArrayTransformer(STPMgr * bm, Simplifier* s, NodeFactory &nodeFactory_) : - - toSolve = at.TransformFormula_TopLevel(toSolve); - total= beev->CreateNode(AND, total, toSolve); - int result = ce.CallSAT_ResultCheck(newS, total, total, &tosat,true); - - if (2 == result) - FatalError("error from solver"); - else if (1 == result) - { - break; // UNSAT use the last one.. - } - - if (first) - { - // Don't do the meet the first time through. Set the input and output. - - for (int i = 0; i < numberOfChildren; i++) - { - ASTNode n = (ce.GetCounterExample(true, variables[i])); - min_children[i] = n; - max_children[i] = n; - concretiseB(variables[i], n,n, ors, beev); - } - - ASTNode n = (ce.GetCounterExample(true, outputNode)); - min_output = n; - max_output = n; - concretiseB(outputNode,n,n, ors, beev); - } - else - { - for (int i = 0; i < numberOfChildren; i++) - { - ASTNode n = (ce.GetCounterExample(true, variables[i])); - //cerr << variables[i].GetName() << " " << n << endl; - ASTNode t = beev->CreateNode(BVLT, n, min_children[i]); - if (beev->ASTTrue == NonMemberBVConstEvaluator(t)) - min_children[i] = n; - t = beev->CreateNode(BVGT, n, max_children[i]); - if (beev->ASTTrue == NonMemberBVConstEvaluator(t)) - max_children[i] = n; - concretiseB(variables[i], min_children[i], max_children[i], ors, beev); - } - - - ASTNode n = (ce.GetCounterExample(true, outputNode)); - //cerr << variables[i].GetName() << " " << n << endl; - ASTNode t = beev->CreateNode(BVLT, n, min_output); - if (beev->ASTTrue == NonMemberBVConstEvaluator(t)) - min_output = n; - t = beev->CreateNode(BVGT, n, max_output); - if (beev->ASTTrue == NonMemberBVConstEvaluator(t)) - max_output = n; - concretiseB(outputNode, min_output, max_output, ors, beev); - } - - first = false; - - //print(children, output, kind); - - if (0 == ors.size()) - break; // everything is at top. - - //beev->AddAssert(beev->CreateNode(BEEV::OR, ors)); - } - - if (!first) - { - for (int i = 0; i < numberOfChildren; i++) - { - simplifier::constantBitP::fix(*children[i], min_children[i].GetBVConst(), max_children[i].GetBVConst()); - } - - simplifier::constantBitP::fix(output, min_output.GetBVConst(), max_output.GetBVConst()); - } - - - //beev->ClearSATTables(); - //beev->ClearAllCaches(); - - // The first time we AddAsserts() it creates a new ASTVec to store them (on the heap). - beev->Pop(); - - beev->UserFlags.bitConstantProp_flag = !disabledProp; - beev->UserFlags.print_output_flag = printOutput; - - return first; -} - -// The bitWidth isn't necessarily the same for all children. e.g. ITE(boolean, x-bit, x-bit) -bool maxPrecision(vector children, FixedBits& output, Kind kind, STPMgr* beev) -{ - const int numberOfChildren = children.size(); - - bool disabledProp = !beev->UserFlags.bitConstantProp_flag; - bool printOutput = beev->UserFlags.print_output_flag; - bool checkCounter = beev->UserFlags.check_counterexample_flag; - - beev->UserFlags.bitConstantProp_flag = false; - beev->UserFlags.print_output_flag = false; - beev->UserFlags.check_counterexample_flag= false; - - ASTVec initialFixing; - - //Create a variable to represent each input, and one for the output. - ASTVec variables; - for (int i = 0; i < numberOfChildren; i++) - { - std::stringstream out; - out << "v_VERY_SPECIALLY_NAMES" << i; - - unsigned valueWidth; - - if (children[i]->isBoolean()) - valueWidth = 0; - else - valueWidth = (children[i]->getWidth()); - - ASTNode node = beev->CreateSymbol(out.str().c_str(), 0, valueWidth); - variables.push_back(node); - - // constrain the fixed bits of each input variable not to change. - concretise(node, *children[i], initialFixing, beev); - } - - unsigned outputWidth = output.isBoolean()? 0: output.getWidth(); - ASTNode outputNode = beev->CreateSymbol("result_WITH_SPECIAL_NAME",0,outputWidth); - - ASTNode expr; - if (output.isBoolean()) - { - ASTNode p1 = beev->CreateNode(kind, variables); - BVTypeCheck(p1); - expr = createNode(IFF, p1, outputNode, beev); - } - else - { - ASTNode p1 = beev->CreateTerm(kind, output.getWidth(), variables); - BVTypeCheck(p1); - expr = createNode(EQ, p1, outputNode, beev); - } - - // constrain the input to equal the output. - BVTypeCheck(expr); - - // constrain the fixed parts of the output node not to change. - concretise(outputNode, output, initialFixing, beev); - - ASTVec notted; - for (ASTVec::const_iterator i = initialFixing.begin(); i != initialFixing.end(); i++) - notted.push_back(beev->CreateNode(NOT, *i)); - - if (notted.size() > 0) // some are specified. - { - expr = beev->CreateNode(BEEV::AND, expr, beev->CreateNode(BEEV::AND, notted)); - } - - - bool first = true; - Simplifier simp(beev); - ArrayTransformer at(beev,&simp); - AbsRefine_CounterExample ce(beev,&simp,&at); - bool timeout = false; - MinisatCore newS(timeout); - - ToSATAIG tosat(beev,&at); - - SATSolver::vec_literals satSolverClause; - - while (true) - { - - int result; - - if (first) - { - beev->AddQuery(beev->ASTUndefined); - result = ce.CallSAT_ResultCheck(newS, expr, expr, &tosat,true); - } - else - { - assert(satSolverClause.size() > 0); - newS.addClause(satSolverClause); - satSolverClause.clear(); - - beev->AddQuery(beev->ASTUndefined); - result = ce.CallSAT_ResultCheck(newS, beev->ASTTrue, beev->ASTTrue, &tosat,true); - } - - if (2 == result) - FatalError("error from solver"); - else if (1 == result) - { - break; // UNSAT use the last one.. - } - - if (first) - { - // Don't do the meet the first time through. Set the input and output. - - for (int i = 0; i < numberOfChildren; i++) - { - ASTNode n = (ce.GetCounterExample(true, variables[i])); - *children[i] = FixedBits::concreteToAbstract(n); - concretise(variables[i], *(children[i]), satSolverClause, beev, tosat.SATVar_to_SymbolIndexMap()); - } - - ASTNode n = (ce.GetCounterExample(true, outputNode)); - output = FixedBits::concreteToAbstract(n); - //cerr << resultNode.GetName() << " " << n << endl; - concretise(outputNode, output, satSolverClause, beev, tosat.SATVar_to_SymbolIndexMap()); - } - else - { - for (int i = 0; i < numberOfChildren; i++) - { - ASTNode n = (ce.GetCounterExample(true, variables[i])); - //cerr << variables[i].GetName() << " " << n << endl; - *children[i] = FixedBits::meet(FixedBits::concreteToAbstract(n), *children[i]); - concretise(variables[i], *(children[i]), satSolverClause, beev, tosat.SATVar_to_SymbolIndexMap()); - } - - ASTNode n = (ce.GetCounterExample(true, outputNode)); - output = FixedBits::meet(FixedBits::concreteToAbstract(n), output); - //cerr << resultNode.GetName() << " " << n << endl; - concretise(outputNode, output, satSolverClause, beev,tosat.SATVar_to_SymbolIndexMap()); - - } - - first = false; - - if (satSolverClause.size() == 0) - break; // everything is at top. - } - - beev->UserFlags.bitConstantProp_flag = !disabledProp; - beev->UserFlags.print_output_flag = printOutput; - beev->UserFlags.check_counterexample_flag= checkCounter; - - return first; -} -} -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_MaxPrecision.h b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_MaxPrecision.h deleted file mode 100644 index 52e5196c0..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_MaxPrecision.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef CONSTANTBITPROPAGATION_MAXPRECISION_H_ -#define CONSTANTBITPROPAGATION_MAXPRECISION_H_ - -#include "ConstantBitPropagation.h" -#include -#include "FixedBits.h" -#include "../../AST/ASTKind.h" - - - -namespace simplifier -{ -namespace constantBitP -{ - - enum Direction - { - UPWARDS_ONLY, BOTH_WAYS - }; - - // This is used for very specific purposes. - enum Type - { - BOOL_TYPE, VALUE_TYPE - }; - -struct Signature -{ - BEEV::Kind kind; - Type resultType; - Type inputType; - int maxInputWidth; - int numberOfInputs; - Direction direction; - bool imprecise; - Signature() - { - imprecise=false; - } -}; - -bool maxPrecision(std::vector children, FixedBits& output, BEEV::Kind kind, BEEV::STPMgr* beev); -} -} - -#endif /* CONSTANTBITPROPAGATION_MAXPRECISION_H_ */ diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Multiplication.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Multiplication.cpp deleted file mode 100644 index 5662ac4ec..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Multiplication.cpp +++ /dev/null @@ -1,689 +0,0 @@ -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_Utility.h" -#include -#include -#include "../../AST/AST.h" -#include "../../simplifier/simplifier.h" -#include "MultiplicationStats.h" -#include "multiplication/ColumnCounts.h" -#include "multiplication/ColumnStats.h" -// Multiply. - -namespace simplifier -{ - namespace constantBitP - { - using std::endl; - using std::pair; - using std::set; - - const bool debug_multiply = false; - std::ostream& log = std::cerr; - -#if 0 -// The maximum size of the carry into a column for MULTIPLICATION - int - maximumCarryInForMultiplication(int column) - { - int result = 0; - int currIndex = 0; - - while (currIndex < column) - { - currIndex++; - result = (result + currIndex) / 2; - } - - return result; - } -#endif - - Result - fixIfCanForMultiplication(vector& children, const int index, const int aspirationalSum) - { - assert(index >=0); - assert(index < children[0]->getWidth()); - - FixedBits& x = *children[0]; - FixedBits& y = *children[1]; - - ColumnStats cs(x, y, index); - - int columnUnfixed = cs.columnUnfixed; // both unfixed. - int columnOneFixed = cs.columnOneFixed; // one of the values is fixed to one. - int columnOnes = cs.columnOnes; // both are ones. - - Result result = NO_CHANGE; - - // only one of the conditionals can run. - bool run = false; - - // We need every value that is unfixed to be set to one. - if (aspirationalSum == columnOnes + columnOneFixed + columnUnfixed && ((columnOneFixed + columnUnfixed) > 0)) - { - for (unsigned i = 0; i <= (unsigned) index; i++) - { - // If y is unfixed, and it's not anded with zero. - if (!y.isFixed(i) && !(x.isFixed(index - i) && !x.getValue(index - i))) - { - y.setFixed(i, true); - y.setValue(i, true); - result = CHANGED; - } - - if (!x.isFixed(index - i) && !(y.isFixed(i) && !y.getValue(i))) - { - x.setFixed(index - i, true); - x.setValue(index - i, true); - result = CHANGED; - } - }assert(result == CHANGED); - run = true; - } - - // We have all the ones that we need already. (thanks). Set everything we can to zero. - if (aspirationalSum == columnOnes && (columnUnfixed > 0 || columnOneFixed > 0)) - { - assert(!run); - for (unsigned i = 0; i <= (unsigned) index; i++) - { - if (!y.isFixed(i) && x.isFixed(index - i) && x.getValue(index - i)) // one fixed. - - { - y.setFixed(i, true); - y.setValue(i, false); - result = CHANGED; - } - - if (!x.isFixed(index - i) && y.isFixed(i) && y.getValue(i)) // one fixed other way. - { - x.setFixed(index - i, true); - x.setValue(index - i, false); - result = CHANGED; - } - } - } - if (debug_multiply && result == CONFLICT) - log << "CONFLICT" << endl; - - return result; - } - -// Uses the zeroes / ones present adjust the column counts. - Result - adjustColumns(const FixedBits& x, const FixedBits& y, int* columnL, int * columnH) - { - const unsigned bitWidth = x.getWidth(); - - bool yFixedFalse[bitWidth]; - bool xFixedFalse[bitWidth]; - - for (unsigned i = 0; i < bitWidth; i++) - { - yFixedFalse[i] = y.isFixed(i) && !y.getValue(i); - xFixedFalse[i] = x.isFixed(i) && !x.getValue(i); - } - - for (unsigned i = 0; i < bitWidth; i++) - { - // decrease using zeroes. - if (yFixedFalse[i]) - { - for (unsigned j = i; j < bitWidth; j++) - { - columnH[j]--; - } - } - - if (xFixedFalse[i]) - { - for (unsigned j = i; j < bitWidth; j++) - { - // if the row hasn't already been zeroed out. - if (!yFixedFalse[j - i]) - columnH[j]--; - } - } - - // check if there are any pairs of ones. - if (x.isFixed(i) && x.getValue(i)) - for (unsigned j = 0; j < (bitWidth - i); j++) - { - assert(i + j < bitWidth); - if (y.isFixed(j) && y.getValue(j)) - { - // a pair of ones. Increase the lower bound. - columnL[i + j]++; - } - } - } - return NO_CHANGE; - } - - Result - setToZero(FixedBits& y, int from, int to) - { - Result r = NO_CHANGE; - assert(from<=to); - assert(from>= 0); - assert(to <= y.getWidth()); - - /***NB < to ***/ - for (int i = from; i < to; i++) - { - if (y[i] == '*') - { - y.setFixed(i, true); - y.setValue(i, false); - r = CHANGED; - } - else if (y[i] == '1') - return CONFLICT; - } - return r; - } - -// Finds the leading one in each of the two inputs. -// If this position is i & j, then in the output -// there can be no ones higher than i+j+1. - Result - useLeadingZeroesToFix_OLD(FixedBits& x, FixedBits&y, FixedBits& output) - { - // Count the leading zeroes on x & y. - // Output should have about that many.. - int xTop = x.topmostPossibleLeadingOne(); - int yTop = y.topmostPossibleLeadingOne(); - - int maxOutputOneFromInputs = xTop + yTop + 1; - - for (int i = output.getWidth() - 1; i > maxOutputOneFromInputs; i--) - if (!output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, false); - } - else - { - if (output.getValue(i)) - return CONFLICT; - } - - return NOT_IMPLEMENTED; - } - - Result - useLeadingZeroesToFix(FixedBits& x, FixedBits&y, FixedBits& output) - { - // To check that the new implementation subsumes the old. -#ifndef NDEBUG - FixedBits x_p = x; - FixedBits y_p = y; - FixedBits o_p = output; - useLeadingZeroesToFix_OLD(x_p, y_p, o_p); -#endif - - const int bitWidth = x.getWidth(); - CBV x_c = CONSTANTBV::BitVector_Create(2 * bitWidth, true); - CBV y_c = CONSTANTBV::BitVector_Create(2 * bitWidth, true); - - for (int i = 0; i < bitWidth; i++) - { - if (x[i] == '1' || x[i] == '*') - CONSTANTBV::BitVector_Bit_On(x_c, i); - - if (y[i] == '1' || y[i] == '*') - CONSTANTBV::BitVector_Bit_On(y_c, i); - } - - BEEV::CBV result = CONSTANTBV::BitVector_Create(2 * bitWidth + 1, true); - CONSTANTBV::ErrCode ec = CONSTANTBV::BitVector_Multiply(result, x_c, y_c); - assert(ec == CONSTANTBV::ErrCode_Ok); - - for (int j = (2 * bitWidth) - 1; j >= 0; j--) - { - if (CONSTANTBV::BitVector_bit_test(result, j)) - break; - if (j < bitWidth) - { - if (!output.isFixed(j)) - { - output.setFixed(j, true); - output.setValue(j, false); - } - else - { - if (output.getValue(j)) - return CONFLICT; - } - - } - } - -#ifndef NDEBUG - // Assert the new implementation fixes more than the old. - assert(FixedBits::in(x,x_p )); - assert(FixedBits::in(y,y_p )); - assert(FixedBits::in(output, o_p)); -#endif - - CONSTANTBV::BitVector_Destroy(x_c); - CONSTANTBV::BitVector_Destroy(y_c); - CONSTANTBV::BitVector_Destroy(result); - - return NOT_IMPLEMENTED; - } - - Result - trailingOneReasoning_OLD(FixedBits& x, FixedBits&y, FixedBits& output); - - - // Remove from x any trailing "boths", that don't have support in y and output. - Result - trailingOneReasoning(FixedBits& x, FixedBits&y, FixedBits& output) - { - Result r = NO_CHANGE; - - const int bitwidth = output.getWidth(); - - const int y_min = y.minimum_trailingOne(); - const int y_max = y.maximum_trailingOne(); - - const int output_max = output.maximum_trailingOne(); - - for (int i = 0; i < bitwidth; i++) - { - if (x[i] == '0') - continue; - - if (x[i] == '1') - break; - - for (int j = y_min; j <= std::min(y_max, output_max); j++) - { - if (j + i >= bitwidth || (y[j] != '0' && output[i + j] != '0')) - return r; - } - - x.setFixed(i, true); - x.setValue(i, false); - r = CHANGED; - } - - assert(trailingOneReasoning_OLD(x,y,output) == NO_CHANGE); - return r; - } - -// Remove from x any trailing "boths", that don't have support in y and output. - Result - trailingOneReasoning_OLD(FixedBits& x, FixedBits&y, FixedBits& output) - { - Result r = NO_CHANGE; - - const int bitwidth = output.getWidth(); - - const int x_min = x.minimum_trailingOne(); - const int x_max = x.maximum_trailingOne(); - - const int y_min = y.minimum_trailingOne(); - const int y_max = y.maximum_trailingOne(); - - int output_max = output.maximum_trailingOne(); - - bool done = false; - for (int i = x_min; i <= std::min(x_max, bitwidth - 1); i++) - { - if (x[i] == '1') - break; - - if (x[i] == '0') - continue; - - assert(!done); - for (int j = y_min; j <= std::min(y_max, output_max); j++) - { - if (j + i >= bitwidth || (y[j] != '0' && output[i + j] != '0')) - { - done = true; - break; - } - } - if (!done) - { - x.setFixed(i, true); - x.setValue(i, false); - r = CHANGED; - } - else - break; - } - return r; - } - -// if x has n trailing zeroes, and y has m trailing zeroes, then the output has n+m trailing zeroes. -// if the output has n trailing zeroes and x has p trailing zeroes, then y has n-p trailing zeroes. - Result - useTrailingZeroesToFix(FixedBits& x, FixedBits&y, FixedBits& output) - { - const int bitwidth = output.getWidth(); - - Result r0 = trailingOneReasoning(x, y, output); - Result r1 = trailingOneReasoning(y, x, output); - - //Calculate the minimum number of trailing zeroes in the operands, - //the result has a >= number. - int min = x.minimum_numberOfTrailingZeroes() + y.minimum_numberOfTrailingZeroes(); - min = std::min(min, bitwidth); - - Result r2 = setToZero(output, 0, min); - if (r2 == CONFLICT) - return CONFLICT; - - if (r0 == CHANGED || r1 == CHANGED || r2 == CHANGED) - return CHANGED; - - return NO_CHANGE; - } - - Result - useInversesToSolve(FixedBits& x, FixedBits&y, FixedBits& output, BEEV::STPMgr* bm) - { - // Position of the first unfixed value +1. - int xBottom = x.leastUnfixed(); - int yBottom = y.leastUnfixed(); - int outputBottom = output.leastUnfixed(); - - int invertCount = std::min(std::max(xBottom, yBottom), outputBottom); - - if (invertCount == 0) - return NO_CHANGE; - - FixedBits* toInvert; - FixedBits* toSet; - - if (xBottom > yBottom) - { - toInvert = &x; - toSet = &y; - } - else - { - toInvert = &y; - toSet = &x; - } - - invertCount--; // position of the least fixed. - - const unsigned int width = invertCount + 1; - BEEV::CBV toInvertCBV = toInvert->GetBVConst(invertCount, 0); - - //cerr << "value to invert:" << *toInvertCBV << " "; - - Result status = NOT_IMPLEMENTED; - - if (CONSTANTBV::BitVector_bit_test(toInvertCBV, 0)) - { - - if (debug_multiply) - cerr << "Value to Invert:" << *toInvertCBV << endl; - - BEEV::Simplifier simplifier(bm); - BEEV::CBV inverse = simplifier.MultiplicativeInverse(bm->CreateBVConst(toInvertCBV, width)).GetBVConst(); - BEEV::CBV toMultiplyBy = output.GetBVConst(invertCount, 0); - - BEEV::CBV toSetEqualTo = CONSTANTBV::BitVector_Create(2 * (width), true); - - CONSTANTBV::ErrCode ec = CONSTANTBV::BitVector_Multiply(toSetEqualTo, inverse, toMultiplyBy); - if (ec != CONSTANTBV::ErrCode_Ok) - { - assert(false); - throw 2314231; - } - - if (false && debug_multiply) - { - cerr << x << "*" << y << "=" << output << endl; - cerr << "Invert bit count" << invertCount << endl; - cerr << "To set" << *toSet; - cerr << "To set equal to:" << *toSetEqualTo << endl; - } - - // Write in the value. - for (int i = 0; i <= invertCount; i++) - { - bool expected = CONSTANTBV::BitVector_bit_test(toSetEqualTo, i); - - if (toSet->isFixed(i) && (toSet->getValue(i) ^ expected)) - { - status = CONFLICT; - } - else if (!toSet->isFixed(i)) - { - toSet->setFixed(i, true); - toSet->setValue(i, expected); - } - } - - // Don't delete the "inverse" because it's reference counted by the ASTNode. - - CONSTANTBV::BitVector_Destroy(toSetEqualTo); - CONSTANTBV::BitVector_Destroy(toMultiplyBy); - - //cerr << "result" << *toSet; - } - else - CONSTANTBV::BitVector_Destroy(toInvertCBV); - - //cerr << endl; - return status; - } - -// Use trailing fixed to fix. -// Create two constants and multiply them out fixing the result. - Result - useTrailingFixedToFix(FixedBits& x, FixedBits&y, FixedBits& output) - { - int xBottom = x.leastUnfixed(); - int yBottom = y.leastUnfixed(); - - int minV = std::min(xBottom, yBottom); - - if (minV == 0) - return NO_CHANGE; // nothing determined. - - // It gives the position of the first non-fixed. We want the last fixed. - minV--; - - // The multiply doesn't like to overflow. So we widen the output. - BEEV::CBV xCBV = x.GetBVConst(minV, 0); - BEEV::CBV yCBV = y.GetBVConst(minV, 0); - BEEV::CBV result = CONSTANTBV::BitVector_Create(2 * (minV + 1), true); - - CONSTANTBV::ErrCode ec = CONSTANTBV::BitVector_Multiply(result, xCBV, yCBV); - if (ec != CONSTANTBV::ErrCode_Ok) - { - assert(false); - throw 2314231; - } - - Result status = NOT_IMPLEMENTED; - for (int i = 0; i <= minV; i++) - { - bool expected = CONSTANTBV::BitVector_bit_test(result, i); - - if (output.isFixed(i) && (output.getValue(i) ^ expected)) - status = CONFLICT; - else if (!output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, expected); - } - } - - CONSTANTBV::BitVector_Destroy(xCBV); - CONSTANTBV::BitVector_Destroy(yCBV); - CONSTANTBV::BitVector_Destroy(result); - - return status; - } - - void - printColumns(signed *sumL, signed * sumH, int bitWidth) - { - for (int i = 0; i < bitWidth; i++) - { - log << sumL[bitWidth - 1 - i] << " "; - } - log << endl; - for (int i = 0; i < bitWidth; i++) - { - log << sumH[bitWidth - 1 - i] << " "; - } - log << endl; - } - - Result - bvMultiplyBothWays(vector& children, FixedBits& output, BEEV::STPMgr* bm, MultiplicationStats* ms) - { - FixedBits & x = *children[0]; - FixedBits & y = *children[1]; - - assert(x.getWidth() == y.getWidth()); - assert(x.getWidth() == output.getWidth()); - - const unsigned bitWidth = x.getWidth(); - - if (debug_multiply) - cerr << "======================" << endl; - - if (debug_multiply) - { - cerr << "Initial Fixing"; - cerr << x << "*"; - cerr << y << "="; - cerr << output << endl; - } - - Result r = useTrailingZeroesToFix(x, y, output); - if (CONFLICT == r) - return r; - - bool changed = true; - while (changed) - { - changed = false; - signed columnH[bitWidth]; // maximum number of true partial products. - signed columnL[bitWidth]; // minimum "" "" - signed sumH[bitWidth]; - signed sumL[bitWidth]; - - ColumnCounts cc(columnH, columnL, sumH, sumL, bitWidth, output); - - // Use the number of zeroes and ones in a column to update the possible counts. - adjustColumns(x, y, columnL, columnH); - - cc.rebuildSums(); - Result r = cc.fixedPoint(); - - if (r == CONFLICT) - return CONFLICT; - - r = NO_CHANGE; - - // If any of the sums have a cardinality of 1. Set the result. - for (unsigned column = 0; column < bitWidth; column++) - { - if (cc.sumL[column] == cc.sumH[column]) - { - //(1) If the output has a known value. Set the output. - bool newValue = !(sumH[column] % 2 == 0); - if (!output.isFixed(column)) - { - output.setFixed(column, true); - output.setValue(column, newValue); - r = CHANGED; - } - else if (output.getValue(column) != newValue) - return CONFLICT; - } - } - - if (CHANGED == r) - changed = true; - - for (unsigned column = 0; column < bitWidth; column++) - { - if (cc.columnL[column] == cc.columnH[column]) - { - //(2) Knowledge of the sum may fix the operands. - Result tempResult = fixIfCanForMultiplication(children, column, cc.columnH[column]); - - if (CONFLICT == tempResult) - return CONFLICT; - - if (CHANGED == tempResult) - r = CHANGED; - } - } - - if (debug_multiply) - { - cerr << "At end"; - cerr << "x:" << x << endl; - cerr << "y:" << y << endl; - cerr << "output:" << output << endl; - } - - assert(CONFLICT != r); - - if (CHANGED == r) - changed = true; - - if (ms != NULL) - { - *ms = MultiplicationStats(bitWidth, cc.columnL, cc.columnH, cc.sumL, cc.sumH); - ms->x = *children[0]; - ms->y = *children[1]; - ms->r = output; - } - - if (changed) - { - useTrailingZeroesToFix(x, y, output); - // if (r == NO_CHANGE) - // changed= false; - } - } - - if (children[0]->isTotallyFixed() && children[1]->isTotallyFixed()) - { - assert(output.isTotallyFixed()); - } - -// The below assertions are for performance only. It's not maximally precise anyway!!! - -#ifndef NDEBUG - if (r != CONFLICT) - { - FixedBits x_c(x), y_c(y), o_c(output); - - // These are subsumed by the consistency over the columns.. - useTrailingFixedToFix(x_c, y_c, o_c); - useLeadingZeroesToFix(x_c, y_c, o_c); - useInversesToSolve(x_c, y_c, o_c, bm); - - // This one should have been called to fixed point! - useTrailingZeroesToFix(x_c, y_c, o_c); - - if (!FixedBits::equals(x_c, x) || !FixedBits::equals(y_c, y) || !FixedBits::equals(o_c, output)) - { - cerr << x << y << output << endl; - cerr << x_c << y_c << o_c << endl; - assert(false); - } - } -#endif - - return NOT_IMPLEMENTED; - } - } -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Shifting.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Shifting.cpp deleted file mode 100644 index c9af59c6d..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Shifting.cpp +++ /dev/null @@ -1,927 +0,0 @@ -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_Utility.h" -#include "../../extlib-constbv/constantbv.h" - -// Left shift, right shift. -// Trevor Hansen. BSD License. - -// smtlib & x86 semantics differ for what happens when a value is shifted by greater -// than the bitWidth. On x86, in 64-bit mode, only the bottom 6 bits of the shift are -// used. In SMTLIB the total value is used. - - -namespace simplifier -{ -namespace constantBitP -{ - -const bool debug_shift = false; - -Result bvRightShiftBothWays(vector& children, FixedBits& output) -{ - Result result = NO_CHANGE; - const unsigned bitWidth = output.getWidth(); - - assert(2 == children.size()); - - FixedBits& op = *children[0]; - FixedBits& shift = *children[1]; - - FixedBits outputReverse(bitWidth,false); - FixedBits opReverse(bitWidth,false); - - // Reverse the output and the input. - for (unsigned i =0; i < bitWidth;i++) - { - if (op.isFixed(i)) - { - opReverse.setFixed(bitWidth-1-i,true); - opReverse.setValue(bitWidth-1-i,op.getValue(i)); - } - - if (output.isFixed(i)) - { - outputReverse.setFixed(bitWidth-1-i,true); - outputReverse.setValue(bitWidth-1-i,output.getValue(i)); - } - } - - vector args; - args.push_back(&opReverse); - args.push_back(&shift); // shift is unmodified. - result = bvLeftShiftBothWays(args, outputReverse); - - if (CONFLICT == result) - return CONFLICT; - - // Now write the reversed values back. - // Reverse the output and the input. - for (unsigned i =0; i < bitWidth;i++) - { - if (opReverse.isFixed(i) && !op.isFixed(bitWidth-1-i)) - { - op.setFixed(bitWidth-1-i,true); - op.setValue(bitWidth-1-i,opReverse.getValue(i)); - } - - if (outputReverse.isFixed(i) && !output.isFixed(bitWidth-1-i)) - { - output.setFixed(bitWidth-1-i,true); - output.setValue(bitWidth-1-i,outputReverse.getValue(i)); - } - } - - return result; -} - -// Converts the array of possible shifts into a set that represents the values. -FixedBits getPossible(unsigned bitWidth, bool possibleShift[], unsigned numberOfPossibleShifts, const FixedBits& shift) -{ - FixedBits v(bitWidth, false); - bool first = true; - for (unsigned i = 0; i < numberOfPossibleShifts - 1; i++) - { - if (possibleShift[i]) - { - if (first) - { - first = false; - for (unsigned j = 0; j < (unsigned) v.getWidth(); j++) - { - v.setFixed(j, true); - if (j < sizeof(unsigned) * 8) - v.setValue(j, 0 != (i & (1 << j))); - else - v.setValue(j, false); - } - } - else - { - // join. - for (unsigned j = 0; j < (unsigned) v.getWidth() && j - < sizeof(unsigned) * 8; j++) - { - if (v.isFixed(j)) - { - // union. - if (v.getValue(j) != (0 != (i & (1 << j)))) - v.setFixed(j, false); - } - } - } - } - } - - unsigned firstShift; - for (firstShift=0; firstShiftbitWidth - // in this function. - if (possibleShift[numberOfPossibleShifts - 1]) - { - FixedBits bitWidthFB = FixedBits::fromUnsignedInt(bitWidth, bitWidth); - FixedBits output(1, true); - output.setFixed(0, true); - output.setValue(0, true); - FixedBits working(shift); - - vector args; - args.push_back(&working); - args.push_back(&bitWidthFB); - - //Write into working anything that can be determined given it's >=bitWidth. - Result r = bvGreaterThanEqualsBothWays(args,output); - assert(CONFLICT != r); - - // Get the union of "working" with the prior union. - for (unsigned i = 0; i < bitWidth; i++) - { - if (!working.isFixed(i) && v.isFixed(i)) - v.setFixed(i, false); - if (working.isFixed(i) && v.isFixed(i) && (working.getValue(i) != v.getValue(i))) - v.setFixed(i, false); - if (firstShift == numberOfPossibleShifts - 1) // no less shifts possible. - { - if (working.isFixed(i)) - { - v.setFixed(i, true); - v.setValue(i, working.getValue(i)); - } - } - } - } - - if (debug_shift) - cerr << "Set of possible shifts:" << v << endl; - - return v; -} - - -unsigned getMaxShiftFromValueViaAlternation(const unsigned bitWidth, const FixedBits& output) -{ - unsigned maxShiftFromValue = UINT_MAX; - - // The shift must be less than the position of the first alternation. - bool foundTrue = false; - bool foundFalse = false; - for (int i = bitWidth - 1; i >= 0; i--) - { - if (output.isFixed(i)) - { - if (output.getValue(i) && foundFalse) - { - maxShiftFromValue = i; - break; - } - if (!output.getValue(i) && foundTrue) - { - maxShiftFromValue = i; - break; - } - if (output.getValue(i)) - foundTrue = true; - else if (!output.getValue(i)) - foundFalse = true; - } - } - - if (maxShiftFromValue != UINT_MAX) - maxShiftFromValue = bitWidth - 2 - maxShiftFromValue; - - return maxShiftFromValue; -} - -Result bvArithmeticRightShiftBothWays(vector& children, FixedBits& output) -{ - const unsigned bitWidth = output.getWidth(); - assert(2== children.size()); - assert(bitWidth > 0); - assert(children[0]->getWidth() == children[1]->getWidth()); - const unsigned MSBIndex = bitWidth-1; - - Result result = NO_CHANGE; - - FixedBits& op = *children[0]; - FixedBits& shift = *children[1]; - - // If the MSB isn't set, create a copy with it set each way and take the meet. - if (!op.isFixed(MSBIndex)) - { - vector children1; - vector children2; - FixedBits op1(op); - FixedBits op2(op); - FixedBits shift1(shift); - FixedBits shift2(shift); - FixedBits output1(output); - FixedBits output2(output); - - children1.push_back(&op1); - children1.push_back(&shift1); - op1.setFixed(MSBIndex, true); - op1.setValue(MSBIndex, true); - - children2.push_back(&op2); - children2.push_back(&shift2); - op2.setFixed(MSBIndex, true); - op2.setValue(MSBIndex, false); - - Result r1 = bvArithmeticRightShiftBothWays(children1, output1); - Result r2 = bvArithmeticRightShiftBothWays(children2, output2); - - if (r1 == CONFLICT && r2 == CONFLICT) - return CONFLICT; - - if (r1 == CONFLICT) - { - op = op2; - shift = shift2; - output = output2; - return r2; - } - - if (r2 == CONFLICT) - { - op = op1; - shift = shift1; - output = output1; - return r1; - } - - op = FixedBits::meet(op1,op2); - shift = FixedBits::meet(shift1,shift2); - output = FixedBits::meet(output1,output2); - return r1; - - } - - assert(op.isFixed(MSBIndex)); - - if (debug_shift) - { - cerr << "=========" << endl; - cerr << op << " >a> "; - cerr << shift; - cerr << " = " << output << endl; - } - - // The topmost number of possible shifts corresponds to all - // the values of shift that shift out everything. - // i.e. possibleShift[bitWidth+1] is the SET of all operations that shift past the end. - const unsigned numberOfPossibleShifts = bitWidth + 1; - bool possibleShift[numberOfPossibleShifts]; - for (unsigned i = 0; i < numberOfPossibleShifts; i++) - possibleShift[i] = false; - - - // If either of the top two bits are fixed they should be equal. - if (op.isFixed(MSBIndex) ^ output.isFixed(MSBIndex)) - { - if (op.isFixed(MSBIndex)) - { - output.setFixed(MSBIndex, true); - output.setValue(MSBIndex, op.getValue(MSBIndex)); - } - - if (output.isFixed(MSBIndex)) - { - op.setFixed(MSBIndex, true); - op.setValue(MSBIndex, output.getValue(MSBIndex)); - } - } - - // Both the MSB of the operand and the output should be fixed now.. - assert(output.isFixed(MSBIndex)); - - unsigned minShiftFromShift, maxShiftFromShift; // The range of the "shift" value. - shift.getUnsignedMinMax(minShiftFromShift, maxShiftFromShift); - - // The shift can't be any bigger than the topmost alternation in the output. - // For example if the output is 0.01000, then the shift can not be bigger than - // 3. - unsigned maxShiftFromOutput = getMaxShiftFromValueViaAlternation(bitWidth, output); - - maxShiftFromShift = std::min(maxShiftFromShift, (unsigned) maxShiftFromOutput); - - if (debug_shift) - { - cerr << "minshift:" << minShiftFromShift << endl; - cerr << "maxshift:" << maxShiftFromShift << endl; - cerr << "total:" << maxShiftFromShift << endl; - } - - - for (unsigned i = minShiftFromShift; i <= std::min(bitWidth, maxShiftFromShift); i++) - { - // if the bit-pattern of 'i' is in the set represented by the 'shift'. - if (shift.unsignedHolds(i)) - possibleShift[i] = true; - } - - // Complication. Given a shift like [.1] possibleShift[2] is now false. - // A shift of 2 isn't possible. But one of three is. - // possibleShift[2] means any shift >=2 is possible. So it needs to be set - // to true. - { - if (maxShiftFromShift >= bitWidth) - possibleShift[bitWidth] = true; - } - - // Now check one-by-one each shifting. - // If we are shifting a zero to where a one is (say), then that shifting isn't possible. - for (unsigned shiftIt = minShiftFromShift; shiftIt < numberOfPossibleShifts; shiftIt++) - { - if (possibleShift[shiftIt]) - { - for (unsigned column = 0; column < bitWidth; column++) - { - // if they are fixed to different values. That's wrong. - if (column + shiftIt <= bitWidth - 1) - { - if (output.isFixed(column) && op.isFixed(column + shiftIt) - && (output.getValue(column) != op.getValue(column - + shiftIt))) - { - possibleShift[shiftIt] = false; - break; - } - } - } - } - } - - int nOfPossibleShifts = 0; - for (unsigned i = 0; i < numberOfPossibleShifts; i++) - { - if (possibleShift[i]) - { - nOfPossibleShifts++; - maxShiftFromShift = i; - if (debug_shift) - { - std::cerr << "Possible Shift:" << i << std::endl; - } - } - } - - if (debug_shift) - { - std::cerr << "Number of possible shifts:" << nOfPossibleShifts << endl; - } - - // If it's empty. It's a conflict. - if (0 == nOfPossibleShifts) - { - return CONFLICT; - } - - // We have a list of all the possible shift amounts. - // We take the union of all the bits that are possible. - FixedBits setOfPossibleShifts = getPossible(bitWidth, possibleShift, numberOfPossibleShifts,shift); - - // Write in any fixed values to the shift. - for (unsigned i = 0; i < bitWidth; i++) - { - if (setOfPossibleShifts.isFixed(i)) - { - if (!shift.isFixed(i)) - { - shift.setFixed(i, true); - shift.setValue(i, setOfPossibleShifts.getValue(i)); - result = CHANGED; - } - else if (shift.isFixed(i) && shift.getValue(i) - != setOfPossibleShifts.getValue(i)) - { - return CONFLICT; - } - } - } - - // If a particular input bit appears in every possible shifting, - // and if that bit is unfixed, - // and if the result it is fixed to the same value in every position. - // Then, that bit must be fixed. - // E.g. [--] << [0-] == [00] - - bool candidates[bitWidth]; - for (unsigned i = 0; i < bitWidth; i++) - { - candidates[i] = !op.isFixed(i); - } - - // candidates: So far: the bits that are unfixed in the operand. - - for (unsigned i = 0; i < numberOfPossibleShifts; i++) - { - if (possibleShift[i]) - { - // If this shift is possible, then some bits will be shifted out. - for (unsigned j = 0; j < i; j++) - candidates[j] = false; - } - } - - // candidates: So far: + the input bits that are unfixed. - // + the input bits that are in every possible fixing. - - // Check all candidates have the same output values. - for (unsigned candidate = 0; candidate < bitWidth; candidate++) - { - bool first = true; - bool setTo = false; // value that's never read. To quieten gcc. - - if (candidates[candidate]) - { - for (unsigned shiftIT = 0; shiftIT < bitWidth; shiftIT++) - { - // If the shift isn't possible continue. - if (!possibleShift[shiftIT]) - continue; - - if (shiftIT > candidate) - continue; - - unsigned idx = candidate - shiftIT; - - if (!output.isFixed(idx)) - { - candidates[candidate] = false; - break; - } - else - { - if (first) - { - first = false; - setTo = output.getValue(idx); - } - else - { - if (setTo != output.getValue(idx)) - { - candidates[candidate] = false; - break; - } - - } - } - } - } - - if (candidates[candidate]) - { - assert(!op.isFixed(candidate)); - op.setFixed(candidate, true); - op.setValue(candidate, setTo); - } - } - - if (debug_shift) - { - cerr << op << " >a> "; - cerr << shift; - cerr << " = " << output << endl; - } - - // Go through each of the possible shifts. If the same value is fixed - // at every location. Then it's fixed too in the result. - // Looping over the output columns. - bool MSBValue = op.getValue(MSBIndex); - - for (unsigned column = 0; column < bitWidth; column++) - { - bool allFixedToSame = true; - bool allFixedTo = false; // value that's never read. To quieten gcc. - bool first = true; - - for (unsigned shiftIt = 0; (shiftIt < numberOfPossibleShifts) - && allFixedToSame; shiftIt++) - { - if (possibleShift[shiftIt]) - { - // Will have shifted in something.. - if (shiftIt > (bitWidth - 1 -column)) - { - if (first) - { - allFixedTo = MSBValue; - first = false; - } - else - { - if (allFixedTo != MSBValue) - { - allFixedToSame = false; - } - } - } - else - { - unsigned index = column + shiftIt; - if (!op.isFixed(index)) - allFixedToSame = false; - else if (first && op.isFixed(index)) - { - first = false; - allFixedTo = op.getValue(index); - } - if (op.isFixed(index) && allFixedTo != op.getValue( - index)) - allFixedToSame = false; - } - } - } - - // If it can be just one possible value. Then we can fix 'em. - if (allFixedToSame) - { - if (output.isFixed(column) && (output.getValue(column) - != allFixedTo)) - { - return CONFLICT; - } - if (!output.isFixed(column)) - { - output.setFixed(column, true); - output.setValue(column, allFixedTo); - result = CHANGED; - } - } - } - return NOT_IMPLEMENTED; -} - -Result bvLeftShiftBothWays(vector& children, FixedBits& output) -{ - const unsigned bitWidth = output.getWidth(); - assert(2== children.size()); - assert(bitWidth > 0); - - Result result = NO_CHANGE; - - FixedBits& op = *children[0]; - FixedBits& shift = *children[1]; - - if (debug_shift) - { - cerr << "op:" << op << endl; - cerr << "shift:" << shift << endl; - cerr << "output:" << output << endl; - } - - // The topmost number of possible shifts corresponds to all - // the values of shift that shift out everything. - // i.e. possibleShift[bitWidth+1] is the SET of all operations that shift past the end. - const unsigned numberOfPossibleShifts = bitWidth + 1; - bool possibleShift[numberOfPossibleShifts]; - for (unsigned i = 0; i < numberOfPossibleShifts; i++) - possibleShift[i] = false; - - unsigned minShift, maxShift; - shift.getUnsignedMinMax(minShift,maxShift); - - // The shift must be less than the position of the first one in the output - int positionOfFirstOne = -1; - for (unsigned i = 0; i < bitWidth; i++) - { - if (output.isFixed(i) && output.getValue(i)) - { - positionOfFirstOne = i; - break; - } - } - - if (positionOfFirstOne >= 0) - { - if ((unsigned) positionOfFirstOne < minShift) - return CONFLICT; - - maxShift = std::min(maxShift, (unsigned) positionOfFirstOne); - } - - for (unsigned i = minShift; i <= std::min(bitWidth, maxShift); i++) - { - // if the bit-pattern of 'i' is in the set represented by the 'shift'. - if (shift.unsignedHolds(i)) - possibleShift[i] = true; - } - - // Complication. Given a shift like [-1]. possibleShift[2] is now false. - // A shift of 2 isn't possible. But one of three is. - // possibleShift[2] means any shift >=2 is possible. So it needs to be set - // to true. - { - if (maxShift >= bitWidth) - possibleShift[bitWidth] = true; - } - - // Now check one-by-one each shifting. - // If we are shifting a zero to where a one is (say), then that shifting isn't possible. - for (unsigned shiftIt = 0; shiftIt < numberOfPossibleShifts; shiftIt++) - { - if (possibleShift[shiftIt]) - { - for (unsigned column = 0; column < bitWidth; column++) - { - if (column < shiftIt) - { - if (output.isFixed(column) && output.getValue(column)) // output is one in the column. That's wrong. - { - possibleShift[shiftIt] = false; - break; - } - } - else - { - // if they are fixed to different values. That's wrong. - if (output.isFixed(column) && op.isFixed(column - shiftIt) && (output.getValue(column) != op.getValue(column - shiftIt))) - { - possibleShift[shiftIt] = false; - break; - } - } - } - } - } - - int nOfPossibleShifts = 0; - int shiftIndex = 0; - for (unsigned i = 0; i < numberOfPossibleShifts; i++) - { - if (possibleShift[i]) - { - nOfPossibleShifts++; - shiftIndex = i; - if (debug_shift) - { - std::cerr << "Possible:" << i << std::endl; - } - } - } - - if (debug_shift) - { - std::cerr << "Number of possible shifts:" << nOfPossibleShifts << endl; - } - - // If it's empty. It's a conflict. - if (0 == nOfPossibleShifts) - return CONFLICT; - - // We have a list of all the possible shift amounts. - // We take the union of all the bits that are possible. - - FixedBits v(bitWidth, false); - bool first = true; - for (unsigned i = 0; i < numberOfPossibleShifts-1; i++) - { - if (possibleShift[i]) - { - if (first) - { - first = false; - for (unsigned j = 0; j < (unsigned) v.getWidth(); j++) - { - v.setFixed(j, true); - if (j < sizeof(unsigned)*8) - v.setValue(j, 0 != (i & (1 << j))); - else - v.setValue(j, false); - } - } - else - { - // join. - for (unsigned j = 0; j < (unsigned) v.getWidth() && j < sizeof(unsigned)*8; j++) - { - if (v.isFixed(j)) - { - // union. - if (v.getValue(j) != (0!=(i & (1 << j)))) - v.setFixed(j, false); - } - } - } - } - } - - // The top most entry of the shift table is special. It means all values of shift - // that fill it completely with zeroes. We take the union of all of the values >bitWidth - // in this function. - if (possibleShift[numberOfPossibleShifts - 1]) - { - FixedBits bitWidthFB = FixedBits::fromUnsignedInt(bitWidth, bitWidth); - FixedBits output(1, true); - output.setFixed(0, true); - output.setValue(0, true); - FixedBits working(shift); - - vector args; - args.push_back(&working); - args.push_back(&bitWidthFB); - - //Write into working anything that can be determined given it's >=bitWidth. - Result r = bvGreaterThanEqualsBothWays(args,output); - assert(CONFLICT != r); - - // Get the union of "working" with the prior union. - for (unsigned i = 0; i < bitWidth; i++) - { - if (!working.isFixed(i) && v.isFixed(i)) - v.setFixed(i, false); - if (working.isFixed(i) && v.isFixed(i) && (working.getValue(i) != v.getValue(i))) - v.setFixed(i, false); - if (first) // no less shifts possible. - { - if (working.isFixed(i)) - { - v.setFixed(i, true); - v.setValue(i, working.getValue(i)); - } - } - } - } - - if (debug_shift) - { - std::cerr << "Shift Amount:" << v << std::endl; - } - - for (unsigned i = 0; i < bitWidth; i++) - { - if (v.isFixed(i)) - { - if (!shift.isFixed(i)) - { - shift.setFixed(i, true); - shift.setValue(i, v.getValue(i)); - result = CHANGED; - } - else if (shift.isFixed(i) && shift.getValue(i) != v.getValue(i)) - return CONFLICT; - } - } - - // If a particular input bit appears in every possible shifting, - // and if that bit is unfixed, - // and if the result it is fixed to the same value in every position. - // Then, that bit must be fixed. - // E.g. [--] << [0-] == [00] - - bool candidates[bitWidth]; - for (unsigned i = 0; i < bitWidth; i++) - { - candidates[i] = !op.isFixed(i); - } - - // candidates: So far: the bits that are unfixed. - - for (unsigned i = 0; i < numberOfPossibleShifts; i++) - { - if (possibleShift[i]) - { - // If this shift is possible, then some bits will be shifted out. - for (unsigned j = 0; j < i; j++) - candidates[bitWidth - 1 - j] = false; - } - } - - // candidates: So far: + the input bits that are unfixed. - // + the input bits that are in every possible fixing. - - // Check all candidates have the same output values. - for (unsigned candidate = 0; candidate < bitWidth; candidate++) - { - bool first = true; - bool setTo = false; // value that's never read. To quieten gcc. - - if (candidates[candidate]) - { - for (unsigned shiftIT = 0; shiftIT < bitWidth; shiftIT++) - { - // If the shift isn't possible continue. - if (!possibleShift[shiftIT]) - continue; - - unsigned idx = candidate + shiftIT; - - if (!output.isFixed(idx)) - { - candidates[candidate] = false; - break; - } - else - { - if (first) - { - first = false; - setTo = output.getValue(idx); - } - else - { - if (setTo != output.getValue(idx)) - { - candidates[candidate] = false; - break; - } - - } - } - } - } - - if (candidates[candidate]) - { - assert(!op.isFixed(candidate)); - op.setFixed(candidate, true); - op.setValue(candidate, setTo); - } - } - - // done. - - // Go through each of the possible shifts. If the same value is fixed - // at every location. Then it's fixed too in the result. - for (unsigned column = 0; column < bitWidth; column++) - { - bool allFixedToSame = true; - bool allFixedTo = false; // value that's never read. To quieten gcc. - bool first = true; - - for (unsigned shiftIt = minShift; (shiftIt < numberOfPossibleShifts) && allFixedToSame; shiftIt++) - { - if (possibleShift[shiftIt]) - { - // Will have shifted in zeroes. - if (shiftIt > column) - { - if (first) - { - allFixedTo = false; - first = false; - } - else - { - if (allFixedTo) - { - allFixedToSame = false; - } - } - } - else - { - unsigned index = column - shiftIt; - if (!op.isFixed(index)) - allFixedToSame = false; - else if (first && op.isFixed(index)) - { - first = false; - allFixedTo = op.getValue(index); - } - if (op.isFixed(index) && allFixedTo != op.getValue(index)) - allFixedToSame = false; - } - } - } - - // If it can be just one possible value. Then we can fix 'em. - if (allFixedToSame) - { - if (output.isFixed(column) && (output.getValue(column) != allFixedTo)) - return CONFLICT; - if (!output.isFixed(column)) - { - output.setFixed(column, true); - output.setValue(column, allFixedTo); - result = CHANGED; - } - } - } - - /* - // If there is only one possible shift value. Then, we can push from the output back. - if (1 == nOfPossibleShifts) - { - for (unsigned i = shiftIndex; i < bitWidth; i++) - { - if (!op.isFixed(i - shiftIndex) && output.isFixed(i)) - { - op.setFixed(i - shiftIndex, true); - op.setValue(i - shiftIndex, output.getValue(i)); - result = CHANGED; - } - } - } -*/ - - return NOT_IMPLEMENTED; -} - -} -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_TransferFunctions.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_TransferFunctions.cpp deleted file mode 100644 index 1846020e9..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_TransferFunctions.cpp +++ /dev/null @@ -1,461 +0,0 @@ -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_Utility.h" - -namespace simplifier -{ -namespace constantBitP -{ - -namespace BEEV -{ -typedef unsigned int * CBV; -} - -// Misc (easy) transfer functions. -// Trevor Hansen. BSD License. - -// if the result is fixed to true. Then fix a==b. -// if the result is fixed to false, there is a single unspecied value, and all the rest are the same. Fix it to the opposite. - -// if a==b then fix the result to true. -// if a!=b then fix the result to false. -Result bvEqualsBothWays(FixedBits& a, FixedBits& b, FixedBits& output) -{ - assert(a.getWidth() == b.getWidth()); - assert(1 == output.getWidth()); - - const int childWidth = a.getWidth(); - - Result r = NO_CHANGE; - - bool allSame = true; - bool definatelyFalse = false; - - for (int i = 0; i < childWidth; i++) - { - // if both fixed - if (a.isFixed(i) && b.isFixed(i)) - { - // And have different values. - if (a.getValue(i) != b.getValue(i)) - { - definatelyFalse = true; - break; - } - else - { - allSame &= true; - continue; - } - } - allSame &= false; - } - - if (definatelyFalse) - { - if (output.isFixed(0) && output.getValue(0)) - { - return CONFLICT; - } - else if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, false); - r = CHANGED; - } - } - else if (allSame) - { - if (output.isFixed(0) && !output.getValue(0)) - { - return CONFLICT; - } - else if (!output.isFixed(0)) - { - output.setFixed(0, true); - output.setValue(0, true); - r = CHANGED; - } - } - - if (output.isFixed(0) && output.getValue(0)) // all should be the same. - { - for (int i = 0; i < childWidth; i++) - { - if (a.isFixed(i) && b.isFixed(i)) - { - if (a.getValue(i) != b.getValue(i)) - { - return CONFLICT; - } - } - else if (a.isFixed(i) != b.isFixed(i)) // both same but only one is fixed. - { - if (a.isFixed(i)) - { - b.setFixed(i, true); - b.setValue(i, a.getValue(i)); - r = CHANGED; - } - else - { - a.setFixed(i, true); - a.setValue(i, b.getValue(i)); - r = CHANGED; - } - } - } - } - - // if the result is fixed to false, there is a single unspecied value, and all the rest are the same. Fix it to the opposite. - if (output.isFixed(0) && !output.getValue(0)) - { - int unknown = 0; - - for (int i = 0; i < childWidth && unknown < 2; i++) - { - if (!a.isFixed(i)) - unknown++; - if (!b.isFixed(i)) - unknown++; - else if (a.isFixed(i) && b.isFixed(i) && a.getValue(i) != b.getValue(i)) - { - unknown = 10; // hack, don't do the next loop. - break; - } - } - - if (1 == unknown) - { - for (int i = 0; i < childWidth; i++) - { - if (!a.isFixed(i)) - { - a.setFixed(i, true); - a.setValue(i, !b.getValue(i)); - r = CHANGED; - } - if (!b.isFixed(i)) - { - b.setFixed(i, true); - b.setValue(i, !a.getValue(i)); - r = CHANGED; - } - } - } - } - return r; -} - -Result bvEqualsBothWays(vector& children, FixedBits& result) -{ - return bvEqualsBothWays(*(children[0]), *(children[1]), result); -} - -Result bvZeroExtendBothWays(vector& children, FixedBits& output) -{ - assert(children.size() ==2 ); - // The second argument is a junk size arugment. - - - FixedBits& input = *children[0]; - const int inputBitWidth = input.getWidth(); - const int outputBitWidth = output.getWidth(); - - Result result = makeEqual(input, output, 0, inputBitWidth); - if (CONFLICT == result) - return CONFLICT; - - // Fix all the topmost bits of the output to zero. - for (int i = inputBitWidth; i < outputBitWidth; i++) - { - if (output.isFixed(i) && output.getValue(i)) - return CONFLICT; // set to one. Never right. - else if (!output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, false); - result = CHANGED; - } - } - return result; -} - -Result bvSignExtendBothWays(vector& children, FixedBits& output) -{ - assert(children.size() ==2 ); - // The second argument is a junk size arugment. - - FixedBits& input = *children[0]; - const int inputBitWidth = input.getWidth(); - const int outputBitWidth = output.getWidth(); - assert(inputBitWidth <= outputBitWidth); - - Result result = makeEqual(input, output, 0, inputBitWidth); - if (CONFLICT == result) - return CONFLICT; - - // If any of the topmost bits of the output are fixed. Then they all should be. - // They should all be fixed to the same value. - bool found = false; - bool setTo; - for (int i = inputBitWidth - /**/1 /**/; i < outputBitWidth; i++) - { - if (output.isFixed(i)) - { - setTo = output.getValue(i); - found = true; - break; - } - } - - if (found) - { - for (int i = inputBitWidth - 1; i < outputBitWidth; i++) - { - if (output.isFixed(i) && (output.getValue(i) != setTo)) - return CONFLICT; // if any are set to the wrong value! bad. - else if (!output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, setTo); - result = CHANGED; - } - } - - Result result2 = makeEqual(input, output, 0, inputBitWidth); - if (CONFLICT == result2) - return CONFLICT; - - } - return result; -} - -Result bvExtractBothWays(vector& children, FixedBits& output) -{ - const int numberOfChildren = children.size(); - const int outputBitWidth = output.getWidth(); - - Result result = NO_CHANGE; - - assert(3 == numberOfChildren); - - int top = children[1]->getUnsignedValue(); - int bottom = children[2]->getUnsignedValue(); - - FixedBits& input = *(children[0]); - - assert(top >= bottom); - assert(bottom >=0); - assert(top - bottom + 1 == outputBitWidth); - assert(top < input.getWidth()); - - for (int outputPosition = 0; outputPosition < outputBitWidth; outputPosition++) - { - int inputPosition = outputPosition + bottom; - - if (input.isFixed(inputPosition) && output.isFixed(outputPosition)) - if (input.getValue(inputPosition) ^ output.getValue(outputPosition)) - return CONFLICT; - - if (input.isFixed(inputPosition) ^ output.isFixed(outputPosition)) - { - if (input.isFixed(inputPosition)) - { - output.setFixed(outputPosition, true); - output.setValue(outputPosition, input.getValue(inputPosition)); - result = CHANGED; - } - else - { - input.setFixed(inputPosition, true); - input.setValue(inputPosition, output.getValue(outputPosition)); - result = CHANGED; - } - } - } - - //cerr << "extract[" << top << ":" << bottom << "]" << input << "=" << output<< endl; - - return result; -} - -// UMINUS, is NEG followed by +1 -Result bvUnaryMinusBothWays(vector& children, FixedBits& output) -{ - assert(children.size() == 1); - const int bitWidth = children[0]->getWidth(); - - // If it's only one bit. This will be negative one. - FixedBits one(bitWidth, false); - one.fixToZero(); - one.setFixed(0, true); - one.setValue(0, true); - - FixedBits notted(bitWidth, false); - - vector args; - args.push_back(¬ted); - args.push_back(&one); - - Result result = NO_CHANGE; - while (true) // until it fixed points - { - FixedBits initialNot(notted); - FixedBits initialIn(*children[0]); - FixedBits initialOut(output); - - result = bvNotBothWays(*children[0], notted); - if (CONFLICT == result) - return CONFLICT; - - result = bvAddBothWays(args, output); - if (CONFLICT == result) - return CONFLICT; - - if (FixedBits::equals(initialNot, notted) && FixedBits::equals(initialIn, *children[0]) && FixedBits::equals(initialOut, output)) - break; - } - - return NOT_IMPLEMENTED; // don't set the status properly yet.. -} - -Result bvConcatBothWays(vector& children, FixedBits& output) -{ - Result r = NO_CHANGE; - const int numberOfChildren = children.size(); - int current = 0; - for (int i = numberOfChildren - 1; i >= 0; i--) // least significant is last. - - { - FixedBits& child = *children[i]; - for (int j = 0; j < child.getWidth(); j++) - { - // values are different. Bad. - if (output.isFixed(current) && child.isFixed(j) && (output.getValue(current) != child.getValue(j))) - return CONFLICT; - - if (output.isFixed(current) && !child.isFixed(j)) - { - // only output is fixed. - child.setFixed(j, true); - child.setValue(j, output.getValue(current)); - r = CHANGED; - } - else if (!output.isFixed(current) && child.isFixed(j)) - { - // only input is fixed. - output.setFixed(current, true); - output.setValue(current, child.getValue(j)); - r = CHANGED; - } - current++; - } - } - return r; -} - -// If the guard is fixed, make equal the appropriate input and output. -// If one input can not possibly be the output. Then set the guard to make it the other one. -// If both values are the same. Set the output to that value. -Result bvITEBothWays(vector& children, FixedBits& output) -{ - Result result = NO_CHANGE; - - assert(3 == children.size()); - const int bitWidth = output.getWidth(); - FixedBits& guard = *children[0]; - FixedBits& c1 = *children[1]; - FixedBits& c2 = *children[2]; - - assert(c1.getWidth() == c2.getWidth()); - assert(output.getWidth() == c2.getWidth()); - - if (guard.isFixed(0) && guard.getValue(0)) - { // guard fixed to true. So make (first arg == output) - result = makeEqual(output, c1, 0, bitWidth); - if (CONFLICT == result) - return CONFLICT; - - } - else if (guard.isFixed(0) && !guard.getValue(0)) - { - result = makeEqual(output, c2, 0, bitWidth); - if (CONFLICT == result) - return CONFLICT; - - } - else - { - for (int i = 0; i < bitWidth; i++) - { - if (c1.isFixed(i) && c2.isFixed(i) && (c1.getValue(i) == c2.getValue(i))) - { - - if (output.isFixed(i) && (output.getValue(i) != c1.getValue(i))) - return CONFLICT; - - if (!output.isFixed(i)) - { - output.setFixed(i, true); - output.setValue(i, c1.getValue(i)); - result = CHANGED; - } - } - } - } - - bool changed = false; - if (CHANGED == result) - changed = true; - - for (int i = 0; i < bitWidth; i++) - { - if (output.isFixed(i)) - { - if (c1.isFixed(i) && (c1.getValue(i) != output.getValue(i))) - { - //c1 is fixed to a value that's not the same as the output. - if (!guard.isFixed(0)) - { - guard.setFixed(0, true); - guard.setValue(0, false); - result = bvITEBothWays(children, output); - if (CONFLICT == result) - return CONFLICT; - changed = true; - } - else if (guard.getValue(0)) - return CONFLICT; - } - - if (c2.isFixed(i) && (c2.getValue(i) != output.getValue(i))) - { - //c2 is fixed to a value that's not the same as the output. - if (!guard.isFixed(0)) - { - guard.setFixed(0, true); - guard.setValue(0, true); - result = bvITEBothWays(children, output); - if (CONFLICT == result) - return CONFLICT; - changed = true; - - } - else if (!guard.getValue(0)) - return CONFLICT; - } - } - } - - if (result == CONFLICT) - return CONFLICT; - if (changed) - return CHANGED; - - return result; -} - -} - -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_TransferFunctions.h b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_TransferFunctions.h deleted file mode 100644 index 5053b23d4..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_TransferFunctions.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ConstantBitPropagation_TransferFunctions.h - * - */ -// Trevor Hansen. BSD License. - -#ifndef CONSTANTBITPROPAGATION_TRANSFERFUNCTIONS_H_ -#define CONSTANTBITPROPAGATION_TRANSFERFUNCTIONS_H_ - -#include "ConstantBitPropagation.h" -namespace simplifier -{ -namespace constantBitP -{ -class MultiplicationStats; - -// Multiply is not yet maximally precise. -//!!!!!!! -Result bvMultiplyBothWays(vector& children, FixedBits& output, BEEV::STPMgr* bm, MultiplicationStats* ms = NULL); -Result bvUnsignedDivisionBothWays(vector& children, FixedBits& output, BEEV::STPMgr* bm); -Result bvUnsignedModulusBothWays(vector& children, FixedBits& output, BEEV::STPMgr* bm); -Result bvSignedDivisionBothWays(vector& children, FixedBits& output, BEEV::STPMgr* bm); -Result bvSignedRemainderBothWays(vector& children, FixedBits& output, BEEV::STPMgr* bm); -Result bvSignedModulusBothWays(vector& children, FixedBits& output, BEEV::STPMgr* bm); -//!!!!!!! - - -// BOTH WAY FUNCTIONS..-------MAXIMALLY PRECISE.......... -Result bvEqualsBothWays(vector& children, FixedBits& output); - -Result bvAndBothWays(vector& operands, FixedBits& output); - -Result bvOrBothWays(vector& children, FixedBits& output); -Result bvXorBothWays(vector& children, FixedBits& output); - -Result bvImpliesBothWays(vector& children, FixedBits& result); - -Result bvAddBothWays(vector& children, FixedBits& output); -Result bvSubtractBothWays(vector& children, FixedBits& output); - -Result bvNotBothWays(FixedBits& a, FixedBits& output); -Result bvNotBothWays(vector& children, FixedBits& output); - -Result bvITEBothWays(vector& children, FixedBits& output); - -Result bvExtractBothWays(vector& children, FixedBits& output); - -Result bvConcatBothWays(vector& children, FixedBits& output); - -Result bvSignExtendBothWays(vector& children, FixedBits& output); -Result bvZeroExtendBothWays(vector& children, FixedBits& output); - -Result bvUnaryMinusBothWays(vector& children, FixedBits& output); - -Result bvLeftShiftBothWays(vector& children, FixedBits& output); -Result bvRightShiftBothWays(vector& children, FixedBits& output); -Result bvArithmeticRightShiftBothWays(vector& children, FixedBits& output); - -// FOUR signed operations. -Result bvSignedGreaterThanBothWays(vector& children, FixedBits& output); - -Result bvSignedLessThanBothWays(vector& children, FixedBits& output); - -Result bvSignedLessThanEqualsBothWays(vector& children, FixedBits& output); - -Result bvSignedGreaterThanEqualsBothWays(vector& children, FixedBits& output); - -// FOUR unsigned operations. - -Result bvLessThanBothWays(vector& children, FixedBits& output); -Result bvLessThanBothWays(FixedBits& c0, FixedBits &c1, FixedBits& output); - -Result bvLessThanEqualsBothWays(vector& children, FixedBits& output); - -Result bvGreaterThanBothWays(vector& children, FixedBits& output); - -Result bvGreaterThanEqualsBothWays(vector& children, FixedBits& output); - -} -} - -#endif /* CONSTANTBITPROPAGATION_TRANSFERFUNCTIONS_H_ */ diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Utility.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Utility.cpp deleted file mode 100644 index 6095239df..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Utility.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include "ConstantBitP_Utility.h" -#include "../../extlib-constbv/constantbv.h" - -// Utility functions used by the transfer functions. - -namespace BEEV -{ -typedef unsigned int * CBV; -void FatalError(const char * str); -} - - -namespace simplifier -{ -namespace constantBitP -{ - -using BEEV::CBV; - -// Find ALL the unfixed values in the column and fix it to the specified value. -void fixUnfixedTo(vector& operands, const unsigned position, bool toFix) -{ - for (unsigned i = 0; i < operands.size(); i++) - { - if (!operands[i]->isFixed(position)) - { - operands[i]->setFixed(position, true); - operands[i]->setValue(position, toFix); - } - } -} - -// counts of how many of each in the column. -stats getStats(const vector& operands, const unsigned position) -{ - stats result = { 0, 0, 0 }; - - for (unsigned i = 0, size = operands.size(); i < size; i++) - { - if (operands[i]->isFixed(position)) - { - if (operands[i]->getValue(position)) // fixed to one. - result.fixedToOne++; - else - result.fixedToZero++; // fixed to zero. - } - else - result.unfixed++; - } - - assert(result.fixedToOne + result.fixedToZero + result.unfixed == operands.size()); - return result; -} - -Result makeEqual(FixedBits& a, FixedBits& b, int from, int to) -{ - assert(to >= from); - assert(from >=0); - assert(from <= a.getWidth()); - assert(from <= b.getWidth()); - - Result result = NO_CHANGE; - for (int i = from; i < to; i++) - { - if (a.isFixed(i) && !b.isFixed(i)) - { - b.setFixed(i, true); - b.setValue(i, a.getValue(i)); - result = CHANGED; - } - else if (b.isFixed(i) && !a.isFixed(i)) - { - a.setFixed(i, true); - a.setValue(i, b.getValue(i)); - result = CHANGED; - } - else if (b.isFixed(i) && a.isFixed(i)) - { - if (a.getValue(i) != b.getValue(i)) - return CONFLICT; - } - } - return result; -} - -void setSignedMinMax(FixedBits& v, CBV min, CBV max) -{ - const unsigned int msb = v.getWidth() - 1; - - for (unsigned i = 0; i < (unsigned) v.getWidth(); i++) - { - if (v.isFixed(i)) - { - if (v.getValue(i)) // if it's on. It's on. - - { - CONSTANTBV::BitVector_Bit_On(max, i); - CONSTANTBV::BitVector_Bit_On(min, i); - } - else - { - CONSTANTBV::BitVector_Bit_Off(max, i); - CONSTANTBV::BitVector_Bit_Off(min, i); - } - } - else - { - if (i != msb) - { // not fixed. Make the maximum Maximum. - CONSTANTBV::BitVector_Bit_On(max, i); - CONSTANTBV::BitVector_Bit_Off(min, i); - } - else - { //except for the msb. Where we reduce the min. - CONSTANTBV::BitVector_Bit_On(min, i); - CONSTANTBV::BitVector_Bit_Off(max, i); - } - } - } - assert(CONSTANTBV::BitVector_Compare(min,max) <=0); -} - -void setUnsignedMinMax(const FixedBits& v, CBV min, CBV max) -{ - CONSTANTBV::BitVector_Fill(max); - CONSTANTBV::BitVector_Empty(min); - - for (int i = 0; i < v.getWidth(); i++) - { - if (v.isFixed(i)) - { - if (v.getValue(i)) // if it's on. It's on. - - { - //CONSTANTBV::BitVector_Bit_On(max, i); - CONSTANTBV::BitVector_Bit_On(min, i); - } - else - { - CONSTANTBV::BitVector_Bit_Off(max, i); - //CONSTANTBV::BitVector_Bit_Off(min, i); - } - } - //else // not fixed. Just set the max. - //{ - // CONSTANTBV::BitVector_Bit_On(max, i); - // CONSTANTBV::BitVector_Bit_Off(min, i); - //} - } - assert(CONSTANTBV::BitVector_Lexicompare(min,max) <=0); -} - -// Convert from arbitary precision. -unsigned cbvTOInt(const BEEV::CBV v) -{ - unsigned result = 0; - const unsigned bitSize = sizeof(unsigned) * 8; - - for (unsigned j = 0; j < (bits_(v)); j++) - { - if (CONSTANTBV::BitVector_bit_test(v, j)) - { - if (j > bitSize) - { - BEEV::FatalError( LOCATION "Can't fix a bit so very much way up high."); - } - result += (1 << j); - } - - } - return result; -} - -int unsignedCompare(const BEEV::CBV& lhs, const BEEV::CBV& rhs) -{ - /// NB: Uses the memory layout of the constant bit library to extract the bitwidth. - //assert(*((unsigned *)&lhs-3) == *((unsigned *)&rhs-3)); - return CONSTANTBV::BitVector_Lexicompare(lhs,rhs); -} - -int signedCompare(const BEEV::CBV& lhs, const BEEV::CBV& rhs) -{ - /// NB: Uses the memory layout of the constant bit library to extract the bitwidth. - //assert(*((unsigned *)&lhs-3) == *((unsigned *)&rhs-3)); - return CONSTANTBV::BitVector_Compare(lhs,rhs); -} - -Result merge(Result r1, Result r2) -{ - if (r1 == CONFLICT || r2 == CONFLICT ) - return CONFLICT; - - if (r1 == CHANGED || r2 == CHANGED) - return CHANGED; - - if (r1 == NO_CHANGE && r2 == NO_CHANGE) - return NO_CHANGE; - - return NOT_IMPLEMENTED; -} - - -int toInt(const BEEV::CBV value) -{ - return *((unsigned int*) value); -} - -} -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Utility.h b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Utility.h deleted file mode 100644 index 680dc5cf3..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitP_Utility.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef CONSTANTBITP_UTILITY_H_ -#define CONSTANTBITP_UTILITY_H_ - -#include "ConstantBitPropagation.h" - -// Utility functions for use by the transfer functions. -// This should only be included by files defining transfer functions. - -namespace simplifier -{ -namespace constantBitP -{ -using std::cerr; -using std::cout; -using std::endl; -using std::pair; - -Result makeEqual(FixedBits& a, FixedBits& b, int from, int to); -void setSignedMinMax(FixedBits& v, BEEV::CBV min, BEEV::CBV max); -void setUnsignedMinMax(const FixedBits& v, BEEV::CBV min, BEEV::CBV max); -unsigned cbvTOInt(const BEEV::CBV v); -void fixUnfixedTo(vector& operands, const unsigned position, bool toFix); -int toInt(BEEV::CBV value); - -// wraps the comparison function, including a check that the bitWidth is the same. -int unsignedCompare(const BEEV::CBV& lhs, const BEEV::CBV& rhs); -int signedCompare(const BEEV::CBV& lhs, const BEEV::CBV& rhs); - -struct stats -{ - unsigned fixedToZero; - unsigned fixedToOne; - unsigned unfixed; -}; - -Result merge(Result r1, Result r2); - -stats getStats(const vector& operands, const unsigned position); -} -} - - -#endif diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitPropagation.cpp b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitPropagation.cpp deleted file mode 100644 index 928a459c0..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitPropagation.cpp +++ /dev/null @@ -1,778 +0,0 @@ -#include "ConstantBitPropagation.h" -#include "../../AST/AST.h" -#include "../../extlib-constbv/constantbv.h" -#include "../../printer/printers.h" -#include "../../AST/NodeFactory/NodeFactory.h" -#include "../../simplifier/simplifier.h" -#include "ConstantBitP_Utility.h" -#include -#include -#include "ConstantBitP_TransferFunctions.h" -#include "ConstantBitP_MaxPrecision.h" - -using std::endl; -using std::cout; - -using namespace BEEV; - -/* - * Propagates known fixed 0 or 1 bits, as well as TRUE/FALSE values through the formula. - * - * Our approach differs from others because the transfer functions are (mostly) optimally precise. - * - * FixedBits stores booleans in 1 bit-bitvectors. - */ - -namespace simplifier -{ - namespace constantBitP - { - NodeToFixedBitsMap* PrintingHackfixedMap; // Used when debugging. - - Result - dispatchToTransferFunctions(const Kind k, vector& children, - FixedBits& output, const ASTNode n, MultiplicationStatsMap *msm = NULL); - - const bool debug_cBitProp_messages = false; - const bool output_mult_like = false; - const bool debug_print_graph_after = false; - - //////////////////// - - void - ConstantBitPropagation::printNodeWithFixings() - { - NodeToFixedBitsMap::NodeToFixedBitsMapType::const_iterator it = - fixedMap->map->begin(); - - cerr << "+Nodes with fixings" << endl; - - for (/**/; it != fixedMap->map->end(); it++) // iterates through all the pairs of node->fixedBits. - { - cerr << (it->first).GetNodeNum() << " " << *(it->second) << endl; - } - cerr << "-Nodes with fixings" << endl; - - } - - // Used when outputting when debugging. - // Outputs the fixed bits for a particular node. - string - toString(const ASTNode& n) - { - NodeToFixedBitsMap::NodeToFixedBitsMapType::const_iterator it = - PrintingHackfixedMap->map->find(n); - if (it == PrintingHackfixedMap->map->end()) - return ""; - - std::stringstream s; - s << *it->second; - return s.str(); - } - - // If the bits are totally fixed, then return a new matching ASTNode. - ASTNode - bitsToNode(const ASTNode& node, const FixedBits& bits) - { - ASTNode result; - STPMgr & beev = *node.GetSTPMgr(); - - assert (bits.isTotallyFixed()); - assert (!node.isConstant()); // Peformance. Shouldn't waste time calling it on constants. - - if (node.GetType() == BOOLEAN_TYPE) - { - if (bits.getValue(0)) - { - result = beev.CreateNode(TRUE); - } - else - { - result = beev.CreateNode(FALSE); - } - } - else if (node.GetType() == BITVECTOR_TYPE) - { - result = beev.CreateBVConst(bits.GetBVConst(), node.GetValueWidth()); - } - else - FatalError("sadf234s"); - - assert(result.isConstant()); - return result; - } - - // Put anything that's entirely fixed into a from->to map. - ASTNodeMap - ConstantBitPropagation::getAllFixed() - { - NodeToFixedBitsMap::NodeToFixedBitsMapType::iterator it; - - ASTNodeMap toFrom; - - // iterates through all the pairs of node->fixedBits. - for (it = fixedMap->map->begin(); it != fixedMap->map->end(); it++) - { - const ASTNode& node = (it->first); - const FixedBits& bits = *it->second; - - // Don't constrain nodes we already know all about. - if (node.isConstant()) - continue; - - // Concat doesn't change the fixings. Ignore it. - if (BVCONCAT == node.GetKind()) - continue; - - if (bits.isTotallyFixed()) - { - toFrom.insert(std::make_pair(node, bitsToNode(node, bits))); - } - } - - return toFrom; - } - - void - ConstantBitPropagation::setNodeToTrue(const ASTNode& top) - { - assert(!topFixed); - topFixed = true; - - FixedBits & topFB = *getCurrentFixedBits(top); - topFB.setFixed(0, true); - topFB.setValue(0, true); - workList->push(top); - } - - // Propagates. No writing in of values. Doesn't assume the top is true. - ConstantBitPropagation::ConstantBitPropagation(BEEV::Simplifier* _sm, NodeFactory* _nf,const ASTNode & top) - { - assert (BOOLEAN_TYPE == top.GetType()); - assert (top.GetSTPMgr()->UserFlags.bitConstantProp_flag); - - status = NO_CHANGE; - simplifier = _sm; - nf = _nf; - fixedMap = new NodeToFixedBitsMap(1000); // better to use the function that returns the number of nodes.. whatever that is. - workList = new WorkList(top); - dependents = new Dependencies(top); // List of the parents of a node. - msm = new MultiplicationStatsMap(); - - - // not fixing the topnode. - propagate(); - - if (debug_cBitProp_messages) - { - cerr << "status:" << status <map->begin(); - NodeToFixedBitsMap::NodeToFixedBitsMapType::iterator it_end = - fixedMap->map->end(); - while (it != it_end) - { - // No constants, nothing completely unfixed. - if ( (it->second)->countFixed() == 0 ) - { - delete it->second; - // making this a reference causes reading from freed memory. - const ASTNode n = it->first; - it++; - fixedMap->map->erase(n); - } - else - it++; - } -#endif - - topFixed = false; - } - - // Both way propagation. Initialising the top to "true". - // The hardest thing to understand is the two cases: - // 1) If we get the fixed bits of a node, without assuming the top node is true, - // then we can replace that node by its fixed bits. - // 2) But if we assume the top node is true, then get the bits, we need to conjoin it. - - // NB: This expects that the constructor was called with the same node. Sorry. - ASTNode - ConstantBitPropagation::topLevelBothWays(const ASTNode& top, bool setTopToTrue, bool conjoinToTop) - { - assert(top.GetSTPMgr()->UserFlags.bitConstantProp_flag); - assert (BOOLEAN_TYPE == top.GetType()); - - propagate(); - status = NO_CHANGE; - - //Determine what must always be true. - ASTNodeMap fromTo = getAllFixed(); - { - ASTNodeMap::iterator it = fromTo.begin(); - while(it != fromTo.end()) - { - // I don't think there should be a constant in here ever. - assert(it->first.GetKind() != SYMBOL); - it++; - } - } - - - if (debug_cBitProp_messages) - { - cerr << "Number removed by bottom UP:" << fromTo.size() << endl; - } - - if (setTopToTrue) - setNodeToTrue(top); - - if (debug_cBitProp_messages) - { - cerr << "starting propagation" << endl; - printNodeWithFixings(); - cerr << "Initial Tree:" << endl; - cerr << top; - } - - propagate(); - - if (debug_cBitProp_messages) - { - cerr << "status:" << status <CreateNode(FALSE); - - ASTVec toConjoin; - - // go through the fixedBits. If a node is entirely fixed. - // "and" it onto the top. Creates redundancy. Check that the - // node doesn't already depend on "top" directly. - - for (NodeToFixedBitsMap::NodeToFixedBitsMapType::iterator it = fixedMap->map->begin(); it != fixedMap->map->end(); it++) // iterates through all the pairs of node->fixedBits. - { - const FixedBits& bits = *it->second; - - const ASTNode& node = (it->first); - - if (false && node.GetKind() == SYMBOL && !bits.isTotallyFixed() && bits.countFixed() > 0) - { - // replace partially known variables with new variables. - int leastFixed = bits.leastUnfixed(); - int mostFixed = bits.mostUnfixed(); - const int width = node.GetValueWidth(); - - int new_width = mostFixed - leastFixed +1; - assert(new_width > 0); - ASTNode fresh = node.GetSTPMgr()->CreateFreshVariable(0,new_width,"STP_REPLACE"); - ASTNode a,b; - if (leastFixed > 0) - a= node.GetSTPMgr()->CreateBVConst(bits.GetBVConst( leastFixed-1, 0), leastFixed); - if (mostFixed != width-1) - b = node.GetSTPMgr()->CreateBVConst(bits.GetBVConst( width-1, mostFixed+1),width-1-mostFixed); - if (!a.IsNull()) - fresh = nf->CreateTerm(BVCONCAT, a.GetValueWidth() + fresh.GetValueWidth(), fresh, a); - if (!b.IsNull()) - fresh = nf->CreateTerm(BVCONCAT, b.GetValueWidth() + fresh.GetValueWidth(), b, fresh); - assert(fresh.GetValueWidth() == node.GetValueWidth()); - bool r = simplifier->UpdateSubstitutionMap(node, fresh); - assert(r); - } - - if (!bits.isTotallyFixed()) - continue; - - - // Don't constrain nodes we already know all about. - if (node.isConstant()) - continue; - - // other nodes will contain the same information (the extract doesn't change the fixings). - if (BVEXTRACT == node.GetKind() || BVCONCAT == node.GetKind()) - continue; - - // toAssign: conjoin it with the top level. - // toReplace: replace all references to it (except the one conjoined to the top) with this. - ASTNode propositionToAssert; - ASTNode constantToReplaceWith; - // skip the assigning and replacing. - bool doAssign = false; - - { - // If it is already contained in the fromTo map, then it's one of the values - // that have fully been determined (previously). Not conjoined. - if (fromTo.find(node) != fromTo.end()) - continue; - - ASTNode constNode = bitsToNode(node,bits); - - if (node.GetType() == BOOLEAN_TYPE) - { - if (SYMBOL == node.GetKind()) - { - bool r = simplifier->UpdateSubstitutionMap(node, constNode); - assert(r); - doAssign = false; - } - else if (conjoinToTop && bits.getValue(0)) - { - propositionToAssert = node; - constantToReplaceWith = constNode; - doAssign=true; - } - else if (conjoinToTop) - { - propositionToAssert = nf->CreateNode(NOT, node); - constantToReplaceWith = constNode; - doAssign=true; - } - } - else if (node.GetType() == BITVECTOR_TYPE) - { - assert(((unsigned)bits.getWidth()) == node.GetValueWidth()); - if (SYMBOL == node.GetKind()) - { - bool r = simplifier->UpdateSubstitutionMap(node, constNode); - assert(r); - doAssign = false; - } - else if (conjoinToTop) - { - propositionToAssert = nf->CreateNode(EQ, node, constNode); - constantToReplaceWith = constNode; - doAssign=true; - } - } - else - FatalError("sadf234s"); - } - - if (doAssign && top != propositionToAssert - && !dependents->nodeDependsOn(top, propositionToAssert)) - { - assert(!constantToReplaceWith.IsNull()); - assert(constantToReplaceWith.isConstant()); - assert(propositionToAssert.GetType() == BOOLEAN_TYPE); - assert(node.GetValueWidth() == constantToReplaceWith.GetValueWidth()); - - fromTo.insert(make_pair(node, constantToReplaceWith)); - toConjoin.push_back(propositionToAssert); - assert(conjoinToTop); - } - } - - // Write the constants into the main graph. - ASTNodeMap cache; - ASTNode result = SubstitutionMap::replace(top, fromTo, cache,nf); - - if (0 != toConjoin.size()) - { - // It doesn't happen very often. But the "toConjoin" might contain a variable - // that was added to the substitution map (because the value was determined just now - // during propagation. - ASTNode conjunct = (1 == toConjoin.size())? toConjoin[0]: nf->CreateNode(AND,toConjoin); - conjunct = simplifier->applySubstitutionMap(conjunct); - - result = nf->CreateNode(AND, result, conjunct); // conjoin the new conditions. - } - - - if (debug_print_graph_after) - { - ofstream file; - file.open("afterCbitp.gdl"); - PrintingHackfixedMap = fixedMap; - printer::GDL_Print(file,top,&toString); - file.close(); - } - - - assert(BVTypeCheck(result)); - assert(status != CONFLICT); // conflict should have been seen earlier. - return result; - } - - void - notHandled(const Kind& k) - { - if (READ != k && WRITE != k) - if (debug_cBitProp_messages) - { - cerr << "!" << k << endl; - } - } - - - // add to the work list any nodes that take the result of the "n" node. - void - ConstantBitPropagation::scheduleUp(const ASTNode& n) - { - const set* toAdd = dependents->getDependents(n); - set::iterator it = toAdd->begin(); - while (it != toAdd->end()) - { - workList->push(*it); - it++; - } - } - - void - ConstantBitPropagation::scheduleDown(const ASTNode& n) - { - for (int i = 0; i < n.Degree(); i++) - workList->push(n[i]); - } - - void - ConstantBitPropagation::scheduleNode(const ASTNode& n) - { - workList->push(n); - } - - bool - ConstantBitPropagation::checkAtFixedPoint(const ASTNode& n, ASTNodeSet & visited) - { - if (status == CONFLICT) - return true; // can't do anything. - - if (visited.find(n) != visited.end()) - return true; - - visited.insert(n); - - // get the current for the children. - vector childrenFixedBits; - childrenFixedBits.reserve(n.GetChildren().size()); - - // get a copy of the current fixing from the cache. - for (unsigned i = 0; i < n.GetChildren().size(); i++) - { - childrenFixedBits.push_back(*getCurrentFixedBits(n[i])); - } - FixedBits current = *getCurrentFixedBits(n); - FixedBits newBits = *getUpdatedFixedBits(n); - - assert(FixedBits::equals(newBits, current)); - - for (int i = 0; i < n.Degree(); i++) - { - if (!FixedBits::equals(*getUpdatedFixedBits(n[i]), - childrenFixedBits[i])) - { - cerr << "Not fixed point"; - assert(false); - } - - checkAtFixedPoint(n[i], visited); - } - return true; - } - - void - ConstantBitPropagation::propagate() - { - if (CONFLICT == status) - return; - - assert(NULL != fixedMap); - - while (!workList->isEmpty()) - { - // get the next node from the worklist. - const ASTNode& n = workList->pop(); - - assert (!n.isConstant()); // shouldn't get into the worklist.. - assert (CONFLICT != status); // should have stopped already. - - if (debug_cBitProp_messages) - { - cerr << "[" << workList->size() << "]working on" << n.GetNodeNum() << endl; - } - - // get a copy of the current fixing from the cache. - int previousTop = getCurrentFixedBits(n)->countFixed(); - - // get the current for the children. - previousChildrenFixedCount.clear(); - - // get a copy of the current fixing from the cache. - for (unsigned i = 0; i < n.GetChildren().size(); i++) - { - previousChildrenFixedCount.push_back(getCurrentFixedBits(n[i])->countFixed()); - } - - // derive the new ones. - int newCount = getUpdatedFixedBits(n)->countFixed(); - - if (CONFLICT == status) - return; - - // Not all transfer function update the status. But if they report NO_CHANGE. There really is no change. - if (status != NO_CHANGE) - { - if (newCount != previousTop) // has been a change. - { - assert(newCount >= previousTop); - scheduleUp(n); // schedule everything that depends on n. - } - - for (unsigned i = 0; i < n.GetChildren().size(); i++) - { - if (getCurrentFixedBits(n[i])->countFixed() != previousChildrenFixedCount[i]) - { - if (debug_cBitProp_messages) - { - cerr << "Changed: " << n[i].GetNodeNum() << " from:" << previousChildrenFixedCount[i] << "to:" - << *getCurrentFixedBits(n[i]) << endl; - } - - assert(!n[i].isConstant()); - - // All the immediate parents of this child need to be rescheduled. - // Shouldn't reschuedule 'n' but it does. - scheduleUp(n[i]); - - // Scheduling the child updates all the values that feed into it. - workList->push(n[i]); - } - } - } - } - } - - // get the current value from the map. If no value is in the map. Make a new value. - FixedBits* - ConstantBitPropagation::getCurrentFixedBits(const ASTNode& n) - { - assert (NULL != fixedMap); - - NodeToFixedBitsMap::NodeToFixedBitsMapType::iterator it = fixedMap->map->find(n); - if (it != fixedMap->map->end()) - { - return it->second; - } - - int bw; - if (0 == n.GetValueWidth()) - { - bw = 1; - } - else - { - bw = n.GetValueWidth(); - } - - FixedBits* output = new FixedBits(bw, (BOOLEAN_TYPE == n.GetType())); - - if (BVCONST == n.GetKind() || BITVECTOR == n.GetKind()) - { - // the CBV doesn't leak. it is a copy of the cbv inside the node. - CBV cbv = n.GetBVConst(); - - for (unsigned int j = 0; j < n.GetValueWidth(); j++) - { - output->setFixed(j, true); - output->setValue(j, CONSTANTBV::BitVector_bit_test(cbv, j)); - } - } - else if (TRUE == n.GetKind()) - { - output->setFixed(0, true); - output->setValue(0, true); - } - else if (FALSE == n.GetKind()) - { - output->setFixed(0, true); - output->setValue(0, false); - } - - fixedMap->map->insert(pair (n, output)); - return output; - } - - // For the given node, update which bits are fixed. - - FixedBits* - ConstantBitPropagation::getUpdatedFixedBits(const ASTNode& n) - { - FixedBits* output = getCurrentFixedBits(n); - const Kind k = n.GetKind(); - - if (n.isConstant()) - { - assert(output->isTotallyFixed()); - return output; - } - - if (SYMBOL == k) - return output; // No transfer functions for these. - - vector children; - const int numberOfChildren = n.GetChildren().size(); - children.reserve(numberOfChildren); - - for (int i = 0; i < numberOfChildren; i++) - { - children.push_back(getCurrentFixedBits(n.GetChildren()[i])); - } - - assert(status != CONFLICT); - status = dispatchToTransferFunctions(k, children, *output, n, msm); - //result = dispatchToMaximallyPrecise(k, children, *output, n,msm); - - assert(((unsigned)output->getWidth()) == n.GetValueWidth() || output->getWidth() ==1); - - return output; - } - - Result - dispatchToTransferFunctions(const Kind k, vector& children, - FixedBits& output, const ASTNode n, MultiplicationStatsMap * msm) - { - Result result = NO_CHANGE; - - assert(!n.isConstant()); - - Result(*transfer)(vector&, FixedBits&); - - switch (k) - { - case READ: - case WRITE: - // do nothing. Seems difficult to track properly. - return NO_CHANGE; - break; - -#define MAPTFN(caseV, FN) case caseV: transfer = FN; break; - - // Shifting - MAPTFN(BVLEFTSHIFT, bvLeftShiftBothWays) - MAPTFN(BVRIGHTSHIFT, bvRightShiftBothWays) - MAPTFN(BVSRSHIFT, bvArithmeticRightShiftBothWays) - - // Unsigned Comparison. - MAPTFN(BVLT,bvLessThanBothWays) - MAPTFN(BVLE,bvLessThanEqualsBothWays) - MAPTFN(BVGT, bvGreaterThanBothWays) - MAPTFN(BVGE, bvGreaterThanEqualsBothWays) - - // Signed Comparison. - MAPTFN(BVSLT, bvSignedLessThanBothWays) - MAPTFN(BVSGT,bvSignedGreaterThanBothWays) - MAPTFN(BVSLE, bvSignedLessThanEqualsBothWays) - MAPTFN(BVSGE, bvSignedGreaterThanEqualsBothWays) - - // Logic. - MAPTFN(XOR,bvXorBothWays) - MAPTFN(BVXOR, bvXorBothWays) - MAPTFN(OR, bvOrBothWays) - MAPTFN(BVOR, bvOrBothWays) - MAPTFN(AND,bvAndBothWays) - MAPTFN(BVAND,bvAndBothWays) - MAPTFN(IFF, bvEqualsBothWays) - MAPTFN(EQ, bvEqualsBothWays) - MAPTFN(IMPLIES,bvImpliesBothWays) - MAPTFN(NOT,bvNotBothWays) - MAPTFN(BVNEG, bvNotBothWays) - - // OTHER - MAPTFN(BVZX, bvZeroExtendBothWays) - MAPTFN(BVSX, bvSignExtendBothWays) - MAPTFN(BVUMINUS,bvUnaryMinusBothWays) - MAPTFN(BVEXTRACT,bvExtractBothWays) - MAPTFN(BVPLUS, bvAddBothWays) - MAPTFN(BVSUB, bvSubtractBothWays) - MAPTFN(ITE,bvITEBothWays) - MAPTFN(BVCONCAT, bvConcatBothWays) - - - case BVMULT: // handled specially later. - case BVDIV: - case BVMOD: - case SBVDIV: - case SBVREM: - case SBVMOD: - transfer = NULL; - break; - - default: - { - notHandled(k); - return NO_CHANGE; - } - } -#undef MAPTFN - bool mult_like = false; - const bool lift_to_max = false; - - // safe approximation to no overflow multiplication. - if (k == BVMULT) - { - MultiplicationStats ms; - result = bvMultiplyBothWays(children, output, n.GetSTPMgr(),&ms); - if (CONFLICT != result) - msm->map[n] = ms; - mult_like=true; - } - else if (k == BVDIV) - { - result = bvUnsignedDivisionBothWays(children, output, n.GetSTPMgr()); - mult_like=true; - } - else if (k == BVMOD) - { - result = bvUnsignedModulusBothWays(children, output, n.GetSTPMgr()); - mult_like=true; - } - else if (k == SBVDIV) - { - result = bvSignedDivisionBothWays(children, output, n.GetSTPMgr()); - mult_like=true; - } - else if (k == SBVREM) - { - result = bvSignedRemainderBothWays(children, output, n.GetSTPMgr()); - mult_like=true; - } - else if (k == SBVMOD) - { - // This propagator is very slow. It needs to be reimplemented. - //result = bvSignedModulusBothWays(children, output, n.GetSTPMgr()); - mult_like=true; - } - else - result = transfer(children, output); - - if (mult_like && lift_to_max) - { - int bits_before = output.countFixed() + children[0]->countFixed() + children[1]->countFixed(); - result = merge(result, maxPrecision(children, output, k, n.GetSTPMgr())? CONFLICT :NOT_IMPLEMENTED); - int difference = (output.countFixed() + children[0]->countFixed() + children[1]->countFixed()) - bits_before; - assert(difference >= 0); - cerr << "Bits fixed" << difference << endl; - } - - if (mult_like && output_mult_like) - { - cerr << output << "="; - cerr << *children[0] << k; - cerr << *children[1] << std::endl; - } - - return result; - - } - } -} - diff --git a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitPropagation.h b/src/vendor/stp/src/simplifier/constantBitP/ConstantBitPropagation.h deleted file mode 100644 index f5509d6c3..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/ConstantBitPropagation.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef CONSTANTBITPROPAGATION_H_ -#define CONSTANTBITPROPAGATION_H_ - -#include "FixedBits.h" -#include "Dependencies.h" -#include "NodeToFixedBitsMap.h" -#include "WorkList.h" -#include "MultiplicationStats.h" - -namespace BEEV -{ - class ASTNode; - typedef unsigned int * CBV; - class Simplifier; -} - -namespace simplifier -{ - namespace constantBitP - { - - enum Result - { - NO_CHANGE = 1, CHANGED, CONFLICT, NOT_IMPLEMENTED - }; - - class MultiplicationStatsMap; - class WorkList; - - using BEEV::ASTNode; - using BEEV::Simplifier; - - class ConstantBitPropagation - { - NodeFactory *nf; - Simplifier *simplifier; - - Result status; - WorkList *workList; - Dependencies * dependents; - - bool topFixed; - - // A vector that's reused. - vector< int > previousChildrenFixedCount; - - void - printNodeWithFixings(); - - FixedBits* - getUpdatedFixedBits(const ASTNode& n); - - FixedBits* - getCurrentFixedBits(const ASTNode& n); - - void - scheduleDown(const ASTNode& n); - -public: - NodeToFixedBitsMap* fixedMap; - MultiplicationStatsMap* msm; - - bool isUnsatisfiable() - { - return status == CONFLICT; - } - - // propagates. - ConstantBitPropagation(BEEV::Simplifier* _sm, NodeFactory* _nf, const ASTNode & top); - - ~ConstantBitPropagation() - { - clearTables(); - } - ; - - // Returns the node after writing in simplifications from constant Bit propagation. - BEEV::ASTNode - topLevelBothWays(const ASTNode& top, bool setTopToTrue = true, bool conjoinToTop=true); - - - void clearTables() - { - delete fixedMap; - fixedMap = NULL; - delete dependents; - dependents = NULL; - delete workList; - workList = NULL; - delete msm; - msm = NULL; - } - - bool - checkAtFixedPoint(const ASTNode& n, BEEV::ASTNodeSet & visited); - - void - propagate(); - - void - scheduleUp(const ASTNode& n); - - void - scheduleNode(const ASTNode& n); - - void - setNodeToTrue(const ASTNode& top); - - ASTNodeMap - getAllFixed(); - - void initWorkList(const ASTNode n) - { - workList->initWorkList(n); - } - - }; - } -} - -#endif /* CONSTANTBITPROPAGATION_H_ */ diff --git a/src/vendor/stp/src/simplifier/constantBitP/Dependencies.h b/src/vendor/stp/src/simplifier/constantBitP/Dependencies.h deleted file mode 100644 index 2ec2c06b3..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/Dependencies.h +++ /dev/null @@ -1,192 +0,0 @@ -#ifndef DEPENDENCIES_H_ -#define DEPENDENCIES_H_ - -#include "../../AST/AST.h" -namespace simplifier -{ - namespace constantBitP - { - - using namespace BEEV; - - // From a child, get the parents of that node. - class Dependencies - { - private: - - typedef hash_map*, BEEV::ASTNode::ASTNodeHasher, BEEV::ASTNode::ASTNodeEqual> - NodeToDependentNodeMap; - NodeToDependentNodeMap dependents; - - const set empty; - - public: - // All the nodes that depend on the value of a particular node. - void - build(const ASTNode & current, const ASTNode & prior) - { - if (current.isConstant()) // don't care about what depends on constants. - return; - - set * vec; - const NodeToDependentNodeMap::iterator it = dependents.find(current); - if (dependents.end() == it) - { - // add it in with a reference to the vector. - vec = new set (); - - dependents.insert(std::pair*>(current, vec)); - } - else - { - vec = it->second; - } - - if (prior != current) // initially called with both the same. - { - if (vec->count(prior) == 0) - vec->insert(prior); - else - return; // already been added in. - } - - for (unsigned int i = 0; i < current.GetChildren().size(); i++) - { - build(current.GetChildren()[i], current); - } - } - - Dependencies(const Dependencies&); // Shouldn't needed to copy or assign. - Dependencies& operator=(const Dependencies&); - - public: - Dependencies(const ASTNode &top) - { - build(top, top); - checkInvariant(); - } - - ~Dependencies() - { - NodeToDependentNodeMap::iterator it = dependents.begin(); - for (/**/; it != dependents.end(); it++) - { - //set* - delete it->second; - } - } - - void replaceFresh(const ASTNode& old, const ASTNode& newN, set *newNDepends, - ASTVec& variables) - { - NodeToDependentNodeMap::const_iterator it = dependents.find(old); - if (it == dependents.end()) - return; - - it->second->erase(old); - dependents.insert(make_pair(newN,newNDepends)); - variables.push_back(newN); - } - - // The "toRemove" node is being removed. Used by unconstrained elimination. - void removeNode(const ASTNode& toRemove, ASTVec& variables) - { - for (unsigned i = 0; i < toRemove.GetChildren().size(); i++) - { - const ASTNode child = toRemove.GetChildren()[i]; - - NodeToDependentNodeMap::const_iterator it = dependents.find(child); - if (it == dependents.end()) - continue; - - it->second->erase(toRemove); - if (it->second->size() == 0) - { - removeNode(child,variables); - continue; - } - - if (child.GetKind() == SYMBOL && it->second->size() ==1) - { - variables.push_back(child); - } - } - } - - void - print() const - { - NodeToDependentNodeMap::const_iterator it = dependents.begin(); - for (/**/; it != dependents.end(); it++) - { - cout << (it->first).GetNodeNum(); - - const set* dep = it->second; - - set::iterator it = dep->begin(); - while (it != dep->end()) - { - cout << " " << (*it).GetNodeNum(); - it++; - } - cout << endl; - } - } - - void - checkInvariant() const - { - // only one node with a single dependent. - } - - const set* - getDependents(const ASTNode n) const - { - if (n.isConstant()) - return ∅ - const NodeToDependentNodeMap::const_iterator it = dependents.find(n); - if (it == dependents.end()) - return ∅ - - return it->second; - } - - // The higher node depends on the lower node. - // The value produces by the lower node is read by the higher node. - bool - nodeDependsOn(const ASTNode& higher, const ASTNode& lower) const - { - const set *s = getDependents(lower); - return s->count(higher) > 0; - } - - bool isUnconstrained(const ASTNode& n) - { - if (n.GetKind() != SYMBOL) - return false; - - NodeToDependentNodeMap::const_iterator it = dependents.find(n); - assert(it != dependents.end()); - return it->second->size() ==1; - } - -#if 0 - void - getAllVariables(ASTVec& v) - { - for (NodeToDependentNodeMap::const_iterator it = dependents.begin(); it != dependents. end(); it++) - { - if (it->first.GetKind() == SYMBOL) - v.push_back(it->first); - } - } -#endif - - }; - - } - ; -} -; - -#endif /* DEPENDENCIES_H_ */ diff --git a/src/vendor/stp/src/simplifier/constantBitP/FixedBits.cpp b/src/vendor/stp/src/simplifier/constantBitP/FixedBits.cpp deleted file mode 100644 index 273175a7d..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/FixedBits.cpp +++ /dev/null @@ -1,569 +0,0 @@ -#include "../../AST/AST.h" -#include "FixedBits.h" -#include "MersenneTwister.h" - - -#include "ConstantBitP_Utility.h" - -// To reduce the memory I tried using the constantbv stuff. But because it is not -// inlined it took about twice as long per propagation as does using a boolean array. -// Other options to reduce memory usage are: vector, dynamic_bitset, or bitMagic. - - -namespace simplifier -{ - namespace constantBitP - { - - std::ostream& - operator<<(std::ostream& output, const FixedBits& h) - { - output << "<"; - for (int i = h.getWidth() - 1; i >= 0; i--) - { - if (h.isFixed(i)) - output << h.getValue(i); - else - output << "-"; - } - - output << ">"; - - return output; - } - - void - FixedBits::fixToZero() - { - for (int i = 0; i < getWidth(); i++) - { - setFixed(i, true); - setValue(i, false); - } - } - - BEEV::CBV - FixedBits::GetBVConst() const - { - assert(isTotallyFixed()); - - BEEV::CBV result = CONSTANTBV::BitVector_Create(width, true); - - for (int i = 0; i < width; i++) - { - if (values[i]) - CONSTANTBV::BitVector_Bit_On(result, i); - } - - return result; - } - - //inclusive - BEEV::CBV - FixedBits::GetBVConst(int to, int from) const - { - assert(to>=from); - assert(from >=0); - int resultWidth = to - from + 1; - - BEEV::CBV result = CONSTANTBV::BitVector_Create(resultWidth, true); - - for (int i = from; i <= to; i++) - { - if (getValue(i)) - CONSTANTBV::BitVector_Bit_On(result, i - from); - } - - return result; - } - - void - FixedBits::init(const FixedBits& copy) - { - width = copy.width; - fixed = new bool[width]; - values = new bool[width]; - representsBoolean = copy.representsBoolean; - - memcpy(fixed, copy.fixed, width * sizeof(bool)); - memcpy(values, copy.values, width * sizeof(bool)); - } - - bool - FixedBits::isTotallyFixed() const - { - for (int i = 0; i < width; i++) - { - if (!fixed[i]) - return false; - } - - return true; - } - - FixedBits::FixedBits(int n, bool isbool) - { - assert(n > 0); - - fixed = new bool[n]; - values = new bool[n]; - width = n; - - for (int i = 0; i < width; i++) - { - fixed[i] = false; // I don't know if there's a default value?? - values[i] = false; // stops it printing out junk. - } - - representsBoolean = isbool; - if (isbool) - assert(1 == width); - - uniqueId = staticUniqueId++; - } - - // There is no way to represent bottom. So we assume a and b are already at least - // one step up the lattice. - FixedBits - FixedBits::meet(const FixedBits& a, const FixedBits& b) - { - assert(a.getWidth() == b.getWidth()); - assert(a.isBoolean() == b.isBoolean()); - - FixedBits result(a.getWidth(), a.isBoolean()); - - for (int i = 0; i < a.getWidth(); i++) - { - if (a.isFixed(i) != b.isFixed(i)) - { - result.setFixed(i, false); - } - else if (a.isFixed(i) && b.isFixed(i) && (a.getValue(i) - != b.getValue(i))) - { - result.setFixed(i, false); - } - else if (a.isFixed(i) && b.isFixed(i)) - { // fixed to the same value. - result.setFixed(i, true); - result.setValue(i, a.getValue(i)); - } - } - return result; - } - - - - void - FixedBits::join(const FixedBits& a) - { - assert(a.getWidth() == getWidth()); - assert(a.isBoolean() == isBoolean()); - - for (int i = 0; i < a.getWidth(); i++) - { - if (a.isFixed(i) && isFixed(i) && (a.getValue(i) == getValue(i))) - { - // nothind. - } - else - { - setFixed(i,false); - } - } - } - - void - FixedBits::join(unsigned int a) - { - for (int i = 0; i < getWidth(); i++) - { - if (isFixed(i)) - { - if ( - (((a >> i) & 1) ==1) - && - !getValue(i) - ) - setFixed(i,false); - else if ((((a >> i) & 1) ==0) && getValue(i)) - setFixed(i,false); - } - } - } - - bool - FixedBits::unsignedHolds(unsigned val) - { - bool r = unsignedHolds_new(val); - //assert (unsignedHolds_old(val) == r); - return r; - } - - // Whether the set of values contains this one. Much faster than the _old version. - bool - FixedBits::unsignedHolds_new(unsigned val) - { - const int initial_width = std::min((int)width, (int)sizeof(unsigned) * 8); - - for (int i = 0; i < initial_width; i++) - { - char v = (*this)[i]; - if ('*'== v) - {} // ok - else if ((v == '1') != ((val & 1) != 0)) - return false; - val = val >> 1; - } - - // If the unsigned representation is bigger, false if not zero. - if ((int) sizeof(unsigned) * 8 > width && (val !=0)) - return false; - - for (int i = (int) sizeof(unsigned) * 8; i < width; i++) - if (isFixed(i) && getValue(i)) - return false; - - return true; - } - - bool - FixedBits::unsignedHolds_old(unsigned val) - { - const unsigned maxWidth = std::max((int) sizeof(unsigned) * 8, width); - for (unsigned i = 0; i < maxWidth; i++) - { - if (i < (unsigned) width && i < sizeof(unsigned) * 8) - { - if (isFixed(i) && (getValue(i) != (((val & (1 << i))) != 0))) - return false; - } - else if (i < (unsigned) width) - { - if (isFixed(i) && getValue(i)) - return false; - } - else // The unsigned value is bigger than the bitwidth of this. - { - if (val & (1 << i)) - return false; - } - } - return true; - } - - // Getting a new random number is expensive. Not sure why. - FixedBits FixedBits::createRandom(const int length, const int probabilityOfSetting, MTRand& trand) - { - assert( 0 <= probabilityOfSetting); - assert( 100 >= probabilityOfSetting); - - FixedBits result(length, false); - - // I'm not sure if the random number generator is generating just 32 bit numbers?? - int i = 0; - int randomV = trand.randInt(); - - int pool = 32; - - while (i < length) - { - if (pool < 8) - { - randomV = trand.randInt(); - pool = 32; - } - - int val = (randomV & 127); - randomV >>= 7; - pool = pool - 7; - - if (val >= 100) - continue; - - if (val < probabilityOfSetting) - { - switch (randomV & 1) - { - case 0: - result.setFixed(i, true); - result.setValue(i, false); - break; - case 1: - result.setFixed(i, true); - result.setValue(i, true); - break; - default: - BEEV::FatalError(LOCATION "never."); - - } - randomV >>= 1; - } - i++; - - } - return result; - } - - // In the world of static analysis this is ALPHA. - FixedBits - FixedBits::concreteToAbstract(const BEEV::ASTNode& n) - { - //cout << n; - - int bitWidth; - if (BEEV::BITVECTOR_TYPE == n.GetType()) - bitWidth = n.GetValueWidth(); - else - bitWidth = 1; - - FixedBits output(bitWidth, BEEV::BOOLEAN_TYPE == n.GetType()); - - if (BEEV::BITVECTOR_TYPE == n.GetType()) - { - // loop through testing each of the bits. - BEEV::CBV cbv = n.GetBVConst(); - - for (int j = 0; j < bitWidth; j++) - { - output.setFixed(j, true); - output.setValue(j, CONSTANTBV::BitVector_bit_test(cbv, j)); - } - } - else - { - if (n.GetKind() == BEEV::TRUE) - { - output.setFixed(0, true); - output.setValue(0, true); - } - else if (n.GetKind() == BEEV::FALSE) - { - output.setFixed(0, true); - output.setValue(0, false); - } - else - BEEV::FatalError("Unexpected", n); - } - return output; - } - - FixedBits - FixedBits::fromUnsignedInt(int width, unsigned val) - { - FixedBits output(width, false); - - const unsigned maxWidth = std::max((int) sizeof(unsigned) * 8, width); - for (unsigned i = 0; i < maxWidth; i++) - { - if (i < (unsigned) width && i < sizeof(unsigned) * 8) - { - output.setFixed(i, true); - output.setValue(i, (val & (1 << i))); - } - else if (i < (unsigned) width) - { - output.setFixed(i, true); - output.setValue(i, false); - - } - else // The unsigned value is bigger than the bitwidth of this. - { // so it can't be represented. - if (val & (1 << i)) - { - BEEV::FatalError(LOCATION "Cant be represented."); - } - } - } - return output; - } - - - void - FixedBits::fromUnsigned(unsigned val) - { - for (unsigned i = 0; i < width; i++) - { - if (i < (unsigned) width && i < sizeof(unsigned) * 8) - { - setFixed(i, true); - setValue(i, (val & (1 << i))); - } - else if (i < (unsigned) width) - { - setFixed(i, true); - setValue(i, false); - } - else // The unsigned value is bigger than the bitwidth of this. - { // so it can't be represented. - if (val & (1 << i)) - { - BEEV::FatalError(LOCATION "Cant be represented."); - } - } - } - } - - int - FixedBits::getUnsignedValue() const - { - assert(isTotallyFixed()); - assert(getWidth() <= 32); - int result = 0; - - for (int i = 0; i < width; i++) - { - if (getValue(i)) - result += (1 << i); - } - return result; - } - - bool - FixedBits::updateOK(const FixedBits& o, const FixedBits &n, const int upTo) - { - assert (n.getWidth() >= upTo); - assert (o.getWidth() >= upTo); - - for (int i = 0; i < upTo; i++) - { - if (n.isFixed(i) && o.isFixed(i)) - { - if (n.getValue(i) != o.getValue(i)) - { - return false; - } - } - else if (o.isFixed(i) && !n.isFixed(i)) - { - return false; - } - } - return true; - } - - // If the oldBits can't become the new bits. While respecting the lattice rules. That's bad. - // For example. A transfer function shouldn't unfix bits. Or chance the fixed bits value. - bool - FixedBits::updateOK(const FixedBits& o, const FixedBits &n) - { - if (n.getWidth() != o.getWidth()) - return false; - - for (int i = 0; i < n.getWidth(); i++) - { - if (n.isFixed(i) && o.isFixed(i)) - { - if (n.getValue(i) != o.getValue(i)) - { - return false; - } - } - else if (o.isFixed(i) && !n.isFixed(i)) - { - return false; - } - } - return true; - } - - // a is "IN" b. - bool - FixedBits::in(const FixedBits& a, const FixedBits& b) - { - assert(a.getWidth() == b.getWidth()); - - for (int i = 0; i < a.getWidth(); i++) - { - if (a.isFixed(i) && b.isFixed(i) && (a.getValue(i) != b.getValue(i))) - { - return false; - } - if (!a.isFixed(i) && b.isFixed(i)) - return false; - } - return true; - } - - // Gets the minimum and maximum unsigned values that are held in the current - // set. It saturates to UINT_MAX. - void - FixedBits::getUnsignedMinMax(unsigned &minShift, unsigned &maxShift) const - { - const int bitWidth = this->getWidth(); - int unsignedBW = sizeof(unsigned)*8; - - minShift = 0; - maxShift = 0; - - bool bigMax = false; - bool bigMin = false; - - for (int i = unsignedBW; i < bitWidth; i++) - { - if ((*this)[i] == '1' || (*this)[i] == '*') - bigMax = true; - - if ((*this)[i] == '1') - bigMin = true; - } - - for (int i = 0; i < std::min(unsignedBW,bitWidth); i++) - { - if ((*this)[i] == '1') - { - minShift |= (1 <= upTo); - assert (b.getWidth() >= upTo); - - for (int i = 0; i < upTo; i++) - { - if (a.isFixed(i) != b.isFixed(i)) - { - return false; - } - if (a.isFixed(i)) - if (a.getValue(i) != b.getValue(i)) - return false; - } - return true; - } - - bool - FixedBits::equals(const FixedBits& a, const FixedBits& b) - { - if (a.getWidth() != b.getWidth()) - return false; - - for (int i = 0; i < a.getWidth(); i++) - { - if (a.isFixed(i) != b.isFixed(i)) - { - return false; - } - if (a.isFixed(i)) - if (a.getValue(i) != b.getValue(i)) - return false; - } - return true; - } - } -} diff --git a/src/vendor/stp/src/simplifier/constantBitP/FixedBits.h b/src/vendor/stp/src/simplifier/constantBitP/FixedBits.h deleted file mode 100644 index 6d7fb2763..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/FixedBits.h +++ /dev/null @@ -1,390 +0,0 @@ -#ifndef FIXEDBITS_H_ -#define FIXEDBITS_H_ - -#include -#include -#include - -class MTRand; - -namespace BEEV -{ - class ASTNode; - typedef unsigned int * CBV; - void FatalError(const char * str); -} - -namespace simplifier -{ - namespace constantBitP - { - - // Gives the file and line number as a string. -#define CONSTANTBITP_UTILITY_STR(s) #s -#define CONSTANTBITP_UTILITY_XSTR(s) CONSTANTBITP_UTILITY_STR(s) -#define LOCATION __FILE__ ":" CONSTANTBITP_UTILITY_XSTR(__LINE__) ": " - - static int staticUniqueId = 1; - - // Bits can be fixed, or unfixed. Fixed bits are fixed to either zero or one. - class FixedBits - { - private: - bool* fixed; - bool* values; - int width; - bool representsBoolean; - - void - init(const FixedBits& copy); - int uniqueId; - - bool - unsignedHolds_new(unsigned val); - bool - unsignedHolds_old(unsigned val); - - - public: - FixedBits(int n, bool isBoolean); - - FixedBits(const FixedBits& copy) - { - assert(this != ©); - init(copy); - uniqueId = staticUniqueId++; - } - - bool - isBoolean() const - { - return representsBoolean; - } - - ~FixedBits() - { - delete[] fixed; - delete[] values; - } - - bool - operator<=(const FixedBits& copy) const - { - return uniqueId <= copy.uniqueId; - } - - const char - operator[] (const int n) const - { - assert(n >=0 && n =0 && n =0 && n = 0; i--) - { - if (!isFixed(i) || getValue(i)) - break; - } - return i; - } - - int - minimum_trailingOne() - { - int i = 0; - for (; i < getWidth(); i++) - { - if (!isFixed(i) || getValue(i)) - break; - } - return i; - } - - int - maximum_trailingOne() - { - int i = 0; - for (; i < getWidth(); i++) - { - if (isFixed(i) && getValue(i)) - break; - } - return i; - } - - - - int - minimum_numberOfTrailingZeroes() - { - int i = 0; - for (; i < getWidth(); i++) - { - if (!isFixed(i) || getValue(i)) - break; - } - return i; - } - - int - maximum_numberOfTrailingZeroes() - { - int i = 0; - for (; i < getWidth(); i++) - { - if (isFixed(i) && getValue(i)) - break; - } - return i; - } - - //Returns the position of the first non-fixed value. - int - leastUnfixed() const - { - int i = 0; - for (; i < getWidth(); i++) - { - if (!isFixed(i)) - break; - } - return i; - } - - int - mostUnfixed() const - { - int i = getWidth()-1; - for (; i >=0; i--) - { - if (!isFixed(i)) - break; - } - return i; - } - - // is this bit fixed to zero? - bool - isFixedToZero(int n) const - { - return isFixed(n) && !getValue(n); - } - - // is this bit fixed to one? - bool - isFixedToOne(int n) const - { - return isFixed(n) && getValue(n); - } - - // is this bit fixed to either zero or one? - bool - isFixed(int n) const - { - assert(n >=0 && n =0 && n = a.getWidth()); - - for (int i = 0; i < a.getWidth(); i++) - { - if (a.isFixed(i)) - { - setFixed(i, true); - setValue(i, a.getValue(i)); - } - else - { - setFixed(i, false); - } - } - } - - - void - copyIn(const FixedBits& a) - { - int to = std::min(getWidth(), a.getWidth()); - for (int i = 0; i < to; i++) - { - assert(!isFixed(i)); - if (a.isFixed(i)) - { - setFixed(i, true); - setValue(i, a.getValue(i)); - } - } - } - - //todo merger with unsignedHolds() - bool - containsZero() const - { - for (int i = 0; i < getWidth(); i++) - if (isFixed(i) && getValue(i)) - return false; - return true; - } - - int - countFixed() const - { - int result = 0; - for (unsigned i = 0; i < (unsigned) width; i++) - if (isFixed(i)) - result++; - return result; - } - - // Result needs to be explicitly deleted. - BEEV::CBV - GetBVConst() const; - - // Result needs to be explicitly deleted. - BEEV::CBV - GetBVConst(int to, int from) const; - - void - getUnsignedMinMax(unsigned &minShift, unsigned &maxShift) const; - - void - mergeIn(const FixedBits& a) - { - assert(a.getWidth() == getWidth()); - for (int i= 0; i < width;i++) - { - if (a.isFixed(i) && !isFixed(i)) - { - setFixed(i,true); - setValue(i,a.getValue(i)); - } - } - } - - - static FixedBits - meet(const FixedBits& a, const FixedBits& b); - - void - join(const FixedBits& a); - - void - join(unsigned int a); - - - static FixedBits - createRandom(const int length, const int probabilityOfSetting, - MTRand& rand); - - void - fromUnsigned(unsigned val); - - static FixedBits - fromUnsignedInt(int width, unsigned val); - - static FixedBits - concreteToAbstract(const BEEV::ASTNode& n); - - static bool - equals(const FixedBits& a, const FixedBits& b); - - static bool - equals(const FixedBits& a, const FixedBits& b, const int upTo); - - static bool - updateOK(const FixedBits& o, const FixedBits & n); - - static bool - updateOK(const FixedBits& o, const FixedBits &n, const int upTo); - - static bool - in(const FixedBits& a, const FixedBits& b); - - }; - - std::ostream& - operator<<(std::ostream& output, const FixedBits& h); - - } -} -#endif /*FIXED_H_*/ diff --git a/src/vendor/stp/src/simplifier/constantBitP/MersenneTwister.h b/src/vendor/stp/src/simplifier/constantBitP/MersenneTwister.h deleted file mode 100644 index 16e64581a..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/MersenneTwister.h +++ /dev/null @@ -1,423 +0,0 @@ -// MersenneTwister.h -// Mersenne Twister random number generator -- a C++ class MTRand -// Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// Richard J. Wagner v1.0 15 May 2003 rjwagner@writeme.com - -// The Mersenne Twister is an algorithm for generating random numbers. It -// was designed with consideration of the flaws in various other generators. -// The period, 2^19937-1, and the order of equidistribution, 623 dimensions, -// are far greater. The generator is also fast; it avoids multiplication and -// division, and it benefits from caches and pipelines. For more information -// see the inventors' web page at http://www.math.keio.ac.jp/~matumoto/emt.html - -// Reference -// M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally -// Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on -// Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. - -// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, -// Copyright (C) 2000 - 2003, Richard J. Wagner -// 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. The names of its contributors may not be used to endorse or promote -// products derived from this software without specific prior written -// permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT OWNER 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 original code included the following notice: -// -// When you use this, send an email to: matumoto@math.keio.ac.jp -// with an appropriate reference to your work. -// -// It would be nice to CC: rjwagner@writeme.com and Cokus@math.washington.edu -// when you write. - -#ifndef MERSENNETWISTER_H -#define MERSENNETWISTER_H - -// Not thread safe (unless auto-initialization is avoided and each thread has -// its own MTRand object) - -#include -#include -#include -#include -#include - -class MTRand { -// Data -public: - typedef unsigned long uint32; // unsigned integer type, at least 32 bits - - enum { N = 624 }; // length of state vector - enum { SAVE = N + 1 }; // length of array for save() - -protected: - enum { M = 397 }; // period parameter - - uint32 state[N]; // internal state - uint32 *pNext; // next value to get from state - int left; // number of values left before reload needed - - -//Methods -public: - MTRand( const uint32& oneSeed ); // initialize with a simple uint32 - MTRand( uint32 *const bigSeed, uint32 const seedLength = N ); // or an array - MTRand(); // auto-initialize with /dev/urandom or time() and clock() - - // Do NOT use for CRYPTOGRAPHY without securely hashing several returned - // values together, otherwise the generator state can be learned after - // reading 624 consecutive values. - - // Access to 32-bit random numbers - double rand(); // real number in [0,1] - double rand( const double& n ); // real number in [0,n] - double randExc(); // real number in [0,1) - double randExc( const double& n ); // real number in [0,n) - double randDblExc(); // real number in (0,1) - double randDblExc( const double& n ); // real number in (0,n) - uint32 randInt(); // integer in [0,2^32-1] - uint32 randInt( const uint32& n ); // integer in [0,n] for n < 2^32 - double operator()() { return rand(); } // same as rand() - - // Access to 53-bit random numbers (capacity of IEEE double precision) - double rand53(); // real number in [0,1) - - // Access to nonuniform random number distributions - double randNorm( const double& mean = 0.0, const double& variance = 0.0 ); - - // Re-seeding functions with same behavior as initializers - void seed( const uint32 oneSeed ); - void seed( uint32 *const bigSeed, const uint32 seedLength = N ); - void seed(); - - // Saving and loading generator state - void save( uint32* saveArray ) const; // to array of size SAVE - void load( uint32 *const loadArray ); // from such array - friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ); - friend std::istream& operator>>( std::istream& is, MTRand& mtrand ); - -protected: - void initialize( const uint32 oneSeed ); - void reload(); - uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; } - uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; } - uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; } - uint32 mixBits( const uint32& u, const uint32& v ) const - { return hiBit(u) | loBits(v); } - uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const - { return m ^ (mixBits(s0,s1)>>1) ^ (-loBit(s1) & 0x9908b0dfUL); } - static uint32 hash( time_t t, clock_t c ); -}; - - -inline MTRand::MTRand( const uint32& oneSeed ) - { seed(oneSeed); } - -inline MTRand::MTRand( uint32 *const bigSeed, const uint32 seedLength ) - { seed(bigSeed,seedLength); } - -inline MTRand::MTRand() - { seed(); } - -inline double MTRand::rand() - { return double(randInt()) * (1.0/4294967295.0); } - -inline double MTRand::rand( const double& n ) - { return rand() * n; } - -inline double MTRand::randExc() - { return double(randInt()) * (1.0/4294967296.0); } - -inline double MTRand::randExc( const double& n ) - { return randExc() * n; } - -inline double MTRand::randDblExc() - { return ( double(randInt()) + 0.5 ) * (1.0/4294967296.0); } - -inline double MTRand::randDblExc( const double& n ) - { return randDblExc() * n; } - -inline double MTRand::rand53() -{ - uint32 a = randInt() >> 5, b = randInt() >> 6; - return ( a * 67108864.0 + b ) * (1.0/9007199254740992.0); // by Isaku Wada -} - -inline double MTRand::randNorm( const double& mean, const double& variance ) -{ - // Return a real number from a normal (Gaussian) distribution with given - // mean and variance by Box-Muller method - double r = sqrt( -2.0 * log( 1.0-randDblExc()) ) * variance; - double phi = 2.0 * 3.14159265358979323846264338328 * randExc(); - return mean + r * cos(phi); -} - -inline MTRand::uint32 MTRand::randInt() -{ - // Pull a 32-bit integer from the generator state - // Every other access function simply transforms the numbers extracted here - - if( left == 0 ) reload(); - --left; - - register uint32 s1; - s1 = *pNext++; - s1 ^= (s1 >> 11); - s1 ^= (s1 << 7) & 0x9d2c5680UL; - s1 ^= (s1 << 15) & 0xefc60000UL; - return ( s1 ^ (s1 >> 18) ); -} - -inline MTRand::uint32 MTRand::randInt( const uint32& n ) -{ - // Find which bits are used in n - // Optimized by Magnus Jonsson (magnus@smartelectronix.com) - uint32 used = n; - used |= used >> 1; - used |= used >> 2; - used |= used >> 4; - used |= used >> 8; - used |= used >> 16; - - // Draw numbers until one is found in [0,n] - uint32 i; - do - i = randInt() & used; // toss unused bits to shorten search - while( i > n ); - return i; -} - - -inline void MTRand::seed( const uint32 oneSeed ) -{ - // Seed the generator with a simple uint32 - initialize(oneSeed); - reload(); -} - - -inline void MTRand::seed( uint32 *const bigSeed, const uint32 seedLength ) -{ - // Seed the generator with an array of uint32's - // There are 2^19937-1 possible initial states. This function allows - // all of those to be accessed by providing at least 19937 bits (with a - // default seed length of N = 624 uint32's). Any bits above the lower 32 - // in each element are discarded. - // Just call seed() if you want to get array from /dev/urandom - initialize(19650218UL); - register int i = 1; - register uint32 j = 0; - register int k = ( N > seedLength ? N : seedLength ); - for( ; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1664525UL ); - state[i] += ( bigSeed[j] & 0xffffffffUL ) + j; - state[i] &= 0xffffffffUL; - ++i; ++j; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - if( j >= seedLength ) j = 0; - } - for( k = N - 1; k; --k ) - { - state[i] = - state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL ); - state[i] -= i; - state[i] &= 0xffffffffUL; - ++i; - if( i >= N ) { state[0] = state[N-1]; i = 1; } - } - state[0] = 0x80000000UL; // MSB is 1, assuring non-zero initial array - reload(); -} - - -inline void MTRand::seed() -{ - // Seed the generator with an array from /dev/urandom if available - // Otherwise use a hash of time() and clock() values - - // First try getting an array from /dev/urandom - FILE* urandom = fopen( "/dev/urandom", "rb" ); - if( urandom ) - { - uint32 bigSeed[N]; - register uint32 *s = bigSeed; - register int i = N; - register bool success = true; - while( success && i-- ) - success = fread( s++, sizeof(uint32), 1, urandom ); - fclose(urandom); - if( success ) { seed( bigSeed, N ); return; } - } - - // Was not successful, so use time() and clock() instead - seed( hash( time(NULL), clock() ) ); -} - - -inline void MTRand::initialize( const uint32 seed ) -{ - // Initialize generator state with seed - // See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. - // In previous versions, most significant bits (MSBs) of the seed affect - // only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. - register uint32 *s = state; - register uint32 *r = state; - register int i = 1; - *s++ = seed & 0xffffffffUL; - for( ; i < N; ++i ) - { - *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL; - r++; - } -} - - -inline void MTRand::reload() -{ - // Generate N new values in state - // Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) - register uint32 *p = state; - register int i; - for( i = N - M; i--; ++p ) - *p = twist( p[M], p[0], p[1] ); - for( i = M; --i; ++p ) - *p = twist( p[M-N], p[0], p[1] ); - *p = twist( p[M-N], p[0], state[0] ); - - left = N, pNext = state; -} - - -inline MTRand::uint32 MTRand::hash( time_t t, clock_t c ) -{ - // Get a uint32 from t and c - // Better than uint32(x) in case x is floating point in [0,1] - // Based on code by Lawrence Kirby (fred@genesis.demon.co.uk) - - static uint32 differ = 0; // guarantee time-based seeds will change - - uint32 h1 = 0; - unsigned char *p = (unsigned char *) &t; - for( size_t i = 0; i < sizeof(t); ++i ) - { - h1 *= UCHAR_MAX + 2U; - h1 += p[i]; - } - uint32 h2 = 0; - p = (unsigned char *) &c; - for( size_t j = 0; j < sizeof(c); ++j ) - { - h2 *= UCHAR_MAX + 2U; - h2 += p[j]; - } - return ( h1 + differ++ ) ^ h2; -} - - -inline void MTRand::save( uint32* saveArray ) const -{ - register uint32 *sa = saveArray; - register const uint32 *s = state; - register int i = N; - for( ; i--; *sa++ = *s++ ) {} - *sa = left; -} - - -inline void MTRand::load( uint32 *const loadArray ) -{ - register uint32 *s = state; - register uint32 *la = loadArray; - register int i = N; - for( ; i--; *s++ = *la++ ) {} - left = *la; - pNext = &state[N-left]; -} - - -inline std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ) -{ - register const MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for( ; i--; os << *s++ << "\t" ) {} - return os << mtrand.left; -} - - -inline std::istream& operator>>( std::istream& is, MTRand& mtrand ) -{ - register MTRand::uint32 *s = mtrand.state; - register int i = mtrand.N; - for( ; i--; is >> *s++ ) {} - is >> mtrand.left; - mtrand.pNext = &mtrand.state[mtrand.N-mtrand.left]; - return is; -} - -#endif // MERSENNETWISTER_H - -// Change log: -// -// v0.1 - First release on 15 May 2000 -// - Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus -// - Translated from C to C++ -// - Made completely ANSI compliant -// - Designed convenient interface for initialization, seeding, and -// obtaining numbers in default or user-defined ranges -// - Added automatic seeding from /dev/urandom or time() and clock() -// - Provided functions for saving and loading generator state -// -// v0.2 - Fixed bug which reloaded generator one step too late -// -// v0.3 - Switched to clearer, faster reload() code from Matthew Bellew -// -// v0.4 - Removed trailing newline in saved generator format to be consistent -// with output format of built-in types -// -// v0.5 - Improved portability by replacing static const int's with enum's and -// clarifying return values in seed(); suggested by Eric Heimburg -// - Removed MAXINT constant; use 0xffffffffUL instead -// -// v0.6 - Eliminated seed overflow when uint32 is larger than 32 bits -// - Changed integer [0,n] generator to give better uniformity -// -// v0.7 - Fixed operator precedence ambiguity in reload() -// - Added access for real numbers in (0,1) and (0,n) -// -// v0.8 - Included time.h header to properly support time_t and clock_t -// -// v1.0 - Revised seeding to match 26 Jan 2002 update of Nishimura and Matsumoto -// - Allowed for seeding with arrays of any length -// - Added access for real numbers in [0,1) with 53-bit resolution -// - Added access for real numbers from normal (Gaussian) distributions -// - Increased overall speed by optimizing twist() -// - Doubled speed of integer [0,n] generation -// - Fixed out-of-range number generation on 64-bit machines -// - Improved portability by substituting literal constants for long enum's -// - Changed license from GNU LGPL to BSD diff --git a/src/vendor/stp/src/simplifier/constantBitP/MultiplicationStats.h b/src/vendor/stp/src/simplifier/constantBitP/MultiplicationStats.h deleted file mode 100644 index 8362cddc1..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/MultiplicationStats.h +++ /dev/null @@ -1,173 +0,0 @@ -#ifndef MULTPLICATIONSTATS_H_ -#define MULTPLICATIONSTATS_H_ - -#include "../../AST/AST.h" -#include -#include "FixedBits.h" - -namespace simplifier -{ - namespace constantBitP - { - struct MultiplicationStats - { - private: - - void - clear() - { - delete[] columnH; - delete[] columnL; - delete[] sumL; - delete[] sumH; - - columnH = NULL; - columnL = NULL; - sumL = NULL; - sumH = NULL; - } - - void - copyIn(const MultiplicationStats& f) - { - bitWidth = f.bitWidth; - columnL = new signed[bitWidth]; - columnH = new signed[bitWidth]; - sumL = new signed[bitWidth]; - sumH = new signed[bitWidth]; - - for (unsigned i = 0; i < bitWidth; i++) - { - columnL[i] = f.columnL[i]; - columnH[i] = f.columnH[i]; - sumL[i] = f.sumL[i]; - sumH[i] = f.sumH[i]; - } - x = f.x; - y = f.y; - r = f.r; - } - - public: - - signed *columnH; // maximum number of true partial products. - signed *columnL; // minimum "" "" - signed *sumH; - signed *sumL; - unsigned int bitWidth; - - FixedBits x, y, r; - - MultiplicationStats() : - x(1, false), y(1, false), r(1, false) - { - columnH = NULL; - columnL = NULL; - sumH = NULL; - sumL = NULL; - bitWidth = 0; - } - - ~MultiplicationStats() - { - clear(); - } - - MultiplicationStats(const MultiplicationStats& f) : - x(f.x), y(f.y), r(f.r) - { - copyIn(f); - } - - MultiplicationStats& - operator=(const MultiplicationStats& f) - { - if (&f == this) - return *this; - - clear(); - copyIn(f); - - return *this; - } - - MultiplicationStats(int bitWidth_, signed * columnL_, signed * columnH_, signed * sumL_, signed * sumH_) : - x(1, false), y(1, false), r(1, false) - { - bitWidth = bitWidth_; - columnL = new signed[bitWidth]; - columnH = new signed[bitWidth]; - sumL = new signed[bitWidth]; - sumH = new signed[bitWidth]; - - for (unsigned i = 0; i < bitWidth; i++) - { - columnL[i] = columnL_[i]; - columnH[i] = columnH_[i]; - sumL[i] = sumL_[i]; - sumH[i] = sumH_[i]; - } - } - - void - print() - { - ostream& log = std::cerr; - - log << x << " * " << y << "=" << r << endl; - - log << " columnL:"; - for (unsigned i = 0; i < bitWidth; i++) - { - log << columnL[bitWidth - 1 - i] << " "; - } - log << endl; - log << " columnH:"; - for (unsigned i = 0; i < bitWidth; i++) - { - log << columnH[bitWidth - 1 - i] << " "; - } - log << endl; - log << " sumL: "; - - for (unsigned i = 0; i < bitWidth; i++) - { - log << sumL[bitWidth - 1 - i] << " "; - } - log << endl; - log << " sumH: "; - for (unsigned i = 0; i < bitWidth; i++) - { - log << sumH[bitWidth - 1 - i] << " "; - } - log << endl; - } - - }; - - class MultiplicationStatsMap - { - public: - typedef std::map NodeToStats; - NodeToStats map; - - void - print() - { - cout << "Size:" << map.size() << endl; - - simplifier::constantBitP::MultiplicationStatsMap::NodeToStats::iterator it; - - for (it = map.begin(); it != map.end(); it++) - { - cout << it->first; - it->second.print(); - } - } - }; - - }; - -}; - -#endif diff --git a/src/vendor/stp/src/simplifier/constantBitP/NodeToFixedBitsMap.h b/src/vendor/stp/src/simplifier/constantBitP/NodeToFixedBitsMap.h deleted file mode 100644 index da1ad0459..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/NodeToFixedBitsMap.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * pimpl class to make compiling easier. - */ - -#ifndef NODETOFIXEDBITSMAP_H_ -#define NODETOFIXEDBITSMAP_H_ - -#include "../../AST/AST.h" -#include "FixedBits.h" - -namespace simplifier -{ - namespace constantBitP - { - - class NodeToFixedBitsMap - { - public: - typedef std::unordered_map - NodeToFixedBitsMapType; - - NodeToFixedBitsMapType* map; - - NodeToFixedBitsMap(int size) - { - map = new NodeToFixedBitsMapType(size); - } - virtual - ~NodeToFixedBitsMap() - { - clear(); - delete map; - } - - void - clear() - { - NodeToFixedBitsMap::NodeToFixedBitsMapType::iterator itD = map->begin(); - for (; itD != map->end(); itD++) - delete itD->second; - map->clear(); - } - }; - } - ; -} -; - -#endif /* NODETOFIXEDBITSMAP_H_ */ diff --git a/src/vendor/stp/src/simplifier/constantBitP/WorkList.h b/src/vendor/stp/src/simplifier/constantBitP/WorkList.h deleted file mode 100644 index 6df1f605c..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/WorkList.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef WORKLIST_H_ -#define WORKLIST_H_ - -namespace simplifier -{ - namespace constantBitP - { - - class WorkList - { - /* Rough worklist. Constraint Programming people have lovely structures to do this - * The set (on my machine), is implemented by red-black trees. Deleting just from one end may unbalance the tree?? - */ - - private: - - // select nodes from the cheap_worklist first. - set cheap_workList; // Nodes to work on. - set expensive_workList; // Nodes to work on. - - WorkList(const WorkList&); // Shouldn't needed to copy or assign. - WorkList& - operator=(const WorkList&); - - // We add to the worklist any node that immediately depends on a constant. - void - addToWorklist(const ASTNode& n, ASTNodeSet& visited) - { - if (n.isConstant()) - return; - - if (visited.find(n) != visited.end()) - return; - - visited.insert(n); - - bool alreadyAdded = false; - - for (unsigned i = 0; i < n.GetChildren().size(); i++) - { - if (!alreadyAdded && n[i].isConstant()) - { - alreadyAdded = true; - push(n); - } - addToWorklist(n[i], visited); - } - } - - public: - // Add to the worklist any node that immediately depends on a constant. - - WorkList(const ASTNode& top) - { - initWorkList(top); - } - - int size() - { - return cheap_workList.size() + expensive_workList.size(); - } - - void - initWorkList(const ASTNode&n) - { - ASTNodeSet visited; - addToWorklist(n, visited); - } - - - void - push(const BEEV::ASTNode& n) - { - if (n.isConstant()) // don't ever add constants to the worklist. - return; - - //cerr << "WorkList Inserting:" << n.GetNodeNum() << endl; - if (n.GetKind() == BVMULT || n.GetKind() == BVPLUS || n.GetKind() == BVDIV) - expensive_workList.insert(n); - else - cheap_workList.insert(n); - - } - - BEEV::ASTNode - pop() - { - assert(!isEmpty()); - if (cheap_workList.size() > 0) - { - ASTNode ret = *cheap_workList.begin(); - cheap_workList.erase(cheap_workList.begin()); - return ret; - } - else - { - assert (expensive_workList.size() > 0); - ASTNode ret = *expensive_workList.begin(); - expensive_workList.erase(expensive_workList.begin()); - return ret; - } - } - - bool - isEmpty() - { - return cheap_workList.empty() && expensive_workList.empty(); - } - - void - print() - { - cerr << "+Worklist" << endl; - set::const_iterator it = cheap_workList.begin(); - while (it != cheap_workList.end()) - { - cerr << *it << " "; - it++; - } - - it = expensive_workList.begin(); - while (it != expensive_workList.end()) - { - cerr << *it << " "; - it++; - } - - cerr << "-Worklist" << endl; - - } - }; - }; -}; - -#endif /* WORKLIST_H_ */ diff --git a/src/vendor/stp/src/simplifier/constantBitP/multiplication/ColumnCounts.h b/src/vendor/stp/src/simplifier/constantBitP/multiplication/ColumnCounts.h deleted file mode 100644 index d4b852126..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/multiplication/ColumnCounts.h +++ /dev/null @@ -1,281 +0,0 @@ -/* - * ColumnCounts.h - * - * Created on: 24/03/2010 - * Author: thansen - */ - -#ifndef COLUMNCOUNTS_H_ -#define COLUMNCOUNTS_H_ - -namespace simplifier -{ - namespace constantBitP - { - - extern std::ostream& log; - - struct Interval - { - int& low; - int& high; - Interval(int& _low, int& _high) : - low(_low), high(_high) - { - } - }; - - struct ColumnCounts - { - signed *columnH; // maximum number of true partial products. - signed *columnL; // minimum "" "" - signed *sumH; - signed *sumL; - unsigned int bitWidth; - const FixedBits & output; - - ColumnCounts(signed _columnH[], signed _columnL[], signed _sumH[], signed _sumL[], unsigned _bitWidth, - FixedBits& output_) : - columnH(_columnH), columnL(_columnL), sumH(_sumH), sumL(_sumL), output(output_) - { - // setup the low and highs. - bitWidth = _bitWidth; - // initialise 'em. - for (unsigned i = 0; i < bitWidth; i++) - { - columnL[i] = 0; - columnH[i] = i + 1; - } - } - - void - rebuildSums() - { - // Initialise sums. - sumL[0] = columnL[0]; - sumH[0] = columnH[0]; - snapTo(0); - - for (unsigned i = /**/1 /**/; i < bitWidth; i++) - { - assert((columnH[i] >= columnL[i]) && (columnL[i] >= 0)); - sumH[i] = columnH[i] + (sumH[i - 1] / 2); - sumL[i] = columnL[i] + (sumL[i - 1] / 2); - if (output.isFixed(i)) - snapTo(i); - } - } - - void - print(string message) - { - log << message << endl; - log << " columnL:"; - for (unsigned i = 0; i < bitWidth; i++) - { - log << columnL[bitWidth - 1 - i] << " "; - } - log << endl; - log << " columnH:"; - for (unsigned i = 0; i < bitWidth; i++) - { - log << columnH[bitWidth - 1 - i] << " "; - } - log << endl; - log << " sumL: "; - - for (unsigned i = 0; i < bitWidth; i++) - { - log << sumL[bitWidth - 1 - i] << " "; - } - log << endl; - log << " sumH: "; - for (unsigned i = 0; i < bitWidth; i++) - { - log << sumH[bitWidth - 1 - i] << " "; - } - log << endl; - } - - Result - snapTo(int i) - { - Result r = NO_CHANGE; - if (output.isFixed(i)) - { - //bool changed = false; - int expected = output.getValue(i) ? 1 : 0; - - // output is true. So the maximum and minimum can only be even. - if ((sumH[i] & 1) != expected) - { - sumH[i]--; - r = CHANGED; - } - if ((sumL[i] & 1) != expected) - { - sumL[i]++; - r = CHANGED; - } - - if (((sumH[i] < sumL[i]) || (sumL[i] < 0))) - return CONFLICT; - } - return r; - } - - // update the sum of a column to the parity of the output for that column. e.g. [0,2] if the answer is 1, goes to [1,1]. - Result - snapTo() - { - Result r = NO_CHANGE; - - // Make sure each column's sum is consistent with the output. - for (unsigned i = 0; i < bitWidth; i++) - { - r = merge(r, snapTo(i)); - } - return r; - } - - bool - inConflict() - { - for (unsigned i = 0; i < bitWidth; i++) - if ((sumL[i] > sumH[i]) || (columnL[i] > columnH[i])) - return true; - return false; - - } - - Result - fixedPoint() - { - if (inConflict()) - return CONFLICT; - - bool changed = true; - bool totalChanged = false; - - while (changed) - { - changed = false; - - Result r = snapTo(); - if (r == CHANGED) - changed = true; - if (r == CONFLICT) - return CONFLICT; - - r = propagate(); - if (r == CHANGED) - changed = true; - if (r == CONFLICT) - return CONFLICT; - - if (changed) - totalChanged = true; - } - - if (inConflict()) - return CONFLICT; - - assert(propagate() == NO_CHANGE); - assert(snapTo() == NO_CHANGE); - - if (totalChanged) - return CHANGED; - else - return NO_CHANGE; - } - - //Assert that all the counts are consistent. - Result - propagate() - { - bool changed = false; - - int i = 0; - - // - if (sumL[i] > columnL[i]) - { - columnL[i] = sumL[i]; - changed = true; - } - if (sumL[i] < columnL[i]) - { - sumL[i] = columnL[i]; - changed = true; - } - if (sumH[i] < columnH[i]) - { - columnH[i] = sumH[i]; - changed = true; - } - if (sumH[i] > columnH[i]) - { - sumH[i] = columnH[i]; - changed = true; - } - - for (unsigned i = 1; i < bitWidth; i++) - { - Interval a(sumL[i], sumH[i]); - Interval b(columnL[i], columnH[i]); - - int low = sumL[i - 1] / 2; // interval takes references. - int high = sumH[i - 1] / 2; - Interval c(low, high); - - if (a.low < b.low + c.low) - { - a.low = b.low + c.low; - changed = true; - } - - if (a.high > b.high + c.high) - { - changed = true; - a.high = b.high + c.high; - } - - if (a.low - b.high > c.low) - { - int toAssign = ((a.low - b.high) * 2); - assert(toAssign > sumL[i - 1]); - sumL[i - 1] = toAssign; - changed = true; - } - - if (a.high - b.low < c.high) - { - int toAssign = ((a.high - b.low) * 2) + 1; - assert(toAssign < sumH[i - 1]); - sumH[i - 1] = toAssign; - changed = true; - } - - if (a.low - c.high > b.low) - { - b.low = a.low - c.high; - changed = true; - } - - if (a.high - c.low < b.high) - { - b.high = a.high - c.low; - changed = true; - } - - } - if (changed) - return CHANGED; - else - return NO_CHANGE; - } - }; - } -} - -#endif /* COLUMNCOUNTS_H_ */ diff --git a/src/vendor/stp/src/simplifier/constantBitP/multiplication/ColumnStats.h b/src/vendor/stp/src/simplifier/constantBitP/multiplication/ColumnStats.h deleted file mode 100644 index 2ebb3eb6d..000000000 --- a/src/vendor/stp/src/simplifier/constantBitP/multiplication/ColumnStats.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * ColumnStats.h - * - * Created on: 24/03/2010 - * Author: thansen - */ - -#ifndef COLUMNSTATS_H_ -#define COLUMNSTATS_H_ - -namespace simplifier -{ - namespace constantBitP - { - - extern const bool debug_multiply; - - struct ColumnStats - { - int columnUnfixed; // both unfixed. - int columnOneFixed; // one of the values is fixed to one, the other is unfixed. - int columnOnes; // both are fixed to one. - int columnZeroes; // one is fixed to zero. - - ColumnStats(const FixedBits & x, const FixedBits & y, int index) - { - columnUnfixed = 0; - columnOneFixed = 0; - columnOnes = 0; - columnZeroes = 0; - - assert(index < x.getWidth()); - assert(y.getWidth() == x.getWidth()); - - if (debug_multiply) - log << "ColumnStats" << index << " " << x << " " << y << endl; - - for (unsigned i = 0; i <= (unsigned) index; i++) - { - bool xIsFixed = x.isFixed(index - i); - bool yIsFixed; - - if (xIsFixed && !x.getValue(index - i)) - columnZeroes++; - else if ((yIsFixed = y.isFixed(i)) && !y.getValue(i)) - columnZeroes++; - else if (xIsFixed && x.getValue(index - i) && yIsFixed && y.getValue(i)) - columnOnes++; - else if (yIsFixed && y.getValue(i)) - columnOneFixed++; - else if (xIsFixed && x.getValue(index - i)) - columnOneFixed++; - else - columnUnfixed++; - } - - assert(columnOnes >= 0 && columnUnfixed >= 0 && columnZeroes >= 0 && columnOneFixed >= 0); - assert(columnOnes + columnUnfixed + columnOneFixed + columnZeroes == (index + 1)); - } - - }; - - std::ostream& - operator<<(std::ostream& o, const ColumnStats& cs) - { - o << "cUnfixed:" << cs.columnUnfixed << endl; // both unfixed. - o << "cOneFixed:" << cs.columnOneFixed << endl; // one of the values is fixed to one. - o << "cOnes:" << cs.columnOnes << endl; - o << "cZero:" << cs.columnZeroes << endl; - return o; - } - } -} - -#endif /* COLUMNSTATS_H_ */ diff --git a/src/vendor/stp/src/simplifier/consteval.cpp b/src/vendor/stp/src/simplifier/consteval.cpp deleted file mode 100644 index 412f100d5..000000000 --- a/src/vendor/stp/src/simplifier/consteval.cpp +++ /dev/null @@ -1,795 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include -#include "simplifier.h" - -namespace BEEV -{ - - //error printing - static void BVConstEvaluatorError(CONSTANTBV::ErrCode e) - { - std::string ss("BVConstEvaluator:"); - ss += (const char*) BitVector_Error(e); - FatalError(ss.c_str()); - } - - - -// Const evaluator logical and arithmetic operations. - ASTNode NonMemberBVConstEvaluator(STPMgr* _bm , const Kind k, const ASTVec& input_children, unsigned int inputwidth) - { - ASTNode OutputNode; - - ASTNode& ASTTrue = _bm->ASTTrue; - ASTNode& ASTFalse = _bm->ASTFalse; - - unsigned int outputwidth = inputwidth; - CBV output = NULL; - - CBV tmp0 = NULL; - CBV tmp1 = NULL; - - unsigned int number_of_children = input_children.size(); - assert(number_of_children >=1); - assert(k != BVCONST); - - ASTVec children; - children.reserve(number_of_children); - for (int i =0; i < number_of_children; i++) - { - if (input_children[i].isConstant()) - children.push_back(input_children[i]); - else - children.push_back(NonMemberBVConstEvaluator(input_children[i])); - } - - if ((number_of_children ==2 || number_of_children == 1) && input_children[0].GetType() == BITVECTOR_TYPE) - { - //saving some typing. BVPLUS does not use these variables. if the - //input BVPLUS has two nodes, then we want to avoid setting these - //variables. - if (1 == number_of_children) - { - tmp0 = children[0].GetBVConst(); - } - else if (2 == number_of_children && k != BVPLUS) - { - tmp0 = children[0].GetBVConst(); - tmp1 = children[1].GetBVConst(); - } - } - - switch (k) - { - case UNDEFINED: - case READ: - case WRITE: - case SYMBOL: - FatalError("BVConstEvaluator: term is not a constant-term"); - break; - //case BVCONST: -// OutputNode = t; - // break; - case BVNEG: - { - output = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::Set_Complement(output, tmp0); - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - case BVSX: - case BVZX: - { - output = CONSTANTBV::BitVector_Create(inputwidth, true); - unsigned t0_width = input_children[0].GetValueWidth(); - if (inputwidth == t0_width) - { - CONSTANTBV::BitVector_Copy(output, tmp0); - OutputNode = _bm->CreateBVConst(output, outputwidth); - } - else - { - bool topbit_sign = (k == BVSX)?(CONSTANTBV::BitVector_Sign(tmp0) < 0): false; - - if (topbit_sign) - { - CONSTANTBV::BitVector_Fill(output); - } - CONSTANTBV::BitVector_Interval_Copy(output, tmp0, 0, 0, t0_width); - OutputNode = _bm->CreateBVConst(output, outputwidth); - } - break; - } - - case BVLEFTSHIFT: - case BVRIGHTSHIFT: - case BVSRSHIFT: - { - // load in the bitWidth. - CBV width = CONSTANTBV::BitVector_Create(inputwidth, true); - for (unsigned i = 0; i < sizeof(inputwidth) * 8; i++) - if ((inputwidth & (0x1 << i)) != 0) - CONSTANTBV::BitVector_Bit_On(width, i); - - output = CONSTANTBV::BitVector_Create(inputwidth, true); - - // Number of bits to shift it. - ASTNode shiftNode = children[1]; - - bool msb = CONSTANTBV::BitVector_msb_(tmp0); - - // If this shift is greater than the bitWidth, make it zero. - if (CONSTANTBV::BitVector_Lexicompare(width, shiftNode.GetBVConst()) < 0) - { - if (k == BVSRSHIFT && msb) - CONSTANTBV::Set_Complement(output, output); - } - else - { - // the shift is destructive, get a copy. - CONSTANTBV::BitVector_Interval_Copy(output, tmp0, 0, 0, inputwidth); - - unsigned int shift = shiftNode.GetUnsignedConst(); - - if (k == BVLEFTSHIFT) - CONSTANTBV::BitVector_Move_Left(output, shift); - else - CONSTANTBV::BitVector_Move_Right(output, shift); - - if (k == BVSRSHIFT && msb) - { - // signed shift, and the number was originally negative. - // Shift may be larger than the inputwidth. - for (unsigned int i = 0; i < min(shift, inputwidth); i++) - { - CONSTANTBV::BitVector_Bit_On(output, (inputwidth - 1 - i)); - } - assert(CONSTANTBV::BitVector_Sign(output) == -1); //must be negative. - } - } - - OutputNode = _bm->CreateBVConst(output, outputwidth); - - CONSTANTBV::BitVector_Destroy(width); - break; - } - - - case BVAND: - { - assert(1 <= number_of_children); - - output = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_Fill(output); - - for (ASTVec::iterator it = children.begin(), itend = children.end(); it != itend; it++) - { - CBV kk = (*it).GetBVConst(); - CONSTANTBV::Set_Intersection(output, output, kk); - } - - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - case BVOR: - { - assert(1 <= number_of_children); - - output = CONSTANTBV::BitVector_Create(inputwidth, true); - - for (ASTVec::iterator it = children.begin(), itend = children.end(); it != itend; it++) - { - CBV kk = (*it).GetBVConst(); - CONSTANTBV::Set_Union(output, output, kk); - } - - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - case BVXOR: - { - assert(2==number_of_children); - output = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::Set_ExclusiveOr(output, tmp0, tmp1); - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - case BVSUB: - { - assert(2==number_of_children); - output = CONSTANTBV::BitVector_Create(inputwidth, true); - bool carry = false; - CONSTANTBV::BitVector_sub(output, tmp0, tmp1, &carry); - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - case BVUMINUS: - { - output = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_Negate(output, tmp0); - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - case BVEXTRACT: - { - output = CONSTANTBV::BitVector_Create(inputwidth, true); - tmp0 = children[0].GetBVConst(); - unsigned int hi = children[1].GetUnsignedConst(); - unsigned int low = children[2].GetUnsignedConst(); - unsigned int len = hi - low + 1; - - CONSTANTBV::BitVector_Destroy(output); - output = CONSTANTBV::BitVector_Create(len, false); - CONSTANTBV::BitVector_Interval_Copy(output, tmp0, 0, low, len); - outputwidth = len; - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - - case BVCONCAT: - { - assert(2==number_of_children); - output = CONSTANTBV::BitVector_Create(inputwidth, true); - unsigned t0_width = children[0].GetValueWidth(); - unsigned t1_width = children[1].GetValueWidth(); - CONSTANTBV::BitVector_Destroy(output); - - output = CONSTANTBV::BitVector_Concat(tmp0, tmp1); - outputwidth = t0_width + t1_width; - OutputNode = _bm->CreateBVConst(output, outputwidth); - - break; - } - case BVMULT: - { - output = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_increment(output); - - CBV tmp = CONSTANTBV::BitVector_Create(2 * inputwidth, true); - - for (ASTVec::iterator it = children.begin(), itend = children.end(); it != itend; it++) - { - CBV kk = (*it).GetBVConst(); - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Multiply(tmp, output, kk); - - if (0 != e) - { - BVConstEvaluatorError(e); - } - CONSTANTBV::BitVector_Interval_Copy(output, tmp, 0, 0, inputwidth); - - } - - OutputNode = _bm->CreateBVConst(output, outputwidth); - CONSTANTBV::BitVector_Destroy(tmp); - break; - } - case BVPLUS: - { - output = CONSTANTBV::BitVector_Create(inputwidth, true); - bool carry = false; - for (ASTVec::iterator it = children.begin(), itend = children.end(); it != itend; it++) - { - CBV kk = (*it).GetBVConst(); - CONSTANTBV::BitVector_add(output, output, kk, &carry); - carry = false; - } - OutputNode = _bm->CreateBVConst(output, outputwidth); - break; - } - - // SBVREM : Result of rounding the quotient towards - // zero. i.e. (-10)/3, has a remainder of -1 - // - // SBVMOD : Result of rounding the quotient towards - // -infinity. i.e. (-10)/3, has a modulus of 2. EXCEPT THAT - // if it divides exactly and the signs are different, then - // it's equal to the dividend. - case SBVDIV: - case SBVREM: - { - assert(2==number_of_children); - CBV quotient = CONSTANTBV::BitVector_Create(inputwidth, true); - CBV remainder = CONSTANTBV::BitVector_Create(inputwidth, true); - - if (_bm->UserFlags.division_by_zero_returns_one_flag - && CONSTANTBV::BitVector_is_empty(tmp1)) - { - // Expecting a division by zero. Just return one. - if (k==SBVREM) - OutputNode = children[0]; - else - { - if (CONSTANTBV::BitVector_bit_test(tmp0, inputwidth-1)) - OutputNode = _bm->CreateMaxConst(inputwidth); - else - OutputNode = _bm->CreateOneConst(inputwidth); - } - - CONSTANTBV::BitVector_Destroy(remainder); - CONSTANTBV::BitVector_Destroy(quotient); - } - else - { - CONSTANTBV::ErrCode e = - CONSTANTBV::BitVector_Divide(quotient, tmp0, tmp1, remainder); - - if (e != 0) - { - cerr << "WARNING" << endl; - FatalError((const char*) CONSTANTBV::BitVector_Error(e)); - } - - if (SBVDIV == k) - { - OutputNode = _bm->CreateBVConst(quotient, outputwidth); - CONSTANTBV::BitVector_Destroy(remainder); - } - else - { - OutputNode = _bm->CreateBVConst(remainder, outputwidth); - CONSTANTBV::BitVector_Destroy(quotient); - - } - } - break; - } - - case SBVMOD: - { - assert(2==number_of_children); -/* - (bvsmod s t) abbreviates - (let ((?msb_s ((_ extract |m-1| |m-1|) s)) - (?msb_t ((_ extract |m-1| |m-1|) t))) - (let ((abs_s (ite (= ?msb_s #b0) s (bvneg s))) - (abs_t (ite (= ?msb_t #b0) t (bvneg t)))) - (let ((u (bvurem abs_s abs_t))) - (ite (= u (_ bv0 m)) - u - (ite (and (= ?msb_s #b0) (= ?msb_t #b0)) - u - (ite (and (= ?msb_s #b1) (= ?msb_t #b0)) - (bvadd (bvneg u) t) - (ite (and (= ?msb_s #b0) (= ?msb_t #b1)) - (bvadd u t) - (bvneg u)))))))) -*/ - - assert(input_children[0].GetValueWidth() == input_children[1].GetValueWidth()); - - bool isNegativeS = CONSTANTBV::BitVector_msb_(tmp0); - bool isNegativeT = CONSTANTBV::BitVector_msb_(tmp1); - - CBV quotient = CONSTANTBV::BitVector_Create(inputwidth, true); - CBV remainder = CONSTANTBV::BitVector_Create(inputwidth, true); - tmp0 = CONSTANTBV::BitVector_Clone(tmp0); - tmp1 = CONSTANTBV::BitVector_Clone(tmp1); - - if (_bm->UserFlags.division_by_zero_returns_one_flag - && CONSTANTBV::BitVector_is_empty(tmp1)) - { - // Return the top for a division be zero. - OutputNode = children[0]; - CONSTANTBV::BitVector_Destroy(remainder); - } - else - { - if (!isNegativeS && !isNegativeT) - { - // Signs are both positive - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Div_Pos(quotient, tmp0, tmp1, remainder); - if (e != CONSTANTBV::ErrCode_Ok) - { - cerr << "Error code was:" << e << endl; - assert(e == CONSTANTBV::ErrCode_Ok); - } - OutputNode = _bm->CreateBVConst(remainder, outputwidth); - } - else if (isNegativeS && !isNegativeT) - { - // S negative, T positive. - CBV tmp0b = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_Negate(tmp0b, tmp0); - - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Div_Pos(quotient, tmp0b, tmp1, remainder); - assert(e == CONSTANTBV::ErrCode_Ok); - - CBV remb = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_Negate(remb, remainder); - - if (CONSTANTBV::BitVector_is_empty(remb)) - { - OutputNode = _bm->CreateZeroConst(outputwidth); - } - else - { - CBV res = CONSTANTBV::BitVector_Create(inputwidth, true); - bool carry = false; - CONSTANTBV::BitVector_add(res, remb, tmp1, &carry); - OutputNode = _bm->CreateBVConst(res, outputwidth); - } - - CONSTANTBV::BitVector_Destroy(remb); - CONSTANTBV::BitVector_Destroy(tmp0b); - CONSTANTBV::BitVector_Destroy(remainder); - } - else if (!isNegativeS && isNegativeT) - { - // If s is positive and t is negative - CBV tmp1b = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_Negate(tmp1b, tmp1); - - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Div_Pos(quotient, tmp0, tmp1b, remainder); - - assert(e == CONSTANTBV::ErrCode_Ok); - - if (CONSTANTBV::BitVector_is_empty(remainder)) - { - OutputNode = _bm->CreateZeroConst(outputwidth); - } - else - { - CBV res = CONSTANTBV::BitVector_Create(inputwidth, true); - bool carry = false; - CONSTANTBV::BitVector_add(res, remainder, tmp1, &carry); - OutputNode = _bm->CreateBVConst(res, outputwidth); - } - - CONSTANTBV::BitVector_Destroy(tmp1b); - CONSTANTBV::BitVector_Destroy(remainder); - } - else if (isNegativeS && isNegativeT) - { - // Signs are both negative - CBV tmp0b = CONSTANTBV::BitVector_Create(inputwidth, true); - CBV tmp1b = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_Negate(tmp0b, tmp0); - CONSTANTBV::BitVector_Negate(tmp1b, tmp1); - - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Div_Pos(quotient, tmp0b, tmp1b, remainder); - assert(e == CONSTANTBV::ErrCode_Ok); - - CBV remb = CONSTANTBV::BitVector_Create(inputwidth, true); - CONSTANTBV::BitVector_Negate(remb, remainder); - - OutputNode = _bm->CreateBVConst(remb, outputwidth); - CONSTANTBV::BitVector_Destroy(tmp0b); - CONSTANTBV::BitVector_Destroy(tmp1b); - CONSTANTBV::BitVector_Destroy(remainder); - } - else - { - FatalError("never get called"); - } - } - - CONSTANTBV::BitVector_Destroy(tmp0); - CONSTANTBV::BitVector_Destroy(tmp1); - CONSTANTBV::BitVector_Destroy(quotient); - } - break; - - case BVDIV: - case BVMOD: - { - assert(2==number_of_children); - - if (_bm->UserFlags.division_by_zero_returns_one_flag - && CONSTANTBV::BitVector_is_empty(tmp1)) - { - // a = bq + r, where b!=0 implies r < b. q is quotient, r remainder. i.e. a/b = q. - // It doesn't matter what q is when b=0, but r needs to be a. - if (k == BVMOD) - OutputNode = children[0]; - else - OutputNode = _bm->CreateOneConst(outputwidth); - // Expecting a division by zero. Just return one. - - } - else - { - CBV quotient = CONSTANTBV::BitVector_Create(inputwidth, true); - CBV remainder = CONSTANTBV::BitVector_Create(inputwidth, true); - - // tmp0 is dividend, tmp1 is the divisor All parameters - //to BitVector_Div_Pos must be distinct unlike - //BitVector_Divide FIXME the contents of the second - //parameter to Div_Pos is destroyed As tmp0 is currently - //the same as the copy belonging to an ASTNode input_children[0] this - //must be copied. - tmp0 = CONSTANTBV::BitVector_Clone(tmp0); - CONSTANTBV::ErrCode e = CONSTANTBV::BitVector_Div_Pos(quotient, tmp0, tmp1, remainder); - CONSTANTBV::BitVector_Destroy(tmp0); - - if (0 != e) - { - CONSTANTBV::BitVector_Destroy(quotient); - CONSTANTBV::BitVector_Destroy(remainder); - //error printing - if (_bm->counterexample_checking_during_refinement) - { - output = CONSTANTBV::BitVector_Create(inputwidth, true); - OutputNode = _bm->CreateBVConst(output, outputwidth); - _bm->bvdiv_exception_occured = true; - - // CONSTANTBV::BitVector_Destroy(output); - break; - } - else - { - BVConstEvaluatorError(e); - } - } //end of error printing - - //FIXME Not very standard in the current scheme - if (BVDIV == k) - { - OutputNode = _bm->CreateBVConst(quotient, outputwidth); - CONSTANTBV::BitVector_Destroy(remainder); - } - else - { - OutputNode = _bm->CreateBVConst(remainder, outputwidth); - CONSTANTBV::BitVector_Destroy(quotient); - } - } - break; - } - case ITE: - { - if (ASTTrue == input_children[0]) - OutputNode = children[1]; - else if (ASTFalse == input_children[0]) - OutputNode = children[2]; - else - { - cerr << tmp0; - FatalError("BVConstEvaluator: ITE condiional must be either TRUE or FALSE:"); - } - } - break; - case EQ: - assert(2==number_of_children); - if (CONSTANTBV::BitVector_equal(tmp0, tmp1)) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - case BVLT: - assert(2==number_of_children); - if (-1 == CONSTANTBV::BitVector_Lexicompare(tmp0, tmp1)) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - case BVLE: - { - assert(2==number_of_children); - int comp = CONSTANTBV::BitVector_Lexicompare(tmp0, tmp1); - if (comp <= 0) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - } - case BVGT: - assert(2==number_of_children); - if (1 == CONSTANTBV::BitVector_Lexicompare(tmp0, tmp1)) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - case BVGE: - { - assert(2==number_of_children); - int comp = CONSTANTBV::BitVector_Lexicompare(tmp0, tmp1); - if (comp >= 0) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - } - case BVSLT: - assert(2==number_of_children); - if (-1 == CONSTANTBV::BitVector_Compare(tmp0, tmp1)) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - case BVSLE: - { - assert(2==number_of_children); - signed int comp = CONSTANTBV::BitVector_Compare(tmp0, tmp1); - if (comp <= 0) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - } - case BVSGT: - assert(2==number_of_children); - if (1 == CONSTANTBV::BitVector_Compare(tmp0, tmp1)) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - case BVSGE: - { - assert(2==number_of_children); - int comp = CONSTANTBV::BitVector_Compare(tmp0, tmp1); - if (comp >= 0) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - } - - case TRUE: - OutputNode = ASTTrue; - break; - case FALSE: - OutputNode = ASTFalse; - break; - case NOT: - if (ASTTrue == input_children[0]) - return ASTFalse; - else if (ASTFalse == input_children[0]) - return ASTTrue; - else - { - cerr << ASTFalse; - cerr << input_children[0]; - FatalError("BVConstEvaluator: unexpected not input"); - } - - case OR: - OutputNode = ASTFalse; - for (ASTVec::const_iterator it = children.begin(), itend = children.end(); it != itend; it++) - if (ASTTrue == *it) - OutputNode = ASTTrue; - - - break; - - case NOR: - { - ASTNode o = ASTFalse; - for (ASTVec::const_iterator it = children.begin(), itend = - children.end(); it != itend; it++) - if (ASTTrue == (*it)) { - o = ASTTrue; - break; - } - if (o == ASTTrue) - OutputNode = ASTFalse; - else - OutputNode = ASTTrue; - break; - } - - - case XOR: - { - bool output = false; - for (ASTVec::const_iterator it = children.begin(), itend = - children.end(); it != itend; it++) - { - if (ASTTrue == *it) - output = !output; //parity. - } - - if (output) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - - break; - - - } - - case AND: - { - OutputNode = ASTTrue; - for (ASTVec::const_iterator it = children.begin(), itend = children.end(); it != itend; it++) - { - if (ASTFalse == (*it)) - { - OutputNode = ASTFalse; - break; - } - } - break; - } - - case NAND: - { OutputNode = ASTFalse; - for (ASTVec::const_iterator it = children.begin(), itend = children.end(); it != itend; it++) - { - if (ASTFalse == (*it)) - { - OutputNode = ASTTrue; - break; - } - } - break; - } - - - case IFF: - { - assert(2==number_of_children); - const ASTNode& t0 = children[0]; - const ASTNode& t1 = children[1]; - if ((ASTTrue == t0 && ASTTrue == t1) || (ASTFalse == t0 && ASTFalse == t1)) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - } - - case IMPLIES: - { - assert(2==number_of_children); - const ASTNode& t0 = children[0]; - const ASTNode& t1 = children[1]; - if ((ASTFalse == t0) || (ASTTrue == t0 && ASTTrue == t1)) - OutputNode = ASTTrue; - else - OutputNode = ASTFalse; - break; - } - - default: - FatalError("BVConstEvaluator: The input kind is not supported yet:"); - break; - } - /* - if(BVCONST != k){ - cerr< -#include -#include "simplifier.h" -#include "AIGSimplifyPropositionalCore.h" - -namespace BEEV -{ - - // If enabled, simplifyTerm will simplify all the arguments to a function before attempting - // the simplification of that function. Without this option the case will be selected for - // each kind, and that case needs to simplify the arguments. - - // Longer term, this means that each function doesn't need to worry about calling simplify -// on it's arguments (I suspect some paths don't call simplify on their arguments). But it -// does mean that we can't short cut, for example, if the first argument to a BVOR is all trues, -// then all the other arguments have already been simplified, so won't be short-cutted. - - // is it ITE(p,bv0[1], bv1[1]) OR ITE(p,bv0[0], bv1[0]) - bool - isPropositionToTerm(const ASTNode& n) - { - if (n.GetType() != BITVECTOR_TYPE) - return false; - if (n.GetValueWidth() != 1) - return false; - if (n.GetKind() != ITE) - return false; - if (!n[1].isConstant()) - return false; - if (!n[2].isConstant()) - return false; - if (n[1] == n[0]) - return false; - return true; - } - - bool - Simplifier::CheckMap(ASTNodeMap* VarConstMap, const ASTNode& key, ASTNode& output) - { - if (NULL == VarConstMap) - { - return false; - } - ASTNodeMap::iterator it; - if ((it = VarConstMap->find(key)) != VarConstMap->end()) - { - output = it->second; - return true; - } - return false; - } - - bool - Simplifier::CheckSimplifyMap(const ASTNode& key, ASTNode& output, bool pushNeg, ASTNodeMap* VarConstMap) - { - if (NULL != VarConstMap) - { - return false; - } - - if (!pushNeg && key.isSimplfied()) - { - output = key; - return true; - } - - ASTNodeMap::iterator it, itend; - it = pushNeg ? SimplifyNegMap->find(key) : SimplifyMap->find(key); - itend = pushNeg ? SimplifyNegMap->end() : SimplifyMap->end(); - - if (it != itend) - { - output = it->second; - CountersAndStats("Successful_CheckSimplifyMap", _bm); - return true; - } - - if (pushNeg && (it = SimplifyMap->find(key)) != SimplifyMap->end()) - { - output = (ASTFalse == it->second) ? ASTTrue : - (ASTTrue == it->second) ? ASTFalse : nf->CreateNode(NOT, it->second); - CountersAndStats("2nd_Successful_CheckSimplifyMap", _bm); - return true; - } - - return false; - } - - void - Simplifier::UpdateSimplifyMap(const ASTNode& key, const ASTNode& value, bool pushNeg, ASTNodeMap* VarConstMap) - { - if (NULL != VarConstMap) - { - return; - }assert(!value.IsNull()); - - // Don't add leaves. Leaves are easy to recalculate, no need - // to cache. - if (0 == key.Degree()) - return; - - if (pushNeg) - (*SimplifyNegMap)[key] = value; - else - (*SimplifyMap)[key] = value; - - if (!pushNeg && key == value) - { - key.hasBeenSimplfied(); - } - } - - // Substitution Map methods.... - - bool - Simplifier::UpdateSolverMap(const ASTNode& key, const ASTNode& value) - { - return substitutionMap.UpdateSolverMap(key, value); - } - - bool - Simplifier::CheckSubstitutionMap(const ASTNode& key, ASTNode& output) - { - return substitutionMap.CheckSubstitutionMap(key, output); - } - - ASTNode - Simplifier::applySubstitutionMap(const ASTNode& n) - { - return substitutionMap.applySubstitutionMap(n); - } - - ASTNode - Simplifier::applySubstitutionMapUntilArrays(const ASTNode& n) - { - return substitutionMap.applySubstitutionMapUntilArrays(n); - } - - bool - Simplifier::CheckSubstitutionMap(const ASTNode& key) - { - return substitutionMap.CheckSubstitutionMap(key); - } - bool - Simplifier::UpdateSubstitutionMapFewChecks(const ASTNode& e0, const ASTNode& e1) - { - return substitutionMap.UpdateSubstitutionMapFewChecks(e0, e1); - } - - bool - Simplifier::UpdateSubstitutionMap(const ASTNode& e0, const ASTNode& e1) - { - return substitutionMap.UpdateSubstitutionMap(e0, e1); - } - // --- Substitution Map methods.... - - bool - Simplifier::CheckMultInverseMap(const ASTNode& key, ASTNode& output) - { - ASTNodeMap::iterator it; - if ((it = MultInverseMap.find(key)) != MultInverseMap.end()) - { - output = it->second; - return true; - } - return false; - } - - void - Simplifier::UpdateMultInverseMap(const ASTNode& key, const ASTNode& value) - { - MultInverseMap[key] = value; - } - - // Check if key, or NOT(key) is found in the alwaysTrueSet. - bool - Simplifier::CheckAlwaysTrueFormSet(const ASTNode& key, bool& result) - { - HASHSET::const_iterator it_end_2 = AlwaysTrueHashSet.end(); - HASHSET::const_iterator it2 = AlwaysTrueHashSet.find(key.GetNodeNum()); - - if (it2 != it_end_2) - { - result = true; // The key should be replaced by TRUE. - return true; - } - - int toSearch; - if (key.GetKind() == NOT) - toSearch = key.GetNodeNum() - 1; - else - toSearch = key.GetNodeNum() + 1; - - it2 = AlwaysTrueHashSet.find(toSearch); - if (it2 != it_end_2) - { - result = false; - return true; - } - - return false; - } - - void - Simplifier::UpdateAlwaysTrueFormSet(const ASTNode& key) - { - // The always true/ always false relies on the top level constraint not being removed. - // however with bb equivalence checking, AIGs can figure out that the outer constraint - // is unncessary because it's enforced by the implicit constraint---removing it. That - // leaves just one instance of the constraint, so it we replace it with true/false - // the constraint is lost. This is subsumed by constant bit propagation, so I suspect - // it's not a big loss. - if (!_bm->UserFlags.isSet("bb-equiv","1")) - AlwaysTrueHashSet.insert(key.GetNodeNum()); - } - - ASTNode - Simplifier::SimplifyFormula_NoRemoveWrites(const ASTNode& b, bool pushNeg, ASTNodeMap* VarConstMap) - { - //_bm->Begin_RemoveWrites = false; - ASTNode out = SimplifyFormula(b, pushNeg, VarConstMap); - return out; - } - - // I like simplify to have been run on all the nodes. - void - Simplifier::checkIfInSimplifyMap(const ASTNode& n, ASTNodeSet visited) - { - if (n.isConstant() || (n.GetKind() == SYMBOL)) - return; - - if (visited.find(n) != visited.end()) - return; - - if (SimplifyMap->find(n) == SimplifyMap->end()) - { - cerr << "not found"; - cerr << n; - assert(false); - } - - for (int i = 0; i < n.Degree(); i++) - { - checkIfInSimplifyMap(n[i], visited); - } - - visited.insert(n); - } - - // The SimplifyMaps on entry to the topLevel functions may contain - // useful entries. E.g. The BVSolver calls SimplifyTerm() - ASTNode - Simplifier::SimplifyFormula_TopLevel(const ASTNode& b, bool pushNeg, ASTNodeMap* VarConstMap) - { - assert(_bm->UserFlags.optimize_flag); - _bm->GetRunTimes()->start(RunTimes::SimplifyTopLevel); - ASTNode out = SimplifyFormula(b, pushNeg, VarConstMap); - ASTNodeSet visited; - //checkIfInSimplifyMap(out,visited); - ResetSimplifyMaps(); - _bm->GetRunTimes()->stop(RunTimes::SimplifyTopLevel); - return out; - } - - ASTNode - Simplifier::SimplifyTerm_TopLevel(const ASTNode& b) - { - assert(_bm->UserFlags.optimize_flag); - _bm->GetRunTimes()->start(RunTimes::SimplifyTopLevel); - ASTNode out = SimplifyTerm(b); - ResetSimplifyMaps(); - _bm->GetRunTimes()->stop(RunTimes::SimplifyTopLevel); - return out; - } - - ASTNode - Simplifier::SimplifyFormula(const ASTNode& b, bool pushNeg, ASTNodeMap* VarConstMap) - { - assert(_bm->UserFlags.optimize_flag); - assert(BOOLEAN_TYPE == b.GetType()); - - if (b.isConstant()) - { - if (!pushNeg) - return b; - else - { - if (ASTTrue == b) - return ASTFalse; - else - return ASTTrue; - } - } - - ASTNode output; - if (CheckSimplifyMap(b, output, pushNeg, VarConstMap)) - return output; - - Kind kind = b.GetKind(); - - ASTNode a = b; - ASTVec ca = a.GetChildren(); - if (!(IMPLIES == kind || ITE == kind || PARAMBOOL == kind || isAtomic(kind))) - { - SortByArith(ca); - if (ca != a.GetChildren()) - a = nf->CreateNode(kind, ca); - } - - kind = a.GetKind(); - - if (false) - { - if (!a.isConstant() && kind != SYMBOL) // const and symbols need to be created specially. - { - assert(a.Degree() > 0); - ASTVec v; - v.reserve(a.Degree()); - for (unsigned i = 0; i < a.Degree(); i++) - if (a[i].GetType() == BITVECTOR_TYPE) - v.push_back(SimplifyTerm(a[i], VarConstMap)); - else if (a[i].GetType() == BOOLEAN_TYPE) - v.push_back(SimplifyFormula(a[i], VarConstMap)); - else - v.push_back(a[i]); - - // TODO: Should check if the children arrays are different and only - // create then. - ASTNode output = nf->CreateNode(kind, v); - - if (a != output) - { - UpdateSimplifyMap(a, output, false, VarConstMap); - a = output; - } - } - } - - a = PullUpITE(a); - kind = a.GetKind(); // pullUpITE can change the Kind of the node. - - switch (kind) - { - case AND: - case OR: - output = SimplifyAndOrFormula(a, pushNeg, VarConstMap); - break; - case NOT: - output = SimplifyNotFormula(a, pushNeg, VarConstMap); - break; - case XOR: - output = SimplifyXorFormula(a, pushNeg, VarConstMap); - break; - case NAND: - output = SimplifyNandFormula(a, pushNeg, VarConstMap); - break; - case NOR: - output = SimplifyNorFormula(a, pushNeg, VarConstMap); - break; - case IFF: - output = SimplifyIffFormula(a, pushNeg, VarConstMap); - break; - case IMPLIES: - output = SimplifyImpliesFormula(a, pushNeg, VarConstMap); - break; - case ITE: - output = SimplifyIteFormula(a, pushNeg, VarConstMap); - break; - default: - //kind can be EQ,NEQ,BVLT,BVLE,... or a propositional variable - output = SimplifyAtomicFormula(a, pushNeg, VarConstMap); - break; - } - - UpdateSimplifyMap(b, output, pushNeg, VarConstMap); - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - - ASTNode input_with_not = pushNeg ? nf->CreateNode(NOT, a) : a; - if (input_with_not != output) - { - return SimplifyFormula(output, false, VarConstMap); - } - return output; - } - - ASTNode - Simplifier::SimplifyForFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - //FIXME: Code this up properly later. Mainly pushing the negation - //down - return a; - } - - ASTNode - Simplifier::SimplifyAtomicFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - // if (!optimize_flag) - // return a; - - ASTNode output; - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - { - return output; - } - - ASTNode left, right; - if (a.Degree() == 2) - { - //cerr << "Input to simplifyterm: left: " << a[0] << endl; - left = SimplifyTerm(a[0], VarConstMap); - //cerr << "Output of simplifyterm:left: " << left << endl; - //cerr << "Input to simplifyterm: right: " << a[1] << endl; - right = SimplifyTerm(a[1], VarConstMap); - //cerr << "Output of simplifyterm:left: " << right << endl; - } - - Kind kind = a.GetKind(); - switch (kind) - { - case TRUE: - output = pushNeg ? ASTFalse : ASTTrue; - break; - case FALSE: - output = pushNeg ? ASTTrue : ASTFalse; - break; - case SYMBOL: - if (!CheckSubstitutionMap(a, output)) - { - output = a; - } - output = pushNeg ? nf->CreateNode(NOT, output) : output; - break; - case PARAMBOOL: - { - ASTNode term = SimplifyTerm(a[1], VarConstMap); - output = nf->CreateNode(PARAMBOOL, a[0], term); - output = pushNeg ? nf->CreateNode(NOT, output) : output; - break; - } - case BVGETBIT: - { - ASTNode term = SimplifyTerm(a[0], VarConstMap); - ASTNode thebit = a[1]; - ASTNode zero = _bm->CreateZeroConst(1); - ASTNode one = _bm->CreateOneConst(1); - ASTNode getthebit = SimplifyTerm(nf->CreateTerm(BVEXTRACT, 1, term, thebit, thebit), VarConstMap); - if (getthebit == zero) - output = pushNeg ? ASTTrue : ASTFalse; - else if (getthebit == one) - output = pushNeg ? ASTFalse : ASTTrue; - else - { - output = nf->CreateNode(BVGETBIT, term, thebit); - output = pushNeg ? nf->CreateNode(NOT, output) : output; - } - break; - } - case EQ: - { - output = CreateSimplifiedEQ(left, right); - output = LhsMinusRhs(output); - output = ITEOpt_InEqs(output); - if (output == ASTTrue) - output = pushNeg ? ASTFalse : ASTTrue; - else if (output == ASTFalse) - output = pushNeg ? ASTTrue : ASTFalse; - else - output = pushNeg ? nf->CreateNode(NOT, output) : output; - break; - } - case BVLT: - case BVLE: - case BVGT: - case BVGE: - case BVSLT: - case BVSLE: - case BVSGT: - case BVSGE: - { - output = CreateSimplifiedINEQ(kind, left, right, pushNeg); - break; - } - default: - FatalError("SimplifyAtomicFormula: " - "NO atomic formula of the kind: ", ASTUndefined, kind); - break; - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } //end of SimplifyAtomicFormula() - - // number of constant bits in the most significant places. - int - mostSignificantConstants(const ASTNode& n) - { - if (n.isConstant()) - return n.GetValueWidth(); - if (n.GetKind() == BVCONCAT) - return mostSignificantConstants(n[0]); - return 0; - } - - int - getConstantBit(const ASTNode& n, const int i) - { - if (n.GetKind() == BVCONST) - { - assert(n.GetValueWidth()-1-i >=0); - return CONSTANTBV::BitVector_bit_test(n.GetBVConst(), n.GetValueWidth() - 1 - i) ? 1 : 0; - } - if (n.GetKind() == BVCONCAT) - return getConstantBit(n[0], i); - - assert(false); - abort(); - } - - ASTNode - replaceIteConst(const ASTNode&n, const ASTNode& newVal, NodeFactory *nf) - { - assert(!n.IsNull()); - assert(!newVal.IsNull()); - if (n.GetKind() == BVCONST) - { - return nf->CreateNode(EQ, newVal, n); - } - else if (n.GetKind() == ITE) - { - return nf->CreateNode(ITE, n[0], replaceIteConst(n[1], newVal, nf), replaceIteConst(n[2], newVal, nf)); - } - FatalError("never here", n); - } - - bool - getPossibleValues(const ASTNode&n, ASTNodeSet& visited, vector& found, int maxCount = 5) - { - if (maxCount <= 0) - return false; - - ASTNodeSet::iterator it = visited.find(n); - if (it != visited.end()) - return true; - visited.insert(n); - - if (n.GetKind() == BVCONST) - { - found.push_back(n); - return true; - } - - if (n.GetKind() == ITE) - { - bool a = getPossibleValues(n[1], visited, found, maxCount - 1); - if (!a) - return a; - - bool b = getPossibleValues(n[2], visited, found, maxCount - 1); - if (!b) - return b; - return true; - } - - return false; - } - - int - numberOfLeadingZeroes(const ASTNode& n) - { - int c = mostSignificantConstants(n); - if (c <= 0) - return 0; - - for (int i = 0; i < c; i++) - if (getConstantBit(n, i) != 0) - return i; - return c; - } - - bool - unsignedGreaterThan(const ASTNode& n1, const ASTNode& n2) - { - assert(n1.isConstant()); - assert(n2.isConstant()); - assert(n1.GetValueWidth() == n2.GetValueWidth()); - - int comp = CONSTANTBV::BitVector_Lexicompare(n1.GetBVConst(), n2.GetBVConst()); - return comp == 1; - } - - bool - signedGreaterThan(const ASTNode& n1, const ASTNode& n2) - { - assert(n1.isConstant()); - assert(n2.isConstant()); - assert(n1.GetValueWidth() == n2.GetValueWidth()); - - int comp = CONSTANTBV::BitVector_Compare(n1.GetBVConst(), n2.GetBVConst()); - return comp == 1; - } - - ASTNode - Simplifier::CreateSimplifiedINEQ(const Kind k_i, const ASTNode& left_i, const ASTNode& right_i, bool pushNeg) - { - - // We reduce down to four possible inequalities. - // NB. If the simplifying node factory is enabled, it will have done this already. - bool swap = false; - if (k_i == BVLT || k_i == BVLE || k_i == BVSLT || k_i == BVSLE) - swap = true; - - const ASTNode& left = (swap) ? right_i : left_i; - const ASTNode& right = (swap) ? left_i : right_i; - - Kind k = k_i; - if (k == BVLT) - k = BVGT; - else if (k == BVLE) - k = BVGE; - else if (k == BVSLT) - k = BVSGT; - else if (k == BVSLE) - k = BVSGE; - - assert(k == BVGT || k == BVGE || k== BVSGT || k == BVSGE); - - ASTNode output; - if (BVCONST == left.GetKind() && BVCONST == right.GetKind()) - { - output = BVConstEvaluator(nf->CreateNode(k, left, right)); - output = pushNeg ? (ASTFalse == output) ? ASTTrue : ASTFalse : output; - return output; - } - - if (k == BVLT || k == BVGT || k == BVSLT || k == BVSGT) - { - if (left == right) - return pushNeg ? ASTTrue : ASTFalse; - } - - if (k == BVLE || k == BVGE || k == BVSLE || k == BVSGE) - { - if (left == right) - return pushNeg ? ASTFalse : ASTTrue; - } - - const unsigned len = left.GetValueWidth(); - - if (_bm->UserFlags.isSet("inequality-simplifications", "1")) - { - - const int constStart = std::min(mostSignificantConstants(left), mostSignificantConstants(right)); - int comparator = 0; - - for (int i = 0; i < constStart; i++) - { - const int a = getConstantBit(left, i); - const int b = getConstantBit(right, i); - assert(a==1 || a==0); - assert(b==1 || b==0); - - if (a < b) - { - comparator = -1; - break; - } - else if (a > b) - { - comparator = +1; - break; - } - } - - if (comparator != 0 && (k == BVGT || k == BVGE)) - { - ASTNode status = (comparator == 1) ? ASTTrue : ASTFalse; - return pushNeg ? nf->CreateNode(NOT, status) : status; - } - - if (comparator != 0 && (k == BVSGT || k == BVSGE)) - { - // one is bigger than the other. - int sign_a = getConstantBit(left, 0); - int sign_b = getConstantBit(right, 0); - if (sign_a < sign_b) - { - comparator = 1; // a > b. - } - if (sign_a > sign_b) - comparator = -1; - - ASTNode status = (comparator == 1) ? ASTTrue : ASTFalse; - return pushNeg ? nf->CreateNode(NOT, status) : status; - } - - { - ASTNodeSet visited0, visited1; - vector l0, l1; - - // Sound overapproximation. Doesn't consider the equalities. - if (getPossibleValues(left, visited0, l0) && getPossibleValues(right, visited1, l1)) - { - { - bool - (*comp)(const ASTNode&, const ASTNode&); - if (k == BVSGT || k == BVSGE) - comp = signedGreaterThan; - else - comp = unsignedGreaterThan; - { - ASTNode minLHS = *max_element(l0.begin(), l0.end(), comp); - ASTNode maxRHS = *min_element(l1.begin(), l1.end(), comp); - - if (comp(minLHS, maxRHS)) - return pushNeg ? ASTFalse : ASTTrue; - } - { - ASTNode maxLHS = *min_element(l0.begin(), l0.end(), comp); - ASTNode minRHS = *max_element(l1.begin(), l1.end(), comp); - - if (comp(minRHS, maxLHS)) - return pushNeg ? ASTTrue : ASTFalse; - } - } - } - } - } - - const ASTNode unsigned_min = _bm->CreateZeroConst(len); - const ASTNode one = _bm->CreateOneConst(len); - const ASTNode unsigned_max = _bm->CreateMaxConst(len); - - switch (k) - { - case BVGT: - if (left == unsigned_min) - { - output = pushNeg ? ASTTrue : ASTFalse; - } - else if (one == left) - { - output = CreateSimplifiedEQ(right, unsigned_min); - output = pushNeg ? nf->CreateNode(NOT, output) : output; - } - else if (right == unsigned_max) - { - output = pushNeg ? ASTTrue : ASTFalse; - } - else - { - output = pushNeg ? nf->CreateNode(BVLE, left, right) : nf->CreateNode(BVLT, right, left); - } - break; - case BVGE: - if (right == unsigned_min) - { - output = pushNeg ? ASTFalse : ASTTrue; - } - else if (unsigned_max == left) - { - output = pushNeg ? ASTFalse : ASTTrue; - } - else if (unsigned_min == left) - { - output = CreateSimplifiedEQ(right, unsigned_min); - output = pushNeg ? nf->CreateNode(NOT, output) : output; - } - else - { - output = pushNeg ? nf->CreateNode(BVLT, left, right) : nf->CreateNode(BVLE, right, left); - } - break; - case BVSGE: - { - output = nf->CreateNode(k, left, right); - output = pushNeg ? nf->CreateNode(NOT, output) : output; - } - - break; - case BVSGT: - output = nf->CreateNode(k, left, right); - output = pushNeg ? nf->CreateNode(NOT, output) : output; - break; - default: - FatalError("Wrong Kind"); - break; - } - - assert(!output.IsNull()); - return output; - } - - // turns say (bvslt (ite a b c) (ite a d e)) INTO (ite a (bvslt b d) - // (bvslt c e)) Expensive. But makes some other simplifications - // possible. - ASTNode - Simplifier::PullUpITE(const ASTNode& in) - { - if (2 != in.GetChildren().size()) - return in; - if (ITE != in[0].GetKind()) - return in; - if (ITE != in[1].GetKind()) - return in; - if (in[0][0] != in[1][0]) // if the conditional is not equal. - return in; - - // Consider equals. It takes bitvectors and returns a boolean. - // Consider add. It takes bitvectors and returns bitvectors. - // Consider concat. The bitwidth of each side could vary. - - ASTNode l1; - ASTNode l2; - ASTNode result; - - if (in.GetType() == BOOLEAN_TYPE) - { - l1 = nf->CreateNode(in.GetKind(), in[0][1], in[1][1]); - l2 = nf->CreateNode(in.GetKind(), in[0][2], in[1][2]); - result = nf->CreateNode(ITE, in[0][0], l1, l2); - } - else - { - l1 = nf->CreateTerm(in.GetKind(), in.GetValueWidth(), in[0][1], in[1][1]); - l2 = nf->CreateTerm(in.GetKind(), in.GetValueWidth(), in[0][2], in[1][2]); - result = nf->CreateTerm(ITE, in.GetValueWidth(), in[0][0], l1, l2); - } - - assert(result.GetType() == in.GetType()); - assert(result.GetValueWidth() == in.GetValueWidth()); - assert(result.GetIndexWidth() == in.GetIndexWidth()); - assert(BVTypeCheck(result)); - - return result; - } - - //takes care of some simple ITE Optimizations in the context of equations - ASTNode - Simplifier::ITEOpt_InEqs(const ASTNode& in, ASTNodeMap* VarConstMap) - { - CountersAndStats("ITEOpts_InEqs", _bm); - - if (!(EQ == in.GetKind())) - { - return in; - } - - ASTNode output; - if (CheckSimplifyMap(in, output, false)) - { - return output; - } - - const ASTNode& in1 = in[0]; - const ASTNode& in2 = in[1]; - const Kind k1 = in1.GetKind(); - const Kind k2 = in2.GetKind(); - if (in1 == in2) - { - //terms are syntactically the same - output = ASTTrue; - } - else if (BVCONST == k1 && BVCONST == k2) - { - assert(in1!=in2); - output = ASTFalse; - } - else if (ITE == k1 && BVCONST == in1[1].GetKind() && BVCONST == in1[2].GetKind() && BVCONST == k2) - { - //if one side is a BVCONST and the other side is an ITE over - //BVCONST then we can do the following optimization: - // - // c = ITE(cond,c,d) <=> cond - // - // similarly ITE(cond,c,d) = c <=> cond - // - // c = ITE(cond,d,c) <=> NOT(cond) - // - //similarly ITE(cond,d,c) = d <=> NOT(cond) - ASTNode cond = in1[0]; - if (in1[1] == in2 && (in2 != in1[2])) - { - //ITE(cond, c, d) = c <=> cond - output = cond; - } - else if (in1[2] == in2 && (in2 != in1[1])) - { - cond = SimplifyFormula(cond, true, VarConstMap); - output = cond; - } - else - { - //last resort is to nf->CreateNode - output = nf->CreateNode(EQ, in1, in2); - } - } - else if (ITE == k2 && BVCONST == in2[1].GetKind() && BVCONST == in2[2].GetKind() && BVCONST == k1) - { - ASTNode cond = in2[0]; - if (in2[1] == in1 && (in1 != in2[2])) - { - //ITE(cond, c, d) = c <=> cond - output = cond; - } - else if (in2[2] == in1 && (in1 != in2[1])) - { - cond = SimplifyFormula(cond, true, VarConstMap); - output = cond; - } - else - { - //last resort is to CreateNode - output = nf->CreateNode(EQ, in1, in2); - } - } - else - { - //last resort is to CreateNode - output = nf->CreateNode(EQ, in1, in2); - } - - UpdateSimplifyMap(in, output, false, VarConstMap); - return output; - } //End of ITEOpts_InEqs() - - //Tries to simplify the input to TRUE/FALSE. if it fails, then - //return the constructed equality - ASTNode - Simplifier::CreateSimplifiedEQ(const ASTNode& in1, const ASTNode& in2) - { - CountersAndStats("CreateSimplifiedEQ", _bm); - const Kind k1 = in1.GetKind(); - const Kind k2 = in2.GetKind(); - - if (in1 == in2) - //terms are syntactically the same - return ASTTrue; - - //here the terms are definitely not syntactically equal but may be - //semantically equal. - if (BVCONST == k1 && BVCONST == k2) - return ASTFalse; - - // Check if some of the leading constant bits are different. Fancier code would check - // each bit, not just the leading bits. - const int constStart = std::min(mostSignificantConstants(in1), mostSignificantConstants(in2)); - - for (int i = 0; i < constStart; i++) - { - const int a = getConstantBit(in1, i); - const int b = getConstantBit(in2, i); - assert(a==1 || a==0); - assert(b==1 || b==0); - - if (a != b) - return ASTFalse; - } - - // The above loop has determined that the leading bits are the same. - if (constStart > 0) - { - int newWidth = in1.GetValueWidth() - constStart; - ASTNode zero = _bm->CreateZeroConst(32); - - ASTNode lhs = nf->CreateTerm(BVEXTRACT, newWidth, in1, _bm->CreateBVConst(32, newWidth - 1), zero); - ASTNode rhs = nf->CreateTerm(BVEXTRACT, newWidth, in2, _bm->CreateBVConst(32, newWidth - 1), zero); - ASTNode r = nf->CreateNode(EQ, lhs, rhs); - assert(BVTypeCheck(r)); - return r; - } - - // If both the children are concats split them apart. - // nb. This doesn't cover the case when the children are organised differently: - // (concat (concat A B) C) == (concat A (concat B C)) - if (k1 == BVCONCAT && k2 == BVCONCAT && in1[0].GetValueWidth() == in2[0].GetValueWidth()) - { - return nf->CreateNode(AND, nf->CreateNode(EQ, in1[0], in2[0]), nf->CreateNode(EQ, in1[1], in2[1])); - } - - // If the rhs is a concat, and the lhs is a constant. Split. - if (k1 == BVCONST && k2 == BVCONCAT) - { - int width = in1.GetValueWidth(); - int bottomW = in2[1].GetValueWidth(); - ASTNode zero = _bm->CreateZeroConst(32); - - // split the constant. - ASTNode top = nf->CreateTerm(BVEXTRACT, width - bottomW, in1, _bm->CreateBVConst(32, width - 1), - _bm->CreateBVConst(32, bottomW)); - ASTNode bottom = nf->CreateTerm(BVEXTRACT, bottomW, in1, _bm->CreateBVConst(32, bottomW - 1), zero); - assert(BVTypeCheck(top)); - assert(BVTypeCheck(bottom)); - - ASTNode r = nf->CreateNode(AND, nf->CreateNode(EQ, top, in2[0]), nf->CreateNode(EQ, bottom, in2[1])); - - return r; - } - - if ((k1 == ITE || k1 == BVCONST) && (k2 == ITE || k2 == BVCONST) && _bm->UserFlags.isSet("ite-const","1")) - { - // If it can only evaluate to constants on the LHS and the RHS, and those constants are never equal, - // then it must be false. e.g. ite( f, 10 , 20 ) = ite (g, 30 ,12) - ASTNodeSet visited0, visited1; - vector l0, l1; - - if (getPossibleValues(in1, visited0, l0) && getPossibleValues(in2, visited1, l1)) - { - sort(l0.begin(), l0.end()); - sort(l1.begin(), l1.end()); - vector result(l0.size() + l1.size()); - vector::iterator it = set_intersection(l0.begin(), l0.end(), l1.begin(), l1.end(), result.begin()); - if (it == result.begin()) - return ASTFalse; - - if (it == result.begin() + 1) - { - // If there is just one value in common, then, set it to true whenever it equals that value. - ASTNode lhs = replaceIteConst(in1, *result.begin(), nf); - ASTNode rhs = replaceIteConst(in2, *result.begin(), nf); - - ASTNode result = nf->CreateNode(AND, lhs, rhs); - return result; - } - } - } - - //last resort is to CreateNode - return nf->CreateNode(EQ, in1, in2); - } - - // nb. this is sometimes used to build array terms. - //accepts cond == t1, then part is t2, and else part is t3 - ASTNode - Simplifier::CreateSimplifiedTermITE(const ASTNode& in0, const ASTNode& in1, const ASTNode& in2) - { - const ASTNode& t0 = in0; - const ASTNode& t1 = in1; - const ASTNode& t2 = in2; - CountersAndStats("CreateSimplifiedITE", _bm); - if (!_bm->UserFlags.optimize_flag) - { - if (t1.GetValueWidth() != t2.GetValueWidth()) - { - cerr << "t2 is : = " << t2; - FatalError("CreateSimplifiedTermITE: " - "the lengths of the two branches don't match", t1); - } - if (t1.GetIndexWidth() != t2.GetIndexWidth()) - { - cerr << "t2 is : = " << t2; - FatalError("CreateSimplifiedTermITE: " - "the lengths of the two branches don't match", t1); - } - return nf->CreateArrayTerm(ITE, t1.GetIndexWidth(), t1.GetValueWidth(), t0, t1, t2); - } - - if (t0 == ASTTrue) - return t1; - if (t0 == ASTFalse) - return t2; - if (t1 == t2) - return t1; - - bool result; - if (CheckAlwaysTrueFormSet(t0, result)) - { - if (result) - return t1; - else - return t2; - } - - return nf->CreateArrayTerm(ITE, t1.GetIndexWidth(), t1.GetValueWidth(), t0, t1, t2); - } - - ASTNode - Simplifier::CreateSimplifiedFormulaITE(const ASTNode& in0, const ASTNode& in1, const ASTNode& in2) - { - const ASTNode& t0 = in0; - const ASTNode& t1 = in1; - const ASTNode& t2 = in2; - CountersAndStats("CreateSimplifiedFormulaITE", _bm); - - if (_bm->UserFlags.optimize_flag) - { - if (t0 == ASTTrue) - return t1; - if (t0 == ASTFalse) - return t2; - if (t1 == t2) - return t1; - - bool result; - if (CheckAlwaysTrueFormSet(t0, result)) - { - if (result) - return t1; - else - return t2; - } - - } - ASTNode result = nf->CreateNode(ITE, t0, t1, t2); - assert(BVTypeCheck(result)); - return result; - } - - ASTNode - Simplifier::SimplifyAndOrFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - ASTNode output; - //cerr << "input:\n" << a << endl; - - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - return output; - - const Kind k = a.GetKind(); - ASTVec c = FlattenKind(k, a.GetChildren()); - SortByArith(c); - - const bool isAnd = (k == AND) ? true : false; - - const ASTNode annihilator = isAnd ? (pushNeg ? ASTTrue : ASTFalse) : (pushNeg ? ASTFalse : ASTTrue); - - const ASTNode identity = isAnd ? (pushNeg ? ASTFalse : ASTTrue) : (pushNeg ? ASTTrue : ASTFalse); - - ASTVec outvec; - outvec.reserve(c.size()); - - //do the work - ASTVec::const_iterator next_it; - for (ASTVec::const_iterator i = c.begin(), iend = c.end(); i != iend; i++) - { - next_it = i + 1; - bool nextexists = (next_it < iend); - - const ASTNode aaa = SimplifyFormula(*i, pushNeg, VarConstMap); - if (annihilator == aaa) - { - //memoize - UpdateSimplifyMap(*i, annihilator, pushNeg, VarConstMap); - UpdateSimplifyMap(a, annihilator, pushNeg, VarConstMap); - //cerr << "annihilator1: output:\n" << annihilator << endl; - return annihilator; - } - ASTNode bbb; - if (nextexists) - { - bbb = SimplifyFormula(*next_it, pushNeg, VarConstMap); - } - if (nextexists && bbb == aaa) - { - //skip the duplicate aaa. *next_it will be included - } - else if (nextexists && ((bbb.GetKind() == NOT && bbb[0] == aaa))) - { - //memoize - UpdateSimplifyMap(a, annihilator, pushNeg, VarConstMap); - //cerr << "annihilator2: output:\n" << annihilator << endl; - return annihilator; - } - else if (identity == aaa) - { - // //drop identites - } - else - { - outvec.push_back(aaa); - } - } - - switch (outvec.size()) - { - case 0: - { - //only identities were dropped - output = identity; - break; - } - case 1: - { - output = outvec[0]; - break; - } - default: - { - output = - (isAnd) ? (pushNeg ? nf->CreateNode(OR, outvec) : nf->CreateNode(AND, outvec)) : - (pushNeg ? nf->CreateNode(AND, outvec) : nf->CreateNode(OR, outvec)); - break; - } - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - //cerr << "output:\n" << output << endl; - return output; - } //end of SimplifyAndOrFormula - - ASTNode - Simplifier::SimplifyNotFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - ASTNode output; - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - return output; - - if (!(a.Degree() == 1 && NOT == a.GetKind())) - FatalError("SimplifyNotFormula: input vector with more than 1 node", ASTUndefined); - - //if pushNeg is set then there is NOT on top - unsigned int NotCount = pushNeg ? 1 : 0; - ASTNode o = a; - //count the number of NOTs in 'a' - while (NOT == o.GetKind()) - { - o = o[0]; - NotCount++; - } - - //pushnegation if there are odd number of NOTs - bool pn = (NotCount % 2 == 0) ? false : true; - - bool alwaysTrue; - if (CheckAlwaysTrueFormSet(o, alwaysTrue)) - { - if (alwaysTrue) - return (pn ? ASTFalse : ASTTrue); - - // We don't do the false case because it is sometimes - // called at the top level. - } - - if (CheckSimplifyMap(o, output, pn)) - { - return output; - } - - if (ASTTrue == o) - { - output = pn ? ASTFalse : ASTTrue; - } - else if (ASTFalse == o) - { - output = pn ? ASTTrue : ASTFalse; - } - else - { - output = SimplifyFormula(o, pn, VarConstMap); - } - //memoize - UpdateSimplifyMap(o, output, pn, VarConstMap); - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } - - ASTNode - Simplifier::SimplifyXorFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - ASTNode output; - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - return output; - - assert(a.GetChildren().size() > 0); - - if (a.GetChildren().size() == 1) - { - output = a[0]; - } - else if (a.GetChildren().size() == 2) - { - ASTNode a0 = SimplifyFormula(a[0], false, VarConstMap); - ASTNode a1 = SimplifyFormula(a[1], false, VarConstMap); - if (pushNeg) - a0 = nf->CreateNode(NOT, a0); - output = nf->CreateNode(XOR, a0, a1); - - if (a0 == a1) - output = ASTFalse; - else if ((a0 == ASTTrue && a1 == ASTFalse) || (a0 == ASTFalse && a1 == ASTTrue)) - output = ASTTrue; - } - else - { - ASTVec newC; - for (int i = 0; i < a.GetChildren().size(); i++) - { - newC.push_back(SimplifyFormula(a[i], false, VarConstMap)); - } - if (pushNeg) - newC[0] = nf->CreateNode(NOT, newC[0]); - - output = nf->CreateNode(XOR, newC); - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } - - ASTNode - Simplifier::SimplifyNandFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - ASTNode output, a0, a1; - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - return output; - - //the two NOTs cancel out - if (pushNeg) - { - a0 = SimplifyFormula(a[0], false, VarConstMap); - a1 = SimplifyFormula(a[1], false, VarConstMap); - output = nf->CreateNode(AND, a0, a1); - } - else - { - //push the NOT implicit in the NAND - a0 = SimplifyFormula(a[0], true, VarConstMap); - a1 = SimplifyFormula(a[1], true, VarConstMap); - output = nf->CreateNode(OR, a0, a1); - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } - - ASTNode - Simplifier::SimplifyNorFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - ASTNode output, a0, a1; - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - return output; - - //the two NOTs cancel out - if (pushNeg) - { - a0 = SimplifyFormula(a[0], false); - a1 = SimplifyFormula(a[1], false, VarConstMap); - output = nf->CreateNode(OR, a0, a1); - } - else - { - //push the NOT implicit in the NAND - a0 = SimplifyFormula(a[0], true, VarConstMap); - a1 = SimplifyFormula(a[1], true, VarConstMap); - output = nf->CreateNode(AND, a0, a1); - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } - - ASTNode - Simplifier::SimplifyImpliesFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - ASTNode output; - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - return output; - - if (!(a.Degree() == 2 && IMPLIES == a.GetKind())) - FatalError("SimplifyImpliesFormula: vector with wrong num of nodes", ASTUndefined); - - ASTNode c0, c1; - if (pushNeg) - { - c0 = SimplifyFormula(a[0], false, VarConstMap); - c1 = SimplifyFormula(a[1], true, VarConstMap); - output = nf->CreateNode(AND, c0, c1); - } - else - { - c0 = SimplifyFormula(a[0], false, VarConstMap); - c1 = SimplifyFormula(a[1], false, VarConstMap); - bool atResult; - if (ASTFalse == c0) - { - output = ASTTrue; - } - else if (ASTTrue == c0) - { - output = c1; - } - else if (c0 == c1) - { - output = ASTTrue; - } - else if (CheckAlwaysTrueFormSet(c0, atResult)) - { - // c0 AND (~c0 OR c1) <==> c1 - //(~c0 AND (~c0 OR c1)) <==> TRUE - //(c0 AND ~c0->c1) <==> TRUE - //(~c1 AND c0->c1) <==> (~c1 AND ~c1->~c0) <==> ~c0 - //(c1 AND c0->~c1) <==> (c1 AND c1->~c0) <==> ~c0 - - if (atResult) - output = c1; - else - output = ASTTrue; - } - else if (CheckAlwaysTrueFormSet(c1, atResult)) - { - if (atResult) - output = ASTTrue; - else - output = nf->CreateNode(NOT, c0); - } - else - { - if (NOT == c0.GetKind()) - { - output = nf->CreateNode(OR, c0[0], c1); - } - else - { - output = nf->CreateNode(OR, nf->CreateNode(NOT, c0), c1); - } - } - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } - - ASTNode - Simplifier::SimplifyIffFormula(const ASTNode& a, bool pushNeg, ASTNodeMap* VarConstMap) - { - ASTNode output; - if (CheckSimplifyMap(a, output, pushNeg, VarConstMap)) - return output; - - if (!(a.Degree() == 2 && IFF == a.GetKind())) - FatalError("SimplifyIffFormula: vector with wrong num of nodes", ASTUndefined); - - ASTNode c0 = a[0]; - ASTNode c1 = SimplifyFormula(a[1], false, VarConstMap); - - if (pushNeg) - c0 = SimplifyFormula(c0, true, VarConstMap); - else - c0 = SimplifyFormula(c0, false, VarConstMap); - - bool alwaysResult; - - if (ASTTrue == c0) - { - output = c1; - } - else if (ASTFalse == c0) - { - output = SimplifyFormula(c1, true, VarConstMap); - } - else if (ASTTrue == c1) - { - output = c0; - } - else if (ASTFalse == c1) - { - output = SimplifyFormula(c0, true, VarConstMap); - } - else if (c0 == c1) - { - output = ASTTrue; - } - else if ((NOT == c0.GetKind() && c0[0] == c1) || (NOT == c1.GetKind() && c0 == c1[0])) - { - output = ASTFalse; - } - else if (CheckAlwaysTrueFormSet(c0, alwaysResult)) - { - if (alwaysResult) - output = c1; - else - output = nf->CreateNode(NOT, c1); - } - else if (CheckAlwaysTrueFormSet(c1, alwaysResult)) - { - if (alwaysResult) - output = c0; - else - output = nf->CreateNode(NOT, c0); - } - else - { - output = nf->CreateNode(XOR, nf->CreateNode(NOT, c0), c1); - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } - - ASTNode - Simplifier::SimplifyIteFormula(const ASTNode& b, bool pushNeg, ASTNodeMap* VarConstMap) - { - // if (!optimize_flag) - // return b; - - ASTNode output; - if (CheckSimplifyMap(b, output, pushNeg, VarConstMap)) - return output; - - if (!(b.Degree() == 3 && ITE == b.GetKind())) - FatalError("SimplifyIteFormula: vector with wrong num of nodes", ASTUndefined); - - ASTNode a = b; - ASTNode t0 = SimplifyFormula(a[0], false, VarConstMap); - ASTNode t1, t2; - if (pushNeg) - { - t1 = SimplifyFormula(a[1], true, VarConstMap); - t2 = SimplifyFormula(a[2], true, VarConstMap); - } - else - { - t1 = SimplifyFormula(a[1], false, VarConstMap); - t2 = SimplifyFormula(a[2], false, VarConstMap); - } - - bool alwaysTrue; - - if (ASTTrue == t0) - { - output = t1; - } - else if (ASTFalse == t0) - { - output = t2; - } - else if (t1 == t2) - { - output = t1; - } - else if (ASTTrue == t1 && ASTFalse == t2) - { - output = t0; - } - else if (ASTFalse == t1 && ASTTrue == t2) - { - output = SimplifyFormula(t0, true, VarConstMap); - } - else if (ASTTrue == t1) - { - output = nf->CreateNode(OR, t0, t2); - } - else if (ASTFalse == t1) - { - output = nf->CreateNode(AND, nf->CreateNode(NOT, t0), t2); - } - else if (ASTTrue == t2) - { - output = nf->CreateNode(OR, nf->CreateNode(NOT, t0), t1); - } - else if (ASTFalse == t2) - { - output = nf->CreateNode(AND, t0, t1); - } - else if (CheckAlwaysTrueFormSet(t0, alwaysTrue)) - { - if (alwaysTrue) - output = t1; - else - output = t2; - } - else - { - output = nf->CreateNode(ITE, t0, t1, t2); - } - - //memoize - UpdateSimplifyMap(a, output, pushNeg, VarConstMap); - return output; - } - - ASTNode - Simplifier::makeTower(const Kind k, const BEEV::ASTVec &children) - { - deque names; - - for (unsigned i = 0; i < children.size(); i++) - names.push_back(children[i]); - - while (names.size() > 2) - { - ASTNode a = names.front(); - names.pop_front(); - - ASTNode b = names.front(); - names.pop_front(); - - ASTNode n = nf->CreateTerm(k, a.GetValueWidth(), a, b); - names.push_back(n); - } - - // last two now. - assert(names.size() == 2); - - ASTNode a = names.front(); - names.pop_front(); - - ASTNode b = names.front(); - names.pop_front(); - - return nf->CreateTerm(k, a.GetValueWidth(), a, b); - } - - // If a node is not a leaf, it has only been simplified if it - // maps to itself in the simplifyMap. - bool - Simplifier::hasBeenSimplified(const ASTNode& n) - { - //n has been simplified if, it's a constant: - if (n.isConstant()) - return true; - - if (n.isSimplfied()) - return true; - - //If it's a symbol that's not in the substitition Map. - if (n.GetKind() == SYMBOL && CheckSubstitutionMap(n)) - return false; - - if (n.GetKind() == SYMBOL) - return true; - - ASTNodeMap::const_iterator it; - //If it's in the simplification map, it has been simplified. - if ((it = SimplifyMap->find(n)) == SimplifyMap->end()) - return false; - - return (it->second == n); - } - - // If both of the children are sign extended. Makes this node sign extended too. - ASTNode - Simplifier::pullUpBVSX(ASTNode output) - { - assert(output.GetChildren().size() ==2); - assert(output[0].GetKind() == BVSX); - assert(output[1].GetKind() == BVSX); - const Kind k = output.GetKind(); - - assert(BVMULT == k || SBVDIV == k || BVPLUS ==k); - const int inputValueWidth = output.GetValueWidth(); - - int lengthA = output.GetChildren()[0][0].GetValueWidth(); - int lengthB = output.GetChildren()[1][0].GetValueWidth(); - int maxLength; - if (BVMULT == output.GetKind()) - maxLength = lengthA + lengthB; - else if (BVPLUS == output.GetKind() || SBVDIV == output.GetKind()) - maxLength = std::max(lengthA, lengthB) + 1; - else - FatalError("Unexpected."); - if (maxLength < output.GetValueWidth()) - { - ASTNode newA = nf->CreateTerm(BVEXTRACT, maxLength, output.GetChildren()[0], - _bm->CreateBVConst(32, maxLength - 1), _bm->CreateZeroConst(32)); - newA = SimplifyTerm(newA); - ASTNode newB = nf->CreateTerm(BVEXTRACT, maxLength, output.GetChildren()[1], - _bm->CreateBVConst(32, maxLength - 1), _bm->CreateZeroConst(32)); - newB = SimplifyTerm(newB); - - ASTNode mult = nf->CreateTerm(output.GetKind(), maxLength, newA, newB); - output = nf->CreateTerm(BVSX, inputValueWidth, mult, _bm->CreateBVConst(32, inputValueWidth)); - } - return output; - } - - // If the shift is bigger than the bitwidth, replace by an extract. - ASTNode - Simplifier::convertArithmeticKnownShiftAmount(const Kind k, const ASTVec& children, STPMgr& bm, NodeFactory *nf) - { - const ASTNode a = children[0]; - const ASTNode b = children[1]; - const int width = children[0].GetValueWidth(); - ASTNode output; - - assert(b.isConstant()); - assert(k == BVSRSHIFT); - - if (CONSTANTBV::Set_Max(b.GetBVConst()) > 1 + log2(width)) - { - ASTNode top = bm.CreateBVConst(32, width - 1); - return nf->CreateTerm(BVSX, width, nf->CreateTerm(BVEXTRACT, 1, children[0], top, top), - bm.CreateBVConst(32, width)); - } - else - { - if (b.GetUnsignedConst() >= width) - { - ASTNode top = bm.CreateBVConst(32, width - 1); - return nf->CreateTerm(BVSX, width, nf->CreateTerm(BVEXTRACT, 1, children[0], top, top), - bm.CreateBVConst(32, width)); - } - } - - return ASTNode(); - } - - // If the rhs of a left or right shift is known. - ASTNode - Simplifier::convertKnownShiftAmount(const Kind k, const ASTVec& children, STPMgr& bm, NodeFactory *nf) - { - const ASTNode a = children[0]; - const ASTNode b = children[1]; - const int width = children[0].GetValueWidth(); - ASTNode output; - - assert(b.isConstant()); - assert(k == BVLEFTSHIFT || BVRIGHTSHIFT ==k); - - if (CONSTANTBV::Set_Max(b.GetBVConst()) > 1 + log2(width)) - { - // Intended to remove shifts by very large amounts - // that don't fit into the unsigned. at thhe start - // of the "else" branch. - output = bm.CreateZeroConst(width); - } - else - { - const unsigned int shift = b.GetUnsignedConst(); - if (shift >= width) - { - output = bm.CreateZeroConst(width); - } - else if (shift == 0) - { - output = a; // unchanged. - } - else - { - if (k == BVLEFTSHIFT) - { - CBV cbv = CONSTANTBV::BitVector_Create(width, true); - CONSTANTBV::BitVector_Bit_On(cbv, shift); - ASTNode c = bm.CreateBVConst(cbv, width); - - output = nf->CreateTerm(BVMULT, width, a, c); - BVTypeCheck(output); - //cout << output; - //cout << a << b << endl; - } - else if (k == BVRIGHTSHIFT) - { - ASTNode zero = bm.CreateZeroConst(shift); - ASTNode hi = bm.CreateBVConst(32, width - 1); - ASTNode low = bm.CreateBVConst(32, shift); - ASTNode extract = nf->CreateTerm(BVEXTRACT, width - shift, a, hi, low); - BVTypeCheck(extract); - output = nf->CreateTerm(BVCONCAT, width, zero, extract); - BVTypeCheck(output); - } - else - FatalError("herasdf"); - } - } - return output; - } - - //This function simplifies terms based on their kind - ASTNode - Simplifier::SimplifyTerm(const ASTNode& actualInputterm, ASTNodeMap* VarConstMap) - { - assert(_bm->UserFlags.optimize_flag); - - if (actualInputterm.isConstant()) - return actualInputterm; - - ASTNode inputterm(actualInputterm); // mutable local copy. - - //cout << "SimplifyTerm: input: " << actualInputterm << endl; - // if (!optimize_flag) - // { - // return inputterm; - // } - - ASTNode output = inputterm; - assert(BVTypeCheck(inputterm)); - - //######################################## - //######################################## - - if (CheckSubstitutionMap(inputterm, output)) - { - //cout << "SolverMap:" << inputterm << " output: " << output << endl; - return SimplifyTerm(output, VarConstMap); - } - - if (CheckSimplifyMap(inputterm, output, false, VarConstMap)) - { - //cerr << "SimplifierMap:" << inputterm << " output: " << - //output << endl; - return output; - } - //######################################## - //######################################## - - Kind k = inputterm.GetKind(); - if (!is_Term_kind(k)) - { - FatalError("SimplifyTerm: You have input a Non-term", inputterm); - } - - const unsigned int inputValueWidth = inputterm.GetValueWidth(); - - { - assert(k != BVCONST); - if (k != SYMBOL) // const and symbols need to be created specially. - { - ASTVec v; - ASTVec toProcess = actualInputterm.GetChildren(); - if (actualInputterm.GetKind() == BVAND || actualInputterm.GetKind() == BVOR - || actualInputterm.GetKind() == BVPLUS) - { - // If we didn't flatten these, then we'd start flattening each of these - // from the bottom up. Potentially creating tons of the nodes along the way. - toProcess = FlattenKind(actualInputterm.GetKind(), toProcess); - } - - v.reserve(toProcess.size()); - for (unsigned i = 0; i < toProcess.size(); i++) - { - if (toProcess[i].GetType() == BITVECTOR_TYPE) - v.push_back(SimplifyTerm(toProcess[i], VarConstMap)); - else if (toProcess[i].GetType() == BOOLEAN_TYPE) - v.push_back(SimplifyFormula(toProcess[i], VarConstMap)); - else - v.push_back(toProcess[i]); - } - - assert(v.size() > 0); - if (v != actualInputterm.GetChildren()) // short-cut. - { - output = nf->CreateArrayTerm(k, actualInputterm.GetIndexWidth(), inputValueWidth, v); - } - else - output = actualInputterm; - - if (inputterm != output) - { - UpdateSimplifyMap(inputterm, output, false); - inputterm = output; - } - } - - const ASTVec& children = inputterm.GetChildren(); - k = inputterm.GetKind(); - - // Perform constant propagation if possible. - // This should do nothing if the simplifyingnodefactory is used. - if (k != BEEV::UNDEFINED && k != BEEV::SYMBOL) - { - bool allConstant = true; - - for (unsigned i = 0; i < children.size(); i++) - if (!children[i].isConstant()) - { - allConstant = false; - break; - } - - if (allConstant) - { - const ASTNode& c = BVConstEvaluator(inputterm); - assert(c.isConstant()); - UpdateSimplifyMap(inputterm, c, false, VarConstMap); - return c; - } - } - } - - { - ASTNode pulledUp = PullUpITE(inputterm); - if (pulledUp != inputterm) - { - ASTNode r = SimplifyTerm(pulledUp); - UpdateSimplifyMap(actualInputterm, r, false, NULL); - UpdateSimplifyMap(inputterm, r, false, NULL); - return r; - } - } - - //Check that each of the bit-vector operands is simplified. - //I haven't measured if this is worth the expense. - { - bool notSimplified = false; - for (int i = 0; i < inputterm.Degree(); i++) - if (inputterm[i].GetType() != ARRAY_TYPE) - if (!hasBeenSimplified(inputterm[i])) - { - notSimplified = true; - break; - } - if (notSimplified) - { - ASTNode r = SimplifyTerm(inputterm); - UpdateSimplifyMap(actualInputterm, r, false, NULL); - UpdateSimplifyMap(inputterm, r, false, NULL); - return r; - } - } - - switch (k) - { - case BVCONST: - output = inputterm; - break; - case SYMBOL: - if (CheckMap(VarConstMap, inputterm, output)) - { - return output; - } - if (CheckSubstitutionMap(inputterm, output)) - { - return SimplifyTerm(output, VarConstMap); - } - output = inputterm; - break; - case BVMULT: - // follow on. - case BVPLUS: - { - const ASTVec c = FlattenKind(k, inputterm.GetChildren()); - - ASTVec constkids, nonconstkids; - - //go through the childnodes, and separate constant and - //nonconstant nodes. combine the constant nodes using the - //constevaluator. if the resultant constant is zero and k == - //BVPLUS, then ignore it (similarily for 1 and BVMULT). else, - //add the computed constant to the nonconst vector, flatten, - //sort, and create BVPLUS/BVMULT and return - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - ASTNode aaa = *it; - - assert(hasBeenSimplified(aaa)); - - if (BVCONST == aaa.GetKind()) - { - constkids.push_back(aaa); - } - else - { - nonconstkids.push_back(aaa); - } - } - - const ASTNode one = _bm->CreateOneConst(inputValueWidth); - const ASTNode max = _bm->CreateMaxConst(inputValueWidth); - const ASTNode zero = _bm->CreateZeroConst(inputValueWidth); - - //initialize constoutput to zero, in case there are no elements - //in constkids - ASTNode constoutput = (k == BVPLUS) ? zero : one; - - if (1 == constkids.size()) - { - //only one element in constkids - constoutput = constkids[0]; - } - else if (1 < constkids.size()) - { - //many elements in constkids. simplify it - constoutput = nf->CreateTerm(k, inputterm.GetValueWidth(), constkids); - constoutput = BVConstEvaluator(constoutput); - } - - if (BVMULT == k && zero == constoutput) - { - output = zero; - } - else if (BVMULT == k && 1 == nonconstkids.size() && constoutput == max) - { - //useful special case opt: when input is BVMULT(max_const,t), - //then output = BVUMINUS(t). this is easier on the bitblaster - output = nf->CreateTerm(BVUMINUS, inputValueWidth, nonconstkids); - } - else - { - if (0 < nonconstkids.size()) - { - // ignore identities. - if (BVPLUS == k && constoutput != zero) - { - nonconstkids.push_back(constoutput); - } - else if (BVMULT == k && constoutput != one) - { - nonconstkids.push_back(constoutput); - } - - if (1 == nonconstkids.size()) - { - //exactly one element in nonconstkids. output is exactly - //nonconstkids[0] - output = nonconstkids[0]; - } - else if (BVMULT == k) - { - - SortByArith(nonconstkids); - if (k == BVMULT && nonconstkids.size() > 2) - output = makeTower(k, nonconstkids); - else - output = nf->CreateTerm(k, inputValueWidth, nonconstkids); - output = DistributeMultOverPlus(output, true); - } - else // pluss. - { - assert(BVPLUS == k); - //SortByArith(nonconstkids); - //output = nf->CreateTerm(k, inputValueWidth, nonconstkids); - //output = Flatten(output); - //output = CombineLikeTerms(output); - output = CombineLikeTerms(nonconstkids); - } - } - else - { - //nonconstkids was empty, all childnodes were constant, hence - //constoutput is the output. - output = constoutput; - } - } - - // propagate bvuminus upwards through multiplies. - if (BVMULT == output.GetKind()) - { - ASTVec d = output.GetChildren(); - int uminus = 0; - for (unsigned i = 0; i < d.size(); i++) - { - if (d[i].GetKind() == BVUMINUS) - { - d[i] = d[i][0]; - uminus++; - } - } - if (uminus != 0) - { - SortByArith(d); - output = nf->CreateTerm(BVMULT, output.GetValueWidth(), d); - if ((uminus & 0x1) != 0) // odd, pull up the uminus. - { - output = nf->CreateTerm(BVUMINUS, output.GetValueWidth(), output); - } - } - } - - if ((BVMULT == output.GetKind() || BVPLUS == output.GetKind()) && output.GetChildren().size() == 2 - && output.GetChildren()[0].GetKind() == BVSX && output.GetChildren()[1].GetKind() == BVSX) - { - output = pullUpBVSX(output); - } - else if (BVMULT == output.GetKind()) - { - output = makeTower(BVMULT, output.GetChildren()); - } - else if (BVPLUS == output.GetKind()) - { - ASTVec d = output.GetChildren(); - SortByArith(d); - output = nf->CreateTerm(output.GetKind(), output.GetValueWidth(), d); - } - break; - } - case BVSUB: - { - assert(inputterm.Degree() == 2); - - const ASTNode& a0 = inputterm[0]; - const ASTNode& a1 = inputterm[1]; - - if (a0 == a1) - output = _bm->CreateZeroConst(inputValueWidth); - else - { - //covert x-y into x+(-y) and simplify. this transformation - //triggers more simplifications - // - output = nf->CreateTerm(BVPLUS, inputValueWidth, a0, nf->CreateTerm(BVUMINUS, inputValueWidth, a1)); - } - break; - } - case BVUMINUS: - { - //important to treat BVUMINUS as a special case, because it - //helps in arithmetic transformations. e.g. x + BVUMINUS(x) is - //actually 0. One way to reveal this fact is to strip bvuminus - //out, and replace with something else so that combineliketerms - //can catch this fact. - - const ASTNode& a0 = inputterm[0]; - const Kind k1 = a0.GetKind(); - const ASTNode one = _bm->CreateOneConst(inputValueWidth); - assert(k1 != BVCONST); - switch (k1) - { - case BVUMINUS: - output = a0[0]; - break; - case BVNEG: - { - output = nf->CreateTerm(BVPLUS, inputValueWidth, a0[0], one); - break; - } - case BVMULT: - { - if (BVUMINUS == a0[0].GetKind()) - { - output = nf->CreateTerm(BVMULT, inputValueWidth, a0[0][0], a0[1]); - } - else if (BVUMINUS == a0[1].GetKind()) - { - output = nf->CreateTerm(BVMULT, inputValueWidth, a0[0], a0[1][0]); - } - else - { - // If the first argument to the multiply is a - // constant, push it through. Without regard for - // the splitting of nodes (hmm.) This is - // necessary because the bitvector solver can - // process -3*x, but not -(3*x). - if (BVCONST == a0[0].GetKind()) - { - ASTNode a00 = SimplifyTerm(nf->CreateTerm(BVUMINUS, inputValueWidth, a0[0]), VarConstMap); - output = nf->CreateTerm(BVMULT, inputValueWidth, a00, a0[1]); - } - else - output = inputterm; - } - break; - } - case BVPLUS: - { - //push BVUMINUS over all the monomials of BVPLUS. Simplify - //along the way - // - //BVUMINUS(a1x1 + a2x2 + ...) <=> BVPLUS(BVUMINUS(a1x1) + - //BVUMINUS(a2x2) + ... - const ASTVec& c = a0.GetChildren(); - ASTVec o; - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - //Simplify(BVUMINUS(a1x1)) - ASTNode aaa = SimplifyTerm(nf->CreateTerm(BVUMINUS, inputValueWidth, *it), VarConstMap); - o.push_back(aaa); - } - - output = nf->CreateTerm(BVPLUS, inputValueWidth, o); - break; - } - case BVSUB: - { - //BVUMINUS(BVSUB(x,y)) <=> BVSUB(y,x) - output = nf->CreateTerm(BVSUB, inputValueWidth, a0[1], a0[0]); - break; - } - case BVAND: - if (a0.Degree() == 2 && (a0[1].GetKind() == BVUMINUS) && a0[1][0] == a0[0]) - { - output = nf->CreateTerm(BVOR, inputValueWidth, a0[0], a0[1]); - } - break; - case BVOR: - if (a0.Degree() == 2 && (a0[1].GetKind() == BVUMINUS) && a0[1][0] == a0[0]) - { - output = nf->CreateTerm(BVAND, inputValueWidth, a0[0], a0[1]); - } - break; - case BVLEFTSHIFT: - if (a0[0].GetKind() == BVCONST) - output = nf->CreateTerm(BVLEFTSHIFT, inputValueWidth, nf->CreateTerm(BVUMINUS, inputValueWidth, a0[0]), - a0[1]); - break; - case ITE: - { - //BVUMINUS(ITE(c,t1,t2)) <==> ITE(c,BVUMINUS(t1),BVUMINUS(t2)) - ASTNode c = a0[0]; - ASTNode t1 = SimplifyTerm(nf->CreateTerm(BVUMINUS, inputValueWidth, a0[1]), VarConstMap); - ASTNode t2 = SimplifyTerm(nf->CreateTerm(BVUMINUS, inputValueWidth, a0[2]), VarConstMap); - output = CreateSimplifiedTermITE(c, t1, t2); - break; - } - default: - { - output = inputterm; - break; - } - } - break; - } - case BVEXTRACT: - { - //it is important to take care of wordlevel transformation in - //BVEXTRACT. it exposes oppurtunities for later simplification - //and solving (variable elimination) - const ASTNode& a0 = inputterm[0]; - - const Kind k1 = a0.GetKind(); - - //indices for BVEXTRACT - ASTNode i = inputterm[1]; - ASTNode j = inputterm[2]; - const ASTNode zero = _bm->CreateZeroConst(32); - - //recall that the indices of BVEXTRACT are always 32 bits - //long. therefore doing a GetBVUnsigned is ok. - unsigned int i_val = i.GetUnsignedConst(); - unsigned int j_val = j.GetUnsignedConst(); - - // a0[i:0] and len(a0)=i+1, then return a0 - if (inputValueWidth == a0.GetValueWidth()) - { - assert(0 == j_val); - output = a0; - break; - } - - assert(k1 != BVCONST); - - switch (k1) - { - case BVEXTRACT: - { - const unsigned innerLow = a0[2].GetUnsignedConst(); - const unsigned innerHigh = a0[1].GetUnsignedConst(); - - output = nf->CreateTerm(BVEXTRACT, inputValueWidth, a0[0], _bm->CreateBVConst(32, i_val + innerLow), - _bm->CreateBVConst(32, j_val + innerLow)); - assert(BVTypeCheck(output)); - break; - } - - case BVCONCAT: - { - //assumes concatenation is binary - // - //input is of the form a0[i:j] - // - //a0 is the conatentation t@u, and a0[0] is t, and a0[1] is u - ASTNode t = a0[0]; - ASTNode u = a0[1]; - const unsigned int len_a0 = a0.GetValueWidth(); - const unsigned int len_u = u.GetValueWidth(); - - if (len_u > i_val) - { - //Apply the following rule: - // (t@u)[i:j] <==> u[i:j], if len(u) > i - // - output = nf->CreateTerm(BVEXTRACT, inputValueWidth, u, i, j); - } - else if (len_a0 > i_val && j_val >= len_u) - { - //Apply the rule: (t@u)[i:j] <==> - // t[i-len_u:j-len_u], if len(t@u) > i >= j >= - // len(u) - i = _bm->CreateBVConst(32, i_val - len_u); - j = _bm->CreateBVConst(32, j_val - len_u); - output = nf->CreateTerm(BVEXTRACT, inputValueWidth, t, i, j); - } - else - { - //Apply the rule: - // (t@u)[i:j] <==> t[i-len_u:0] @ u[len_u-1:j] - i = _bm->CreateBVConst(32, i_val - len_u); - ASTNode m = _bm->CreateBVConst(32, len_u - 1); - t = SimplifyTerm(nf->CreateTerm(BVEXTRACT, i_val - len_u + 1, t, i, zero), VarConstMap); - u = SimplifyTerm(nf->CreateTerm(BVEXTRACT, len_u - j_val, u, m, j), VarConstMap); - output = nf->CreateTerm(BVCONCAT, inputValueWidth, t, u); - } - break; - } - case BVPLUS: - case BVMULT: - { - // (BVMULT(n,t,u))[i:j] <==> BVMULT(i+1,t[i:0],u[i:0])[i:j] - //similar rule for BVPLUS - ASTVec c = a0.GetChildren(); - ASTVec o; - for (ASTVec::iterator jt = c.begin(), jtend = c.end(); jt != jtend; jt++) - { - ASTNode aaa = *jt; - aaa = SimplifyTerm(nf->CreateTerm(BVEXTRACT, i_val + 1, aaa, i, zero), VarConstMap); - o.push_back(aaa); - } - output = nf->CreateTerm(a0.GetKind(), i_val + 1, o); - if (j_val != 0) - { - //add extraction only if j is not zero - output = nf->CreateTerm(BVEXTRACT, inputValueWidth, output, i, j); - } - break; - } - - // This can increase the number of nodes exponentially. - // If turned on bitrev2048 will blow out main memory, with - // this disabled it takes 12MB. -#if 0 - - case BVAND: - case BVOR: - case BVXOR: - { - assert(a0.Degree() == 2); - - //assumes these operators are binary - // - // (t op u)[i:j] <==> t[i:j] op u[i:j] - ASTNode t = a0[0]; - ASTNode u = a0[1]; - t = - SimplifyTerm(nf->CreateTerm(BVEXTRACT, - a_len, t, i, j), - VarConstMap); - u = - SimplifyTerm(nf->CreateTerm(BVEXTRACT, - a_len, u, i, j), - VarConstMap); - BVTypeCheck(t); - BVTypeCheck(u); - //output = nf->CreateTerm(k1, a_len, t, u); - - output = inputterm; - break; - } -#endif - case BVNEG: - { - // (~t)[i:j] <==> ~(t[i:j]) - ASTNode t = a0[0]; - t = SimplifyTerm(nf->CreateTerm(BVEXTRACT, inputValueWidth, t, i, j), VarConstMap); - output = nf->CreateTerm(BVNEG, inputValueWidth, t); - break; - } - // case BVSX:{ //(BVSX(t,n)[i:j] <==> BVSX(t,i+1), if n - // >= i+1 and j=0 ASTNode t = a0[0]; unsigned int - // bvsx_len = a0.GetValueWidth(); if(bvsx_len < - // a_len) { FatalError("SimplifyTerm: BVEXTRACT - // over BVSX:" "the length of BVSX term must be - // greater than extract-len",inputterm); } if(j - // != zero) { output = - // nf->CreateTerm(BVEXTRACT,a_len,a0,i,j); } - // else { output = - // nf->CreateTerm(BVSX,a_len,t, - // _bm->CreateBVConst(32,a_len)); - // } break; } - - /* - * On deeply nested ITES, this can cause an exponential number - * of nodes to be produced. Especially if there are different - * extracts over the same node. - * - case ITE: - { - const ASTNode& t0 = a0[0]; - ASTNode t1 = - SimplifyTerm(nf->CreateTerm(BVEXTRACT, - a_len, a0[1], i, j), - VarConstMap); - ASTNode t2 = - SimplifyTerm(nf->CreateTerm(BVEXTRACT, - a_len, a0[2], i, j), - VarConstMap); - output = CreateSimplifiedTermITE(t0, t1, t2); - break; - } - */ - default: - { - output = inputterm; - break; - } - } - break; - } - case BVNEG: - { - const ASTNode& a0 = inputterm[0]; - - assert(a0.GetKind() != BVCONST); - - switch (a0.GetKind()) - { - case BVNEG: - output = a0[0]; - break; - case ITE: - if (a0[1].isConstant() && a0[2].isConstant()) - { - ASTNode t = SimplifyTerm(nf->CreateTerm(BVNEG, inputValueWidth, a0[1])); - ASTNode f = SimplifyTerm(nf->CreateTerm(BVNEG, inputValueWidth, a0[2])); - output = nf->CreateTerm(ITE, inputValueWidth, a0[0], BVConstEvaluator(t), BVConstEvaluator(f)); - break; - } - //follow on - default: - output = inputterm; - break; - } - break; - } - - case BVSX: - { - //a0 is the expr which is being sign extended - ASTNode a0 = inputterm[0]; - - //a1 represents the length of the term BVSX(a0) - const ASTNode& a1 = inputterm[1]; - - if (a0.GetValueWidth() == inputValueWidth) - { - //nothing to signextend - output = a0; - break; - } - - // If the msb is known. Then puts 0's or the 1's infront. - if (mostSignificantConstants(a0) > 0) - { - if (getConstantBit(a0, 0) == 0) - output = nf->CreateTerm(BVCONCAT, inputValueWidth, - _bm->CreateZeroConst(inputValueWidth - a0.GetValueWidth()), a0); - else - output = nf->CreateTerm(BVCONCAT, inputValueWidth, - _bm->CreateMaxConst(inputValueWidth - a0.GetValueWidth()), a0); - break; - } - - assert(a0.GetKind() != BVCONST); - - switch (a0.GetKind()) - { - case BVNEG: - output = nf->CreateTerm(a0.GetKind(), inputValueWidth, nf->CreateTerm(BVSX, inputValueWidth, a0[0], a1)); - break; - case BVAND: - case BVOR: - { - const ASTVec& c = a0.GetChildren(); - ASTVec newChildren; - newChildren.reserve(c.size()); - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - newChildren.push_back(nf->CreateTerm(BVSX, inputValueWidth, *it, a1)); - } - output = nf->CreateTerm(a0.GetKind(), inputValueWidth, newChildren); - } - break; - case BVPLUS: - { - //BVSX(m,BVPLUS(n,BVSX(t1),BVSX(t2))) <==> - //BVPLUS(m,BVSX(m,t1),BVSX(m,t2)) - const ASTVec& c = a0.GetChildren(); - bool returnflag = false; - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - if (BVSX != it->GetKind()) - { - returnflag = true; - break; - } - } - if (!returnflag) - { - ASTVec o; - o.reserve(c.size()); - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - ASTNode aaa = SimplifyTerm(nf->CreateTerm(BVSX, inputValueWidth, *it, a1), VarConstMap); - o.push_back(aaa); - } - output = nf->CreateTerm(a0.GetKind(), inputValueWidth, o); - } - break; - } - case BVSX: - { - //if you have BVSX(m,BVSX(n,a)) then you can drop the inner - //BVSX provided m is greater than n. - a0 = a0[0]; - assert(hasBeenSimplified(a0)); - - output = nf->CreateTerm(BVSX, inputValueWidth, a0, a1); - break; - } - case ITE: - { - const ASTNode& cond = a0[0]; - ASTNode thenpart = SimplifyTerm(nf->CreateTerm(BVSX, inputValueWidth, a0[1], a1), VarConstMap); - ASTNode elsepart = SimplifyTerm(nf->CreateTerm(BVSX, inputValueWidth, a0[2], a1), VarConstMap); - output = CreateSimplifiedTermITE(cond, thenpart, elsepart); - break; - } - default: - output = inputterm; - break; - } - break; - } - case BVAND: - case BVOR: - { - // turn BVAND(CONCAT CONCAT) into concat(BVAND() BVAND()). i.e. push ops through concat. - if (inputterm.Degree() == 2 && inputterm[0].GetKind() == BVCONCAT && inputterm[1].GetKind() == BVCONCAT - && inputterm[0][0].GetValueWidth() == inputterm[1][0].GetValueWidth()) - { - output = nf->CreateTerm(BVCONCAT, inputterm.GetValueWidth(), - nf->CreateTerm(k, inputterm[0][0].GetValueWidth(), inputterm[0][0], inputterm[1][0]), - nf->CreateTerm(k, inputterm[0][1].GetValueWidth(), inputterm[0][1], inputterm[1][1])); - break; - } - - const ASTNode max = _bm->CreateMaxConst(inputValueWidth); - const ASTNode zero = _bm->CreateZeroConst(inputValueWidth); - - const ASTNode identity = (BVAND == k) ? max : zero; - const ASTNode annihilator = (BVAND == k) ? zero : max; - ASTVec c = FlattenKind(inputterm.GetKind(), inputterm.GetChildren()); - SortByArith(c); - ASTVec constants; - ASTVec o; - for (ASTVec::iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - ASTNode aaa = *it; - assert(hasBeenSimplified(aaa)); - - if (aaa == annihilator) - { - output = annihilator; - //memoize - UpdateSimplifyMap(inputterm, output, false, VarConstMap); - UpdateSimplifyMap(actualInputterm, output, false, VarConstMap); - //cerr << "output of SimplifyTerm: " << output << endl; - return output; - } - - if (o.size() > 0 && o.back() == aaa) - { - continue; // duplicate. - } - - // nb: There's no guarantee that the bvneg will immediately follow - // the thing it's negating if the degree > 2. - if (o.size() > 0 && aaa.GetKind() == BVNEG && o.back() == aaa[0]) - { - output = annihilator; - UpdateSimplifyMap(inputterm, output, false, VarConstMap); - UpdateSimplifyMap(actualInputterm, output, false, VarConstMap); - return output; - } - - if (BVCONST == aaa.GetKind()) - { - constants.push_back(aaa); - } - else - { - o.push_back(aaa); - } - } - - while (constants.size() >= 2) - { - ASTNode a = constants.back(); - constants.pop_back(); - ASTNode b = constants.back(); - constants.pop_back(); - - ASTNode c = BVConstEvaluator(nf->CreateTerm(inputterm.GetKind(), inputterm.GetValueWidth(), a, b)); - - constants.push_back(c); - - } - if (constants.size() != 0 && constants.back() != identity) - o.push_back(constants.back()); - - switch (o.size()) - { - case 0: - output = identity; - break; - case 1: - output = o[0]; - break; - default: - SortByArith(o); - output = nf->CreateTerm(inputterm.GetKind(), inputterm.GetValueWidth(), o); - break; - } - - // This don't make it faster, just makes the graphs easier to understand. - if (output.GetKind() == BVAND) - { - assert(output.Degree() != 0); - bool allconv = true; - for (ASTVec::const_iterator it = output.begin(), itend = output.end(); it != itend; it++) - { - if (!isPropositionToTerm(*it)) - { - allconv = false; - break; - } - } - if (allconv) - { - const ASTNode zero = _bm->CreateZeroConst(1); - ASTVec children; - for (ASTVec::const_iterator it = output.begin(), itend = output.end(); it != itend; it++) - { - const ASTNode& n = *it; - - if (n[1] == zero) - children.push_back(nf->CreateNode(NOT, n[0])); - else - children.push_back(n[0]); - } - output = nf->CreateTerm(ITE, 1, nf->CreateNode(AND, children), _bm->CreateOneConst(1), zero); - assert(BVTypeCheck(output)); - } - - assert(BVTypeCheck(output)); - - // If the leading bits are zero. Replace it by a concat with zero. - int i; - if (output.GetKind() == BVAND && output.Degree() == 2 && ((i = numberOfLeadingZeroes(output[0])) > 0)) - { - // i contains the number of leading zeroes. - if (i < output.GetValueWidth()) - output = nf->CreateTerm( - BVCONCAT, - output.GetValueWidth(), - _bm->CreateZeroConst(i), - nf->CreateTerm( - BVAND, - output.GetValueWidth() - i, - nf->CreateTerm(BVEXTRACT, output.GetValueWidth() - i, output[0], - _bm->CreateBVConst(32, output.GetValueWidth() - i - 1), _bm->CreateBVConst(32, 0)), - nf->CreateTerm(BVEXTRACT, output.GetValueWidth() - i, output[1], - _bm->CreateBVConst(32, output.GetValueWidth() - i - 1), _bm->CreateBVConst(32, 0)))); - - assert(BVTypeCheck(output)); - } - } - if (output.GetKind() == BVAND) - { - int trailingZeroes = 0; - for (int i = 0; i < output.Degree(); i++) - { - const ASTNode& n = output[i]; - if (n.GetKind() != BVCONST) - continue; - int j; - for (j = 0; j < n.GetValueWidth(); j++) - if (CONSTANTBV::BitVector_bit_test(n.GetBVConst(), j)) - break; - - if (j > trailingZeroes) - trailingZeroes = j; - } - if (trailingZeroes > 0) - { - if (trailingZeroes == output.GetValueWidth()) - output = _bm->CreateZeroConst(trailingZeroes); - else - { - //cerr << "old" << output; - ASTNode zeroes = _bm->CreateZeroConst(trailingZeroes); - ASTVec newChildren; - for (int i = 0; i < output.Degree(); i++) - newChildren.push_back( - nf->CreateTerm(BVEXTRACT, output.GetValueWidth() - trailingZeroes, output[i], - _bm->CreateBVConst(32, output.GetValueWidth() - 1), - _bm->CreateBVConst(32, trailingZeroes))); - - ASTNode newAnd = nf->CreateTerm(BVAND, output.GetValueWidth() - trailingZeroes, newChildren); - output = nf->CreateTerm(BVCONCAT, output.GetValueWidth(), newAnd, zeroes); - assert(BVTypeCheck(output)); - //cerr << "new" << output; - } - } - - } - - break; - } - case BVCONCAT: - { - const ASTNode& t = inputterm[0]; - const ASTNode& u = inputterm[1]; - - const Kind tkind = t.GetKind(); - const Kind ukind = u.GetKind(); - - assert(BVCONST != tkind || BVCONST != ukind); - - if (BVEXTRACT == tkind && BVEXTRACT == ukind && t[0] == u[0]) - { - //to handle the case x[m:n]@x[n-1:k] <==> x[m:k] - const ASTNode& t_hi = t[1]; - const ASTNode& t_low = t[2]; - const ASTNode& u_hi = u[1]; - const ASTNode& u_low = u[2]; - ASTNode c = BVConstEvaluator(nf->CreateTerm(BVPLUS, 32, u_hi, _bm->CreateOneConst(32))); - if (t_low == c) - { - output = nf->CreateTerm(BVEXTRACT, inputValueWidth, t[0], t_hi, u_low); - } - else - { - output = nf->CreateTerm(BVCONCAT, inputValueWidth, t, u); - } - } - else if (t.GetKind() == BVCONCAT && t[0].GetKind() != BVCONCAT) - { - - /// This makes the left hand child of every concat not a concat. - const ASTNode& left = t[0]; - ASTNode bottom = nf->CreateTerm(BVCONCAT, t[1].GetValueWidth() + u.GetValueWidth(), t[1], u); - output = nf->CreateTerm(BVCONCAT, inputValueWidth, left, bottom); - assert(BVTypeCheck(output)); - } - else - { - output = nf->CreateTerm(BVCONCAT, inputValueWidth, t, u); - } - break; - } - - case BVLEFTSHIFT: - case BVRIGHTSHIFT: - - { // If the shift amount is known. Then replace it by an extract. - const ASTNode a = inputterm[0]; - const ASTNode b = inputterm[1]; - - const unsigned int width = a.GetValueWidth(); - if (BVCONST == b.GetKind()) // known shift amount. - { - output = convertKnownShiftAmount(k, inputterm.GetChildren(), *_bm, nf); - } - else if (a == _bm->CreateZeroConst(width)) - { - output = _bm->CreateZeroConst(width); - } - else - output = inputterm; - } - break; - - case BVDIV: - { - if (inputterm[0] == inputterm[1]) - { - output = _bm->CreateOneConst(inputValueWidth); - break; - } - if (inputterm[1] == _bm->CreateOneConst(inputValueWidth)) - { - output = inputterm[0]; - break; - } - unsigned int nlz= numberOfLeadingZeroes(inputterm[0]); - if (nlz > 0) - { - nlz = std::min(inputValueWidth-1,nlz); - int rest = inputValueWidth-nlz; - ASTNode low = _bm->CreateBVConst(32,rest); - ASTNode high =_bm->CreateBVConst(32,inputValueWidth-1); - - ASTNode cond = nf->CreateNode(EQ,_bm->CreateZeroConst(nlz), - nf->CreateTerm(BVEXTRACT, nlz, inputterm[1], high,low)); - - ASTNode top = nf->CreateTerm(BVEXTRACT, rest, inputterm[0], _bm->CreateBVConst(32,rest-1),_bm->CreateZeroConst(32)); - ASTNode bottom = nf->CreateTerm(BVEXTRACT, rest, inputterm[1], _bm->CreateBVConst(32,rest-1),_bm->CreateZeroConst(32)); - - ASTNode div = nf->CreateTerm(BVDIV,rest,top,bottom); - div = nf->CreateTerm(BVCONCAT,inputValueWidth,_bm->CreateZeroConst(inputValueWidth-rest),div); - - output = nf->CreateTerm(ITE, inputValueWidth, cond, div, _bm->CreateZeroConst(inputValueWidth)); - break; - } - - ASTNode lessThan = SimplifyFormula(nf->CreateNode(BVLT, inputterm[0], inputterm[1]), false, NULL); - if (lessThan == ASTTrue) - output = _bm->CreateZeroConst(inputValueWidth); - else - output = inputterm; - } - break; - case BVMOD: - { - if (inputterm[0] == inputterm[1]) - { - output = _bm->CreateZeroConst(inputValueWidth); - break; - } - if (inputterm[1] == _bm->CreateOneConst(inputValueWidth)) - { - output = _bm->CreateZeroConst(inputValueWidth); - break; - } - - unsigned int nlz= numberOfLeadingZeroes(inputterm[0]); - if (nlz > 0) - { - nlz = std::min(inputValueWidth-1,nlz); - int rest = inputValueWidth-nlz; - ASTNode low = _bm->CreateBVConst(32,rest); - ASTNode high =_bm->CreateBVConst(32,inputValueWidth-1); - - ASTNode cond = nf->CreateNode(EQ,_bm->CreateZeroConst(nlz), - nf->CreateTerm(BVEXTRACT, nlz, inputterm[1], high,low)); - - ASTNode top = nf->CreateTerm(BVEXTRACT, rest, inputterm[0], _bm->CreateBVConst(32,rest-1),_bm->CreateZeroConst(32)); - ASTNode bottom = nf->CreateTerm(BVEXTRACT, rest, inputterm[1], _bm->CreateBVConst(32,rest-1),_bm->CreateZeroConst(32)); - - // nb. This differs from the bvdiv case. - ASTNode div = nf->CreateTerm(BVMOD,rest,top,bottom); - div = nf->CreateTerm(BVCONCAT,inputValueWidth,_bm->CreateZeroConst(inputValueWidth-rest),div); - - // nb. This differs from the bvdiv case. - output = nf->CreateTerm(ITE, inputValueWidth, cond, div, inputterm[0]); - break; - } - - ASTNode lessThan = SimplifyFormula(nf->CreateNode(BVLT, inputterm[0], inputterm[1]), false, NULL); - - if (lessThan == ASTTrue) - output = inputterm[0]; - else - output = inputterm; - } - break; - - case BVXOR: - { - if (inputterm.Degree() == 2 && inputterm[0] == inputterm[1]) - { - output = _bm->CreateZeroConst(inputterm.GetValueWidth()); - break; - } - if (inputterm.Degree() == 2 && inputterm[0].GetKind() == BVCONCAT && inputterm[1].GetKind() == BVCONCAT - && inputterm[0][0].GetValueWidth() == inputterm[1][0].GetValueWidth()) - { - output = nf->CreateTerm(BVCONCAT, inputterm.GetValueWidth(), - nf->CreateTerm(k, inputterm[0][0].GetValueWidth(), inputterm[0][0], inputterm[1][0]), - nf->CreateTerm(k, inputterm[0][1].GetValueWidth(), inputterm[0][1], inputterm[1][1])); - break; - } - if (inputterm.Degree() == 2 && inputterm[0] == _bm->CreateZeroConst(inputterm.GetValueWidth())) - { - output = inputterm[1]; - break; - } - } - - output = inputterm; - break; - case BVXNOR: - case BVNAND: - case BVNOR: - case BVVARSHIFT: - case BVSRSHIFT: - { - output = inputterm; - break; - } - case READ: - { - ASTNode out1; - - ASTNode array_term = SimplifyArrayTerm(inputterm[0], VarConstMap); - ASTNode read_index = SimplifyTerm(inputterm[1], VarConstMap); - - if (SYMBOL == array_term.GetKind()) - { - out1 = nf->CreateTerm(READ, inputterm.GetValueWidth(), array_term, read_index); - } - else if (WRITE == array_term.GetKind()) - { - ASTNode eq = CreateSimplifiedEQ(read_index, array_term[1]); - if (eq == ASTTrue) - out1 = array_term[2]; - else if (eq == ASTFalse) - { - out1 = nf->CreateTerm(READ, inputterm.GetValueWidth(), array_term[0], read_index); - out1 = SimplifyTerm(out1, VarConstMap); - } - else - { - out1 = nf->CreateTerm(READ, inputterm.GetValueWidth(), array_term, read_index); - } - } - else if (ITE == array_term.GetKind()) - { - // Pushes the READ through ITES, which is potentially exponential. - // At present, because there's no write refinement or similar, the - // array transformer is going to do this later anyway. So, we do it - // here. But it's ugggglly. - - ASTNode cond = SimplifyFormula(inputterm[0][0], false, VarConstMap); - ASTNode read1 = nf->CreateTerm(READ, inputValueWidth, inputterm[0][1], read_index); - ASTNode read2 = nf->CreateTerm(READ, inputValueWidth, inputterm[0][2], read_index); - read1 = SimplifyTerm(read1, VarConstMap); - read2 = SimplifyTerm(read2, VarConstMap); - out1 = CreateSimplifiedTermITE(cond, read1, read2); - } - else - { - FatalError("ffff"); - } - - assert(!out1.IsNull()); - - //process only if not in the substitution map. simplifymap - //has been checked already -#if 0 - if (!CheckSubstitutionMap(out1, out1) && out1.GetKind() == READ && WRITE == out1[0].GetKind()) - out1 = RemoveWrites_TopLevel(out1); -#endif - - //it is possible that after all the procesing the READ term - //reduces to READ(Symbol,const) and hence we should check the - //substitutionmap once again. - if (!CheckSubstitutionMap(out1, output)) - output = out1; - break; - } - case ITE: - { - output = CreateSimplifiedTermITE(inputterm[0], inputterm[1], inputterm[2]); - break; - } - case SBVREM: - case SBVMOD: - { - if (inputterm[0] == inputterm[1]) - { - output = _bm->CreateZeroConst(inputValueWidth); - break; - } - - output = inputterm; - break; - } - case SBVDIV: - { - output = inputterm; - if (inputterm[0] == inputterm[1]) - { - output = _bm->CreateOneConst(inputValueWidth); - break; - } - if (SBVDIV == output.GetKind() && output.GetChildren().size() == 2 && output.GetChildren()[0].GetKind() == BVSX - && output.GetChildren()[1].GetKind() == BVSX) - output = pullUpBVSX(output); - - break; - } - case WRITE: - default: - FatalError("SimplifyTerm: Control should never reach here:", inputterm, k); - return inputterm; - break; - }assert(!output.IsNull()); - - if (inputterm != output) - output = SimplifyTerm(output); - //memoize - UpdateSimplifyMap(inputterm, output, false, VarConstMap); - UpdateSimplifyMap(actualInputterm, output, false, VarConstMap); - - //cerr << "SimplifyTerm: output" << output << endl; - - assert(!output.IsNull()); - assert(inputterm.GetValueWidth() == output.GetValueWidth()); - assert(inputterm.GetIndexWidth() == output.GetIndexWidth()); - assert(hasBeenSimplified(output)); - -#ifndef NDEBUG - for (int i = 0; i < output.Degree(); i++) - { - if (output[i].GetType() != ARRAY_TYPE) - if (!hasBeenSimplified(output[i])) - { - cout << output; - cout << i; - assert(hasBeenSimplified(output[i])); - } - } -#endif - - return output; - } //end of SimplifyTerm() - - //this function assumes that the input is a vector of childnodes of - //a BVPLUS term. it combines like terms and returns a bvplus - //term. e.g. 1.x + 2.x is converted to 3.x - ASTNode - Simplifier::CombineLikeTerms(const ASTNode& a) - { - if (BVPLUS != a.GetKind()) - return a; - - ASTNode output; - if (CheckSimplifyMap(a, output, false)) - { - //check memo table - //cerr << "output of SimplifyTerm Cache: " << output << endl; - return output; - } - - return CombineLikeTerms(a.GetChildren()); - } - - ASTNode - Simplifier::CombineLikeTerms(const ASTVec& c) - { - ASTNode output; - //map from variables to vector of constants - ASTNodeToVecMap vars_to_consts; - //vector to hold constants - ASTVec constkids; - ASTVec outputvec; - - //useful constants - unsigned int len = c[0].GetValueWidth(); - ASTNode one = _bm->CreateOneConst(len); - ASTNode zero = _bm->CreateZeroConst(len); - ASTNode max = _bm->CreateMaxConst(len); - - //go over the childnodes of the input bvplus, and collect like - //terms in a map. the key of the map are the variables, and the - //values are stored in a ASTVec - for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend; it++) - { - const ASTNode& aaa = *it; - if (SYMBOL == aaa.GetKind()) - { - vars_to_consts[aaa].push_back(one); - } - else if (BVMULT == aaa.GetKind() && BVUMINUS == aaa[0].GetKind() && BVCONST == aaa[0][0].GetKind()) - { - //(BVUMINUS(c))*(y) <==> compute(BVUMINUS(c))*y - ASTNode compute_const = BVConstEvaluator(aaa[0]); - vars_to_consts[aaa[1]].push_back(compute_const); - } - else if (BVMULT == aaa.GetKind() && BVUMINUS == aaa[1].GetKind() && BVCONST == aaa[0].GetKind()) - { - //c*(BVUMINUS(y)) <==> compute(BVUMINUS(c))*y - ASTNode cccc = BVConstEvaluator(nf->CreateTerm(BVUMINUS, len, aaa[0])); - vars_to_consts[aaa[1][0]].push_back(cccc); - } - else if (BVMULT == aaa.GetKind() && BVCONST == aaa[0].GetKind()) - { - //assumes that BVMULT is binary - vars_to_consts[aaa[1]].push_back(aaa[0]); - } - else if (BVMULT == aaa.GetKind() && BVUMINUS == aaa[0].GetKind()) - { - //(-1*x)*(y) <==> -1*(xy) - ASTNode cccc = nf->CreateTerm(BVMULT, len, aaa[0][0], aaa[1]); - ASTVec cNodes = cccc.GetChildren(); - SortByArith(cNodes); - vars_to_consts[cccc].push_back(max); - } - else if (BVMULT == aaa.GetKind() && BVUMINUS == aaa[1].GetKind()) - { - //x*(-1*y) <==> -1*(xy) - ASTNode cccc = nf->CreateTerm(BVMULT, len, aaa[0], aaa[1][0]); - ASTVec cNodes = cccc.GetChildren(); - SortByArith(cNodes); - vars_to_consts[cccc].push_back(max); - } - else if (BVCONST == aaa.GetKind()) - { - constkids.push_back(aaa); - } - else if (BVUMINUS == aaa.GetKind()) - { - //helps to convert BVUMINUS into a BVMULT. here the max - //constant represents -1. this transformation allows us to - //conclude that x + BVUMINUS(x) is 0. - vars_to_consts[aaa[0]].push_back(max); - } - else - vars_to_consts[aaa].push_back(one); - } //end of for loop - - //go over the map from variables to vector of values. combine the - //vector of values, multiply to the variable, and put the - //resultant monomial in the output BVPLUS. - for (ASTNodeToVecMap::iterator it = vars_to_consts.begin(), itend = vars_to_consts.end(); it != itend; it++) - { - const ASTVec& ccc = it->second; - - ASTNode constant; - if (1 < ccc.size()) - { - constant = nf->CreateTerm(BVPLUS, ccc[0].GetValueWidth(), ccc); - constant = BVConstEvaluator(constant); - } - else - constant = ccc[0]; - - //constant * var - ASTNode monom; - if (zero == constant) - monom = zero; - else if (one == constant) - monom = it->first; - else - { - monom = SimplifyTerm(nf->CreateTerm(BVMULT, constant.GetValueWidth(), constant, it->first)); - } - if (zero != monom) - { - outputvec.push_back(monom); - } - } //end of for loop - - if (constkids.size() > 1) - { - ASTNode output = NonMemberBVConstEvaluator(_bm, BVPLUS, constkids, constkids[0].GetValueWidth()); - if (output != zero) - outputvec.push_back(output); - } - else if (constkids.size() == 1) - { - if (constkids[0] != zero) - outputvec.push_back(constkids[0]); - } - - if (outputvec.size() > 1) - { - output = nf->CreateTerm(BVPLUS, len, outputvec); - } - else if (outputvec.size() == 1) - { - output = outputvec[0]; - } - else - { - output = zero; - } - - //memoize - //UpdateSimplifyMap(a,output,false); - return output; - } //end of CombineLikeTerms() - - //accepts lhs and rhs, and returns lhs - rhs = 0. The function - //assumes that lhs and rhs have already been simplified. although - //this assumption is not needed for correctness, it is essential for - //performance. The function also assumes that lhs is a BVPLUS - ASTNode - Simplifier::LhsMinusRhs(const ASTNode& eq) - { - //if input is not an equality, simply return it - if (EQ != eq.GetKind()) - return eq; - - ASTNode lhs = eq[0]; - ASTNode rhs = eq[1]; - const Kind k_lhs = lhs.GetKind(); - const Kind k_rhs = rhs.GetKind(); - //either the lhs has to be a BVPLUS or the rhs has to be a - //BVPLUS - if (!(BVPLUS == k_lhs || BVPLUS == k_rhs || (BVMULT == k_lhs && BVMULT == k_rhs))) - { - return eq; - } - - ASTNode output; - if (CheckSimplifyMap(eq, output, false)) - { - //check memo table - //cerr << "output of SimplifyTerm Cache: " << output << endl; - return output; - } - - //if the lhs is not a BVPLUS, but the rhs is a BVPLUS, then swap - //the lhs and rhs - //bool swap_flag = false; - if (BVPLUS != k_lhs && BVPLUS == k_rhs) - { - ASTNode swap = lhs; - lhs = rhs; - rhs = swap; - // swap_flag = true; - } - - unsigned int len = lhs.GetValueWidth(); - ASTNode zero = _bm->CreateZeroConst(len); - //right is -1*(rhs): Simplify(-1*rhs) - rhs = SimplifyTerm(nf->CreateTerm(BVUMINUS, len, rhs)); - - ASTVec lvec = lhs.GetChildren(); - ASTVec rvec = rhs.GetChildren(); - ASTNode lhsplusrhs; - if (BVPLUS != lhs.GetKind() && BVPLUS != rhs.GetKind()) - { - lhsplusrhs = nf->CreateTerm(BVPLUS, len, lhs, rhs); - } - else if (BVPLUS == lhs.GetKind() && BVPLUS == rhs.GetKind()) - { - //combine the childnodes of the left and the right - lvec.insert(lvec.end(), rvec.begin(), rvec.end()); - lhsplusrhs = nf->CreateTerm(BVPLUS, len, lvec); - } - else if (BVPLUS == lhs.GetKind() && BVPLUS != rhs.GetKind()) - { - lvec.push_back(rhs); - lhsplusrhs = nf->CreateTerm(BVPLUS, len, lvec); - } - else - { - lhsplusrhs = nf->CreateTerm(BVPLUS, len, lhs, rhs); - } - - //combine like terms - output = CombineLikeTerms(lhsplusrhs); - output = SimplifyTerm(output); - // - //Now make output into: lhs-rhs = 0 - output = CreateSimplifiedEQ(output, zero); - //sort if BVPLUS - if (BVPLUS == output.GetKind()) - { - ASTVec outv = output.GetChildren(); - SortByArith(outv); - output = nf->CreateTerm(BVPLUS, len, outv); - } - - //memoize - //UpdateSimplifyMap(eq,output,false); - return output; - } //end of LhsMinusRHS() - - //THis function accepts a BVMULT(t1,t2) and distributes the mult - //over plus if either or both t1 and t2 are BVPLUSes. - // - // x*(y1 + y2 + ...+ yn) <==> x*y1 + x*y2 + ... + x*yn - // - // (y1 + y2 + ...+ yn)*x <==> x*y1 + x*y2 + ... + x*yn - // - // The function assumes that the BVPLUSes have been flattened - ASTNode - Simplifier::DistributeMultOverPlus(const ASTNode& a, bool startdistribution) - { - if (!startdistribution) - return a; - Kind k = a.GetKind(); - if (BVMULT != k) - return a; - - assert(a.Degree() == 2); - - ASTNode left = a[0]; - ASTNode right = a[1]; - Kind left_kind = left.GetKind(); - Kind right_kind = right.GetKind(); - - ASTNode output; - if (CheckSimplifyMap(a, output, false)) - { - //check memo table - //cerr << "output of SimplifyTerm Cache: " << output << endl; - return output; - } - - //special case optimization: c1*(c2*t1) <==> (c1*c2)*t1 - if (BVCONST == left_kind && BVMULT == right_kind && BVCONST == right[0].GetKind()) - { - ASTNode c = BVConstEvaluator(nf->CreateTerm(BVMULT, a.GetValueWidth(), left, right[0])); - c = nf->CreateTerm(BVMULT, a.GetValueWidth(), c, right[1]); - return c; - left = c[0]; - right = c[1]; - left_kind = left.GetKind(); - right_kind = right.GetKind(); - } - - //special case optimization: c1*(t1*c2) <==> (c1*c2)*t1 - if (BVCONST == left_kind && BVMULT == right_kind && BVCONST == right[1].GetKind()) - { - ASTNode c = BVConstEvaluator(nf->CreateTerm(BVMULT, a.GetValueWidth(), left, right[1])); - c = nf->CreateTerm(BVMULT, a.GetValueWidth(), c, right[0]); - return c; - left = c[0]; - right = c[1]; - left_kind = left.GetKind(); - right_kind = right.GetKind(); - } - - //atleast one of left or right have to be BVPLUS - if (!(BVPLUS == left_kind || BVPLUS == right_kind)) - { - return a; - } - - //if left is BVPLUS and right is not, then swap left and right. we - //can do this since BVMULT is communtative - ASTNode swap; - if (BVPLUS == left_kind && BVPLUS != right_kind) - { - swap = left; - left = right; - right = swap; - } - left_kind = left.GetKind(); - right_kind = right.GetKind(); - - //by this point we are gauranteed that right is a BVPLUS, but left - //may not be - ASTVec rightnodes = right.GetChildren(); - ASTVec outputvec; - unsigned len = a.GetValueWidth(); - ASTNode zero = _bm->CreateZeroConst(len); - ASTNode one = _bm->CreateOneConst(len); - if (BVPLUS != left_kind) - { - //if the multiplier is not a BVPLUS then we have a special case - // x*(y1 + y2 + ...+ yn) <==> x*y1 + x*y2 + ... + x*yn - if (zero == left) - { - outputvec.push_back(zero); - } - else if (one == left) - { - outputvec.push_back(left); - } - else - { - for (ASTVec::iterator j = rightnodes.begin(), jend = rightnodes.end(); j != jend; j++) - { - ASTNode out = SimplifyTerm(nf->CreateTerm(BVMULT, len, left, *j)); - outputvec.push_back(out); - } - } - } - else - { - ASTVec leftnodes = left.GetChildren(); - // (x1 + x2 + ... + xm)*(y1 + y2 + ...+ yn) <==> x1*y1 + x1*y2 + - // ... + x2*y1 + ... + xm*yn - for (ASTVec::iterator i = leftnodes.begin(), iend = leftnodes.end(); i != iend; i++) - { - ASTNode multiplier = *i; - for (ASTVec::iterator j = rightnodes.begin(), jend = rightnodes.end(); j != jend; j++) - { - ASTNode out = SimplifyTerm(nf->CreateTerm(BVMULT, len, multiplier, *j)); - outputvec.push_back(out); - } - } - } - - //compute output here - if (outputvec.size() > 1) - { - output = CombineLikeTerms(nf->CreateTerm(BVPLUS, len, outputvec)); - output = SimplifyTerm(output); - } - else - output = SimplifyTerm(outputvec[0]); - - //memoize - //UpdateSimplifyMap(a,output,false); - return output; - } //end of distributemultoverplus() - -#if 0 - //converts the BVSX(len, a0) operator into ITE( check top bit, - //extend a0 by 1, extend a0 by 0) - ASTNode - Simplifier::ConvertBVSXToITE(const ASTNode& a) - { - if (BVSX != a.GetKind()) - return a; - - ASTNode output; - if (CheckSimplifyMap(a, output, false)) - { - //check memo table - //cerr << "output of ConvertBVSXToITE Cache: " << output << endl; - return output; - } - - ASTNode a0 = a[0]; - unsigned a_len = a.GetValueWidth(); - unsigned a0_len = a0.GetValueWidth(); - - if (a0_len > a_len) - { - FatalError("Trying to sign_extend a larger BV into a smaller BV"); - return ASTUndefined; - } - - //sign extend - unsigned extensionlen = a_len - a0_len; - if (0 == extensionlen) - { - UpdateSimplifyMap(a, output, false); - return a; - } - - std::string ones; - for (unsigned c = 0; c < extensionlen; c++) - ones += '1'; - std::string zeros; - for (unsigned c = 0; c < extensionlen; c++) - zeros += '0'; - - //string of oness of length extensionlen - BEEV::ASTNode BVOnes = _bm->CreateBVConst(ones.c_str(), 2); - //string of zeros of length extensionlen - BEEV::ASTNode BVZeros = _bm->CreateBVConst(zeros.c_str(), 2); - - //string of ones BVCONCAT a0 - BEEV::ASTNode concatOnes = nf->CreateTerm(BEEV::BVCONCAT, a_len, BVOnes, a0); - //string of zeros BVCONCAT a0 - BEEV::ASTNode concatZeros = nf->CreateTerm(BEEV::BVCONCAT, a_len, BVZeros, a0); - - //extract top bit of a0 - BEEV::ASTNode hi = _bm->CreateBVConst(32, a0_len - 1); - BEEV::ASTNode low = _bm->CreateBVConst(32, a0_len - 1); - BEEV::ASTNode topBit = nf->CreateTerm(BEEV::BVEXTRACT, 1, a0, hi, low); - - //compare topBit of a0 with 0bin1 - BEEV::ASTNode condition = CreateSimplifiedEQ(_bm->CreateBVConst(1, 1), topBit); - - //ITE(topbit = 0bin1, 0bin1111...a0, 0bin000...a0) - output = CreateSimplifiedTermITE(condition, concatOnes, concatZeros); - UpdateSimplifyMap(a, output, false); - return output; - } //end of ConvertBVSXToITE() -#endif - -#if 0 - ASTNode - Simplifier::RemoveWrites_TopLevel(const ASTNode& term) - { - if (READ != term.GetKind() || WRITE != term[0].GetKind()) - { - FatalError("RemovesWrites: Input must be a READ over a WRITE", term); - } - - if (!_bm->Begin_RemoveWrites && !_bm->SimplifyWrites_InPlace_Flag && !_bm->start_abstracting) - { - return term; - } - else if (!_bm->Begin_RemoveWrites && _bm->SimplifyWrites_InPlace_Flag && !_bm->start_abstracting) - { - //return term; - return SimplifyWrites_InPlace(term); - } - else - { - return RemoveWrites(term); - } - } //end of RemoveWrites_TopLevel() -#endif - - // recursively simplify things that are of type array. - - ASTNode - Simplifier::SimplifyArrayTerm(const ASTNode& term, ASTNodeMap* VarConstMap) - { - - const unsigned iw = term.GetIndexWidth(); - assert(iw > 0); - - ASTNode output; - if (CheckSimplifyMap(term, output, false)) - { - return output; - } - - switch (term.GetKind()) - { - case SYMBOL: - return term; - case ITE: - { - output = CreateSimplifiedTermITE(SimplifyFormula(term[0], VarConstMap), SimplifyArrayTerm(term[1], VarConstMap), - SimplifyArrayTerm(term[2], VarConstMap)); - assert(output.GetIndexWidth() == iw); - } - break; - case WRITE: - { - ASTNode array = SimplifyArrayTerm(term[0], VarConstMap); - ASTNode idx = SimplifyTerm(term[1]); - ASTNode val = SimplifyTerm(term[2]); - - output = nf->CreateArrayTerm(WRITE, iw, term.GetValueWidth(), array, idx, val); - } - - break; - default: - FatalError("2313456331"); - } - - UpdateSimplifyMap(term, output, false); - assert(term.GetIndexWidth() == output.GetIndexWidth()); - assert(BVTypeCheck(output)); - return output; - } - -#if 0 - ASTNode - Simplifier::SimplifyWrites_InPlace(const ASTNode& term, ASTNodeMap* VarConstMap) - { - ASTNodeMultiSet WriteIndicesSeenSoFar; - bool SeenNonConstWriteIndex = false; - - if ((READ != term.GetKind()) || (WRITE != term[0].GetKind())) - { - FatalError("RemovesWrites: Input must be a READ over a WRITE", term); - } - - ASTNode output; - if (CheckSimplifyMap(term, output, false)) - { - return output; - } - - ASTVec writeIndices, writeValues; - unsigned int width = term.GetValueWidth(); - //ASTNode original_write = term[0]; - ASTNode write = term[0]; - unsigned indexwidth = write.GetIndexWidth(); - ASTNode readIndex = SimplifyTerm(term[1]); - - do - { - ASTNode writeIndex = SimplifyTerm(write[1]); - ASTNode writeVal = SimplifyTerm(write[2]); - - //compare the readIndex and the current writeIndex and see if they - //simplify to TRUE or FALSE or UNDETERMINABLE at this stage - ASTNode compare_readwrite_indices = SimplifyFormula(CreateSimplifiedEQ(writeIndex, readIndex), false, - VarConstMap); - - //if readIndex and writeIndex are equal - if (ASTTrue == compare_readwrite_indices && !SeenNonConstWriteIndex) - { - UpdateSimplifyMap(term, writeVal, false); - return writeVal; - } - - if (!(ASTTrue == compare_readwrite_indices || ASTFalse == compare_readwrite_indices)) - { - SeenNonConstWriteIndex = true; - } - - //if (readIndex=writeIndex <=> FALSE) - if (ASTFalse == compare_readwrite_indices - || (WriteIndicesSeenSoFar.find(writeIndex) != WriteIndicesSeenSoFar.end())) - { - //drop the current level write - //do nothing - } - else - { - writeIndices.push_back(writeIndex); - writeValues.push_back(writeVal); - } - - //record the write indices seen so far - //if(BVCONST == writeIndex.GetKind()) { - WriteIndicesSeenSoFar.insert(writeIndex); - //} - - //Setup the write for the new iteration, one level inner write - write = write[0]; - } - while (WRITE == write.GetKind());assert(BVTypeCheck(write)); - assert(write.GetIndexWidth() >0); - - // todo write[1] and write[2] should be simplified too. - if (ITE == write.GetKind()) - { - write = SimplifyArrayTerm(write, VarConstMap); - } - - ASTVec::reverse_iterator it_index = writeIndices.rbegin(); - ASTVec::reverse_iterator itend_index = writeIndices.rend(); - ASTVec::reverse_iterator it_values = writeValues.rbegin(); - ASTVec::reverse_iterator itend_values = writeValues.rend(); - - // May be a symbol, or an ITE. - for (; it_index != itend_index; it_index++, it_values++) - { - write = nf->CreateTerm(WRITE, width, write, *it_index, *it_values); - write.SetIndexWidth(indexwidth); - } - - output = nf->CreateTerm(READ, width, write, readIndex); - assert(BVTypeCheck(output)); - - if (ITE == write.GetKind()) - { - output = SimplifyTerm(output, VarConstMap); - assert(BVTypeCheck(output)); - } - - //UpdateSimplifyMap(original_write, write, false); - UpdateSimplifyMap(term, output, false); - return output; - } //end of SimplifyWrites_In_Place() - - //accepts a read over a write and returns a term without the write - //READ(WRITE(A i val) j) <==> ITE(i=j,val,READ(A,j)). We use a memo - //table for this function called RemoveWritesMemoMap - ASTNode - Simplifier::RemoveWrites(const ASTNode& input) - { - //unsigned int width = input.GetValueWidth(); - if (READ != input.GetKind() || WRITE != input[0].GetKind()) - { - FatalError("RemovesWrites: Input must be a READ over a WRITE", input); - } - - ASTNodeMap::iterator it; - ASTNode output = input; - if (CheckSimplifyMap(input, output, false)) - { - return output; - } - - if (!_bm->start_abstracting && _bm->Begin_RemoveWrites) - { - output = ReadOverWrite_To_ITE(input); - } - - if (_bm->start_abstracting) - { - ASTNode newVar; - if (!CheckSimplifyMap(input, newVar, false)) - { - newVar = _bm->CreateFreshVariable(0, input.GetValueWidth(), "v_solver"); - (*ReadOverWrite_NewName_Map)[input] = newVar; - NewName_ReadOverWrite_Map[newVar] = input; - - UpdateSimplifyMap(input, newVar, false); - _bm->ASTNodeStats("New Var Name which replace Read_Over_Write: ", newVar); - } - output = newVar; - } //end of start_abstracting if condition - - //memoize - UpdateSimplifyMap(input, output, false); - return output; - } //end of RemoveWrites() - - - ASTNode - Simplifier::ReadOverWrite_To_ITE(const ASTNode& term, ASTNodeMap* VarConstMap) - { - unsigned int width = term.GetValueWidth(); - ASTNode input = term; - if (READ != term.GetKind() || WRITE != term[0].GetKind()) - { - FatalError("RemovesWrites: Input must be a READ over a WRITE", term); - } - - ASTNodeMap::iterator it; - ASTNode output; - // if(CheckSimplifyMap(term,output,false)) { - // return output; - // } - - ASTNode partialITE = term; - ASTNode writeA = ASTTrue; - ASTNode oldRead = term; - //iteratively expand read-over-write - do - { - ASTNode write = input[0]; - ASTNode readIndex = SimplifyTerm(input[1]); - //DO NOT CALL SimplifyTerm() on write[0]. You will go into an - //infinite loop - writeA = write[0]; - ASTNode writeIndex = SimplifyTerm(write[1]); - ASTNode writeVal = SimplifyTerm(write[2]); - - ASTNode cond = SimplifyFormula(CreateSimplifiedEQ(writeIndex, readIndex), false, VarConstMap); - ASTNode newRead = nf->CreateTerm(READ, width, writeA, readIndex); - ASTNode newRead_memoized = newRead; - if (CheckSimplifyMap(newRead, newRead_memoized, false)) - { - newRead = newRead_memoized; - } - - if (ASTTrue == cond && (term == partialITE)) - { - //found the write-value in the first iteration - //itself. return it - output = writeVal; - UpdateSimplifyMap(term, output, false); - return output; - } - - if (READ == partialITE.GetKind() && WRITE == partialITE[0].GetKind()) - { - //first iteration or (previous cond==ASTFALSE and - //partialITE is a "READ over WRITE") - partialITE = CreateSimplifiedTermITE(cond, writeVal, newRead); - } - else if (ITE == partialITE.GetKind()) - { - //ITE(i1 = j, v1, R(A,j)) - ASTNode ElseITE = CreateSimplifiedTermITE(cond, writeVal, newRead); - //R(W(A,i1,v1),j) <==> ITE(i1 = j, v1, R(A,j)) - UpdateSimplifyMap(oldRead, ElseITE, false); - //ITE(i2 = j, v2, R(W(A,i1,v1),j)) <==> ITE(i2 = j, v2, - //ITE(i1 = j, v1, R(A,j))) - partialITE = SimplifyTerm(partialITE); - } - else - { - FatalError("RemoveWrites: Control should not reach here\n"); - } - - if (ASTTrue == cond) - { - //no more iterations required - output = partialITE; - UpdateSimplifyMap(term, output, false); - return output; - } - - input = newRead; - oldRead = newRead; - } - while (READ == input.GetKind() && WRITE == input[0].GetKind()); - - output = partialITE; - - //memoize - //UpdateSimplifyMap(term,output,false); - return output; - } //ReadOverWrite_To_ITE() -#endif - - //compute the multiplicative inverse of the input - ASTNode - Simplifier::MultiplicativeInverse(const ASTNode& d) - { - ASTNode c = d; - if (BVCONST != c.GetKind()) - { - FatalError("Input must be a constant", c); - } - - if (!BVConstIsOdd(c)) - { - FatalError("MultiplicativeInverse: Input must be odd: ", c); - } - - //cerr << "input to multinverse function is: " << d << endl; - ASTNode inverse; - if (CheckMultInverseMap(d, inverse)) - { - //cerr << "found the inverse of: " << d << "and it is: " << - //inverse << endl; - return inverse; - } - - inverse = c; - unsigned inputwidth = c.GetValueWidth(); - - //Compute the multiplicative inverse of c using the extended - //euclidian algorithm - // - //create a '0' which is 1 bit long - ASTNode onebit_zero = _bm->CreateZeroConst(1); - //zero pad t0, i.e. 0 @ t0 - c = BVConstEvaluator(nf->CreateTerm(BVCONCAT, inputwidth + 1, onebit_zero, c)); - - //construct 2^(inputwidth), i.e. a bitvector of length - //'inputwidth+1', which is max(inputwidth)+1 - // - //all 1's - ASTNode max = _bm->CreateMaxConst(inputwidth); - //zero pad max - max = BVConstEvaluator(nf->CreateTerm(BVCONCAT, inputwidth + 1, onebit_zero, max)); - //_bm->Create a '1' which has leading zeros of length 'inputwidth' - ASTNode inputwidthplusone_one = _bm->CreateOneConst(inputwidth + 1); - //add 1 to max - max = nf->CreateTerm(BVPLUS, inputwidth + 1, max, inputwidthplusone_one); - max = BVConstEvaluator(max); - ASTNode zero = _bm->CreateZeroConst(inputwidth + 1); - ASTNode max_bvgt_0 = nf->CreateNode(BVGT, max, zero); - ASTNode quotient, remainder; - ASTNode x, x1, x2; - - //x1 initialized to zero - x1 = zero; - //x2 initialized to one - x2 = _bm->CreateOneConst(inputwidth + 1); - while (ASTTrue == BVConstEvaluator(max_bvgt_0)) - { - //quotient = (c divided by max) - quotient = BVConstEvaluator(nf->CreateTerm(BVDIV, inputwidth + 1, c, max)); - - //remainder of (c divided by max) - remainder = BVConstEvaluator(nf->CreateTerm(BVMOD, inputwidth + 1, c, max)); - - //x = x2 - q*x1 - x = nf->CreateTerm(BVSUB, inputwidth + 1, x2, nf->CreateTerm(BVMULT, inputwidth + 1, quotient, x1)); - x = BVConstEvaluator(x); - - //fix the inputs to the extended euclidian algo - c = max; - max = remainder; - max_bvgt_0 = nf->CreateNode(BVGT, max, zero); - - x2 = x1; - x1 = x; - } - - ASTNode hi = _bm->CreateBVConst(32, inputwidth - 1); - ASTNode low = _bm->CreateZeroConst(32); - inverse = nf->CreateTerm(BVEXTRACT, inputwidth, x2, hi, low); - inverse = BVConstEvaluator(inverse); - - UpdateMultInverseMap(d, inverse); - //cerr << "output of multinverse function is: " << inverse << endl; - return inverse; - } //end of MultiplicativeInverse() - - //returns true if the input is odd - bool - Simplifier::BVConstIsOdd(const ASTNode& c) - { - if (BVCONST != c.GetKind()) - { - FatalError("Input must be a constant", c); - } - - ASTNode zero = _bm->CreateZeroConst(1); - ASTNode hi = _bm->CreateZeroConst(32); - ASTNode low = hi; - ASTNode lowestbit = nf->CreateTerm(BVEXTRACT, 1, c, hi, low); - lowestbit = BVConstEvaluator(lowestbit); - - if (lowestbit == zero) - { - return false; - } - else - { - return true; - } - } //end of BVConstIsOdd() - - // in ext/hash_map, and tr/unordered_map, there is no provision to - // shrink down the number of buckets in a hash map. If the hash_map - // has previously held a lot of data, then it will have a lot of - // buckets. Slowing down iterators and clears() in particular. - void - Simplifier::ResetSimplifyMaps() - { - // clear() is extremely expensive for hash_maps with a lot of - // buckets, in the EXT_MAP implementation it visits every bucket, - // checking whether each bucket is empty or not, if non-empty it - // deletes the contents. The destructor seems to clear everything - // anyway. - - //SimplifyMap->clear(); - delete SimplifyMap; - SimplifyMap = new ASTNodeMap(INITIAL_TABLE_SIZE); - - //SimplifyNegMap->clear(); - delete SimplifyNegMap; - SimplifyNegMap = new ASTNodeMap(INITIAL_TABLE_SIZE); - } - - void - Simplifier::printCacheStatus() - { - cerr << "SimplifyMap:" << SimplifyMap->size() << ":" << SimplifyMap->bucket_count() << endl; - cerr << "SimplifyNegMap:" << SimplifyNegMap->size() << ":" << SimplifyNegMap->bucket_count() << endl; - cerr << "AlwaysTrueFormSet" << AlwaysTrueHashSet.size() << ":" << AlwaysTrueHashSet.bucket_count() << endl; - cerr << "MultInverseMap" << MultInverseMap.size() << ":" << MultInverseMap.bucket_count() << endl; - -#if 0 - cerr << "ReadOverWrite_NewName_Map" << ReadOverWrite_NewName_Map->size() << ":" - << ReadOverWrite_NewName_Map->bucket_count() << endl; - cerr << "NewName_ReadOverWrite_Map" << NewName_ReadOverWrite_Map.size() << ":" - << NewName_ReadOverWrite_Map.bucket_count() << endl; -#endif - cerr << "substn_map" << substitutionMap.Return_SolverMap()->size() << ":" - << substitutionMap.Return_SolverMap()->bucket_count() << endl; - - } //printCacheStatus() -} -; -//end of namespace diff --git a/src/vendor/stp/src/simplifier/simplifier.h b/src/vendor/stp/src/simplifier/simplifier.h deleted file mode 100644 index 95f384cd9..000000000 --- a/src/vendor/stp/src/simplifier/simplifier.h +++ /dev/null @@ -1,292 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef SIMPLIFIER_H -#define SIMPLIFIER_H - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../AST/NodeFactory/SimplifyingNodeFactory.h" -#include "SubstitutionMap.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - ASTNode NonMemberBVConstEvaluator(const ASTNode& t); - ASTNode NonMemberBVConstEvaluator(STPMgr* _bm , const Kind k, const ASTVec& input_children, unsigned int inputwidth); - - class Simplifier : boost::noncopyable - { - friend class counterexample; - private: - - /**************************************************************** - * Private Data and TypeDefs * - ****************************************************************/ - - // Handy defs - ASTNode ASTTrue, ASTFalse, ASTUndefined; - - // Memo table for simplifcation. Key is unsimplified node, and - // value is simplified node. - ASTNodeMap * SimplifyMap; - ASTNodeMap * SimplifyNegMap; - HASHSET AlwaysTrueHashSet; - ASTNodeMap MultInverseMap; - - // For ArrayWrite Abstraction: map from read-over-write term to - // newname. - //ASTNodeMap * ReadOverWrite_NewName_Map; - - // For ArrayWrite Refinement: Map new arraynames to - // Read-Over-Write terms - //ASTNodeMap NewName_ReadOverWrite_Map; - - //Ptr to STP Manager - STPMgr * _bm; - - NodeFactory * nf; - - SubstitutionMap substitutionMap; - - void checkIfInSimplifyMap(const ASTNode& n, ASTNodeSet visited); - - ASTNode makeTower(const Kind k , const ASTVec& children); - - ASTNode pullUpBVSX(const ASTNode output); - - public: - static ASTNode convertArithmeticKnownShiftAmount(const Kind k, const ASTVec& children, STPMgr& bm, NodeFactory *nf); - static ASTNode convertKnownShiftAmount(const Kind k, const ASTVec& children, STPMgr& bm, NodeFactory *nf); - - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - Simplifier(STPMgr * bm) : _bm(bm), - substitutionMap(this,bm) - { - SimplifyMap = new ASTNodeMap(INITIAL_TABLE_SIZE); - SimplifyNegMap = new ASTNodeMap(INITIAL_TABLE_SIZE); - //ReadOverWrite_NewName_Map = new ASTNodeMap(); - - ASTTrue = bm->CreateNode(TRUE); - ASTFalse = bm->CreateNode(FALSE); - ASTUndefined = bm->CreateNode(UNDEFINED); - - nf = bm->defaultNodeFactory; - } - - ~Simplifier() - { - delete SimplifyMap; - delete SimplifyNegMap; - //delete ReadOverWrite_NewName_Map; - } - - /**************************************************************** - * Functions to check and update various Maps * - ****************************************************************/ - - //Check the map passed to SimplifyTerm - bool CheckMap(ASTNodeMap* VarConstMap, - const ASTNode& key, ASTNode& output); - - - //functions for checking and updating simplification map - bool CheckSimplifyMap(const ASTNode& key, - ASTNode& output, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - void UpdateSimplifyMap(const ASTNode& key, - const ASTNode& value, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - bool CheckAlwaysTrueFormSet(const ASTNode& key, bool& result); - void UpdateAlwaysTrueFormSet(const ASTNode& val); - bool CheckMultInverseMap(const ASTNode& key, ASTNode& output); - void UpdateMultInverseMap(const ASTNode& key, const ASTNode& value); - - //Map for solved variables - bool UpdateSolverMap(const ASTNode& e0, const ASTNode& e1); - ASTNode topLevel(const ASTNode& a, - ArrayTransformer *at); - - //substitution - bool CheckSubstitutionMap(const ASTNode& a, ASTNode& output); - bool CheckSubstitutionMap(const ASTNode& a); - bool UpdateSubstitutionMap(const ASTNode& e0, const ASTNode& e1); - bool UpdateSubstitutionMapFewChecks(const ASTNode& e0, const ASTNode& e1); - - ASTNode applySubstitutionMap(const ASTNode& n); - ASTNode applySubstitutionMapUntilArrays(const ASTNode& n); - - void ResetSimplifyMaps(void); - - /**************************************************************** - * Simplification functions * - ****************************************************************/ - - ASTNode SimplifyFormula_TopLevel(const ASTNode& a, - bool pushNeg, - ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyTerm_TopLevel(const ASTNode& b); - - - ASTNode SimplifyFormula(const ASTNode& a, - bool pushNeg, - ASTNodeMap* VarConstMap=NULL); - - - bool hasBeenSimplified(const ASTNode& n); - - ASTNode SimplifyTerm(const ASTNode& inputterm, - ASTNodeMap* VarConstMap=NULL); - - - ASTNode SimplifyFormula_NoRemoveWrites(const ASTNode& a, - bool pushNeg, - ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyAtomicFormula(const ASTNode& a, - bool pushNeg, - ASTNodeMap* VarConstMap=NULL); - - ASTNode CreateSimplifiedEQ(const ASTNode& t1, - const ASTNode& t2); - - ASTNode ITEOpt_InEqs(const ASTNode& in1, - ASTNodeMap* VarConstMap=NULL); - - ASTNode PullUpITE(const ASTNode& in); - - ASTNode CreateSimplifiedTermITE(const ASTNode& t1, - const ASTNode& t2, - const ASTNode& t3); - - ASTNode CreateSimplifiedFormulaITE(const ASTNode& in0, - const ASTNode& in1, - const ASTNode& in2); - - ASTNode CreateSimplifiedINEQ(const Kind k, - const ASTNode& a0, - const ASTNode& a1, bool pushNeg); - - ASTNode SimplifyNotFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyAndOrFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyXorFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyNandFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyNorFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyImpliesFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyIffFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyIteFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyForFormula(const ASTNode& a, - bool pushNeg, ASTNodeMap* VarConstMap=NULL); - - - ASTNode CombineLikeTerms(const ASTNode& a); - ASTNode CombineLikeTerms(const ASTVec& a); - - ASTNode LhsMinusRhs(const ASTNode& eq); - - ASTNode DistributeMultOverPlus(const ASTNode& a, - bool startdistribution = false); - - //ASTNode ConvertBVSXToITE(const ASTNode& a); - - ASTNode BVConstEvaluator(const ASTNode& t); - - //checks if the input constant is odd or not - bool BVConstIsOdd(const ASTNode& c); - - //computes the multiplicatve inverse of the input - ASTNode MultiplicativeInverse(const ASTNode& c); - - //Replaces WRITE(Arr,i,val) with ITE(j=i, val, READ(Arr,j)) - ASTNode RemoveWrites_TopLevel(const ASTNode& term); - ASTNode RemoveWrites(const ASTNode& term); - ASTNode SimplifyWrites_InPlace(const ASTNode& term, - ASTNodeMap* VarConstMap=NULL); - - ASTNode SimplifyArrayTerm(const ASTNode& term,ASTNodeMap* VarConstMap); - - //ASTNode ReadOverWrite_To_ITE(const ASTNode& term, - // ASTNodeMap* VarConstMap=NULL); - - void printCacheStatus(); - -#if 0 - //FIXME: Get rid of this horrible function - const ASTNodeMap * ReadOverWriteMap() - { - return ReadOverWrite_NewName_Map; - } // End of ReadOverWriteMap() -#endif - - bool hasUnappliedSubstitutions() - { - return substitutionMap.hasUnappliedSubstitutions(); - } - - ASTNodeMap * Return_SolverMap() - { - return substitutionMap.Return_SolverMap(); - } // End of SolverMap() - - void haveAppliedSubstitutionMap() - { - substitutionMap.haveAppliedSubstitutionMap(); - } - - - void ClearAllTables(void) - { - SimplifyMap->clear(); - SimplifyNegMap->clear(); - //ReadOverWrite_NewName_Map->clear(); - //NewName_ReadOverWrite_Map.clear(); - AlwaysTrueHashSet.clear(); - MultInverseMap.clear(); - substitutionMap.clear(); - } - - - // These can be cleared (to save memory) without changing the answer. - void ClearCaches() - { - AlwaysTrueHashSet.clear(); - MultInverseMap.clear(); - SimplifyMap->clear(); - SimplifyNegMap->clear(); - getVariablesInExpression().ClearAllTables(); - } - - VariablesInExpression& getVariablesInExpression() - { - return substitutionMap.vars; - } - - };//end of class Simplifier -}; //end of namespace -#endif diff --git a/src/vendor/stp/src/to-sat/AIG/BBNodeAIG.h b/src/vendor/stp/src/to-sat/AIG/BBNodeAIG.h deleted file mode 100644 index 846ebb52e..000000000 --- a/src/vendor/stp/src/to-sat/AIG/BBNodeAIG.h +++ /dev/null @@ -1,122 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Trevor Hansen - * - * BEGIN DATE: June, 2010 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef BBNODEAIG_H_ -#define BBNODEAIG_H_ - -#include "../../extlib-abc/aig.h" -#include - -namespace BEEV -{ - using std::cerr; - using std::endl; - - // This class wraps around a pointer to an AIG (provided by the ABC tool). - // uses the default copy constructor and assignment operator. - - class BBNodeAIG -{ - // This is only useful for printing small instances for debuging. - void print(Aig_Obj_t* node) const - { - Aig_Obj_t *c0 = node->pFanin0, *c1 = node->pFanin1; - bool c0Not = Aig_IsComplement(c0), c1Not = Aig_IsComplement(c1); - if (c0Not) - c0 = Aig_Not(c0); - if (c1Not) - c1 = Aig_Not(c1); - - cerr << node->Id; - cerr << "[" << node->Type << "]"; - cerr << ": ("; - if (c0 !=0 ) - { - if (c0Not) - cerr << "-"; - cerr << c0->Id; - cerr <<","; - } - if (c1 !=0 ) - { - if (c1Not) - cerr << "-"; - - cerr << c1->Id; - } - cerr << ")" << endl; - if (c0 !=0 ) - print(c0); - if (c1 !=0 ) - print(c1); - } -public: - - intptr_t GetNodeNum() const - { - return (intptr_t)n; - } - - // If the pointer is odd. Then it's the NOT of the pointer one less. - Aig_Obj_t * n; - - // After dag aware rewriting the symbol stays at the same position in the vector of PIs. - // To get it's CNF variable number we get the node at the same position. - int symbol_index; - - BBNodeAIG() - { - n = NULL; - } - - BBNodeAIG(Aig_Obj_t * _n) - { - n = _n; - assert(n!=NULL); - if (Aig_IsComplement(n)) - { - assert(Aig_Not(n)->Type != 0); // don't want nodes of type UNKNOWN> - } - else - { - assert(n->Type!=0); - } - } - - bool IsNull() const - { - return n == NULL; - } - - bool operator==(const BBNodeAIG &other) const - { - return n == other.n; - } - - bool operator!=(const BBNodeAIG &other) const - { - return !(n == other.n); - } - - - bool operator<(const BBNodeAIG &other) const - { - return n < other.n; - } - - void print() const - { - print(n); - } - -}; -} -; - -#endif diff --git a/src/vendor/stp/src/to-sat/AIG/BBNodeManagerAIG.cpp b/src/vendor/stp/src/to-sat/AIG/BBNodeManagerAIG.cpp deleted file mode 100644 index d24e5c7d7..000000000 --- a/src/vendor/stp/src/to-sat/AIG/BBNodeManagerAIG.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "BBNodeManagerAIG.h" - -namespace BEEV -{ - -} - - - - diff --git a/src/vendor/stp/src/to-sat/AIG/BBNodeManagerAIG.h b/src/vendor/stp/src/to-sat/AIG/BBNodeManagerAIG.h deleted file mode 100644 index 2721eca98..000000000 --- a/src/vendor/stp/src/to-sat/AIG/BBNodeManagerAIG.h +++ /dev/null @@ -1,263 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Trevor Hansen - * - * BEGIN DATE: June, 2010 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef BBNodeManagerAIG_H_ -#define BBNodeManagerAIG_H_ - -// cnf_short omits some stuff that doesn't compile in g++ that we don't need anyway. -#include "../../extlib-abc/aig.h" -#include "../../extlib-abc/cnf_short.h" -#include "../../extlib-abc/dar.h" -#include "../ToSATBase.h" - -#include "BBNodeAIG.h" - -typedef Cnf_Dat_t_ CNFData; -typedef Aig_Obj_t AIGNode; - -namespace BEEV -{ -class ASTNode; -class STPMgr; // we ignore this anyway. - -extern vector _empty_BBNodeAIGVec; - -// Creates AIG nodes with ABC and wraps them in BBNodeAIG's. -class BBNodeManagerAIG -{ -public: - Aig_Man_t *aigMgr; - - // Map from symbols to their AIG nodes. - typedef map > SymbolToBBNode; - - SymbolToBBNode symbolToBBNode; - - int totalNumberOfNodes() - { - return aigMgr->nObjs[AIG_OBJ_AND]; // without having removed non-reachable. - } - -private: - // AIGs can only take two parameters. This makes a log_2 height - // tower of varadic inputs. - Aig_Obj_t * makeTower(Aig_Obj_t * (*t)(Aig_Man_t *, Aig_Obj_t *, - Aig_Obj_t *), vector& children) - { - deque names; - - for (unsigned i = 0; i < children.size(); i++) - names.push_back(children[i].n); - - while (names.size() > 2) - { - Aig_Obj_t* a = names.front(); - names.pop_front(); - - Aig_Obj_t* b = names.front(); - names.pop_front(); - - Aig_Obj_t* n = t(aigMgr, a, b); - names.push_back(n); - } - - // last two now. - assert(names.size() == 2); - - Aig_Obj_t* a = names.front(); - names.pop_front(); - - Aig_Obj_t* b = names.front(); - names.pop_front(); - - return t(aigMgr, a, b); - } - - // no copy. no assignment. - BBNodeManagerAIG& operator = (const BBNodeManagerAIG& other); - BBNodeManagerAIG(const BBNodeManagerAIG& other); - - -public: - - BBNodeManagerAIG() - { - aigMgr = Aig_ManStart(0); - // fancier strashing. - aigMgr->fAddStrash = 1; - } - - void stop() - { - if (aigMgr !=NULL) - Aig_ManStop(aigMgr); - aigMgr = NULL; - } - - ~BBNodeManagerAIG() - { - stop(); - } - - BBNodeAIG getTrue() - { - return BBNodeAIG(Aig_ManConst1(aigMgr)); - } - - BBNodeAIG getFalse() - { - return BBNodeAIG(Aig_ManConst0(aigMgr)); - } - - // The same symbol always needs to return the same AIG node, - // if it doesn't you will get the wrong answer. - BBNodeAIG CreateSymbol(const ASTNode& n, unsigned i) - { - assert(n.GetKind() == SYMBOL); - - // booleans have width 0. - const unsigned width = std::max((unsigned)1, n.GetValueWidth()); - - SymbolToBBNode::iterator it; - it = symbolToBBNode.find(n); - if (symbolToBBNode.end() == it) - { - symbolToBBNode[n] = vector (width); - it = symbolToBBNode.find(n); - } - - assert(it->second.size() == width); - assert(i < width); - - if (!it->second[i].IsNull()) - return it->second[i]; - - it->second[i] = BBNodeAIG(Aig_ObjCreatePi(aigMgr)); - it->second[i].symbol_index = aigMgr->vPis->nSize-1; - return it->second[i]; - } - - BBNodeAIG CreateNode(Kind kind, vector& children) - { - Aig_Obj_t * pNode; - assert (children.size() != 0); - - for (int i =0; i < children.size();i++) - assert(!children[i].IsNull()); - - switch (kind) - { - case AND: - if (children.size() == 1) - pNode = children[0].n; - else if (children.size() == 2) - pNode = Aig_And(aigMgr, children[0].n, children[1].n); - else - pNode = makeTower(Aig_And, children); - break; - - case OR: - if (children.size() == 1) - pNode = children[0].n; - else if (children.size() == 2) - pNode = Aig_Or(aigMgr, children[0].n, children[1].n); - else - pNode = makeTower(Aig_Or, children); - break; - case NAND: - if (children.size() == 2) - pNode = Aig_And(aigMgr, children[0].n, children[1].n); - else - pNode = makeTower(Aig_And, children); - pNode = Aig_Not(pNode); - break; - case NOT: - assert(children.size() ==1); - pNode = Aig_Not(children[0].n); - break; - case NOR: - if (children.size() == 2) - pNode = Aig_Or(aigMgr, children[0].n, children[1].n); - else - pNode = makeTower(Aig_Or, children); - break; - pNode = Aig_Not(pNode); - break; - case XOR: - if (children.size() == 2) - pNode = Aig_Exor(aigMgr, children[0].n, children[1].n); - else - pNode = makeTower(Aig_Exor, children); - break; - case IFF: - assert(children.size() ==2); - pNode = Aig_Exor(aigMgr, children[0].n, children[1].n); - pNode = Aig_Not(pNode); - break; - case IMPLIES: - assert(children.size() ==2); - pNode = Aig_Or(aigMgr, Aig_Not(children[0].n), children[1].n); - break; - case ITE: - assert(children.size() ==3); - pNode - = Aig_Mux(aigMgr, children[0].n, children[1].n, - children[2].n); - break; - - default: - cerr << "Not handled::!!" << _kind_names[kind]; - FatalError("Never here"); - } - return BBNodeAIG(pNode); - } - - BBNodeAIG CreateNode(Kind kind, const BBNodeAIG& child0, - const vector & back_children = _empty_BBNodeAIGVec) - { - vector front_children; - front_children.reserve(1 + back_children.size()); - front_children.push_back(child0); - front_children.insert(front_children.end(), back_children.begin(), - back_children.end()); - return CreateNode(kind, front_children); - } - - BBNodeAIG CreateNode(Kind kind, const BBNodeAIG& child0, const BBNodeAIG& child1, - const vector & back_children = _empty_BBNodeAIGVec) - { - vector front_children; - front_children.reserve(2 + back_children.size()); - front_children.push_back(child0); - front_children.push_back(child1); - front_children.insert(front_children.end(), back_children.begin(), - back_children.end()); - return CreateNode(kind, front_children); - - } - - BBNodeAIG CreateNode(Kind kind, const BBNodeAIG& child0, const BBNodeAIG& child1, - const BBNodeAIG& child2, const vector & back_children = - _empty_BBNodeAIGVec) - { - vector front_children; - front_children.reserve(3 + back_children.size()); - front_children.push_back(child0); - front_children.push_back(child1); - front_children.push_back(child2); - front_children.insert(front_children.end(), back_children.begin(), - back_children.end()); - return CreateNode(kind, front_children); - } -}; - -} -; - -#endif /* BBNodeManagerAIG_H_ */ diff --git a/src/vendor/stp/src/to-sat/AIG/ToCNFAIG.cpp b/src/vendor/stp/src/to-sat/AIG/ToCNFAIG.cpp deleted file mode 100644 index 0a845bf19..000000000 --- a/src/vendor/stp/src/to-sat/AIG/ToCNFAIG.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "ToCNFAIG.h" - - -namespace BEEV -{ - -// Can it only add in the new variables somehow?? -void addVariables(BBNodeManagerAIG& mgr, Cnf_Dat_t*& cnfData , ToSATBase::ASTNodeToSATVar& nodeToVar) -{ - BBNodeManagerAIG::SymbolToBBNode::const_iterator it; - // Each symbol maps to a vector of CNF variables. - for (it = mgr.symbolToBBNode.begin(); it != mgr.symbolToBBNode.end(); it++) { - const ASTNode& n = it->first; - const vector &b = it->second; - - const int width = (n.GetType() == BOOLEAN_TYPE) ? 1 : n.GetValueWidth(); - - // INT_MAX for parts of symbols that didn't get encoded. - vector v(width, ~((unsigned) 0)); - - for (unsigned i = 0; i < b.size(); i++) { - if (!b[i].IsNull()) { - Aig_Obj_t * pObj; - pObj = (Aig_Obj_t*) Vec_PtrEntry(mgr.aigMgr->vPis, - b[i].symbol_index); - v[i] = cnfData->pVarNums[pObj->Id]; - } - } - nodeToVar.insert(make_pair(n, v)); - } -} - -void ToCNFAIG::toCNF(const BBNodeAIG& top, Cnf_Dat_t*& cnfData, - ToSATBase::ASTNodeToSATVar& nodeToVar, - bool needAbsRef, BBNodeManagerAIG& mgr) { - assert(cnfData == NULL); - - Aig_ObjCreatePo(mgr.aigMgr, top.n); - if (!needAbsRef) { - Aig_ManCleanup( mgr.aigMgr); // remove nodes not connected to the PO. - } - Aig_ManCheck( mgr.aigMgr); // check that AIG looks ok. - - assert(Aig_ManPoNum(mgr.aigMgr) == 1); - - // UseZeroes gives assertion errors. - // Rewriting is sometimes very slow. Can it be configured to be faster? - // What about refactoring??? - - int nodeCount = mgr.aigMgr->nObjs[AIG_OBJ_AND]; - if (uf.stats_flag) - cerr << "Nodes before AIG rewrite:" << nodeCount << endl; - - if (!needAbsRef && uf.isSet("aig-rewrite","0")) { - Dar_LibStart(); - Aig_Man_t * pTemp; - Dar_RwrPar_t Pars, *pPars = &Pars; - Dar_ManDefaultRwrParams(pPars); - - // Assertion errors occur with this enabled. - // pPars->fUseZeros = 1; - - // For mul63bit.smt2 with iterations =3 & nCutsMax = 8 - // CNF generation was taking 139 seconds, solving 10 seconds. - - // With nCutsMax =2, CNF generation takes 16 seconds, solving 10 seconds. - // The rewriting doesn't remove as many nodes of course.. - int iterations = 3; - - for (int i = 0; i < iterations; i++) { - mgr.aigMgr = Aig_ManDup(pTemp = mgr.aigMgr, 0); - Aig_ManStop(pTemp); - Dar_ManRewrite(mgr.aigMgr, pPars); - - mgr.aigMgr = Aig_ManDup(pTemp = mgr.aigMgr, 0); - Aig_ManStop(pTemp); - - if (uf.stats_flag) - cerr << "After rewrite [" << i << "] nodes:" - << mgr.aigMgr->nObjs[AIG_OBJ_AND] << endl; - - if (nodeCount == mgr.aigMgr->nObjs[AIG_OBJ_AND]) - break; - - } - } - if (!uf.isSet("simple-cnf","0")) { - cnfData = Cnf_Derive(mgr.aigMgr, 0); - if (uf.stats_flag) - cerr << "advanced CNF" << endl; - } else { - cnfData = Cnf_DeriveSimple(mgr.aigMgr, 0); - if (uf.stats_flag) - cerr << "simple CNF" << endl; - - } - - BBNodeManagerAIG::SymbolToBBNode::const_iterator it; - - assert(nodeToVar.size() == 0); - - //todo. cf. with addvariables above... - // Each symbol maps to a vector of CNF variables. - for (it = mgr.symbolToBBNode.begin(); it != mgr.symbolToBBNode.end(); it++) { - const ASTNode& n = it->first; - const vector &b = it->second; - assert(nodeToVar.find(n) == nodeToVar.end()); - - const int width = (n.GetType() == BOOLEAN_TYPE) ? 1 : n.GetValueWidth(); - - // INT_MAX for parts of symbols that didn't get encoded. - vector v(width, ~((unsigned) 0)); - - for (unsigned i = 0; i < b.size(); i++) { - if (!b[i].IsNull()) { - Aig_Obj_t * pObj; - pObj = (Aig_Obj_t*) Vec_PtrEntry(mgr.aigMgr->vPis, - b[i].symbol_index); - v[i] = cnfData->pVarNums[pObj->Id]; - } - } - - nodeToVar.insert(make_pair(n, v)); - } - assert(cnfData != NULL); -} -}; diff --git a/src/vendor/stp/src/to-sat/AIG/ToCNFAIG.h b/src/vendor/stp/src/to-sat/AIG/ToCNFAIG.h deleted file mode 100644 index 10d82740e..000000000 --- a/src/vendor/stp/src/to-sat/AIG/ToCNFAIG.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TOCNFAIG_H_ -#define TOCNFAIG_H_ - -#include "../../extlib-abc/aig.h" -#include "../../extlib-abc/cnf_short.h" -#include "../../extlib-abc/dar.h" -#include "../ToSATBase.h" -#include "BBNodeManagerAIG.h" -#include "../../boost/noncopyable.hpp" - -namespace BEEV { - -class ToCNFAIG : boost::noncopyable -{ - UserDefinedFlags& uf; - -public: - ToCNFAIG(UserDefinedFlags& _uf): - uf(_uf) - { - } - - void toCNF(const BBNodeAIG& top, Cnf_Dat_t*& cnfData, - ToSATBase::ASTNodeToSATVar& nodeToVar, - bool needAbsRef, BBNodeManagerAIG& _mgr); -}; - -} -#endif /* TOCNFAIG_H_ */ diff --git a/src/vendor/stp/src/to-sat/AIG/ToSATAIG.cpp b/src/vendor/stp/src/to-sat/AIG/ToSATAIG.cpp deleted file mode 100644 index 7873b8cde..000000000 --- a/src/vendor/stp/src/to-sat/AIG/ToSATAIG.cpp +++ /dev/null @@ -1,289 +0,0 @@ -#include "ToSATAIG.h" -#include "../../simplifier/constantBitP/ConstantBitPropagation.h" -#include "../../simplifier/simplifier.h" - -namespace BEEV -{ - - int ToSATAIG::cnf_calls=0; - - bool - ToSATAIG::CallSAT(SATSolver& satSolver, const ASTNode& input, bool needAbsRef) - { - if (cb != NULL && cb->isUnsatisfiable()) - return false; - - if (!first) - { - assert(input == ASTTrue); - bm->GetRunTimes()->start(RunTimes::Solving); - satSolver.solve(); - bm->GetRunTimes()->stop(RunTimes::Solving); - - if(bm->UserFlags.stats_flag) - satSolver.printStats(); - - return satSolver.okay(); - } - - // Shortcut if known. This avoids calling the setup of the CNF generator. - // setup of the CNF generator is expensive. NB, these checks have to occur - // after calling the sat solver (if it's not the first time.) - if (input == ASTFalse ) - return false; - - if (input == ASTTrue ) - return true; - - Simplifier simp(bm); - - BBNodeManagerAIG mgr; - BitBlaster bb(&mgr,&simp,bm->defaultNodeFactory,&bm->UserFlags,cb); - - bm->GetRunTimes()->start(RunTimes::BitBlasting); - BBNodeAIG BBFormula = bb.BBForm(input); - bm->GetRunTimes()->stop(RunTimes::BitBlasting); - - delete cb; - cb = NULL; - bb.cb = NULL; - - assert(satSolver.nVars() ==0); - - bm->GetRunTimes()->start(RunTimes::CNFConversion); - Cnf_Dat_t* cnfData = NULL; - toCNF.toCNF(BBFormula, cnfData, nodeToSATVar,needAbsRef,mgr); - bm->GetRunTimes()->stop(RunTimes::CNFConversion); - - // Free the memory in the AIGs. - BBFormula = BBNodeAIG(); // null node - mgr.stop(); - - if (bm->UserFlags.output_CNF_flag) - { - stringstream fileName; - fileName << "output_" << bm->CNFFileNameCounter++ << ".cnf"; - Cnf_DataWriteIntoFile(cnfData, (char*)fileName.str().c_str(), 0); - } - first = false; - - if (bm->UserFlags.exit_after_CNF) - { - if (bm->UserFlags.quick_statistics_flag) - bm->GetRunTimes()->print(); - - if (needAbsRef) - cerr << "Warning: STP is exiting after generating the first CNF. But the CNF" - " is probably partial which you probably don't want. You probably want to disable" - " refinement with the \"-r\" command line option." << endl; - - exit(0); - } - - bm->GetRunTimes()->start(RunTimes::SendingToSAT); - - // Create a new sat variable for each of the variables in the CNF. - int satV = satSolver.nVars(); - for (int i = 0; i < cnfData->nVars - satV ; i++) - satSolver.newVar(); - - SATSolver::vec_literals satSolverClause; - for (int i = 0; i < cnfData->nClauses; i++) - { - satSolverClause.clear(); - for (int * pLit = cnfData->pClauses[i], *pStop = cnfData->pClauses[i - + 1]; pLit < pStop; pLit++) - { - SATSolver::Var var = (*pLit) >> 1; - assert ((var < satSolver.nVars())); - Minisat::Lit l = SATSolver::mkLit(var, (*pLit) & 1); - satSolverClause.push(l); - } - - satSolver.addClause(satSolverClause); - if (!satSolver.okay()) - break; - } - bm->GetRunTimes()->stop(RunTimes::SendingToSAT); - - if (bm->UserFlags.output_bench_flag) - cerr << "Converting to CNF via ABC's AIG package can't yet print out bench format" << endl; - - - // This releases the memory used by the CNF generator, particularly some data tables. - // If CNF generation is going to be called lots, we'd rather keep it around. - // because the datatables are expensive to generate. - if (cnf_calls == 0) - Cnf_ClearMemory(); - - cnf_calls++; - - Cnf_DataFree(cnfData); - cnfData = NULL; - - // Minisat doesn't, but simplifying minisat and cryptominsat eliminate variables during their - // simplification phases. The problem is that we may later add clauses in that refer to those - // simplified-away variables. Here we mark them as frozen which prevents them from being removed. - for (ArrayTransformer::ArrType::iterator it = arrayTransformer->arrayToIndexToRead.begin(); - it != arrayTransformer->arrayToIndexToRead.end(); it++) - { - const ArrayTransformer::arrTypeMap& atm = it->second; - - for (ArrayTransformer::arrTypeMap::const_iterator arr_it = atm.begin(); arr_it != atm.end(); arr_it++) - { - const ArrayTransformer::ArrayRead& ar = arr_it->second; - ASTNodeToSATVar::iterator it = nodeToSATVar.find(ar.index_symbol); - if (it != nodeToSATVar.end()) - { - const vector& v = it->second; - for (int i = 0; i < v.size(); i++) - satSolver.setFrozen(v[i]); - } - - ASTNodeToSATVar::iterator it2 = nodeToSATVar.find(ar.symbol); - if (it2 != nodeToSATVar.end()) - { - const vector& v = it2->second; - for (int i = 0; i < v.size(); i++) - satSolver.setFrozen(v[i]); - } - } - } - - // One modified version of Minisat has an array propagator based solver built in. So this block sends the details of the arrays to it. - if ((bm->UserFlags.solver_to_use == UserDefinedFlags::MINISAT_PROPAGATORS) && !bm->UserFlags.ackermannisation ) - { - int array_id = 0; // Is incremented for each distinct array. - bool found = false; - for (ArrayTransformer::ArrType::iterator it = arrayTransformer->arrayToIndexToRead.begin(); - it != arrayTransformer->arrayToIndexToRead.end(); it++) - { - const ArrayTransformer::arrTypeMap& atm = it->second; - - for (ArrayTransformer::arrTypeMap::const_iterator arr_it = atm.begin(); arr_it != atm.end(); arr_it++) - { - const ArrayTransformer::ArrayRead& ar = arr_it->second; - - // Get the the SAT solver variable numbers of the index, but, - // if it's a constant, use that instead, - // if we don't have anything, then add some new stuff in. - - ASTNodeToSATVar::iterator it = nodeToSATVar.find(ar.index_symbol); - SATSolver::vec_literals index; - Minisat::vec index_constants; - const int index_width = arr_it->first.GetValueWidth(); - if (it != nodeToSATVar.end()) - { - const vector& v = it->second; - for (int i = 0; i < index_width; i++) - index.push(SATSolver::mkLit(v[i], false)); - } - else if (ar.index_symbol.isConstant()) - { - const CBV c = ar.index_symbol.GetBVConst(); - for (int i = 0; i < index_width; i++) - if (CONSTANTBV::BitVector_bit_test(c, i)) - index_constants.push((Minisat::lbool) satSolver.true_literal()); - else - index_constants.push((Minisat::lbool) satSolver.false_literal()); - } - else - { - - // The index is ommitted from the problem. - - vector v_a; - assert(ar.index_symbol.GetKind() == SYMBOL); - // It was ommitted from the initial problem, so assign it freshly. - for (int i = 0; i < ar.index_symbol.GetValueWidth(); i++) - { - SATSolver::Var v = satSolver.newVar(); - // We probably don't want the variable eliminated. - satSolver.setFrozen(v); - v_a.push_back(v); - } - nodeToSATVar.insert(make_pair(ar.index_symbol, v_a)); - - for (int i = 0; i < v_a.size(); i++) - { - SATSolver::Var var = v_a[i]; - index.push(SATSolver::mkLit(var, false)); - } - } - - assert((index.size() > 0) ^ (index_constants.size() > 0)); - - SATSolver::vec_literals value; - Minisat::vec value_constants; - it = nodeToSATVar.find(ar.symbol); - - if (it != nodeToSATVar.end()) - { - vector& v = it->second; - for (int i = 0; i < v.size(); i++) - { - SATSolver::Var var = v[i]; - value.push(SATSolver::mkLit(var, false)); - } - } - else if (ar.symbol.isConstant()) - { - CBV c = ar.symbol.GetBVConst(); - for (int i = 0; i < ar.symbol.GetValueWidth(); i++) - if (CONSTANTBV::BitVector_bit_test(c, i)) - value_constants.push((Minisat::lbool) satSolver.true_literal()); - else - value_constants.push((Minisat::lbool) satSolver.false_literal()); - } - else - { - // The value has been ommitted.. - // I'm not sure this is needed (really). - vector v_a; - - assert(ar.symbol.GetKind() == SYMBOL); - // It was ommitted from the initial problem, so assign it freshly. - for (int i = 0; i < ar.symbol.GetValueWidth(); i++) - { - SATSolver::Var v = satSolver.newVar(); - // We probably don't want the variable eliminated. - satSolver.setFrozen(v); - v_a.push_back(v); - } - nodeToSATVar.insert(make_pair(ar.symbol, v_a)); - - for (int i = 0; i < v_a.size(); i++) - { - SATSolver::Var var = v_a[i]; - value.push(SATSolver::mkLit(var, false)); - } - } - - satSolver.addArray(array_id, index, value, index_constants, value_constants); - found = true; - } - if (found) - array_id++; - found = false; - } - } - - //void setHardTimeout(int sec); - //setHardTimeout(500); - - - bm->GetRunTimes()->start(RunTimes::Solving); - satSolver.solve(); - bm->GetRunTimes()->stop(RunTimes::Solving); - - if(bm->UserFlags.stats_flag) - satSolver.printStats(); - - return satSolver.okay(); - } - - ToSATAIG::~ToSATAIG() - { - ClearAllTables(); - } -} diff --git a/src/vendor/stp/src/to-sat/AIG/ToSATAIG.h b/src/vendor/stp/src/to-sat/AIG/ToSATAIG.h deleted file mode 100644 index 36fd5bdaa..000000000 --- a/src/vendor/stp/src/to-sat/AIG/ToSATAIG.h +++ /dev/null @@ -1,93 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Trevor Hansen - * - * BEGIN DATE: June, 2010 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef TOSATAIG_H -#define TOSATAIG_H -#include - -#include "../../AST/AST.h" -#include "../../AST/RunTimes.h" -#include "../../STPManager/STPManager.h" -#include "../BitBlaster.h" -#include "BBNodeManagerAIG.h" -#include "ToCNFAIG.h" -#include "../../AST/ArrayTransformer.h" - -namespace BEEV -{ - - class ToSATAIG : public ToSATBase - { - private: - - ASTNodeToSATVar nodeToSATVar; - simplifier::constantBitP::ConstantBitPropagation* cb; - - ArrayTransformer *arrayTransformer; - - // don't assign or copy construct. - ToSATAIG& operator = (const ToSATAIG& other); - ToSATAIG(const ToSATAIG& other); - - int count; - bool first; - - ToCNFAIG toCNF; - - void init() - { - count = 0; - first = true; - } - - static int cnf_calls; - - public: - bool cbIsDestructed() - { - return cb == NULL; - } - - ToSATAIG(STPMgr * bm , ArrayTransformer *at) : - ToSATBase(bm), toCNF(bm->UserFlags) - { - cb = NULL; - init(); - arrayTransformer = at; - } - - ToSATAIG(STPMgr * bm, simplifier::constantBitP::ConstantBitPropagation* cb_, ArrayTransformer *at ) : - ToSATBase(bm), cb(cb_), toCNF(bm->UserFlags) - { - cb = cb_; - init(); - arrayTransformer = at; - } - - ~ToSATAIG(); - - void - ClearAllTables() - { - nodeToSATVar.clear(); - } - - // Used to read out the satisfiable answer. - ASTNodeToSATVar& - SATVar_to_SymbolIndexMap() - { - return nodeToSATVar; - } - - bool CallSAT(SATSolver& satSolver, const ASTNode& input, bool needAbsRef); - - }; -} - -#endif diff --git a/src/vendor/stp/src/to-sat/ASTNode/BBNodeManagerASTNode.h b/src/vendor/stp/src/to-sat/ASTNode/BBNodeManagerASTNode.h deleted file mode 100644 index 3ec50d3f8..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/BBNodeManagerASTNode.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef BBNodeManager_H_ -#define BBNodeManager_H_ - -// We can bitblast either via ASTNodes, or via AIG nodes. The AIG nodes use less memory, and produce better CNFs. The ASTNodes are the -// traditional way of doing it. - -#include "../../STPManager/STPManager.h" - -namespace BEEV { -class ASTNode; -typedef std::vector ASTVec; - -// Called by the bitblaster. This returns ASTNodes after applying the -// CreateSimpForm(..) simplifications. -class BBNodeManagerASTNode { - ASTNode ASTTrue, ASTFalse; - STPMgr *stp; - - //no copy, no assign. - BBNodeManagerASTNode& operator = (const BBNodeManagerASTNode& other); - BBNodeManagerASTNode(const BBNodeManagerASTNode& other); - -public: - - BBNodeManagerASTNode(STPMgr *_stp) { - stp = _stp; - ASTTrue = stp->CreateNode(TRUE); - ASTFalse = stp->CreateNode(FALSE); - } - - ~BBNodeManagerASTNode() { - } - - ASTNode getTrue() { - return ASTTrue; - } - - ASTNode getFalse() { - return ASTFalse; - } - - ASTNode CreateSymbol(const ASTNode& n, unsigned i) { - if (n.GetType() == BOOLEAN_TYPE) { - assert(i == 0); - return n; - } else - return stp->CreateNode(BVGETBIT, n, stp->CreateBVConst(32, i)); - } - - // CreateSimpForm removes IFF which aren't handled by the cnf converter. - ASTNode CreateNode(Kind kind, vector& children) { - return stp->CreateSimpForm(kind, children); - } - - ASTNode CreateNode(Kind kind, const ASTNode& child0) { - return stp->CreateSimpForm(kind, child0); - } - - ASTNode CreateNode(Kind kind, const ASTNode& child0, const ASTNode& child1) { - return stp->CreateSimpForm(kind, child0, child1); - } - - ASTNode CreateNode(Kind kind, const ASTNode& child0, const ASTNode& child1, - const ASTNode& child2) { - return stp->CreateSimpForm(kind, child0, child1, child2); - } -}; - -} -; -#endif /* BBNodeManager_H_ */ diff --git a/src/vendor/stp/src/to-sat/ASTNode/ClauseList.cpp b/src/vendor/stp/src/to-sat/ASTNode/ClauseList.cpp deleted file mode 100644 index 774ca1f82..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/ClauseList.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "ClauseList.h" -#include "../../AST/AST.h" - -namespace BEEV -{ - -// inplace PRODUCT of "this". -void ClauseList::appendToAllClauses(const ASTNode* n) { - ClauseContainer::iterator it1 = cont.begin(); - for (; it1 != cont.end(); it1++) - (*it1)->push_back(n); -} - -// expects varphi2 to be just a single clause. -void ClauseList::INPLACE_PRODUCT(const ClauseList& varphi2) { - assert(1 == varphi2.size()); - ClauseList& varphi1 = *this; - - ClauseContainer::iterator it1 = varphi1.cont.begin(); - ClauseContainer::iterator this_end = varphi1.cont.end(); - const ClauseNoPtr::const_iterator& insert_end = - varphi2.cont.front()->end(); - const ClauseNoPtr::const_iterator& insert_begin = - varphi2.cont.front()->begin(); - - for (; it1 != this_end; it1++) { - ClausePtr p = *it1; - p->insert(p->end(), insert_begin, insert_end); - } -} - - -} diff --git a/src/vendor/stp/src/to-sat/ASTNode/ClauseList.h b/src/vendor/stp/src/to-sat/ASTNode/ClauseList.h deleted file mode 100644 index 0cfe477eb..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/ClauseList.h +++ /dev/null @@ -1,155 +0,0 @@ -#ifndef CLAUSELIST_H_ -#define CLAUSELIST_H_ - -#include "../../AST/AST.h" -#include - -namespace BEEV -{ - -typedef vector* ClausePtr; -typedef vector ClauseNoPtr; -typedef deque ClauseContainer; - -static bool vectorsizesort(const ClausePtr& a, const ClausePtr& b) -{ - return a->size() < b->size(); -} - -class ClauseList - { - ClauseContainer cont; - // No copy constructor or assignment. - ClauseList& operator = (const ClauseList& other); - ClauseList(const ClauseList& other); - - public: - - void appendToAllClauses(const ASTNode* n); - void INPLACE_PRODUCT(const ClauseList& varphi2); - - ClauseContainer* asList() { - return &cont; - } - - bool isUnit() const - { - return size() ==1 && cont[0]->size() ==1; - } - - int size() const { - return cont.size(); - } - - ClauseList() - { - } - - void sort() - { - std::sort (cont.begin(), cont.end(), vectorsizesort); - } - - //Putting: cont.reserve(l->size() + cont.size()); - // in here is a terrible idea. - // reserve() will increase the size of the vector to the amount reserved. - // If you are adding 10 clauselists of size 2, then it will increase - // the base container by 2, 10 times. - // However if you use the default growth strategy, it will grow in chunks, - // perhaps doubling the backing arrays size. Requiring fewer memmoves. - void insert(ClauseList* l) { - cont.insert(cont.end(), l->cont.begin(), l->cont.end()); - } - - void insertAtFront(ClauseList* l) { - cont.insert(cont.begin(), l->cont.begin(), l->cont.end()); - } - - // This deletes all the clausePtrs this container points to. - // This isn't part of the destructor because for instance, in - // INPLACE_UNION, the clausePtrs are already pointed to by - // another ClauseContainer. - void deleteJustVectors() { - ClauseContainer::const_iterator it = cont.begin(); - for (; it != cont.end(); it++) { - delete *it; - } - cont.clear(); - } - - void push_back(ClausePtr p) { - cont.push_back(p); - } - - void reserve(int v) { - //cont.reserve(v); - } - - static ClauseList* UNION(const ClauseList& varphi1, const ClauseList& varphi2) - { - ClauseList* psi1 = ClauseList::COPY(varphi1); - ClauseList* psi2 = ClauseList::COPY(varphi2); - if (psi1->size() < psi2->size()) - { - psi2->insert(psi1); - delete psi1; - return psi2; - } - else - { - psi1->insert(psi2); - delete psi2; - return psi1; - } - } - - static void INPLACE_UNION(ClauseList* varphi1, const ClauseList& varphi2) - { - ClauseList* psi2 = ClauseList::COPY(varphi2); - varphi1->insert( psi2); - delete psi2; - } - - static void NOCOPY_INPLACE_UNION(ClauseList* varphi1, ClauseList* varphi2) - { - varphi1->insert(varphi2); - delete varphi2; - } - - static ClauseList* PRODUCT(const ClauseList& varphi1, - const ClauseList& varphi2) { - - ClauseList* psi = new ClauseList(); - psi->reserve(varphi1.size() * varphi2.size()); - - ClauseContainer::const_iterator it1 = varphi1.cont.begin(); - for (; it1 != varphi1.cont.end(); it1++) { - const ClausePtr& clause1 = *it1; - ClauseContainer::const_iterator it2 = varphi2.cont.begin(); - for (; it2 != varphi2.cont.end(); it2++) { - const ClausePtr& clause2 = *it2; - ClausePtr clause = new ClauseNoPtr(); - clause->reserve(clause1->size() + clause2->size()); - clause->insert(clause->end(), clause1->begin(), clause1->end()); - clause->insert(clause->end(), clause2->begin(), clause2->end()); - psi->push_back(clause); - } - } - return psi; - } - - static ClauseList* COPY(const ClauseList& varphi) { - - ClauseList* psi = new ClauseList(); - psi->reserve(varphi.size()); - - ClauseContainer::const_iterator it = varphi.cont.begin(); - for (; it != varphi.cont.end(); it++) { - psi->push_back(new ClauseNoPtr(**it)); - } - - return psi; - } - }; -} -#endif /* CLAUSELIST_H_ */ diff --git a/src/vendor/stp/src/to-sat/ASTNode/SimpBool.cpp b/src/vendor/stp/src/to-sat/ASTNode/SimpBool.cpp deleted file mode 100644 index 3b04c854b..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/SimpBool.cpp +++ /dev/null @@ -1,457 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, David L. Dill - * - * BEGIN DATE: April, 2006 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -// Simplifying create methods for Boolean operations. These are only -// very simple local simplifications. - -static bool _trace_simpbool = 0; -static bool _disable_simpbool = 0; - -#include "../../AST/AST.h" -#include "../../STPManager/STPManager.h" - -// SMTLIB experimental hack. Try allocating a single stack here for -// children to reduce growing of vectors. BEEV::ASTVec child_stack; - -namespace BEEV -{ - - ASTNode STPMgr::CreateSimpForm(Kind kind, ASTVec &children = _empty_ASTVec) - { - if (_disable_simpbool) - { - return CreateNode(kind, children); - } - else - { - switch (kind) - { - case NOT: - return CreateSimpNot(children[0]); - break; - case AND: - return CreateSimpAndOr(1, children); - break; - case OR: - return CreateSimpAndOr(0, children); - break; - case NAND: - return CreateSimpNot(CreateSimpAndOr(1, children)); - break; - case NOR: - return CreateSimpNot(CreateSimpAndOr(0, children)); - break; - case IFF: - { - // Convert IFF to XOR ASAP to simplify flattening. - children[0] = CreateSimpNot(children[0]); - return CreateSimpXor(children); - break; - } - case XOR: - return CreateSimpXor(children); - break; - case IMPLIES: - // FIXME: Earlier, check that this only has two arguments - return CreateSimpAndOr(0, CreateSimpNot(children[0]), children[1]); - break; - case ITE: - return CreateSimpFormITE(children[0], children[1], children[2]); - default: - return CreateNode(kind, children); - } - } - } - - // specialized versions - - ASTNode STPMgr::CreateSimpForm(Kind kind, const ASTNode& child0) - { - ASTVec children; - //child_stack.clear(); // could just reset top pointer. - children.push_back(child0); - //child_stack.push_back(child0); - return CreateSimpForm(kind, children); - //return CreateSimpForm(kind, child_stack); - } - - ASTNode STPMgr::CreateSimpForm(Kind kind, - const ASTNode& child0, const ASTNode& child1) - { - ASTVec children; - //child_stack.clear(); // could just reset top pointer. - children.push_back(child0); - //child_stack.push_back(child0); - children.push_back(child1); - //child_stack.push_back(child1); - return CreateSimpForm(kind, children); - //return CreateSimpForm(kind, child_stack); - } - - ASTNode STPMgr::CreateSimpForm(Kind kind, - const ASTNode& child0, - const ASTNode& child1, const ASTNode& child2) - { - ASTVec children; - //child_stack.clear(); // could just reset top pointer. - children.push_back(child0); - //child_stack.push_back(child0); - children.push_back(child1); - //child_stack.push_back(child1); - children.push_back(child2); - //child_stack.push_back(child2); - return CreateSimpForm(kind, children); - //return CreateSimpForm(kind, child_stack); - } - - ASTNode STPMgr::CreateSimpNot(const ASTNode& form) - { - Kind k = form.GetKind(); - switch (k) - { - case FALSE: - { - return ASTTrue; - } - case TRUE: - { - return ASTFalse; - } - case NOT: - { - return form[0]; - } // NOT NOT cancellation - case XOR: - { - // Push negation down in this case. - // FIXME: Separate pre-pass to push negation down? - // CreateSimp should be local, and this isn't. - // It isn't memoized. Arg. - ASTVec children = form.GetChildren(); - children[0] = CreateSimpNot(children[0]); - return CreateSimpXor(children); - } - default: - { - return CreateNode(NOT, form); - //return CreateNode(XOR, ASTTrue, form); - } - } - } - - ASTNode STPMgr::CreateSimpXor(const ASTNode& form1, const ASTNode& form2) - { - ASTVec children; - children.push_back(form1); - children.push_back(form2); - return CreateSimpXor(children); - } - - ASTNode STPMgr::CreateSimpAndOr(bool IsAnd, - const ASTNode& form1, const ASTNode& form2) - { - ASTVec children; - children.push_back(form1); - children.push_back(form2); - return CreateSimpAndOr(IsAnd, children); - } - - // FIXME: Could also handle (AND ... (NOT (OR ...) ...) - ASTNode STPMgr::CreateSimpAndOr(bool IsAnd, ASTVec &children) - { - - Kind k = IsAnd ? AND : OR; - - if (_trace_simpbool) - { - cout << "========" << endl << "CreateSimpAndOr " << k << " "; - lpvec(children); - cout << endl; - } - - ASTVec new_children; - - ASTVec flat_children; - if (UserFlags.xor_flatten_flag) - { - flat_children = FlattenKind(k, children); - } - else - { - flat_children = children; - } - - // sort so that identical nodes occur in sequential runs, followed by - // their negations. - SortByExprNum(flat_children); - - ASTNode annihilator = (IsAnd ? ASTFalse : ASTTrue); - ASTNode identity = (IsAnd ? ASTTrue : ASTFalse); - - ASTNode retval; - - ASTVec::const_iterator it_end = flat_children.end(); - ASTVec::const_iterator next_it; - for (ASTVec::const_iterator it = flat_children.begin(); - it != it_end; it = next_it) - { - next_it = it + 1; - bool nextexists = (next_it < it_end); - - if (*it == annihilator) - { - retval = annihilator; - if (_trace_simpbool) - { - cout << "returns " << retval << endl; - } - return retval; - } - else if (*it == identity) - { - // just drop it - } - else if (nextexists && (*next_it == *it)) - { - // drop it - // cout << "Dropping [" << it->GetNodeNum() << "]" << endl; - } - else if (nextexists && (next_it->GetKind() == NOT) - && ((*next_it)[0] == *it)) - { - // form and negation -- return FALSE for AND, TRUE for OR. - retval = annihilator; - // cout << "X and/or NOT X" << endl; - if (_trace_simpbool) - { - cout << "returns " << retval << endl; - } - return retval; - } - else - { - // add to children - new_children.push_back(*it); - } - } - - // If we get here, we saw no annihilators, and children should - // be only the non-True nodes. - if (new_children.size() < 2) - { - if (0 == new_children.size()) - { - retval = identity; - } - else - { - // there is just one child - retval = new_children[0]; - } - } - else - { - // 2 or more children. Create a new node. - retval = CreateNode(IsAnd ? AND : OR, new_children); - } - if (_trace_simpbool) - { - cout << "returns " << retval << endl; - } - return retval; - } - - // Constant children are accumulated in "accumconst". - ASTNode STPMgr::CreateSimpXor(ASTVec &children) - { - - if (_trace_simpbool) - { - cout << "========" << endl << "CreateSimpXor "; - lpvec(children); - cout << endl; - } - - ASTVec flat_children; // empty vector - ASTVec::const_iterator it_end = children.end(); - - if (UserFlags.xor_flatten_flag) - { - flat_children = FlattenKind(XOR, children); - } - else - { - flat_children = children; - } - - // sort so that identical nodes occur in sequential runs, followed by - // their negations. - SortByExprNum(flat_children); - - ASTNode retval; - - // This is the C Boolean value of all constant args seen. It is initially - // 0. TRUE children cause it to change value. - bool accumconst = 0; - - ASTVec new_children; - - it_end = flat_children.end(); - ASTVec::iterator next_it; - for (ASTVec::iterator it = flat_children.begin(); it != it_end; it++) - { - next_it = it + 1; - bool nextexists = (next_it < it_end); - - if (ASTTrue == *it) - { - accumconst = !accumconst; - } - else if (ASTFalse == *it) - { - // Ignore it - } - else if (nextexists && (*next_it == *it)) - { - // x XOR x = FALSE. Skip current, write "false" into next_it - // so that it gets tossed, too. - *next_it = ASTFalse; - } - else if (nextexists && (next_it->GetKind() == NOT) - && ((*next_it)[0] == *it)) - { - // x XOR NOT x = TRUE. Skip current, write "true" into next_it - // so that it gets tossed, too. - *next_it = ASTTrue; - } - else if (NOT == it->GetKind()) - { - // If child is (NOT alpha), we can flip accumconst and use alpha. - // This is ok because (NOT alpha) == TRUE XOR alpha - accumconst = !accumconst; - // CreateSimpNot just takes child of not. - new_children.push_back(CreateSimpNot(*it)); - } - else - { - new_children.push_back(*it); - } - } - - // Children should be non-constant. - if (new_children.size() < 2) - { - if (0 == new_children.size()) - { - // XOR(TRUE, FALSE) -- accumconst will be 1. - if (accumconst) - { - retval = ASTTrue; - } - else - { - retval = ASTFalse; - } - } - else - { - // there is just one child - // XOR(x, TRUE) -- accumconst will be 1. - if (accumconst) - { - retval = CreateSimpNot(new_children[0]); - } - else - { - retval = new_children[0]; - } - } - } - else - { - // negate first child if accumconst == 1 - if (accumconst) - { - new_children[0] = CreateSimpNot(new_children[0]); - } - retval = CreateNode(XOR, new_children); - } - - if (_trace_simpbool) - { - cout << "returns " << retval << endl; - } - return retval; - } - - // FIXME: How do I know whether ITE is a formula or not? - ASTNode STPMgr::CreateSimpFormITE(const ASTNode& child0, - const ASTNode& child1, - const ASTNode& child2) - { - - ASTNode retval; - - if (_trace_simpbool) - { - cout << "========" << endl - << "CreateSimpFormITE " - << child0 << child1 << child2 << endl; - } - - if (ASTTrue == child0) - { - retval = child1; - } - else if (ASTFalse == child0) - { - retval = child2; - } - else if (child1 == child2) - { - retval = child1; - } - // ITE(x, TRUE, y ) == x OR y - else if (ASTTrue == child1) - { - retval = CreateSimpAndOr(0, child0, child2); - } - // ITE(x, FALSE, y ) == (!x AND y) - else if (ASTFalse == child1) - { - retval = CreateSimpAndOr(1, CreateSimpNot(child0), child2); - } - // ITE(x, y, TRUE ) == (!x OR y) - else if (ASTTrue == child2) - { - retval = CreateSimpAndOr(0, CreateSimpNot(child0), child1); - } - // ITE(x, y, FALSE ) == (x AND y) - else if (ASTFalse == child2) - { - retval = CreateSimpAndOr(1, child0, child1); - } - else - { - ASTNode left = CreateNode(AND, child0, child1); - ASTNode right = CreateNode(AND, CreateNode(NOT,child0), child2); - ASTVec c; - c.push_back(left); - c.push_back(right); - retval = CreateSimpXor(c); - } - - if (_trace_simpbool) - { - cout << "returns " << retval << endl; - } - - return retval; - } -} // BEEV namespace diff --git a/src/vendor/stp/src/to-sat/ASTNode/ToCNF.cpp b/src/vendor/stp/src/to-sat/ASTNode/ToCNF.cpp deleted file mode 100644 index dde980fb0..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/ToCNF.cpp +++ /dev/null @@ -1,1820 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Mike Katelman - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#include "../../AST/AST.h" -#include "../../STPManager/STPManager.h" -#include "ToCNF.h" - -namespace BEEV -{ - //############################################################ - //############################################################ - - bool CNFMgr::onChildDoPos(const ASTNode& varphi, unsigned int idx) - { - bool result = true; - - Kind k = varphi.GetKind(); - switch (k) - { - case NOT: - { - result = false; - break; - } - case NAND: - { - result = false; - break; - } - case NOR: - { - result = false; - break; - } - case IMPLIES: - { - if (idx == 0) - { - result = false; - } - break; - } - default: - { - break; - } - } - - return result; - } //End of onChildDoPos() - - bool CNFMgr::onChildDoNeg(const ASTNode& varphi, unsigned int idx) - { - bool result = false; - - Kind k = varphi.GetKind(); - switch (k) - { - case NOT: - { - result = true; - break; - } - case NAND: - { - result = true; - break; - } - case NOR: - { - result = true; - break; - } - case XOR: - { - result = true; - break; - } - case IFF: - { - result = true; - break; - } - case IMPLIES: - { - if (idx == 0) - { - result = true; - } - break; - } - case ITE: - { - if (idx == 0) - { - result = true; - } - break; - } - default: - { - break; - } - } - - return result; - } //End of onChildDoNeg() - - //######################################## - //######################################## - //utilities for control bits. - - - void CNFMgr::incrementSharesPos(CNFInfo& x) - { - x.control += ((x.control & 3) < 2) ? 1 : 0; - } //End of incrementSharesPos() - - int CNFMgr::sharesPos(CNFInfo& x) - { - return (x.control & 3); - } //End of sharesPos() - - void CNFMgr::incrementSharesNeg(CNFInfo& x) - { - x.control += ((x.control & 12) < 8) ? 4 : 0; - } //End of incrementSharesNeg() - - int CNFMgr::sharesNeg(CNFInfo& x) - { - return ((x.control & 12) >> 2); - } //End of sharesNeg() - - void CNFMgr::setControlBit(CNFInfo& x, unsigned int idx) - { - x.control |= (1 << idx); - } //End of setControlBit() - - bool CNFMgr::getControlBit(CNFInfo& x, unsigned int idx) - { - bool result = false; - - if (x.control & (1 << idx)) - { - result = true; - } - - return result; - } //End of getControlBit() - - void CNFMgr::setIsTerm(CNFInfo& x) - { - setControlBit(x, 4); - } //End of setIsTerm() - - bool CNFMgr::isTerm(CNFInfo& x) - { - return getControlBit(x, 4); - } - - void CNFMgr::setDoRenamePos(CNFInfo& x) - { - setControlBit(x, 5); - } - - bool CNFMgr::doRenamePos(CNFInfo& x) - { - return getControlBit(x, 5); - } - - void CNFMgr::setWasRenamedPos(CNFInfo& x) - { - setControlBit(x, 6); - } - - bool CNFMgr::wasRenamedPos(CNFInfo& x) - { - return getControlBit(x, 6); - } - - void CNFMgr::setDoRenameNeg(CNFInfo& x) - { - setControlBit(x, 7); - } - - bool CNFMgr::doRenameNeg(CNFInfo& x) - { - return getControlBit(x, 7); - } - - void CNFMgr::setWasRenamedNeg(CNFInfo& x) - { - setControlBit(x, 8); - } - - bool CNFMgr::wasRenamedNeg(CNFInfo& x) - { - return getControlBit(x, 8); - } - - void CNFMgr::setDoSibRenamingPos(CNFInfo& x) - { - setControlBit(x, 9); - } - - bool CNFMgr::doSibRenamingPos(CNFInfo& x) - { - return getControlBit(x, 9); - } - - void CNFMgr::setDoSibRenamingNeg(CNFInfo& x) - { - setControlBit(x, 10); - } - - bool CNFMgr::doSibRenamingNeg(CNFInfo& x) - { - return getControlBit(x, 10); - } - - void CNFMgr::setWasVisited(CNFInfo& x) - { - setControlBit(x, 11); - } - - bool CNFMgr::wasVisited(CNFInfo& x) - { - return getControlBit(x, 11); - } - - //######################################## - //######################################## - //utilities for clause sets - - ClauseList* CNFMgr::SINGLETON(const ASTNode& varphi) - { - ASTNode* copy = ASTNodeToASTNodePtr(varphi); - - ClausePtr clause = new vector (); - clause->push_back(copy); - - ClauseList* psi = new ClauseList(); - psi->push_back(clause); - return psi; - } //End of SINGLETON() - - static ASTNode GetNodeFrom_SINGLETON(ClauseList *cl) - { - ClausePtr c = (*(*cl).asList())[0]; - const ASTNode * a = (*c)[0]; - return *a; - } - - //######################################## - //######################################## - //prep. for cnf conversion - - void CNFMgr::scanFormula(const ASTNode& varphi, bool isPos, bool isXorChild) - { - CNFInfo* x; - Kind k = varphi.GetKind(); - - //######################################## - // step 1, get the info associated with this node - //######################################## - - if (info.find(varphi) == info.end()) - { - x = new CNFInfo(); - info[varphi] = x; - } - else - { - x = info[varphi]; - } - -#if defined CRYPTOMINISAT__2 - if(isXorChild) - { - setDoRenamePos(*x); - } -#endif - - //######################################## - // step 2, we only need to know if shares >= 2 - //######################################## - - if (isPos && sharesPos(*x) == 2) - { - return; - } - - if (!isPos && sharesNeg(*x) == 2) - { - return; - } - - //######################################## - // step 3, set appropriate information fields - //######################################## - - if (isPos) - { - incrementSharesPos(*x); - } - - if (!isPos) - { - incrementSharesNeg(*x); - } - - //######################################## - // step 4, recurse over children - //######################################## - - if (varphi.isAtom()) - { - return; - } - else if (varphi.isPred()) - { - for (unsigned int i = 0; i < varphi.GetChildren().size(); i++) - { - scanTerm(varphi[i]); - } - } - else - { - for (unsigned int i = 0; i < varphi.GetChildren().size(); i++) - { - if (onChildDoPos(varphi, i)) - { - scanFormula(varphi[i], isPos, k == XOR); - } - if (onChildDoNeg(varphi, i)) - { - scanFormula(varphi[i], !isPos, false); - } - } - } - - } //End of ScanFormula() - - void CNFMgr::scanTerm(const ASTNode& varphi) - { - CNFInfo* x; - - //######################################## - // step 1, get the info associated with this node - //######################################## - - if (info.find(varphi) == info.end()) - { - x = new CNFInfo(); - info[varphi] = x; - } - else - { - x = info[varphi]; - } - - //######################################## - // step 2, need two hits because of term ITEs. - //######################################## - - if (sharesPos(*x) == 2) - { - return; - } - - //######################################## - // step 3, set appropriate data fields, always rename - // term ITEs - //######################################## - - incrementSharesPos(*x); - setIsTerm(*x); - - //######################################## - // step 4, recurse over children - //######################################## - - if (varphi.isAtom()) - { - return; - } - else if (varphi.isITE()) - { - scanFormula(varphi[0], true, false); - scanFormula(varphi[0], false, false); - scanTerm(varphi[1]); - scanTerm(varphi[2]); - } - else - { - for (unsigned int i = 0; i < varphi.GetChildren().size(); i++) - { - scanTerm(varphi[i]); - } - } - }//End of scanterm() - - //######################################## - //######################################## - // main cnf conversion function - - void CNFMgr::convertFormulaToCNF(const ASTNode& varphi, ClauseList* defs) - { - CNFInfo* x = info[varphi]; - - //######################################## - // divert to special case if term (word-level cnf) - - if (isTerm(*x)) - { - convertTermForCNF(varphi, defs); - setWasVisited(*x); - return; - } - - //######################################## - // do work - - if (sharesPos(*x) > 0 && !wasVisited(*x)) - { - convertFormulaToCNFPosCases(varphi, defs); - } - -#if defined CRYPTOMINISAT__2 - if ((x->clausespos != NULL - && (x->clausespos->size() > 1 - || (renameAllSiblings - && !(x->clausespos->size() == 1 && x->clausespos[0].size() ==1) - && !wasRenamedPos(*x))) - || (doRenamePos(*x) - && !wasVisited(*x)))) - { - if (doSibRenamingPos(*x) - || sharesPos(*x) > 1 - || doRenamePos(*x) - || renameAllSiblings) - { - doRenamingPos(varphi, defs); - } - } -#else - - - if (x->clausespos != NULL - && (x->clausespos->size() > 1 - || (renameAllSiblings - && !(x->clausespos->size() == 1 && x->clausespos[0].size() ==1) - && !wasRenamedNeg(*x)))) - { - if (doSibRenamingPos(*x) - || sharesPos(*x) > 1 - || renameAllSiblings) - { - doRenamingPos(varphi, defs); - } - } -#endif - - if (sharesNeg(*x) > 0 && !wasVisited(*x)) - { - convertFormulaToCNFNegCases(varphi, defs); - } - - if (x->clausesneg != NULL - && (x->clausesneg->size() > 1 - || (renameAllSiblings - && !(x->clausesneg->size() == 1 && x->clausesneg[0].size() ==1) - && !wasRenamedNeg(*x)))) - { - if (doSibRenamingNeg(*x) - || sharesNeg(*x) > 1 - || renameAllSiblings) - { - doRenamingNeg(varphi, defs); - } - } - - //######################################## - //mark that we've already done the hard work - - if(renameAllSiblings) - { - assert(info[varphi]->clausesneg == NULL - || info[varphi]->clausesneg->size() ==1); - - assert(info[varphi]->clausespos == NULL - || info[varphi]->clausespos->size() ==1); - } - - setWasVisited(*x); - } //End of convertFormulaToCNF() - - void CNFMgr::convertTermForCNF(const ASTNode& varphi, ClauseList* defs) - { - CNFInfo* x = info[varphi]; - - //######################################## - // step 1, done if we've already visited - //######################################## - - if (x->termforcnf != NULL) - { - return; - } - - //######################################## - // step 2, ITE's always get renamed - //######################################## - - if (varphi.isITE()) - { - x->termforcnf = doRenameITE(varphi, defs); - reduceMemoryFootprintPos(varphi[0]); - reduceMemoryFootprintNeg(varphi[0]); - - } - else if (varphi.isAtom()) - { - x->termforcnf = ASTNodeToASTNodePtr(varphi); - } - else - { - ASTVec psis; - ASTVec::const_iterator it = varphi.GetChildren().begin(); - for (; it != varphi.GetChildren().end(); it++) - { - convertTermForCNF(*it, defs); - psis.push_back(*(info[*it]->termforcnf)); - } - - ASTNode psi = bm->CreateNode(varphi.GetKind(), psis); - psi.SetValueWidth(varphi.GetValueWidth()); - psi.SetIndexWidth(varphi.GetIndexWidth()); - x->termforcnf = ASTNodeToASTNodePtr(psi); - } - } //End of convertTermForCNF() - - //######################################## - //######################################## - // functions for renaming nodes during cnf conversion - - ASTNode* CNFMgr::doRenameITE(const ASTNode& varphi, ClauseList* defs) - { - ASTNode psi; - - //######################################## - // step 1, old "RepLit" code - //######################################## - - ostringstream oss; - oss << "cnf" << "{" << varphi.GetNodeNum() << "}"; - psi = bm->CreateSymbol(oss.str().c_str(),varphi.GetIndexWidth(),varphi.GetValueWidth()); - - - //######################################## - // step 3, recurse over children - //######################################## - - convertFormulaToCNF(varphi[0], defs); - convertTermForCNF(varphi[1], defs); - ASTNode t1 = *(info[varphi[1]]->termforcnf); - convertTermForCNF(varphi[2], defs); - ASTNode t2 = *(info[varphi[2]]->termforcnf); - - //######################################## - // step 4, add def clauses - //######################################## - - ClauseList* cl1 = SINGLETON(bm->CreateNode(EQ, psi, t1)); - ClauseList* cl2 = ClauseList::PRODUCT(*(info[varphi[0]]->clausesneg), *cl1); - DELETE(cl1); - defs->insert(cl2); - - ClauseList* cl3 = SINGLETON(bm->CreateNode(EQ, psi, t2)); - ClauseList* cl4 = ClauseList::PRODUCT(*(info[varphi[0]]->clausespos), *cl3); - DELETE(cl3); - defs->insert(cl4); - - return ASTNodeToASTNodePtr(psi); - }//End of doRenameITE() - - void CNFMgr::doRenamingPos(const ASTNode& varphi, ClauseList* defs) - { - CNFInfo* x = info[varphi]; - - assert(!wasRenamedPos(*x)); - - //######################################## - // step 1, calc new variable - //######################################## - - ostringstream oss; - oss << "cnf" << "{" << varphi.GetNodeNum() << "}"; - ASTNode psi = bm->CreateSymbol(oss.str().c_str(),0,0); - - //######################################## - // step 2, add defs - //######################################## - - ASTNode* copy = ASTNodeToASTNodePtr(bm->CreateNode(NOT, psi)); - ClauseList* cl = info[varphi]->clausespos; - cl->appendToAllClauses(copy); - defs->insert(cl); - delete cl; - - //######################################## - // step 3, update info[varphi] - //######################################## - - x->clausespos = SINGLETON(psi); - setWasRenamedPos(*x); - }//End of doRenamingPos - - - void CNFMgr::doRenamingPosXor(const ASTNode& varphi) - { - CNFInfo* x = info[varphi]; - - //######################################## - // step 1, calc new variable - //######################################## - - ostringstream oss; - oss << "cnf" << "{" << varphi.GetNodeNum() << "}"; - ASTNode psi = bm->CreateSymbol(oss.str().c_str(),0,0); - - //######################################## - // step 2, add defs - //######################################## - - // ClauseList* cl1; - // cl1 = SINGLETON(bm->CreateNode(NOT, psi)); - // ClauseList* cl2 = PRODUCT(*(info[varphi]->clausespos), *cl1); - // defs->insert(defs->end(), cl2->begin(), cl2->end()); - // DELETE(info[varphi]->clausespos); - // DELETE(cl1); - // delete cl2; - - //######################################## - // step 3, update info[varphi] - //######################################## - - x->clausespos = SINGLETON(psi); - x->clausesneg = SINGLETON(bm->CreateNode(NOT, psi)); - setWasRenamedPos(*x); - }//End of doRenamingPos - -// void CNFMgr::doRenamingNegXor(const ASTNode& varphi) -// { -// CNFInfo* x = info[varphi]; - -// //######################################## -// // step 1, calc new variable -// //######################################## - -// ostringstream oss; -// oss << "cnf" << "{" << varphi.GetNodeNum() << "}"; -// ASTNode psi = bm->CreateSymbol(oss.str().c_str()); - -// //######################################## -// // step 2, add defs -// //######################################## - -// // ClauseList* cl1; -// // cl1 = SINGLETON(bm->CreateNode(NOT, psi)); -// // ClauseList* cl2 = PRODUCT(*(info[varphi]->clausespos), *cl1); -// // defs->insert(defs->end(), cl2->begin(), cl2->end()); -// // DELETE(info[varphi]->clausespos); -// // DELETE(cl1); -// // delete cl2; - -// //######################################## -// // step 3, update info[varphi] -// //######################################## - -// //x->clausesneg = SINGLETON(bm->CreateNode(NOT,psi)); -// x->clausespos = SINGLETON(bm->CreateNode(NOT,psi)); - -// setWasRenamedPos(*x); -// }//End of doRenamingPos - - void CNFMgr::doRenamingNeg(const ASTNode& varphi, ClauseList* defs) - { - CNFInfo* x = info[varphi]; - - //######################################## - // step 2, calc new variable - //######################################## - - ostringstream oss; - oss << "cnf" << "{" << varphi.GetNodeNum() << "}"; - ASTNode psi = bm->CreateSymbol(oss.str().c_str(),0,0); - - //######################################## - // step 3, add defs - //######################################## - - ASTNode* copy = ASTNodeToASTNodePtr(psi); - ClauseList* cl = info[varphi]->clausesneg; - cl->appendToAllClauses(copy); - defs->insert(cl); - delete cl; - - //######################################## - // step 4, update info[varphi] - //######################################## - - x->clausesneg = SINGLETON(bm->CreateNode(NOT, psi)); - setWasRenamedNeg(*x); - } //End of doRenamingNeg() - - //######################################## - //######################################## - //main switch for individual cnf conversion cases - - void CNFMgr::convertFormulaToCNFPosCases(const ASTNode& varphi, - ClauseList* defs) - { - if (varphi.isPred()) - { - convertFormulaToCNFPosPred(varphi, defs); - return; - } - - Kind k = varphi.GetKind(); - switch (k) - { - case FALSE: - { - convertFormulaToCNFPosFALSE(varphi, defs); - break; - } - case TRUE: - { - convertFormulaToCNFPosTRUE(varphi, defs); - break; - } - case BVGETBIT: - { - convertFormulaToCNFPosBVGETBIT(varphi, defs); - break; - } - case SYMBOL: - { - convertFormulaToCNFPosSYMBOL(varphi, defs); - break; - } - case NOT: - { - convertFormulaToCNFPosNOT(varphi, defs); - break; - } - case AND: - { - convertFormulaToCNFPosAND(varphi, defs); - break; - } - case NAND: - { - convertFormulaToCNFPosNAND(varphi, defs); - break; - } - case OR: - { - convertFormulaToCNFPosOR(varphi, defs); - break; - } - case NOR: - { - convertFormulaToCNFPosNOR(varphi, defs); - break; - } - case XOR: - { - convertFormulaToCNFPosXOR(varphi, defs); - break; - } - case IMPLIES: - { - convertFormulaToCNFPosIMPLIES(varphi, defs); - break; - } - case ITE: - { - convertFormulaToCNFPosITE(varphi, defs); - break; - } - default: - { - fprintf(stderr, "convertFormulaToCNFPosCases: "\ - "doesn't handle kind %d\n", k); - FatalError(""); - } - } - } //End of convertFormulaToCNFPosCases() - - void CNFMgr::convertFormulaToCNFNegCases(const ASTNode& varphi, - ClauseList* defs) - { - - if (varphi.isPred()) - { - convertFormulaToCNFNegPred(varphi, defs); - return; - } - - Kind k = varphi.GetKind(); - switch (k) - { - case FALSE: - { - convertFormulaToCNFNegFALSE(varphi, defs); - break; - } - case TRUE: - { - convertFormulaToCNFNegTRUE(varphi, defs); - break; - } - case BVGETBIT: - { - convertFormulaToCNFNegBVGETBIT(varphi, defs); - break; - } - case SYMBOL: - { - convertFormulaToCNFNegSYMBOL(varphi, defs); - break; - } - case NOT: - { - convertFormulaToCNFNegNOT(varphi, defs); - break; - } - case AND: - { - convertFormulaToCNFNegAND(varphi, defs); - break; - } - case NAND: - { - convertFormulaToCNFNegNAND(varphi, defs); - break; - } - case OR: - { - convertFormulaToCNFNegOR(varphi, defs); - break; - } - case NOR: - { - convertFormulaToCNFNegNOR(varphi, defs); - break; - } - case XOR: - { - convertFormulaToCNFNegXOR(varphi, defs); - break; - } - case IMPLIES: - { - convertFormulaToCNFNegIMPLIES(varphi, defs); - break; - } - case ITE: - { - convertFormulaToCNFNegITE(varphi, defs); - break; - } - default: - { - fprintf(stderr, "convertFormulaToCNFNegCases: "\ - "doesn't handle kind %d\n", k); - FatalError(""); - } - } - } //convertFormulaToCNFNegCases() - - //######################################## - //######################################## - // individual cnf conversion cases - - void CNFMgr::convertFormulaToCNFPosPred(const ASTNode& varphi, - ClauseList* defs) - { - ASTVec psis; - - ASTVec::const_iterator it = varphi.GetChildren().begin(); - for (; it != varphi.GetChildren().end(); it++) - { - convertTermForCNF(*it, defs); - psis.push_back(*(info[*it]->termforcnf)); - } - - info[varphi]->clausespos = - SINGLETON(bm->CreateNode(varphi.GetKind(), psis)); - } //End of convertFormulaToCNFPosPred() - - void CNFMgr::convertFormulaToCNFPosFALSE(const ASTNode& varphi, - ClauseList* defs) - { - ASTNode dummy_false_var = - bm->CreateNode(NOT, dummy_true_var); - info[varphi]->clausespos = SINGLETON(dummy_false_var); - } //End of convertFormulaToCNFPosFALSE() - - void CNFMgr::convertFormulaToCNFPosTRUE(const ASTNode& varphi, - ClauseList* defs) - { - info[varphi]->clausespos = SINGLETON(dummy_true_var); - } //End of convertFormulaToCNFPosTRUE - - void CNFMgr::convertFormulaToCNFPosBVGETBIT(const ASTNode& varphi, - ClauseList* defs) - { - info[varphi]->clausespos = SINGLETON(varphi); - }//End of convertFormulaToCNFPosBVGETBIT() - - void CNFMgr::convertFormulaToCNFPosSYMBOL(const ASTNode& varphi, - ClauseList* defs) - { - info[varphi]->clausespos = SINGLETON(varphi); - } //End of convertFormulaToCNFPosSYMBOL() - - void CNFMgr::convertFormulaToCNFPosNOT(const ASTNode& varphi, - ClauseList* defs) - { - convertFormulaToCNF(varphi[0], defs); - info[varphi]->clausespos = ClauseList::COPY(*(info[varphi[0]]->clausesneg)); - reduceMemoryFootprintNeg(varphi[0]); - } //End of convertFormulaToCNFPosNOT() - - void CNFMgr::convertFormulaToCNFPosAND(const ASTNode& varphi, - ClauseList* defs) { - //**************************************** - // (pos) AND ~> UNION - //**************************************** - - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - ClauseList* psi = ClauseList::COPY(*(info[*it]->clausespos)); - - for (it++; it != varphi.GetChildren().end(); it++) { - convertFormulaToCNF(*it, defs); - CNFInfo* x = info[*it]; - - if (sharesPos(*x) == 1) { - psi->insert(x->clausespos); - delete (x->clausespos); - x->clausespos = NULL; - if (x->clausesneg == NULL) { - delete x; - info.erase(*it); - } - } else { - ClauseList::INPLACE_UNION(psi, *(x->clausespos)); - reduceMemoryFootprintPos(*it); - } - } - if (renameAllSiblings) - { - assert(((unsigned)psi->size()) == varphi.GetChildren().size()); - } - - info[varphi]->clausespos = psi; - } //End of convertFormulaToCNFPosAND() - - void CNFMgr::convertFormulaToCNFPosNAND(const ASTNode& varphi, - ClauseList* defs) - { - bool renamesibs = false; - ClauseList* clauses; - ClauseList* psi; - ClauseList* oldpsi; - - //**************************************** - // (pos) NAND ~> PRODUCT NOT - //**************************************** - - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausesneg; - if (clauses->size() > 1) - { - renamesibs = true; - } - psi = ClauseList::COPY(*clauses); - reduceMemoryFootprintNeg(*it); - - for (it++; it != varphi.GetChildren().end(); it++) - { - if (renamesibs) - { - setDoSibRenamingNeg(*(info[*it])); - } - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausesneg; - if (clauses->size() > 1) - { - renamesibs = true; - } - oldpsi = psi; - psi = ClauseList::PRODUCT(*psi, *clauses); - reduceMemoryFootprintNeg(*it); - DELETE(oldpsi); - } - - info[varphi]->clausespos = psi; - } //End of convertFormulaToCNFPosNAND() - - void CNFMgr::convertFormulaToCNFPosOR(const ASTNode& varphi, - ClauseList* defs) - { - bool renamesibs = false; - ClauseList* clauses; - ClauseList* psi; - ClauseList* oldpsi; - - //**************************************** - // (pos) OR ~> PRODUCT - //**************************************** - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausespos; - if (clauses->size() > 1) - { - renamesibs = true; - } - psi = ClauseList::COPY(*clauses); - reduceMemoryFootprintPos(*it); - - for (it++; it != varphi.GetChildren().end(); it++) - { - if (renamesibs) - { - setDoSibRenamingPos(*(info[*it])); - } - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausespos; - if (clauses->size() > 1) - { - renamesibs = true; - } - oldpsi = psi; - psi = ClauseList::PRODUCT(*psi, *clauses); - reduceMemoryFootprintPos(*it); - DELETE(oldpsi); - } - - info[varphi]->clausespos = psi; - } //End of convertFormulaToCNFPosOR() - - void CNFMgr::convertFormulaToCNFPosNOR(const ASTNode& varphi, - ClauseList* defs) - { - //**************************************** - // (pos) NOR ~> UNION NOT - //**************************************** - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - ClauseList* psi = ClauseList::COPY(*(info[*it]->clausesneg)); - reduceMemoryFootprintNeg(*it); - for (it++; it != varphi.GetChildren().end(); it++) - { - convertFormulaToCNF(*it, defs); - ClauseList::INPLACE_UNION(psi, *(info[*it]->clausesneg)); - reduceMemoryFootprintNeg(*it); - } - - info[varphi]->clausespos = psi; - } //End of convertFormulaToCNFPosNOR() - - void CNFMgr::convertFormulaToCNFPosIMPLIES(const ASTNode& varphi, - ClauseList* defs) - { - //**************************************** - // (pos) IMPLIES ~> PRODUCT NOT [0] ; [1] - //**************************************** - CNFInfo* x0 = info[varphi[0]]; - CNFInfo* x1 = info[varphi[1]]; - convertFormulaToCNF(varphi[0], defs); - if (x0->clausesneg->size() > 1) - { - setDoSibRenamingPos(*x1); - } - convertFormulaToCNF(varphi[1], defs); - ClauseList* psi = ClauseList::PRODUCT(*(x0->clausesneg), *(x1->clausespos)); - reduceMemoryFootprintNeg(varphi[0]); - reduceMemoryFootprintPos(varphi[1]); - info[varphi]->clausespos = psi; - } //End of convertFormulaToCNFPosIMPLIES() - - void CNFMgr::convertFormulaToCNFPosITE(const ASTNode& varphi, - ClauseList* defs) - { - //**************************************** - // (pos) ITE ~> UNION (PRODUCT NOT [0] ; [1]) - // ; (PRODUCT [0] ; [2]) - //**************************************** - CNFInfo* x0 = info[varphi[0]]; - CNFInfo* x1 = info[varphi[1]]; - CNFInfo* x2 = info[varphi[2]]; - convertFormulaToCNF(varphi[0], defs); - if (x0->clausesneg->size() > 1) - { - setDoSibRenamingPos(*x1); - } - convertFormulaToCNF(varphi[1], defs); - if (x0->clausespos->size() > 1) - { - setDoSibRenamingPos(*x2); - } - convertFormulaToCNF(varphi[2], defs); - ClauseList* psi1 = ClauseList::PRODUCT(*(x0->clausesneg), *(x1->clausespos)); - ClauseList* psi2 = ClauseList::PRODUCT(*(x0->clausespos), *(x2->clausespos)); - ClauseList::NOCOPY_INPLACE_UNION(psi1, psi2); - reduceMemoryFootprintNeg(varphi[0]); - reduceMemoryFootprintPos(varphi[1]); - reduceMemoryFootprintPos(varphi[0]); - reduceMemoryFootprintPos(varphi[2]); - - info[varphi]->clausespos = psi1; - } //End of convertFormulaToCNFPosITE() - - void CNFMgr::convertFormulaToCNFPosXOR(const ASTNode& varphi, - ClauseList* defs) - { -#if defined CRYPTOMINISAT__2 - ASTVec::const_iterator it = varphi.GetChildren().begin(); - ClausePtr xor_clause = new vector(); - - for (; it != varphi.GetChildren().end(); it++) - { - convertFormulaToCNF(*it, defs); // make pos and neg clause set - - //Creating a new variable name for each of the children of the - //XOR node - //doRenamingPos(*it, defs); - doRenamingNeg(*it, defs); - xor_clause->insert(xor_clause->end(), - ((*(info[*it]->clausespos)).asList()->front())->begin(), - ((*(info[*it]->clausespos)).asList()->front())->end()); - if(renameAllSiblings) - { - assert(info[*it]->clausespos->size() ==1); - assert(info[*it]->clausesneg->size() ==1); - } - } - doRenamingPosXor(varphi); - //ClauseList* psi = convertFormulaToCNFPosXORAux(varphi, 0, defs); - //info[varphi]->clausespos = psi; - ASTNode varXorNode = GetNodeFrom_SINGLETON(info[varphi]->clausespos); - ASTNode NotVarXorNode = bm->CreateNode(NOT, varXorNode); - xor_clause->push_back(ASTNodeToASTNodePtr(NotVarXorNode)); - clausesxor->push_back(xor_clause); - - ASTVec::const_iterator it2 = varphi.GetChildren().begin(); - for (; it2 != varphi.GetChildren().end(); it2++){ - reduceMemoryFootprintPos(*it2); - reduceMemoryFootprintNeg(*it2); - } -#else - ASTVec::const_iterator it = varphi.GetChildren().begin(); - for (; it != varphi.GetChildren().end(); it++) - { - convertFormulaToCNF(*it, defs); // make pos and neg clause sets - if (renameAllSiblings) { - assert(info[*it]->clausespos->size() ==1); - assert(info[*it]->clausesneg->size() ==1); - } - } - ClauseList* psi = convertFormulaToCNFPosXORAux(varphi, 0, defs); - info[varphi]->clausespos = psi; - ASTVec::const_iterator it2 = varphi.GetChildren().begin(); - for (; it2 != varphi.GetChildren().end(); it2++){ - reduceMemoryFootprintPos(*it2); - reduceMemoryFootprintNeg(*it2); - } -#endif - } //End of convertFormulaToCNFPosXOR() - - ClauseList* CNFMgr::convertFormulaToCNFPosXORAux(const ASTNode& varphi, - unsigned int idx, - ClauseList* defs) - { - bool renamesibs; - ClauseList* psi; - ClauseList* psi1; - ClauseList* psi2; - - if (idx == varphi.GetChildren().size() - 2) - { - //**************************************** - // (pos) XOR ~> UNION (AND) - // (PRODUCT (OR) [idx] ; [idx+1]) - // ; (PRODUCT NOT [idx] ; NOT [idx+1]) - //**************************************** - renamesibs = - (info[varphi[idx]]->clausespos)->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingPos(*info[varphi[idx + 1]]); - } - renamesibs = - (info[varphi[idx]]->clausesneg)->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingNeg(*info[varphi[idx + 1]]); - } - - psi1 = - ClauseList::PRODUCT(*(info[varphi[idx]]->clausespos), - *(info[varphi[idx + 1]]->clausespos)); - psi2 = - ClauseList::PRODUCT(*(info[varphi[idx]]->clausesneg), - *(info[varphi[idx + 1]]->clausesneg)); - ClauseList::NOCOPY_INPLACE_UNION(psi1, psi2); - - psi = psi1; - } - else - { - //**************************************** - // (pos) XOR ~> UNION - // (PRODUCT [idx] ; XOR [idx+1..]) - // ; (PRODUCT NOT [idx] ; NOT XOR [idx+1..]) - //**************************************** - ClauseList* theta1; - theta1 = convertFormulaToCNFPosXORAux(varphi, idx + 1, defs); - renamesibs = theta1->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingPos(*info[varphi[idx]]); - } - ClauseList* theta2; - theta2 = convertFormulaToCNFNegXORAux(varphi, idx + 1, defs); - renamesibs = theta2->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingNeg(*info[varphi[idx]]); - } - - psi1 = ClauseList::PRODUCT(*(info[varphi[idx]]->clausespos), *theta1); - psi2 = ClauseList::PRODUCT(*(info[varphi[idx]]->clausesneg), *theta2); - DELETE(theta1); - DELETE(theta2); - ClauseList::NOCOPY_INPLACE_UNION(psi1, psi2); - - psi = psi1; - } - - return psi; - } //End of convertFormulaToCNFPosXORAux() - - void CNFMgr::convertFormulaToCNFNegPred(const ASTNode& varphi, - ClauseList* defs) - { - - ASTVec psis; - - ASTVec::const_iterator it = varphi.GetChildren().begin(); - for (; it != varphi.GetChildren().end(); it++) - { - convertFormulaToCNF(*it, defs); - psis.push_back(*(info[*it]->termforcnf)); - } - - info[varphi]->clausesneg = - SINGLETON(bm->CreateNode(NOT, - bm->CreateNode(varphi.GetKind(), psis))); - } //End of convertFormulaToCNFNegPred() - - void CNFMgr::convertFormulaToCNFNegFALSE(const ASTNode& varphi, - ClauseList* defs) - { - info[varphi]->clausesneg = SINGLETON(dummy_true_var); - } //End of convertFormulaToCNFNegFALSE() - - void CNFMgr::convertFormulaToCNFNegTRUE(const ASTNode& varphi, - ClauseList* defs) - { - ASTNode dummy_false_var = - bm->CreateNode(NOT, dummy_true_var); - info[varphi]->clausesneg = SINGLETON(dummy_false_var); - } //End of convertFormulaToCNFNegTRUE() - - void CNFMgr::convertFormulaToCNFNegBVGETBIT(const ASTNode& varphi, - ClauseList* defs) - { - ClauseList* psi = SINGLETON(bm->CreateNode(NOT, varphi)); - info[varphi]->clausesneg = psi; - } //End of convertFormulaToCNFNegBVGETBIT() - - void CNFMgr::convertFormulaToCNFNegSYMBOL(const ASTNode& varphi, - ClauseList* defs) - { - info[varphi]->clausesneg = SINGLETON(bm->CreateNode(NOT, varphi)); - } //End of convertFormulaToCNFNegSYMBOL() - - void CNFMgr::convertFormulaToCNFNegNOT(const ASTNode& varphi, - ClauseList* defs) - { - convertFormulaToCNF(varphi[0], defs); - info[varphi]->clausesneg = ClauseList::COPY(*(info[varphi[0]]->clausespos)); - reduceMemoryFootprintPos(varphi[0]); - } //End of convertFormulaToCNFNegNOT() - - void CNFMgr::convertFormulaToCNFNegAND(const ASTNode& varphi, - ClauseList* defs) - { - bool renamesibs = false; - ClauseList* clauses; - ClauseList* psi; - ClauseList* oldpsi; - - //**************************************** - // (neg) AND ~> PRODUCT NOT - //**************************************** - - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausesneg; - if (clauses->size() > 1) - { - renamesibs = true; - } - psi = ClauseList::COPY(*clauses); - reduceMemoryFootprintNeg(*it); - - for (it++; it != varphi.GetChildren().end(); it++) - { - if (renamesibs) - { - setDoSibRenamingNeg(*(info[*it])); - } - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausesneg; - if (clauses->size() > 1) - { - renamesibs = true; - } - - if (clauses->size() ==1) - psi->INPLACE_PRODUCT(*clauses); - else - { - oldpsi = psi; - psi = ClauseList::PRODUCT(*psi, *clauses); - DELETE(oldpsi); - } - reduceMemoryFootprintNeg(*it); - } - - info[varphi]->clausesneg = psi; - } //End of convertFormulaToCNFNegAND() - - void CNFMgr::convertFormulaToCNFNegNAND(const ASTNode& varphi, - ClauseList* defs) - { - //**************************************** - // (neg) NAND ~> UNION - //**************************************** - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - ClauseList* psi = ClauseList::COPY(*(info[*it]->clausespos)); - reduceMemoryFootprintPos(*it); - for (it++; it != varphi.GetChildren().end(); it++) - { - convertFormulaToCNF(*it, defs); - ClauseList::INPLACE_UNION(psi, *(info[*it]->clausespos)); - reduceMemoryFootprintPos(*it); - } - - info[varphi]->clausespos = psi; - } //End of convertFormulaToCNFNegNAND() - - void CNFMgr::convertFormulaToCNFNegOR(const ASTNode& varphi, - ClauseList* defs) - { - //**************************************** - // (neg) OR ~> UNION NOT - //**************************************** - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - ClauseList* psi = ClauseList::COPY(*(info[*it]->clausesneg)); - reduceMemoryFootprintNeg(*it); - for (it++; it != varphi.GetChildren().end(); it++) { - convertFormulaToCNF(*it, defs); - CNFInfo* x = info[*it]; - - if (sharesNeg(*x) != 1) { - ClauseList::INPLACE_UNION(psi, *(x->clausesneg)); - reduceMemoryFootprintNeg(*it); - } else { - // If this is the only use of "clausesneg", no reason to make a copy. - psi->insert(x->clausesneg); - // Copied from reduceMemoryFootprintNeg - delete x->clausesneg; - x->clausesneg = NULL; - if (x->clausespos == NULL) { - delete x; - info.erase(*it); - } - } - - } - - info[varphi]->clausesneg = psi; - } //End of convertFormulaToCNFNegOR() - - void CNFMgr::convertFormulaToCNFNegNOR(const ASTNode& varphi, - ClauseList* defs) - { - bool renamesibs = false; - ClauseList* clauses; - ClauseList* psi; - ClauseList* oldpsi; - - //**************************************** - // (neg) NOR ~> PRODUCT - //**************************************** - ASTVec::const_iterator it = varphi.GetChildren().begin(); - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausespos; - if (clauses->size() > 1) - { - renamesibs = true; - } - psi = ClauseList::COPY(*clauses); - reduceMemoryFootprintPos(*it); - - for (it++; it != varphi.GetChildren().end(); it++) - { - if (renamesibs) - { - setDoSibRenamingPos(*(info[*it])); - } - convertFormulaToCNF(*it, defs); - clauses = info[*it]->clausespos; - if (clauses->size() > 1) - { - renamesibs = true; - } - oldpsi = psi; - psi = ClauseList::PRODUCT(*psi, *clauses); - reduceMemoryFootprintPos(*it); - DELETE(oldpsi); - } - - info[varphi]->clausesneg = psi; - } //End of convertFormulaToCNFNegNOR() - - void CNFMgr::convertFormulaToCNFNegIMPLIES(const ASTNode& varphi, - ClauseList* defs) - { - //**************************************** - // (neg) IMPLIES ~> UNION [0] ; NOT [1] - //**************************************** - CNFInfo* x0 = info[varphi[0]]; - CNFInfo* x1 = info[varphi[1]]; - convertFormulaToCNF(varphi[0], defs); - convertFormulaToCNF(varphi[1], defs); - ClauseList* psi = ClauseList::UNION(*(x0->clausespos), *(x1->clausesneg)); - info[varphi]->clausesneg = psi; - reduceMemoryFootprintPos(varphi[0]); - reduceMemoryFootprintNeg(varphi[1]); - } //End of convertFormulaToCNFNegIMPLIES() - - void CNFMgr::convertFormulaToCNFNegITE(const ASTNode& varphi, - ClauseList* defs) - { - //**************************************** - // (neg) ITE ~> UNION (PRODUCT NOT [0] ; NOT [1]) - // ; (PRODUCT [0] ; NOT [2]) - //**************************************** - CNFInfo* x0 = info[varphi[0]]; - CNFInfo* x1 = info[varphi[1]]; - CNFInfo* x2 = info[varphi[2]]; - convertFormulaToCNF(varphi[0], defs); - if (x0->clausesneg->size() > 1) - { - setDoSibRenamingNeg(*x1); - } - convertFormulaToCNF(varphi[1], defs); - if (x0->clausespos->size() > 1) - { - setDoSibRenamingNeg(*x2); - } - convertFormulaToCNF(varphi[2], defs); - ClauseList* psi1 = ClauseList::PRODUCT(*(x0->clausesneg), *(x1->clausesneg)); - ClauseList* psi2 = ClauseList::PRODUCT(*(x0->clausespos), *(x2->clausesneg)); - ClauseList::NOCOPY_INPLACE_UNION(psi1, psi2); - reduceMemoryFootprintNeg(varphi[0]); - reduceMemoryFootprintNeg(varphi[1]); - reduceMemoryFootprintPos(varphi[0]); - reduceMemoryFootprintNeg(varphi[2]); - - info[varphi]->clausesneg = psi1; - } //End of convertFormulaToCNFNegITE() - - void CNFMgr::convertFormulaToCNFNegXOR(const ASTNode& varphi, - ClauseList* defs) - { - //#ifdef FALSE -#if defined CRYPTOMINISAT__2 - CNFInfo * xx = info[varphi]; - if(NULL != xx - && sharesPos(*xx) > 0 - && sharesNeg(*xx) > 0) - { - return; - } - - ASTVec::const_iterator it = varphi.GetChildren().begin(); - ClausePtr xor_clause = new vector(); - - for (; it != varphi.GetChildren().end(); it++) - { - convertFormulaToCNF(*it, defs); // make pos and neg clause set - - //Creating a new variable name for each of the children of the - //XOR node doRenamingPos(*it, defs); - //doRenamingPos(*it, defs); - doRenamingNeg(*it, defs); - - xor_clause->insert(xor_clause->end(), - ((*(info[*it]->clausespos)).asList()->front())->begin(), - ((*(info[*it]->clausespos)).asList()->front())->end()); - } - doRenamingPosXor(varphi); - //ClauseList* psi = convertFormulaToCNFPosXORAux(varphi, 0, defs); - //info[varphi]->clausespos = psi; - ASTNode varXorNode = GetNodeFrom_SINGLETON(info[varphi]->clausespos); - ASTNode NotVarXorNode = bm->CreateNode(NOT, varXorNode); - xor_clause->push_back(ASTNodeToASTNodePtr(NotVarXorNode)); - clausesxor->push_back(xor_clause); - - ASTVec::const_iterator it2 = varphi.GetChildren().begin(); - for (; it2 != varphi.GetChildren().end(); it2++){ - reduceMemoryFootprintPos(*it2); - reduceMemoryFootprintNeg(*it2); - } -#else - ASTVec::const_iterator it = varphi.GetChildren().begin(); - for (; it != varphi.GetChildren().end(); it++) - { - convertFormulaToCNF(*it, defs); // make pos and neg clause sets - } - ClauseList* psi = convertFormulaToCNFNegXORAux(varphi, 0, defs); - info[varphi]->clausesneg = psi; - ASTVec::const_iterator it2 = varphi.GetChildren().begin(); - for (; it2 != varphi.GetChildren().end(); it2++){ - reduceMemoryFootprintPos(*it2); - reduceMemoryFootprintNeg(*it2); - } -#endif - } //End of convertFormulaToCNFNegXOR() - - ClauseList* CNFMgr::convertFormulaToCNFNegXORAux(const ASTNode& varphi, - unsigned int idx, - ClauseList* defs) - { - bool renamesibs; - ClauseList* psi; - ClauseList* psi1; - ClauseList* psi2; - - if (idx == varphi.GetChildren().size() - 2) - { - - //**************************************** - // (neg) XOR ~> UNION - // (PRODUCT NOT [idx] ; [idx+1]) - // ; (PRODUCT [idx] ; NOT [idx+1]) - //**************************************** - convertFormulaToCNF(varphi[idx], defs); - renamesibs = - (info[varphi[idx]]->clausesneg)->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingPos(*info[varphi[idx + 1]]); - } - - convertFormulaToCNF(varphi[idx], defs); - renamesibs = - (info[varphi[idx]]->clausespos)->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingNeg(*info[varphi[idx + 1]]); - } - - psi1 = - ClauseList::PRODUCT(*(info[varphi[idx]]->clausesneg), - *(info[varphi[idx + 1]]->clausespos)); - psi2 = - ClauseList::PRODUCT(*(info[varphi[idx]]->clausespos), - *(info[varphi[idx + 1]]->clausesneg)); - ClauseList::NOCOPY_INPLACE_UNION(psi1, psi2); - - psi = psi1; - } - else - { - //**************************************** - // (neg) XOR ~> UNION - // (PRODUCT NOT [idx] ; XOR [idx+1..]) - // ; (PRODUCT [idx] ; NOT XOR [idx+1..]) - //**************************************** - ClauseList* theta1; - theta1 = convertFormulaToCNFPosXORAux(varphi, idx + 1, defs); - renamesibs = theta1->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingNeg(*info[varphi[idx]]); - } - convertFormulaToCNF(varphi[idx], defs); - - ClauseList* theta2; - theta2 = convertFormulaToCNFNegXORAux(varphi, idx + 1, defs); - renamesibs = theta2->size() > 1 ? true : false; - if (renamesibs) - { - setDoSibRenamingPos(*info[varphi[idx]]); - } - - psi1 = ClauseList::PRODUCT(*(info[varphi[idx]]->clausesneg), *theta1); - psi2 = ClauseList::PRODUCT(*(info[varphi[idx]]->clausespos), *theta2); - DELETE(theta1); - DELETE(theta2); - ClauseList::NOCOPY_INPLACE_UNION(psi1, psi2); - - psi = psi1; - } - - return psi; - } //End of convertFormulaToCNFNegXORAux() - - //######################################## - //######################################## - // utilities for reclaiming memory. - - void CNFMgr::reduceMemoryFootprintPos(const ASTNode& varphi) - { - CNFInfo* x = info[varphi]; - if (sharesPos(*x) == 1) - { - DELETE(x->clausespos); - x->clausespos = NULL; - if (x->clausesneg == NULL) - { - delete x; - info.erase(varphi); - } - } - } //End of reduceMemoryFootprintPos() - - void CNFMgr::reduceMemoryFootprintNeg(const ASTNode& varphi) - { - CNFInfo* x = info[varphi]; - if (sharesNeg(*x) == 1) - { - DELETE(x->clausesneg); - x->clausesneg = NULL; - if (x->clausespos == NULL) - { - delete x; - info.erase(varphi); - } - } - } //End of reduceMemoryFootprintNeg() - - //######################################## - //######################################## - - ASTNode* CNFMgr::ASTNodeToASTNodePtr(const ASTNode& varphi) - { - ASTNode* psi; - - if (store.find(varphi) != store.end()) - { - psi = store[varphi]; - } - else - { - psi = new ASTNode(varphi); - store[varphi] = psi; - } - - return psi; - } //End of ASTNodeToASTNodePtr() - - //######################################## - //######################################## - - void CNFMgr::cleanup(const ASTNode& varphi) - { - delete info[varphi]->clausespos; - CNFInfo* toDelete = info[varphi]; // get the thing to delete. - info.erase(varphi); // remove it from the hashtable - delete toDelete; - - - ASTNodeToCNFInfoMap::const_iterator it1 = info.begin(); - for (; it1 != info.end(); it1++) - { - CNFInfo* x = it1->second; - if (x->clausespos != NULL) - { - DELETE(x->clausespos); - } - if (x->clausesneg != NULL) - { - if (!isTerm(*x)) - { - DELETE(x->clausesneg); - } - } - delete x; - } - - info.clear(); - } //End of cleanup() - - //######################################## - //######################################## - // constructor - - CNFMgr::CNFMgr(STPMgr *bmgr) - { - bm = bmgr; - clausesxor = new ClauseList(); - renameAllSiblings = bm->UserFlags.renameAllInCNF_flag; - dummy_true_var = bmgr->CreateFreshVariable(0,0,"*TrueDummy*"); - } - - //######################################## - //######################################## - // destructor - CNFMgr::~CNFMgr() - { - ASTNodeToASTNodePtrMap::const_iterator it1 = store.begin(); - for (; it1 != store.end(); it1++) - { - delete it1->second; - } - store.clear(); - } - - //######################################## - //######################################## - // top-level conversion function - - ClauseList* CNFMgr::convertToCNF(const ASTNode& varphi) - { - bm->GetRunTimes()->start(RunTimes::CNFConversion); - scanFormula(varphi, true, false); - ClauseList* defs = SINGLETON(dummy_true_var); - convertFormulaToCNF(varphi, defs); - ClauseList* top = info[varphi]->clausespos; - defs->insertAtFront(top); - - cleanup(varphi); - bm->GetRunTimes()->stop(RunTimes::CNFConversion); - if (bm->UserFlags.stats_flag) - { - cerr << "\nPrinting: After CNF conversion: " << endl; - cerr << "Number of clauses:" << defs->size() << endl; -// PrintClauseList(cout, *defs); - cerr << "Number of xor-clauses:" << clausesxor->size() << endl; -// PrintClauseList(cout, *clausesxor); - } - - return defs; - }//End of convertToCNF() - - //All XOR clauses are stored here. Return it after CNF translation - ClauseList* CNFMgr::ReturnXorClauses(void) - { - return clausesxor; - } - - // - void CNFMgr::DELETE(ClauseList* varphi) - { - varphi->deleteJustVectors(); - delete varphi; - varphi = NULL; - } //End of DELETE() - - - /* - void CNFMgr::PrintClauseList(ostream& os, ClauseList& cll) - { - int num_clauses = cll.size(); - os << "Clauses: " - << endl - << "=========================================" << endl; - for (int i = 0; i < num_clauses; i++) - { - os << "Clause " - << i << endl - << "-------------------------------------------" << endl; - LispPrintVecSpecial(os, *cll[i], 0); - os << endl - << "-------------------------------------------" << endl; - } - } //end of PrintClauseList() - */ -} // end namespace BEEV diff --git a/src/vendor/stp/src/to-sat/ASTNode/ToCNF.h b/src/vendor/stp/src/to-sat/ASTNode/ToCNF.h deleted file mode 100644 index 725af4541..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/ToCNF.h +++ /dev/null @@ -1,270 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef TOCNF_H -#define TOCNF_H - -#include -#include -#include "../../AST/AST.h" -#include "../../STPManager/STPManager.h" -#include "ClauseList.h" -#include "../../boost/noncopyable.hpp" - -namespace BEEV -{ - class CNFMgr : boost::noncopyable - { - private: - - // Setting this to true changes the behaviour of when new - // Tseitin variables are created. Normally a Tseitin - // variable is created only if: (the number of clauses is - // >1) && (renaming of the node is enabled || the node is - // shared). When this is set, every node is replaced by a - // new tseitin variable. - bool renameAllSiblings; - - //######################################## - //######################################## - // data types - - // for the meaning of control bits, see "utilities for contol - // bits". - struct CNFInfo - { - int control; - ClauseList* clausespos; - union - { - ClauseList* clausesneg; - ASTNode* termforcnf; - }; - - CNFInfo() - { - control = 0; - clausespos = NULL; - clausesneg = NULL; - } - } ; - - //Collect all XOR Clauses here - ClauseList* clausesxor; - - typedef HASHMAP< - ASTNode, - CNFInfo*, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeToCNFInfoMap; - - typedef HASHMAP< - ASTNode, - ASTNode*, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeToASTNodePtrMap; - - //######################################## - //######################################## - // this is the data - - STPMgr *bm; - ASTNodeToCNFInfoMap info; - ASTNodeToASTNodePtrMap store; - - //######################################## - //######################################## - // utility predicates - - bool onChildDoPos(const ASTNode& varphi, unsigned int idx); - - bool onChildDoNeg(const ASTNode& varphi, unsigned int idx); - - - //######################################## - //######################################## - //utilities for control bits. - - void initializeCNFInfo(CNFInfo& x); - - void incrementSharesPos(CNFInfo& x); - - int sharesPos(CNFInfo& x); - - void incrementSharesNeg(CNFInfo& x); - - int sharesNeg(CNFInfo& x); - - void setControlBit(CNFInfo& x, unsigned int idx); - - bool getControlBit(CNFInfo& x, unsigned int idx); - - void setIsTerm(CNFInfo& x); - - bool isTerm(CNFInfo& x); - - void setDoRenamePos(CNFInfo& x); - - bool doRenamePos(CNFInfo& x); - - void setWasRenamedPos(CNFInfo& x); - - bool wasRenamedPos(CNFInfo& x); - - void setDoRenameNeg(CNFInfo& x); - - bool doRenameNeg(CNFInfo& x); - - void setWasRenamedNeg(CNFInfo& x); - - bool wasRenamedNeg(CNFInfo& x); - - void setDoSibRenamingPos(CNFInfo& x); - - bool doSibRenamingPos(CNFInfo& x); - - void setDoSibRenamingNeg(CNFInfo& x); - - bool doSibRenamingNeg(CNFInfo& x); - - void setWasVisited(CNFInfo& x); - - bool wasVisited(CNFInfo& x); - - //######################################## - //######################################## - //utilities for clause sets - - - ClauseList* SINGLETON(const ASTNode& varphi); - - //######################################## - //######################################## - //prep. for cnf conversion - - void scanFormula(const ASTNode& varphi, bool isPos, bool isXorChild); - - void scanTerm(const ASTNode& varphi); - - //######################################## - //######################################## - // main cnf conversion function - - void convertFormulaToCNF(const ASTNode& varphi, ClauseList* defs); - - void convertTermForCNF(const ASTNode& varphi, ClauseList* defs); - - //######################################## - //######################################## - // functions for renaming nodes during cnf conversion - - ASTNode* doRenameITE(const ASTNode& varphi, ClauseList* defs); - - void doRenamingPos(const ASTNode& varphi, ClauseList* defs); - - void doRenamingPosXor(const ASTNode& varphi); - - void doRenamingNegXor(const ASTNode& varphi); - - void doRenamingNeg(const ASTNode& varphi, ClauseList* defs); - - //######################################## - //######################################## - //main switch for individual cnf conversion cases - - void convertFormulaToCNFPosCases(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegCases(const ASTNode& varphi, ClauseList* defs); - - //######################################## - //######################################## - // individual cnf conversion cases - - void convertFormulaToCNFPosPred(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosFALSE(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosTRUE(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosBVGETBIT(const ASTNode& varphi, - ClauseList* defs); - void convertFormulaToCNFPosSYMBOL(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosNOT(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosAND(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosNAND(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosOR(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosNOR(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosIMPLIES(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosITE(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFPosXOR(const ASTNode& varphi, ClauseList* defs); - ClauseList* convertFormulaToCNFPosXORAux(const ASTNode& varphi, - unsigned int idx, - ClauseList* defs); - void convertFormulaToCNFNegPred(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegFALSE(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegTRUE(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegBVGETBIT(const ASTNode& varphi, - ClauseList* defs); - void convertFormulaToCNFNegSYMBOL(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegNOT(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegAND(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegNAND(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegOR(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegNOR(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegIMPLIES(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegITE(const ASTNode& varphi, ClauseList* defs); - void convertFormulaToCNFNegXOR(const ASTNode& varphi, ClauseList* defs); - ClauseList* convertFormulaToCNFNegXORAux(const ASTNode& varphi, - unsigned int idx, - ClauseList* defs); - - //######################################## - //######################################## - // utilities for reclaiming memory. - - void reduceMemoryFootprintPos(const ASTNode& varphi); - void reduceMemoryFootprintNeg(const ASTNode& varphi); - - //######################################## - //######################################## - - ASTNode* ASTNodeToASTNodePtr(const ASTNode& varphi); - - //######################################## - //######################################## - - void cleanup(const ASTNode& varphi); - - ASTNode dummy_true_var; - - public: - - //######################################## - //######################################## - // constructor - CNFMgr(STPMgr *bmgr); - - //######################################## - //######################################## - // destructor - ~CNFMgr(); - - //######################################## - //######################################## - // top-level conversion function - - ClauseList* convertToCNF(const ASTNode& varphi); - - ClauseList* ReturnXorClauses(void); - - // Destructors that need to be explicitly called...(yuck). - // One deletes the thing passed into it. - - static void DELETE(ClauseList* varphi); - - //void PrintClauseList(ostream& os, ClauseList& cll); - }; // end of CNFMgr class -};//end of namespace -#endif diff --git a/src/vendor/stp/src/to-sat/ASTNode/ToSAT.cpp b/src/vendor/stp/src/to-sat/ASTNode/ToSAT.cpp deleted file mode 100644 index 7ea4b40b8..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/ToSAT.cpp +++ /dev/null @@ -1,552 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -#include "ToSAT.h" -#include "../BitBlaster.h" -#include "../../printer/printers.h" -#include -#include -#include "BBNodeManagerASTNode.h" -#include "../../STPManager/UserDefinedFlags.h" - -namespace BEEV -{ - - bool isTseitinVariable(const ASTNode& n) { - if (n.GetKind() == SYMBOL && n.GetType() == BOOLEAN_TYPE) { - const char * zz = n.GetName(); - if (0 == strncmp("cnf", zz, 3)) - { - return true; - } - } - return false; - } - - /* FUNCTION: lookup or create a new MINISAT literal - * lookup or create new MINISAT Vars from the global MAP - * _ASTNode_to_SATVar. - */ - - SATSolver::Var - ToSAT::LookupOrCreateSATVar(SATSolver& newSolver, const ASTNode& n) - { - ASTtoSATMap::iterator it; - SATSolver::Var v; - - //look for the symbol in the global map from ASTNodes to ints. if - //not found, create a S.newVar(), else use the existing one. - if ((it = _ASTNode_to_SATVar_Map.find(n)) == _ASTNode_to_SATVar_Map.end()) - { - v = newSolver.newVar(); - _ASTNode_to_SATVar_Map[n] = v; - - //ASSUMPTION: I am assuming that the newSolver.newVar() call increments v - //by 1 each time it is called, and the initial value of a - //SATSolver::Var is 0. - - // Copies the symbol into the map that is used to build the counter example. - // For boolean we create a vector of size 1. - if (n.GetKind() == BVGETBIT && n[0].GetKind() == SYMBOL || (n.GetKind() == SYMBOL && !isTseitinVariable(n))) - { - const ASTNode& symbol = n.GetKind() == BVGETBIT ? n[0] : n; - const unsigned index = n.GetKind() == BVGETBIT ? n[1].GetUnsignedConst() : 0; - const unsigned width = n.GetKind() == BVGETBIT ? symbol.GetValueWidth(): 1; - - if (SATVar_to_SymbolIndex.find(symbol) == SATVar_to_SymbolIndex.end()) - { - // In the SAT solver these are signed... - vector vec(width,~((unsigned)0)); - SATVar_to_SymbolIndex.insert(make_pair(symbol, vec)); - } - assert(index < width); - assert(SATVar_to_SymbolIndex[symbol].size() > index); - - SATVar_to_SymbolIndex[symbol][index] = v; - } - - // experimental. Don't add Tseitin variables as decision variables. - //if (!bm->UserFlags.tseitin_are_decision_variables_flag && isTseitinVariable(n)) - //{ -// newSolver.setDecisionVar(v,false); - // } - - } - else - v = it->second; - return v; - } - - /* FUNCTION: convert ASTClauses to MINISAT clauses and solve. - * Accepts ASTClauses and converts them to MINISAT clauses. Then - * adds the newly minted MINISAT clauses to the local SAT instance, - * and calls solve(). If solve returns unsat, then stop and return - * unsat. else continue. - */ - bool ToSAT::toSATandSolve(SATSolver& newSolver, - ClauseList& cll, - bool final, - CNFMgr*& cm, - bool add_xor_clauses, - bool enable_clausal_abstraction) - { - CountersAndStats("SAT Solver", bm); - bm->GetRunTimes()->start(RunTimes::SendingToSAT); - - int input_clauselist_size = cll.size(); - if (cll.size() == 0) - { - FatalError("toSATandSolve: Nothing to Solve", ASTUndefined); - } - - if(bm->UserFlags.random_seed_flag) - { - newSolver.setSeed(bm->UserFlags.random_seed); - } - - ClauseContainer& cc = *cll.asList(); - //Clause for the SATSolver - SATSolver::vec_literals satSolverClause; - - //iterate through the list (conjunction) of ASTclauses cll - ClauseContainer::const_iterator i = cc.begin(), iend = cc.end(); - for (int count=0, flag=0; i != iend; i++) - { - satSolverClause.clear(); - vector::const_iterator j = (*i)->begin(); - vector::const_iterator jend = (*i)->end(); - //ASTVec clauseVec; - //j is a disjunct in the ASTclause (*i) - for (; j != jend; j++) - { - ASTNode node = **j; - //clauseVec.push_back(node); - bool negate = (NOT == node.GetKind()) ? true : false; - ASTNode n = negate ? node[0] : node; - SATSolver::Var v = LookupOrCreateSATVar(newSolver, n); - Minisat::Lit l = SATSolver::mkLit(v, negate); - satSolverClause.push(l); - } - - // ASTNode theClause = bm->CreateNode(OR, clauseVec); - // if(flag - // && ASTTrue == CheckBBandCNF(newSolver, theClause)) - // { - // continue; - // } -#if defined CRYPTOMINISAT__2 - if(add_xor_clauses) - { - newSolver.addXorClause(satSolverClause, false); - } - else - { - newSolver.addClause(satSolverClause); - } -#else - newSolver.addClause(satSolverClause); -#endif - -#if defined CRYPTOMINISAT__2 - newSolver.findNormalXors = false; - newSolver.doSubsumption = true; - newSolver.verbosity = 0; - //newSolver.fixRestartType = static_restart; - newSolver.doPartHandler = true; -#endif - -// if(enable_clausal_abstraction && -// count++ >= input_clauselist_size*CLAUSAL_ABSTRACTION_CUTOFF) -// { -// //Arbitrary adding only x% of the clauses in the hopes of -// //terminating early -// // cout << "Percentage clauses added: " -// // << percentage << endl; -// bm->GetRunTimes()->stop(RunTimes::SendingToSAT); -// bm->GetRunTimes()->start(RunTimes::Solving); -// newSolver.solve(); -// bm->GetRunTimes()->stop(RunTimes::Solving); -// if(!newSolver.okay()) -// { -// return false; -// } -// count = 0; -// flag = 1; -// bm->GetRunTimes()->start(RunTimes::SendingToSAT); -// } - - if (newSolver.okay()) - { - continue; - } - else - { - if(bm->UserFlags.stats_flag) - newSolver.printStats(); - bm->GetRunTimes()->stop(RunTimes::SendingToSAT); - cll.deleteJustVectors(); - return false; - } - } // End of For-loop adding the clauses - - // output a CNF - // Because we use the SAT solver incrementally, this may ouput little pieces of the - // CNF that need to be joined together. Nicer would be to read it out of the solver each time. - if (bm->UserFlags.output_CNF_flag && true) - { - ofstream file; - stringstream fileName; - fileName << "output_" << CNFFileNameCounter++ << ".cnf"; - file.open(fileName.str().c_str()); - - file << "p cnf " << newSolver.nVars() << " " << cll.size() << endl; - i = cc.begin(), iend = cc.end(); - for (; i != iend; i++) - { - vector::iterator j = (*i)->begin(), jend = - (*i)->end(); - for (; j != jend; j++) - { - const ASTNode& node = *(*j); - bool negate = (NOT == node.GetKind()) ? true : false; - ASTNode n = negate ? node[0] : node; - - ASTtoSATMap::iterator it = _ASTNode_to_SATVar_Map.find(n); - assert(it != _ASTNode_to_SATVar_Map.end()); - - SATSolver::Var v = it->second; - - if (negate) - file << "-" << (v + 1) << " "; - else - file << (v + 1) << " "; - } - file << "0" << endl; - } - file.close(); - - } - - // Free the clause list before SAT solving. - cll.deleteJustVectors(); - - // Remove references to Tseitin variables. - // Delete the cnf generator. - if (final) - { - ASTVec toDelete; - - ASTtoSATMap::const_iterator it =_ASTNode_to_SATVar_Map.begin(); - for (;it!=_ASTNode_to_SATVar_Map.end();it++) - { - ASTNode n = it->first; - if (!n.IsNull() && isTseitinVariable(n)) - toDelete.push_back(n); - } - - for (ASTVec::iterator it = toDelete.begin(); it!= toDelete.end();it++) - _ASTNode_to_SATVar_Map.erase(*it); - - delete cm; - cm = NULL; - } - - - bm->GetRunTimes()->stop(RunTimes::SendingToSAT); - bm->GetRunTimes()->start(RunTimes::Solving); - - newSolver.solve(); - bm->GetRunTimes()->stop(RunTimes::Solving); - if(bm->UserFlags.stats_flag) - newSolver.printStats(); - if (newSolver.okay()) - return true; - else - return false; - } //end of toSATandSolve() - - //Bucketize clauses into buckets of size 1,2,...CLAUSAL_BUCKET_LIMIT - ClauseBuckets * ToSAT::Sort_ClauseList_IntoBuckets(ClauseList * cl, int clause_bucket_size) - { - ClauseBuckets * cb = new ClauseBuckets(); - ClauseContainer* cc = cl->asList(); - - //Sort the clauses, and bucketize by the size of the clauses - for(ClauseContainer::iterator it = cc->begin(), itend = cc->end(); - it!=itend; it++) - { - ClausePtr cptr = *it; - int cl_size = cptr->size(); - if(cl_size >= clause_bucket_size) - { - cl_size = clause_bucket_size; - } - - //If no clauses of size cl_size have been seen, then create a - //bucket for that size - if(cb->find(cl_size) == cb->end()) - { - ClauseList * cllist = new ClauseList(); - cllist->push_back(cptr); - (*cb)[cl_size] = cllist; - } - else - { - ClauseList * cllist = (*cb)[cl_size]; - cllist->push_back(cptr); - } - } - - return cb; - } //End of SortClauseList_IntoBuckets() - - bool ToSAT::CallSAT_On_ClauseBuckets(SATSolver& SatSolver, - ClauseBuckets * cb, CNFMgr*& cm) - { - ClauseBuckets::iterator it = cb->begin(); - ClauseBuckets::iterator itend = cb->end(); - - bool sat = false; - for(int count=1;it!=itend;it++, count++) - { - ClauseList *cl = (*it).second; - sat = toSATandSolve(SatSolver,*cl, count==cb->size(),cm); - - if(!sat) - { - return sat; - } - } - return sat; - } - - - - //Call the SAT solver, and check the result before returning. This - //can return one of 3 values, SOLVER_VALID, SOLVER_INVALID or - //SOLVER_UNDECIDED - bool ToSAT::CallSAT(SATSolver& SatSolver, - const ASTNode& input, bool refinement) - { - bm->GetRunTimes()->start(RunTimes::BitBlasting); - - ASTNode BBFormula; - { - BBNodeManagerASTNode nm(bm); - Simplifier simp(bm); - BitBlaster BB(&nm,&simp, bm->defaultNodeFactory,&bm->UserFlags); - BBFormula = BB.BBForm(input); - } - - bm->ASTNodeStats("after bitblasting: ", BBFormula); - bm->GetRunTimes()->stop(RunTimes::BitBlasting); - - if (bm->UserFlags.output_bench_flag) - { - ofstream file; - stringstream fileName; - fileName << "output_" << benchFileNameCounter++ << ".bench"; - file.open(fileName.str().c_str()); - printer::Bench_Print(file,BBFormula); - file.close(); - } - - // I suspect that we can't use clause buckets with the simplifying solvers - // (simplifying minisat & Cryptominsat). - // Because sometimes simplifying removes a variable that later clauses depend on. - // But when I set the clause_bucket_size to 1 for the other solvers, errors down. - int clause_bucket_size; - if (bm->UserFlags.solver_to_use == UserDefinedFlags::MINISAT_SOLVER) - clause_bucket_size=3; - else - clause_bucket_size=3; - - // The CNFMgr is deleted inside the CallSAT_On_ClauseBuckets, - // just before the final call to the SAT solver. - - CNFMgr* cm = new CNFMgr(bm); - ClauseList* cl = cm->convertToCNF(BBFormula); - ClauseList* xorcl = cm->ReturnXorClauses(); - - ClauseBuckets * cb = Sort_ClauseList_IntoBuckets(cl,clause_bucket_size); - cl->asList()->clear(); // clause buckets now point to the clauses. - delete cl; - bool sat = CallSAT_On_ClauseBuckets(SatSolver, cb, cm); - - for (ClauseBuckets::iterator it = cb->begin(); it != cb->end(); it++) - delete it->second; - delete cb; - - if(!sat) - { - xorcl->deleteJustVectors(); - delete xorcl; - if (NULL != cm) - delete cm; - return sat; - } - -#if defined CRYPTOMINISAT__2 - if(!xorcl->asList()->empty()) - { - sat = toSATandSolve(SatSolver, *xorcl, true, cm, true,false); - } -#endif - - delete xorcl; - if (NULL != cm) - delete cm; - return sat; - } - - //################################################## - //################################################## - - /******************************************************************* - * Helper Functions - *******************************************************************/ - - - -#if 0 - - // Looks up truth value of ASTNode SYMBOL in MINISAT satisfying - // assignment. - ASTNode ToSAT::SymbolTruthValue(SATSolver &newSolver, ASTNode form) - { - SATSolver::Var satvar = _ASTNode_to_SATVar_Map[form]; - if (newSolver.model[satvar] == SATSolver::l_False) - { - return ASTFalse; - } - else - { - // True or undefined. - return ASTTrue; - } - } - - // This function is for debugging problems with BitBlast and - // especially ToCNF. It evaluates the bit-blasted formula in the - // satisfying assignment. While doing that, it checks that every - // subformula has the same truth value as its representative - // literal, if it has one. If this condition is violated, it halts - // immediately (on the leftmost lowest term). Use CreateSimpForm to - // evaluate, even though it's expensive, so that we can use the - // partial truth assignment. - ASTNode ToSAT::CheckBBandCNF(SATSolver& newSolver, ASTNode form) - { - // Clear memo table (in case newSolver has changed). - CheckBBandCNFMemo.clear(); - // Call recursive version that does the work. - return CheckBBandCNF_int(newSolver, form); - } //End of CheckBBandCNF() - - // Recursive body CheckBBandCNF - ASTNode ToSAT::CheckBBandCNF_int(SATSolver& newSolver, ASTNode form) - { - // cout << "++++++++++++++++" - // << endl - // << "CheckBBandCNF_int form = " - // << form << endl; - - ASTNodeMap::iterator memoit = CheckBBandCNFMemo.find(form); - if (memoit != CheckBBandCNFMemo.end()) - { - // found it. Return memoized value. - return memoit->second; - } - - ASTNode result; // return value, to memoize. - - Kind k = form.GetKind(); - switch (k) - { - case TRUE: - case FALSE: - { - return form; - break; - } - case SYMBOL: - case BVGETBIT: - { - result = SymbolTruthValue(newSolver, form); - - // cout << "================" - // << endl - // << "Checking BB formula:" - // << form << endl; - // cout << "----------------" - // << endl - // << "Result:" << result << endl; - break; - } - default: - { - // Evaluate the children recursively. - ASTVec eval_children; - ASTVec ch = form.GetChildren(); - ASTVec::iterator itend = ch.end(); - for (ASTVec::iterator it = ch.begin(); it < itend; it++) - { - eval_children.push_back(CheckBBandCNF_int(newSolver, *it)); - } - result = bm->CreateSimpForm(k, eval_children); - - // cout << "================" - // << endl - // << "Checking BB formula:" << form << endl; - // cout << "----------------" - // << endl - // << "Result:" << result << endl; - - ASTNode replit_eval; - // Compare with replit, if there is one. - ASTNodeMap::iterator replit_it = RepLitMap.find(form); - if (replit_it != RepLitMap.end()) - { - ASTNode replit = RepLitMap[form]; - // Replit is symbol or not symbol. - if (SYMBOL == replit.GetKind()) - { - replit_eval = SymbolTruthValue(newSolver, replit); - } - else - { - // It's (NOT sym). Get value of sym and complement. - replit_eval = - bm->CreateSimpNot(SymbolTruthValue(newSolver, replit[0])); - } - - // cout << "----------------" - // << endl - // << "Rep lit: " << replit << endl; - // cout << "----------------" - // << endl - // << "Rep lit value: " << replit_eval << endl; - - if (result != replit_eval) - { - // Hit the panic button. - FatalError("Truth value of BitBlasted formula "\ - "disagrees with representative literal in CNF."); - } - } - else - { - //cout << "----------------" << endl << "No rep lit" << endl; - } - - } - } - - return (CheckBBandCNFMemo[form] = result); - } //end of CheckBBandCNF_int() -#endif -}; //end of namespace BEEV diff --git a/src/vendor/stp/src/to-sat/ASTNode/ToSAT.h b/src/vendor/stp/src/to-sat/ASTNode/ToSAT.h deleted file mode 100644 index eae5e7e3e..000000000 --- a/src/vendor/stp/src/to-sat/ASTNode/ToSAT.h +++ /dev/null @@ -1,117 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef TOSAT_H -#define TOSAT_H - -#include "ToCNF.h" - -#include "../../AST/AST.h" -#include "../../STPManager/STPManager.h" -#include "../ToSATBase.h" - -namespace BEEV -{ - class ToSAT :public ToSATBase - { - - private: - /**************************************************************** - * Private Typedefs and Data * - ****************************************************************/ - - // MAP: This is a map from ASTNodes to SATSolver::Vars. - // - // The map is populated while ASTclauses are read from the AST - // ClauseList returned by CNF converter. For every new boolean - // variable in ASTClause a new SATSolver::Var is created (these vars - // typedefs for ints) - typedef HASHMAP< - ASTNode, - SATSolver::Var, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTtoSATMap; - ASTtoSATMap _ASTNode_to_SATVar_Map; - - // MAP: This is a map from ASTNodes to SATSolver::Vars for SYMBOLS> - // - // Reverse map used in building counterexamples. MINISAT returns a - // model in terms of MINISAT Vars, and this map helps us convert - // it to a model over ASTNode variables. - ASTNodeToSATVar SATVar_to_SymbolIndex; - - int CNFFileNameCounter; - int benchFileNameCounter; - - /**************************************************************** - * Private Member Functions * - ****************************************************************/ - - //looksup a MINISAT var from the minisat-var memo-table. if none - //exists, then creates one. Treat the result as const. - SATSolver::Var LookupOrCreateSATVar(SATSolver& S, - const ASTNode& n); - - - //Iteratively goes through the Clause Buckets, and calls - //toSATandSolve() - bool CallSAT_On_ClauseBuckets(SATSolver& SatSolver, - ClauseBuckets * cb - , CNFMgr*& cm); - - - // Converts the clause to SAT and calls SAT solver - bool toSATandSolve(SATSolver& S, - ClauseList& cll, - bool final, - CNFMgr*& cm, - bool add_xor_clauses=false, - bool enable_clausal_abstraction=false); - - - ClauseBuckets * Sort_ClauseList_IntoBuckets(ClauseList * cl, int clause_bucket_size); - - - public: - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - // Constructor - ToSAT(STPMgr * bm) : - ToSATBase(bm) - { - CNFFileNameCounter = 0; - benchFileNameCounter = 0; - } - - // Bitblasts, CNF conversion and calls toSATandSolve() - bool CallSAT(SATSolver& SatSolver, - const ASTNode& input, bool refinement); - - ASTNodeToSATVar& SATVar_to_SymbolIndexMap() - { - return SATVar_to_SymbolIndex; - } - - void ClearAllTables(void) - { - _ASTNode_to_SATVar_Map.clear(); - SATVar_to_SymbolIndex.clear(); - } - - - ~ToSAT() - { - ClearAllTables(); - } - }; //end of class ToSAT -}; //end of namespace - -#endif diff --git a/src/vendor/stp/src/to-sat/BitBlaster.cpp b/src/vendor/stp/src/to-sat/BitBlaster.cpp deleted file mode 100644 index 808300797..000000000 --- a/src/vendor/stp/src/to-sat/BitBlaster.cpp +++ /dev/null @@ -1,2891 +0,0 @@ -/******************************************************************** - * AUTHORS: David L. Dill, Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ -// -*- c++ -*- -#include -#include -#include "BitBlaster.h" -#include "AIG/BBNodeManagerAIG.h" -#include "ASTNode/BBNodeManagerASTNode.h" -#include "../simplifier/constantBitP/FixedBits.h" -#include "../simplifier/constantBitP/ConstantBitPropagation.h" -#include "../simplifier/constantBitP/NodeToFixedBitsMap.h" -#include "../simplifier/simplifier.h" -#include "../AST/ArrayTransformer.h" - -namespace BEEV -{ - - /******************************************************************** - * BitBlast - * - * Convert bitvector terms and formulas to boolean formulas. A term - * is something that can represent a multi-bit bitvector, such as - * BVPLUS or BVXOR (or a BV variable or constant). A formula (form) - * represents a boolean value, such as EQ or BVLE. Bit blasting a - * term representing an n-bit bitvector with BBTerm yields a vector - * of n boolean formulas (returning BBNodeVec). Bit blasting a formula - * returns a single boolean formula (type BBNode). A bitblasted - * term is a vector of BBNodes for formulas. The 0th element of - * the vector corresponds to bit 0 -- the low-order bit. - ********************************************************************/ - - using simplifier::constantBitP::FixedBits; - using simplifier::constantBitP::NodeToFixedBitsMap; - -#define BBNodeVec vector -#define BBNodeVecMap map > -#define BBNodeSet set - - vector _empty_BBNodeAIGVec; - -// Bit blast a bitvector term. The term must have a kind for a -// bitvector term. Result is a ref to a vector of formula nodes -// representing the boolean formula. - -// This prints out each constant expression that the bitblaster -// discovers. I use this to check that the expressions that are -// reaching the bitblaster don't have obvious simplifications -// that should have already been applied. - const bool debug_do_check = false; - const bool debug_bitblaster = false; - - const bool conjoin_to_top = true; - - - template - class BBVecHasher - { - public: - size_t operator()(const vector& n) const - { - int hash =0; - for (int i=0; i < std::min(n.size(),(size_t)6); i++) - hash += n[i].GetNodeNum(); - return hash; - } - }; - - template - class BBVecEquals - { - public: - bool operator()(const vector& n0, const vector& n1) const - { - if (n0.size() != n1.size()) - return false; - - for (int i=0; i < n0.size(); i++) - { - if (!(n0[i] == n1[i])) - return false; - } - return true; - } - }; - - -// Look through the maps to see what the bitblaster has discovered (if anything) is constant. -// then looks through for AIGS that are mapped to from different ASTNodes. - template - void - BitBlaster::getConsts(const ASTNode& form, ASTNodeMap& fromTo, ASTNodeMap& equivs) - { - assert(form.GetType() == BOOLEAN_TYPE); - - BBNodeSet support; - BBForm(form, support); - - assert(support.size() ==0); - - { - typename map::iterator it; - for (it = BBFormMemo.begin(); it != BBFormMemo.end(); it++) - { - const ASTNode& n = it->first; - const BBNode& x = it->second; - if (n.isConstant()) - continue; - - if (x != BBTrue && x != BBFalse) - continue; - - assert(n.GetType() == BOOLEAN_TYPE); - - ASTNode result; - if (x == BBTrue) - result = n.GetSTPMgr()->ASTTrue; - else - result = n.GetSTPMgr()->ASTFalse; - - if (n.GetKind() != SYMBOL) - fromTo.insert(make_pair(n, result)); - else - simp->UpdateSubstitutionMap(n, result); - } - } - - typename BBNodeVecMap::iterator it; - for (it = BBTermMemo.begin(); it != BBTermMemo.end(); it++) - { - const ASTNode& n = it->first; - assert(n.GetType() == BITVECTOR_TYPE); - - if (n.isConstant()) - continue; - - vector& x = it->second; - assert(x.size() == n.GetValueWidth()); - - bool constNode = true; - for (int i = 0; i < (int) x.size(); i++) - { - if (x[i] != BBTrue && x[i] != BBFalse) - { - constNode = false; - break; - } - } - if (!constNode) - continue; - - CBV val = CONSTANTBV::BitVector_Create(n.GetValueWidth(), true); - for (int i = 0; i < (int) x.size(); i++) - { - if (x[i] == BBTrue) - CONSTANTBV::BitVector_Bit_On(val, i); - } - - ASTNode r = n.GetSTPMgr()->CreateBVConst(val, n.GetValueWidth()); - if (n.GetKind() == SYMBOL) - simp->UpdateSubstitutionMap(n, r); - else - fromTo.insert(make_pair(n, r)); - } - - if (form.GetSTPMgr()->UserFlags.isSet("bb-equiv","1")) - { - HASHMAP nodeToFn; - typename map::iterator it; - for (it = BBFormMemo.begin(); it != BBFormMemo.end(); it++) - { - const ASTNode& n = it->first; - if (n.isConstant()) - continue; - - const BBNode& x = it->second; - if (x == BBTrue || x == BBFalse) - continue; - - if (nodeToFn.find(x.GetNodeNum()) == nodeToFn.end()) - { - nodeToFn.insert(make_pair(x.GetNodeNum(),n)); - } - else - { - const ASTNode other = (nodeToFn.find(x.GetNodeNum()))->second; - std::pair p; - if (other.GetNodeNum() > n.GetNodeNum()) - p = make_pair(other,n); - else - p = make_pair(n,other); - - equivs.insert(p); - //std::cerr << "from" << p.first << " to" << p.second; - //ASTNode equals = ASTNF->CreateNode(NOT,ASTNF->CreateNode(EQ,p.first,p.second)); - //printer::SMTLIB2_PrintBack(std::cerr,p.second); - } - } - } - - typedef HASHMAP, ASTNode,BBVecHasher , BBVecEquals > M; - if (form.GetSTPMgr()->UserFlags.isSet("bb-equiv","1")) - { - M lookup; - typename std::map >::iterator it; - for (it = BBTermMemo.begin(); it != BBTermMemo.end(); it++) - { - const ASTNode& n = it->first; - if (n.isConstant()) - continue; - - const vector& x = it->second; - - bool constNode = true; - for (int i = 0; i < (int) x.size(); i++) - { - if (x[i] != BBTrue && x[i] != BBFalse) - { - constNode = false; - break; - } - } - if (!constNode) - continue; - - if (lookup.find(x) == lookup.end()) - { - lookup.insert(make_pair(x, n)); - } - else - { - const ASTNode other = (lookup.find(x))->second; - std::pair p; - if (other.GetNodeNum() > n.GetNodeNum()) - p = make_pair(other, n); - else - p = make_pair(n, other); - - //cerr << "EQUIV"; - equivs.insert(p); - } - } - } - } - - - template - void - BitBlaster::commonCheck(const ASTNode& n) - { - cerr << "Non constant is constant:"; - cerr << n << endl; - - if (cb == NULL) - return; - if (cb->fixedMap->map->find(n) != cb->fixedMap->map->end()) - { - FixedBits* b = cb->fixedMap->map->find(n)->second; - cerr << "fixed bits are:" << *b << endl; - } - } - -// If x isn't a constant, and the bit-blasted version is. Print out the -// AST nodes and the fixed bits. - template - void - BitBlaster::check(const BBNode& x, const ASTNode& n) - { - if (n.isConstant()) - return; - - if (x != BBTrue && x != BBFalse) - return; - - commonCheck(n); - } - - template - void - BitBlaster::check(const vector& x, const ASTNode& n) - { - if (n.isConstant()) - return; - - for (int i = 0; i < (int) x.size(); i++) - { - if (x[i] != BBTrue && x[i] != BBFalse) - return; - } - - commonCheck(n); - } - - template - bool - BitBlaster::update(const ASTNode&n, const int i, simplifier::constantBitP::FixedBits* b, - BBNode& bb, BBNodeSet& support) - { - if (b->isFixed(i) && (!(bb == BBTrue || bb == BBFalse))) - { - //We have a fixed bit, but the bitblasted values aren't constant true or false. - if (conjoin_to_top && (fixedFromBottom.find(n) == fixedFromBottom.end())) - { - if (b->getValue(i)) - support.insert(bb); - else - support.insert(nf->CreateNode(NOT, bb)); - } - - bb = b->getValue(i) ? BBTrue : BBFalse; - } - else if (!b->isFixed(i) && (bb == BBTrue || bb == BBFalse)) - { - b->setFixed(i, true); - b->setValue(i, bb == BBTrue ? true : false); - return true; // Need to propagate. - } - - return false; - } - - template - void - BitBlaster::updateForm(const ASTNode&n, BBNode& bb, BBNodeSet& support) - { - if (cb == NULL || n.isConstant()) - return; - - BBNodeVec v(1, bb); - updateTerm(n, v, support); - bb = v[0]; - } - - template - void - BitBlaster::updateTerm(const ASTNode&n, BBNodeVec& bb, BBNodeSet& support) - { - - if (cb == NULL) - return; - - if (cb->isUnsatisfiable()) - return; - - if (n.isConstant()) - { - // This doesn't hold any longer because we convert BVSDIV and friends to ASTNodes. -#if 0 - simplifier::constantBitP::NodeToFixedBitsMap::NodeToFixedBitsMapType::const_iterator it; - it = cb->fixedMap->map->find(n); - if (it == cb->fixedMap->map->end()) - { - cerr << n; - assert(it != cb->fixedMap->map->end()); - }assert(it->second->isTotallyFixed()); -#endif - return; - } - - bool bbFixed = false; - for (int i = 0; i < (int) bb.size(); i++) - { - if (bb[i] == BBTrue || bb[i] == BBFalse) - { - bbFixed = true; - break; - } - } - - FixedBits * b = NULL; - - simplifier::constantBitP::NodeToFixedBitsMap::NodeToFixedBitsMapType::const_iterator it; - if ((it = cb->fixedMap->map->find(n)) == cb->fixedMap->map->end()) - { - if (bbFixed) - { - b = new FixedBits(n.GetType() == BOOLEAN_TYPE ? 1 : n.GetValueWidth(), n.GetType() == BOOLEAN_TYPE); - cb->fixedMap->map->insert(pair(n, b)); - if (debug_bitblaster) - cerr << "inserting" << n.GetNodeNum() << endl; - } - else - return; // nothing to update. - } - else - b = it->second; - - assert(b != NULL); - FixedBits old(*b); - - bool changed = false; - for (int i = 0; i < (int) bb.size(); i++) - if (update(n, i, b, bb[i], support)) - changed = true; // don't break, we want to run update(..) on each bit. - if (changed) - { - cb->scheduleNode(n); - cb->scheduleUp(n); - cb->propagate(); - } - - //If it's changed, the propagation may have caused new bits to be fixed. - if (changed && !FixedBits::equals(*b, old)) - { - updateTerm(n, bb, support); - return; - } - - // There may be a conflict between the AIGs and the constant bits (if the problem is unsatisfiable). - // So we can't ensure that if one is fixed to true (say), that the other should be true also. - - if (!cb->isUnsatisfiable()) - for (int i = 0; i < (int) bb.size(); i++) - { - if (b->isFixed(i)) - assert(bb[i] == BBTrue || bb[i] == BBFalse); - - if (bb[i] == BBFalse || bb[i] == BBTrue) - assert( b->isFixed(i)); - } - } - - template - bool - BitBlaster::isConstant(const BBNodeVec& v) - { - for (int i = 0; i < v.size(); i++) - { - if (v[i] != nf->getTrue() && v[i] != nf->getFalse()) - return false; - } - - return true; - } - - template - ASTNode - BitBlaster::getConstant(const BBNodeVec& v, const ASTNode&n) - { - if (n.GetType() == BOOLEAN_TYPE) - { - if (v[0] == nf->getTrue()) - return ASTNF->getTrue(); - else - return ASTNF->getFalse(); - } - - CBV bv = CONSTANTBV::BitVector_Create(v.size(), true); - - for (int i = 0; i < v.size(); i++) - if (v[i] == nf->getTrue()) - CONSTANTBV::BitVector_Bit_On(bv, i); - - return ASTNF->CreateConstant(bv, v.size()); - - } - - template - const BBNodeVec - BitBlaster::BBTerm(const ASTNode& _term, BBNodeSet& support) - { - ASTNode term = _term; // mutable local copy. - - typename BBNodeVecMap::iterator it = BBTermMemo.find(term); - if (it != BBTermMemo.end()) - { - // Constant bit propagation may have updated something. - updateTerm(term, it->second, support); - return it->second; - } - - // This block checks if the bitblasting/fixed bits have discovered - // any new constants. If they've discovered a new constant, then - // the simplification function is called on a new term with the constant - // value replacing what used to be a variable child. For instance, if - // the term is ite(x,y,z), and we now know that x is true. Then we will - // call SimplifyTerm on ite(true,y,z), which will do the expected simplification. - // Then the term that we bitblast will by "y". - - if (uf != NULL && uf->optimize_flag && uf->simplify_during_BB_flag) - { - const int numberOfChildren = term.Degree(); - vector ch; - ch.reserve(numberOfChildren); - - for (int i = 0; i < numberOfChildren; i++) - { - if (term[i].GetType() == BITVECTOR_TYPE) - { - ch.push_back(BBTerm(term[i], support)); - } - else if (term[i].GetType() == BOOLEAN_TYPE) - { - BBNodeVec t; - t.push_back(BBForm(term[i], support)); - ch.push_back(t); - } - else - throw "sdfssfa"; - } - - bool newConst = false; - for (int i = 0; i < numberOfChildren; i++) - { - if (term[i].isConstant()) - continue; - - if (isConstant(ch[i])) - { - // it's only interesting if the child isn't a constant, - // but the bitblasted version is. - newConst = true; - break; - } - } - - // Something is now constant that didn't used to be. - if (newConst) - { - ASTVec new_ch; - new_ch.reserve(numberOfChildren); - for (int i = 0; i < numberOfChildren; i++) - { - if (!term[i].isConstant() && isConstant(ch[i])) - new_ch.push_back(getConstant(ch[i], term[i])); - else - new_ch.push_back(term[i]); - } - - ASTNode n_term = simp->SimplifyTerm(ASTNF->CreateTerm(term.GetKind(), term.GetValueWidth(), new_ch)); - assert(BVTypeCheck(n_term)); - // n_term is the potentially simplified version of term. - - if (cb != NULL) - { - // Add all the nodes to the worklist that have a constant as a child. - cb->initWorkList(n_term); - - simplifier::constantBitP::NodeToFixedBitsMap::NodeToFixedBitsMapType::iterator it; - it = cb->fixedMap->map->find(n_term); - FixedBits* nBits; - if (it == cb->fixedMap->map->end()) - { - nBits = new FixedBits(std::max((unsigned) 1, n_term.GetValueWidth()), term.GetType() == BOOLEAN_TYPE); - cb->fixedMap->map->insert(pair(n_term, nBits)); - } - else - nBits = it->second; - - if (n_term.isConstant()) - { - // It's assumed elsewhere that constants map to themselves in the fixed map. - // That doesn't happen here unless it's added explicitly. - *nBits = FixedBits::concreteToAbstract(n_term); - } - - it = cb->fixedMap->map->find(term); - if (it != cb->fixedMap->map->end()) - { - // Copy over to the (potentially) new node. Everything we know about the old node. - nBits->mergeIn(*(it->second)); - } - - cb->scheduleUp(n_term); - cb->scheduleNode(n_term); - cb->propagate(); - - if (it != cb->fixedMap->map->end()) - { - // Copy to the old node, all we know about the new node. This means that - // all the parents of the old node get the (potentially) updated fixings. - it->second->mergeIn(*nBits); - } - // Propagate through all the parents of term. - cb->scheduleUp(term); - cb->scheduleNode(term); - cb->propagate(); - // Now we've propagated. - } - term = n_term; - - // check if we've already done the simplified one. - it = BBTermMemo.find(term); - if (it != BBTermMemo.end()) - { - // Constant bit propagation may have updated something. - updateTerm(term, it->second, support); - return it->second; - } - } - } - - BBNodeVec result; - - const Kind k = term.GetKind(); - if (!is_Term_kind(k)) - FatalError("BBTerm: Illegal kind to BBTerm", term); - - const ASTVec::const_iterator kids_end = term.end(); - const unsigned int num_bits = term.GetValueWidth(); - switch (k) - { - case BVNEG: - { - // bitwise complement - const BBNodeVec& bbkids = BBTerm(term[0], support); - result = BBNeg(bbkids); - break; - } - - case BVRIGHTSHIFT: - case BVSRSHIFT: - case BVLEFTSHIFT: - { - // Barrel shifter - const BBNodeVec& bbarg1 = BBTerm(term[0], support); - const BBNodeVec& bbarg2 = BBTerm(term[1], support); - - // Signed right shift, need to copy the sign bit. - BBNode toFill; - if (BVSRSHIFT == k) - toFill = bbarg1.back(); - else - toFill = nf->getFalse(); - - BBNodeVec temp_result(bbarg1); - // if any bit is set in bbarg2 higher than log2Width, then we know that the result is zero. - // Add one to make allowance for rounding down. For example, given 300 bits, the log2 is about - // 8.2 so round up to 9. - - const unsigned width = bbarg1.size(); - const unsigned log2Width = (unsigned) log2(width) + 1; - - if (k == BVSRSHIFT || k == BVRIGHTSHIFT) - for (unsigned int i = 0; i < log2Width; i++) - { - if (bbarg2[i] == nf->getFalse()) - continue; // Not shifting by anything. - - unsigned int shift_amount = 1 << i; - - for (unsigned int j = 0; j < width; j++) - { - if (j + shift_amount >= width) - temp_result[j] = nf->CreateNode(ITE, bbarg2[i], toFill, temp_result[j]); - else - temp_result[j] = nf->CreateNode(ITE, bbarg2[i], temp_result[j + shift_amount], temp_result[j]); - } - } - else - for (unsigned int i = 0; i < log2Width; i++) - { - if (bbarg2[i] == nf->getFalse()) - continue; // Not shifting by anything. - - int shift_amount = 1 << i; - - for (signed int j = width - 1; j >= 0; j--) - { - if (j < shift_amount) - temp_result[j] = nf->CreateNode(ITE, bbarg2[i], toFill, temp_result[j]); - else - temp_result[j] = nf->CreateNode(ITE, bbarg2[i], temp_result[j - shift_amount], temp_result[j]); - } - } - - // If any of the remainder are true. Then the whole thing gets the fill value. - BBNode remainder = nf->getFalse(); - for (unsigned int i = log2Width; i < width; i++) - { - remainder = nf->CreateNode(OR, remainder, bbarg2[i]); - } - - for (unsigned int i = 0; i < width; i++) - { - temp_result[i] = nf->CreateNode(ITE, remainder, toFill, temp_result[i]); - } - - result = temp_result; - } - break; - - case ITE: - { - // Term version of ITE. - const BBNode& cond = BBForm(term[0], support); - const BBNodeVec& thn = BBTerm(term[1], support); - const BBNodeVec& els = BBTerm(term[2], support); - result = BBITE(cond, thn, els); - break; - } - - case BVSX: - case BVZX: - { - // Replicate high-order bit as many times as necessary. - // Arg 0 is expression to be sign extended. - const ASTNode& arg = term[0]; - const unsigned long result_width = term.GetValueWidth(); - const unsigned long arg_width = arg.GetValueWidth(); - const BBNodeVec& bbarg = BBTerm(arg, support); - - if (result_width == arg_width) - { - //nothing to sign extend - result = bbarg; - break; - } - else - { - //we need to sign extend - const BBNode& msb = (k == BVSX) ? bbarg.back() : BBFalse; - - BBNodeVec tmp_res(result_width); - - typename BBNodeVec::const_iterator bb_it = bbarg.begin(); - typename BBNodeVec::iterator res_it = tmp_res.begin(); - typename BBNodeVec::iterator res_ext = res_it + arg_width; // first bit of extended part - typename BBNodeVec::iterator res_end = tmp_res.end(); - - // copy LSBs directly from bbvec - for (; res_it < res_ext; (res_it++, bb_it++)) - { - *res_it = *bb_it; - } - // repeat MSB to fill up rest of result. - for (; res_it < res_end; (res_it++)) - { - *res_it = msb; - } - - result = tmp_res; - break; - } - } - - case BVEXTRACT: - { - // bitblast the child, then extract the relevant bits. - // Note: This could be optimized by not bitblasting the bits - // that aren't fetched. But that would be tricky, especially - // with memo-ization. - - const BBNodeVec& bbkids = BBTerm(term[0], support); - const unsigned int high = term[1].GetUnsignedConst(); - const unsigned int low = term[2].GetUnsignedConst(); - - typename BBNodeVec::const_iterator bbkfit = bbkids.begin(); - // I should have used pointers to BBNodeVec, to avoid this crock - - result = BBNodeVec(bbkfit + low, bbkfit + high + 1); - break; - } - case BVCONCAT: - { - const BBNodeVec& vec1 = BBTerm(term[0], support); - const BBNodeVec& vec2 = BBTerm(term[1], support); - - BBNodeVec tmp_res(vec2); - tmp_res.insert(tmp_res.end(), vec1.begin(), vec1.end()); - result = tmp_res; - break; - } - case BVPLUS: - { - assert(term.Degree() >=1); - if (bvplus_variant) - { - // Add children pairwise and accumulate in BBsum - - ASTVec::const_iterator it = term.begin(); - BBNodeVec tmp_res = BBTerm(*it, support); - for (++it; it < kids_end; it++) - { - const BBNodeVec& tmp = BBTerm(*it, support); - assert(tmp.size() == num_bits); - BBPlus2(tmp_res, tmp, nf->getFalse()); - } - - result = tmp_res; - } - else - { - // Add all the children up using an addition network. - vector results; - for (int i = 0; i < term.Degree(); i++) - results.push_back(BBTerm(term[i], support)); - - const int bitWidth = term[0].GetValueWidth(); - std::vector > products(bitWidth+1); - for (int i = 0; i < bitWidth; i++) - { - for (int j = 0; j < results.size(); j++) - products[i].push_back(results[j][i]); - } - - result = buildAdditionNetworkResult(products, support, term); - } - break; - } - case BVUMINUS: - { - const BBNodeVec& bbkid = BBTerm(term[0], support); - result = BBUminus(bbkid); - break; - } - case BVSUB: - { - // complement of subtrahend - // copy, since BBSub writes into it. - - BBNodeVec tmp_res = BBTerm(term[0], support); - - const BBNodeVec& bbkid1 = BBTerm(term[1], support); - BBSub(tmp_res, bbkid1, support); - result = tmp_res; - break; - } - case BVMULT: - { - assert(BVTypeCheck(term)); - assert(term.Degree() == 2); - - BBNodeVec mpcd1 = BBTerm(term[0], support); - const BBNodeVec& mpcd2 = BBTerm(term[1], support); - updateTerm(term[0], mpcd1, support); - - assert(mpcd1.size() == mpcd2.size()); - result = BBMult(mpcd1, mpcd2, support, term); - break; - } - case SBVREM: - case SBVMOD: - case SBVDIV: - { - ASTNode p = ArrayTransformer::TranslateSignedDivModRem(term,ASTNF,term.GetSTPMgr()); - result = BBTerm(p,support); - break; - } - - case BVDIV: - case BVMOD: - { - const BBNodeVec& dvdd = BBTerm(term[0], support); - const BBNodeVec& dvsr = BBTerm(term[1], support); - assert(dvdd.size() == num_bits); - assert(dvsr.size() == num_bits); - BBNodeVec q(num_bits); - BBNodeVec r(num_bits); - BBDivMod(dvdd, dvsr, q, r, num_bits, support); - if (k == BVDIV) - { - if (uf->division_by_zero_returns_one_flag) - { - BBNodeVec zero(term.GetValueWidth(), BBFalse); - - BBNode eq = BBEQ(zero, dvsr); - BBNodeVec one(term.GetValueWidth(), BBFalse); - one[0] = BBTrue; - - result = BBITE(eq, one, q); - } - else - { - result = q; - } - } - else - result = r; - break; - } - // n-ary bitwise operators. - case BVXOR: - case BVXNOR: - case BVAND: - case BVOR: - case BVNOR: - case BVNAND: - { - // Add children pairwise and accumulate in BBsum - ASTVec::const_iterator it = term.begin(); - Kind bk = UNDEFINED; // Kind of individual bit op. - switch (k) - { - case BVXOR: - bk = XOR; - break; - case BVXNOR: - bk = IFF; - break; - case BVAND: - bk = AND; - break; - case BVOR: - bk = OR; - break; - case BVNOR: - bk = NOR; - break; - case BVNAND: - bk = NAND; - break; - default: - FatalError("BBTerm: Illegal kind to BBTerm", term); - break; - } - - // Sum is destructively modified in the loop, so make a copy of value - // returned by BBTerm. - BBNodeVec temp = BBTerm(*it, support); - BBNodeVec sum(temp); // First operand. - - // Iterate over remaining bitvector term operands - for (++it; it < kids_end; it++) - { - //FIXME FIXME FIXME: Why does using a temp. var change the behavior? - temp = BBTerm(*it, support); - const BBNodeVec& y = temp; - - assert(y.size() == num_bits); - for (unsigned i = 0; i < num_bits; i++) - { - sum[i] = nf->CreateNode(bk, sum[i], y[i]); - } - } - result = sum; - break; - } - case SYMBOL: - { - assert(num_bits >0); - - BBNodeVec bbvec; - bbvec.reserve(num_bits); - - for (unsigned int i = 0; i < num_bits; i++) - { - BBNode bit_node = nf->CreateSymbol(term, i); - bbvec.push_back(bit_node); - } - result = bbvec; - break; - } - case BVCONST: - { - BBNodeVec tmp_res(num_bits); - CBV bv = term.GetBVConst(); - for (unsigned int i = 0; i < num_bits; i++) - { - tmp_res[i] = CONSTANTBV::BitVector_bit_test(bv, i) ? nf->getTrue() : nf->getFalse(); - } - result = tmp_res; - break; - } - default: - FatalError("BBTerm: Illegal kind to BBTerm", term); - } - - assert(result.size() == term.GetValueWidth()); - - if (debug_do_check) - check(result, term); - - updateTerm(term, result, support); - return (BBTermMemo[term] = result); - } - - template - const BBNode - BitBlaster::BBForm(const ASTNode& form) - { - - if (conjoin_to_top && cb != NULL) - { - ASTNodeMap n = cb->getAllFixed(); - for (ASTNodeMap::const_iterator it = n.begin(); it != n.end(); it++) - fixedFromBottom.insert(it->first); - - // Mark the top node as true. - cb->setNodeToTrue(form); - cb->propagate(); - } - - BBNodeSet support; - BBNode r = BBForm(form, support); - - vector v; - v.insert(v.end(), support.begin(), support.end()); - v.push_back(r); - - if (!conjoin_to_top) - { - assert(support.size() ==0); - } - - if (cb != NULL && !cb->isUnsatisfiable()) - { - ASTNodeSet visited; - assert(cb->checkAtFixedPoint(form,visited)); - } - if (v.size() == 1) - return v[0]; - else - return nf->CreateNode(AND, v); - } - -// bit blast a formula (boolean term). Result is one bit wide, - template - const BBNode - BitBlaster::BBForm(const ASTNode& form, BBNodeSet& support) - { - typename map::iterator it = BBFormMemo.find(form); - if (it != BBFormMemo.end()) - { - // already there. Just return it. - return it->second; - } - - BBNode result; - - const Kind k = form.GetKind(); - if (!is_Form_kind(k)) - { - FatalError("BBForm: Illegal kind: ", form); - } - - // Not returning until end, and memoizing everything, makes it easier - // to trace coherently. - - // Various special cases - switch (k) - { - - case TRUE: - { - result = nf->getTrue(); - break; - } - - case FALSE: - { - result = nf->getFalse(); - break; - } - - case SYMBOL: - assert(form.GetType() == BOOLEAN_TYPE); - - result = nf->CreateSymbol(form, 0); // 1 bit symbol. - break; - - case NOT: - result = nf->CreateNode(NOT, BBForm(form[0], support)); - break; - - case ITE: - result = nf->CreateNode(ITE, BBForm(form[0], support), BBForm(form[1], support), BBForm(form[2], support)); - break; - - case AND: - case OR: - case NAND: - case NOR: - case IFF: - case XOR: - case IMPLIES: - { - BBNodeVec bbkids; // bit-blasted children (formulas) - - ASTVec::const_iterator kids_end = form.end(); - for (ASTVec::const_iterator it = form.begin(); it != kids_end; it++) - { - bbkids.push_back(BBForm(*it, support)); - } - result = nf->CreateNode(k, bbkids); - break; - } - - case EQ: - { - const BBNodeVec left = BBTerm(form[0], support); - const BBNodeVec right = BBTerm(form[1], support); - assert(left.size() == right.size()); - - result = BBEQ(left, right); - break; - } - - case BVLE: - case BVGE: - case BVGT: - case BVLT: - case BVSLE: - case BVSGE: - case BVSGT: - case BVSLT: - { - result = BBcompare(form, support); - break; - } - default: - FatalError("BBForm: Illegal kind: ", form); - break; - } - - assert(!result.IsNull()); - - if (debug_do_check) - check(result, form); - - updateForm(form, result, support); - - return (BBFormMemo[form] = result); - } - -// Bit blast a sum of two equal length BVs. -// Update sum vector destructively with new sum. - template - void - BitBlaster::BBPlus2(BBNodeVec& sum, const BBNodeVec& y, BBNode cin) - { - - const int bitWidth = sum.size(); - assert(y.size() == (unsigned)bitWidth); - // Revision 320 avoided creating the nextcin, at I suspect unjustified cost. - for (int i = 0; i < bitWidth; i++) - { - BBNode nextcin = Majority(sum[i], y[i], cin); - sum[i] = nf->CreateNode(XOR, sum[i], y[i], cin); - cin = nextcin; - } - } - -// Stores result - x in result, destructively - template - void - BitBlaster::BBSub(BBNodeVec& result, const BBNodeVec& y, BBNodeSet& support) - { - BBNodeVec compsubtrahend = BBNeg(y); - BBPlus2(result, compsubtrahend, nf->getTrue()); - } - -// Add one bit - template - BBNodeVec - BitBlaster::BBAddOneBit(const BBNodeVec& x, BBNode cin) - { - BBNodeVec result; - result.reserve(x.size()); - const typename BBNodeVec::const_iterator itend = x.end(); - for (typename BBNodeVec::const_iterator it = x.begin(); it < itend; it++) - { - BBNode nextcin = nf->CreateNode(AND, *it, cin); - result.push_back(nf->CreateNode(XOR, *it, cin)); - cin = nextcin; - } - return result; - } - -// Increment bit-blasted vector and return result. - template - BBNodeVec - BitBlaster::BBInc(const BBNodeVec& x) - { - return BBAddOneBit(x, nf->getTrue()); - } - -// Return formula for majority function of three bits. -// Pass arguments by reference to reduce refcounting. - template - BBNode - BitBlaster::Majority(const BBNode& a, const BBNode& b, const BBNode& c) - { - // Checking explicitly for constant a, b and c could - // be more efficient, because they are repeated in the logic. - if (nf->getTrue() == a) - { - return nf->CreateNode(OR, b, c); - } - else if (nf->getFalse() == a) - { - return nf->CreateNode(AND, b, c); - } - else if (nf->getTrue() == b) - { - return nf->CreateNode(OR, a, c); - } - else if (nf->getFalse() == b) - { - return nf->CreateNode(AND, a, c); - } - else if (nf->getTrue() == c) - { - return nf->CreateNode(OR, a, b); - } - else if (nf->getFalse() == c) - { - return nf->CreateNode(AND, a, b); - } - // there are lots more simplifications, but I'm not sure they're - // worth doing explicitly (e.g., a = b, a = ~b, etc.) - else - { - return nf->CreateNode(OR, nf->CreateNode(AND, a, b), nf->CreateNode(AND, b, c), nf->CreateNode(AND, a, c)); - } - } - -// Bitwise complement - template - BBNodeVec - BitBlaster::BBNeg(const BBNodeVec& x) - { - BBNodeVec result; - result.reserve(x.size()); - // Negate each bit. - const typename BBNodeVec::const_iterator& xend = x.end(); - for (typename BBNodeVec::const_iterator it = x.begin(); it < xend; it++) - { - result.push_back(nf->CreateNode(NOT, *it)); - } - return result; - } - -// Compute unary minus - template - BBNodeVec - BitBlaster::BBUminus(const BBNodeVec& x) - { - BBNodeVec xneg = BBNeg(x); - return BBInc(xneg); - } - -// AND each bit of vector y with single bit b and return the result. - template - BBNodeVec - BitBlaster::BBAndBit(const BBNodeVec& y, BBNode b) - { - if (nf->getTrue() == b) - { - return y; - } - - BBNodeVec result; - result.reserve(y.size()); - - const typename BBNodeVec::const_iterator yend = y.end(); - for (typename BBNodeVec::const_iterator yit = y.begin(); yit < yend; yit++) - { - result.push_back(nf->CreateNode(AND, *yit, b)); - } - return result; - } - - typedef enum - { - SYMBOL_MT, ZERO_MT, ONE_MT, MINUS_ONE_MT - } mult_type; - - void - printP(mult_type* m, int width) - { - for (int i = width - 1; i >= 0; i--) - { - if (m[i] == SYMBOL_MT) - cerr << "s"; - else if (m[i] == ZERO_MT) - cerr << "0"; - else if (m[i] == ONE_MT) - cerr << "1"; - else if (m[i] == MINUS_ONE_MT) - cerr << "-1"; - } - } - - template - void - convert(const BBNodeVec& v, BBNodeManagerT*nf, mult_type* result) - { - const BBNode& BBTrue = nf->getTrue(); - const BBNode& BBFalse = nf->getFalse(); - - for (int i = 0; i < v.size(); i++) - { - if (v[i] == BBTrue) - result[i] = ONE_MT; - else if (v[i] == BBFalse) - result[i] = ZERO_MT; - else - result[i] = SYMBOL_MT; - } - - // find runs of ones. - int lastOne = -1; - for (int i = 0; i < v.size(); i++) - { - assert(result[i] != MINUS_ONE_MT); - - if (result[i] == ONE_MT && lastOne == -1) - lastOne = i; - - if (result[i] != ONE_MT && lastOne != -1 && (i - lastOne >= 3)) - { - result[lastOne] = MINUS_ONE_MT; - for (int j = lastOne + 1; j < i; j++) - result[j] = ZERO_MT; - // Should this be lastOne = i? - lastOne = i; - result[i] = ONE_MT; - } - else if (result[i] != ONE_MT) - lastOne = -1; - } - - // finished with a one. - if (lastOne != -1 && (v.size() - lastOne > 1)) - { - result[lastOne] = MINUS_ONE_MT; - for (int j = lastOne + 1; j < v.size(); j++) - result[j] = ZERO_MT; - } - } - -// Multiply "multiplier" by y[start ... bitWidth]. - template - void - pushP(vector >& products, const int start, const BBNodeVec& y, const BBNode& multiplier, BBNodeManagerT*nf) - { - const int bitWidth = y.size(); - - int c = 0; - for (int i = start; i < bitWidth; i++) - { - BBNode n = nf->CreateNode(AND, y[c], multiplier); - if (n != nf->getFalse()) - products[i].push_back(n); - c++; - } - } - - const bool debug_multiply = false; - - /* Cryptominisat2. 5641x5693.smt. SAT Solving time only! - * adder_variant1 = true. Solving: 12.3s, 12.1s - * adder_variant1 = false. Solving: 26.5s, 26.0s - * - * Cryptominisat2. mult63bit.smt2. - * adder_variant1 = true. Solving: 8.1s, 8.2s - * adder_variant1 = false. Solving: 11.1s, 11.0s - * - * Cryptominisat2. conscram2.smt2. - * adder_variant1 = true. Solving:115s, 103s, 303s - * adder_variant1 = false. Solving:181s, 471s, 215s - * */ - - template - BBNodeVec - BitBlaster::buildAdditionNetworkResult(vector >& products, set& support, - const ASTNode& n) - { - const int bitWidth = n.GetValueWidth(); - - // If we have details of the partial products which can be true, - int ignore = -1; - simplifier::constantBitP::MultiplicationStats* ms = getMS(n, ignore); - if (!upper_multiplication_bound) - ms = NULL; - - BBNodeVec results; - for (int i = 0; i < bitWidth; i++) - { - - buildAdditionNetworkResult(products[i], products[i+1], support, (i + 1 == bitWidth), (ms != NULL && (ms->sumH[i] == 0))); - - assert(products[i].size() == 1); - results.push_back(products[i].back()); - } - - assert(products[bitWidth].size() ==0); // products[bitwidth] is defined but should never be used. - assert(results.size() == ((unsigned)bitWidth)); - return results; - } - -// Use full adders to create an addition network that adds together each of the -// partial products. Puts the carries into the "to" list. - - template - void - BitBlaster::buildAdditionNetworkResult(list& from, list& to, - set& support, const bool at_end, const bool all_false) - { - - while (from.size() >= 2) - { - BBNode c; - - if (from.size() == 2) - c = nf->getFalse(); - else - { - c = from.back(); - from.pop_back(); - } - - const BBNode a = from.back(); - from.pop_back(); - const BBNode b = from.back(); - from.pop_back(); - - // Nothing can be true. All must be false. - if (conjoin_to_top && all_false) - { - if (BBFalse != a) - support.insert(nf->CreateNode(NOT, a)); - if (BBFalse != b) - support.insert(nf->CreateNode(NOT, b)); - if (BBFalse != c) - support.insert(nf->CreateNode(NOT, c)); - continue; - } - - BBNode carry, sum; - - if (adder_variant) - { - carry = Majority(a, b, c); - sum = nf->CreateNode(XOR, a, b, c); - } - else - { - carry = nf->CreateNode(OR, nf->CreateNode(AND, a, b), nf->CreateNode(AND, b, c), nf->CreateNode(AND, a, c)); - sum = nf->CreateNode(XOR, nf->CreateNode(XOR, c, b), a); - } - - if (debug_multiply) - { - cerr << "a" << a; - cerr << "b" << b; - cerr << "c" << c; - cerr << "Carry" << carry; - cerr << "Sum" << sum; - } - - from.push_back(sum); - - if (!at_end && carry != BBFalse) - to.push_back(carry); - - } - if (0 == from.size()) - from.push_back(BBFalse); - - assert(1==from.size()); - } - - const bool debug_bounds = false; - - template - bool - BitBlaster::statsFound(const ASTNode& n) - { - if (NULL == cb) - return false; - - if (NULL == cb->msm) - return false; - - if (booth_recoded.find(n) != booth_recoded.end()) // Sums are wrong for recoded. - return false; - - simplifier::constantBitP::MultiplicationStatsMap::NodeToStats::const_iterator it; - it = cb->msm->map.find(n); - return (it != cb->msm->map.end()); - } - -// Make sure x and y are the parameters in the correct order. THIS ISNT COMMUTATIVE. - template - BBNodeVec - BitBlaster::multWithBounds(const ASTNode&n, vector >& products, - BBNodeSet& toConjoinToTop) - { - const int bitWidth = n.GetValueWidth(); - - int ignored=0; - assert(upper_multiplication_bound); - simplifier::constantBitP::MultiplicationStats& ms = *getMS(n, ignored); - - - - // If all of the partial products in the column must be zero, then replace - for (int i = 0; i < bitWidth; i++) - { - if (conjoin_to_top && ms.columnH[i] == 0) - { - while (products[i].size() > 0) - { - BBNode c = products[i].back(); // DONT take a reference of the back(). - products[i].pop_back(); - toConjoinToTop.insert(nf->CreateNode(NOT, c)); - } - products[i].push_back(nf->getFalse()); - } - } - - BBNodeVec result; - - if (debug_bounds) - { - ms.print(); - } - - vector prior; - for (int i = 0; i < bitWidth; i++) - { - if (debug_bounds) - { - cerr << " " << products[i].size(); - cerr << "[" << ms.columnL[i] << ":" << ms.columnH[i] << "][" << ms.sumL[i] << ":" << ms.sumH[i] << "]"; - } - - vector output; - - mult_BubbleSorterWithBounds(toConjoinToTop, products[i], output, prior, ms.sumL[i], ms.sumH[i]); - prior = output; - - assert(products[i].size() == 1); - result.push_back(products[i].back()); - } - - if (debug_bitblaster) - cerr << endl << endl; - - assert(result.size() == ((unsigned)bitWidth)); - return result; - } - - template - void - BitBlaster::mult_Booth(const BBNodeVec& x_i, const BBNodeVec& y_i, BBNodeSet& support, - const ASTNode& xN, const ASTNode& yN, vector >& products, const ASTNode& n) - { - const int bitWidth = x_i.size(); - assert(x_i.size() == y_i.size()); - - const BBNodeVec& x = x_i; - const BBNodeVec& y = y_i; - - const BBNode& BBTrue = nf->getTrue(); - const BBNode& BBFalse = nf->getFalse(); - - for (int i = 0; i < bitWidth; i++) - { - assert(products[i].size() == 0); - } - - BBNodeVec notY; - for (int i = 0; i < y.size(); i++) - { - notY.push_back(nf->CreateNode(NOT, y[i])); - } - - mult_type xt[x.size()]; - convert(x, nf, xt); - - if (debug_multiply) - { - cerr << "--------" << endl; - cerr << "x:"; - printP(xt, x.size()); - cerr << xN << endl; - } - - mult_type yt[x.size()]; - convert(y, nf, yt); - - if (debug_multiply) - { - cerr << "y:"; - printP(yt, y.size()); - cerr << yN << endl; - } - - // We store them into here before sorting them. - vector > t_products(bitWidth); - - for (int i = 0; i < bitWidth; i++) - { - if (x[i] != BBTrue && x[i] != BBFalse) - { - pushP(t_products, i, y, x[i], nf); - } - - // A bit can not be true or false, as well as one of these two. - if (xt[i] == MINUS_ONE_MT) - { - pushP(t_products, i, notY, BBTrue, nf); - t_products[i].push_back(BBTrue); - booth_recoded.insert(n); - } - - else if (xt[i] == ONE_MT) - { - pushP(t_products, i, y, BBTrue, nf); - } - - if (t_products[i].size() == 0) - t_products[i].push_back(BBFalse); - - sort(t_products[i].begin(), t_products[i].end()); - for (int j = 0; j < t_products[i].size(); j++) - products[i].push_back(t_products[i][j]); - } - } - -// Uses addition networks explicitly. -// I've copied this in from my the "trevor" branch r482. -// I've not measured if this is better than the current variant. - template - void - BitBlaster::mult_allPairs(const BBNodeVec& x, const BBNodeVec& y, BBNodeSet& support, - vector >& products) - { - // Make a table of partial products. - const int bitWidth = x.size(); - assert(x.size() == y.size()); - assert(bitWidth > 0); - - for (int i = 0; i < bitWidth; i++) - { - assert(!x[i].IsNull()); - assert(!y[i].IsNull()); - } - - for (int i = 0; i < bitWidth; i++) - { - for (int j = 0; j <= i; j++) - { - BBNode n = nf->CreateNode(AND, x[i - j], y[j]); - - if (n != nf->getFalse()) - products[i].push_back(n); - } - - if (0 == products[i].size()) - products[i].push_back(nf->getFalse()); - - } - } - - template - MultiplicationStats* - BitBlaster::getMS(const ASTNode&n, int& highestZero) - { - MultiplicationStats * ms; - highestZero = -1; - - if (statsFound(n)) - { - simplifier::constantBitP::MultiplicationStatsMap::NodeToStats::iterator it; - it = cb->msm->map.find(n); - if (it != cb->msm->map.end()) - { - ms = &(it->second); - - assert(ms->x.getWidth() == ms->y.getWidth()); - assert(ms->r.getWidth() == ms->y.getWidth()); - assert(ms->r.getWidth() == (int)ms->bitWidth); - } - - for (int i = 0; i < n.GetValueWidth(); i++) - if (ms->sumH[i] == 0) - highestZero = i; - - return ms; - } - - return NULL; - } - - // Each bit of 'x' is taken in turn and multiplied by a shifted y. - template - BBNodeVec - BitBlaster::mult_normal(const BBNodeVec& x, const BBNodeVec& y, BBNodeSet& support, - const ASTNode&n) - { - const int bitWidth = n.GetValueWidth(); - - // If we have details of the partial products which can be true, - int highestZero = -1; - const simplifier::constantBitP::MultiplicationStats* ms = getMS(n, highestZero); - if (!upper_multiplication_bound) - ms = NULL; - - BBNodeVec ycopy(y); - - BBNodeVec prod = BBNodeVec(BBAndBit(y, *x.begin())); // start prod with first partial product. - - for (int i = 1; i < bitWidth; i++) // start loop at next bit. - { - const BBNode& xit = x[i]; - - // shift first - BBLShift(ycopy, 1); - - if (nf->getFalse() == xit) - { - // If this bit is zero, the partial product will - // be zero. No reason to add that in. - continue; - } - - BBNodeVec pprod = BBAndBit(ycopy, xit); - - // Iterate through from the current location upwards, setting anything to zero that can be.. - if (ms != NULL && highestZero >= i) - { - for (int column = i; column <= highestZero; column++) - { - if (ms->sumH[column] == 0 && (nf->getFalse() != prod[column])) - { - support.insert(nf->CreateNode(NOT, prod[column])); - prod[column] = BBFalse; - } - } - } - - BBPlus2(prod, pprod, nf->getFalse()); - } - return prod; - } - - // assumes the prior column is sorted. - template - void - BitBlaster::mult_BubbleSorterWithBounds(BBNodeSet& support, list& current, - vector& currentSorted, vector& priorSorted, const int minTrue, const int maxTrue) - { - - // Add the carry from the prior column. i.e. each second sorted formula. - for (int k = 1; k < priorSorted.size(); k += 2) - { - current.push_back(priorSorted[k]); - } - - const int height = current.size(); - - // Set the current sorted to all false. - currentSorted.clear(); - { - vector temp(height, nf->getFalse()); - currentSorted = temp; - } - - // n^2 sorting network. - for (int l = 0; l < height; l++) - { - vector oldSorted(currentSorted); - BBNode c = current.back(); - current.pop_back(); - currentSorted[0] = nf->CreateNode(OR, oldSorted[0], c); - - for (int j = 1; j <= l; j++) - { - currentSorted[j] = nf->CreateNode(OR, nf->CreateNode(AND, oldSorted[j - 1], c), oldSorted[j]); - } - } - - assert(current.size() == 0); - - for (int k = 0; k < height; k++) - assert(!currentSorted[k].IsNull()); - - if (conjoin_to_top) - { - for (int j = 0; j < minTrue; j++) - { - support.insert(currentSorted[j]); - currentSorted[j] = BBTrue; - } - - for (int j = height - 1; j >= maxTrue; j--) - { - support.insert(nf->CreateNode(NOT, currentSorted[j])); - currentSorted[j] = BBFalse; - } - } - - BBNode resultNode = nf->getFalse(); - - // Constrain to equal the result - for (int k = 1; k < height; k += 2) - { - BBNode part = nf->CreateNode(AND, nf->CreateNode(NOT, currentSorted[k]), currentSorted[k - 1]); - resultNode = nf->CreateNode(OR, resultNode, part); - } - - // constraint the all '1's case. - if (height % 2 == 1) - resultNode = nf->CreateNode(OR, resultNode, currentSorted.at(height - 1)); - - current.push_back(resultNode); - } - -// If a bit has a fixed value, then it should equal BBTrue or BBFalse in the input vectors. - template - void - BitBlaster::checkFixed(const BBNodeVec& v, const ASTNode& n) - { - if (cb == NULL) - return; - - if (cb->isUnsatisfiable()) - return; - - if (cb->fixedMap->map->find(n) != cb->fixedMap->map->end()) - { - FixedBits* b = cb->fixedMap->map->find(n)->second; - for (int i = 0; i < b->getWidth(); i++) - { - if (b->isFixed(i)) - if (b->getValue(i)) - { - assert(v[i]== BBTrue); - } - else - { - if (v[i] != BBFalse) - { - cerr << *b; - cerr << i << endl; - cerr << n; - cerr << (v[i] == BBTrue) << endl; - } - - assert(v[i]== BBFalse); - } - } - } - } - - // If it's not booth encoded, and the column sum is zero, - // then set that all the partial products must be zero. - // For this to do anything constant bit propagation must be - // turned on, and upper_multiplication_bound must be set. - template - void - BitBlaster::setColumnsToZero(vector >& products, set& support, - const ASTNode&n) - { - const int bitWidth = n.GetValueWidth(); - - // If we have details of the partial products which can be true, - int highestZero = -1; - simplifier::constantBitP::MultiplicationStats* ms = getMS(n, highestZero); - if (!upper_multiplication_bound) - ms = NULL; - - if (ms == NULL) - return; - - for (int i = 0; i < bitWidth; i++) - { - if (ms->sumH[i] == 0) - { - while (products[i].size() > 0) - { - BBNode curr = products[i].back(); - products[i].pop_back(); - - if (BBFalse == curr) - continue; - - support.insert(nf->CreateNode(NOT, curr)); - } - products[i].push_back(BBFalse); - - } - } - } - - -// Multiply two bitblasted numbers - template - BBNodeVec - BitBlaster::BBMult(const BBNodeVec& _x, const BBNodeVec& _y, BBNodeSet& support, - const ASTNode& n) - { - - if (uf->isSet("print_on_mult", "0")) - cerr << "--mult--"; - - BBNodeVec x = _x; - BBNodeVec y = _y; - - if ((BVCONST != n[0].GetKind()) && (BVCONST == n[1].GetKind())) - { - x = _y; - y = _x; - } - - const int bitWidth = n.GetValueWidth(); - assert(x.size() == bitWidth); - assert(y.size() == bitWidth); - - std::vector > products(bitWidth+1); // Create one extra to avoid special cases. - - if (multiplication_variant == "1") - { - return mult_normal(x, y, support, n); - } - //else if (multiplication_variant == "2") - // V2 used to be V3 with normal rather than booth recoding. - // To recreate V2, use V3 and turn off Booth recoding. - else if (multiplication_variant == "3") - { - mult_Booth(_x, _y, support, n[0], n[1], products, n); - setColumnsToZero(products,support,n); - return buildAdditionNetworkResult(products, support, n); - } - else if (multiplication_variant == "4") - { - //cerr << "v4"; - mult_Booth(_x, _y, support, n[0], n[1], products, n); - vector prior; - - for (int i = 0; i < bitWidth; i++) - { - vector output; - mult_BubbleSorterWithBounds(support, products[i], output, prior); - prior = output; - assert(products[i].size() == 1); - } - return buildAdditionNetworkResult(products, support, n); - } - else if (multiplication_variant == "5") - { - if (!statsFound(n) || !upper_multiplication_bound) - { - mult_Booth(_x, _y, support, n[0], n[1], products, n); - setColumnsToZero(products,support,n); - return buildAdditionNetworkResult(products, support, n); - } - - - mult_allPairs(x, y, support, products); - setColumnsToZero(products,support,n); - return multWithBounds(n, products, support); - } - else if (multiplication_variant == "6") - { - mult_Booth(_x, _y, support,n[0],n[1],products,n); - setColumnsToZero(products,support,n); - return v6(products, support, n); - } - else if (multiplication_variant == "7") - { - mult_Booth(_x, _y, support, n[0], n[1], products,n); - setColumnsToZero(products,support,n); - return v7(products, support, n); - } - else if (multiplication_variant == "8") - { - mult_Booth(_x, _y, support, n[0], n[1], products,n); - setColumnsToZero(products,support,n); - return v8(products, support, n); - } - else if (multiplication_variant == "9") - { - mult_Booth(_x, _y, support, n[0], n[1], products,n); - setColumnsToZero(products,support,n); - return v9(products, support,n); - } - else if (multiplication_variant == "13") - { - mult_Booth(_x, _y, support, n[0], n[1], products,n); - setColumnsToZero(products,support,n); - return v13(products, support,n); - } - else - { - cerr << "Unk variant" << multiplication_variant; - FatalError("sda44f"); - } - - } - - // Takes an unsorted array, and returns a sorted array. - template - BBNodeVec BitBlaster::batcher(const vector& in) - { - assert(in.size() != 0); - - if (in.size() ==1) - return in; - - vector a; - vector b; - - // half way rounded up. - const int halfWay = (((in.size()%2)==0? 0:1) + (in.size()/2) ); - for (int i =0; i < halfWay;i++) - a.push_back(in[i]); - - for (int i =halfWay; i < in.size();i++) - b.push_back(in[i]); - - assert(a.size() >= b.size()); - assert(a.size() + b.size() == in.size()); - vector result= mergeSorted(batcher(a), batcher(b)); - - for (int k = 0; k < result.size(); k++) - assert(!result[k].IsNull()); - - assert(result.size() == in.size()); - return result; - } - - - - // assumes that the prior column is sorted. - template - void - BitBlaster::sortingNetworkAdd(BBNodeSet& support, list& current, vector& currentSorted, - vector& priorSorted) - { - - vector toSort; - - // convert the list to a vector. - while (current.size() != 0) - { - BBNode currentN = current.front(); - assert(!currentN.IsNull()); - toSort.push_back(currentN); - current.pop_front(); - } - - vector sorted = batcher(toSort); - - assert(sorted.size() == toSort.size()); - - vector sortedCarryIn; - for (int k = 1; k < priorSorted.size(); k += 2) - { - sortedCarryIn.push_back(priorSorted[k]); - } - - if (sorted.size() >= sortedCarryIn.size()) - currentSorted = mergeSorted(sorted, sortedCarryIn); - else - currentSorted = mergeSorted(sortedCarryIn, sorted); - - assert(currentSorted.size() == sortedCarryIn.size() + toSort.size()); - int height = currentSorted.size(); - - assert(current.size() == 0); - - for (int k = 0; k < height; k++) - assert(!currentSorted[k].IsNull()); - - BBNode resultNode = nf->getFalse(); - - // Constrain to equal the result - for (int k = 1; k < height; k += 2) - { - BBNode part = nf->CreateNode(AND, nf->CreateNode(NOT, currentSorted[k]), currentSorted[k - 1]); - resultNode = nf->CreateNode(OR, resultNode, part); - } - - // constraint the all '1's case. - if (height % 2 == 1) - resultNode = nf->CreateNode(OR, resultNode, currentSorted.at(height - 1)); - - current.push_back(resultNode); - } - - template - BBNodeVec - BitBlaster::v6(vector >& products, set& support, const ASTNode&n) - { - const int bitWidth = n.GetValueWidth(); - - vector prior; - - for (int i = 0; i < bitWidth; i++) - { - vector output; - sortingNetworkAdd(support, products[i], output ,prior); - prior = output; - assert(products[i].size() == 1); - } - - // This converts the array of lists to a vector. - return buildAdditionNetworkResult(products ,support, n); - } - - template - BBNodeVec - BitBlaster::v13(vector >& products, set& support, const ASTNode&n) - { - const int bitWidth = n.GetValueWidth(); - - int ignore = -1; - simplifier::constantBitP::MultiplicationStats* ms = getMS(n, ignore); - if (!upper_multiplication_bound) - ms = NULL; - - bool done = false; - - vector a(bitWidth); - vector b(bitWidth); - - while (!done) - { - done = true; - - for (int i = 0; i < bitWidth; i++) - { - if (products[i].size() > 2) - done = false; - if (products[i].size() > 0) - { - a[i] = products[i].back(); - products[i].pop_back(); - } - else - a[i] = BBFalse; - - if (products[i].size() > 0) - { - b[i] = products[i].back(); - products[i].pop_back(); - } - else - b[i] = BBFalse; - - if (ms != NULL && ms->sumH[i] == 0) - { - if (a[i] != BBFalse) - { - support.insert(nf->CreateNode(NOT, a[i])); - a[i] = BBFalse; - } - - if (b[i] != BBFalse) - { - support.insert(nf->CreateNode(NOT, b[i])); - b[i] = BBFalse; - } - }assert(!a[i].IsNull()); - assert(!b[i].IsNull()); - - } - BBPlus2(a, b, BBFalse); - for (int i = 0; i < bitWidth; i++) - products[i].push_back(a[i]); - } - - BBNodeVec results; - for (int i = 0; i < bitWidth; i++) - { - assert(products[i].size() ==1); - results.push_back(products[i].back()); - } - - assert(results.size() == ((unsigned)bitWidth)); - return results; - } - - - - // Sorting network that delivers carries directly to the correct column. - // For instance, if there are 6 true in a column, then a carry will flow to column+1, and column+2. - template - BBNodeVec - BitBlaster::v9(vector >& products, set& support,const ASTNode&n) - { - const int bitWidth = n.GetValueWidth(); - - vector< vector< BBNode> > toAdd(bitWidth); - - for (int column = 0; column < bitWidth; column++) - { - vector sorted; // The current column (sorted) gets put into here. - vector prior; // Prior is always empty in this.. - - const int size= products[column].size(); - sortingNetworkAdd(support, products[column], sorted ,prior); - - assert(products[column].size() == 1); - assert(sorted.size() == size); - - for (int k = 2; k <= sorted.size(); k++) - { - BBNode part; - if (k==sorted.size()) - part = sorted[k - 1]; - else - { - // We expect the 1's to be sorted first. - assert((sorted[k-1] != BBFalse) || (sorted[k] != BBTrue)); - part = nf->CreateNode(AND, nf->CreateNode(NOT, sorted[k]), sorted[k - 1]); - - if (part == BBFalse) - continue; // shortcut. - } - - int position =k; - int increment =1; - while (position != 0) - { - if (column+increment >= bitWidth) - break; - - position >>=1; - if ((position & 1) !=0) // bit is set. - toAdd[column+increment].push_back(part); - - increment++; - } - } - - for (int carry_column =column+1; carry_column < bitWidth; carry_column++) - { - if (toAdd[carry_column].size() ==0) - continue ; - BBNode disjunct = BBFalse; - for (int l = 0; l < toAdd[carry_column].size();l++) - { - disjunct = nf->CreateNode(OR,disjunct,toAdd[carry_column][l]); - } - - if(disjunct != BBFalse) - products[carry_column].push_back(disjunct); - toAdd[carry_column].clear(); - } - } - for (int i = 0; i < bitWidth; i++) - { - assert(toAdd[i].size() == 0); - } - - // This converts the array of lists to a vector. - return buildAdditionNetworkResult(products ,support, n); - } - - - template - BBNodeVec - BitBlaster::v7(vector >& products, set& support, const ASTNode&n) - { - const int bitWidth = n.GetValueWidth(); - - // If we have details of the partial products which can be true, - int ignore = -1; - simplifier::constantBitP::MultiplicationStats* ms = getMS(n, ignore); - if (!upper_multiplication_bound) - ms = NULL; - - - std::vector > later(bitWidth+1); - std::vector > next(bitWidth+1); - - for (int i = 0; i < bitWidth; i++) - { - next[i+1].clear(); - buildAdditionNetworkResult(products[i], next[i + 1], support, bitWidth == i+1, (ms!=NULL && (ms->sumH[i]==0))); - - // Calculate the carries of carries. - for (int j = i + 1; j < bitWidth; j++) - { - if (next[j].size() == 0) - break; - - next[j+1].clear(); - buildAdditionNetworkResult(next[j], next[j + 1], support, bitWidth == j+1, false); - } - - // Put the carries of the carries away until later. - for (int j = i + 1; j < bitWidth; j++) - { - if (next[j].size() == 0) - break; - - assert(next[j].size() <=1); - later[j].push_back(next[j].back()); - } - } - - - for (int i = 0; i < bitWidth; i++) - { - // Copy all the laters into products - while(later[i].size() > 0) - { - products[i].push_front(later[i].front()); - later[i].pop_front(); - } - } - - BBNodeVec results; - for (int i = 0; i < bitWidth; i++) - { - - buildAdditionNetworkResult((products[i]), (products[i + 1]), support, bitWidth == i+1, false); - - - results.push_back(products[i].back()); - products[i].pop_back(); - } - - assert(results.size() == ((unsigned)bitWidth)); - return results; - } - - - template - BBNodeVec - BitBlaster::v8(vector >& products, set& support, const ASTNode&n) - { - const int bitWidth = n.GetValueWidth(); - - // If we have details of the partial products which can be true, - int ignore = -1; - simplifier::constantBitP::MultiplicationStats* ms = getMS(n, ignore); - if (!upper_multiplication_bound) - ms = NULL; - - - - std::vector > later(bitWidth+1); // +1 then ignore the topmost. - std::vector > next(bitWidth+1); - - for (int i = 0; i < bitWidth; i++) - { - // Put all the products into next. - next[i+1].clear(); - buildAdditionNetworkResult((products[i]), (next[i + 1]), support, i+1 ==bitWidth, (ms!=NULL && (ms->sumH[i]==0))); - - // Calculate the carries of carries. - for (int j = i + 1; j < bitWidth; j++) - { - if (next[j].size() == 0) - break; - - next[j+1].clear(); - buildAdditionNetworkResult(next[j], next[j + 1], support, j+1 ==bitWidth, false); - } - - // Put the carries of the carries away until later. - for (int j = i + 1; j < bitWidth; j++) - { - if (next[j].size() == 0) - break; - - assert(next[j].size() <=1); - later[j].push_back(next[j].back()); - } - } - - - for (int i = 0; i < bitWidth; i++) - { - // Copy all the laters into products - while(later[i].size() > 0) - { - products[i].push_back(later[i].back()); - later[i].pop_back(); - } - } - - BBNodeVec results; - for (int i = 0; i < bitWidth; i++) - { - buildAdditionNetworkResult(products[i], products[i + 1], support, i+1 ==bitWidth, false); - results.push_back(products[i].back()); - products[i].pop_back(); - } - - assert(results.size() == ((unsigned)bitWidth)); - return results; - } - - - // compare element 1 with 2, 3 with 4, and so on. - template - vector - BitBlaster:: compareOddEven(const vector& in) - { - vector result(in); - - for (int i = 2; i < in.size(); i =i+ 2) - { - BBNode a = in[i-1]; - BBNode b = in[i]; - //comparators++; - result[i-1] = nf->CreateNode(OR,a,b); - result[i] = nf->CreateNode(AND,a,b); - } - return result; - } - - - template - vector - BitBlaster::mergeSorted(const vector& in1, const vector& in2) - { - - assert(in1.size() >= in2.size()); - assert(in1.size() >0); - - vector result; - - if (in2.size() ==0) - { - result = in1; - } - else if (in1.size() == 1 && in2.size() ==1) - { - //comparators++; - result.push_back(nf->CreateNode(OR,in1[0], in2[0])); - result.push_back(nf->CreateNode(AND,in1[0], in2[0])); - - } - else - { - vector evenL; - vector oddL; - for (int i =0; i < in1.size();i++) - { - if (i%2 ==0) - evenL.push_back(in1[i]); - else - oddL.push_back(in1[i]); - } - - vector evenR; // Take the even of each. - vector oddR; // Take the odd of each - for (int i =0; i < in2.size();i++) - { - if (i%2 ==0) - evenR.push_back(in2[i]); - else - oddR.push_back(in2[i]); - } - - vector even = evenL.size()< evenR.size() ? mergeSorted(evenR,evenL) : mergeSorted(evenL,evenR); - vector odd = oddL.size() < oddR.size() ? mergeSorted(oddR,oddL) : mergeSorted(oddL,oddR); - - for (int i =0; i < std::max(even.size(),odd.size());i++) - { - if (even.size() > i) - result.push_back(even[i]); - - if (odd.size() > i) - result.push_back(odd[i]); - } - result = compareOddEven(result); - } - - assert(result.size() == in1.size() + in2.size()); - return result; - - } - - - -// All combinations of division_variant_1, _2, _3 - /* on factoring12bitsx12.cvc with MINISAT2. - 000: 0m2.764s - 001: 0m4.060s - 010: 0m2.750s - 011: 0m4.173s - 100: 0m3.064s - 101: 0m3.217s - 110: 0m3.064s - 111: 0m3.230s - */ - -// This implements a variant of binary long division. -// q and r are "out" parameters. rwidth puts a bound on the -// recursion depth. - template - void - BitBlaster::BBDivMod(const BBNodeVec &y, const BBNodeVec &x, BBNodeVec &q, BBNodeVec &r, - unsigned int rwidth, BBNodeSet& support) - { - const unsigned int width = y.size(); - const BBNodeVec zero = BBfill(width, nf->getFalse()); - BBNodeVec one = zero; - one[0] = nf->getTrue(); - - // check if y is already zero. - bool isZero = true; - for (int i = 0; i < rwidth; i++) - if (y[i] != nf->getFalse()) - { - isZero = false; - break; - } - - if (isZero || rwidth == 0) - { - // When we have shifted the entire width, y is guaranteed to be 0. - q = zero; - r = zero; - } - else - { - BBNodeVec q1, r1; - BBNodeVec yrshift1(y); - BBRShift(yrshift1, 1); - - // recursively divide y/2 by x. - BBDivMod(yrshift1, x, q1, r1, rwidth - 1, support); - - BBNodeVec q1lshift1(q1); - BBLShift(q1lshift1, 1); - - BBNodeVec r1lshift1(r1); - BBLShift(r1lshift1, 1); - - BBNodeVec r1lshift1plusyodd(r1lshift1); - r1lshift1plusyodd[0] = y[0]; - - // By extending rminusx by one bit, we can use that top-bit - // to check whether r>=x. We need to compute rminusx anyway, - // so this saves having a separate compare circut. - BBNodeVec rminusx(r1lshift1plusyodd); - rminusx.push_back(nf->getFalse()); - BBNodeVec xCopy(x); - xCopy.push_back(nf->getFalse()); - BBSub(rminusx, xCopy, support); - BBNode sign = rminusx[width]; - rminusx.pop_back(); - - // Adjusted q, r values when when r is too large. - //q1lshift1 has zero in the least significant digit. - //BBNodeVec ygtrxqval = BBITE(sign, q1lshift1, BBInc(q1lshift1)); - q1lshift1[0] = nf->CreateNode(NOT, sign); - BBNodeVec ygtrxrval = BBITE(sign, r1lshift1plusyodd, rminusx); - - BBNodeVec notylessxqval; - BBNodeVec notylessxrval; - - /* variant_1 removes the equality check of (x=y). When we get to here I think - that r and q already have the proper values. - Let x =y, so we are solving y/y. - As a first step solve (y/2)/y. - If y != 0, then y/2 < y. (strictly less than). - By the last rule in this block, that will return q=0, r=(y/2) - On return, that will be rightshifted, and the parity bit added back, - giving q = 0, r=y. - By the immediately preceeding rule, 0 <= 0 is true, so q becomes 1, - and r becomes 0. - So q and r are already set correctly when we get here. - - If y=0 & x=0, then (y/2)/0 will return q=0, r=0. - By the preceeding rule 0 <= 0 is true, so q =1, r=0. - So q and r are already set correctly when we get here. - */ - - if (division_variant_1) - { - notylessxqval = q1lshift1; - notylessxrval = ygtrxrval; - } - else - { - // q & r values when y >= x - BBNode yeqx = BBEQ(y, x); - // *** Problem: the bbfill for qval is wrong. Should be 1, not -1. - notylessxqval = BBITE(yeqx, one, q1lshift1); - notylessxrval = BBITE(yeqx, zero, ygtrxrval); - } - - /****************/ - BBNode ylessx; - if (division_variant_2) - { - ylessx = BBBVLE(y, x, false, true); - } - else - { - // y < x <=> not x >= y. - ylessx = nf->CreateNode(NOT, BBBVLE(x, y, false)); - } - - if (division_variant_3) - { - q = notylessxqval; - r = notylessxrval; - } - else - { - // This variant often helps somehow. I don't know why. - // Even though it uses more memory.. - q = BBITE(ylessx, zero, notylessxqval); - r = BBITE(ylessx, y, notylessxrval); - } - } - } - -// build ITE's (ITE cond then[i] else[i]) for each i. - template - BBNodeVec - BitBlaster::BBITE(const BBNode& cond, const BBNodeVec& thn, const BBNodeVec& els) - { - // Fast exits. - if (cond == nf->getTrue()) - { - return thn; - } - else if (cond == nf->getFalse()) - { - return els; - } - - BBNodeVec result; - result.reserve(els.size()); - const typename BBNodeVec::const_iterator th_it_end = thn.end(); - typename BBNodeVec::const_iterator el_it = els.begin(); - for (typename BBNodeVec::const_iterator th_it = thn.begin(); th_it < th_it_end; th_it++, el_it++) - { - result.push_back(nf->CreateNode(ITE, cond, *th_it, *el_it)); - } - return result; - } - -// smt-test/transitive400.smt2 -// Minisat 2: bbbvle_variant = true. 8 ms -// Minisat 2: bbbvle_variant = false. 577 ms - -// Workhorse for comparison routines. This does a signed BVLE if is_signed -// is true, else it's unsigned. All other comparison operators can be reduced -// to this by swapping args or complementing the result bit. - template - BBNode - BitBlaster::BBBVLE(const BBNodeVec& left, const BBNodeVec& right, bool is_signed, - bool is_bvlt) - { - if (bbbvle_variant) - return BBBVLE_variant1(left, right, is_signed, is_bvlt); - else - return BBBVLE_variant2(left, right, is_signed, is_bvlt); - } - - template - BBNode - BitBlaster::BBBVLE_variant1(const BBNodeVec& left_, const BBNodeVec& right_, bool is_signed, - bool is_bvlt) - { - const BBNodeVec& left = !is_bvlt ? left_ : right_; - const BBNodeVec& right = !is_bvlt ? right_ : left_; - - // "thisbit" represents BVLE of the suffixes of the BVs - // from that position . if R < L, return TRUE, else if L < R - // return FALSE, else return BVLE of lower-order bits. MSB is - // treated separately, because signed comparison is done by - // complementing the MSB of each BV, then doing an unsigned - // comparison. - typename BBNodeVec::const_iterator lit = left.begin(); - typename BBNodeVec::const_iterator litend = left.end(); - typename BBNodeVec::const_iterator rit = right.begin(); - BBNode prevbit = nf->getTrue(); - for (; lit < litend - 1; lit++, rit++) - { - BBNode thisbit = nf->CreateNode(ITE, nf->CreateNode(IFF, *rit, *lit), prevbit, *rit); - prevbit = thisbit; - } - - // Handle MSB -- negate MSBs if signed comparison - BBNode lmsb = *lit; - BBNode rmsb = *rit; - if (is_signed) - { - lmsb = nf->CreateNode(NOT, *lit); - rmsb = nf->CreateNode(NOT, *rit); - } - - BBNode msb = nf->CreateNode(ITE, nf->CreateNode(IFF, rmsb, lmsb), prevbit, rmsb); - - if (is_bvlt) - { - msb = nf->CreateNode(NOT, msb); - } - return msb; - } - - template - BBNode - BitBlaster::BBBVLE_variant2(const BBNodeVec& left, const BBNodeVec& right, bool is_signed, - bool is_bvlt) - { - typename BBNodeVec::const_reverse_iterator lit = left.rbegin(); - const typename BBNodeVec::const_reverse_iterator litend = left.rend(); - typename BBNodeVec::const_reverse_iterator rit = right.rbegin(); - - BBNode this_compare_bit = - is_signed ? nf->CreateNode(AND, *lit, nf->CreateNode(NOT, *rit)) : - nf->CreateNode(AND, nf->CreateNode(NOT, *lit), *rit); - - BBNodeVec bit_comparisons; - bit_comparisons.reserve(left.size() + 1); - - bit_comparisons.push_back(this_compare_bit); - - //(lit IFF rit) is the same as (NOT(lit) XOR rit) - BBNode prev_eq_bit = nf->CreateNode(XOR, nf->CreateNode(NOT, *lit), *rit); - for (lit++, rit++; lit < litend; lit++, rit++) - { - this_compare_bit = nf->CreateNode(AND, nf->CreateNode(NOT, *lit), *rit); - - BBNode thisbit_output = nf->CreateNode(AND, this_compare_bit, prev_eq_bit); - bit_comparisons.push_back(thisbit_output); - - BBNode this_eq_bit = nf->CreateNode(AND, nf->CreateNode(XOR, nf->CreateNode(NOT, *lit), *rit), prev_eq_bit); - prev_eq_bit = this_eq_bit; - } - - if (!is_bvlt) - { - bit_comparisons.push_back(prev_eq_bit); - } - - // Either zero or one of the nodes in bit_comparisons can be true. - - BBNode output; -#ifdef CRYPTOMINISAT__2 - if (bit_comparisons.size() > 1) - output = nf->CreateNode(XOR, bit_comparisons); - else - output = bit_comparisons[0]; -#else - output = nf->CreateNode(OR, bit_comparisons); -#endif - return output; - } - -// Left shift within fixed field inserting zeros at LSB. -// Writes result into first argument. - template - void - BitBlaster::BBLShift(BBNodeVec& x, unsigned int shift) - { - // left shift x (destructively) within width. - // loop backwards so that copy to self works correctly. (DON'T use STL insert!) - for (int i = ((int) x.size()) - 1; i >= 0; i--) - { - if (i - (int) shift >= 0) - x[i] = x[i - (int) shift]; - else - x[i] = nf->getFalse(); // new LSB is zero. - } - } - -// Right shift within fixed field inserting zeros at MSB. -// Writes result into first argument. - template - void - BitBlaster::BBRShift(BBNodeVec& x, unsigned int shift) - { - // right shift x (destructively) within width. - const typename BBNodeVec::iterator xend = x.end(); - typename BBNodeVec::iterator xit = x.begin(); - for (; xit < xend; xit++) - { - if (xit + shift < xend) - *xit = *(xit + shift); - else - *xit = nf->getFalse(); // new MSB is zero. - } - } - -// Return bit-blasted form for BVLE, BVGE, BVGT, SBLE, etc. - template - BBNode - BitBlaster::BBcompare(const ASTNode& form, BBNodeSet& support) - { - const BBNodeVec& left = BBTerm(form[0], support); - const BBNodeVec& right = BBTerm(form[1], support); - - const Kind k = form.GetKind(); - switch (k) - { - case BVLE: - { - return BBBVLE(left, right, false); - break; - } - case BVGE: - { - return BBBVLE(right, left, false); - break; - } - case BVGT: - { - return BBBVLE(right, left, false, true); - break; - } - case BVLT: - { - return BBBVLE(left, right, false, true); - break; - } - case BVSLE: - { - return BBBVLE(left, right, true); - break; - } - case BVSGE: - { - return BBBVLE(right, left, true); - break; - } - case BVSGT: - { - return nf->CreateNode(NOT, BBBVLE(left, right, true)); - break; - } - case BVSLT: - { - return nf->CreateNode(NOT, BBBVLE(right, left, true)); - break; - } - default: - cerr << "BBCompare: Illegal kind" << form << endl; - FatalError("", form); - } - } - -// return a vector with n copies of fillval - template - BBNodeVec - BitBlaster::BBfill(unsigned int width, BBNode fillval) - { - BBNodeVec zvec(width, fillval); - return zvec; - } - - template - BBNode - BitBlaster::BBEQ(const BBNodeVec& left, const BBNodeVec& right) - { - BBNodeVec andvec; - andvec.reserve(left.size()); - typename BBNodeVec::const_iterator lit = left.begin(); - const typename BBNodeVec::const_iterator litend = left.end(); - typename BBNodeVec::const_iterator rit = right.begin(); - - if (left.size() > 1) - { - for (; lit != litend; lit++, rit++) - { - BBNode biteq = nf->CreateNode(IFF, *lit, *rit); - // fast path exit - if (biteq == nf->getFalse()) - { - return nf->getFalse(); - } - else - { - andvec.push_back(biteq); - } - } - BBNode n = nf->CreateNode(AND, andvec); - return n; - } - else - return nf->CreateNode(IFF, *lit, *rit); - } - - std::ostream& - operator<<(std::ostream& output, const BBNodeAIG& h) - { - FatalError("This isn't implemented yet sorry;"); - return output; - } - -// This creates all the specialisations of the class that are ever needed. - template class BitBlaster ; - template class BitBlaster ; - -#undef BBNodeVec -#undef BBNodeVecMap -#undef BBNodeSet - -} // BEEV namespace diff --git a/src/vendor/stp/src/to-sat/BitBlaster.h b/src/vendor/stp/src/to-sat/BitBlaster.h deleted file mode 100644 index 9615f129f..000000000 --- a/src/vendor/stp/src/to-sat/BitBlaster.h +++ /dev/null @@ -1,302 +0,0 @@ -// -*- c++ -*- -/******************************************************************** - * AUTHORS: Vijay Ganesh, Trevor Hansen - * - * BEGIN DATE: November, 2005 - * - * LICENSE: Please view LICENSE file in the home dir of this Program - ********************************************************************/ - -#ifndef BITBLASTNEW_H -#define BITBLASTNEW_H - -#include -#include -#include -#include "../STPManager/STPManager.h" -#include "../boost/noncopyable.hpp" -#include -#include "../simplifier/constantBitP/MultiplicationStats.h" - -namespace simplifier -{ - namespace constantBitP - { - class ConstantBitPropagation; - class FixedBits; - } -} - -namespace BEEV -{ - - using std::list; - using simplifier::constantBitP::MultiplicationStats; - - class Simplifier; - class ASTNode; - typedef std::vector ASTVec; - - template - class BitBlaster; - - template - class BitBlaster : boost::noncopyable - { - BBNode BBTrue, BBFalse; - - // Memo table for bit blasted terms. If a node has already been - // bitblasted, it is mapped to a vector of Boolean formulas for - // the - std::map > BBTermMemo; - - // Memo table for bit blasted formulas. If a node has already - // been bitblasted, it is mapped to a node representing the - // bitblasted equivalent - map BBFormMemo; - - /**************************************************************** - * Private Member Functions * - ****************************************************************/ - - // Get vector of Boolean formulas for sum of two - // vectors of Boolean formulas - void - BBPlus2(vector& sum, const vector& y, BBNode cin); - - // Increment - vector - BBInc(const vector& x); - - // Add one bit to a vector of bits. - vector - BBAddOneBit(const vector& x, BBNode cin); - - // Bitwise complement - vector - BBNeg(const vector& x); - - // Unary minus - vector - BBUminus(const vector& x); - - // Multiply. - vector - BBMult(const vector& x, const vector& y, set& support, const ASTNode& n); - void - mult_allPairs(const vector& x, const vector& y, set& support, vector >& products); - void - mult_Booth(const vector& x_i, const vector& y_i, set& support, const BEEV::ASTNode& xN, - const BEEV::ASTNode& yN, vector >& products, const ASTNode&n); - vector - mult_normal(const vector& x, const vector& y, set& support, const ASTNode&n); - - - vector batcher(const vector& in); - vector mergeSorted(const vector& in1, const vector& in2); - vector compareOddEven(const vector& in); - - - - void setColumnsToZero(vector >& products, set& support,const ASTNode&n); - - - void - sortingNetworkAdd(set& support, list& current, vector& currentSorted, vector& priorSorted); - - - vector v6(vector >& products, set& support, const ASTNode&n); - vector v7(vector >& products, set& support, const ASTNode&n); - vector v8(vector >& products, set& support, const ASTNode&n); - vector v9(vector >& products, set& support, const ASTNode&n); - vector v13(vector >& products, set& support, const ASTNode&n); - - - vector - multWithBounds(const ASTNode&n, vector >& products, set& toConjoinToTop); - bool - statsFound(const ASTNode& n); - - void - mult_BubbleSorterWithBounds(set& support, list& currentColumn, vector& currentSorted, - vector& priorSorted, const int minTrue = 0, const int maxTrue = ((unsigned) ~0) >> 1); - - void - buildAdditionNetworkResult(list& from, list& to, set& support, - const bool top, const bool empty); - vector - buildAdditionNetworkResult(vector >& products, set& support, const ASTNode& n); - - vector - BBAndBit(const vector& y, BBNode b); - - MultiplicationStats* - getMS(const ASTNode&n, int& highestZero); - - /////////// The end of the multiplication stuff.. - - void - checkFixed(const vector& v, const ASTNode& n); - - // AND each bit of vector y with single bit b and return the result. - // (used in BBMult) - //vector BBAndBit(const vector& y, ASTNode b); - - // Returns vector for result - y. This destroys "result". - void - BBSub(vector& result, const vector& y, set& support); - - // build ITE's (ITE cond then[i] else[i]) for each i. - vector - BBITE(const BBNode& cond, const vector& thn, const vector& els); - - // Build a vector of zeros. - vector - BBfill(unsigned int width, BBNode fillval); - - // build an EQ formula - BBNode - BBEQ(const vector& left, const vector& right); - - // This implements a variant of binary long division. - // q and r are "out" parameters. rwidth puts a bound on the - // recursion depth. Unsigned only, for now. - - void - BBDivMod(const vector &y, const vector &x, vector &q, vector &r, - unsigned int rwidth, set& support); - - // Return formula for majority function of three formulas. - BBNode - Majority(const BBNode& a, const BBNode& b, const BBNode& c); - - // Internal bit blasting routines. - BBNode - BBBVLE(const vector& x, const vector& y, bool is_signed, bool is_bvlt = false); - BBNode - BBBVLE_variant1(const vector& x, const vector& y, bool is_signed, bool is_bvlt = false); - BBNode - BBBVLE_variant2(const vector& x, const vector& y, bool is_signed, bool is_bvlt = false); - - // Return bit-blasted form for BVLE, BVGE, BVGT, SBLE, etc. - BBNode - BBcompare(const ASTNode& form, set& support); - - void - BBLShift(vector& x, unsigned int shift); - void - BBRShift(vector& x, unsigned int shift); - - // no copy, no assign. - BitBlaster& - operator =(const BitBlaster& other); - BitBlaster(const BitBlaster& other); - - // Checks for constants. - void - commonCheck(const ASTNode& n); - void - check(const BBNode& x, const ASTNode& n); - void - check(const vector& x, const ASTNode& n); - - bool - update(const ASTNode&n, const int i, simplifier::constantBitP::FixedBits*b, BBNode& bb, set& support); - void - updateTerm(const ASTNode&n, vector& bb, set& support); - void - updateForm(const ASTNode&n, BBNode& bb, set& support); - - const BBNode - BBForm(const ASTNode& form, set& support); - - bool - isConstant(const vector& v); - ASTNode - getConstant(const vector& v, const ASTNode&n); - - // Nodes in this set can be replaced by their constant values, without being - // conjoined to the top.. - ASTNodeSet fixedFromBottom; - - UserDefinedFlags *uf; - NodeFactory* ASTNF; - Simplifier* simp; - BBNodeManagerT* nf; - - // You can select these with any combination you want of true & false. - const bool division_variant_1; - const bool division_variant_2; - const bool division_variant_3; - const bool adder_variant; - const bool bbbvle_variant; - const bool upper_multiplication_bound; - const bool bvplus_variant; - - const string multiplication_variant; - - ASTNodeSet booth_recoded; // Nodes that have been recoded. - - public: - - simplifier::constantBitP::ConstantBitPropagation* cb; - - // Bit blast a bitvector term. The term must have a kind for a - // bitvector term. Result is a ref to a vector of formula nodes - // representing the boolean formula. - const vector - BBTerm(const ASTNode& term, set& support); - - /**************************************************************** - * Public Member Functions * - ****************************************************************/ - - BitBlaster(BBNodeManagerT* bnm, Simplifier* _simp, NodeFactory *astNodeF, UserDefinedFlags *_uf, - simplifier::constantBitP::ConstantBitPropagation *cb_ = NULL) : - uf(_uf), - division_variant_1("1" == _uf->get("division_variant_1", "1")), - division_variant_2("1" == _uf->get("division_variant_2", "1")), - division_variant_3("1" == _uf->get("division_variant_3", "1")), - - multiplication_variant(_uf->get("multiplication_variant", "7")), - upper_multiplication_bound("1" == _uf->get("upper_multiplication_bound", "0")), - - adder_variant("1" == _uf->get("adder_variant", "1")), - - bbbvle_variant("1" == _uf->get("bbbvle_variant", "0")), - - bvplus_variant("1" == _uf->get("bvplus_variant", "1")) - { - nf = bnm; - cb = cb_; - BBTrue = nf->getTrue(); - BBFalse = nf->getFalse(); - simp = _simp; - ASTNF = astNodeF; - } - - void - ClearAllTables() - { - BBTermMemo.clear(); - BBFormMemo.clear(); - } - - ~BitBlaster() - { - ClearAllTables(); - } - - //Bitblast a formula - const BBNode - BBForm(const ASTNode& form); - - void - getConsts(const ASTNode& n, ASTNodeMap& fromTo, ASTNodeMap& equivs); - - }; -//end of class BitBlaster -} -; -//end of namespace -#endif diff --git a/src/vendor/stp/src/to-sat/Makefile b/src/vendor/stp/src/to-sat/Makefile deleted file mode 100644 index 0da852067..000000000 --- a/src/vendor/stp/src/to-sat/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -SRCTOP = .. -include $(SRCTOP)/Makefile.common - -SRCS = $(wildcard *.cpp) -SRCS += $(wildcard AIG/*.cpp) -SRCS += $(wildcard ASTNode/*.cpp) -OBJS = $(SRCS:.cpp=.o) - -libtosat.a: $(OBJS) - $(RM) $@ - $(AR) qcs $@ $^ - -.PHONY: clean -clean: - $(RM) *.o */*.o *~ *.a .#* depend - -depend: $(SRCS) - @$(call makedepend,$@,$(SRCS)) - --include depend diff --git a/src/vendor/stp/src/to-sat/ToSATBase.cpp b/src/vendor/stp/src/to-sat/ToSATBase.cpp deleted file mode 100644 index 03d971d2a..000000000 --- a/src/vendor/stp/src/to-sat/ToSATBase.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "ToSATBase.h" - -namespace BEEV -{ - - //This function prints the output of the STP solver - void ToSATBase::PrintOutput(SOLVER_RETURN_TYPE ret) - { - bool true_iff_valid = (SOLVER_VALID == ret); - - if (bm->UserFlags.print_output_flag) - { - if (bm->UserFlags.smtlib1_parser_flag || bm->UserFlags.smtlib2_parser_flag) - { - if (true_iff_valid && - (input_status == TO_BE_SATISFIABLE)) - { - cerr << "Warning. Expected satisfiable,"\ - " FOUND unsatisfiable" << endl; - } - else if (!true_iff_valid && - (input_status == TO_BE_UNSATISFIABLE)) - { - cerr << "Warning. Expected unsatisfiable,"\ - " FOUND satisfiable" << endl; - } - } - } - - if (true_iff_valid) - { - bm->ValidFlag = true; - if (bm->UserFlags.print_output_flag) - { - if (bm->UserFlags.smtlib1_parser_flag || bm->UserFlags.smtlib2_parser_flag) - cout << "unsat\n"; - else - cout << "Valid.\n"; - } - } - else - { - bm->ValidFlag = false; - if (bm->UserFlags.print_output_flag) - { - if (bm->UserFlags.smtlib1_parser_flag || bm->UserFlags.smtlib2_parser_flag) - cout << "sat\n"; - else - cout << "Invalid.\n"; - } - } - - flush(cout); - } //end of PrintOutput() - -} diff --git a/src/vendor/stp/src/to-sat/ToSATBase.h b/src/vendor/stp/src/to-sat/ToSATBase.h deleted file mode 100644 index 19ad15e80..000000000 --- a/src/vendor/stp/src/to-sat/ToSATBase.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef TOSATBASE_H -#define TOSATBASE_H - -#include "../AST/AST.h" -#include "../STPManager/STPManager.h" -#include "../boost/noncopyable.hpp" - -namespace BEEV -{ - class ToSATBase : boost::noncopyable - { - protected: - ASTNode ASTTrue, ASTFalse, ASTUndefined; - - // Ptr to STPManager - STPMgr * bm; - - public: - - typedef HASHMAP< - ASTNode, - vector, - ASTNode::ASTNodeHasher, - ASTNode::ASTNodeEqual> ASTNodeToSATVar; - - // Constructor - ToSATBase(STPMgr * bm) : - bm(bm) - { - ASTTrue = bm->CreateNode(TRUE); - ASTFalse = bm->CreateNode(FALSE); - ASTUndefined = bm->CreateNode(UNDEFINED); - } - - virtual ~ToSATBase() - {} - - //print the STP solver output - void PrintOutput(SOLVER_RETURN_TYPE ret); - - // Bitblasts, CNF conversion and calls toSATandSolve() - virtual bool CallSAT(SATSolver& SatSolver, const ASTNode& input, bool doesAbsRef) =0; - - virtual ASTNodeToSATVar& SATVar_to_SymbolIndexMap()= 0; - - virtual void ClearAllTables(void) =0; - }; -} - -#endif diff --git a/src/vendor/stp/src_stub/.gitignore b/src/vendor/stp/src_stub/.gitignore deleted file mode 100644 index 80e3a0275..000000000 --- a/src/vendor/stp/src_stub/.gitignore +++ /dev/null @@ -1 +0,0 @@ -libstp_stub.so diff --git a/src/vendor/stp/src_stub/Makefile b/src/vendor/stp/src_stub/Makefile deleted file mode 100644 index fe24c4b0e..000000000 --- a/src/vendor/stp/src_stub/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -PWD:=$(shell pwd) -TOP:=$(PWD)/../../../.. - -include $(TOP)/platform.mk - -RM ?= rm -rf -CP ?= cp - -LIB_DIR=../lib -INC_DIR=../include - -ifeq ($(OSTYPE), Darwin) -LDFLAGS = -dynamiclib -Wl,-install_name,libstp_stub.so -else -LDFLAGS = -shared -Wl,-soname,libstp_stub.so -endif - -.PHONY: all -all: install - -stp_stub.o: stp_stub.c stp_c_interface.h - $(CC) $(CFLAGS) -c -o $@ $< - -libstp_stub.so: stp_stub.o - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< - -libstp.so: libstp_stub.so - $(RM) $@ - ln -s $< $@ - -install: libstp_stub.so - mkdir -p $(LIB_DIR) - $(CP) libstp_stub.so $(LIB_DIR)/ - ln -fsn libstp.so.1 $(LIB_DIR)/libstp.so - ln -fsn libstp_stub.so $(LIB_DIR)/libstp.so.1 - mkdir -p $(INC_DIR) - $(CP) stp_c_interface.h $(INC_DIR)/ - -.PHONY: clean full_clean - -clean: - $(RM) *.o *.so - -full_clean: clean - $(RM) -R $(LIB_DIR) - $(RM) -R $(INC_DIR) - - - diff --git a/src/vendor/stp/src_stub/stp_c_interface.h b/src/vendor/stp/src_stub/stp_c_interface.h deleted file mode 100644 index c1b42f64a..000000000 --- a/src/vendor/stp/src_stub/stp_c_interface.h +++ /dev/null @@ -1,483 +0,0 @@ -/******************************************************************** - * AUTHORS: Vijay Ganesh - * - * BEGIN DATE: November, 2005 - * - * License to use, copy, modify, sell and/or distribute this software - * and its documentation for any purpose is hereby granted without - * royalty, subject to the terms and conditions defined in the \ref - * LICENSE file provided with this distribution. In particular: - * - * - The above copyright notice and this permission notice must appear - * in all copies of the software and related documentation. - * - * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES, - * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK. - ********************************************************************/ -// -*- c++ -*- - -#ifndef _cvcl__include__c_interface_h_ -#define _cvcl__include__c_interface_h_ - -#ifdef __cplusplus -#define _CVCL_DEFAULT_ARG(v) =v -#else -#define _CVCL_DEFAULT_ARG(v) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#ifdef STP_STRONG_TYPING -#else - //This gives absolutely no pointer typing at compile-time. Most C - //users prefer this over stronger typing. User is the king. A - //stronger typed interface is in the works. - typedef void* VC; - typedef void* Expr; - typedef void* Type; - typedef void* WholeCounterExample; -#endif - - // o : optimizations - // c : check counterexample - // p : print counterexample - // h : help - // s : stats - // v : print nodes - - // The "num_absrefine" argument isn't used at all. It's left for compatibility with existing code. - void vc_setFlags(VC vc, char c, int num_absrefine _CVCL_DEFAULT_ARG(0)); - void vc_setFlag(VC vc, char c); - - //! Interface-only flags. - enum ifaceflag_t { - /*! EXPRDELETE: boolean, default true. For objects created by - vc_arrayType, vc_bvType, vc_bv32Type, vc_bvConstExprFromInt, if - this flag is set both at the time the objects are created and at - the time that vc_Destroy is called, vc_Destroy will automatically - delete them. */ - EXPRDELETE, - MS, - SMS, - CMS2, - MSP - - }; - void vc_setInterfaceFlags(VC vc, enum ifaceflag_t f, int param_value); - - // defines division by zero to equal 1, x%0 to equal x. - // avoids division by zero errors. - void make_division_total(VC vc); - - //! Flags can be NULL - VC vc_createValidityChecker(void); - - // Basic types - Type vc_boolType(VC vc); - - //! Create an array type - Type vc_arrayType(VC vc, Type typeIndex, Type typeData); - - ///////////////////////////////////////////////////////////////////////////// - // Expr manipulation methods // - ///////////////////////////////////////////////////////////////////////////// - - //! Create a variable with a given name and type - /*! The type cannot be a function type. The var name can contain - only variables, numerals and underscore. If you use any other - symbol, you will get a segfault. */ - Expr vc_varExpr(VC vc, const char * name, Type type); - - //The var name can contain only variables, numerals and - //underscore. If you use any other symbol, you will get a segfault. - Expr vc_varExpr1(VC vc, const char* name, - int indexwidth, int valuewidth); - - //! Get the expression and type associated with a name. - /*! If there is no such Expr, a NULL Expr is returned. */ - //Expr vc_lookupVar(VC vc, char* name, Type* type); - - //! Get the type of the Expr. - Type vc_getType(VC vc, Expr e); - - int vc_getBVLength(VC vc, Expr e); - - //! Create an equality expression. The two children must have the same type. - Expr vc_eqExpr(VC vc, Expr child0, Expr child1); - - // Boolean expressions - - // The following functions create Boolean expressions. The children - // provided as arguments must be of type Boolean (except for the - // function vc_iteExpr(). In the case of vc_iteExpr() the - // conditional must always be Boolean, but the ifthenpart - // (resp. elsepart) can be bit-vector or Boolean type. But, the - // ifthenpart and elsepart must be both of the same type) - Expr vc_trueExpr(VC vc); - Expr vc_falseExpr(VC vc); - Expr vc_notExpr(VC vc, Expr child); - Expr vc_andExpr(VC vc, Expr left, Expr right); - Expr vc_andExprN(VC vc, Expr* children, int numOfChildNodes); - Expr vc_orExpr(VC vc, Expr left, Expr right); - Expr vc_xorExpr(VC vc, Expr left, Expr right); - Expr vc_orExprN(VC vc, Expr* children, int numOfChildNodes); - Expr vc_impliesExpr(VC vc, Expr hyp, Expr conc); - Expr vc_iffExpr(VC vc, Expr left, Expr right); - //The output type of vc_iteExpr can be Boolean (formula-level ite) - //or bit-vector (word-level ite) - Expr vc_iteExpr(VC vc, Expr conditional, Expr ifthenpart, Expr elsepart); - - //Boolean to single bit BV Expression - Expr vc_boolToBVExpr(VC vc, Expr form); - - //Parameterized Boolean Expression (PARAMBOOL, Boolean_Var, parameter) - Expr vc_paramBoolExpr(VC vc, Expr var, Expr param); - - // Arrays - - //! Create an expression for the value of array at the given index - Expr vc_readExpr(VC vc, Expr array, Expr index); - - //! Array update; equivalent to "array WITH [index] := newValue" - Expr vc_writeExpr(VC vc, Expr array, Expr index, Expr newValue); - - // Expr I/O: Parses directly from file in the c_interface. pretty cool!! - Expr vc_parseExpr(VC vc, const char* s); - - //! Prints 'e' to stdout. - void vc_printExpr(VC vc, Expr e); - - //! Prints 'e' to stdout as C code - void vc_printExprCCode(VC vc, Expr e); - - //! print in smtlib format - char * vc_printSMTLIB(VC vc, Expr e); - - //! Prints 'e' into an open file descriptor 'fd' - void vc_printExprFile(VC vc, Expr e, int fd); - - //! Prints state of 'vc' into malloc'd buffer '*buf' and stores the - // length into '*len'. It is the responsibility of the caller to - // free the buffer. - //void vc_printStateToBuffer(VC vc, char **buf, unsigned long *len); - - //! Prints 'e' to malloc'd buffer '*buf'. Sets '*len' to the length of - // the buffer. It is the responsibility of the caller to free the buffer. - void vc_printExprToBuffer(VC vc, Expr e, char **buf, unsigned long * len); - - //! Prints counterexample to stdout. - void vc_printCounterExample(VC vc); - - //! Prints variable declarations to stdout. - void vc_printVarDecls(VC vc); - - //! Clear the internal list of variables to declare maintained for - // vc_printVarDecls. Do this after you've printed them, or if you - // never want to print them, to prevent a memory leak. - void vc_clearDecls(VC vc); - - //! Prints asserts to stdout. The flag simplify_print must be set to - //"1" if you wish simplification to occur dring printing. It must be - //set to "0" otherwise - void vc_printAsserts(VC vc, int simplify_print _CVCL_DEFAULT_ARG(0)); - - //! Prints the state of the query to malloc'd buffer '*buf' and - //stores ! the length of the buffer to '*len'. It is the - //responsibility of the caller to free the buffer. The flag - //simplify_print must be set to "1" if you wish simplification to - //occur dring printing. It must be set to "0" otherwise - void vc_printQueryStateToBuffer(VC vc, Expr e, - char **buf, unsigned long *len, int simplify_print); - - //! Similar to vc_printQueryStateToBuffer() - void vc_printCounterExampleToBuffer(VC vc, char **buf,unsigned long *len); - - //! Prints query to stdout. - void vc_printQuery(VC vc); - - ///////////////////////////////////////////////////////////////////////////// - // Context-related methods // - ///////////////////////////////////////////////////////////////////////////// - - //! Assert a new formula in the current context. - /*! The formula must have Boolean type. */ - void vc_assertFormula(VC vc, Expr e); - - //! Simplify e with respect to the current context - Expr vc_simplify(VC vc, Expr e); - - //! Check validity of e in the current context. e must be a FORMULA - //returns 0 -> the input is INVALID - //returns 1 -> the input is VALID - //returns 2 -> then ERROR - //returns 3 -> then TIMEOUT - - // NB. The timeout is a soft timeout, use the -g flag for a hard timeout that - // will abort automatically. The soft timeout is checked sometimes in the code, - // and if the time has passed, then "timeout" will be returned. It's only checked - // sometimes though, so the actual timeout may be larger. Cryptominisat doesn't check - // the timeout yet.. - - // The C-language doesn't allow default arguments, so to get it compiling, I've split - // it into two functions. - int vc_query_with_timeout(VC vc, Expr e, int timeout_ms); - int vc_query(VC vc, Expr e); - - - //! Return the counterexample after a failed query. - Expr vc_getCounterExample(VC vc, Expr e); - - //! Return an array from a counterexample after a failed query. - void vc_getCounterExampleArray(VC vc, Expr e, Expr **indices, Expr **values, int *size); - - //! get size of counterexample, i.e. the number of variables/array - //locations in the counterexample. - int vc_counterexample_size(VC vc); - - //! Checkpoint the current context and increase the scope level - void vc_push(VC vc); - - //! Restore the current context to its state at the last checkpoint - void vc_pop(VC vc); - - //! Return an int from a constant bitvector expression - int getBVInt(Expr e); - //! Return an unsigned int from a constant bitvector expression - unsigned int getBVUnsigned(Expr e); - //! Return an unsigned long long int from a constant bitvector expressions - unsigned long long int getBVUnsignedLongLong(Expr e); - - /**************************/ - /* BIT VECTOR OPERATIONS */ - /**************************/ - Type vc_bvType(VC vc, int no_bits); - Type vc_bv32Type(VC vc); - - Expr vc_bvConstExprFromDecStr(VC vc, int width, const char* decimalInput ); - Expr vc_bvConstExprFromStr(VC vc, const char* binary_repr); - Expr vc_bvConstExprFromInt(VC vc, int n_bits, unsigned int value); - Expr vc_bvConstExprFromLL(VC vc, int n_bits, unsigned long long value); - Expr vc_bv32ConstExprFromInt(VC vc, unsigned int value); - - Expr vc_bvConcatExpr(VC vc, Expr left, Expr right); - Expr vc_bvPlusExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bvPlusExprN(VC vc, int n_bits, Expr* children, int numOfChildNodes); - Expr vc_bv32PlusExpr(VC vc, Expr left, Expr right); - Expr vc_bvMinusExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bv32MinusExpr(VC vc, Expr left, Expr right); - Expr vc_bvMultExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bv32MultExpr(VC vc, Expr left, Expr right); - // left divided by right i.e. left/right - Expr vc_bvDivExpr(VC vc, int n_bits, Expr left, Expr right); - // left modulo right i.e. left%right - Expr vc_bvModExpr(VC vc, int n_bits, Expr left, Expr right); - // signed left divided by right i.e. left/right - Expr vc_sbvDivExpr(VC vc, int n_bits, Expr left, Expr right); - // signed left modulo right i.e. left%right - Expr vc_sbvModExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_sbvRemExpr(VC vc, int n_bits, Expr left, Expr right); - - Expr vc_bvLtExpr(VC vc, Expr left, Expr right); - Expr vc_bvLeExpr(VC vc, Expr left, Expr right); - Expr vc_bvGtExpr(VC vc, Expr left, Expr right); - Expr vc_bvGeExpr(VC vc, Expr left, Expr right); - - Expr vc_sbvLtExpr(VC vc, Expr left, Expr right); - Expr vc_sbvLeExpr(VC vc, Expr left, Expr right); - Expr vc_sbvGtExpr(VC vc, Expr left, Expr right); - Expr vc_sbvGeExpr(VC vc, Expr left, Expr right); - - Expr vc_bvUMinusExpr(VC vc, Expr child); - - // bitwise operations: these are terms not formulas - Expr vc_bvAndExpr(VC vc, Expr left, Expr right); - Expr vc_bvOrExpr(VC vc, Expr left, Expr right); - Expr vc_bvXorExpr(VC vc, Expr left, Expr right); - Expr vc_bvNotExpr(VC vc, Expr child); - - // Shift an expression by another expression. This is newstyle. - Expr vc_bvLeftShiftExprExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bvRightShiftExprExpr(VC vc, int n_bits, Expr left, Expr right); - Expr vc_bvSignedRightShiftExprExpr(VC vc, int n_bits, Expr left, Expr right); - - // These shifts are old-style. Kept for compatability---oldstyle. - Expr vc_bvLeftShiftExpr(VC vc, int sh_amt, Expr child); - Expr vc_bvRightShiftExpr(VC vc, int sh_amt, Expr child); - /* Same as vc_bvLeftShift only that the answer in 32 bits long */ - Expr vc_bv32LeftShiftExpr(VC vc, int sh_amt, Expr child); - /* Same as vc_bvRightShift only that the answer in 32 bits long */ - Expr vc_bv32RightShiftExpr(VC vc, int sh_amt, Expr child); - Expr vc_bvVar32LeftShiftExpr(VC vc, Expr sh_amt, Expr child); - Expr vc_bvVar32RightShiftExpr(VC vc, Expr sh_amt, Expr child); - Expr vc_bvVar32DivByPowOfTwoExpr(VC vc, Expr child, Expr rhs); - - Expr vc_bvExtract(VC vc, Expr child, int high_bit_no, int low_bit_no); - - //accepts a bitvector and position, and returns a boolean - //corresponding to that position. More precisely, it return the - //equation (x[bit_no:bit_no] == 0) - Expr vc_bvBoolExtract(VC vc, Expr x, int bit_no); - Expr vc_bvBoolExtract_Zero(VC vc, Expr x, int bit_no); - - //accepts a bitvector and position, and returns a boolean - //corresponding to that position. More precisely, it return the - //equation (x[bit_no:bit_no] == 1) - Expr vc_bvBoolExtract_One(VC vc, Expr x, int bit_no); - Expr vc_bvSignExtend(VC vc, Expr child, int nbits); - - /*C pointer support: C interface to support C memory arrays in CVCL */ - Expr vc_bvCreateMemoryArray(VC vc, const char * arrayName); - Expr vc_bvReadMemoryArray(VC vc, - Expr array, Expr byteIndex, int numOfBytes); - Expr vc_bvWriteToMemoryArray(VC vc, - Expr array, Expr byteIndex, - Expr element, int numOfBytes); - Expr vc_bv32ConstExprFromInt(VC vc, unsigned int value); - - // return a string representation of the Expr e. The caller is responsible - // for deallocating the string with free() - char* exprString(Expr e); - - // return a string representation of the Type t. The caller is responsible - // for deallocating the string with free() - char* typeString(Type t); - - Expr getChild(Expr e, int i); - - //1.if input expr is TRUE then the function returns 1; - // - //2.if input expr is FALSE then function returns 0; - // - //3.otherwise the function returns -1 - int vc_isBool(Expr e); - - /* Register the given error handler to be called for each fatal error.*/ - void vc_registerErrorHandler(void (*error_hdlr)(const char* err_msg)); - - int vc_getHashQueryStateToBuffer(VC vc, Expr query); - - //destroys the STP instance, and removes all the created expressions - void vc_Destroy(VC vc); - - //deletes the expression e - void vc_DeleteExpr(Expr e); - - //Get the whole counterexample from the current context - WholeCounterExample vc_getWholeCounterExample(VC vc); - - //Get the value of a term expression from the CounterExample - Expr vc_getTermFromCounterExample(VC vc, Expr e, WholeCounterExample c); - - - // Free the return value of vc_getWholeCounterExample - void vc_deleteWholeCounterExample(WholeCounterExample cc); - - //Kinds of Expr - enum exprkind_t{ - UNDEFINED, - SYMBOL, - BVCONST, - BVNEG, - BVCONCAT, - BVOR, - BVAND, - BVXOR, - BVNAND, - BVNOR, - BVXNOR, - BVEXTRACT, - BVLEFTSHIFT, - BVRIGHTSHIFT, - BVSRSHIFT, - BVVARSHIFT, - BVPLUS, - BVSUB, - BVUMINUS, - BVMULTINVERSE, - BVMULT, - BVDIV, - BVMOD, - SBVDIV, - SBVREM, - SBVMOD, - BVSX, - BVZX, - ITE, - BVGETBIT, - BVLT, - BVLE, - BVGT, - BVGE, - BVSLT, - BVSLE, - BVSGT, - BVSGE, - EQ, - FALSE, - TRUE, - NOT, - AND, - OR, - NAND, - NOR, - XOR, - IFF, - IMPLIES, - PARAMBOOL, - READ, - WRITE, - ARRAY, - BITVECTOR, - BOOLEAN - } ; - - // type of expression - enum type_t { - BOOLEAN_TYPE = 0, - BITVECTOR_TYPE, - ARRAY_TYPE, - UNKNOWN_TYPE - }; - - // get the kind of the expression - enum exprkind_t getExprKind (Expr e); - - // get the number of children nodes - int getDegree (Expr e); - - // get the bv length - int getBVLength(Expr e); - - // get expression type - enum type_t getType (Expr e); - - // get value bit width - int getVWidth (Expr e); - - // get index bit width - int getIWidth (Expr e); - - // Prints counterexample to an open file descriptor 'fd' - void vc_printCounterExampleFile(VC vc, int fd); - - // get name of expression. must be a variable. - const char* exprName(Expr e); - - // get the node ID of an Expr. - int getExprID (Expr ex); - - // parse the expr from memory string! - int vc_parseMemExpr(VC vc, const char* s, Expr* oquery, Expr* oasserts ); -#ifdef __cplusplus -} -#endif - -#undef _CVCL_DEFAULT_ARG - -#endif - - diff --git a/src/vendor/stp/src_stub/stp_stub.c b/src/vendor/stp/src_stub/stp_stub.c deleted file mode 100644 index 6e4bccab6..000000000 --- a/src/vendor/stp/src_stub/stp_stub.c +++ /dev/null @@ -1,475 +0,0 @@ -#include "stp_c_interface.h" - -void vc_setFlags(VC vc, char c, int num_absrefine) { -} - -void vc_setFlag(VC vc, char c) { -} - -void vc_setInterfaceFlags(VC vc, enum ifaceflag_t f, int param_value) { -} - -void make_division_total(VC vc) { -} - -VC vc_createValidityChecker(void) { - return 0; -} - -Type vc_boolType(VC vc) { - return 0; -} - -Type vc_arrayType(VC vc, Type typeIndex, Type typeData) { - return 0; -} - -Expr vc_varExpr(VC vc, const char * name, Type type) { - return 0; -} - -Expr vc_varExpr1(VC vc, const char* name, - int indexwidth, int valuewidth) { - return 0; -} - -Type vc_getType(VC vc, Expr e) { - return 0; -} - -int vc_getBVLength(VC vc, Expr e) { - return 0; -} - -Expr vc_eqExpr(VC vc, Expr child0, Expr child1) { - return 0; -} - -Expr vc_trueExpr(VC vc) { - return 0; -} - -Expr vc_falseExpr(VC vc) { - return 0; -} - -Expr vc_notExpr(VC vc, Expr child) { - return 0; -} - -Expr vc_andExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_andExprN(VC vc, Expr* children, int numOfChildNodes) { - return 0; -} - -Expr vc_orExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_xorExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_orExprN(VC vc, Expr* children, int numOfChildNodes) { - return 0; -} - -Expr vc_impliesExpr(VC vc, Expr hyp, Expr conc) { - return 0; -} - -Expr vc_iffExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_iteExpr(VC vc, Expr conditional, Expr ifthenpart, Expr elsepart) { - return 0; -} - -Expr vc_boolToBVExpr(VC vc, Expr form) { - return 0; -} - -Expr vc_paramBoolExpr(VC vc, Expr var, Expr param) { - return 0; -} - -Expr vc_readExpr(VC vc, Expr array, Expr index) { - return 0; -} - -Expr vc_writeExpr(VC vc, Expr array, Expr index, Expr newValue) { - return 0; -} - -Expr vc_parseExpr(VC vc, const char* s) { - return 0; -} - -void vc_printExpr(VC vc, Expr e) { -} - -void vc_printExprCCode(VC vc, Expr e) { -} - -char * vc_printSMTLIB(VC vc, Expr e) { - return 0; -} - -void vc_printExprFile(VC vc, Expr e, int fd) { -} - -void vc_printExprToBuffer(VC vc, Expr e, char **buf, unsigned long * len) { -} - -void vc_printCounterExample(VC vc) { -} - -void vc_printVarDecls(VC vc) { -} - -void vc_clearDecls(VC vc) { -} - -void vc_printAsserts(VC vc, int simplify_print) { -} - -void vc_printQueryStateToBuffer(VC vc, Expr e, - char **buf, unsigned long *len, int simplify_print) { -} - -void vc_printCounterExampleToBuffer(VC vc, char **buf,unsigned long *len) { -} - -void vc_printQuery(VC vc) { -} - -void vc_assertFormula(VC vc, Expr e) { -} - -Expr vc_simplify(VC vc, Expr e) { - return 0; -} - -int vc_query_with_timeout(VC vc, Expr e, int timeout_ms) { - return 0; -} - -int vc_query(VC vc, Expr e) { - return 0; -} - -Expr vc_getCounterExample(VC vc, Expr e) { - return 0; -} - -void vc_getCounterExampleArray(VC vc, Expr e, Expr **indices, Expr **values, int *size) { -} - -int vc_counterexample_size(VC vc) { - return 0; -} - -void vc_push(VC vc) { -} - -void vc_pop(VC vc) { -} - -int getBVInt(Expr e) { - return 0; -} - -unsigned int getBVUnsigned(Expr e) { - return 0; -} - -unsigned long long int getBVUnsignedLongLong(Expr e) { - return 0; -} - -Type vc_bvType(VC vc, int no_bits) { - return 0; -} - -Type vc_bv32Type(VC vc) { - return 0; -} - -Expr vc_bvConstExprFromDecStr(VC vc, int width, const char* decimalInput ) { - return 0; -} - -Expr vc_bvConstExprFromStr(VC vc, const char* binary_repr) { - return 0; -} - -Expr vc_bvConstExprFromInt(VC vc, int n_bits, unsigned int value) { - return 0; -} - -Expr vc_bvConstExprFromLL(VC vc, int n_bits, unsigned long long value) { - return 0; -} - -Expr vc_bv32ConstExprFromInt(VC vc, unsigned int value) { - return 0; -} - -Expr vc_bvConcatExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvPlusExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bvPlusExprN(VC vc, int n_bits, Expr* children, int numOfChildNodes) { - return 0; -} - -Expr vc_bv32PlusExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvMinusExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bv32MinusExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvMultExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bv32MultExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvDivExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bvModExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_sbvDivExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_sbvModExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_sbvRemExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bvLtExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvLeExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvGtExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvGeExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_sbvLtExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_sbvLeExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_sbvGtExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_sbvGeExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvUMinusExpr(VC vc, Expr child) { - return 0; -} - -Expr vc_bvAndExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvOrExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvXorExpr(VC vc, Expr left, Expr right) { - return 0; -} - -Expr vc_bvNotExpr(VC vc, Expr child) { - return 0; -} - -Expr vc_bvLeftShiftExprExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bvRightShiftExprExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bvSignedRightShiftExprExpr(VC vc, int n_bits, Expr left, Expr right) { - return 0; -} - -Expr vc_bvLeftShiftExpr(VC vc, int sh_amt, Expr child) { - return 0; -} - -Expr vc_bvRightShiftExpr(VC vc, int sh_amt, Expr child) { - return 0; -} - -Expr vc_bv32LeftShiftExpr(VC vc, int sh_amt, Expr child) { - return 0; -} - -Expr vc_bv32RightShiftExpr(VC vc, int sh_amt, Expr child) { - return 0; -} - -Expr vc_bvVar32LeftShiftExpr(VC vc, Expr sh_amt, Expr child) { - return 0; -} - -Expr vc_bvVar32RightShiftExpr(VC vc, Expr sh_amt, Expr child) { - return 0; -} - -Expr vc_bvVar32DivByPowOfTwoExpr(VC vc, Expr child, Expr rhs) { - return 0; -} - -Expr vc_bvExtract(VC vc, Expr child, int high_bit_no, int low_bit_no) { - return 0; -} - -Expr vc_bvBoolExtract(VC vc, Expr x, int bit_no) { - return 0; -} - -Expr vc_bvBoolExtract_Zero(VC vc, Expr x, int bit_no) { - return 0; -} - -Expr vc_bvBoolExtract_One(VC vc, Expr x, int bit_no) { - return 0; -} - -Expr vc_bvSignExtend(VC vc, Expr child, int nbits) { - return 0; -} - -Expr vc_bvCreateMemoryArray(VC vc, const char * arrayName) { - return 0; -} - -Expr vc_bvReadMemoryArray(VC vc, - Expr array, Expr byteIndex, int numOfBytes) { - return 0; -} - -Expr vc_bvWriteToMemoryArray(VC vc, - Expr array, Expr byteIndex, - Expr element, int numOfBytes) { - return 0; -} - -char* exprString(Expr e) { - return 0; -} - -char* typeString(Type t) { - return 0; -} - -Expr getChild(Expr e, int i) { - return 0; -} - -int vc_isBool(Expr e) { - return 0; -} - -void vc_registerErrorHandler(void (*error_hdlr)(const char* err_msg)) { -} - -int vc_getHashQueryStateToBuffer(VC vc, Expr query) { - return 0; -} - -void vc_Destroy(VC vc) { -} - -void vc_DeleteExpr(Expr e) { -} - -WholeCounterExample vc_getWholeCounterExample(VC vc) { - return 0; -} - -Expr vc_getTermFromCounterExample(VC vc, Expr e, WholeCounterExample c) { - return 0; -} - -void vc_deleteWholeCounterExample(WholeCounterExample cc) { -} - -int getDegree (Expr e) { - return 0; -} - -int getBVLength(Expr e) { - return 0; -} - -enum type_t getType (Expr e) { - return 0; -} - -int getVWidth (Expr e) { - return 0; -} - -int getIWidth (Expr e) { - return 0; -} - -void vc_printCounterExampleFile(VC vc, int fd) { -} - -const char* exprName(Expr e) { - return 0; -} - -int getExprID (Expr ex) { - return 0; -} - -int vc_parseMemExpr(VC vc, const char* s, Expr* oquery, Expr* oasserts ) { - return 0; -} - diff --git a/testsuite/bsc.options/bsc.help.out.expected b/testsuite/bsc.options/bsc.help.out.expected index ffdc4ae8f..74b661cc6 100644 --- a/testsuite/bsc.options/bsc.help.out.expected +++ b/testsuite/bsc.options/bsc.help.out.expected @@ -52,7 +52,6 @@ Compiler flags: -reset-prefix name reset name or prefix for generated modules -resource-off fail on insufficient resources -resource-simple reschedule on insufficient resources --sat-stp use STP SMT for disjoint testing and SAT -sat-yices use Yices SMT for disjoint testing and SAT -sched-dot generate .dot files with schedule information -show-compiles show recompilations @@ -98,4 +97,3 @@ Lists of error or warning tags may take the values ``ALL'' and ``NONE''. Default flags: Bluespec directory: BLUESPECDIR import path: .:BLUESPECDIR/Libraries - diff --git a/testsuite/bsc.scheduler/sat/AddTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/AddTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 83dbbe11a..000000000 --- a/testsuite/bsc.scheduler/sat/AddTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,55 +0,0 @@ -checking package dependencies -compiling AddTest_sat-stp.bsv -code generation for sysAddTest starts -Warning: "AddTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "AddTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d6, 1), (uc.write uc_PLUS_2___d12, 1), (uc.write uc_PLUS_3___d15, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysAddTest.sched -=== Generated schedule for sysAddTest === - -Rule schedule -------------- -Rule: aa -Predicate: (ua - ub) == 36'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! ((36'd1 + ua + (~ ub)) == 36'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 36'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -========================================== -Warning: "AddTest_sat-stp.bsv", line 26, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysAddTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ArraySelectImplCondTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ArraySelectImplCondTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 6b239e6cb..000000000 --- a/testsuite/bsc.scheduler/sat/ArraySelectImplCondTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,86 +0,0 @@ -checking package dependencies -compiling ArraySelectImplCondTest_sat-stp.bsv -code generation for sysArraySelectImplCondTest starts -Warning: "ArraySelectImplCondTest_sat-stp.bsv", line 33, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ArraySelectImplCondTest_sat-stp.bsv", line 33, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(idx.read, [(idx.read, 1)]), - (ss_0_c.read, [(ss_0_c.read, 1)]), - (ss_0_rg1.read, [(ss_0_rg1.read, 1)]), - (ss_0_rg1.write, [(if idx_EQ_0___d7 then ss_0_rg1.write NOT_ss_0_rg1___d9, 1)]), - (ss_0_rg2.read, [(ss_0_rg2.read, 1)]), - (ss_0_rg2.write, [(if idx_EQ_0___d7 then ss_0_rg2.write NOT_ss_0_rg2_6___d27, 1)]), - (ss_1_c.read, [(ss_1_c.read, 1)]), - (ss_1_rg1.read, [(ss_1_rg1.read, 1)]), - (ss_1_rg1.write, [(if idx_EQ_1___d10 then ss_1_rg1.write NOT_ss_1_rg1_1___d12, 1)]), - (ss_1_rg2.read, [(ss_1_rg2.read, 1)]), - (ss_1_rg2.write, [(if idx_EQ_1___d10 then ss_1_rg2.write NOT_ss_1_rg2_8___d29, 1)]), - (ss_2_c.read, [(ss_2_c.read, 1)]), - (ss_2_rg1.read, [(ss_2_rg1.read, 1)]), - (ss_2_rg1.write, [(if idx_EQ_2___d13 then ss_2_rg1.write NOT_ss_2_rg1_4___d15, 1)]), - (ss_2_rg2.read, [(ss_2_rg2.read, 1)]), - (ss_2_rg2.write, [(if idx_EQ_2___d13 then ss_2_rg2.write NOT_ss_2_rg2_0___d31, 1)]), - (ss_3_c.read, [(ss_3_c.read, 1)]), - (ss_3_rg1.read, [(ss_3_rg1.read, 1)]), - (ss_3_rg1.write, [(if idx_EQ_3___d16 then ss_3_rg1.write NOT_ss_3_rg1_7___d18, 1)]), - (ss_3_rg2.read, [(ss_3_rg2.read, 1)]), - (ss_3_rg2.write, [(if idx_EQ_3___d16 then ss_3_rg2.write NOT_ss_3_rg2_2___d33, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_9_PLUS_1___d20, 1), - (uc.write uc_9_PLUS_2___d34, 1), - (uc.write uc_9_PLUS_3___d35, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysArraySelectImplCondTest.sched -=== Generated schedule for sysArraySelectImplCondTest === - -Rule schedule -------------- -Rule: aa -Predicate: case idx of - 2'd0 -> ss_0_c - 2'd1 -> ss_1_c - 2'd2 -> ss_2_c - 2'd3 -> ss_3_c - _ -> 1'd1 -Blocking rules: (none) - -Rule: ab -Predicate: case idx of - 2'd0 -> ! ss_0_c - 2'd1 -> ! ss_1_c - 2'd2 -> ! ss_2_c - 2'd3 -> ! ss_3_c - _ -> 1'd1 -Blocking rules: (none) - -Rule: bb -Predicate: idx == 2'd0 -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -========================================================== -Warning: "ArraySelectImplCondTest_sat-stp.bsv", line 58, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysArraySelectImplCondTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ArraySelectLongIndexTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ArraySelectLongIndexTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index e12f2efaf..000000000 --- a/testsuite/bsc.scheduler/sat/ArraySelectLongIndexTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,68 +0,0 @@ -checking package dependencies -compiling ArraySelectLongIndexTest_sat-stp.bsv -code generation for sysArraySelectLongIndexTest starts -Warning: "ArraySelectLongIndexTest_sat-stp.bsv", line 9, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ArraySelectLongIndexTest_sat-stp.bsv", line 9, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(idx.read, [(idx.read, 1)]), - (rg_0.read, [(rg_0.read, 1)]), - (rg_1.read, [(rg_1.read, 1)]), - (rg_2.read, [(rg_2.read, 1)]), - (rg_3.read, [(rg_3.read, 1)]), - (rg_4.read, [(rg_4.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_1_PLUS_1___d12, 1), - (uc.write uc_1_PLUS_2___d21, 1), - (uc.write uc_1_PLUS_3___d22, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysArraySelectLongIndexTest.sched -=== Generated schedule for sysArraySelectLongIndexTest === - -Rule schedule -------------- -Rule: aa -Predicate: (idx < 3'd5) && - (PrimArrayDynSelect (PrimBuildArray rg_0 rg_1 rg_2 rg_3 rg_4) idx) -Blocking rules: (none) - -Rule: ab -Predicate: (idx < 3'd5) && - (PrimArrayDynSelect (PrimBuildArray (! rg_0) - (! rg_1) - (! rg_2) - (! rg_3) - (! rg_4)) - idx) -Blocking rules: (none) - -Rule: bb -Predicate: idx < 3'd5 -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -=========================================================== -Warning: "ArraySelectLongIndexTest_sat-stp.bsv", line 35, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysArraySelectLongIndexTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ArraySelectShortIndexTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ArraySelectShortIndexTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index ae7e89f2b..000000000 --- a/testsuite/bsc.scheduler/sat/ArraySelectShortIndexTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,67 +0,0 @@ -checking package dependencies -compiling ArraySelectShortIndexTest_sat-stp.bsv -code generation for sysArraySelectShortIndexTest starts -Warning: "ArraySelectShortIndexTest_sat-stp.bsv", line 9, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ArraySelectShortIndexTest_sat-stp.bsv", line 9, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(idx.read, [(idx.read, 1)]), - (rg_0.read, [(rg_0.read, 1)]), - (rg_1.read, [(rg_1.read, 1)]), - (rg_2.read, [(rg_2.read, 1)]), - (rg_3.read, [(rg_3.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_0_PLUS_1___d11, 1), - (uc.write uc_0_PLUS_2___d20, 1), - (uc.write uc_0_PLUS_3___d22, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysArraySelectShortIndexTest.sched -=== Generated schedule for sysArraySelectShortIndexTest === - -Rule schedule -------------- -Rule: aa -Predicate: PrimArrayDynSelect (PrimBuildArray rg_0 rg_1 rg_2 rg_3 rg_4 rg_5) - idx -Blocking rules: (none) - -Rule: ab -Predicate: PrimArrayDynSelect (PrimBuildArray (! rg_0) - (! rg_1) - (! rg_2) - (! rg_3) - (! rg_4) - (! rg_5)) - idx -Blocking rules: (none) - -Rule: bb -Predicate: idx == 2'd0 -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -============================================================ -Warning: "ArraySelectShortIndexTest_sat-stp.bsv", line 35, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysArraySelectShortIndexTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ArraySelectTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ArraySelectTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 9edaa0703..000000000 --- a/testsuite/bsc.scheduler/sat/ArraySelectTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,62 +0,0 @@ -checking package dependencies -compiling ArraySelectTest_sat-stp.bsv -code generation for sysArraySelectTest starts -Warning: "ArraySelectTest_sat-stp.bsv", line 6, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ArraySelectTest_sat-stp.bsv", line 6, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(idx.read, [(idx.read, 1)]), - (rg_0.read, [(rg_0.read, 1)]), - (rg_1.read, [(rg_1.read, 1)]), - (rg_2.read, [(rg_2.read, 1)]), - (rg_3.read, [(rg_3.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d9, 1), (uc.write uc_PLUS_2___d16, 1), (uc.write uc_PLUS_3___d18, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysArraySelectTest.sched -=== Generated schedule for sysArraySelectTest === - -Rule schedule -------------- -Rule: aa -Predicate: PrimArrayDynSelect (PrimBuildArray rg_0 rg_1 rg_2 rg_3) idx -Blocking rules: (none) - -Rule: ab -Predicate: PrimArrayDynSelect (PrimBuildArray (! rg_0) - (! rg_1) - (! rg_2) - (! rg_3)) - idx -Blocking rules: (none) - -Rule: bb -Predicate: idx == 2'd0 -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -================================================== -Warning: "ArraySelectTest_sat-stp.bsv", line 32, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysArraySelectTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/BoolTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/BoolTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 5a15092fe..000000000 --- a/testsuite/bsc.scheduler/sat/BoolTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,51 +0,0 @@ -checking package dependencies -compiling BoolTest_sat-stp.bsv -code generation for sysBoolTest starts -Warning: "BoolTest_sat-stp.bsv", line 9, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d5, 1), (uc.write uc_PLUS_2___d9, 1), (uc.write uc_PLUS_3___d10, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysBoolTest.sched -=== Generated schedule for sysBoolTest === - -Rule schedule -------------- -Rule: aa -Predicate: ua || ub -Blocking rules: (none) - -Rule: ab -Predicate: (! ub) && (! ua) -Blocking rules: (none) - -Rule: bb -Predicate: ua -Blocking rules: aa - -Logical execution order: aa, ab, bb - -=========================================== -Warning: "BoolTest_sat-stp.bsv", line 25, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysBoolTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/CaseTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/CaseTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 2dc12dc24..000000000 --- a/testsuite/bsc.scheduler/sat/CaseTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,72 +0,0 @@ -checking package dependencies -compiling CaseTest_sat-stp.bsv -code generation for sysCaseTest starts -Warning: "CaseTest_sat-stp.bsv", line 6, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "CaseTest_sat-stp.bsv", line 6, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(idx.read, [(idx.read, 1)]), - (u0.read, [(u0.read, 1)]), - (u1.read, [(u1.read, 1)]), - (u2.read, [(u2.read, 1)]), - (u3.read, [(u3.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_2_PLUS_1___d13, 1), - (uc.write uc_2_PLUS_2___d21, 1), - (uc.write uc_2_PLUS_3___d22, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysCaseTest.sched -=== Generated schedule for sysCaseTest === - -Rule schedule -------------- -Rule: aa -Predicate: (idx == 2'd0) - ? u0 - : ((idx == 2'd1) - ? u1 - : ((idx == 2'd2) - ? u2 - : u3)) -Blocking rules: (none) - -Rule: ab -Predicate: (idx == 2'd0) - ? ! u0 - : ((idx == 2'd1) - ? ! u1 - : ((idx == 2'd2) - ? ! u2 - : (! u3))) -Blocking rules: (none) - -Rule: bb -Predicate: idx == 2'd0 -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -=========================================== -Warning: "CaseTest_sat-stp.bsv", line 45, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysCaseTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/DivTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/DivTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 25f448445..000000000 --- a/testsuite/bsc.scheduler/sat/DivTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,93 +0,0 @@ -checking package dependencies -compiling DivTest_sat-stp.bsv -code generation for sysDivTest starts -Warning: "DivTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "DivTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -Warning: "DivTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ac" was treated as more urgent than "bb". Conflicts: - "ac" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ac": calls to uc.write vs. uc.read -Warning: "DivTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ad" was treated as more urgent than "bb". Conflicts: - "ad" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ad": calls to uc.write vs. uc.read -Warning: "DivTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ae" was treated as more urgent than "bb". Conflicts: - "ae" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ae": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], - RL_ab -> [], - RL_ac -> [], - RL_ad -> [], - RL_ae -> [], - RL_af -> [], - RL_bb -> [RL_ae, RL_ad, RL_ac, RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_ac, RL_ad, RL_ae, RL_af, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_2___d10, 1), - (uc.write uc_PLUS_3___d20, 1), - (uc.write uc_PLUS_1___d9, 1), - (uc.write uc_MINUS_2___d24, 1), - (uc.write uc_MINUS_1___d27, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysDivTest.sched -=== Generated schedule for sysDivTest === - -Rule schedule -------------- -Rule: aa -Predicate: (! (ub == 2'd0)) && ((ua / ub) == 2'd1) -Blocking rules: (none) - -Rule: ab -Predicate: ub == 2'd0 -Blocking rules: (none) - -Rule: ac -Predicate: (ua == 2'd1) && (! (ub < 2'd2)) -Blocking rules: (none) - -Rule: ad -Predicate: (! (ub == 2'd0)) && (ua == 2'd2) && (! (ub == 2'd2)) -Blocking rules: (none) - -Rule: ae -Predicate: (! (ub == 2'd0)) && (ua == 2'd3) && (ub < 2'd2) -Blocking rules: (none) - -Rule: af -Predicate: (! (ub == 2'd0)) && (ua == 2'd0) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 2'd0) -Blocking rules: ae, ad, ac, ab, aa - -Logical execution order: aa, ab, ac, ad, ae, af, bb - -========================================== -Warning: "DivTest_sat-stp.bsv", line 40, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysDivTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/IteTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/IteTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index d52f130ab..000000000 --- a/testsuite/bsc.scheduler/sat/IteTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,58 +0,0 @@ -checking package dependencies -compiling IteTest_sat-stp.bsv -code generation for sysIteTest starts -Warning: "IteTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "IteTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ba.read, [(ba.read, 1)]), - (ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, [(uc.write x__h320, 1), (uc.write x__h404, 1), (uc.write x__h419, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysIteTest.sched -=== Generated schedule for sysIteTest === - -Rule schedule -------------- -Rule: aa -Predicate: (ba - ? ua - : ub) == - 6'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! ((((sext ba) & ua) | ((~ (sext ba)) & ub)) == 6'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 6'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -========================================== -Warning: "IteTest_sat-stp.bsv", line 30, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysIteTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/LessThanSTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/LessThanSTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 35907fd5e..000000000 --- a/testsuite/bsc.scheduler/sat/LessThanSTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,55 +0,0 @@ -checking package dependencies -compiling LessThanSTest_sat-stp.bsv -code generation for sysLessThanSTest starts -Warning: "LessThanSTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "LessThanSTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d5, 1), (uc.write uc_PLUS_2___d9, 1), (uc.write uc_PLUS_3___d12, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysLessThanSTest.sched -=== Generated schedule for sysLessThanSTest === - -Rule schedule -------------- -Rule: aa -Predicate: ua .< ub -Blocking rules: (none) - -Rule: ab -Predicate: (ua == ub) || (ub .<= ua) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 36'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -================================================ -Warning: "LessThanSTest_sat-stp.bsv", line 26, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysLessThanSTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/LessThanTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/LessThanTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 7d0a89d80..000000000 --- a/testsuite/bsc.scheduler/sat/LessThanTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,55 +0,0 @@ -checking package dependencies -compiling LessThanTest_sat-stp.bsv -code generation for sysLessThanTest starts -Warning: "LessThanTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "LessThanTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d5, 1), (uc.write uc_PLUS_2___d9, 1), (uc.write uc_PLUS_3___d12, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysLessThanTest.sched -=== Generated schedule for sysLessThanTest === - -Rule schedule -------------- -Rule: aa -Predicate: ua < ub -Blocking rules: (none) - -Rule: ab -Predicate: (ua == ub) || (ub <= ua) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 36'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -=============================================== -Warning: "LessThanTest_sat-stp.bsv", line 26, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysLessThanTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/MultTest.bsv b/testsuite/bsc.scheduler/sat/MultTest.bsv index fd2c89cd3..64a177249 100644 --- a/testsuite/bsc.scheduler/sat/MultTest.bsv +++ b/testsuite/bsc.scheduler/sat/MultTest.bsv @@ -1,4 +1,3 @@ -// XXX STP slows down when this is 16 or higher typedef 12 Width; typedef Int#(Width) Data_t; diff --git a/testsuite/bsc.scheduler/sat/MultTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/MultTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 74781f87c..000000000 --- a/testsuite/bsc.scheduler/sat/MultTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,56 +0,0 @@ -checking package dependencies -compiling MultTest_sat-stp.bsv -code generation for sysMultTest starts -Warning: "MultTest_sat-stp.bsv", line 9, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "MultTest_sat-stp.bsv", line 9, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d9, 1), (uc.write uc_PLUS_2___d20, 1), (uc.write uc_PLUS_3___d23, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysMultTest.sched -=== Generated schedule for sysMultTest === - -Rule schedule -------------- -Rule: aa -Predicate: ((12'd11 * ua)[11:0] * ub)[11:0] == 12'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! (((ub + {ub[10:0], 1'd0} + {ub[8:0], 3'd0}) * ua)[11:0] == - 12'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 12'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -=========================================== -Warning: "MultTest_sat-stp.bsv", line 26, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysMultTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ParamBitsTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ParamBitsTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index af4a085a1..000000000 --- a/testsuite/bsc.scheduler/sat/ParamBitsTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,53 +0,0 @@ -checking package dependencies -compiling ParamBitsTest_sat-stp.bsv -code generation for sysParamBitsTest starts -Warning: "ParamBitsTest_sat-stp.bsv", line 5, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ParamBitsTest_sat-stp.bsv", line 5, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d3, 1), (uc.write uc_PLUS_2___d5, 1), (uc.write uc_PLUS_3___d6, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysParamBitsTest.sched -=== Generated schedule for sysParamBitsTest === - -Rule schedule -------------- -Rule: aa -Predicate: p == 8'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! (p == 8'd17) -Blocking rules: (none) - -Rule: bb -Predicate: True -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -================================================ -Warning: "ParamBitsTest_sat-stp.bsv", line 19, column 9: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysParamBitsTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ParamBoolTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ParamBoolTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 971bd7cfe..000000000 --- a/testsuite/bsc.scheduler/sat/ParamBoolTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,53 +0,0 @@ -checking package dependencies -compiling ParamBoolTest_sat-stp.bsv -code generation for sysParamBoolTest starts -Warning: "ParamBoolTest_sat-stp.bsv", line 5, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ParamBoolTest_sat-stp.bsv", line 5, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d2, 1), (uc.write uc_PLUS_2___d4, 1), (uc.write uc_PLUS_3___d5, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysParamBoolTest.sched -=== Generated schedule for sysParamBoolTest === - -Rule schedule -------------- -Rule: aa -Predicate: p -Blocking rules: (none) - -Rule: ab -Predicate: ! p -Blocking rules: (none) - -Rule: bb -Predicate: True -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -================================================ -Warning: "ParamBoolTest_sat-stp.bsv", line 19, column 9: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysParamBoolTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/RemTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/RemTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index f2af2c29a..000000000 --- a/testsuite/bsc.scheduler/sat/RemTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,83 +0,0 @@ -checking package dependencies -compiling RemTest_sat-stp.bsv -code generation for sysRemTest starts -Warning: "RemTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "RemTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -Warning: "RemTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ad" was treated as more urgent than "bb". Conflicts: - "ad" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ad": calls to uc.write vs. uc.read -Warning: "RemTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ae" was treated as more urgent than "bb". Conflicts: - "ae" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ae": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], - RL_ab -> [], - RL_ac -> [], - RL_ad -> [], - RL_ae -> [], - RL_bb -> [RL_ae, RL_ad, RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_ac, RL_ad, RL_ae, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_2___d11, 1), - (uc.write uc_PLUS_3___d20, 1), - (uc.write uc_PLUS_1___d9, 1), - (uc.write uc_MINUS_2___d23, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysRemTest.sched -=== Generated schedule for sysRemTest === - -Rule schedule -------------- -Rule: aa -Predicate: (! (ub == 2'd0)) && ((ua % ub) == 2'd1) -Blocking rules: (none) - -Rule: ab -Predicate: ub <= 2'd1 -Blocking rules: (none) - -Rule: ac -Predicate: (ua == 2'd0) && (! (ub <= 2'd1)) -Blocking rules: (none) - -Rule: ad -Predicate: (ua == 2'd2) && ((ub == 2'd2) || (ub == 2'd3)) -Blocking rules: (none) - -Rule: ae -Predicate: (ua == 2'd3) && (ub == 2'd3) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 2'd0) -Blocking rules: ae, ad, ab, aa - -Logical execution order: aa, ab, ac, ad, ae, bb - -========================================== -Warning: "RemTest_sat-stp.bsv", line 38, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysRemTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/SextTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/SextTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 61592a94b..000000000 --- a/testsuite/bsc.scheduler/sat/SextTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,55 +0,0 @@ -checking package dependencies -compiling SextTest_sat-stp.bsv -code generation for sysSextTest starts -Warning: "SextTest_sat-stp.bsv", line 22, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "SextTest_sat-stp.bsv", line 22, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d6, 1), (uc.write uc_PLUS_2___d14, 1), (uc.write uc_PLUS_3___d17, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysSextTest.sched -=== Generated schedule for sysSextTest === - -Rule schedule -------------- -Rule: aa -Predicate: (sext ua) == ub -Blocking rules: (none) - -Rule: ab -Predicate: ! ({ua[3], ua[3], ua[3], ua[3], ua[3], ua[3], ua[3], ua} == ub) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 4'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -=========================================== -Warning: "SextTest_sat-stp.bsv", line 40, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysSextTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ShiftLTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ShiftLTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 8a7acf9cc..000000000 --- a/testsuite/bsc.scheduler/sat/ShiftLTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,55 +0,0 @@ -checking package dependencies -compiling ShiftLTest_sat-stp.bsv -code generation for sysShiftRTest starts -Warning: "ShiftLTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ShiftLTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d6, 1), (uc.write uc_PLUS_2___d12, 1), (uc.write uc_PLUS_3___d15, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysShiftRTest.sched -=== Generated schedule for sysShiftRTest === - -Rule schedule -------------- -Rule: aa -Predicate: (ua << ub) == 18'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! ((ua * (18'd1 << ub))[17:0] == 18'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 18'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -============================================= -Warning: "ShiftLTest_sat-stp.bsv", line 27, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysShiftRTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ShiftRATest2_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ShiftRATest2_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index dafdeea26..000000000 --- a/testsuite/bsc.scheduler/sat/ShiftRATest2_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,99 +0,0 @@ -checking package dependencies -compiling ShiftRATest2_sat-stp.bsv -code generation for sysShiftRATest starts -Warning: "ShiftRATest2_sat-stp.bsv", line 12, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ShiftRATest2_sat-stp.bsv", line 12, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d8, 1), (uc.write uc_PLUS_2___d27, 1), (uc.write uc_PLUS_3___d30, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysShiftRATest.sched -=== Generated schedule for sysShiftRATest === - -Rule schedule -------------- -Rule: aa -Predicate: (ua >>> - (ub[30] - ? (_ :: Bit 31) - : ub)) == - 18'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! ((((ua[17] && - (! (31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17])) || - ((! ua[17]) && - (31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17])) - ? - ((ua[17] - ? - ua - : ua) / - ((31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17] - ? - (31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17:0] - : (31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17:0])) - : ((ua[17] - ? - ua - : ua) / - ((31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17] - ? - (31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17:0] - : (31'd1 << - (ub[30] - ? (_ :: Bit 31) - : ub))[17:0]))) == - 18'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 18'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -============================================== -Warning: "ShiftRATest2_sat-stp.bsv", line 29, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysShiftRATest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ShiftRATest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ShiftRATest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 0b391141c..000000000 --- a/testsuite/bsc.scheduler/sat/ShiftRATest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,99 +0,0 @@ -checking package dependencies -compiling ShiftRATest_sat-stp.bsv -code generation for sysShiftRATest starts -Warning: "ShiftRATest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ShiftRATest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d8, 1), (uc.write uc_PLUS_2___d26, 1), (uc.write uc_PLUS_3___d29, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysShiftRATest.sched -=== Generated schedule for sysShiftRATest === - -Rule schedule -------------- -Rule: aa -Predicate: (ua >>> - (ub[17] - ? (_ :: Bit 18) - : ub)) == - 18'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! ((((ua[17] && - (! (18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub))[17])) || - ((! ua[17]) && - (18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub))[17])) - ? - ((ua[17] - ? - ua - : ua) / - ((18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub))[17] - ? - (18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub)) - : (18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub)))) - : ((ua[17] - ? - ua - : ua) / - ((18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub))[17] - ? - (18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub)) - : (18'd1 << - (ub[17] - ? (_ :: Bit 18) - : ub))))) == - 18'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 18'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -============================================== -Warning: "ShiftRATest_sat-stp.bsv", line 27, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysShiftRATest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ShiftRTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ShiftRTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index ebb207c03..000000000 --- a/testsuite/bsc.scheduler/sat/ShiftRTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,55 +0,0 @@ -checking package dependencies -compiling ShiftRTest_sat-stp.bsv -code generation for sysShiftRTest starts -Warning: "ShiftRTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ShiftRTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d6, 1), (uc.write uc_PLUS_2___d11, 1), (uc.write uc_PLUS_3___d14, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysShiftRTest.sched -=== Generated schedule for sysShiftRTest === - -Rule schedule -------------- -Rule: aa -Predicate: (ua >> ub) == 18'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! ((ua / (18'd1 << ub)) == 18'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 18'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -============================================= -Warning: "ShiftRTest_sat-stp.bsv", line 27, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysShiftRTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/TruncateTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/TruncateTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 375179f55..000000000 --- a/testsuite/bsc.scheduler/sat/TruncateTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,53 +0,0 @@ -checking package dependencies -compiling TruncateTest_sat-stp.bsv -code generation for sysAddTest starts -Warning: "TruncateTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "TruncateTest_sat-stp.bsv", line 10, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, [(uc.write x__h185, 1), (uc.write x__h272, 1), (uc.write x__h283, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysAddTest.sched -=== Generated schedule for sysAddTest === - -Rule schedule -------------- -Rule: aa -Predicate: ua[17:5] == 13'd17 -Blocking rules: (none) - -Rule: ab -Predicate: ! (ua[17:5] == 13'd17) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 36'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -========================================== -Warning: "TruncateTest_sat-stp.bsv", line 30, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysAddTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/Word64Test_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/Word64Test_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index a6e0881b0..000000000 --- a/testsuite/bsc.scheduler/sat/Word64Test_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,49 +0,0 @@ -checking package dependencies -compiling Word64Test_sat-stp.bsv -code generation for sysWord64Test starts -Warning: "Word64Test_sat-stp.bsv", line 6, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, [(uc.write x__h248, 1), (uc.write x__h307, 1), (uc.write x__h373, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysWord64Test.sched -=== Generated schedule for sysWord64Test === - -Rule schedule -------------- -Rule: aa -Predicate: ua[63:31] == 33'h1FFFFFFFF -Blocking rules: (none) - -Rule: ab -Predicate: ua[63:31] == 33'hFFFFFFFF -Blocking rules: (none) - -Rule: bb -Predicate: (ua[63:62] == 2'b11) && (ua[61:31] == 31'h7FFFFFFF) -Blocking rules: aa - -Logical execution order: aa, ab, bb - -============================================= -Warning: "Word64Test_sat-stp.bsv", line 22, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysWord64Test.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/ZextTest_sat-stp.bsv.bsc-sched-out.expected b/testsuite/bsc.scheduler/sat/ZextTest_sat-stp.bsv.bsc-sched-out.expected deleted file mode 100644 index 253d47a9e..000000000 --- a/testsuite/bsc.scheduler/sat/ZextTest_sat-stp.bsv.bsc-sched-out.expected +++ /dev/null @@ -1,55 +0,0 @@ -checking package dependencies -compiling ZextTest_sat-stp.bsv -code generation for sysZextTest starts -Warning: "ZextTest_sat-stp.bsv", line 22, column 8: (G0010) - Rule "aa" was treated as more urgent than "bb". Conflicts: - "aa" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "aa": calls to uc.write vs. uc.read -Warning: "ZextTest_sat-stp.bsv", line 22, column 8: (G0010) - Rule "ab" was treated as more urgent than "bb". Conflicts: - "ab" cannot fire before "bb": calls to uc.write vs. uc.read - "bb" cannot fire before "ab": calls to uc.write vs. uc.read -=== schedule: -parallel: [esposito: [RL_aa -> [], RL_ab -> [], RL_bb -> [RL_ab, RL_aa]]] -order: [RL_aa, RL_ab, RL_bb] - ------ - -=== resources: -[(ua.read, [(ua.read, 1)]), - (ub.read, [(ub.read, 1)]), - (uc.read, [(uc.read, 1)]), - (uc.write, - [(uc.write uc_PLUS_1___d6, 1), (uc.write uc_PLUS_2___d8, 1), (uc.write uc_PLUS_3___d11, 1)])] - ------ - -=== vschedinfo: -SchedInfo [] [] [] [] - ------ - -Schedule dump file created: sysZextTest.sched -=== Generated schedule for sysZextTest === - -Rule schedule -------------- -Rule: aa -Predicate: {4'd0, ua} == ub -Blocking rules: (none) - -Rule: ab -Predicate: ! ({4'd0, ua} == ub) -Blocking rules: (none) - -Rule: bb -Predicate: ! (ua == 4'd0) -Blocking rules: ab, aa - -Logical execution order: aa, ab, bb - -=========================================== -Warning: "ZextTest_sat-stp.bsv", line 40, column 10: (G0021) - According to the generated schedule, rule `bb' can never fire. -Verilog file created: sysZextTest.v -All packages are up to date. diff --git a/testsuite/bsc.scheduler/sat/sat.exp b/testsuite/bsc.scheduler/sat/sat.exp index 615228784..9a24d7324 100644 --- a/testsuite/bsc.scheduler/sat/sat.exp +++ b/testsuite/bsc.scheduler/sat/sat.exp @@ -15,15 +15,13 @@ set sources [list \ Word64Test ] -set solvers [list yices stp] +set solvers [list yices] set failures [list] ## Note that these tests give incorrect schedules due to limitations in the ## solver abaility -## For STP: Shift* - if {$vtest == 1} { @@ -58,4 +56,3 @@ if {$vtest == 1} { } } } - diff --git a/util/haskell-language-server/gen_hie.py b/util/haskell-language-server/gen_hie.py index 2ff5252d6..1759d86d0 100644 --- a/util/haskell-language-server/gen_hie.py +++ b/util/haskell-language-server/gen_hie.py @@ -15,7 +15,6 @@ "./Parser/BSV", "./Parser/Classic", "../Parsec", - "../vendor/stp/include_hs", "../vendor/yices/include_hs", "../vendor/htcl" ] @@ -39,4 +38,4 @@ # form and dump yaml file hie_yaml = {"cradle":{"direct":{"arguments":arguments}}} f = open("hie.yaml", "w") -f.write(yaml.dump(hie_yaml)) \ No newline at end of file +f.write(yaml.dump(hie_yaml))