1#ifndef __vector_arithmetic_hpp__
2#define __vector_arithmetic_hpp__
140template<
typename RingType>
179 for (
auto& d : *tempPtr)
181 mRing->init_set(d, v[n]);
190 for (
auto& d : *tempPtr)
206 for (
auto& e : svec) {
233 assert(comps.
size() == svec.size());
234 assert(comps[comps.
size()-1] <
dvec.size());
236 auto len = comps.
size();
248 typename RingType::Element a(*
mRing,
dvec[comps[0]]);
249 for (
int i=1; i < comps.
size(); ++i)
250 mRing->subtract_multiple(
dvec[comps[i]], a, svec[i]);
270 mRing->set_from_long(one, 1);
271 if (not
mRing->is_equal(svec[0], one))
274 for (
int i=1; i < comps.
size(); ++i)
276 mRing->subtract_multiple(
dvec[comps[i]], b, svec[i]);
277 mStats.incrementNumAdditions();
290 for (
int i = first; i <= last; i++)
309 mtbb::null_mutex noLock;
319 template<
typename LockType>
326 LockType& lock)
const
334 for (
int i = first; i >= 0 and i <= last; i++)
343 for (
int i = first; i >= 0 and i <= last; i++)
365 for (
int i = first; i >= 0 and i <= last; i++)
369 comps =
new int[len];
375 for (
int i = first; i >= 0 and i <= last; i++)
393 for (
int i = first; i >= 0 and i <= last; i++)
401 typename RingType::Element leadCoeffInv(*
mRing);
403 mRing->invert(leadCoeffInv,svec[0]);
405 for (
auto& c : svec) {
mRing->mult(c, c, leadCoeffInv); }
408 template<
typename Container>
413 for (
const auto& a : svec)
416 mRing->to_ring_elem(tmp,a);
421 template<
typename Container>
426 for (
auto i = 0; i < c.size(); ++i)
428 mRing->from_ring_elem(svec[i], c[i]);
433 template<
typename Container>
438 for (
auto i = 0; i < c.size(); ++i)
440 mRing->set_from_long(svec[i], c[i]);
445 template<
typename Container>
450 for (
auto i = 0; i < c.size(); ++i)
452 __mpz_struct*
x =
const_cast<__mpz_struct*
>(c[i].get_mpz_t());
453 mRing->set_from_mpz(svec[i],
x);
463 mRing->to_ring_elem(tmp,svec[index]);
472 mRing->elem_text_out(b, vec[index],
true,
true,
true);
482 o <<
"[(" << vec.size() <<
")";
483 for (
const auto& a : vec)
486 mRing->elem_text_out(b, a,
true,
true,
true);
493 o <<
"]" << std::endl;
505 auto c = vec.cbegin();
506 o <<
"[(" << vec.size() <<
") ";
507 for (
auto j = 0; j < len; ++j)
509 if (i == comps.
cend() or *i != j)
514 mRing->elem_text_out(b, *c,
true,
true,
true);
520 o <<
"]" << std::endl;
540 mRing->set_from_long(one, 1);
541 svec.emplace_back(one);
559 assert(loc < svec2.size());
561 mRing->init_set(a, svec2[loc]);
562 svec.emplace_back(a);
571 assert(loc < svec2.size());
573 mRing->init_set(a, svec2[loc]);
575 svec.emplace_back(a);
587 mRing->from_ring_elem(inumer, numer);
588 svec.emplace_back(inumer);
596 return mRing->coerceToLongInteger(svec[loc]);
603 return mRing->coerceToLongInteger(svec[loc]);
610 return mRing->coerceToLongInteger(svec[loc]);
626 mRing->from_ring_elem(inumer, numer);
627 svec.emplace_back(inumer);
668 using CVA_Type = std::variant<ConcreteVectorArithmetic<M2::ARingZZpFlint>*,
723 std::cout <<
"Using GC ring in VectorArithmetic." << std::endl;
730 std::cerr <<
"*** error! *** ring ID not found....!" << std::endl;
745 return std::visit([&](
auto& arg) ->
size_t {
return arg->size(coeffs); },
mConcreteVector);
766 std::visit([&](
auto& arg) { arg->deallocateElementArray(coeffs); },
mConcreteVector);
775 std::visit([&](
auto& arg) { arg->fillDenseArray(dense,coeffs,comps); },
mConcreteVector);
781 std::visit([&](
auto& arg) { arg->denseCancelFromSparse(dense,coeffs,comps); },
mConcreteVector);
788 std::visit([&](
auto& arg) { arg->denseCancelFromSparse(dense,coeffs,comps,result_multipler); },
mConcreteVector);
794 return std::visit([&](
auto& arg) ->
int {
return arg->denseNextNonzero(dense,first,last); },
mConcreteVector);
803 std::visit([&](
auto& arg) { arg->denseToSparse(dense,coeffs,comps,first,last,monomialSpace); },
mConcreteVector);
811 std::visit([&](
auto& arg) { arg->denseToSparse(dense,coeffs,comps,first,last); },
mConcreteVector);
814 template<
typename LockType>
821 LockType& lock)
const {
828 std::visit([&](
auto& arg) { arg->setZeroInRange(dense, first, last); },
mConcreteVector);
832 std::visit([&](
auto& arg) { arg->makeMonic(coeffs); },
mConcreteVector);
839 template<
class Container>
841 Container& c)
const {
845 template<
class Container>
850 template<
class Container>
855 template<
class Container>
862 return std::visit([&](
auto& arg) ->
ring_elem {
return arg->ringElemFromElementArray(coeffs,index); },
mConcreteVector);
871 return std::visit([&](
auto& arg) -> std::ostream& {
return arg->displayElement(o, v, index); },
mConcreteVector);
876 return std::visit([&](
auto& arg) -> std::ostream& {
return arg->displayElementArray(o, v); },
mConcreteVector);
885 return std::visit([&](
auto& arg) -> std::ostream& {
return arg->displayAsDenseArray(o, len, v, comps); },
mConcreteVector);
890 return std::visit([&](
auto& arg) ->
long {
return arg->mStats.numAdditions(); },
mConcreteVector);
895 return std::visit([&](
auto& arg) ->
long {
return arg->to_modp_long(coeffs, loc); },
mConcreteVector);
904 return std::visit([&](
auto& arg) { arg->pushBackOne(coeffs); },
mConcreteVector);
909 return std::visit([&](
auto& arg) { arg->pushBackMinusOne(coeffs); },
mConcreteVector);
916 return std::visit([&](
auto& arg) { arg->pushBackElement(coeffs,take_from_here,loc); },
mConcreteVector);
923 return std::visit([&](
auto& arg) { arg->pushBackNegatedElement(coeffs,take_from_here,loc); },
mConcreteVector);
931 return std::visit([&](
auto& arg) { arg->from_ring_elem(coeffs,numer,denom_not_used_except_QQ); },
mConcreteVector);
Bump-pointer arena allocator for transient inner-loop allocations.
Home-rolled std::span substitute and zipped-range view for the NC engines.
ConcreteRing<RingType> — the templated bridge between aring and the legacy Ring API.
void denseCancelFromSparse(ElementArray &dense, const ElementArray &sparse, const Range< const int > &comps, ElementArray &result_multiplier) const
ElementArray elementArrayFromContainer(const Container &c) const
friend class VectorArithmetic
ElementArray copyElementArray(const ElementArray &sparse) const
void denseToSparse(ElementArray &dense, ElementArray &sparse, Range< int > &comps, int first, int last, MemoryBlock &monomialSpace) const
void deallocateElementArray(ElementArray &coeffs) const
size_t size(const ElementArray &coeffs) const
Linear Algebra /////.
VectorArithmeticStats mStats
std::ostream & displayElement(std::ostream &o, const ElementArray &v, int index) const
void pushBackOne(ElementArray &coeffs) const
Append support /////.
void setZeroInRange(ElementArray &dense, int first, int last) const
void safeDenseToSparse(ElementArray &dense, ElementArray &sparse, Range< int > &comps, int first, int last, MemoryBlock &monomialSpace, LockType &lock) const
ElementArray elementArrayFromContainerOfLongs(const Container &c) const
std::ostream & displayElementArray(std::ostream &o, const ElementArray &v) const
void fillDenseArray(ElementArray &dense, const ElementArray &sparse, const Range< const int > &comps) const
ElementArray allocateElementArray(ComponentIndex nelems) const
const Ring * ring() const
const VectorArithmeticStats & stats() const
const Ring * mOriginalRing
void makeMonic(ElementArray &sparse) const
long to_modp_long(const ElementArray &coeffs, size_t loc) const
ElementArrayContainer * elementArray(const ElementArray &f) const
std::ostream & displayAsDenseArray(std::ostream &o, size_t len, const ElementArray &v, const Range< const int > &comps) const
void pushBackMinusOne(ElementArray &coeffs) const
void from_ring_elem(ElementArray &coeffs, ring_elem numer, ring_elem denom) const
ring_elem ringElemFromElementArray(const ElementArray &sparse, int index) const
ConcreteVectorArithmetic(const Ring *origR, const RingType *R)
void denseToSparse(ElementArray &dense, ElementArray &sparse, int *&comps, int first, int last) const
int denseNextNonzero(ElementArray &dense, int first, int last) const
ElementArray allocateElementArray() const
void denseCancelFromSparse(ElementArray &dense, const ElementArray &sparse, const Range< const int > &comps) const
void appendToContainer(const ElementArray &sparse, Container &c) const
void pushBackElement(ElementArray &coeffs, const ElementArray &take_from_here, size_t loc) const
ConcreteVectorArithmetic()
typename RingType::ElementContainerType ElementArrayContainer
void pushBackNegatedElement(ElementArray &coeffs, const ElementArray &take_from_here, size_t loc) const
typename RingType::ElementType FieldElement
ElementArray elementArrayFromContainerOf_mpz_class(const Container &c) const
void swap(ElementArray &b)
friend class ConcreteVectorArithmetic
void setValue(void *newValue)
Type-erased owning handle to a dense coefficient vector held by a ConcreteVectorArithmetic<Ring>.
std::pair< T *, T * > safeAllocateArray(size_t nelems, MutexType &mutex)
Thin RAII wrapper around memtailor::Arena providing bump-pointer array allocation with optional mutex...
virtual M2::RingID ringID() const
const CoefficientRingR * getCoefficientRingR() const
virtual const Z_mod * cast_to_Z_mod() const
void setZeroInRange(ElementArray &dense, int first, int last) const
std::variant< ConcreteVectorArithmetic< M2::ARingZZpFlint > *, ConcreteVectorArithmetic< M2::ARingGFFlintBig > *, ConcreteVectorArithmetic< M2::ARingGFFlint > *, ConcreteVectorArithmetic< M2::ARingQQGMP > *, ConcreteVectorArithmetic< M2::ARingZZpFFPACK > *, ConcreteVectorArithmetic< M2::ARingZZp > *, ConcreteVectorArithmetic< M2::ARingGFM2 > *, ConcreteVectorArithmetic< CoefficientRingR > *, ConcreteVectorArithmetic< CoefficientRingZZp > *, ConcreteVectorArithmetic< M2::DummyRing > * > CVA_Type
VectorArithmetic(const Ring *R)
ElementArray allocateElementArray(ComponentIndex nelems) const
Create a coefficient vector with room for nelems coefficients.
void deallocateElementArray(ElementArray &coeffs) const
Deallocate all the coefficients, and the array itself.
void denseToSparse(ElementArray &dense, ElementArray &coeffs, int *&comps, int first, int last) const
const VectorArithmeticStats & stats() const
std::ostream & displayAsDenseArray(std::ostream &o, size_t len, const ElementArray &v, const Range< const int > &comps) const
ElementArray elementArrayFromContainer(const Container &c) const
long getNumAdditions() const
ring_elem ringElemFromElementArray(const ElementArray &coeffs, int index) const
ElementArray copyElementArray(const ElementArray &sparse) const
int denseNextNonzero(ElementArray &dense, int first, int last) const
std::ostream & displayElementArray(std::ostream &o, const ElementArray &v) const
long to_modp_long(const ElementArray &coeffs, size_t loc) const
ElementArray allocateElementArray() const
void denseToSparse(ElementArray &dense, ElementArray &coeffs, Range< int > &comps, int first, int last, MemoryBlock &monomialSpace) const
void safeDenseToSparse(ElementArray &dense, ElementArray &coeffs, Range< int > &comps, int first, int last, MemoryBlock &monomialSpace, LockType &lock) const
void fillDenseArray(ElementArray &dense, const ElementArray &coeffs, const Range< const int > &comps) const
Linear Algebra /////.
void makeMonic(ElementArray &coeffs) const
std::ostream & displayElement(std::ostream &o, const ElementArray &v, int index) const
(Debugging) Display /////
void pushBackMinusOne(ElementArray &coeffs) const
void pushBackElement(ElementArray &coeffs, const ElementArray &take_from_here, size_t loc) const
ElementArray elementArrayFromContainerOfLongs(const Container &c) const
ElementArray elementArrayFromContainerOf_mpz_class(const Container &c) const
void denseCancelFromSparse(ElementArray &dense, const ElementArray &coeffs, const Range< const int > &comps) const
void from_ring_elem(ElementArray &coeffs, ring_elem numer, ring_elem denom_not_used_except_QQ) const
void pushBackOne(ElementArray &coeffs) const
Append support /////.
size_t size(const ElementArray &coeffs) const
const Ring * ring() const
void denseCancelFromSparse(ElementArray &dense, const ElementArray &coeffs, const Range< const int > &comps, ElementArray &result_multipler) const
void appendToContainer(const ElementArray &coeffs, Container &c) const
Translation //////////.
void pushBackNegatedElement(ElementArray &coeffs, const ElementArray &take_from_here, size_t loc) const
long numAdditions() const
void incrementNumAdditions() const
Lightweight counter attached to a ConcreteVectorArithmetic<Ring> for tracking how many coefficient ad...
CoefficientRingZZp * get_CoeffRing() const
void dvec(const Ring *R, const vec v)
@ ring_old
refers to all rings which are not ConcreteRing's.
Engine TBB shim — single point of inclusion for every parallel primitive.
void swap(mpfr::mpreal &x, mpfr::mpreal &y)
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
ring_elem — the universal value type carried by every Ring* in the engine.