// Copyright (c) 2005-2007,2011 John Abbott, Anna Bigatti and 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/ModuleOrdering.H" #include "CoCoA/BigIntOps.H" #include "CoCoA/error.H" #include "CoCoA/assert.H" #include "CoCoA/convert.H" #include "CoCoA/OpenMath.H" #include "CoCoA/VectorOps.H" // for template to output a vector #include using std::ostream; //#include using std::vector; namespace CoCoA { ModuleOrderingBase::ModuleOrderingBase(const PPOrdering& PPO, const std::vector& shifts): IntrusiveReferenceCount(), myPPO(PPO) { const long n = len(shifts); for ( long i=0 ; i < n ; ++i ) if ( GradingDim(PPO) != GradingDim(shifts[i]) ) CoCoA_THROW_ERROR("GradingDim(PPO)!=GradingDim(shifts[i])", "ModuleOrderingBase"); myShiftsValue = shifts; } ModuleOrderingBase::ModuleOrderingBase(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm): IntrusiveReferenceCount(), myPPO(PPO) { const long n = len(shifts); for ( long i=0 ; i < n ; ++i ) if ( GradingDim(PPO) != GradingDim(shifts[i]) ) CoCoA_THROW_ERROR("GradingDim(PPO)!=GradingDim(shifts[i])", "ModuleOrderingBase"); myShiftsValue = shifts; if ( len(perm) != n ) CoCoA_THROW_ERROR("Shift list and permutation must have the same cardinality", "ModuleOrderingBase"); CoCoA_THROW_ERROR(ERR::NYI, "ModuleOrderingBase: check the entries of perm"); myPermutationValue = perm; } ModuleOrderingBase::~ModuleOrderingBase() {} //--------------------------------------------------------------------------- const std::vector& ModuleOrderingBase::myShifts() const { return myShiftsValue; } const std::vector& ModuleOrderingBase::myPerm() const { return myPermutationValue; } const PPOrdering& ModuleOrderingBase::myPPOrdering() const { return myPPO; } void ModuleOrderingBase::myOutputSelf(std::ostream& out) const { if (!out) return; // short-cut for bad ostreams myOutputName(out); out << "(" << myPPO << ", " << myShiftsValue; if ( !myPermutationValue.empty() ) out << ", " << myPermutationValue; out << ")"; } void ModuleOrderingBase::myOutputSelf(OpenMathOutput& OMOut) const { // missing shifts and permutation OMOut->mySendApplyStart(); myOutputName(OMOut); OMOut << myPPO; OMOut->mySendApplyEnd(); } //--------------------------------------------------------------------------- // (ex-inline) non-member functions std::ostream& operator<<(std::ostream& out, const ModuleOrdering& MTO) { if (!out) return out; // short-cut for bad ostreams MTO->myOutputSelf(out); return out; } OpenMathOutput& operator<<(OpenMathOutput& OMOut, const ModuleOrdering& MTO) { MTO->myOutputSelf(OMOut); return OMOut; } const std::vector& shifts(const ModuleOrdering& MTO) { return MTO->myShifts(); } const PPOrdering& ModPPOrdering(const ModuleOrdering& MTO) { return (MTO->myPPOrdering()); } long NumComponents(const ModuleOrdering& MTO) { return len(shifts(MTO)); } long GradingDim(const ModuleOrdering& MTO) { return GradingDim(ModPPOrdering(MTO)); } // ----------------- concrete classes --------------------- namespace ModuleOrd { class PosnOrdImpl: public ModuleOrderingBase { private: friend ModuleOrdering CoCoA::NewPosnOrd(const PPOrdering& PPO, long NumComponents); friend ModuleOrdering CoCoA::NewPosnOrd(const PPOrdering& PPO, const std::vector& shifts); private: PosnOrdImpl(const PPOrdering& PPO, const std::vector& shifts); PosnOrdImpl(const PosnOrdImpl&); ///< NEVER DEFINED -- copy ctor disabled PosnOrdImpl& operator=(const PosnOrdImpl&); ///< NEVER DEFINED -- assignment disabled public: virtual void myOutputName(std::ostream& out) const; virtual void myOutputName(OpenMathOutput& OMOut) const; }; class OrdPosnImpl: public ModuleOrderingBase { private: friend ModuleOrdering CoCoA::NewOrdPosn(const PPOrdering& PPO, long NumComponents); friend ModuleOrdering CoCoA::NewOrdPosn(const PPOrdering& PPO, const std::vector& shifts); friend ModuleOrdering CoCoA::NewOrdPosn(const PPOrdering& PPO, const std::vector& perm); friend ModuleOrdering CoCoA::NewOrdPosn(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm); private: OrdPosnImpl(const PPOrdering& PPO, const std::vector& shifts); OrdPosnImpl(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm); OrdPosnImpl(const OrdPosnImpl&); ///< NEVER DEFINED -- copy ctor disabled OrdPosnImpl& operator=(const OrdPosnImpl&); ///< NEVER DEFINED -- assignment disabled public: virtual void myOutputName(std::ostream& out) const; virtual void myOutputName(OpenMathOutput& OMOut) const; }; class WDegPosnOrdImpl: public ModuleOrderingBase { private: friend ModuleOrdering CoCoA::NewWDegPosnOrd(const PPOrdering& PPO, long NumComponents); friend ModuleOrdering CoCoA::NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& shifts); friend ModuleOrdering CoCoA::NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& perm); friend ModuleOrdering CoCoA::NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm); private: WDegPosnOrdImpl(const PPOrdering& PPO, const std::vector& shifts); WDegPosnOrdImpl(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm); WDegPosnOrdImpl(const PPOrdering& PPO, const WDegPosnOrdImpl&); ///< NEVER DEFINED -- copy ctor disabled WDegPosnOrdImpl& operator=(const WDegPosnOrdImpl&); ///< NEVER DEFINED -- assignment disabled public: virtual void myOutputName(std::ostream& out) const; virtual void myOutputName(OpenMathOutput& OMOut) const; }; //---------- PosnOrdImpl ---------------------------------------- PosnOrdImpl::PosnOrdImpl(const PPOrdering& PPO, const std::vector& shifts): ModuleOrderingBase(PPO, shifts) {} void PosnOrdImpl::myOutputName(std::ostream& out) const { if (!out) return; // short-cut for bad ostreams out << "ModuleOrderingOrdPosn"; } void PosnOrdImpl::myOutputName(OpenMathOutput& OMOut) const { OMOut << OpenMathSymbol("cocoa", "ModuleOrderingOrdPosn"); } //---------- OrdPosnImpl ---------------------------------------- OrdPosnImpl::OrdPosnImpl(const PPOrdering& PPO, const std::vector& shifts): ModuleOrderingBase(PPO, shifts) {} OrdPosnImpl::OrdPosnImpl(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm): ModuleOrderingBase(PPO, shifts, perm) {} void OrdPosnImpl::myOutputName(std::ostream& out) const { if (!out) return; // short-cut for bad ostreams out << "ModuleOrderingOrdPosn"; } void OrdPosnImpl::myOutputName(OpenMathOutput& OMOut) const { OMOut << OpenMathSymbol("cocoa", "ModuleOrderingOrdPosn"); } //---------- WDegPosnOrdImpl ---------------------------------------- WDegPosnOrdImpl::WDegPosnOrdImpl(const PPOrdering& PPO, const std::vector& shifts): ModuleOrderingBase(PPO, shifts) {} WDegPosnOrdImpl::WDegPosnOrdImpl(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm): ModuleOrderingBase(PPO, shifts, perm) {} void WDegPosnOrdImpl::myOutputName(std::ostream& out) const { if (!out) return; // short-cut for bad ostreams out << "ModuleOrderingOrdPosn"; } void WDegPosnOrdImpl::myOutputName(OpenMathOutput& OMOut) const { OMOut << OpenMathSymbol("cocoa", "ModuleOrderingOrdPosn"); } //------------------------------------------------------------// } // end of namespace ModuleOrd ModuleOrdering NewPosnOrd(const PPOrdering& PPO, long NumComponents) { if (NumComponents < 0) CoCoA_THROW_ERROR(ERR::BadArg, "NewPosnOrd"); return ModuleOrdering(new ModuleOrd::PosnOrdImpl(PPO, vector(NumComponents, degree(GradingDim(PPO))))); } ModuleOrdering NewOrdPosn(const PPOrdering& PPO, long NumComponents) { if (NumComponents < 0) CoCoA_THROW_ERROR(ERR::BadArg, "NewOrdPosn"); return ModuleOrdering(new ModuleOrd::OrdPosnImpl(PPO, vector(NumComponents, degree(GradingDim(PPO))))); } ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, long NumComponents) { if (NumComponents < 0) CoCoA_THROW_ERROR(ERR::BadArg, "NewWDegPosnOrd"); return ModuleOrdering(new ModuleOrd::WDegPosnOrdImpl(PPO, vector(NumComponents, degree(GradingDim(PPO))))); } ModuleOrdering NewPosnOrd(const PPOrdering& PPO, const std::vector& shifts) { return ModuleOrdering(new ModuleOrd::PosnOrdImpl(PPO, shifts)); } ModuleOrdering NewOrdPosn(const PPOrdering& PPO, const std::vector& shifts) { return ModuleOrdering(new ModuleOrd::OrdPosnImpl(PPO, shifts)); } ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& shifts) { return ModuleOrdering(new ModuleOrd::WDegPosnOrdImpl(PPO, shifts)); } ModuleOrdering NewOrdPosn(const PPOrdering& PPO, const std::vector& perm) { return ModuleOrdering(new ModuleOrd::OrdPosnImpl(PPO, vector(len(perm), degree(GradingDim(PPO))), perm)); } ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& perm) { return ModuleOrdering(new ModuleOrd::WDegPosnOrdImpl(PPO, vector(len(perm), degree(GradingDim(PPO))), perm)); } ModuleOrdering NewOrdPosn(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm) { return ModuleOrdering(new ModuleOrd::OrdPosnImpl(PPO, shifts, perm)); } ModuleOrdering NewWDegPosnOrd(const PPOrdering& PPO, const std::vector& shifts, const std::vector& perm) { return ModuleOrdering(new ModuleOrd::WDegPosnOrdImpl(PPO, shifts, perm)); } bool IsPosnOrd(const ModuleOrdering& MOrd) { if (dynamic_cast(MOrd.myRawPtr())) return true; // must decide whether the matrix is PosnWDeg..., possibly in disguise return false; } bool IsOrdPosn(const ModuleOrdering& MOrd) { if (dynamic_cast(MOrd.myRawPtr())) return true; // must decide whether the matrix is WDeg..., possibly in disguise return false; } bool IsWDegPosnOrd(const ModuleOrdering& MOrd) { if (dynamic_cast(MOrd.myRawPtr())) return true; // must decide whether the matrix is WDeg..., possibly in disguise return false; } // STOPGAP Placeholder defn ModuleOrdering PosnOrdCtor::operator()(const PPOrdering& PPO, const std::vector& shifts) const { CoCoA_THROW_ERROR(ERR::NYI, "PosnOrdCtor with shifts"); return operator()(PPO,0); } //----- declaration of ordering ctors --------------------------- OrdPosnCtor OrdPosn; PosnOrdCtor PosnOrd; WDegPosnOrdCtor WDegPosnOrd; //----- declaration of ordering ctors --------------------------- } // end of namespace CoCoA // RCS header/log in the next few lines // $Header: /Volumes/Home_1/cocoa/cvs-repository/CoCoALib-0.99/src/AlgebraicCore/ModuleOrdering.C,v 1.9 2020/06/17 15:49:24 abbott Exp $ // $Log: ModuleOrdering.C,v $ // Revision 1.9 2020/06/17 15:49:24 abbott // Summary: Changed CoCoA_ERROR into CoCoA_THROW_ERROR // // Revision 1.8 2020/02/11 16:56:41 abbott // Summary: Corrected last update (see redmine 969) // // Revision 1.7 2020/02/11 16:12:18 abbott // Summary: Added some checks for bad ostream (even to mem fns myOutput); see redmine 969 // // Revision 1.6 2018/05/18 12:15:04 bigatti // -- renamed IntOperations --> BigIntOps // // Revision 1.5 2018/05/17 15:37:31 bigatti // -- renamed VectorOperations --> VectorOps // // Revision 1.4 2016/11/11 14:15:32 abbott // Summary: Added short-cut to operator<< when ostream is in bad state // // 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 14:45:17 abbott // Summary: Merged io.H and UtilsTemplate.H into new header VectorOperations.H // Author: JAA // // Revision 1.1 2013/06/03 08:51:58 bigatti // -- was ModuleTermOrdering // // Revision 1.6 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.5 2013/05/27 16:35:05 bigatti // -- major reorganisation of the implementation, changed names // ---- WDegPosTO --> WDegPosnOrd, WDegTOPos --> OrdPosn, PosWDegTO --> PosnOrd // // Revision 1.4 2012/05/28 09:18:21 abbott // Created IntOperations which gathers together all operations on // integers (both big and small). Many consequential changes. // // Revision 1.3 2011/03/10 16:39:34 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:08 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.10 2007/03/08 18:22:29 cocoa // Just whitespace cleaning. // // Revision 1.9 2007/02/10 18:44:03 cocoa // Added "const" twice to each test and example. // Eliminated dependency on io.H in several files. // Improved BuildInfo, and added an example about how to use it. // Some other minor cleaning. // // Revision 1.8 2007/01/18 15:34:04 cocoa // -- changed namespace MTO into ModuleTermOrd // // Revision 1.7 2006/11/24 17:14:10 cocoa // -- reorganized includes of header files // -- SmartPtrIRC for reference counting // // Revision 1.6 2006/11/10 13:30:57 cocoa // -- fixed: "const &" to PPOrdering arguments // -- some more documentation // // Revision 1.5 2006/11/10 13:06:03 cocoa // -- cleaned code // // Revision 1.4 2006/11/02 13:25:44 cocoa // Simplification of header files: the OpenMath classes have been renamed. // Many minor consequential changes. // // Revision 1.3 2006/10/06 15:11:01 cocoa // -- removed commented out code // // 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.8 2006/05/12 16:10:58 cocoa // Added OpenMathFwd.H, and tidied OpenMath.H. // Many consequential but trivial changes. // // Revision 1.7 2006/05/11 15:59:23 cocoa // -- changed reference count is done using SmartPtrIRC // // Revision 1.6 2006/05/04 14:19:02 cocoa // -- moved some code from .H to .C // // Revision 1.5 2006/04/28 11:32:16 cocoa // -- moved concrete class definition from .H to .C // // Revision 1.4 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.3 2006/03/12 21:28:34 cocoa // Major check in after many changes // // Revision 1.2 2005/11/24 17:06:40 cocoa // -- fixed IsWDegTOPos, IsWDegPosTO, IsWDegTOPermPos, IsWDegPermPosTO // // Revision 1.1.1.1 2005/10/17 10:46:54 cocoa // Imported files // // Revision 1.1 2005/09/28 11:50:34 cocoa // -- new code for graded modules //