-
-
Notifications
You must be signed in to change notification settings - Fork 481
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Datastructure for objects with prototype (clone) design pattern. #8702
Comments
This comment has been minimized.
This comment has been minimized.
comment:4
Hi mike, I adressed your comment:
and updated a new patch... Please review. |
Reviewer: Mike Hansen |
comment:5
Sorry: I should have said that I also folded your review patch... Thanks for it. |
comment:6
Looks good to me. |
comment:7
Replying to @mwhansen:
Thanks for the review ! |
comment:8
I get doctest errors:
|
Attachment: diff-8702.gz |
comment:9
Replying to @jdemeyer:
Oups ! I forgot to fold some corrective patches. I just resubmitted the corrected version. To ease the review I also uploaded the diff between the older version and the new one. Do not apply this chunk of code. Only apply trac_8702-list_clone-fh.patch |
Attachment: trac_8702-list_clone-fh.2.patch.gz |
comment:10
Added a missing utf8 tag on the file Apply only trac_8702-list_clone-fh.2.patch |
comment:11
Attachment: trac_8702-list_clone-fh.patch.gz Oops ! I forgot to add Copyright notices... Sorry for the mess. Apply only trac_8702-list_clone-fh.patch |
Merged: sage-4.6.2.alpha0 |
The idea is inspired from the "prototype" design pattern (see [Pro], [GOF]).
I want to define subclasses of Element with the following behavior: Those
classes are intended to be used to model mathematical objects, which are by
essence immutable. However, in many occasions, one wants to construct the
data-structure encoding of a new mathematical object by small modifications of
the data structure encoding some already built object. This is a very common
stuff for example in matrices: For example: given a matrix M we want to
replace every non_zero position by 1
However in many cases, for the resulting data-structure to correctly encode
the mathematical object, some structural invariants must hold (say for example
we want that the matrix is symmetric). One problem is that, in many cases,
during the modification process, there is no possibility but to break the
invariants. Here there is no way to keep the matrix symmetric during the
replacement by 1...
A typical example in combinatorics, in a list modeling a permutation of
{1,...,n}, the integers must be distinct. A very common operation is to
take a permutation to make a copy with some small modifications, like
exchanging two consecutive values in the list or cycling some values. Though
the result is clearly a permutations there's no way to avoid breaking the
permutations invariants at some point during the modifications.
So the idea is the following: to allows local breaking of invariant on a
locally mutable copy and to check that things are restored in a proper state
at the end. So I wrote a small class called
ClonableElement
and severalderived subclasses (clone is the standard name for the copy method in the
"prototype" design pattern):
A class C inheriting from ClonableElement must implement the following
two methods
Then, given an instance obj of C, the following sequences of
instructions ensures that the invariants of new_obj are properly
restored at the end
The following equivalent sequence of instructions can be used if speed is
needed, in particular in Cython code (unfortunately, the handling of the with
instruction make some overhead)...
I also took to chance to handle hashing...
This is the future Cython replacement for CombinatorialObject.
[Pro] Prototype pattern http://en.wikipedia.org/wiki/Prototype_pattern
[GOF] Design Patterns: Elements of Reusable Object-Oriented
Software. E. Gamma; R. Helm; R. Johnson; J. Vlissides (1994).
Addison-Wesley. ISBN 0-201-63361-2.
CC: @novoselt @mwhansen @sagetrac-sage-combinat
Component: combinatorics
Author: Florent Hivert
Reviewer: Mike Hansen
Merged: sage-4.6.2.alpha0
Issue created by migration from https://trac.sagemath.org/ticket/8702
The text was updated successfully, but these errors were encountered: