Generated on Thu Mar 22 10:39:33 2012 for Gecode by doxygen 1.6.3

arithmetic.hh

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *     Guido Tack <tack@gecode.org>
00006  *
00007  *  Copyright:
00008  *     Christian Schulte, 2002
00009  *     Guido Tack, 2004
00010  *
00011  *  Last modified:
00012  *     $Date: 2009-11-02 17:10:59 +0100 (Mon, 02 Nov 2009) $ by $Author: tack $
00013  *     $Revision: 10021 $
00014  *
00015  *  This file is part of Gecode, the generic constraint
00016  *  development environment:
00017  *     http://www.gecode.org
00018  *
00019  *  Permission is hereby granted, free of charge, to any person obtaining
00020  *  a copy of this software and associated documentation files (the
00021  *  "Software"), to deal in the Software without restriction, including
00022  *  without limitation the rights to use, copy, modify, merge, publish,
00023  *  distribute, sublicense, and/or sell copies of the Software, and to
00024  *  permit persons to whom the Software is furnished to do so, subject to
00025  *  the following conditions:
00026  *
00027  *  The above copyright notice and this permission notice shall be
00028  *  included in all copies or substantial portions of the Software.
00029  *
00030  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00031  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00032  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00033  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00034  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00035  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00036  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00037  *
00038  */
00039 
00040 #ifndef __GECODE_INT_ARITHMETIC_HH__
00041 #define __GECODE_INT_ARITHMETIC_HH__
00042 
00043 #include <gecode/int.hh>
00044 
00045 #include <gecode/int/rel.hh>
00046 #include <gecode/int/linear.hh>
00047 
00053 namespace Gecode { namespace Int { namespace Arithmetic {
00054 
00061   template<class View>
00062   class AbsBnd : public BinaryPropagator<View,PC_INT_BND> {
00063   protected:
00064     using BinaryPropagator<View,PC_INT_BND>::x0;
00065     using BinaryPropagator<View,PC_INT_BND>::x1;
00066 
00068     AbsBnd(Space& home, bool share, AbsBnd& p);
00070     AbsBnd(Home home, View x0, View x1);
00071   public:
00072 
00074     virtual Actor* copy(Space& home, bool share);
00081     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00083     virtual ExecStatus  propagate(Space& home, const ModEventDelta& med);
00085     static  ExecStatus  post(Home home, View x0, View x1);
00086   };
00087 
00094   template<class View>
00095   class AbsDom : public BinaryPropagator<View,PC_INT_DOM> {
00096   protected:
00097     using BinaryPropagator<View,PC_INT_DOM>::x0;
00098     using BinaryPropagator<View,PC_INT_DOM>::x1;
00099 
00101     AbsDom(Space& home, bool share, AbsDom& p);
00103     AbsDom(Home home, View x0, View x1);
00104   public:
00106     virtual Actor* copy(Space& home, bool share);
00114     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00116     virtual ExecStatus  propagate(Space& home, const ModEventDelta& med);
00118     static  ExecStatus  post(Home home, View x0, View x1);
00119   };
00120 
00121 
00122 
00129   template<class View>
00130   class MaxBnd : public TernaryPropagator<View,PC_INT_BND> {
00131   protected:
00132     using TernaryPropagator<View,PC_INT_BND>::x0;
00133     using TernaryPropagator<View,PC_INT_BND>::x1;
00134     using TernaryPropagator<View,PC_INT_BND>::x2;
00135 
00137     MaxBnd(Space& home, bool share, MaxBnd& p);
00139     MaxBnd(Home home, View x0, View x1, View x2);
00140   public:
00142     MaxBnd(Space& home, bool share, Propagator& p, View x0, View x1, View x2);
00144     virtual Actor* copy(Space& home, bool share);
00146     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00148     static  ExecStatus post(Home home, View x0, View x1, View x2);
00149   };
00150 
00157   template<class View>
00158   class NaryMaxBnd : public NaryOnePropagator<View,PC_INT_BND> {
00159   protected:
00160     using NaryOnePropagator<View,PC_INT_BND>::x;
00161     using NaryOnePropagator<View,PC_INT_BND>::y;
00162 
00164     NaryMaxBnd(Space& home, bool share, NaryMaxBnd& p);
00166     NaryMaxBnd(Home home, ViewArray<View>& x, View y);
00167   public:
00169     virtual Actor* copy(Space& home, bool share);
00171     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00173     static  ExecStatus post(Home home, ViewArray<View>& x, View y);
00174   };
00175 
00182   template<class View>
00183   class MaxDom : public TernaryPropagator<View,PC_INT_DOM> {
00184   protected:
00185     using TernaryPropagator<View,PC_INT_DOM>::x0;
00186     using TernaryPropagator<View,PC_INT_DOM>::x1;
00187     using TernaryPropagator<View,PC_INT_DOM>::x2;
00188 
00190     MaxDom(Space& home, bool share, MaxDom& p);
00192     MaxDom(Home home, View x0, View x1, View x2);
00193   public:
00195     MaxDom(Space& home, bool share, Propagator& p, View x0, View x1, View x2);
00197     virtual Actor* copy(Space& home, bool share);
00204     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00206     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00208     static  ExecStatus post(Home home, View x0, View x1, View x2);
00209   };
00210 
00217   template<class View>
00218   class NaryMaxDom : public NaryOnePropagator<View,PC_INT_DOM> {
00219   protected:
00220     using NaryOnePropagator<View,PC_INT_DOM>::x;
00221     using NaryOnePropagator<View,PC_INT_DOM>::y;
00222 
00224     NaryMaxDom(Space& home, bool share, NaryMaxDom& p);
00226     NaryMaxDom(Home home, ViewArray<View>& x, View y);
00227   public:
00229     virtual Actor* copy(Space& home, bool share);
00236     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00238     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00240     static  ExecStatus post(Home home, ViewArray<View>& x, View y);
00241   };
00242 
00243 
00244 
00245 
00251   template<class VA, class VB>
00252   class SqrPlusBnd : public MixBinaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND> {
00253   protected:
00254     using MixBinaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND>::x0;
00255     using MixBinaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND>::x1;
00257     SqrPlusBnd(Home home, VA x0, VB x1);
00259     SqrPlusBnd(Space& home, bool share, SqrPlusBnd<VA,VB>& p);
00260   public:
00262     static ExecStatus post(Home home, VA x0, VB x1);
00264     virtual Actor* copy(Space& home, bool share);
00266     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00267   };
00268 
00275   template<class View>
00276   class SqrBnd : public BinaryPropagator<View,PC_INT_BND> {
00277   protected:
00278     using BinaryPropagator<View,PC_INT_BND>::x0;
00279     using BinaryPropagator<View,PC_INT_BND>::x1;
00280 
00282     SqrBnd(Space& home, bool share, SqrBnd<View>& p);
00284     SqrBnd(Home home, View x0, View x1);
00285   public:
00287     virtual Actor* copy(Space& home, bool share);
00289     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00291     static ExecStatus post(Home home, View x0, View x1);
00292   };
00293 
00294 
00295 
00301   template<class VA, class VB>
00302   class SqrPlusDom : public MixBinaryPropagator<VA,PC_INT_DOM,VB,PC_INT_DOM> {
00303   protected:
00304     using MixBinaryPropagator<VA,PC_INT_DOM,VB,PC_INT_DOM>::x0;
00305     using MixBinaryPropagator<VA,PC_INT_DOM,VB,PC_INT_DOM>::x1;
00307     SqrPlusDom(Home home, VA x0, VB x1);
00309     SqrPlusDom(Space& home, bool share, SqrPlusDom<VA,VB>& p);
00310   public:
00312     static ExecStatus post(Home home, VA x0, VB x1);
00314     virtual Actor* copy(Space& home, bool share);
00322     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00324     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00325   };
00326 
00333   template<class View>
00334   class SqrDom : public BinaryPropagator<View,PC_INT_DOM> {
00335   protected:
00336     using BinaryPropagator<View,PC_INT_DOM>::x0;
00337     using BinaryPropagator<View,PC_INT_DOM>::x1;
00338 
00340     SqrDom(Space& home, bool share, SqrDom<View>& p);
00342     SqrDom(Home home, View x0, View x1);
00343   public:
00345     virtual Actor* copy(Space& home, bool share);
00347     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00355     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00357     static ExecStatus post(Home home, View x0, View x1);
00358   };
00359 
00360 
00361 
00368   template<class View>
00369   class SqrtBnd : public BinaryPropagator<View,PC_INT_BND> {
00370   protected:
00371     using BinaryPropagator<View,PC_INT_BND>::x0;
00372     using BinaryPropagator<View,PC_INT_BND>::x1;
00373 
00375     SqrtBnd(Space& home, bool share, SqrtBnd<View>& p);
00377     SqrtBnd(Home home, View x0, View x1);
00378   public:
00380     virtual Actor* copy(Space& home, bool share);
00382     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00384     static ExecStatus post(Home home, View x0, View x1);
00385   };
00386 
00393   template<class View>
00394   class SqrtDom : public BinaryPropagator<View,PC_INT_DOM> {
00395   protected:
00396     using BinaryPropagator<View,PC_INT_DOM>::x0;
00397     using BinaryPropagator<View,PC_INT_DOM>::x1;
00398 
00400     SqrtDom(Space& home, bool share, SqrtDom<View>& p);
00402     SqrtDom(Home home, View x0, View x1);
00403   public:
00405     virtual Actor* copy(Space& home, bool share);
00407     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00415     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00417     static ExecStatus post(Home home, View x0, View x1);
00418   };
00419 
00420 
00421 
00428   template<class View, PropCond pc>
00429   class MultZeroOne : public BinaryPropagator<View,pc> {
00430   protected:
00431     using BinaryPropagator<View,pc>::x0;
00432     using BinaryPropagator<View,pc>::x1;
00433 
00435     MultZeroOne(Space& home, bool share, MultZeroOne<View,pc>& p);
00437     MultZeroOne(Home home, View x0, View x1);
00439     static RelTest equal(View x, int n);
00440   public:
00442     virtual Actor* copy(Space& home, bool share);
00444     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00446     static ExecStatus post(Home home, View x0, View x1);
00447   };
00448 
00449 
00450 
00456   template<class Val, class VA, class VB, class VC>
00457   class MultPlusBnd :
00458     public MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND> {
00459   protected:
00460     using MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND>::x0;
00461     using MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND>::x1;
00462     using MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND>::x2;
00463   public:
00465     MultPlusBnd(Home home, VA x0, VB x1, VC x2);
00467     MultPlusBnd(Space& home, bool share, MultPlusBnd<Val,VA,VB,VC>& p);
00469     static ExecStatus post(Home home, VA x0, VB x1, VC x2);
00471     virtual Actor* copy(Space& home, bool share);
00473     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00474   };
00475 
00483   template<class View>
00484   class MultBnd : public TernaryPropagator<View,PC_INT_BND> {
00485   protected:
00486     using TernaryPropagator<View,PC_INT_BND>::x0;
00487     using TernaryPropagator<View,PC_INT_BND>::x1;
00488     using TernaryPropagator<View,PC_INT_BND>::x2;
00489 
00491     MultBnd(Space& home, bool share, MultBnd<View>& p);
00492   public:
00494     MultBnd(Home home, View x0, View x1, View x2);
00496     static  ExecStatus post(Home home, View x0, View x1, View x2);
00498     virtual Actor* copy(Space& home, bool share);
00500     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00501   };
00502 
00503 
00504 
00510   template<class Val, class VA, class VB, class VC>
00511   class MultPlusDom :
00512     public MixTernaryPropagator<VA,PC_INT_DOM,VB,PC_INT_DOM,VC,PC_INT_DOM> {
00513   protected:
00514     using MixTernaryPropagator<VA,PC_INT_DOM,VB,PC_INT_DOM,VC,PC_INT_DOM>::x0;
00515     using MixTernaryPropagator<VA,PC_INT_DOM,VB,PC_INT_DOM,VC,PC_INT_DOM>::x1;
00516     using MixTernaryPropagator<VA,PC_INT_DOM,VB,PC_INT_DOM,VC,PC_INT_DOM>::x2;
00517   public:
00519     MultPlusDom(Home home, VA x0, VB x1, VC x2);
00521     MultPlusDom(Space& home, bool share, MultPlusDom<Val,VA,VB,VC>& p);
00523     static ExecStatus post(Home home, VA x0, VB x1, VC x2);
00525     virtual Actor* copy(Space& home, bool share);
00532     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00534     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00535   };
00536 
00544   template<class View>
00545   class MultDom : public TernaryPropagator<View,PC_INT_DOM> {
00546   protected:
00547     using TernaryPropagator<View,PC_INT_DOM>::x0;
00548     using TernaryPropagator<View,PC_INT_DOM>::x1;
00549     using TernaryPropagator<View,PC_INT_DOM>::x2;
00550 
00552     MultDom(Space& home, bool share, MultDom<View>& p);
00553   public:
00555     MultDom(Home home, View x0, View x1, View x2);
00557     static  ExecStatus post(Home home, View x0, View x1, View x2);
00559     virtual Actor* copy(Space& home, bool share);
00566     virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00568     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00569   };
00570 
00576   template<class Val, class VA, class VB, class VC>
00577   class DivPlusBnd :
00578     public MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND> {
00579   protected:
00580     using MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND>::x0;
00581     using MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND>::x1;
00582     using MixTernaryPropagator<VA,PC_INT_BND,VB,PC_INT_BND,VC,PC_INT_BND>::x2;
00583   public:
00585     DivPlusBnd(Home home, VA x0, VB x1, VC x2);
00587     DivPlusBnd(Space& home, bool share,
00588                DivPlusBnd<Val,VA,VB,VC>& p);
00590     static ExecStatus post(Home home, VA x0, VB x1, VC x2);
00592     virtual Actor* copy(Space& home, bool share);
00594     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00595   };
00596 
00604   template<class View>
00605   class DivBnd : public TernaryPropagator<View,PC_INT_BND> {
00606   protected:
00607     using TernaryPropagator<View,PC_INT_BND>::x0;
00608     using TernaryPropagator<View,PC_INT_BND>::x1;
00609     using TernaryPropagator<View,PC_INT_BND>::x2;
00610 
00612     DivBnd(Space& home, bool share, DivBnd<View>& p);
00613   public:
00615     DivBnd(Home home, View x0, View x1, View x2);
00617     static  ExecStatus post(Home home, View x0, View x1, View x2);
00619     virtual Actor* copy(Space& home, bool share);
00621     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00622   };
00623 
00634   template<class View>
00635   class DivMod : public TernaryPropagator<View,PC_INT_BND> {
00636   protected:
00637     using TernaryPropagator<View,PC_INT_BND>::x0;
00638     using TernaryPropagator<View,PC_INT_BND>::x1;
00639     using TernaryPropagator<View,PC_INT_BND>::x2;
00640 
00642     DivMod(Space& home, bool share, DivMod<View>& p);
00643   public:
00645     DivMod(Home home, View x0, View x1, View x2);
00647     static  ExecStatus post(Home home, View x0, View x1, View x2);
00649     virtual Actor* copy(Space& home, bool share);
00651     virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00652   };
00653 
00654 }}}
00655 
00656 #include <gecode/int/arithmetic/abs.hpp>
00657 #include <gecode/int/arithmetic/max.hpp>
00658 #include <gecode/int/arithmetic/sqr.hpp>
00659 #include <gecode/int/arithmetic/sqrt.hpp>
00660 #include <gecode/int/arithmetic/mult.hpp>
00661 #include <gecode/int/arithmetic/divmod.hpp>
00662 
00663 #endif
00664 
00665 // STATISTICS: int-prop
00666