Macaulay2 Engine
Loading...
Searching...
No Matches
betti.cpp
Go to the documentation of this file.
1#include "betti.hpp"
2
3#include <iostream>
4
10
11BettiDisplay::BettiDisplay(int lodegree, int hidegree, int hilen)
12 : mLoDegree(lodegree),
13 mHiDegree(hidegree),
14 mHiLength(hilen),
15 mNLevels(hilen + 1)
16{
17 int nelems = (hidegree - lodegree + 1) * mNLevels;
18 mValues = new int[nelems];
19 for (int i = 0; i < nelems; i++) mValues[i] = 0;
20}
21
27{
28 int nelems = (mHiDegree - mLoDegree + 1) * mNLevels;
29 mValues = new int[nelems];
30 for (int i = 0; i < nelems; i++) mValues[i] = B.mValues[i];
31}
32
41
43{
44 if (this != &B)
45 {
46 BettiDisplay b(B);
47 swap(b);
48 }
49 return *this;
50}
51
53{
54 delete[] mValues;
55 mValues = nullptr;
56}
57
58void BettiDisplay::resize(int new_lo_degree, int new_hi_degree, int new_length)
59{
60 if (new_lo_degree == mLoDegree && new_hi_degree == mHiDegree &&
61 new_length == mHiLength)
62 return;
63 BettiDisplay C(new_lo_degree, new_hi_degree, new_length);
64 int lodeg = std::max(new_lo_degree, mLoDegree);
65 int hideg = std::min(new_hi_degree, mHiDegree);
66 int len = std::min(new_length, mHiLength);
67 for (int deg = lodeg; deg <= hideg; deg++)
68 for (int lev = 0; lev <= len; lev++) C.entry(deg, lev) = entry(deg, lev);
69 swap(C);
70}
71int& BettiDisplay::entry(int deg, int lev)
72{
73 if (deg < mLoDegree or deg > mHiDegree or lev < 0 or lev > mHiLength)
74 {
75 std::cout << "Internal error: (" << deg << "," << lev << ") out of range"
76 << std::endl;
77 exit(1);
78 }
79 return mValues[lev + mNLevels * (deg - mLoDegree)];
80}
81
86
88{
90 betti_display(o, b);
91}
92
94{
95 buffer o;
96 displayBetti(o);
97 std::cout << o.str() << std::endl;
98}
99
100M2_arrayint BettiDisplay::betti_make(int lo, int hi, int len, int* bettis)
101{
102 int d, lev;
103 int hi1 = hi + 1;
104 int len1 = len + 1;
105
106 // Reset 'hi1' to reflect the top degree that occurs
107 for (d = hi; d >= lo; d--)
108 {
109 for (lev = 0; lev <= len; lev++)
110 if (bettis[lev + (len + 1) * (d - lo)] > 0)
111 {
112 hi1 = d;
113 break;
114 }
115 if (hi1 <= hi) break;
116 }
117 if (hi1 > hi) hi1 = hi;
118
119 // Reset 'len1' to reflect the top level that occurs
120 for (lev = len; lev >= 0; lev--)
121 {
122 for (d = lo; d <= hi1; d++)
123 if (bettis[lev + (len + 1) * (d - lo)] > 0)
124 {
125 len1 = lev;
126 break;
127 }
128 if (len1 <= len) break;
129 }
130 if (len1 > len) len1 = len;
131
132 int totallen = (hi1 - lo + 1) * (len1 + 1);
133 M2_arrayint result = M2_makearrayint(3 + totallen);
134
135 result->array[0] = lo;
136 result->array[1] = hi1;
137 result->array[2] = len1;
138
139 int next = 3;
140 for (d = lo; d <= hi1; d++)
141 for (lev = 0; lev <= len1; lev++)
142 result->array[next++] = bettis[lev + (len + 1) * (d - lo)];
143
144 return result;
145}
146
148{
149 int* a = ar->array;
150 int total_sum = 0;
151 int lo = a[0];
152 int hi = a[1];
153 int len = a[2] + 1;
154 o << "total ";
155 for (int lev = 0; lev < len; lev++)
156 {
157 int sum = 0;
158 for (int d = lo; d <= hi; d++) sum += a[len * (d - lo) + lev + 3];
159 total_sum += sum;
160 o.put(sum, 6);
161 o << ' ';
162 }
163 o << " [" << total_sum << "]" << newline;
164 for (int d = lo; d <= hi; d++)
165 {
166 o.put(d, 5);
167 o << ": ";
168 for (int lev = 0; lev < len; lev++)
169 {
170 int c = a[len * (d - lo) + lev + 3];
171 if (c != 0)
172 o.put(c, 6);
173 else
174 o << " -";
175 o << " ";
176 }
177 o << newline;
178 }
179}
180
181// Local Variables:
182// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
183// indent-tabs-mode: nil
184// End:
BettiDisplay — engine-side container and renderer for the Betti table of a free resolution.
M2_arrayint getBetti() const
Definition betti.cpp:82
void output() const
Definition betti.cpp:93
~BettiDisplay()
Definition betti.cpp:52
int mHiDegree
Definition betti.hpp:89
void resize(int new_lo_degree, int new_hi_degree, int new_length)
Definition betti.cpp:58
BettiDisplay()
Definition betti.cpp:5
int * mValues
Definition betti.hpp:92
BettiDisplay & operator=(const BettiDisplay &B)
Definition betti.cpp:42
void displayBetti(buffer &o) const
Definition betti.cpp:87
int mLoDegree
Definition betti.hpp:88
int & entry(int deg, int lev)
Definition betti.cpp:71
int mHiLength
Definition betti.hpp:90
static void betti_display(buffer &o, M2_arrayint ar)
Definition betti.cpp:147
int mNLevels
Definition betti.hpp:91
void swap(BettiDisplay &B)
Definition betti.cpp:33
static M2_arrayint betti_make(int lo, int hi, int len, int *bettis)
Definition betti.cpp:100
char * str()
Definition buffer.hpp:72
void put(const char *s)
Definition buffer.cpp:35
VALGRIND_MAKE_MEM_DEFINED & result(result)
M2_arrayint M2_makearrayint(int n)
Definition m2-types.cpp:6
char newline[]
Definition m2-types.cpp:49
#define swap(a, b, t)
Definition monsort.hpp:127
void swap(mpfr::mpreal &x, mpfr::mpreal &y)
Definition mpreal.h:3244