#ifndef CoCoA_ModuleOrdering_H
#define CoCoA_ModuleOrdering_H
// Copyright (c) 2005-2007,2011,2013 John Abbott, Anna Bigatti e Massimo Caboara
// This file is part of the source of CoCoALib, the CoCoA Library.
// CoCoALib 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.
// CoCoALib 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 CoCoALib. If not, see .
#include "CoCoA/PPOrdering.H"
#include "CoCoA/SmartPtrIRC.H"
#include "CoCoA/SparsePolyRing.H"
#include "CoCoA/degree.H"
#include "CoCoA/ring.H"
#include
//using std::ostream;
#include
//using std::vector;
namespace CoCoA
{
class OpenMathOutput; // fwd decl -- defined in OpenMath.H
class ModuleOrderingBase; // fwd decl -- defined later in this file
class ModuleOrdering
{
public:
explicit ModuleOrdering(const ModuleOrderingBase* ptr): mySmartPtr(ptr) {}
// assignment disabled because SmartPtrIRC has no assignment
const ModuleOrderingBase* operator->() const { return mySmartPtr.operator->(); } ///< Allow const member fns to be called.
const ModuleOrderingBase* myRawPtr() const { return mySmartPtr.myRawPtr(); } ///< Used by "downcasting" functions Is(..), As(...) etc.
bool operator==(const ModuleOrdering& MOrd) const { return mySmartPtr==MOrd.mySmartPtr; }
private: // data members
SmartPtrIRC mySmartPtr;
};
std::ostream& operator<<(std::ostream& out, const ModuleOrdering& MOrd);
OpenMathOutput& operator<<(OpenMathOutput& OMOut, const ModuleOrdering& MOrd);
//---------------------------------------------------------------------------
class ModuleOrderingBase: private IntrusiveReferenceCount
{
friend class SmartPtrIRC; // morally "friend ModuleOrdering", so it can alter ref count.
protected:
ModuleOrderingBase(const PPOrdering& PPO, const std::vector& shifts);
ModuleOrderingBase(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm);
virtual ~ModuleOrderingBase();
private:
ModuleOrderingBase(const ModuleOrderingBase& copy); ///< NEVER DEFINED -- copy ctor disabled
ModuleOrderingBase& operator=(const ModuleOrderingBase&); ///< NEVER DEFINED -- assignment disabled
public:
virtual void myOutputSelf(std::ostream& out) const;
virtual void myOutputSelf(OpenMathOutput& OMOut) const;
virtual void myOutputName(std::ostream& out) const = 0;
virtual void myOutputName(OpenMathOutput& OMOut) const = 0;
// virtual void myOrdMat(matrix& M) const = 0;
const std::vector& myShifts() const;
const std::vector& myPerm() const;
const PPOrdering& myPPOrdering() const;
protected:
PPOrdering myPPO; ///< the PPOrdering (on the base ring)
std::vector myShiftsValue; ///< the components shifts (degrees)
std::vector myPermutationValue; ///< the components priorities
};
const std::vector& shifts(const ModuleOrdering& O);
long NumComponents(const ModuleOrdering& MOrd);
long GradingDim(const ModuleOrdering& MOrd);
const PPOrdering& ModPPOrdering(const ModuleOrdering& MOrd);
//---------------------------------------------------------------------------
// Pseudo-constructors for ModuleOrderings
ModuleOrdering NewOrdPosn(const PPOrdering& PPO, long NumComponents);
ModuleOrdering NewPosnOrd(const PPOrdering& PPO, long NumComponents);
ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, long NumComponents);
ModuleOrdering NewOrdPosn(const PPOrdering& PPO, const std::vector& shifts);
ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& shifts);
ModuleOrdering NewPosnOrd(const PPOrdering& PPO, const std::vector& shifts);
ModuleOrdering NewOrdPosn(const PPOrdering& PPO, const std::vector& perm);
ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& perm);
ModuleOrdering NewOrdPosn(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm);
ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm);
// ModuleOrdering NewMatrixOrdering(ConstMatrix OrderMatrix, ??);
// ??? Compiler bug: the friend declarations below need explicit namespace
// scoping with g++ 3.2.2, otherwise g++ thinks New... etc are
// in the CoCoA::MOrd namespace. Very odd!
// ANNA: philosophical problem: WDeg must include shifts; what about Ord?
bool IsOrdPosn(const ModuleOrdering& MOrd);
bool IsPosnOrd(const ModuleOrdering& MOrd);
bool IsWDegPosnOrd(const ModuleOrdering& MOrd);
//----------------------------------------------------------------------
class ModuleOrderingCtor
{
public:
virtual ~ModuleOrderingCtor() {}
virtual ModuleOrdering operator()(const PPOrdering& PPO, long NumCompts) const = 0;
virtual ModuleOrdering operator()(const PPOrdering& PPO, const std::vector& shifts) const = 0;
};
struct PosnOrdCtor: public ModuleOrderingCtor
{
ModuleOrdering operator()(const PPOrdering& PPO, long NumCompts) const
{ return NewPosnOrd(PPO, NumCompts); }
ModuleOrdering operator()(const PPOrdering& PPO, const std::vector& shifts) const; // NYI!!!
};
struct OrdPosnCtor: public ModuleOrderingCtor
{
ModuleOrdering operator()(const PPOrdering& PPO, long NumCompts) const
{ return NewOrdPosn(PPO, NumCompts); }
ModuleOrdering operator()(const PPOrdering& PPO, const std::vector& shifts) const
{ return NewOrdPosn(PPO, shifts); }
};
struct WDegPosnOrdCtor: public ModuleOrderingCtor
{
ModuleOrdering operator()(const PPOrdering& PPO, long NumCompts) const
{ return NewWDegPosnOrd(PPO, NumCompts); }
ModuleOrdering operator()(const PPOrdering& PPO, const std::vector& shifts) const
{ return NewWDegPosnOrd(PPO, shifts); }
};
extern OrdPosnCtor OrdPosn;
extern PosnOrdCtor PosnOrd;
extern WDegPosnOrdCtor WDegPosnOrd;
//---------------------------------------------------------------------
} // end of namespace CoCoA
// RCS header/log in the next few lines
// $Header: /Volumes/Home_1/cocoa/cvs-repository/CoCoALib-0.99/include/CoCoA/ModuleOrdering.H,v 1.3 2015/12/01 13:11:00 abbott Exp $
// $Log: ModuleOrdering.H,v $
// Revision 1.3 2015/12/01 13:11:00 abbott
// Summary: Changed mem fn PPOrderingCtor::myCtor into operator(); also for ModuleOrderingCtor; see issue 829
//
// Revision 1.2 2014/07/31 13:10:46 bigatti
// -- GetMatrix(PPO) --> OrdMat(PPO)
// -- added OrdMat and GradingMat to PPOrdering, PPMonoid, SparsePolyRing
//
// Revision 1.1 2013/06/03 08:51:58 bigatti
// -- was ModuleTermOrdering
//
// Revision 1.5 2013/05/31 10:31:09 abbott
// Moved NYI impl body of PosnOrdCtor::myCtor to *.C file to avoid multiple compiler
// warnings about unused parameter.
//
// Revision 1.4 2013/05/27 16:35:05 bigatti
// -- major reorganisation of the implementation, changed names
// ---- WDegPosTO --> WDegPosnOrd, WDegTOPos --> OrdPosn, PosWDegTO --> PosnOrd
//
// Revision 1.3 2011/03/10 16:39:35 abbott
// Replaced (very many) size_t by long in function interfaces (for rings,
// PPMonoids and modules). Also replaced most size_t inside fn defns.
//
// Revision 1.2 2007/10/30 17:14:12 abbott
// Changed licence from GPL-2 only to GPL-3 or later.
// New version for such an important change.
//
// Revision 1.1.1.1 2007/03/09 15:16:11 abbott
// Imported files
//
// Revision 1.7 2006/12/06 17:14:12 cocoa
// -- removed #include "config.H"
//
// Revision 1.6 2006/11/24 17:14:10 cocoa
// -- reorganized includes of header files
// -- SmartPtrIRC for reference counting
//
// Revision 1.5 2006/11/10 13:30:57 cocoa
// -- fixed: "const &" to PPOrdering arguments
// -- some more documentation
//
// Revision 1.4 2006/11/10 13:06:03 cocoa
// -- cleaned code
//
// Revision 1.3 2006/11/02 13:25:44 cocoa
// Simplification of header files: the OpenMath classes have been renamed.
// Many minor consequential changes.
//
// Revision 1.2 2006/10/06 14:04:15 cocoa
// Corrected position of #ifndef in header files.
// Separated CoCoA_ASSERT into assert.H from config.H;
// many minor consequential changes (have to #include assert.H).
// A little tidying of #include directives (esp. in Max's code).
//
// Revision 1.1.1.1 2006/05/30 11:39:37 cocoa
// Imported files
//
// Revision 1.7 2006/05/12 16:10:58 cocoa
// Added OpenMathFwd.H, and tidied OpenMath.H.
// Many consequential but trivial changes.
//
// Revision 1.6 2006/05/11 15:59:23 cocoa
// -- changed reference count is done using SmartPtrIRC
//
// Revision 1.5 2006/05/04 14:19:02 cocoa
// -- moved some code from .H to .C
//
// Revision 1.4 2006/04/28 11:32:17 cocoa
// -- moved concrete class definition from .H to .C
//
// Revision 1.3 2006/03/15 18:09:31 cocoa
// Changed names of member functions which print out their object
// into myOutputSelf -- hope this will appease the Intel C++ compiler.
//
// Revision 1.2 2006/03/12 21:28:34 cocoa
// Major check in after many changes
//
// Revision 1.1.1.1 2005/10/17 10:46:54 cocoa
// Imported files
//
// Revision 1.1 2005/09/28 11:50:35 cocoa
// -- new code for graded modules
//
#endif