Opened 8 years ago

Closed 8 years ago

Last modified 5 weeks ago

#5891 closed enhancement (fixed)

Categories for the working mathematics programmer

Reported by: nthiery Owned by: nthiery
Priority: major Milestone: sage-4.3
Component: categories Keywords: categories parents
Cc: sage-combinat, roed, saliola Merged in: sage-4.3.alpha0
Authors: Nicolas M. Thiéry, Teresa Gomez-Diaz Reviewers: Robert Bradshaw, Craig Citro, Florent Hivert, David Kohel, David Roe, Anne Schilling, William Stein, Javier Vengoroso
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Description (last modified by nthiery)

This (series of) patch(es) extends the Sage category framework as a design pattern for organizing generic code.

Latest version of the patches:

Status and roadmap: http://trac.sagemath.org/sage_trac/wiki/CategoriesRoadMap

Some of the things done in this ticket:

  • Categories:
    • Infrastructure:
      • sage.categories.category (500 lines of code)
      • sage.structure.parent (100 lines of code)
      • class manipulation: (25 lines of code)
    • All the mathematical categories of Axiom and MuPAD (Courtesy of Teresa Gomez Diaz) (except *WithSeveralBases? which are not needed anymore; see .abstract_category()) See the category graph: attachment:sage-category-graph.pdf
    • (Infinite/Finite?)EnumeratedSets? (with example) (Courtesy of Florent Hivert)
    • Semigroups (with example, basic methods, subquotients)
    • FiniteSemigroups? (with example, cayley graphs, basic representation theory, ...)
    • ModulesWithBasis? (with example, morphisms)
    • HopfAlgebras? & friends (with a couple examples)
    • Cleanup:
      • Have unique representation by default (no need to inherit from Category_uniq)
      • Have construction / reduce by default
      • Can systematically use the idiom P in Rings()
    • Lattice structure (join, meet); meet needs cleanup; join and meet should be swapped.
  • Reorganization of the Sage library to start using the category framework:
    • Groups:
    • NumberFields?: bug fix (categories-numberfield_homset-nt.patch): Hom(SomeNumberField?,SomeVectorSpace?) returned a numberfield homset
    • Fixed some import loops
    • Square MatrixSpace? in Algebras(...)
    • Added temporary list() methods to:
    • Added sage.sets.finite_enumerated_set
    • Naming conventions and cleanup:
      • parent.product(x,y) parent.product parent.product_on_basis (was: multiply, _multiply, multiply_basis, _multiply_basis)
      • parent.summation(x,y) parent.summation # risk of confusion with infinite summation / ...
  • parent.sum ([x,y,z,y])
  • parent.prod([x,y,z,y])
  • parent.coproduct, parent.coproduct_on_basis, parent.coproduct_on_generators
  • parent.antipode, parent.antipode_on_basis, parent.antipode_on_generators
  • cat.example() cat.counter_example()
  • A.one() A.zero() a.is_one() a.is_zero() A(1) A(0) when it makes sense A.one_element() A.zero_element() deprecated in the doc; fully deprecated later Transitional aliases one = one_element, zero = zero_element
  • Use class.an_instance() whenever meaningful
  • parent.an_element() parent.some_elements(); possibly parent.example() parent.counterexample()
  • all_weakly_super_categories -> all_super_categories(proper=False)

Attachments (6)

categories-framework-nt.patch (145.6 KB) - added by nthiery 8 years ago.
categories-categories-nt.patch (296.9 KB) - added by nthiery 8 years ago.
categories-fixsagelib-nt.patch (36.4 KB) - added by nthiery 8 years ago.
categories-enumeratedsets-nt.patch (5.3 KB) - added by nthiery 8 years ago.
categories-combinat-nt.patch (13.2 KB) - added by nthiery 8 years ago.
categories-numberfield_homset-nt.patch (3.8 KB) - added by nthiery 8 years ago.

Download all attachments as: .zip

Change History (37)

comment:1 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:2 Changed 8 years ago by roed

  • Cc roed added

comment:3 Changed 8 years ago by saliola

  • Cc saliola added

comment:4 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:5 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:6 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:7 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:8 follow-up: Changed 8 years ago by robertwb

Where is categories-nt.patch itself?

comment:9 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:10 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:11 in reply to: ↑ 8 Changed 8 years ago by nthiery

Replying to robertwb:

Where is categories-nt.patch itself?

On the sage-combinat patch server. It changes too often to keep it updated on trac. I highlighted the link on top of the description (and improved the ReSTing)

comment:12 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:13 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:14 Changed 8 years ago by nthiery

  • Status changed from new to assigned

Changed 8 years ago by nthiery

Changed 8 years ago by nthiery

Changed 8 years ago by nthiery

Changed 8 years ago by nthiery

Changed 8 years ago by nthiery

Changed 8 years ago by nthiery

comment:15 Changed 8 years ago by nthiery

There are the patches. They are file-orthogonal, so they should apply in any order.

comment:16 Changed 8 years ago by nthiery

Note: to get the latest version, please use the patch server.

comment:17 follow-up: Changed 8 years ago by was

  • Status changed from new to needs_work

NOTES:

(1) Post the latest version here -- I don't want to mess with the patch server.

(2) It says "Experts: please redefine this properly and/or put CC/RR/... in NumberFields?()". I number field is by definition a finite extension of QQ, but CC and RR are infinite extensions of QQ. So we can't put them in that category. Having a function is_NumberFieldHomsetCodomain does seem like a good workaround for now.

(3) The function is_NumberFieldHomsetCodomain in the patch posted here doesn't have any documentation or doctests. Please add them.

(4) I would change these two lines:

        143	        if is_Field(codomain): 
 	144	            return True 

to the single line

        143	        return is_Field(codomain)

which should be functionally the same, and clearer to read.

(5) in a similar spirit, I would change

        145	    except: 
 	146	        pass     
 	147	    return False 

to just

        145	    except: 
 	146	        return False

which is again clearer and equivalent.

(6) I'm puzzled by this in your number_field_rel.py patch:

	543	            return NotImplemented 

What is NotImplemented?? It's not defined in the number_field_rel.py file in sage-4.2.

comment:18 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:19 in reply to: ↑ 17 ; follow-up: Changed 8 years ago by nthiery

  • Authors set to Nicolas M. Thiéry
  • Description modified (diff)
  • Reviewers set to Robert Bradshaw, Florent Hivert, David Kohel, David Roe, Anne Schilling, Javier Vengoroso
  • Status changed from needs_work to needs_review

Replying to was:

NOTES:

(1) Post the latest version here -- I don't want to mess with the patch server.

I just added direct links in the description. I will post the patches shortly when they will be final.

(2) It says "Experts: please redefine this properly and/or put CC/RR/... in NumberFields?()". I number field is by definition a finite extension of QQ, but CC and RR are infinite extensions of QQ. So we can't put them in that category. Having a function is_NumberFieldHomsetCodomain does seem like a good workaround for now.

Ok.

(3) The function is_NumberFieldHomsetCodomain in the patch posted here doesn't have any documentation or doctests. Please add them.

Oops. Will do.

(4) (5) (6)

Yes better. Will do.

(6) I'm puzzled by this in your number_field_rel.py patch:

	543	            return NotImplemented 

What is NotImplemented?? It's not defined in the number_field_rel.py file in sage-4.2.

It's a builtin python object. Anyway, the function now raises a TypeError?, per the latest _Hom_ protocol.

comment:20 Changed 8 years ago by nthiery

  • Component changed from misc to algebra
  • Status changed from needs_review to needs_work

comment:21 Changed 8 years ago by nthiery

  • Description modified (diff)
  • Reviewers changed from Robert Bradshaw, Florent Hivert, David Kohel, David Roe, Anne Schilling, Javier Vengoroso to Robert Bradshaw, Craig Citro, Florent Hivert, David Kohel, David Roe, Anne Schilling, William Stein, Javier Vengoroso
  • Status changed from needs_work to needs_review

comment:22 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:23 Changed 8 years ago by nthiery

  • Description modified (diff)

comment:24 in reply to: ↑ 19 Changed 8 years ago by nthiery

Replying to nthiery:

Replying to was: ...

Done! See the linked to patch.

I used the occasion to move the field containment logic into Fields where it belongs.

comment:25 Changed 8 years ago by AlexGhitza

  • Component changed from algebra to categories

comment:26 Changed 8 years ago by mhansen

  • Merged in set to sage-4.3.alpha0
  • Resolution set to fixed
  • Status changed from needs_review to closed

Merged the patches from changeset e70487186111. They'll be posted on here in a bit.

comment:27 Changed 8 years ago by mvngu

  • Milestone changed from sage-combinat to sage-4.3

comment:28 Changed 7 years ago by nthiery

  • Authors changed from Nicolas M. Thiéry to Nicolas M. Thiéry, Teresa Gomez-Diaz
  • Report Upstream set to N/A

comment:29 Changed 6 years ago by ltw

  • Description modified (diff)

comment:30 Changed 3 years ago by nthiery

  • Description modified (diff)

comment:31 Changed 5 weeks ago by jdemeyer

Does anybody here remember the reason for the is_extension_type() condition in

    def __make_element_class__(self, cls, name = None, inherit = None):
        """
        A utility to construct classes for the elements of this
        parent, with appropriate inheritance from the element class of
        the category (only for pure python types so far).
        """
        if name is None:
            name = "%s_with_category"%cls.__name__
        # By default, don't fiddle with extension types yet; inheritance from
        # categories will probably be achieved in a different way
        if inherit is None:
            inherit = not is_extension_type(cls)
        if inherit:
            return dynamic_class(name, (cls, self.category().element_class))
        else:
            return cls

I just tried replacing inherit = not is_extension_type(cls) by inherit = True and there is almost nothing which breaks.

Note: See TracTickets for help on using tickets.