The original reason for making UniqueRepresentation parents was for the 
coercion framework: If parents are UniqueRepresentation you can use 
equality-by-id and hash them super-easy (by id). Hence they can be looked 
up quickly and we can key lookup of coercion-maps easily on fast hashes and 
identity tests.

I do not think they were designed as a memory-saving measure: scenarios 
where a lot of elements are created usually have an obvious parent in the 
vicinity and otherwise parent creation could have an ad-hoc cache.

In fact, in practice UniqueRepresentation quite regularly creates memory 
leaks, due to the fact that the objects live in a global cache, which makes 
them hard to garbage-collect (that the cache is a WeakValueDictionary helps 
a bit but it's still very easy to get reference loops). Another problem is 
that these objects are truly global, so you can't cut corners on keeping 
them immutable! Even caching stuff on them can lead to very complicated 
non-local side effects.

Creating a UniqueRepresentation object also comes with an overhead: the 
construction parameters must be processed and made into a key for the 
cache. If the object already exists, the creation-by-lookup may recoup some 
of that overhead. So parents that are unlikely to be recreated multiple 
times probably experience reduced performance if they are 
UniqueRepresentation.

I don't think that the memory overhead of having *many* 
UniqueRepresentation objects at the same time is very significant: it won't 
change the order of growth of memory use; just the multiplicative factor. 
And probably not by much: a key is not likely to be larger than a complete 
"parent" datastructure (although the processing of the construction 
parameters can make for strange keys!)

It may be that a lot of code has now grown to expect that parents are 
UniqueRepresentation. If your non-UniqueRepresentation parent were to come 
in contact with such code, you'd probably run into trouble. But I don't 
know if or where that is likely to happen. 

On Wednesday, 20 November 2024 at 22:44:00 UTC-8 axio...@yahoo.de wrote:

> Dear all,
>
> my intention was to fix a small shortcoming, reported in 
> https://github.com/sagemath/sage/issues/38897, which surfaced a few 
> further small problems.
>
> One thing I'm unsure about is the following:
>
> Partitions currently inherits from UniqueRepresentation.  However, it is 
> frequently used to get the cardinality of certain subsets, e.g., Partitions 
> of restricted length or restricted part size.  Thus, for each combination 
> of restrictions we create an entry in the global cache. In the example 
> code, *very* many such parents a created.
>
> I just checked IntegerVectors, which also accepts such a wide range of 
> combinations of parameters.  In this class, only certain subclasses have 
> UniqueRepresentation.  Should we do the same for Partitions?
>
> It is actually not completely clear to me what UniqueRepresentation is 
> good for in this setting.  Wouldn't it make sense only for parents that are 
> likely to be used very often?
>
> Have a nice day,
>
> Martin  
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/sage-devel/994d6587-c652-45f5-986d-10ea9014b3fen%40googlegroups.com.

Reply via email to