Macaulay2 Engine
Loading...
Searching...
No Matches
mutablecomplex.hpp
Go to the documentation of this file.
1/* Copyright 2017 Mahrud Sayrafi and Michael E. Stillman
2 Mahrud Sayrafi's code in this file is in the public domain. */
3
4#ifndef _mutablecomplex_hpp_
5#define _mutablecomplex_hpp_
6
42
43#include "localring.hpp"
44#include "style.hpp"
45#include "hash.hpp"
46#include "mat.hpp"
47#include "debug.hpp"
48#include <iostream>
49
67// TODO how to seamlessly use sparse or dense mutable matrices?
68// template <typename MutableMatrix>
70{
71 public:
74 : mRing(D[0]->get_ring()),
75 mLocalRing(mRing->cast_to_LocalRing()),
76 mPolynomialRing(mLocalRing == nullptr ? mRing->cast_to_PolynomialRing()
77 : mLocalRing->get_ring()),
78 mDifferential(D)
79 {
80#if 0
81 if (mLocalRing != 0)
82 std::cout << "Got a mutable complex over a local ring." << std::endl;
83 if (mPolynomialRing == 0)
84 std::cout << "Not a polynomial ring or local ring." << std::endl;
85#endif
86 for (size_t i = 0; i < D.size(); ++i) mBetti.push_back(D[i]->n_rows());
87 mBetti.push_back(D[D.size() - 1]->n_cols());
88 // TODO: Check to make sure mBetti's are compatible, or define isWellDefined
89 }
90 virtual ~MutableComplex() {} // destructor
91
92 class iterator;
93
94 size_t complexity(const iterator &i, const size_t flags) const;
95 bool next_unit(iterator &i, const size_t flags) const;
96 bool find_unit(iterator &i, const size_t flags) const;
97 // TODO improve list_units to move all units in a square
98 std::vector<iterator> list_units(size_t n, const size_t flags) const;
99
100 void prune_unit(const iterator &i, const size_t flags);
101 void prune_matrix(size_t n, const size_t flags);
102 void prune_complex(const size_t nsteps, const size_t flags);
103 std::vector<size_t> prune_betti(const size_t nsteps, const size_t flags);
105 prune_morphisms(const size_t nsteps, const size_t flags);
106 // MutableComplex* trim_complex(const size_t nsteps, const size_t flags)
107
121 {
122 public:
124 const size_t n,
125 std::pair<size_t, size_t> m)
126 : mComplex(C), mIndex(n), mAddr(m)
127 {
128 }
129 iterator(const MutableComplex &C, const size_t n)
130 : mComplex(C), mIndex(n), mAddr(std::pair<size_t, size_t>(0, 0))
131 {
132 }
133 iterator(const iterator &i, std::pair<size_t, size_t> m)
134 : mComplex(i.mComplex), mIndex(i.mIndex), mAddr(m)
135 {
136 }
137
138 size_t index() const { return mIndex; }
139
140 std::pair<size_t, size_t> &operator*() { return mAddr; }
141 const std::pair<size_t, size_t> &operator*() const { return mAddr; }
142
144 {
145 ++mAddr.second;
146 if (mAddr.second >= mComplex.mBetti[mIndex + 1])
147 {
148 ++mAddr.first;
149 mAddr.second = 0;
150 }
151 return *this;
152 }
153 // TODO: define != instead
154 bool operator<(const iterator &o) const
155 {
156 return mIndex < o.mIndex || mAddr < o.mAddr;
157 }
158 iterator end() const
159 {
160 return iterator(*this,
161 std::pair<size_t, size_t>(mComplex.mBetti[mIndex], 0));
162 }
163
164 private:
166 const size_t mIndex;
167 std::pair<size_t, size_t> mAddr;
168 };
169
170 void text_out(buffer &o) const;
171
172 private:
173 const Ring *mRing;
175 const PolynomialRing *mPolynomialRing; // FIXME change to PolyRing?
176 VECTOR(MutableMatrix *) mDifferential;
177 VECTOR(MutableMatrix *) mMorphisms;
178 VECTOR(MutableMatrix *) mDegrees; // TODO keep track of the degree changes
179 std::vector<size_t> mBetti;
180};
181
182#endif
183
184// Local Variables:
185// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
186// indent-tabs-mode: nil
187// End:
Engine-side localisation of a polynomial ring at a prime ideal.
Definition localring.hpp:67
const std::pair< size_t, size_t > & operator*() const
std::pair< size_t, size_t > mAddr
bool operator<(const iterator &o) const
iterator(const MutableComplex &C, const size_t n, std::pair< size_t, size_t > m)
iterator(const MutableComplex &C, const size_t n)
const MutableComplex & mComplex
iterator(const iterator &i, std::pair< size_t, size_t > m)
std::pair< size_t, size_t > & operator*()
VECTOR(MutableMatrix *) mDegrees
std::vector< size_t > mBetti
bool next_unit(iterator &i, const size_t flags) const
MutableComplex(VECTOR(MutableMatrix *) &D)
void prune_unit(const iterator &i, const size_t flags)
void prune_complex(const size_t nsteps, const size_t flags)
std::vector< size_t > prune_betti(const size_t nsteps, const size_t flags)
size_t complexity(const iterator &i, const size_t flags) const
const size_t flags
void text_out(buffer &o) const
const Ring * mRing
VECTOR(MutableMatrix *) mMorphisms
const LocalRing * mLocalRing
bool find_unit(iterator &i, const size_t flags) const
virtual ~MutableComplex()
VECTOR(MutableMatrix *) prune_morphisms(const size_t nsteps
std::vector< iterator > list_units(size_t n, const size_t flags) const
VECTOR(MutableMatrix *) mDifferential
const PolynomialRing * mPolynomialRing
void prune_matrix(size_t n, const size_t flags)
virtual size_t n_cols() const =0
Abstract base class for mutable matrices over an arbitrary engine Ring, the in-place counterpart of t...
Definition mat.hpp:79
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
xxx xxx xxx
Definition ring.hpp:102
Debugger-callable d* helpers that pretty-print engine values to stderr.
EngineObject / MutableEngineObject — shared bases that supply the hash an M2 interpreter object expec...
LocalRing — localisation of a polynomial ring at a prime ideal P.
void size_t
Definition m2-mem.h:114
MutableMatrix — abstract base of every mutable matrix the engine hands across the boundary.
STL namespace.
#define VECTOR(T)
Definition newdelete.hpp:78
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.