Schubert2: eliminate the unneeded variables in a projective bundle's intersection ring
Nobody has claimed this yet.
- Dominant language
- Macaulay2
- Stars
- 435
- Forks
- 297
- Avg merge
- 4d 20h
- Merged PRs (30d)
- 11
Description
This issue was triaged from bugs/dan/0-Schubert2-projectiveBundle, one of the 857 files removed from the pre-GitHub bugs/ tree by d2c8d27826 and catalogued in #36. The commentary below was written by Claude (Claude Opus 5, via Claude Code), not by @d-torrance, whose account posted it -- please weigh it accordingly.
The original file, verbatim (117 lines)
In the package Schubert2, We could work on eliminating the unneeded variables
in the intersection ring of a projective bundle. But then the explicit
abstract maps that are constructed there by methods of "map" don't work
any more, because the generators of the ring change to something unexpected.
Index: Schubert2/doc.m2
===================================================================
--- Schubert2/doc.m2 (revision 14806)
+++ Schubert2/doc.m2 (working copy)
@@ -172,7 +172,7 @@
rank 1 {\em quotients} of the sheaf provided. The $\PP^5$-bundle of conics is given by sublinebundles of $B$, or
equivalently, by rank 1 quotients of the dual, $B^*$, as in the following code:
Example
- X = projectiveBundle'(dual B, VariableNames => {,{z}})
+ X = projectiveBundle'(dual B, VariableNames => {{z}})
Text
The equation of the general quintic is a section of the fifth symmetric
power of the space of linear forms on $\PP^4$. The induced equation on any given
@@ -1539,7 +1539,7 @@
B = S[h, Join => false]/h^3 -- A^*(P2), but using 2 times a line as the generating class:
integral B := (b) -> (4 * coefficient((B_0)^2, b))
c = 1 + (9/2)*h + (15/2)*h^2 -- normal class
- f = map(B,A,{-h, h, h^2, h^3, h^4, h^5})
+ f = map(B,A,{h})
i = inclusion(f,
NormalClass => c,
Codimension => 3,
@@ -1548,7 +1548,9 @@
X = source i
Xstruct = X / point
rank Xstruct_* tangentBundle X
+ assert( oo == 8 )
integral chern tangentBundle Z
+ assert( oo == 6 )
--------
Node
Key
@@ -2891,7 +2893,7 @@
Pre
> Proj(X,dual(B),z): # X is the projective bundle of all conics.
Example
- X = projectiveBundle'(dual B, VariableNames => {,{z}})
+ X = projectiveBundle'(dual B, VariableNames => {{z}})
Pre
> A:=Symm(5,Qc)-Symm(3,Qc)&*o(-z): # The rank 11 bundle of quintics
> # restricted to the universal conic.
@@ -2985,7 +2987,7 @@
Pre
> Proj(X,dual(B),z):
Example
- X = projectiveBundle'(dual B, VariableNames => {,{z}})
+ X = projectiveBundle'(dual B, VariableNames => {{z}})
Pre
> A:=Symm(6,Qc)-Symm(3,Qc)&@o(-z):
Example
Index: Schubert2.m2
===================================================================
--- Schubert2.m2 (revision 14841)
+++ Schubert2.m2 (working copy)
@@ -727,8 +727,12 @@
if not opts.Isotropic
then t
else t^2 * product gens C);
- pushforward C := r -> coefficient(sectionClass,r);
- pushforward ZZ := pushforward QQ := r -> coefficient(sectionClass,promote(r,C));
+ -- now that we may be eliminating the chern classes of the last tautological bundle, we may have to prune the section class
+ sectionClass = leadTerm sectionClass;
+ sectionClassMonomial := leadMonomial sectionClass;
+ sectionClassCoefficientReciprocal := 1 / lift(leadCoefficient sectionClass,QQ);
+ pushforward C := r -> sectionClassCoefficientReciprocal * coefficient(sectionClassMonomial,r);
+ pushforward ZZ := pushforward QQ := r -> sectionClassCoefficientReciprocal * coefficient(sectionClassMonomial,promote(r,C));
pTangentBundle := (
if opts.Isotropic then (
null -- not implemented
@@ -753,22 +757,22 @@
installMethod(symbol SPACE, OO, RingElement, AbstractSheaf => (OO,h) -> OO_(variety ring h) (h))
projectiveBundle' = method(Options => { VariableNames => null }, TypicalValue => FlagBundle)
-projectiveBundle' ZZ := opts -> n -> flagBundle({n,1},opts)
-projectiveBundle'(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({n,1},X,opts)
-projectiveBundle' AbstractSheaf := opts -> E -> flagBundle({rank E - 1, 1},E,opts)
+projectiveBundle' ZZ := opts -> n -> flagBundle({1},n+1,opts)
+projectiveBundle'(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({1},OO_X^(n+1),opts)
+projectiveBundle' AbstractSheaf := opts -> E -> flagBundle({1},E,opts)
projectiveBundle = method(Options => { VariableNames => null }, TypicalValue => FlagBundle)
-projectiveBundle ZZ := opts -> n -> flagBundle({1,n},opts)
-projectiveBundle(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({1,n},X,opts)
-projectiveBundle AbstractSheaf := opts -> E -> flagBundle({1, rank E - 1},E,opts)
+projectiveBundle ZZ := opts -> n -> flagBundle({1},n+1,opts,QuotientBundles=>false)
+projectiveBundle(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({1},OO_X^(n+1),opts,QuotientBundles=>false)
+projectiveBundle AbstractSheaf := opts -> E -> flagBundle({1},E,opts,QuotientBundles=>false)
projectiveSpace' = method(Options => { VariableName => "h" }, TypicalValue => FlagBundle)
-projectiveSpace' ZZ := opts -> n -> flagBundle({n,1},VariableNames => {,{fixvar opts.VariableName}})
-projectiveSpace'(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({n,1},X,VariableNames => {,{fixvar opts.VariableName}})
+projectiveSpace' ZZ := opts -> n -> flagBundle({1},n+1, VariableNames => {{fixvar opts.VariableName}})
+projectiveSpace'(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({1},OO_X^(n+1), VariableNames => {{fixvar opts.VariableName}})
projectiveSpace = method(Options => { VariableName => "h" }, TypicalValue => FlagBundle)
-projectiveSpace ZZ := opts -> n -> flagBundle({1,n},VariableNames => {{fixvar opts.VariableName},})
-projectiveSpace(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({1,n},X,VariableNames => {{fixvar opts.VariableName},})
+projectiveSpace ZZ := opts -> n -> flagBundle({1}, n+1, VariableNames => {{fixvar opts.VariableName}}, QuotientBundles=>false)
+projectiveSpace(ZZ,AbstractVariety) := opts -> (n,X) -> flagBundle({1},OO_X^(n+1),VariableNames => {{fixvar opts.VariableName}}, QuotientBundles=>false)
PP' = new ScriptedFunctor from { superscript => i -> projectiveSpace' i }
PP = new ScriptedFunctor from { superscript => i -> projectiveSpace i }
@@ -1088,7 +1092,7 @@
-- cannot check that incl is an inclusion, but we check that it is finite
if not (d == dim Y - dim X) then error "Expected a finite morphism";
Ndual := dual N;
- PN := projectiveBundle'(Ndual, VariableNames => {,{x}}); -- x = chern(1,OO_PN(1))
+ PN := projectiveBundle'(Ndual, VariableNames => {{x}}); -- x = chern(1,OO_PN(1))
C := intersectionRing PN;
(BasAModule, bas, iLowerMod) := pushFwd iupper;
-- iLowerMod(element b of B) = one column matrix over A whose product with bas is b
Where it stands today
Never attempted, and the tree is still on the near side of the diff the file carries — which is what
makes the file worth keeping rather than the request itself.
The state today
Schubert2/doc.m2:179 still reads projectiveBundle'(dual B, VariableNames => {,{z}}) and
Schubert2/doc.m2:1525 still reads map(B,A,{-h, h, h^2, h^3, h^4, h^5}) — both of them the minus
lines of the patch in the file. Schubert2.m2 contains no elimination logic. Nothing broke, because
nothing changed.
Why the patch is the useful part
Eliminating the unneeded variables in a projective bundle's intersection ring moves the generators of
that ring, and the explicit abstract maps built there by methods of map are written in terms of the
old generators — so they stop working when the generators change. The two documentation adjustments
in the file are exactly the corrections that entails, written by someone who had tried it.
So anyone attempting the elimination gets a head start: the file records both the obstacle and the
downstream edits it forces.
Notes
No existing issue covers this; #2658 is Schubert2-adjacent but about something else.
open · disposition issue · source of truth: bug-triage/catalog.tsv
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in Schubert2.m2 at the projectiveBundle' and projectiveSpace methods, then inspect the flagBundle implementation and the existing map usage described in Schubert2/doc.m2. The goal is to eliminate unneeded projective-bundle variables while keeping explicit abstract maps working with the changed generators, and to update the documented examples at the cited lines accordingly.
Written by the indexing model from the issue text.
Assessment
- Domain
- tooling
- Issue type
- Refactor
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100