139 #ifndef OrderedManager_h_
140 #define OrderedManager_h_
144 template <
class IdxType,
class OrderType>
146 lie_in_same_block(IdxType, IdxType,
const OrderType&,
152 template <
class IdxType,
class OrderType>
154 lie_in_same_block(IdxType first, IdxType second,
const OrderType& order,
157 std::swap(first, second);
159 typename OrderType::block_iterator upper(order.blockBegin());
160 while (first >= *upper)
162 return (second < *upper);
243 class CDynamicOrderBase {
248 typedef CDynamicOrderBase
self;
252 typedef CTypes::bool_type bool_type;
253 typedef CTypes::size_type size_type;
255 typedef CTypes::comp_type comp_type;
256 typedef CTypes::ordercode_type ordercode_type;
257 typedef BoolePolynomial poly_type;
258 typedef poly_type::monom_type monom_type;
259 typedef poly_type::navigator navigator;
260 typedef poly_type::exp_type exp_type;
263 typedef COrderedIter<navigator, monom_type> ordered_iterator;
264 typedef COrderedIter<navigator, exp_type> ordered_exp_iterator;
268 typedef std::vector<idx_type> block_idx_type;
271 typedef block_idx_type::const_iterator block_iterator;
275 CDynamicOrderBase() { }
278 virtual ~CDynamicOrderBase() { }
283 virtual comp_type compare(
const monom_type&,
const monom_type&)
const = 0;
285 virtual comp_type compare(
const exp_type&,
const exp_type&)
const = 0;
288 virtual monom_type lead(
const poly_type&)
const = 0;
291 virtual monom_type lead(
const poly_type&, size_type)
const = 0;
294 virtual exp_type leadExp(
const poly_type&)
const = 0;
297 virtual exp_type leadExp(
const poly_type&, size_type)
const = 0;
300 virtual poly_type leadFirst(
const poly_type&)
const = 0;
303 virtual bool_type isLexicographical()
const = 0;
306 virtual bool_type orderedStandardIteration()
const = 0;
309 virtual bool_type isSymmetric()
const = 0;
312 virtual bool_type isDegreeOrder()
const = 0;
315 virtual bool_type isBlockOrder()
const = 0;
318 virtual bool_type isTotalDegreeOrder()
const = 0;
321 virtual bool_type ascendingVariables()
const = 0;
324 virtual bool_type descendingVariables()
const = 0;
327 virtual bool_type isDegreeReverseLexicograpical()
const = 0;
330 virtual ordered_iterator leadIteratorBegin(
const poly_type&)
const = 0;
332 virtual ordered_iterator leadIteratorEnd()
const = 0;
333 virtual ordered_exp_iterator leadExpIteratorBegin(
const poly_type&)
const = 0;
335 virtual ordered_exp_iterator leadExpIteratorEnd()
const = 0;
338 virtual ordercode_type getOrderCode()
const = 0;
341 virtual ordercode_type getBaseOrderCode()
const = 0 ;
345 virtual block_iterator blockBegin()
const = 0;
346 virtual block_iterator blockEnd()
const = 0;
347 virtual void appendBlock(
idx_type) = 0;
348 virtual void clearBlocks() = 0;
363 template <
class OrderType>
365 public CDynamicOrderBase {
371 typedef OrderType order_type;
374 typedef CDynamicOrderBase base;
377 typedef CDynamicOrder<order_type>
self;
380 typedef COrderProperties<order_type> properties_type;
384 typedef typename base::bool_type bool_type;
385 typedef typename base::size_type size_type;
387 typedef typename base::comp_type comp_type;
388 typedef typename base::monom_type monom_type;
389 typedef typename base::poly_type poly_type;
390 typedef typename base::exp_type exp_type;
391 typedef typename base::ordered_iterator ordered_iterator;
392 typedef typename base::ordered_exp_iterator ordered_exp_iterator;
393 typedef typename base::ordercode_type ordercode_type;
394 typedef typename base::block_iterator block_iterator;
398 CDynamicOrder(
const order_type& theOrder = order_type() ):
399 ordering(theOrder) { }
402 CDynamicOrder(
const self& rhs):
403 ordering(rhs.ordering) { }
410 return ordering.compare(lhs, rhs);
414 comp_type compare(
const monom_type& lhs,
const monom_type& rhs)
const {
415 return ordering.compare(lhs, rhs);
418 comp_type compare(
const exp_type& lhs,
const exp_type& rhs)
const {
419 return ordering.compare(lhs, rhs);
423 monom_type lead(
const poly_type& rhs)
const {
425 return ordering.lead(rhs);
428 monom_type lead(
const poly_type& rhs, size_type bound)
const {
430 return ordering.lead(rhs, bound);
434 exp_type leadExp(
const poly_type& rhs)
const {
436 return ordering.leadExp(rhs);
440 exp_type leadExp(
const poly_type& rhs, size_type bound)
const {
442 return ordering.leadExp(rhs, bound);
446 poly_type leadFirst(
const poly_type& poly)
const {
448 if(orderedStandardIteration())
455 bool_type isLexicographical()
const {
456 return properties_type().isLexicographical();
460 bool_type orderedStandardIteration()
const {
461 return properties_type().orderedStandardIteration();
465 bool_type isSymmetric()
const {
466 return properties_type().isSymmetric();
470 bool_type isDegreeOrder()
const {
471 return properties_type().isDegreeOrder();
475 bool_type isBlockOrder()
const {
476 return properties_type().isBlockOrder();
480 bool_type isTotalDegreeOrder()
const {
481 return properties_type().isTotalDegreeOrder();
485 bool_type isDegreeReverseLexicograpical()
const {
486 return properties_type().isDegreeReverseLexicograpical();
490 bool_type ascendingVariables()
const {
491 return properties_type().ascendingVariables();
495 bool_type descendingVariables()
const {
496 return properties_type().descendingVariables();
504 ordered_iterator leadIteratorBegin(
const poly_type& poly)
const {
505 return ordering.leadIteratorBegin(poly);
508 ordered_iterator leadIteratorEnd()
const {
509 return ordering.leadIteratorEnd();
512 ordered_exp_iterator leadExpIteratorBegin(
const poly_type& poly)
const {
513 return ordering.leadExpIteratorBegin(poly);
516 ordered_exp_iterator leadExpIteratorEnd()
const {
517 return ordering.leadExpIteratorEnd();
521 ordercode_type getOrderCode()
const {
522 return order_type::order_code;
526 ordercode_type getBaseOrderCode()
const {
527 return order_type::baseorder_code;
532 block_iterator blockBegin()
const {
return ordering.blockBegin(); }
533 block_iterator blockEnd()
const {
return ordering.blockEnd(); }
534 void appendBlock(
idx_type idx) { ordering.appendBlock(idx); }
535 void clearBlocks() { ordering.clearBlocks(); }
541 return lie_in_same_block(first, second, *
this,
542 typename properties_type::blockorder_property());