Open fritzo opened 3 years ago
@fritzo is this still relevant? I would like to try to implement Dict
and Set
funsors.
I'm unsure whether this is still relevant, and I'd be fine closing this. I haven't minded the singledispatch
solutions to special casing. I'm also concerned that being more abstract will lead to higher overhead.
@eb8680 WDYT?
Alternative to #526
The problem
Funsors currently store data in immutable structures that are typically either nested tuples or frozensets, e.g.
Subs
converts its dict argument to a nested tuple-of-tuples representing key,value pairs. These internal data structures complicate funsor traversal algorithms (e.g.reinterpret
,ast()
,get_children()
), since the intermediate non-Funsor
data structures lack metadata such as.inputs
,.output
,.fresh
,.bound
. This complication manifests as extra checks forisinstance(-, Funsor)
and extra handling to manually traverse funsor data asts.Proposed solution
This issue proposes to replace all internal data structure of funsors by additional low-level Pythonic funsors
Tuple
,Dict
, andSet
. Like other more mathy funsors, these data structural funsors implement metadata like.inputs
,.output
, substitution via.__call__()
and reinterpreted construction and hash consing viatype(-).__call__()
.For example
Subs.subs : Dict
,Delta.terms : Dict
, etc.Remaining questions
Funsor
subclasses for constantsStr
as used as keys? Ideally all terms would be immutable and hash-consed, howeverstr
s are used so ubiquitously as keys that it may not be worth the performance overhead. One option would be to instead rely on Python's built-in hash-consing of strings via sys.intern() and move metadata elsewhere, as in #526Tasks
Dict
funsorSet
funsorDict
andSet
internally in otherFunsor
sfunsor.interpreter