carl  24.04
Computer ARithmetic Library
CriticalPairs.tpp
Go to the documentation of this file.
1 /**
2  * @file CriticalPairs.tpp
3  * @ingroup gb
4  * @author Sebastian Junges
5  */
6 #pragma once
7 #include "CriticalPairs.h"
8 
9 namespace carl
10 {
11 
12  template<template <class> class Datastructure, class Configuration>
13  SPolPair CriticalPairs<Datastructure, Configuration>::pop( )
14  {
15  typename Configuration::Entry top = mDatastruct.top( );
16  SPolPair ret = top->getFirst( );
17  if( top->update( ) )
18  {
19  //empty, so we remove the top
20  delete top;
21  mDatastruct.pop( );
22  }
23  else
24  {
25  // not empty, get new leading element
26  mDatastruct.decreaseTop( top );
27  }
28  return ret;
29  }
30 
31  /**
32  *
33  * @param lm
34  * @param newpairs
35  */
36  template<template <class> class Datastructure, class Configuration>
37  void CriticalPairs<Datastructure, Configuration>::elimMultiples( const Monomial::Arg& lm, const std::unordered_map<size_t, SPolPair>& newpairs )
38  {
39  typename Datastructure<Configuration>::const_iterator it( mDatastruct.begin( ) );
40  while( it != mDatastruct.end( ) )
41  {
42  auto ps = it.get( )->getPairsBegin( );
43 
44  for( ++ps; ps != it.get( )->getPairsEnd( ); )
45  {
46  auto spp1 = newpairs.find(ps->mP1);
47  auto spp2 = newpairs.find(ps->mP2);
48 
49  if( spp1 == newpairs.end( ) )
50  {
51  ++ps;
52  continue;
53  }
54  if( spp2 == newpairs.end( ) )
55  {
56  ++ps;
57  continue;
58  }
59 
60  const Monomial::Arg & psLcm = ps->mLcm;
61  if( psLcm->divisible( lm ) && psLcm != spp1->second.mLcm && psLcm != spp2->second.mLcm )
62  {
63  ps = it.get( )->erase( ps );
64  }
65  else
66  {
67  ++ps;
68  }
69  }
70  if( it.get( )->getPairsBegin( ) == it.get( )->getPairsEnd( ) )
71  {
72  mDatastruct.popPosition( it );
73  }
74  else
75  {
76  it.next( );
77  }
78  }
79  }
80 }