Opened 4 years ago

Last modified 3 years ago

#22707 needs_work defect

Remove CombinatorialFreeModule.__contains__

Reported by: SimonKing Owned by:
Priority: major Milestone: sage-8.2
Component: algebra Keywords:
Cc: sage-combinat, nthiery Merged in:
Authors: Simon King Reviewers:
Report Upstream: N/A Work issues:
Branch: u/SimonKing/Remove_custom_contains (Commits) Commit: ba5f963354c69109a6c5abaaaf5dfd1ecbcbafa8
Dependencies: Stopgaps:

Description

Parent.__contains__ is implemented so that x in R is basically the same as R(x)==x.

CombinatorialFreeModule overrides it, so that it becomes x.parent()==R. That notion of containment is totally against Sage's coercion framework and should finally (after 9 years) be removed.

Change History (5)

comment:1 Changed 4 years ago by SimonKing

  • Branch set to u/SimonKing/Remove_custom_contains

comment:2 Changed 4 years ago by SimonKing

  • Authors set to Simon King
  • Commit set to ba5f963354c69109a6c5abaaaf5dfd1ecbcbafa8
  • Status changed from new to needs_review

I didn't run the tests yet...


New commits:

ba5f963Remove custom containment test in CombinatorialFreeModule

comment:3 Changed 4 years ago by tscrim

  • Cc sage-combinat nthiery added

This broadens the result of __contains__ by allowing things that convert into the CFM, so it is a behavior change. I'm not against this change, and I doubt anyone is actually using this distinction, but it is something to be aware of.

sage: F.<x,y> = FreeAlgebra(QQ)
sage: R.<x,y> = FreeAlgebra(ZZ)
sage: elt = 2*x + y
sage: elt in F
False
sage: elt in R
True
sage: F(elt) == elt
True
sage: F(elt) in R
False

Also, in the cases of returning False, it is likely a slower check.

comment:4 Changed 4 years ago by nthiery

Hi Simon, Travis,

Hmm, the behaviour implemented in Parent is tricky and questionable. Generally speaking, anything involving mathematical equality is intrinsically a potential can of worm; see e.g. https://wiki.sagemath.org/EqualityCoercion.

Let's take an example:

sage: S = SymmetricFunctions(QQ)
sage: S.inject_shorthands()
sage: f = s[3]; f
s[3]
sage: f.parent()
Symmetric Functions over Rational Field in the Schur basis
sage: e
Symmetric Functions over Rational Field in the elementary basis
sage: f in e
False
sage: e(s[3])
e[1, 1, 1] - 2*e[2, 1] + e[3]

As a user, I might not expect s to be in e: it's certainly a symmetric function, but not one expressed in the e basis. There is a canonical coercion between the two, but it is nowhere trivial.

Well, maybe I just have to accept that there is no perfect answer and consistency should just be the priority. I don't remember: did we specify explicitly somewhere what the semantic of contains should be, and how it should behave w.r.t. coercion?

In summary, like for equality, I am not comfortable with having coercion involved, but maybe that's ok. On the other hand conversion certainly should not be involved, as there is nothing canonical with them. Maybe that's more or less taken care of by the equality test of R(x)=x.

comment:5 Changed 3 years ago by chapoton

  • Milestone changed from sage-8.0 to sage-8.2
  • Status changed from needs_review to needs_work

does not apply

Note: See TracTickets for help on using tickets.