From d91fea3ac8b4c4585f6ae406bd5aa29a88915807 Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Tue, 13 May 2025 12:56:30 +0100 Subject: [PATCH 001/691] Update from develop repo Adding the changes from ollieclarke8787/WorkshopDurham2024@8f94f390933ece5951b0b8995f2393a84ddfdb29 and ollieclarke8787/WorkshopDurham2024@a45e5e9ef2a5646e9dd415447715452372626107 --- M2/Macaulay2/packages/AllMarkovBases.m2 | 142 ++++++++++++++++++++---- 1 file changed, 121 insertions(+), 21 deletions(-) diff --git a/M2/Macaulay2/packages/AllMarkovBases.m2 b/M2/Macaulay2/packages/AllMarkovBases.m2 index 0c53f923a51..c0ce89d598c 100644 --- a/M2/Macaulay2/packages/AllMarkovBases.m2 +++ b/M2/Macaulay2/packages/AllMarkovBases.m2 @@ -2,7 +2,7 @@ newPackage( "AllMarkovBases", Version => "1.0", Date => "May 08, 2025", - Headline => "computing all minimal Markov bases of a configuration matrix", + Headline => "package for computing all minimal Markov bases of a configuration matrix", Authors => { {Name => "Alexander Milner", Email => "A.J.C.Milner@sms.ed.ac.uk", @@ -11,7 +11,6 @@ newPackage( Email => "oliver.clarke@durham.ac.uk", HomePage => "https://www.oliverclarkemath.com/"} }, - Keywords => {"Algebraic Statistics"}, AuxiliaryFiles => false, DebuggingMode => false, PackageExports => {"FourTiTwo","Graphs","Normaliz"} @@ -70,8 +69,8 @@ computeFiberInternal = method( ); computeFiberInternal (Matrix,List) := opts -> (A, val) -> ( if not (A.cache#"fibers")#?val or (opts.ReturnConnectedComponents and (A.cache#"fiberStarters")#?val and not (A.cache#"fiberComponents")#?val) then( - if opts.FiberAlgorithm == "lattice" then computeFiberInternalLattice(A,val,ReturnConnectedComponents=>opts.ReturnConnectedComponents) - else if opts.FiberAlgorithm == "fast" then computeFiberInternalFast(A,val) + if opts.FiberAlgorithm == "fast" then computeFiberInternalFast(A,val) + else if opts.FiberAlgorithm == "lattice" then computeFiberInternalLattice(A,val,ReturnConnectedComponents=>opts.ReturnConnectedComponents) else if opts.FiberAlgorithm == "decompose" or opts.FiberAlgorithm == "markov" then computeFiberInternalDecompose(A,val,ReturnConnectedComponents=>opts.ReturnConnectedComponents,FiberAlgorithm=>opts.FiberAlgorithm) else error("unknown input for FiberAlgorithm option"); ); @@ -89,7 +88,11 @@ computeFiberInternalFast (Matrix,List) := (A,val) -> ( ); u ); - validMoves := for move in entries A.cache#"MarkovBasis" list if ((A.cache#"fiberValues")#move << val) and ((A.cache#"fiberValues")#move != val) then move else continue; + validMoves := if A.cache#"NN" then( + for move in entries A.cache#"MarkovBasis" list if ((A.cache#"fiberValues")#move << val) and ((A.cache#"fiberValues")#move != val) then move else continue + )else( + for move in entries A.cache#"MarkovBasis" list if (A.cache#"fiberValues")#move != val then move else continue + ); validMoves = new MutableHashTable from ((v -> {v,true}) \ validMoves); out := for i from 0 to #buildFiber - 1 list( cc := set {buildFiber#i}; @@ -121,10 +124,11 @@ computeFiberInternalLattice = method( } ); computeFiberInternalLattice (Matrix,List) := opts -> (A,val) -> ( - M := transpose matrix for basisElement in entries A.cache#"MarkovBasis" list if (A.cache#"fiberValues")#basisElement< ( computeFiberInternalDecompose = method( Options => { ReturnConnectedComponents => false, - FiberAlgorithm => "decompose" + FiberAlgorithm => "fast" } ); computeFiberInternalDecompose (Matrix,List) := opts -> (A,val) -> ( - if opts.FiberAlgorithm == "decompose" then( - A.cache#"Ring" = ZZ(monoid[Variables => numRows A + numColumns A,MonomialOrder=>Eliminate numRows A]); - A.cache#"RingGenerators" = gens A.cache#"Ring"; - A.cache#"toricIdeal"=toricGroebner(id_(ZZ^(numRows A)) | A, A.cache#"Ring"); + if opts.FiberAlgorithm == "decompose" and not A.cache#?"Ring" then( + if A.cache#"NN" then( + A.cache#"Ring" = ZZ(monoid[Variables => numRows A + numColumns A,MonomialOrder=>Eliminate numRows A]); + A.cache#"RingGenerators" = gens A.cache#"Ring"; + A.cache#"toricIdeal"=toricGroebner(id_(ZZ^(numRows A)) | A, A.cache#"Ring"); + )else( + A.cache#"Ring" = ZZ(monoid[Variables => 2*numRows A + numColumns A,MonomialOrder=>Eliminate (2*numRows A)]); + A.cache#"RingGenerators" = gens A.cache#"Ring"; + A.cache#"toricIdeal"=toricGroebner(id_(ZZ^(numRows A)) | -id_(ZZ^(numRows A)) | A, A.cache#"Ring"); + ); ); if (A.cache#"fiberStarters")#?val and opts.ReturnConnectedComponents then ( out := for z in pairs A.cache#"fiberValues" list( - if z#1==val or not (z#1 << val) then continue; - resid := val-z#1; + if z#1 == val then continue; + resid := val-z#1; + if A.cache#"NN" then( + if not (z#1 << val) then continue; + )else( + if any(A.cache#"supportingHyperplanes",z->(matrix{z}*(vector resid))_0<0) then continue; + ); if not (A.cache#"fibers")#?resid then fibRecursion(A,resid,FiberAlgorithm=>opts.FiberAlgorithm); if #((A.cache#"fibers")#resid)==0 then continue; fibAdd((A.cache#"posNeg")#(z#0),(A.cache#"fibers")#resid) @@ -186,6 +201,7 @@ computeFiberInternalDecompose (Matrix,List) := opts -> (A,val) -> ( )else fibRecursion(A,val,FiberAlgorithm=>opts.FiberAlgorithm); ); + -- recursive method using decompose algorithm (unexported) fibRecursion = method( Options => { @@ -195,9 +211,13 @@ fibRecursion = method( ); fibRecursion (Matrix,List) := opts -> (A, val) -> ( out := union for z in pairs A.cache#"fiberValues" list( - if not (z#1 << val) then continue; - if z#1==val and (A.cache#"fiberStarters")#?val then continue (A.cache#"posNeg")#(z#0); - resid := val-z#1; + if z#1==val and (A.cache#"fiberStarters")#?val then continue (A.cache#"posNeg")#(z#0); + resid := val-z#1; + if A.cache#"NN" then( + if not (z#1 << val) then continue; + )else( + if any(A.cache#"supportingHyperplanes",z->(matrix{z}*(vector resid))_0<0) then continue; + ); if not (A.cache#"fibers")#?resid then fibRecursion(A,resid,FiberAlgorithm=>opts.FiberAlgorithm); if #((A.cache#"fibers")#resid) == 0 then continue; fibAdd((A.cache#"posNeg")#(z#0),(A.cache#"fibers")#resid) @@ -209,8 +229,13 @@ fibRecursion (Matrix,List) := opts -> (A, val) -> ( if row#0 == 1 and all(r,z->z<=0) then (out = set{-r}; break;); ); )else ( - e:=first exponents (product(for i from 0 to #val-1 list ((A.cache#"RingGenerators")#i)^(val#i)) % A.cache#"toricIdeal"); - if take(e,numRows A) == toList((numRows A):0) then out = set{take(e,-numColumns A)}; + if A.cache#"NN" then( + e1:=first exponents (product(for i from 0 to #val-1 list ((A.cache#"RingGenerators")#i)^(val#i)) % A.cache#"toricIdeal"); + if take(e1,numRows A) == toList((numRows A):0) then out = set{take(e1,-numColumns A)}; + )else( + e2:=first exponents (product(for i from 0 to #val-1 list if val#i>0 then ((A.cache#"RingGenerators")#i)^(val#i) else ((A.cache#"RingGenerators")#(i+numRows A))^(-val#i)) % A.cache#"toricIdeal"); + if take(e2,2*numRows A) == toList((2*numRows A):0) then out = set{take(e2,-numColumns A)}; + ); ); ); (A.cache#"fibers")#val = out; @@ -232,7 +257,7 @@ fiberGraph = method( } ); fiberGraph Matrix := opts -> A -> ( - if not A.cache#?"MarkovBasis" then setupFibers A; + if not A.cache#?"MarkovBasis" then elapsedTime setupFibers A; if opts.ReturnConnectedComponents then( if not A.cache#"componentsComputed" then ( for val in rsort keys A.cache#"fiberStarters" do computeFiberInternal(A,val,ReturnConnectedComponents=>true,FiberAlgorithm=>opts.FiberAlgorithm); @@ -273,6 +298,12 @@ setupFibers Matrix := A -> ( A.cache#"fiberComponents" = new MutableHashTable; A.cache#"componentsComputed" = false; A.cache#"fiberGraphs" = new MutableHashTable; + A.cache#"NN"= all(for row in entries A list all(for el in row list el>=0,z->z),z->z); + N:=normaliz(A,"normalization",allComputations=>true); + S:=entries N#"sup"; + G:=entries N#"gen"; + tem := transpose matrix for row in entries A list S#(position(G,z->z==row)); + A.cache#"supportingHyperplanes" = for el in entries tem list if el == toList(#S:0) then continue else el; ); @@ -1400,3 +1431,72 @@ installPackage "AllMarkovBases" check AllMarkovBases viewHelp AllMarkovBases + + + + + +-- computeFiberInternalDecompose = method( +-- Options => { +-- ReturnConnectedComponents => false, +-- FiberAlgorithm => "fast" +-- } +-- ); +-- computeFiberInternalDecompose (Matrix,List) := opts -> (A,val) -> ( +-- if opts.FiberAlgorithm == "decompose" and not A.cache#?"Ring" then( +-- A.cache#"Ring" = ZZ(monoid[Variables => 2*numRows A + numColumns A,MonomialOrder=>Eliminate (2*numRows A)]); +-- A.cache#"RingGenerators" = gens A.cache#"Ring"; +-- A.cache#"toricIdeal"=toricGroebner(id_(ZZ^(numRows A)) | -id_(ZZ^(numRows A)) | A, A.cache#"Ring"); +-- ); +-- if (A.cache#"fiberStarters")#?val and opts.ReturnConnectedComponents then ( +-- out := for z in pairs A.cache#"fiberValues" list( +-- print z#1; +-- if z#1==val or not (z#1 << val) then continue; +-- resid := val-z#1; +-- if not (A.cache#"fibers")#?resid then fibRecursion(A,resid,FiberAlgorithm=>opts.FiberAlgorithm); +-- if #((A.cache#"fibers")#resid)==0 then continue; +-- fibAdd((A.cache#"posNeg")#(z#0),(A.cache#"fibers")#resid) +-- ); +-- G := new HashTable from for i from 0 to #out-1 list (out#i,for j from i+1 to #out-1 list if not #intersect(out#i,out#j)==0 then out#j else continue); +-- out = apply(connectedComponents graph(out,pairs G),z->toList union z); +-- out = out | apply(toList ((A.cache#"fiberStarters")#val - (flatten out)),v->{v}); +-- (A.cache#"fiberComponents")#val = out; +-- (A.cache#"fibers")#val = flatten out; +-- )else fibRecursion(A,val,FiberAlgorithm=>opts.FiberAlgorithm); +-- ); + +-- -- recursive method using decompose algorithm (unexported) +-- fibRecursion = method( +-- Options => { +-- FiberAlgorithm => "decompose" +-- } + +-- ); +-- fibRecursion (Matrix,List) := opts -> (A, val) -> ( +-- print val; +-- out := union for z in pairs A.cache#"fiberValues" list( +-- if not (z#1 << val) then continue; +-- if z#1==val and (A.cache#"fiberStarters")#?val then continue (A.cache#"posNeg")#(z#0); +-- resid := val-z#1; +-- if not (A.cache#"fibers")#?resid then fibRecursion(A,resid,FiberAlgorithm=>opts.FiberAlgorithm); +-- if #((A.cache#"fibers")#resid) == 0 then continue; +-- fibAdd((A.cache#"posNeg")#(z#0),(A.cache#"fibers")#resid) +-- ); +-- if #out==0 then( +-- if opts.FiberAlgorithm == "markov" then ( +-- for row in entries toricMarkov ((matrix vector val) | A) do( +-- r := drop(row,1); +-- if row#0 == 1 and all(r,z->z<=0) then (out = set{-r}; break;); +-- ); +-- )else ( +-- e:=first exponents (product(for i from 0 to #val-1 list if val#i>0 then ((A.cache#"RingGenerators")#i)^(val#i) else ((A.cache#"RingGenerators")#(i+numRows A))^(-val#i)) % A.cache#"toricIdeal"); +-- if take(e,2*numRows A) == toList((2*numRows A):0) then out = set{take(e,-numColumns A)}; +-- ); +-- ); +-- (A.cache#"fibers")#val = out; +-- ); + +-- fibAdd = method(); +-- fibAdd (Set,Set) := (L1,L2) -> ( +-- set flatten for l1 in keys L1 list for l2 in keys L2 list l1+l2 +-- ); From 557706b022cd00daccad40032f701f22ce765085 Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Tue, 13 May 2025 14:31:23 +0100 Subject: [PATCH 002/691] Remove package for in headline --- M2/Macaulay2/packages/AllMarkovBases.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/AllMarkovBases.m2 b/M2/Macaulay2/packages/AllMarkovBases.m2 index c0ce89d598c..8e71d5251f0 100644 --- a/M2/Macaulay2/packages/AllMarkovBases.m2 +++ b/M2/Macaulay2/packages/AllMarkovBases.m2 @@ -2,7 +2,7 @@ newPackage( "AllMarkovBases", Version => "1.0", Date => "May 08, 2025", - Headline => "package for computing all minimal Markov bases of a configuration matrix", + Headline => "computing all minimal Markov bases of a configuration matrix", Authors => { {Name => "Alexander Milner", Email => "A.J.C.Milner@sms.ed.ac.uk", From b99afd0d63d3b40ff52602b7ba9dbb475b1a34e8 Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Tue, 13 May 2025 14:32:10 +0100 Subject: [PATCH 003/691] remove commented code at eof --- M2/Macaulay2/packages/AllMarkovBases.m2 | 69 ------------------------- 1 file changed, 69 deletions(-) diff --git a/M2/Macaulay2/packages/AllMarkovBases.m2 b/M2/Macaulay2/packages/AllMarkovBases.m2 index 8e71d5251f0..1a737cb9efd 100644 --- a/M2/Macaulay2/packages/AllMarkovBases.m2 +++ b/M2/Macaulay2/packages/AllMarkovBases.m2 @@ -1431,72 +1431,3 @@ installPackage "AllMarkovBases" check AllMarkovBases viewHelp AllMarkovBases - - - - - --- computeFiberInternalDecompose = method( --- Options => { --- ReturnConnectedComponents => false, --- FiberAlgorithm => "fast" --- } --- ); --- computeFiberInternalDecompose (Matrix,List) := opts -> (A,val) -> ( --- if opts.FiberAlgorithm == "decompose" and not A.cache#?"Ring" then( --- A.cache#"Ring" = ZZ(monoid[Variables => 2*numRows A + numColumns A,MonomialOrder=>Eliminate (2*numRows A)]); --- A.cache#"RingGenerators" = gens A.cache#"Ring"; --- A.cache#"toricIdeal"=toricGroebner(id_(ZZ^(numRows A)) | -id_(ZZ^(numRows A)) | A, A.cache#"Ring"); --- ); --- if (A.cache#"fiberStarters")#?val and opts.ReturnConnectedComponents then ( --- out := for z in pairs A.cache#"fiberValues" list( --- print z#1; --- if z#1==val or not (z#1 << val) then continue; --- resid := val-z#1; --- if not (A.cache#"fibers")#?resid then fibRecursion(A,resid,FiberAlgorithm=>opts.FiberAlgorithm); --- if #((A.cache#"fibers")#resid)==0 then continue; --- fibAdd((A.cache#"posNeg")#(z#0),(A.cache#"fibers")#resid) --- ); --- G := new HashTable from for i from 0 to #out-1 list (out#i,for j from i+1 to #out-1 list if not #intersect(out#i,out#j)==0 then out#j else continue); --- out = apply(connectedComponents graph(out,pairs G),z->toList union z); --- out = out | apply(toList ((A.cache#"fiberStarters")#val - (flatten out)),v->{v}); --- (A.cache#"fiberComponents")#val = out; --- (A.cache#"fibers")#val = flatten out; --- )else fibRecursion(A,val,FiberAlgorithm=>opts.FiberAlgorithm); --- ); - --- -- recursive method using decompose algorithm (unexported) --- fibRecursion = method( --- Options => { --- FiberAlgorithm => "decompose" --- } - --- ); --- fibRecursion (Matrix,List) := opts -> (A, val) -> ( --- print val; --- out := union for z in pairs A.cache#"fiberValues" list( --- if not (z#1 << val) then continue; --- if z#1==val and (A.cache#"fiberStarters")#?val then continue (A.cache#"posNeg")#(z#0); --- resid := val-z#1; --- if not (A.cache#"fibers")#?resid then fibRecursion(A,resid,FiberAlgorithm=>opts.FiberAlgorithm); --- if #((A.cache#"fibers")#resid) == 0 then continue; --- fibAdd((A.cache#"posNeg")#(z#0),(A.cache#"fibers")#resid) --- ); --- if #out==0 then( --- if opts.FiberAlgorithm == "markov" then ( --- for row in entries toricMarkov ((matrix vector val) | A) do( --- r := drop(row,1); --- if row#0 == 1 and all(r,z->z<=0) then (out = set{-r}; break;); --- ); --- )else ( --- e:=first exponents (product(for i from 0 to #val-1 list if val#i>0 then ((A.cache#"RingGenerators")#i)^(val#i) else ((A.cache#"RingGenerators")#(i+numRows A))^(-val#i)) % A.cache#"toricIdeal"); --- if take(e,2*numRows A) == toList((2*numRows A):0) then out = set{take(e,-numColumns A)}; --- ); --- ); --- (A.cache#"fibers")#val = out; --- ); - --- fibAdd = method(); --- fibAdd (Set,Set) := (L1,L2) -> ( --- set flatten for l1 in keys L1 list for l2 in keys L2 list l1+l2 --- ); From 3a848294d74dd6fcc6a9a2e568cd9db4bd4ebb26 Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Tue, 13 May 2025 14:34:25 +0100 Subject: [PATCH 004/691] remove elapsedTime --- M2/Macaulay2/packages/AllMarkovBases.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/AllMarkovBases.m2 b/M2/Macaulay2/packages/AllMarkovBases.m2 index 1a737cb9efd..01f02b2ca6e 100644 --- a/M2/Macaulay2/packages/AllMarkovBases.m2 +++ b/M2/Macaulay2/packages/AllMarkovBases.m2 @@ -257,7 +257,7 @@ fiberGraph = method( } ); fiberGraph Matrix := opts -> A -> ( - if not A.cache#?"MarkovBasis" then elapsedTime setupFibers A; + if not A.cache#?"MarkovBasis" then setupFibers A; if opts.ReturnConnectedComponents then( if not A.cache#"componentsComputed" then ( for val in rsort keys A.cache#"fiberStarters" do computeFiberInternal(A,val,ReturnConnectedComponents=>true,FiberAlgorithm=>opts.FiberAlgorithm); From f4dd6b567a16881938f5d44dd9d917c8680a4b8d Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Tue, 13 May 2025 18:16:22 +0100 Subject: [PATCH 005/691] Restored keywords --- M2/Macaulay2/packages/AllMarkovBases.m2 | 1 + 1 file changed, 1 insertion(+) diff --git a/M2/Macaulay2/packages/AllMarkovBases.m2 b/M2/Macaulay2/packages/AllMarkovBases.m2 index 01f02b2ca6e..77fe8f04708 100644 --- a/M2/Macaulay2/packages/AllMarkovBases.m2 +++ b/M2/Macaulay2/packages/AllMarkovBases.m2 @@ -11,6 +11,7 @@ newPackage( Email => "oliver.clarke@durham.ac.uk", HomePage => "https://www.oliverclarkemath.com/"} }, + Keywords => {"Algebraic Statistics"}, AuxiliaryFiles => false, DebuggingMode => false, PackageExports => {"FourTiTwo","Graphs","Normaliz"} From 1a0e631d713250addbb392a01600950d52918c70 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 11 Jun 2025 23:53:37 -0400 Subject: [PATCH 006/691] Add patch for building factory w/ flint 3.3.0 Matrix internals have changed --- M2/cmake/build-libraries.cmake | 2 +- M2/libraries/factory/Makefile.in | 2 +- M2/libraries/factory/patch-4.4.1 | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 M2/libraries/factory/patch-4.4.1 diff --git a/M2/cmake/build-libraries.cmake b/M2/cmake/build-libraries.cmake index 26c76b085bd..1e99338c323 100644 --- a/M2/cmake/build-libraries.cmake +++ b/M2/cmake/build-libraries.cmake @@ -383,7 +383,7 @@ ExternalProject_Add(build-factory SOURCE_DIR libraries/factory/build DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/BUILD/tarfiles BUILD_IN_SOURCE ON -# PATCH_COMMAND patch --batch < ${CMAKE_SOURCE_DIR}/libraries/factory/patch-4.4.0 + PATCH_COMMAND patch --batch -p1 < ${CMAKE_SOURCE_DIR}/libraries/factory/patch-4.4.1 CONFIGURE_COMMAND autoreconf -vif && ${CONFIGURE} --prefix=${M2_HOST_PREFIX} #-C --cache-file=${CONFIGURE_CACHE} diff --git a/M2/libraries/factory/Makefile.in b/M2/libraries/factory/Makefile.in index 98fca7b9ce3..7cd9b7209c8 100644 --- a/M2/libraries/factory/Makefile.in +++ b/M2/libraries/factory/Makefile.in @@ -6,7 +6,7 @@ URL = https://macaulay2.com/Downloads/OtherSourceCode VERSION = 4.4.1 -#PATCHFILE = @abs_srcdir@/patch-$(VERSION) +PATCHFILE = @abs_srcdir@/patch-$(VERSION) PRECONFIGURE = autoreconf -vif BUILDTARGET = all ftmpl_inst.o diff --git a/M2/libraries/factory/patch-4.4.1 b/M2/libraries/factory/patch-4.4.1 new file mode 100644 index 00000000000..6b45304bde3 --- /dev/null +++ b/M2/libraries/factory/patch-4.4.1 @@ -0,0 +1,26 @@ +From 37b65cbd2ccd13b713cfbaa9a95a6d1eda5f09d1 Mon Sep 17 00:00:00 2001 +From: Doug Torrance +Date: Wed, 11 Jun 2025 23:18:05 -0400 +Subject: [PATCH] Use fq_nmod_mat_entry instead of row pointer (removed in + flint 3.3.0) + +--- + factory/FLINTconvert.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/factory/FLINTconvert.cc b/factory/FLINTconvert.cc +index c36f6022d..a4d86fd17 100644 +--- a/FLINTconvert.cc ++++ factory-4.4.1/FLINTconvert.cc +@@ -652,7 +652,7 @@ convertFacCFMatrix2Fq_nmod_mat_t (fq_nmod_mat_t M, + { + for(j=m.columns();j>0;j--) + { +- convertFacCF2nmod_poly_t (M->rows[i-1]+j-1, m (i,j)); ++ convertFacCF2nmod_poly_t (fq_nmod_mat_entry(M, i-1, j-1), m (i,j)); + } + } + } +-- +2.43.0 + From 22a8b10564bd53a50f7f336fdab69286821dba07 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 30 Jun 2025 11:20:50 -0500 Subject: [PATCH 007/691] Added the CCi type --- M2/Macaulay2/d/actors4.d | 1 + M2/Macaulay2/d/basic.d | 1 + M2/Macaulay2/d/classes.dd | 2 ++ M2/Macaulay2/d/equality.dd | 6 ++++++ M2/Macaulay2/d/expr.d | 1 + M2/Macaulay2/d/gmp.d | 7 +++++++ M2/Macaulay2/d/parse.d | 1 + M2/Macaulay2/m2/exports.m2 | 2 ++ M2/Macaulay2/m2/reals.m2 | 2 ++ 9 files changed, 23 insertions(+) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index fa298e247a2..3e23a946209 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -992,6 +992,7 @@ tostringfun(e:Expr):Expr := ( is x:RRcell do toExpr(tostringRR(x.v)) is x:RRicell do toExpr(tostringRRi(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) + is x:CCicell do toExpr(tostringRRi(x.v.re)+"+"+tostringRRi(x.v.im)+"*ii") is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") diff --git a/M2/Macaulay2/d/basic.d b/M2/Macaulay2/d/basic.d index f0a22f9a839..cf2a91bec97 100644 --- a/M2/Macaulay2/d/basic.d +++ b/M2/Macaulay2/d/basic.d @@ -25,6 +25,7 @@ export hash(e:Expr):hash_t := ( is x:RRcell do hash(x.v) is x:RRicell do hash(x.v) is x:CCcell do hash(x.v) + is x:CCicell do hash(x.v.re + x.v.im) is x:Sequence do ( -- the numbers here are the same as in binary lookup() in objects.d!! h := hash_t(27449); diff --git a/M2/Macaulay2/d/classes.dd b/M2/Macaulay2/d/classes.dd index 8bcf7fea0f3..2a361177b0d 100644 --- a/M2/Macaulay2/d/classes.dd +++ b/M2/Macaulay2/d/classes.dd @@ -24,6 +24,7 @@ setupconst("InexactFieldFamily",Expr(inexactNumberTypeClass)); setupconst("RRi",Expr(RRiClass)); setupconst("RR",Expr(RRClass)); setupconst("CC",Expr(CCClass)); +setupconst("CCi",Expr(CCiClass)); setupconst("RingElement",Expr(ringElementClass)); setupconst("Number",Expr(numberClass)); setupconst("InexactNumber",Expr(inexactNumberClass)); @@ -148,6 +149,7 @@ export Class(e:Expr):HashTable := ( is RRicell do RRiClass is RRcell do RRClass is CCcell do CCClass + is CCicell do CCiClass is RawComputationCell do rawComputationClass is Nothing do nothingClass is Database do dbClass diff --git a/M2/Macaulay2/d/equality.dd b/M2/Macaulay2/d/equality.dd index c34f82e85bf..c50413536a7 100644 --- a/M2/Macaulay2/d/equality.dd +++ b/M2/Macaulay2/d/equality.dd @@ -154,6 +154,12 @@ export equal(lhs:Expr,rhs:Expr):Expr := ( if strictequality(x.v,y.v) then True else False ) else False) + is x:CCicell do ( + when rhs + is y:CCicell do ( + if strictequality(x.v.re,y.v.re) && strictequality(x.v.im,y.v.im) then True else False + ) + else False) is x:SymbolClosure do ( when rhs is y:SymbolClosure do ( diff --git a/M2/Macaulay2/d/expr.d b/M2/Macaulay2/d/expr.d index 7958fd5a315..4313c97aaa2 100644 --- a/M2/Macaulay2/d/expr.d +++ b/M2/Macaulay2/d/expr.d @@ -355,6 +355,7 @@ export RRiClass := newbignumbertype(); export pointerClass := newbasictype(); export atomicIntClass := newbasictype(); export pseudocodeClosureClass := newtypeof(pseudocodeClass); +export CCiClass := newbignumbertype(); -- all new types, dictionaries, and classes go just above this line, if possible, so hash codes don't change gratuitously! diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index b95749e859d..438888ba06a 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -64,6 +64,13 @@ export CC := { re:RR, im:RR }; export CCorNull := CC or null; export CCcell := {+v:CC}; + +export CCi := { re:RRi, im:RRi }; + +export CCiorNull := CCi or null; + +export CCicell := {+v:CCi}; + dummy(x:RR):string := ""; dummyi(x:RRi):string := ""; -- Added for MPFI diff --git a/M2/Macaulay2/d/parse.d b/M2/Macaulay2/d/parse.d index daf87278af0..f3c7e4ce3c6 100644 --- a/M2/Macaulay2/d/parse.d +++ b/M2/Macaulay2/d/parse.d @@ -360,6 +360,7 @@ export atomicIntCell := {+ v:atomicField, hash:hash_t }; export Expr := ( CCcell or + CCicell or RRcell or RRicell or Boolean or diff --git a/M2/Macaulay2/m2/exports.m2 b/M2/Macaulay2/m2/exports.m2 index 8cf832a6b12..1df53769afa 100644 --- a/M2/Macaulay2/m2/exports.m2 +++ b/M2/Macaulay2/m2/exports.m2 @@ -95,6 +95,8 @@ export { "Boxes", "CC", "CC'", + "CCi", + "CCi'", "CacheExampleOutput", "CacheTable", "CallLimit", diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index fd1738dd64a..4b1dd917bdf 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -13,6 +13,7 @@ globalAssignment ImmutableType RR.synonym = "real number" RRi.synonym = "real interval" CC.synonym = "complex number" +CCi.synonym = "complex interval" RR.texMath = ///{\mathbb R}/// RRi.texMath = ///{\square\mathbb R}/// CC.texMath = ///{\mathbb C}/// @@ -45,6 +46,7 @@ InexactNumber' = new Type of Nothing' RR_* = RR' = new Type of InexactNumber' RRi_* = RRi' = new Type of InexactNumber' CC_* = CC' = new Type of InexactNumber' +CCi_* = CCi' = new Type of InexactNumber' RR'.texMath = ///{\mathbb R}_*/// RRi'.texMath = ///{\square\mathbb R}_*/// From a9dcbab785c9d11f1b9b7012d8a082d47457d6a0 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Mon, 30 Jun 2025 12:08:14 -0500 Subject: [PATCH 008/691] tostringCCi added --- M2/Macaulay2/d/actors4.d | 2 +- M2/Macaulay2/d/gmp.d | 2 ++ M2/Macaulay2/d/gmp1.d | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 3e23a946209..f5232ac9541 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -992,7 +992,7 @@ tostringfun(e:Expr):Expr := ( is x:RRcell do toExpr(tostringRR(x.v)) is x:RRicell do toExpr(tostringRRi(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) - is x:CCicell do toExpr(tostringRRi(x.v.re)+"+"+tostringRRi(x.v.im)+"*ii") + is x:CCicell do toExpr(tostringCCi(x.v)) is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 438888ba06a..17720a61bf4 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -73,9 +73,11 @@ export CCicell := {+v:CCi}; dummy(x:RR):string := ""; dummyi(x:RRi):string := ""; -- Added for MPFI +dummyCCi(x:CCi):string := ""; -- Added for MPFI export tostringRRpointer := dummy; export tostringRRipointer := dummyi; -- Added for MPFI +export tostringCCipointer := dummyCCi; -- Added for MPFI dummy(x:CC):string := ""; export tonetCCpointer := dummy; diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 6608622e9c5..54d114a873e 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -175,6 +175,12 @@ export tostringRRi(x:RRi):string := concatenate( )); tostringRRipointer = tostringRRi; +export tostringCCi(x:CCi):string := ( + if isZero(x.im) then tostringRRi(x.re) + else if isZero(x.re) then tostringRRi(x.im)+"*ii" + else tostringRRi(x.re)+"+"+tostringRRi(x.im)+"*ii" +); +tostringCCipointer = tostringCCi; export toExternalString(x:RR):string := ( ng := signbit(x); From 7c6cdc2ad3515b166a61eafa6bfc0e2b7fb136e7 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 30 Jun 2025 14:07:43 -0500 Subject: [PATCH 009/691] Added conversion functions and mutable CCi --- M2/Macaulay2/d/gmp.d | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 438888ba06a..2670910191f 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -65,6 +65,8 @@ export CCorNull := CC or null; export CCcell := {+v:CC}; +export CCimutable := { re:RRimutable, im:RRimutable }; + export CCi := { re:RRi, im:RRi }; export CCiorNull := CCi or null; @@ -209,6 +211,8 @@ clear(x:RRimutable) ::= Ccode( void, "mpfi_clear(", x, ")" ); clear(z:CCmutable):void := ( clear(z.re); clear(z.im); ); +clear(z:CCimutable):void := (clear(z.re);clear(z.im);); + export moveToZZ(z:ZZmutable):ZZ := ( y := GCmalloc(ZZmutable); Ccode(void, " @@ -925,6 +929,13 @@ export moveToCCandclear(z:CCmutable):CC := ( clear(z); w); +export moveToCCi(y:CCimutable):CCi := CCi(moveToRRi(y.re),moveToRRi(y.im)); + +export moveToCCiandclear(z:CCimutable):CCi := ( + w := moveToCCi(z); + clear(z); + w); + precision0(x:RR) ::= Ccode(ulong,"(unsigned long)mpfr_get_prec(", x, ")"); precision0(x:RRi) ::= Ccode(ulong,"(unsigned long)mpfi_get_prec(", x, ")"); From a50f61c4c73f239033f52e39edff853d26f2f86b Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 30 Jun 2025 15:47:38 -0500 Subject: [PATCH 010/691] Added CCi to front end --- M2/Macaulay2/d/actors4.d | 15 ++++++++++++++- M2/Macaulay2/d/gmp.d | 4 ++++ M2/Macaulay2/d/util.d | 2 ++ M2/Macaulay2/m2/exports.m2 | 1 + 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index f5232ac9541..d92dab11321 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -992,7 +992,7 @@ tostringfun(e:Expr):Expr := ( is x:RRcell do toExpr(tostringRR(x.v)) is x:RRicell do toExpr(tostringRRi(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) - is x:CCicell do toExpr(tostringCCi(x.v)) + is x:CCicell do toExpr(tostringRRi(x.v.re)+"+"+tostringRRi(x.v.im)+"*ii") is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") @@ -1407,6 +1407,19 @@ toRRi(e:Expr):Expr := ( else buildErrorPacket(EngineError("The first argument should be an integer"))) else WrongArg(1,"a pair or triple of integral, rational, or real numbers")); setupfun("toRRi",toRRi); + +toCCi(e:Expr):Expr := ( + when e + is s:Sequence do ( + if length(s) == 2 then ( + when s.0 is x:RRicell do ( + when s.1 is y:RRicell do toExpr(toCCi(x.v,y.v)) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + else WrongNumArgs(1,2)) + else WrongArg(1,"a pair or triple of integral, rational, or real numbers") +); +setupfun("toCCi",toCCi); rightRR(e:Expr):Expr := ( when e diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index d618a3cc618..aa4441f03b4 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1190,6 +1190,10 @@ export toCC(x:double,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); export toCC(x:double,y:double,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); +export toCCi(a:RRi,b:RRi,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + +export toCCi(a:RRi,b:RRi):CCi := toCCi(a,b,min(precision(a),precision(b))); + export toFloat(x:RR):float := Ccode(float, "mpfr_get_flt(", x, ", MPFR_RNDN)"); export toFloat(x:RRi):float := toFloat(midpointRR(x)); export toFloat(x:RRcell):float := toFloat(x.v); diff --git a/M2/Macaulay2/d/util.d b/M2/Macaulay2/d/util.d index 0403063f2b0..b121a0720ac 100644 --- a/M2/Macaulay2/d/util.d +++ b/M2/Macaulay2/d/util.d @@ -223,6 +223,7 @@ export toExpr(x:QQ):Expr := Expr(QQcell(x)); export toExpr(x:RR):Expr := Expr(RRcell(x)); export toExpr(x:RRi):Expr := Expr(RRicell(x)); export toExpr(x:CC):Expr := Expr(CCcell(x)); +export toExpr(x:CCi):Expr := Expr(CCicell(x)); export toExpr(x:float):Expr := Expr(RRcell(toRR(x,ulong(24)))); export toExpr(x:double):Expr := Expr(RRcell(toRR(x,ulong(53)))); export toExpr(x:RawComputation):Expr := Expr(RawComputationCell(x)); @@ -278,6 +279,7 @@ export toExpr(x:QQorNull):Expr := when x is i:QQ do Expr(QQcell(i)) is null do e export toExpr(x:RRorNull):Expr := when x is i:RR do Expr(RRcell(i)) is null do engineErrorMessage(); export toExpr(x:RRiorNull):Expr := when x is i:RRi do Expr(RRicell(i)) is null do engineErrorMessage(); export toExpr(x:CCorNull):Expr := when x is i:CC do Expr(CCcell(i)) is null do engineErrorMessage(); +export toExpr(x:CCiorNull):Expr := when x is i:CCi do Expr(CCicell(i)) is null do engineErrorMessage(); export toExpr(x:RawMatrixPairOrNull):Expr := when x is p:RawMatrixPair do seq(Expr(RawMatrixCell(p.a)),Expr(RawMatrixCell(p.b))) is null do engineErrorMessage(); export toExpr(x:RawMatrixArray):Expr := Expr( list( new Sequence len length(x) do foreach m in x do provide Expr(RawMatrixCell(m)) ) ); export toExpr(x:RawMatrixArrayOrNull):Expr := when x is r:RawMatrixArray do toExpr(r) is null do engineErrorMessage(); diff --git a/M2/Macaulay2/m2/exports.m2 b/M2/Macaulay2/m2/exports.m2 index 1df53769afa..d5e4b041730 100644 --- a/M2/Macaulay2/m2/exports.m2 +++ b/M2/Macaulay2/m2/exports.m2 @@ -1210,6 +1210,7 @@ export { "to", "toAbsolutePath", "toCC", + "toCCi", "toExternalString", "toField", "toList", From a7c27f0c19e73c516a8c5707e9a34662e04b047c Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Mon, 30 Jun 2025 15:56:46 -0500 Subject: [PATCH 011/691] changes in gmp --- M2/Macaulay2/d/gmp.d | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index d618a3cc618..130a5f9db7a 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -86,6 +86,11 @@ export tonetCCpointer := dummy; export tonetCCparenpointer := dummy; +dummy(x:CCi):string := ""; + +export tonetCCipointer := dummy; + +export tonetCCiparenpointer := dummy; export min(x:int,y:int):int := if x Date: Mon, 30 Jun 2025 16:04:19 -0500 Subject: [PATCH 012/691] changes in gmp --- M2/Macaulay2/d/gmp.d | 8 -------- 1 file changed, 8 deletions(-) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index c011e675379..1f21853ea32 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1198,14 +1198,6 @@ export toCCi(x:RR,y:RRi):CCi := ( else CCi(toRRi(x,precision0(y)),y) ); -export toCCi(x:RRi,y:RRi):CCi := ( - if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) - else if precision0(x) == precision0(y) then CCi(x,y) - else if precision0(x) < precision0(y) then CCi(x,toRRi(y,precision0(x))) - else CCi(toRRi(x,precision0(y)),y) - ); - export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); From 2c3d2590fa9065c799288de795f51d0535f26ea7 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 30 Jun 2025 16:30:56 -0500 Subject: [PATCH 013/691] Fixed CCi afterprint --- M2/Macaulay2/d/gmp.d | 2 ++ M2/Macaulay2/d/gmp1.d | 4 ++-- M2/Macaulay2/m2/reals.m2 | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index aa4441f03b4..acb5af20a21 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -948,6 +948,8 @@ export precision(x:RRi):ulong := precision0(x); export precision(x:CC):ulong := precision0(x.re); +export precision(x:CCi):ulong := precision0(x.re); + export toRR(x:RR,prec:ulong):RR := ( if precision0(x) == prec then return x; z := newRRmutable(prec); diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 54d114a873e..d070a11f421 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -177,8 +177,8 @@ tostringRRipointer = tostringRRi; export tostringCCi(x:CCi):string := ( if isZero(x.im) then tostringRRi(x.re) - else if isZero(x.re) then tostringRRi(x.im)+"*ii" - else tostringRRi(x.re)+"+"+tostringRRi(x.im)+"*ii" + else if isZero(x.re) then concatenate(array(string)(tostringRRi(x.im),"*ii")) + else concatenate(array(string)(tostringRRi(x.re),"+",tostringRRi(x.im),"*ii")) ); tostringCCipointer = tostringCCi; diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 4b1dd917bdf..8892c0cfa49 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -36,6 +36,7 @@ raw InexactField := R -> R.RawRing RR.InexactField = RealField = new Type of InexactField ; RealField.synonym = "real field" RRi.InexactField = RealIntervalField = new Type of InexactField ; RealIntervalField.synonym = "real interval field" CC.InexactField = ComplexField = new Type of InexactField; ComplexField.synonym = "complex field" +CCi.InexactField = ComplexIntervalField = new Type of InexactField; ComplexIntervalField.synonym = "complex interval field" Nothing' = Nothing -- maybe we'll want to rename it later... RingFamily_* := RR -> RR#(symbol _*) From f133dbf7a83f1f5be07faba6958704c59921096d Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Mon, 30 Jun 2025 16:30:56 -0500 Subject: [PATCH 014/691] changes in gmp --- M2/Macaulay2/d/gmp.d | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 1f21853ea32..34ea7834f9c 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1200,42 +1200,92 @@ export toCCi(x:RR,y:RRi):CCi := ( export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); +export infinityCCi(prec:ulong):CCi := (x := infinityRRi(prec,1); toCCi(x,x)); + export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); +export nanCCi(prec:ulong):CCi := (x := nanRRi(prec); toCCi(x,x)); + export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); +export toCCi(x:RRi):CCi := CCi(x,toRRi(0,precision0(x))); + +export toCCi(x:RR):CCi := CCi(toRRi(x),toRRi(0,precision0(x))); + export toCC(x:int,y:RR):CC := CC(toRR(x,precision0(y)),y); +export toCCi(x:int,y:RRi):CCi := CCi(toRRi(x,precision0(y)),y); + +export toCCi(x:int,y:RR):CCi := CCi(toRRi(x,precision0(y)),toRRi(y)); + export toCC(x:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); +export toCCi(x:RRi,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCCi(x:RR,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + export toCC(x:CC,prec:ulong):CC := ( if precision0(x.re) == prec then x else CC(toRR(x.re,prec),toRR(x.im,prec))); +export toCCi(x:CCi,prec:ulong):CCi := ( + if precision0(x.re) == prec then x + else CCi(toRRi(x.re,prec),toRRi(x.im,prec))); + +export toCCi(x:CC,prec:ulong):CCi := ( + if precision0(x.re) == prec then CCi(toRRi(x.re,prec),toRRi(x.im,prec)) + else CCi(toRRi(x.re,prec),toRRi(x.im,prec))); + export toCC(x:RR,y:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); export toCC(x:QQ,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); +export toCCi(x:QQ,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + export toCC(x:ZZ,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); +export toCCi(x:ZZ,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + export toCC(x:QQ):CC := toCC(x,defaultPrecision); +export toCCi(x:QQ):CCi := toCCi(x,defaultPrecision); + export toCC(x:ZZ):CC := toCC(x,defaultPrecision); +export toCCi(x:ZZ):CCi := toCCi(x,defaultPrecision); + +export toCCi(x:CC):CCi := toCCi(x,defaultPrecision); + export toCC(x:int,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); +export toCCi(x:int,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + export toCC(x:int,y:int,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); +export toCCi(x:int,y:int,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(y,prec)); + export toCC(x:ulong,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); +export toCCi(x:ulong,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + export toCC(x:double,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); +export toCCi(x:double,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + export toCC(x:double,y:double,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); +export toCCi(x:double,y:double,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(y,prec)); + export toCCi(a:RRi,b:RRi,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); export toCCi(a:RRi,b:RRi):CCi := toCCi(a,b,min(precision(a),precision(b))); +export toCCi(a:RR,b:RRi,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + +export toCCi(a:RRi,b:RR,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + +export toCCi(a:RR,b:RR,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + export toFloat(x:RR):float := Ccode(float, "mpfr_get_flt(", x, ", MPFR_RNDN)"); export toFloat(x:RRi):float := toFloat(midpointRR(x)); export toFloat(x:RRcell):float := toFloat(x.v); From e3646b1adada04f30c4a7741e4ab358718f6bc7f Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Mon, 30 Jun 2025 16:37:22 -0500 Subject: [PATCH 015/691] changes in gmp --- M2/Macaulay2/d/gmp.d | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 34ea7834f9c..07018316403 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1200,11 +1200,11 @@ export toCCi(x:RR,y:RRi):CCi := ( export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); -export infinityCCi(prec:ulong):CCi := (x := infinityRRi(prec,1); toCCi(x,x)); +--export infinityCCi(prec:ulong):CCi := (x := infinityRRi(prec,1); toCCi(x,x)); export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); -export nanCCi(prec:ulong):CCi := (x := nanRRi(prec); toCCi(x,x)); +--export nanCCi(prec:ulong):CCi := (x := nanRRi(prec); toCCi(x,x)); export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); From ce7a1bb36e6dd9a7e4d4ace17c43d7d196c4bcab Mon Sep 17 00:00:00 2001 From: Andrew Tawfeek Date: Mon, 30 Jun 2025 16:59:41 -0500 Subject: [PATCH 016/691] changes in gmp1 --- M2/Macaulay2/d/gmp1.d | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index d070a11f421..1f6b644b8a0 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -262,6 +262,14 @@ export toExternalString(z:CC):string := concatenate(array(string)( ")" )); +export toExternalString(z:CCi):string := concatenate(array(string)( + "toCCi(", + toExternalString(z.re), + ",", + toExternalString(z.im), + ")" + )); + export (o:file) << (s:charstarOrNull) : file := o << if s == null() then "(null)" else tostring(s); export (o:file) << (x:ZZ) : file := o << tostring(x); From 839b647b21d4a7497233adae7b40664c08167e58 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Mon, 30 Jun 2025 17:04:24 -0500 Subject: [PATCH 017/691] changes in gmp --- M2/Macaulay2/d/gmp.d | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 07018316403..e43a29eca56 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1315,10 +1315,16 @@ export isnan(x:RRi):bool := isnan0(x); export isfinite(x:CC):bool := isfinite0(x.re) && isfinite0(x.im); +export isfinite(x:CCi):bool := isfinite0(x.re) && isfinite0(x.im); + export isinf(x:CC):bool := isinf0(x.re) && !isnan0(x.im) || isinf0(x.im) && !isnan0(x.re); +export isinf(x:CCi):bool := isinf0(x.re) && !isnan0(x.im) || isinf0(x.im) && !isnan0(x.re); + export isnan(x:CC):bool := isnan0(x.re) || isnan0(x.im); +export isnan(x:CCi):bool := isnan0(x.re) || isnan0(x.im); + export (x:RR) === (y:RR):bool := ( -- weak equality Ccode( void, "mpfr_clear_flags()" ); 0 != Ccode( int, "mpfr_equal_p(", x, ",", y, ")" ) @@ -1406,6 +1412,8 @@ export (x:RR) <= (y:int) : bool := compare0(x,long(y)) <= 0 && !flagged0(); export (x:RRi) <= (y:int) : bool := (compare0(x,long(y)) < 0 || rightRR(x) === y) && !flagged0(); export (x:CC) === (y:int) : bool := x.re === y && x.im === 0; + +export (x:CCi) === (y:int) : bool := x.re === y && x.im === 0; compare0(x:RR, y:double) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_d(", x, ",", y, "))" ); @@ -2183,11 +2191,18 @@ export (x:RRi) >> (n:int) : RRi := x << long(-n); export (x:CC) + (y:CC) : CC := toCC(x.re+y.re, x.im+y.im); +export (x:CCi) + (y:CCi) : CCi := toCCi(x.re+y.re, x.im+y.im); + export (x:CC) - (y:CC) : CC := toCC(x.re-y.re, x.im-y.im); +export (x:CCi) - (y:CCi) : CCi := toCCi(x.re-y.re, x.im-y.im); + export (x:RR) - (y:CC) : CC := toCC(x-y.re,-y.im); export (x:int) - (y:CC) : CC := toCC(x-y.re,-y.im); + +export (x:int) - (y:CCi) : CCi := toCCi(x-y.re,-y.im); + export (x:CC) - (y:int) : CC := toCC(x.re-y,x.im); export (x:CC) - (y:RR) : CC := toCC(x.re-y,x.im); @@ -2200,6 +2215,8 @@ export (x:int) + (y:CC) : CC := toCC(x+y.re,y.im); export -(y:CC) : CC := toCC(-y.re,-y.im); +export -(y:CCi) : CCi := toCCi(-y.re,-y.im); + export (x:CC) * (y:RR) : CC := ( if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) then toCC(x.re*y, x.im*y) @@ -2246,6 +2263,8 @@ export conj(x:CC):CC := toCC(x.re,-x.im); export norm2(x:CC):RR := x.re*x.re + x.im*x.im; +export norm2(x:CCi):RRi := x.re*x.re + x.im*x.im; + export (x:CC) << (n:long) : CC := if n == long(0) then x else CC(x.re<> (n:long) : CC := if n == long(0) then x else CC(x.re>>n,x.im>>n); @@ -2274,21 +2293,45 @@ export (x:ZZ) / (y:CC) : CC := x * inverse(y); export (x:int) / (y:CC) : CC := x * inverse(y); export strictequality(x:CC,y:CC):bool := strictequality(x.re,y.re) && strictequality(x.im,y.im); + +export strictequality(x:CCi,y:CCi):bool := strictequality(x.re,y.re) && strictequality(x.im,y.im); export (x:CC) === (y:CC) : bool := x.re === y.re && x.im === y.im; +export (x:CCi) === (y:CCi) : bool := x.re === y.re && x.im === y.im; + +export (x:CCi) === (y:CC) : bool := x.re === y.re && x.im === y.im; + +export (x:CC) === (y:CCi) : bool := x.re === y.re && x.im === y.im; + export (x:CC) === (y:RR) : bool := x.re === y && x.im === 0; +export (x:CCi) === (y:RRi) : bool := x.re === y && x.im === 0; + +export (x:CCi) === (y:RR) : bool := x.re === y && x.im === 0; + export (x:RR) === (y:CC) : bool := x === y.re && y.im === 0; +export (x:RRi) === (y:CCi) : bool := x === y.re && y.im === 0; + +export (x:RR) === (y:CCi) : bool := x === y.re && y.im === 0; + export (x:CC) === (y:ZZ) : bool := x.re === y && x.im === 0; +export (x:CCi) === (y:ZZ) : bool := x.re === y && x.im === 0; + export (x:ZZ) === (y:CC) : bool := x === y.re && y.im === 0; +export (x:ZZ) === (y:CCi) : bool := x === y.re && y.im === 0; + export (x:CC) === (y:QQ) : bool := x.re === y && x.im === 0; +export (x:CCi) === (y:QQ) : bool := x.re === y && x.im === 0; + export (x:QQ) === (y:CC) : bool := x === y.re && y.im === 0; +export (x:QQ) === (y:CCi) : bool := x === y.re && y.im === 0; + export compare(x:CC,y:CC):int := ( if ( isinf(x.re) || isinf(y.re) || isinf(x.im) || isinf(y.im) ) then ( setflag0(); @@ -2357,6 +2400,11 @@ export abs(x:CC):RR := ( Ccode( void, "mpfr_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); moveToRRandclear(z)); +export abs(x:CCi):RRi := ( + z := newRRimutable(precision(x)); + Ccode( void, "mpfr_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); + moveToRRiandclear(z)); + header "#include "; export sqrt(x:CC):CC := ( @@ -2786,6 +2834,8 @@ export asin(z:CC):CC := idiv(log(sqrt(1-square(z))+itimes(z))); export abs2(z:CC):RR := z.re^long(2) + z.im^long(2); +export abs2(z:CCi):RRi := z.re^long(2) + z.im^long(2); + export atan(x:CC):CC := ( if isnan(x) then return x; if isinf(x) then return toCC(atan(infinityRR(precision(x)))); From d6c971ee0403e5200c4c9cfb1fe7ca313496f449 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 30 Jun 2025 17:05:10 -0500 Subject: [PATCH 018/691] Added more to creating CCi's --- M2/Macaulay2/d/actors4.d | 5 ++++- M2/Macaulay2/d/gmp.d | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index d92dab11321..d1bfff279f1 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -992,7 +992,7 @@ tostringfun(e:Expr):Expr := ( is x:RRcell do toExpr(tostringRR(x.v)) is x:RRicell do toExpr(tostringRRi(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) - is x:CCicell do toExpr(tostringRRi(x.v.re)+"+"+tostringRRi(x.v.im)+"*ii") + is x:CCicell do toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") @@ -1410,6 +1410,8 @@ setupfun("toRRi",toRRi); toCCi(e:Expr):Expr := ( when e + is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) + is x:CCicell do e is s:Sequence do ( if length(s) == 2 then ( when s.0 is x:RRicell do ( @@ -1567,6 +1569,7 @@ precision(e:Expr):Expr := ( is x:RRcell do toExpr(precision(x.v)) is x:RRicell do toExpr(precision(x.v)) is x:CCcell do toExpr(precision(x.v)) + is x:CCicell do toExpr(precision(x.v)) else WrongArgRR()); setupfun("precision0",precision); diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 34ea7834f9c..b8991a2d287 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1200,11 +1200,11 @@ export toCCi(x:RR,y:RRi):CCi := ( export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); -export infinityCCi(prec:ulong):CCi := (x := infinityRRi(prec,1); toCCi(x,x)); +-- export infinityCCi(prec:ulong):CCi := (x := infinityRRi(prec,1); toCCi(x,x)); export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); -export nanCCi(prec:ulong):CCi := (x := nanRRi(prec); toCCi(x,x)); +-- export nanCCi(prec:ulong):CCi := (x := nanRRi(prec); toCCi(x,x)); export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); From cc4606d165965fefcb0cbff00ccc524bb4b1a4a3 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Mon, 30 Jun 2025 17:09:06 -0500 Subject: [PATCH 019/691] changes in gmp --- M2/Macaulay2/d/gmp.d | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index e43a29eca56..02367260137 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -2400,10 +2400,10 @@ export abs(x:CC):RR := ( Ccode( void, "mpfr_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); moveToRRandclear(z)); -export abs(x:CCi):RRi := ( - z := newRRimutable(precision(x)); - Ccode( void, "mpfr_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); - moveToRRiandclear(z)); +--export abs(x:CCi):RRi := ( +-- z := newRRimutable(precision(x)); +-- Ccode( void, "mpfi_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); +-- moveToRRiandclear(z)); header "#include "; From b7aabc66309cdeca748797ec2ba9a957d00680db Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Mon, 30 Jun 2025 17:21:32 -0500 Subject: [PATCH 020/691] changes in actors --- M2/Macaulay2/d/actors.d | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 4cc0abdf917..42e7f398dea 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -21,6 +21,7 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RRi, RRi is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) is x:QQcell do ( @@ -30,6 +31,7 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RRi, RRi is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) is x:RawRingElementCell do ( @@ -48,6 +50,7 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, RR, RRi, RRi is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, CC, CC + is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RR, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) is x:RRicell do ( @@ -56,6 +59,8 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, QQ, RRi is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, RR, RRi is y:RRicell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, RRi, RRi + is y:CCcell do toExpr(toCCi(x.v) + toCCi(y.v)) -- # typical value: symbol +, RRi, CC, CCi + is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) is x:CCcell do ( @@ -63,7 +68,19 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:ZZcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, ZZ, CC is y:QQcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, QQ, CC is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, CC, RR, CC + is y:RRicell do toExpr(toCCi(x.v) + toCCi(y.v)) -- # typical value: symbol +, CC, RRi, CCi is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, CC, CC, CC + is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, CC, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,PlusS)) + is x:CCicell do ( + when rhs + is y:ZZcell do toExpr(x.v + toCCi(y.v,precision(x.v.re))) -- # typical value: symbol +, CCi, ZZ, CCi + is y:QQcell do toExpr(x.v + toCCi(y.v,precision(x.v.re))) -- # typical value: symbol +, CCi, QQ, CCi + is y:RRcell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, RR, CCi + is y:RRicell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, RRi, CCi + is y:CCcell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, CC, CCi + is y:CCicell do toExpr(x.v + y.v) -- # typical value: symbol +, CCi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) is x:RawMatrixCell do ( From da60a3fca2c33f49df9518dfb11df16e1d441766 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 11:06:00 -0400 Subject: [PATCH 021/691] Rename RRball/CCball -> RRb/CCb (for symmetry w/ RRi/CCi) --- M2/Macaulay2/d/ballarith.d | 190 ++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index dc912047828..2891c8a4678 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -26,63 +26,63 @@ header " #endif "; --- TODO: RRball and CCball at top level? +-- TODO: RRb and CCb at top level? ------------ --- RRball -- +-- RRb -- ------------ -RRball := Pointer "arb_ptr"; -init(x:RRball) ::= ( +RRb := Pointer "arb_ptr"; +init(x:RRb) ::= ( Ccode(void, "arb_init(", x, ")"); x); -newRRball():RRball := init(GCmalloc(RRball)); -clear(x:RRball) ::= Ccode(void, "arb_clear(", x, ")"); +newRRb():RRb := init(GCmalloc(RRb)); +clear(x:RRb) ::= Ccode(void, "arb_clear(", x, ")"); -- clear after using -toRRball(x:RR, y:RR, prec:ulong):RRball := ( - z := newRRball(); +toRRb(x:RR, y:RR, prec:ulong):RRb := ( + z := newRRb(); Ccode(void, "arb_set_interval_mpfr(", z, ", ", x, ", ", y, ", ", prec, ")"); z); -toRRball(x:RR):RRball := toRRball(x, x, precision(x)); -toRRball(x:RRi):RRball := toRRball(leftRR(x), rightRR(x), precision(x)); +toRRb(x:RR):RRb := toRRb(x, x, precision(x)); +toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); -toRR(x:RRball, prec:ulong):RR := ( +toRR(x:RRb, prec:ulong):RR := ( y := newRRmutable(prec); Ccode(int, "arf_get_mpfr(", y, ", arb_midref(", x, "), MPFR_RNDN)"); moveToRRandclear(y)); -toRRi(x:RRball, prec:ulong):RRi := ( +toRRi(x:RRb, prec:ulong):RRi := ( y := newRRimutable(prec); Ccode(void, "arb_get_interval_mpfr((mpfr_ptr)&", y, "->left, (mpfr_ptr)&", y, "->right, ", x, ")"); moveToRRiandclear(y)); -moveToRRiandclear(x:RRball, prec:ulong):RRi := ( +moveToRRiandclear(x:RRb, prec:ulong):RRi := ( r := toRRi(x, prec); clear(x); r); -- special functions export eint(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_ei(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export Gamma(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_gamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export Gamma(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRball(z); - y := toRRball(w); - r := newRRball(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 0, ", prec, ")"); clear(x); @@ -91,9 +91,9 @@ export Gamma(z:RRi,w:RRi):RRi := ( export regularizedGamma(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRball(z); - y := toRRball(w); - r := newRRball(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 1, ", prec, ")"); clear(x); @@ -101,52 +101,52 @@ export regularizedGamma(z:RRi,w:RRi):RRi := ( moveToRRiandclear(r, prec)); export Digamma(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_digamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export lgamma(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_lgamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export zeta(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_zeta(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export erf(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_erf(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export erfc(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_erfc(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export inverseErf(x:RRi):RRi := ( - y := toRRball(x); - r := newRRball(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_erfinv(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export BesselJ(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRball(z); - y := toRRball(w); - r := newRRball(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_bessel_j(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -154,9 +154,9 @@ export BesselJ(z:RRi,w:RRi):RRi := ( export BesselY(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRball(z); - y := toRRball(w); - r := newRRball(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_bessel_y(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -164,10 +164,10 @@ export BesselY(z:RRi,w:RRi):RRi := ( export Beta(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRball(z); - y := toRRball(w); - v := toRRball(toRRi(1, prec)); - r := newRRball(); + x := toRRb(z); + y := toRRb(w); + v := toRRb(toRRi(1, prec)); + r := newRRb(); Ccode(void, "arb_hypgeom_beta_lower(", r, ", ", x, ", ", y, ", ", v, ", 0, ", prec, ")"); clear(x); @@ -176,10 +176,10 @@ export Beta(z:RRi,w:RRi):RRi := ( export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( prec := min(min(precision(u), precision(v)), precision(w)); - x := toRRball(u); - y := toRRball(v); - z := toRRball(w); - r := newRRball(); + x := toRRb(u); + y := toRRb(v); + z := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_beta_lower(", r, ", ", y, ", ", z, ", ", x, ", 1, ", prec, ")"); clear(x); @@ -191,52 +191,52 @@ export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( -- CCBall -- ------------ -CCball := Pointer "acb_ptr"; -init(z:CCball) ::= ( +CCb := Pointer "acb_ptr"; +init(z:CCb) ::= ( Ccode(void, "acb_init(", z, ")"); z); -newCCball():CCball := init(GCmalloc(CCball)); -clear(z:CCball) ::= Ccode(void, "acb_clear(", z, ")"); +newCCb():CCb := init(GCmalloc(CCb)); +clear(z:CCb) ::= Ccode(void, "acb_clear(", z, ")"); -- clear after using -toCCball(z:CC):CCball := ( - x := toRRball(realPart(z)); - y := toRRball(imaginaryPart(z)); - w := newCCball(); +toCCb(z:CC):CCb := ( + x := toRRb(realPart(z)); + y := toRRb(imaginaryPart(z)); + w := newCCb(); Ccode(void, "acb_set_arb_arb(", w, ", ", x, ", ", y, ")"); clear(x); clear(y); w); -toCC(z:CCball, prec:ulong):CC := ( - x := Ccode(RRball, "acb_realref(", z, ")"); - y := Ccode(RRball, "acb_imagref(", z, ")"); +toCC(z:CCb, prec:ulong):CC := ( + x := Ccode(RRb, "acb_realref(", z, ")"); + y := Ccode(RRb, "acb_imagref(", z, ")"); toCC(toRR(x, prec), toRR(y, prec))); -moveToCCandclear(z:CCball, prec:ulong):CC := ( +moveToCCandclear(z:CCb, prec:ulong):CC := ( r := toCC(z, prec); clear(z); r); export eint(z:CC):CC := ( - w := toCCball(z); - r := newCCball(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_hypgeom_ei(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export Gamma(z:CC):CC := ( - w := toCCball(z); - r := newCCball(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_gamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export Gamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCball(z); - y := toCCball(w); - r := newCCball(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 0, ", prec, ")"); clear(x); @@ -245,9 +245,9 @@ export Gamma(z:CC,w:CC):CC := ( export regularizedGamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCball(z); - y := toCCball(w); - r := newCCball(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 1, ", prec, ")"); clear(x); @@ -255,45 +255,45 @@ export regularizedGamma(z:CC,w:CC):CC := ( moveToCCandclear(r, prec)); export Digamma(z:CC):CC := ( - w := toCCball(z); - r := newCCball(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_digamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export lgamma(z:CC):CC := ( - w := toCCball(z); - r := newCCball(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_lgamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export zeta(z:CC):CC := ( - w := toCCball(z); - r := newCCball(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_zeta(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export erf(z:CC):CC := ( - w := toCCball(z); - r := newCCball(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_hypgeom_erf(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export erfc(z:CC):CC := ( - w := toCCball(z); - r := newCCball(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_hypgeom_erfc(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export BesselJ(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCball(z); - y := toCCball(w); - r := newCCball(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_bessel_j(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -301,9 +301,9 @@ export BesselJ(z:CC,w:CC):CC := ( export BesselY(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCball(z); - y := toCCball(w); - r := newCCball(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_bessel_y(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -311,10 +311,10 @@ export BesselY(z:CC,w:CC):CC := ( export Beta(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCball(z); - y := toCCball(w); - v := toCCball(toCC(1, prec)); - r := newCCball(); + x := toCCb(z); + y := toCCb(w); + v := toCCb(toCC(1, prec)); + r := newCCb(); Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", x, ", ", y, ", ", v, ", 0, ", prec, ")"); clear(x); @@ -323,10 +323,10 @@ export Beta(z:CC,w:CC):CC := ( export regularizedBeta(u:CC,v:CC,w:CC):CC := ( prec := min(min(precision(u), precision(v)), precision(w)); - x := toCCball(u); - y := toCCball(v); - z := toCCball(w); - r := newCCball(); + x := toCCb(u); + y := toCCb(v); + z := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", y, ", ", z, ", ", x, ", 1, ", prec, ")"); clear(x); From dc1a7da692d6807c057348449e242931db84b3fe Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 11:16:42 -0400 Subject: [PATCH 022/691] Actually, let's call them RRbmutable and CCbmutable RRb and CCb will be added later and will use GC-allocated memory. --- M2/Macaulay2/d/ballarith.d | 186 ++++++++++++++++++------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 2891c8a4678..68e52bcfa82 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -32,57 +32,57 @@ header " -- RRb -- ------------ -RRb := Pointer "arb_ptr"; -init(x:RRb) ::= ( +RRbmutable := Pointer "arb_ptr"; +init(x:RRbmutable) ::= ( Ccode(void, "arb_init(", x, ")"); x); -newRRb():RRb := init(GCmalloc(RRb)); -clear(x:RRb) ::= Ccode(void, "arb_clear(", x, ")"); +newRRbmutable():RRbmutable := init(GCmalloc(RRbmutable)); +clear(x:RRbmutable) ::= Ccode(void, "arb_clear(", x, ")"); -- clear after using -toRRb(x:RR, y:RR, prec:ulong):RRb := ( - z := newRRb(); +toRRbmutable(x:RR, y:RR, prec:ulong):RRbmutable := ( + z := newRRbmutable(); Ccode(void, "arb_set_interval_mpfr(", z, ", ", x, ", ", y, ", ", prec, ")"); z); -toRRb(x:RR):RRb := toRRb(x, x, precision(x)); -toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); +toRRbmutable(x:RR):RRbmutable := toRRbmutable(x, x, precision(x)); +toRRbmutable(x:RRi):RRbmutable := toRRbmutable(leftRR(x), rightRR(x), precision(x)); -toRR(x:RRb, prec:ulong):RR := ( +toRR(x:RRbmutable, prec:ulong):RR := ( y := newRRmutable(prec); Ccode(int, "arf_get_mpfr(", y, ", arb_midref(", x, "), MPFR_RNDN)"); moveToRRandclear(y)); -toRRi(x:RRb, prec:ulong):RRi := ( +toRRi(x:RRbmutable, prec:ulong):RRi := ( y := newRRimutable(prec); Ccode(void, "arb_get_interval_mpfr((mpfr_ptr)&", y, "->left, (mpfr_ptr)&", y, "->right, ", x, ")"); moveToRRiandclear(y)); -moveToRRiandclear(x:RRb, prec:ulong):RRi := ( +moveToRRiandclear(x:RRbmutable, prec:ulong):RRi := ( r := toRRi(x, prec); clear(x); r); -- special functions export eint(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_ei(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export Gamma(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_gamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export Gamma(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRb(z); - y := toRRb(w); - r := newRRb(); + x := toRRbmutable(z); + y := toRRbmutable(w); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 0, ", prec, ")"); clear(x); @@ -91,9 +91,9 @@ export Gamma(z:RRi,w:RRi):RRi := ( export regularizedGamma(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRb(z); - y := toRRb(w); - r := newRRb(); + x := toRRbmutable(z); + y := toRRbmutable(w); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 1, ", prec, ")"); clear(x); @@ -101,52 +101,52 @@ export regularizedGamma(z:RRi,w:RRi):RRi := ( moveToRRiandclear(r, prec)); export Digamma(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_digamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export lgamma(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_lgamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export zeta(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_zeta(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export erf(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_erf(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export erfc(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_erfc(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export inverseErf(x:RRi):RRi := ( - y := toRRb(x); - r := newRRb(); + y := toRRbmutable(x); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_erfinv(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export BesselJ(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRb(z); - y := toRRb(w); - r := newRRb(); + x := toRRbmutable(z); + y := toRRbmutable(w); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_bessel_j(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -154,9 +154,9 @@ export BesselJ(z:RRi,w:RRi):RRi := ( export BesselY(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRb(z); - y := toRRb(w); - r := newRRb(); + x := toRRbmutable(z); + y := toRRbmutable(w); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_bessel_y(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -164,10 +164,10 @@ export BesselY(z:RRi,w:RRi):RRi := ( export Beta(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRb(z); - y := toRRb(w); - v := toRRb(toRRi(1, prec)); - r := newRRb(); + x := toRRbmutable(z); + y := toRRbmutable(w); + v := toRRbmutable(toRRi(1, prec)); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_beta_lower(", r, ", ", x, ", ", y, ", ", v, ", 0, ", prec, ")"); clear(x); @@ -176,10 +176,10 @@ export Beta(z:RRi,w:RRi):RRi := ( export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( prec := min(min(precision(u), precision(v)), precision(w)); - x := toRRb(u); - y := toRRb(v); - z := toRRb(w); - r := newRRb(); + x := toRRbmutable(u); + y := toRRbmutable(v); + z := toRRbmutable(w); + r := newRRbmutable(); Ccode(void, "arb_hypgeom_beta_lower(", r, ", ", y, ", ", z, ", ", x, ", 1, ", prec, ")"); clear(x); @@ -191,52 +191,52 @@ export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( -- CCBall -- ------------ -CCb := Pointer "acb_ptr"; -init(z:CCb) ::= ( +CCbmutable := Pointer "acb_ptr"; +init(z:CCbmutable) ::= ( Ccode(void, "acb_init(", z, ")"); z); -newCCb():CCb := init(GCmalloc(CCb)); -clear(z:CCb) ::= Ccode(void, "acb_clear(", z, ")"); +newCCbmutable():CCbmutable := init(GCmalloc(CCbmutable)); +clear(z:CCbmutable) ::= Ccode(void, "acb_clear(", z, ")"); -- clear after using -toCCb(z:CC):CCb := ( - x := toRRb(realPart(z)); - y := toRRb(imaginaryPart(z)); - w := newCCb(); +toCCbmutable(z:CC):CCbmutable := ( + x := toRRbmutable(realPart(z)); + y := toRRbmutable(imaginaryPart(z)); + w := newCCbmutable(); Ccode(void, "acb_set_arb_arb(", w, ", ", x, ", ", y, ")"); clear(x); clear(y); w); -toCC(z:CCb, prec:ulong):CC := ( - x := Ccode(RRb, "acb_realref(", z, ")"); - y := Ccode(RRb, "acb_imagref(", z, ")"); +toCC(z:CCbmutable, prec:ulong):CC := ( + x := Ccode(RRbmutable, "acb_realref(", z, ")"); + y := Ccode(RRbmutable, "acb_imagref(", z, ")"); toCC(toRR(x, prec), toRR(y, prec))); -moveToCCandclear(z:CCb, prec:ulong):CC := ( +moveToCCandclear(z:CCbmutable, prec:ulong):CC := ( r := toCC(z, prec); clear(z); r); export eint(z:CC):CC := ( - w := toCCb(z); - r := newCCb(); + w := toCCbmutable(z); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_ei(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export Gamma(z:CC):CC := ( - w := toCCb(z); - r := newCCb(); + w := toCCbmutable(z); + r := newCCbmutable(); Ccode(void, "acb_gamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export Gamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCb(z); - y := toCCb(w); - r := newCCb(); + x := toCCbmutable(z); + y := toCCbmutable(w); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 0, ", prec, ")"); clear(x); @@ -245,9 +245,9 @@ export Gamma(z:CC,w:CC):CC := ( export regularizedGamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCb(z); - y := toCCb(w); - r := newCCb(); + x := toCCbmutable(z); + y := toCCbmutable(w); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 1, ", prec, ")"); clear(x); @@ -255,45 +255,45 @@ export regularizedGamma(z:CC,w:CC):CC := ( moveToCCandclear(r, prec)); export Digamma(z:CC):CC := ( - w := toCCb(z); - r := newCCb(); + w := toCCbmutable(z); + r := newCCbmutable(); Ccode(void, "acb_digamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export lgamma(z:CC):CC := ( - w := toCCb(z); - r := newCCb(); + w := toCCbmutable(z); + r := newCCbmutable(); Ccode(void, "acb_lgamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export zeta(z:CC):CC := ( - w := toCCb(z); - r := newCCb(); + w := toCCbmutable(z); + r := newCCbmutable(); Ccode(void, "acb_zeta(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export erf(z:CC):CC := ( - w := toCCb(z); - r := newCCb(); + w := toCCbmutable(z); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_erf(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export erfc(z:CC):CC := ( - w := toCCb(z); - r := newCCb(); + w := toCCbmutable(z); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_erfc(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export BesselJ(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCb(z); - y := toCCb(w); - r := newCCb(); + x := toCCbmutable(z); + y := toCCbmutable(w); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_bessel_j(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -301,9 +301,9 @@ export BesselJ(z:CC,w:CC):CC := ( export BesselY(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCb(z); - y := toCCb(w); - r := newCCb(); + x := toCCbmutable(z); + y := toCCbmutable(w); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_bessel_y(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -311,10 +311,10 @@ export BesselY(z:CC,w:CC):CC := ( export Beta(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCb(z); - y := toCCb(w); - v := toCCb(toCC(1, prec)); - r := newCCb(); + x := toCCbmutable(z); + y := toCCbmutable(w); + v := toCCbmutable(toCC(1, prec)); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", x, ", ", y, ", ", v, ", 0, ", prec, ")"); clear(x); @@ -323,10 +323,10 @@ export Beta(z:CC,w:CC):CC := ( export regularizedBeta(u:CC,v:CC,w:CC):CC := ( prec := min(min(precision(u), precision(v)), precision(w)); - x := toCCb(u); - y := toCCb(v); - z := toCCb(w); - r := newCCb(); + x := toCCbmutable(u); + y := toCCbmutable(v); + z := toCCbmutable(w); + r := newCCbmutable(); Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", y, ", ", z, ", ", x, ", 1, ", prec, ")"); clear(x); From f57988a9821eb74757c223c28013122e4daef8b2 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 10:25:03 -0500 Subject: [PATCH 023/691] changes in actors --- M2/Macaulay2/d/actors.d | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 42e7f398dea..d9e56be7cce 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -129,6 +129,7 @@ plusfun1(rhs:Code):Expr := ( is RRcell do r -- # typical value: symbol +, RR, RR is RRicell do r -- # typical value: symbol +, RRi, RRi is CCcell do r -- # typical value: symbol +, CC, CC + is CCicell do r -- # typical value: symbol +, CCi, CCi is QQcell do r -- # typical value: symbol +, QQ, QQ is RawRingElementCell do r -- # typical value: symbol +, RawRingElement, RawRingElement is RawMatrixCell do r -- # typical value: symbol +, RawMatrix, RawMatrix @@ -148,6 +149,7 @@ export - (rhs:Expr) : Expr := ( is x:RRcell do toExpr(-x.v) -- # typical value: symbol -, RR, RR is x:RRicell do toExpr(-x.v) -- # typical value: symbol -, RRi, RRi is x:CCcell do toExpr(-x.v) -- # typical value: symbol -, CC, CC + is x:CCicell do toExpr(-x.v) -- # typical value: symbol -, CCi, CCi is x:QQcell do toExpr(-x.v) -- # typical value: symbol -, QQ, QQ is x:RawRingElementCell do toExpr(-x.p) -- # typical value: symbol -, RawRingElement, RawRingElement is x:RawMatrixCell do ( -- # typical value: symbol -, RawMatrix, RawMatrix @@ -171,6 +173,7 @@ export (lhs:Expr) - (rhs:Expr) : Expr := ( is y:RRcell do toExpr(toRR(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, ZZ, RR, RR is y:RRicell do toExpr(toRRi(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, ZZ, RRi, RRi is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, ZZ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, ZZ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,MinusS)) is x:QQcell do ( @@ -180,6 +183,7 @@ export (lhs:Expr) - (rhs:Expr) : Expr := ( is y:RRcell do toExpr(toRR(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, QQ, RR, RR is y:RRicell do toExpr(toRRi(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, QQ, RRi, RRi is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, QQ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, QQ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,MinusS)) is x:RawRingElementCell do ( @@ -198,6 +202,7 @@ export (lhs:Expr) - (rhs:Expr) : Expr := ( is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, RR, RR, RR is y:RRicell do toExpr(toRRi(x.v) - y.v) -- # typical value: symbol -, RR, RRi, RRi is y:CCcell do toExpr(x.v - y.v) -- # typical value: symbol -, RR, CC, CC + is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, RR, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,MinusS)) is x:RRicell do ( @@ -206,6 +211,8 @@ export (lhs:Expr) - (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, QQ, RRi is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, RR, RRi is y:RRicell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, RRi, RRi + is y:CCcell do toExpr(toCCi(x.v) - toCCi(y.v)) -- # typical value: symbol -, RRi, CC, CCi + is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,MinusS)) is x:CCcell do ( @@ -213,9 +220,21 @@ export (lhs:Expr) - (rhs:Expr) : Expr := ( is y:ZZcell do toExpr(x.v - toRR(y.v,precision(x.v.re))) -- # typical value: symbol -, CC, ZZ, CC is y:QQcell do toExpr(x.v - toRR(y.v,precision(x.v.re))) -- # typical value: symbol -, CC, QQ, CC is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, CC, RR, CC + is y:RRicell do toExpr(toCCi(x.v) - toCCi(y.v)) -- # typical value: symbol -, CC, RRi, CCi is y:CCcell do toExpr(x.v - y.v) -- # typical value: symbol -, CC, CC, CC + is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, CC, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,MinusS)) + is x:CCicell do ( + when rhs + is y:ZZcell do toExpr(x.v - toCCi(y.v,precision(x.v.re))) -- # typical value: symbol -, CCi, ZZ, CCi + is y:QQcell do toExpr(x.v - toCCi(y.v,precision(x.v.re))) -- # typical value: symbol -, CCi, QQ, CCi + is y:RRcell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, RR, CCi + is y:RRicell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, RRi, CCi + is y:CCcell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, CC, CCi + is y:CCicell do toExpr(x.v - y.v) -- # typical value: symbol -, CCi, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,MinusS)) is x:RawMatrixCell do ( when rhs is y:RawMatrixCell do ( -- # typical value: symbol -, RawMatrix, RawMatrix, RawMatrix From 13d074fa77d826cc1f0a27acf645c13d4944177c Mon Sep 17 00:00:00 2001 From: Andrew Tawfeek Date: Tue, 1 Jul 2025 10:47:25 -0500 Subject: [PATCH 024/691] Added toCCi functionality for ZZ, QQ, RR --- M2/Macaulay2/d/actors4.d | 2 ++ 1 file changed, 2 insertions(+) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index d1bfff279f1..9020d0b9767 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1411,6 +1411,8 @@ setupfun("toRRi",toRRi); toCCi(e:Expr):Expr := ( when e is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) + is x:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) + is x:RRcell do toExpr(toCCi(toRRi(x.v),toRRi(0, precision(x.v)))) is x:CCicell do e is s:Sequence do ( if length(s) == 2 then ( From a2571e7536428dd4362fa310c127a19017a1f50b Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 1 Jul 2025 10:51:45 -0500 Subject: [PATCH 025/691] Added realPart and imagPart --- M2/Macaulay2/d/actors2.dd | 2 ++ M2/Macaulay2/d/actors4.d | 1 + 2 files changed, 3 insertions(+) diff --git a/M2/Macaulay2/d/actors2.dd b/M2/Macaulay2/d/actors2.dd index 0526d047265..367aa2f4d96 100644 --- a/M2/Macaulay2/d/actors2.dd +++ b/M2/Macaulay2/d/actors2.dd @@ -713,6 +713,7 @@ realPart(e:Expr):Expr := ( is RRcell do e is RRicell do e is z:CCcell do toExpr(realPart(z.v)) + is z:CCicell do toExpr(realPart(z.v)) is QQcell do e else WrongArg("a number")); setupfun("realPart0",realPart); @@ -723,6 +724,7 @@ imaginaryPart(e:Expr):Expr := ( is RRcell do zeroE is RRicell do zeroE is z:CCcell do toExpr(imaginaryPart(z.v)) + is z:CCicell do toExpr(imaginaryPart(z.v)) is QQcell do zeroE else WrongArg("a number")); setupfun("imaginaryPart0",imaginaryPart); diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index d1bfff279f1..00ad807b755 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1413,6 +1413,7 @@ toCCi(e:Expr):Expr := ( is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) is x:CCicell do e is s:Sequence do ( + if length(s) > 3 then WrongNumArgs(1,3) else if length(s) == 2 then ( when s.0 is x:RRicell do ( when s.1 is y:RRicell do toExpr(toCCi(x.v,y.v)) From 5c2aa98fa316c22a48aa0b0431bdf6aabcfe2c79 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 1 Jul 2025 11:18:01 -0500 Subject: [PATCH 026/691] Added demo of two inputs to toCCi --- M2/Macaulay2/d/actors4.d | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 31505477609..ea1ee19378d 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1418,7 +1418,10 @@ toCCi(e:Expr):Expr := ( if length(s) > 3 then WrongNumArgs(1,3) else if length(s) == 2 then ( when s.0 is x:RRicell do ( - when s.1 is y:RRicell do toExpr(toCCi(x.v,y.v)) + when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) + is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) else WrongNumArgs(1,2)) From cfc6b54410f60aac5cae367b505eb5ab21a36118 Mon Sep 17 00:00:00 2001 From: Andrew Tawfeek Date: Tue, 1 Jul 2025 11:20:24 -0500 Subject: [PATCH 027/691] Added CCi to RRi --- M2/Macaulay2/d/actors4.d | 1 + 1 file changed, 1 insertion(+) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 31505477609..4e18d20876e 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1413,6 +1413,7 @@ toCCi(e:Expr):Expr := ( is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) is x:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) is x:RRcell do toExpr(toCCi(toRRi(x.v),toRRi(0, precision(x.v)))) + is x:RRicell do toExpr(toCCi(x.v,toRRi(0, precision(x.v)))) is x:CCicell do e is s:Sequence do ( if length(s) > 3 then WrongNumArgs(1,3) else From 1f28439420f87476c7d87ffcbf4033bd53fadea0 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 1 Jul 2025 11:26:18 -0500 Subject: [PATCH 028/691] More of toCCi --- M2/Macaulay2/d/actors4.d | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index aac3ab7551f..fd0c14f1f00 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1418,7 +1418,13 @@ toCCi(e:Expr):Expr := ( is s:Sequence do ( if length(s) > 3 then WrongNumArgs(1,3) else if length(s) == 2 then ( - when s.0 is x:RRicell do ( + when s.0 is x:RRcell do ( + when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) + is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRicell do ( when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) From e9a3d10a0ca0fb4b3704d5d05c3b2688a6a6c84f Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 11:37:22 -0500 Subject: [PATCH 029/691] multiplication implemented --- M2/Macaulay2/d/actors.d | 17 +++++++++++ M2/Macaulay2/d/gmp.d | 65 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index d9e56be7cce..0975dd46b52 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -296,6 +296,7 @@ export (lhs:Expr) * (rhs:Expr) : Expr := ( is y:RRcell do toExpr(toRR(x.v,precision(y.v)) * y.v) -- # typical value: symbol *, ZZ, RR, RR is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, ZZ, RRi, RRi is y:CCcell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, CC, CC + is y:CCicell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) is x:QQcell do ( @@ -305,6 +306,7 @@ export (lhs:Expr) * (rhs:Expr) : Expr := ( is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, QQ, RR, RR is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, QQ, RRi, RRi is y:CCcell do toExpr(y.v * toRR(x.v,precision(y.v.re))) -- # typical value: symbol *, QQ, CC, CC + is y:CCicell do toExpr(y.v * toRR(x.v,precision(y.v.re))) -- # typical value: symbol *, QQ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) is x:RawRingElementCell do ( @@ -333,6 +335,7 @@ export (lhs:Expr) * (rhs:Expr) : Expr := ( is y:RRcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, RR, RR is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, RR, RRi, RRi is y:CCcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, CC, CC + is y:CCicell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) is x:RRicell do ( @@ -341,6 +344,8 @@ export (lhs:Expr) * (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, QQ, RRi is y:RRcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, RR, RRi is y:RRicell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, RRi, RRi + is y:CCcell do toExpr(toCCi(x.v) * y.v) -- # typical value: symbol *, RRi, CC, CCi + is y:CCicell do toExpr(toCCi(x.v) * y.v) -- # typical value: symbol *, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) is x:CCcell do ( @@ -348,7 +353,19 @@ export (lhs:Expr) * (rhs:Expr) : Expr := ( is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, CC, ZZ, CC is y:QQcell do toExpr(x.v * toRR(y.v,precision(x.v.re))) -- # typical value: symbol *, CC, QQ, CC is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, RR, CC + is y:RRicell do toExpr(toCCi(y.v) * x.v) -- # typical value: symbol *, CC, RRi, CCi is y:CCcell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, CC, CC + is y:CCicell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,StarS)) + is x:CCicell do ( + when rhs + is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, CCi, ZZ, CCi + is y:QQcell do toExpr(x.v * toRR(y.v,precision(x.v.re))) -- # typical value: symbol *, CCi, QQ, CCi + is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, RR, CCi + is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, RRi, CCi + is y:CCcell do toExpr(toCCi(y.v) * x.v) -- # typical value: symbol *, CCi, CC, CCi + is y:CCicell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) is x:RawMonomialCell do ( diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 02367260137..b46c5a97ec9 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1200,11 +1200,11 @@ export toCCi(x:RR,y:RRi):CCi := ( export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); ---export infinityCCi(prec:ulong):CCi := (x := infinityRRi(prec,1); toCCi(x,x)); +export infinityCCi(prec:ulong):CCi := (x := infinityRR(prec,1); toCCi(x,x)); export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); ---export nanCCi(prec:ulong):CCi := (x := nanRRi(prec); toCCi(x,x)); +export nanCCi(prec:ulong):CCi := (x := nanRR(prec); toCCi(x,x)); export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); @@ -2223,12 +2223,48 @@ export (x:CC) * (y:RR) : CC := ( else if isnan(x) || isnan(y) then nanCC(min(precision(x),precision(y))) else infinityCC(min(precision(x),precision(y)))); +export (x:CC) * (y:RRi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) + then toCCi(y*x.re, y*x.im) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (x:CCi) * (y:RRi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (x:CCi) * (y:RR) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + export (y:RR) * (x:CC) : CC := ( if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) then toCC(x.re*y, x.im*y) else if isnan(x) || isnan(y) then nanCC(min(precision(x),precision(y))) else infinityCC(min(precision(x),precision(y)))); +export (y:RRi) * (x:CC) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) + then toCCi(y*x.re, y*x.im) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (y:RRi) * (x:CCi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (y:RR) * (x:CCi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + export (y:int) * (x:CC) : CC := ( if isinf(x) && y != 0 then infinityCC(precision(x)) @@ -2239,16 +2275,41 @@ export (x:CC) * (y:ZZ) : CC := ( then infinityCC(precision(x)) else toCC(x.re*y, x.im*y)); +export (x:CCi) * (y:ZZ) : CCi := ( + if isinf(x) && !isZero(y) + then infinityCCi(precision(x)) + else toCCi(x.re*y, x.im*y)); + export (y:ZZ) * (x:CC) : CC := ( if isinf(x) && !isZero(y) then infinityCC(precision(x)) else toCC(x.re*y, x.im*y)); +export (y:ZZ) * (x:CCi) : CCi := ( + if isinf(x) && !isZero(y) + then infinityCCi(precision(x)) + else toCCi(x.re*y, x.im*y)); + export (x:CC) * (y:CC) : CC := ( if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) then infinityCC(min(precision(x),precision(y))) else toCC(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); +export (x:CC) * (y:CCi) : CCi := ( + if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) + then infinityCCi(min(precision(x),precision(y))) + else toCCi(y.re*x.re-y.im*x.im, y.re*x.im+y.im*x.re)); + +export (x:CCi) * (y:CC) : CCi := ( + if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) + then infinityCCi(min(precision(x),precision(y))) + else toCCi(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); + +export (x:CCi) * (y:CCi) : CCi := ( + if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) + then infinityCCi(min(precision(x),precision(y))) + else toCCi(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); + export (x:CC) / (y:RR) : CC := ( if isZero(y) && !isnan(x) && !isZero(x) then infinityCC(min(precision(x),precision(y))) From 90356b632d619d22ec80c6d38800fe47713142a5 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 11:56:43 -0500 Subject: [PATCH 030/691] integer division by CCi implemented --- M2/Macaulay2/d/actors.d | 2 ++ 1 file changed, 2 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 0975dd46b52..d76dc135cf3 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -436,6 +436,8 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, ZZ, RRi, RRi is y:CCcell do ( -- # typical value: symbol /, ZZ, CC, CC toExpr(x.v / y.v)) + is y:CCicell do ( -- # typical value: symbol /, ZZ, CCi, CCi + toExpr(toCCi((x.v*y.v.re)/(y.v.re^long(2)+y.v.im^long(2)),(-x.v*y.v.im)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:QQcell do ( From a95022387063a1b55d7e1316a1cd39bf47eb7978 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 12:59:19 -0400 Subject: [PATCH 031/691] Go back to RRb/CCb naming Rather than copying RRbmutable, CCbmutable to GC-collected memory, we'll just register finalizers for RRbcell and CCbcell --- M2/Macaulay2/d/ballarith.d | 186 ++++++++++++++++++------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 68e52bcfa82..2891c8a4678 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -32,57 +32,57 @@ header " -- RRb -- ------------ -RRbmutable := Pointer "arb_ptr"; -init(x:RRbmutable) ::= ( +RRb := Pointer "arb_ptr"; +init(x:RRb) ::= ( Ccode(void, "arb_init(", x, ")"); x); -newRRbmutable():RRbmutable := init(GCmalloc(RRbmutable)); -clear(x:RRbmutable) ::= Ccode(void, "arb_clear(", x, ")"); +newRRb():RRb := init(GCmalloc(RRb)); +clear(x:RRb) ::= Ccode(void, "arb_clear(", x, ")"); -- clear after using -toRRbmutable(x:RR, y:RR, prec:ulong):RRbmutable := ( - z := newRRbmutable(); +toRRb(x:RR, y:RR, prec:ulong):RRb := ( + z := newRRb(); Ccode(void, "arb_set_interval_mpfr(", z, ", ", x, ", ", y, ", ", prec, ")"); z); -toRRbmutable(x:RR):RRbmutable := toRRbmutable(x, x, precision(x)); -toRRbmutable(x:RRi):RRbmutable := toRRbmutable(leftRR(x), rightRR(x), precision(x)); +toRRb(x:RR):RRb := toRRb(x, x, precision(x)); +toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); -toRR(x:RRbmutable, prec:ulong):RR := ( +toRR(x:RRb, prec:ulong):RR := ( y := newRRmutable(prec); Ccode(int, "arf_get_mpfr(", y, ", arb_midref(", x, "), MPFR_RNDN)"); moveToRRandclear(y)); -toRRi(x:RRbmutable, prec:ulong):RRi := ( +toRRi(x:RRb, prec:ulong):RRi := ( y := newRRimutable(prec); Ccode(void, "arb_get_interval_mpfr((mpfr_ptr)&", y, "->left, (mpfr_ptr)&", y, "->right, ", x, ")"); moveToRRiandclear(y)); -moveToRRiandclear(x:RRbmutable, prec:ulong):RRi := ( +moveToRRiandclear(x:RRb, prec:ulong):RRi := ( r := toRRi(x, prec); clear(x); r); -- special functions export eint(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_ei(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export Gamma(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_gamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export Gamma(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRbmutable(z); - y := toRRbmutable(w); - r := newRRbmutable(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 0, ", prec, ")"); clear(x); @@ -91,9 +91,9 @@ export Gamma(z:RRi,w:RRi):RRi := ( export regularizedGamma(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRbmutable(z); - y := toRRbmutable(w); - r := newRRbmutable(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 1, ", prec, ")"); clear(x); @@ -101,52 +101,52 @@ export regularizedGamma(z:RRi,w:RRi):RRi := ( moveToRRiandclear(r, prec)); export Digamma(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_digamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export lgamma(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_lgamma(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export zeta(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_zeta(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export erf(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_erf(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export erfc(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_erfc(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export inverseErf(x:RRi):RRi := ( - y := toRRbmutable(x); - r := newRRbmutable(); + y := toRRb(x); + r := newRRb(); Ccode(void, "arb_hypgeom_erfinv(", r, ", ", y, ", ", precision(x), ")"); clear(y); moveToRRiandclear(r, precision(x))); export BesselJ(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRbmutable(z); - y := toRRbmutable(w); - r := newRRbmutable(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_bessel_j(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -154,9 +154,9 @@ export BesselJ(z:RRi,w:RRi):RRi := ( export BesselY(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRbmutable(z); - y := toRRbmutable(w); - r := newRRbmutable(); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_bessel_y(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -164,10 +164,10 @@ export BesselY(z:RRi,w:RRi):RRi := ( export Beta(z:RRi,w:RRi):RRi := ( prec := min(precision(z), precision(w)); - x := toRRbmutable(z); - y := toRRbmutable(w); - v := toRRbmutable(toRRi(1, prec)); - r := newRRbmutable(); + x := toRRb(z); + y := toRRb(w); + v := toRRb(toRRi(1, prec)); + r := newRRb(); Ccode(void, "arb_hypgeom_beta_lower(", r, ", ", x, ", ", y, ", ", v, ", 0, ", prec, ")"); clear(x); @@ -176,10 +176,10 @@ export Beta(z:RRi,w:RRi):RRi := ( export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( prec := min(min(precision(u), precision(v)), precision(w)); - x := toRRbmutable(u); - y := toRRbmutable(v); - z := toRRbmutable(w); - r := newRRbmutable(); + x := toRRb(u); + y := toRRb(v); + z := toRRb(w); + r := newRRb(); Ccode(void, "arb_hypgeom_beta_lower(", r, ", ", y, ", ", z, ", ", x, ", 1, ", prec, ")"); clear(x); @@ -191,52 +191,52 @@ export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( -- CCBall -- ------------ -CCbmutable := Pointer "acb_ptr"; -init(z:CCbmutable) ::= ( +CCb := Pointer "acb_ptr"; +init(z:CCb) ::= ( Ccode(void, "acb_init(", z, ")"); z); -newCCbmutable():CCbmutable := init(GCmalloc(CCbmutable)); -clear(z:CCbmutable) ::= Ccode(void, "acb_clear(", z, ")"); +newCCb():CCb := init(GCmalloc(CCb)); +clear(z:CCb) ::= Ccode(void, "acb_clear(", z, ")"); -- clear after using -toCCbmutable(z:CC):CCbmutable := ( - x := toRRbmutable(realPart(z)); - y := toRRbmutable(imaginaryPart(z)); - w := newCCbmutable(); +toCCb(z:CC):CCb := ( + x := toRRb(realPart(z)); + y := toRRb(imaginaryPart(z)); + w := newCCb(); Ccode(void, "acb_set_arb_arb(", w, ", ", x, ", ", y, ")"); clear(x); clear(y); w); -toCC(z:CCbmutable, prec:ulong):CC := ( - x := Ccode(RRbmutable, "acb_realref(", z, ")"); - y := Ccode(RRbmutable, "acb_imagref(", z, ")"); +toCC(z:CCb, prec:ulong):CC := ( + x := Ccode(RRb, "acb_realref(", z, ")"); + y := Ccode(RRb, "acb_imagref(", z, ")"); toCC(toRR(x, prec), toRR(y, prec))); -moveToCCandclear(z:CCbmutable, prec:ulong):CC := ( +moveToCCandclear(z:CCb, prec:ulong):CC := ( r := toCC(z, prec); clear(z); r); export eint(z:CC):CC := ( - w := toCCbmutable(z); - r := newCCbmutable(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_hypgeom_ei(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export Gamma(z:CC):CC := ( - w := toCCbmutable(z); - r := newCCbmutable(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_gamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export Gamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCbmutable(z); - y := toCCbmutable(w); - r := newCCbmutable(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 0, ", prec, ")"); clear(x); @@ -245,9 +245,9 @@ export Gamma(z:CC,w:CC):CC := ( export regularizedGamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCbmutable(z); - y := toCCbmutable(w); - r := newCCbmutable(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 1, ", prec, ")"); clear(x); @@ -255,45 +255,45 @@ export regularizedGamma(z:CC,w:CC):CC := ( moveToCCandclear(r, prec)); export Digamma(z:CC):CC := ( - w := toCCbmutable(z); - r := newCCbmutable(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_digamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export lgamma(z:CC):CC := ( - w := toCCbmutable(z); - r := newCCbmutable(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_lgamma(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export zeta(z:CC):CC := ( - w := toCCbmutable(z); - r := newCCbmutable(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_zeta(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export erf(z:CC):CC := ( - w := toCCbmutable(z); - r := newCCbmutable(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_hypgeom_erf(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export erfc(z:CC):CC := ( - w := toCCbmutable(z); - r := newCCbmutable(); + w := toCCb(z); + r := newCCb(); Ccode(void, "acb_hypgeom_erfc(", r, ", ", w, ", ", precision(z), ")"); clear(w); moveToCCandclear(r, precision(z))); export BesselJ(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCbmutable(z); - y := toCCbmutable(w); - r := newCCbmutable(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_bessel_j(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -301,9 +301,9 @@ export BesselJ(z:CC,w:CC):CC := ( export BesselY(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCbmutable(z); - y := toCCbmutable(w); - r := newCCbmutable(); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_bessel_y(", r, ", ", x, ", ", y, ", ", prec, ")"); clear(x); clear(y); @@ -311,10 +311,10 @@ export BesselY(z:CC,w:CC):CC := ( export Beta(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); - x := toCCbmutable(z); - y := toCCbmutable(w); - v := toCCbmutable(toCC(1, prec)); - r := newCCbmutable(); + x := toCCb(z); + y := toCCb(w); + v := toCCb(toCC(1, prec)); + r := newCCb(); Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", x, ", ", y, ", ", v, ", 0, ", prec, ")"); clear(x); @@ -323,10 +323,10 @@ export Beta(z:CC,w:CC):CC := ( export regularizedBeta(u:CC,v:CC,w:CC):CC := ( prec := min(min(precision(u), precision(v)), precision(w)); - x := toCCbmutable(u); - y := toCCbmutable(v); - z := toCCbmutable(w); - r := newCCbmutable(); + x := toCCb(u); + y := toCCb(v); + z := toCCb(w); + r := newCCb(); Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", y, ", ", z, ", ", x, ", 1, ", prec, ")"); clear(x); From 605119583739a35b01057950f6a7b886dd423ea0 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 14:54:20 -0500 Subject: [PATCH 032/691] rationals division by CCi implemented --- M2/Macaulay2/d/actors.d | 2 ++ 1 file changed, 2 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index d76dc135cf3..195a10f1568 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -456,6 +456,8 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( is y:CCcell do ( -- # typical value: symbol /, QQ, CC, CC if y.v === 0 then DivisionByZero() else toExpr(toRR(x.v,precision(y.v.re)) / y.v)) + is y:CCicell do ( -- # typical value: symbol /, QQ, CCi, CCi + toExpr(toCCi((y.v.re*x.v)/(y.v.re^long(2)+y.v.im^long(2)),(-y.v.im*x.v)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:RRcell do ( From 44d3b72fb000bfd263a79f45ab1f1d44324374bf Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 15:00:35 -0500 Subject: [PATCH 033/691] RR over CCi implemented --- M2/Macaulay2/d/actors.d | 2 ++ 1 file changed, 2 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 195a10f1568..e8b31c300b1 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -475,6 +475,8 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RR, RRi, RRi is y:CCcell do ( -- # typical value: symbol /, RR, CC, CC toExpr(x.v / y.v)) + is y:CCicell do ( -- # typical value: symbol /, RR, CCi, CCi + toExpr(toCCi((y.v.re*x.v)/(y.v.re^long(2)+y.v.im^long(2)),(-y.v.im*x.v)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:RRicell do ( From b5c4aa9d3b2bd723f1dd4afc6abcede98adbe559 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 1 Jul 2025 15:24:21 -0500 Subject: [PATCH 034/691] Adding interval functions for CCi --- M2/Macaulay2/d/actors4.d | 1 + M2/Macaulay2/m2/intervals.m2 | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index fd0c14f1f00..c3ef1ac92c8 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1414,6 +1414,7 @@ toCCi(e:Expr):Expr := ( is x:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) is x:RRcell do toExpr(toCCi(toRRi(x.v),toRRi(0, precision(x.v)))) is x:RRicell do toExpr(toCCi(x.v,toRRi(0, precision(x.v)))) + is x:CCcell do toExpr(toCCi(toRRi(realPart(x.v)),toRRi(imaginaryPart(x.v)))) is x:CCicell do e is s:Sequence do ( if length(s) > 3 then WrongNumArgs(1,3) else diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index be644a91189..e33d775354d 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -61,5 +61,7 @@ intersect(RRi, RRi) := RRi => { Precision => -1 } >> opts -> (N, M) -> ( else intersectRRi(opts.Precision,N,M)) isEmpty RRi := Boolean => isEmptyRRi +isEmpty CCi := x -> isEmptyRRi realPart x or isEmptyRRi imaginaryPart x -toExternalString RRi:= x -> "interval" | toExternalString (left x, right x) +toExternalString RRi := x -> "interval" | toExternalString (left x, right x) +toExternalString CCi := x -> "interval" | toExternalString (left realPart x+(left imaginaryPart x)*ii,right realPart x+(right imaginaryPart x)*ii) From 87ce4cc56c8f3f4af9f6ba4d2f9579f63b9c095c Mon Sep 17 00:00:00 2001 From: klee669 Date: Tue, 1 Jul 2025 15:26:04 -0500 Subject: [PATCH 035/691] some trials for spanCCi --- M2/Macaulay2/m2/intervals.m2 | 18 +++++++++++- .../Bertini/examples/___B_sq__Constants.out | 1 + .../packages/Bertini/examples/___Bertini.out | 1 + .../___Bertini_spinput_spconfiguration.out | 1 + ...e_spdeclarations_co_sprandom_spnumbers.out | 1 + .../Bertini/examples/___Is__Projective.out | 1 + .../examples/___Number__To__B_sq__String.out | 1 + .../Bertini/examples/___Variable_spgroups.out | 1 + .../_bertini__Component__Member__Test.out | 1 + .../_bertini__Parameter__Homotopy.out | 1 + .../examples/_bertini__Pos__Dim__Solve.out | 1 + .../examples/_bertini__Refine__Sols.out | 3 +- .../Bertini/examples/_bertini__Sample.out | 1 + .../examples/_bertini__Track__Homotopy.out | 1 + .../examples/_bertini__User__Homotopy.out | 1 + .../examples/_bertini__Zero__Dim__Solve.out | 1 + .../examples/_import__Incidence__Matrix.out | 1 + .../examples/_import__Main__Data__File.out | 1 + .../examples/_import__Parameter__File.out | 1 + .../examples/_import__Solutions__File.out | 1 + .../examples/_make__B_sq__Input__File.out | 3 ++ .../Bertini/examples/_make__B_sq__Section.out | 29 ++++++++++--------- .../Bertini/examples/_make__B_sq__Slice.out | 1 + .../Bertini/examples/_move__B_sq__File.out | 5 ++++ .../Bertini/examples/_radical__List.out | 1 + .../packages/Bertini/examples/_sub__Point.out | 1 + .../Bertini/examples/_value__B__M2.out | 1 + .../Bertini/examples/_write__Start__File.out | 1 + .../packages/Python/examples/___Python.out | 5 +++- .../Python/examples/___Python__Object.out | 1 + .../Python/examples/___Python__Object_sp~.out | 1 + .../examples/_abs_lp__Python__Object_rp.out | 1 + .../examples/_add__Py__To__M2__Function.out | 5 +++- .../_ceiling_lp__Python__Object_rp.out | 1 + .../examples/_floor_lp__Python__Object_rp.out | 1 + .../packages/Python/examples/_getattr.out | 1 + .../packages/Python/examples/_getitem.out | 1 + .../packages/Python/examples/_hasattr.out | 1 + .../examples/_help_lp__Python__Object_rp.out | 5 +++- .../packages/Python/examples/_import.out | 5 +++- ...Member_lp__Thing_cm__Python__Object_rp.out | 1 + .../_iterator_lp__Python__Object_rp.out | 3 +- .../_length_lp__Python__Object_rp.out | 1 + .../examples/_next_lp__Python__Object_rp.out | 3 +- .../Python/examples/_object__Type.out | 1 + .../Python/examples/_python__Value.out | 1 + ...__Python__Object_cm__Python__Object_rp.out | 1 + .../_round_lp__Z__Z_cm__Python__Object_rp.out | 1 + .../Python/examples/_run__Simple__String.out | 1 + .../packages/Python/examples/_setattr.out | 5 +++- .../packages/Python/examples/_setitem.out | 1 + .../Python/examples/_to__Function.out | 5 +++- .../packages/Python/examples/_to__Python.out | 3 +- .../_truncate_lp__Python__Object_rp.out | 1 + .../examples/_value_lp__Python__Object_rp.out | 1 + .../Tropical/examples/___Bergman__Fan.out | 1 + .../examples/___Compute__Multiplicities.out | 1 + .../Tropical/examples/___Is__Homogeneous.out | 1 + .../packages/Tropical/examples/___Prime.out | 1 + .../Tropical/examples/___Symmetry.out | 1 + .../_amb__Dim_lp__Tropical__Cycle_rp.out | 1 + ..._cones_lp__Z__Z_cm__Tropical__Cycle_rp.out | 1 + .../examples/_dim_lp__Tropical__Cycle_rp.out | 1 + .../_f__Vector_lp__Tropical__Cycle_rp.out | 1 + .../examples/_fan_lp__Tropical__Cycle_rp.out | 1 + .../Tropical/examples/_is__Balanced.out | 1 + .../_is__Pure_lp__Tropical__Cycle_rp.out | 1 + ..._is__Simplicial_lp__Tropical__Cycle_rp.out | 1 + .../examples/_is__Tropical__Basis.out | 1 + ...ineality__Space_lp__Tropical__Cycle_rp.out | 1 + .../_max__Cones_lp__Tropical__Cycle_rp.out | 1 + .../Tropical/examples/_multiplicities.out | 1 + .../examples/_rays_lp__Tropical__Cycle_rp.out | 1 + .../examples/_stable__Intersection.out | 1 + .../Tropical/examples/_tropical__Cycle.out | 1 + .../examples/_tropical__Prevariety.out | 1 + .../Tropical/examples/_tropical__Variety.out | 1 + .../examples/_visualize__Hypersurface.out | 1 + M2/Macaulay2/system/supervisor.cpp | 2 +- 79 files changed, 137 insertions(+), 26 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index be644a91189..98ff0a42881 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -41,13 +41,29 @@ spanRRi(RRi,RRi) := opts -> (N,M) -> ( else if opts.Precision < 0 then toRRi(min(left N,left M),max(right N,right M)) else toRRi(opts.Precision,min(left N,left M),max(right N,right M))) +spanCCi = method(Options => {Precision => -1}) + +for A in {ZZ,QQ,RR,RRi} do +for B in {ZZ,QQ,RR,RRi} do +spanCCi(A,B) := opts -> (N,M) -> ( + toCCi(spanRRi(N,M), interval 0) + ) + +for A in {ZZ,QQ,RR,RRi} do ( +spanRRi(CCi,A) := opts -> (N,M) -> ( + if isEmpty(N) then interval(opts,M) + else if opts.Precision < 0 then toRRi(min(left N,M),max(right N,M)) + else toRRi(opts.Precision,min(left N,M),max(right N,M))); +spanRRi(A,CCi) := opts -> (N,M) -> span(opts,M,N)) + + span = method(Dispatch => Thing, Options => true) span ZZ := span QQ := span RR := {Precision => -1} >> opts -> N -> interval(N,opts) span RRi := {Precision => -1} >> opts -> N -> interval(left N,right N,opts) -span List := span Sequence := {Precision => -1} >> opts -> L -> fold(L, (N, M) -> spanRRi(N, M, opts)) +span List := span Sequence := {Precision => -1} >> opts -> L -> fold(L, (N, M) -> spanCCi(N, M, opts)) for A in {ZZ,QQ,RR} do isMember(A,RRi) := (N,M) -> subsetRRi(N,M); diff --git a/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out b/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out index 601df0f3c74..421392d4336 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out +++ b/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1729711110531181719 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[z,a,b,c] diff --git a/M2/Macaulay2/packages/Bertini/examples/___Bertini.out b/M2/Macaulay2/packages/Bertini/examples/___Bertini.out index 1141daac55f..1eac0558516 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Bertini.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Bertini.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 3052769501440199080 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : needsPackage("Bertini", Configuration=>{"BERTINIexecutable"=>"/folder/subfolder/bertini"}) diff --git a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out index 73929b902b0..5635f15439e 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 5125700499117494129 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : CC[x,y]; F = {x^2-1,y^2-1}; diff --git a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out index 68be48eb23a..6b5e91a1ec5 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1181429681429750825 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[x,y,c1,c2] diff --git a/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out b/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out index 876b410d16f..8404ac57c90 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 15049240509654635639 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y,z]; diff --git a/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out b/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out index 6b3c6f49585..022765c0587 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 5537054878747415763 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : NumberToB'String(2+5*ii) diff --git a/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out b/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out index cf60bd7a813..410d5c5df4b 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 18358394276875387580 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out index 5485817e1b9..4d324ed231b 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 16509404147300812608 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y,z]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out index 592d6a4ba6c..3df7c3ea379 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 2393720217502712319 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=CC[u1,u2,u3,x,y]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out index 5b12eea467e..a481e8e6602 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1503209601929851452 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out index 194ae745619..e9c9a81ba30 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 12443373955151764050 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y]; @@ -29,7 +30,7 @@ o5 : List i6 : coords_0 o6 = 1.4142135623730950488016887242096980785696718753769480731766797379907324 - 78462107038850387534327641573 + 784621070388503875343276415727 o6 : CC (of precision 333) diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out index eecb86a6c3d..d3491acfd6c 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 2266058223581986768 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y,z] diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out index 3b9c9089da6..84dd0e00b29 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 4423001283312120928 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,t]; -- include the path variable in the ring diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out index 7f9c0301432..cb65ad584ec 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1497993508773629302 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,a,t]; -- include the path variable in the ring diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out index 629aebf97b9..a0987393425 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 6114446290252515939 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out b/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out index 17c7539f47f..5ef22fe4a5c 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 17285782284337978894 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : makeB'InputFile(storeBM2Files, BertiniInputConfiguration=>{{TrackType,1}}, AffVariableGroup=>{x,y,z}, B'Polynomials=>{"z*((x+y+z)^3-1)","z*(y^2-3+z)"} ); diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out b/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out index f2173651079..eab88f540ce 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13875702623998209363 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : makeB'InputFile(storeBM2Files, AffVariableGroup=>{x,y,z}, diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out b/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out index 77345daba15..e7f804c4f7e 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1729805987615673498 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : writeParameterFile(storeBM2Files,{1,2},NameParameterFile=>"final_parameters"); diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out b/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out index b2a48cf5120..a47606fa1cf 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 7920468485111445591 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[x,y] diff --git a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out index d7ba92543c0..c3071671a56 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 713363350566806638 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[x1,x2,y] @@ -10,6 +11,8 @@ i2 : theDir = temporaryFileName(); i3 : makeDirectory theDir +o3 = /var/folders/f4/54tv_3013gbcdz5jqk69txhm0000gn/T/M2-83605-0/1 + i4 : makeB'InputFile(theDir, BertiniInputConfiguration=>{MPType=>2}, AffVariableGroup=>{{x1,x2},{y}}, diff --git a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out index 0202c1ab8ad..d2235b9cc5c 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out +++ b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 4847554454883991115 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : s=makeB'Section({x,y,z}) @@ -44,9 +45,9 @@ o7 : B'Section i8 : sRational#B'NumberCoefficients - 7 1 7 -o8 = {--, -, --} - 10 2 10 + 7 7 7 +o8 = {--, --, -} + 10 10 3 o8 : List @@ -76,11 +77,11 @@ o12 : B'Section i13 : r= affineContainingPoint#B'SectionString -o13 = (1.18921+.849539*ii)*(x-(1)*(1))+(-.542371+.307137*ii)*(y-(1)*(2))+( - 1.36945+.015633*ii)*(z-(1)*(3)) +o13 = (.849539-.106572*ii)*(x-(1)*(1))+(.307137+.911684*ii)*(y-(1)*(2 + ))+(.0156326-.285432*ii)*(z-(1)*(3)) i14 : print r -(1.18921+.849539*ii)*(x-(1)*(1))+(-.542371+.307137*ii)*(y-(1)*(2))+(1.36945+.015633*ii)*(z-(1)*(3)) +(.849539-.106572*ii)*(x-(1)*(1))+(.307137+.911684*ii)*(y-(1)*(2))+(.0156326-.285432*ii)*(z-(1)*(3)) i15 : rHomogeSection= makeB'Section({x,y,z},ContainsPoint=>P,B'Homogenization=>"x+y+z") @@ -90,20 +91,20 @@ o15 : B'Section i16 : peek rHomogeSection -o16 = B'Section{B'Homogenization => x+y+z - B'NumberCoefficients => {.534614-.175945*ii, .426704 - B'SectionString => (.534614-.175945*ii)*(x-(x+y+z)*( +o16 = B'Section{B'Homogenization => x+y+z + B'NumberCoefficients => {-.175945+.411267*ii, -.97539 + B'SectionString => (-.175945+.411267*ii)*(x-(x+y+z)*( ----------------------------------------------------------------------- - -.97539*ii, -.478803+.0416008*ii} - 1))+(.426704-.97539*ii)*(y-(x+y+z)*(2))+(-.478803+.0416008*ii)*(z-(x+y+ + +.132106*ii, .041601+.946255*ii} + 1))+(-.97539+.132106*ii)*(y-(x+y+z)*(2))+(.041601+.946255*ii)*(z-(x+y+z ----------------------------------------------------------------------- - } + } - z)*(3)) + )*(3)) i17 : print rHomogeSection#B'SectionString -(.534614-.175945*ii)*(x-(x+y+z)*(1))+(.426704-.97539*ii)*(y-(x+y+z)*(2))+(-.478803+.0416008*ii)*(z-(x+y+z)*(3)) +(-.175945+.411267*ii)*(x-(x+y+z)*(1))+(-.97539+.132106*ii)*(y-(x+y+z)*(2))+(.041601+.946255*ii)*(z-(x+y+z)*(3)) i18 : f="y^3-x*y+1" diff --git a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out index 689cf889ed4..55c0b6a9966 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out +++ b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 3879697425701981702 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : sliceType={1,1} diff --git a/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out b/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out index f2b61b51633..2c2db4ffe54 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 12643950388143032379 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : writeParameterFile(storeBM2Files,{2,3,5,7}); @@ -30,6 +31,8 @@ i9 : Dir1 = temporaryFileName(); i10 : makeDirectory Dir1 +o10 = /var/folders/f4/54tv_3013gbcdz5jqk69txhm0000gn/T/M2-83587-0/1 + i11 : writeParameterFile(storeBM2Files,{2,3,5,7}); i12 : moveB'File(storeBM2Files,"final_parameters","start_parameters",MoveToDirectory=>Dir1) @@ -40,6 +43,8 @@ o13 = true i14 : makeDirectory (storeBM2Files|"/Dir2") +o14 = /var/folders/f4/54tv_3013gbcdz5jqk69txhm0000gn/T/M2-83587-0/0/Dir2 + i15 : writeParameterFile(storeBM2Files,{2,3,5,7}); i16 : moveB'File(storeBM2Files,"final_parameters","start_parameters",SubFolder=>"Dir2") diff --git a/M2/Macaulay2/packages/Bertini/examples/_radical__List.out b/M2/Macaulay2/packages/Bertini/examples/_radical__List.out index e8b8d6e4470..3f094f364a8 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_radical__List.out +++ b/M2/Macaulay2/packages/Bertini/examples/_radical__List.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1437360351269936102 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : radicalList({2.000,1.999}) diff --git a/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out b/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out index 5d4aff9746f..4d8ef2bb9ed 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out +++ b/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13034284525720479189 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=CC[x,y,z] diff --git a/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out b/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out index 84a2a7cea0c..dfb1804d932 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out +++ b/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 6438836643559783046 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : valueBM2("1.22e-2 4e-5") diff --git a/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out b/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out index 6240e24b3c2..957d0bcc47e 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1731127908360029171 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : coordinatesOfTwoPnts={{1,0},{3,4}} diff --git a/M2/Macaulay2/packages/Python/examples/___Python.out b/M2/Macaulay2/packages/Python/examples/___Python.out index 96687385971..95811f2236b 100644 --- a/M2/Macaulay2/packages/Python/examples/___Python.out +++ b/M2/Macaulay2/packages/Python/examples/___Python.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13520444142344506266 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : toPython {1, 2/3, "foo", (1, 2, 3), hashTable {"foo" => "bar"}} @@ -14,7 +15,9 @@ o2 : List i3 : math = import "math" -o3 = +o3 = o3 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/___Python__Object.out b/M2/Macaulay2/packages/Python/examples/___Python__Object.out index b9f51dbe50d..e7a9034ce36 100644 --- a/M2/Macaulay2/packages/Python/examples/___Python__Object.out +++ b/M2/Macaulay2/packages/Python/examples/___Python__Object.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 10348206706567645224 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "5" diff --git a/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out b/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out index 12690f729c1..27e49dec9fc 100644 --- a/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out +++ b/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1330555084609 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : (toPython 5)~ diff --git a/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out index 99881c41376..2fcbc991b1a 100644 --- a/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1332381382166 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : abs toPython(-12) diff --git a/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out b/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out index 67a0c92cdbf..239ff58e72f 100644 --- a/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out +++ b/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out @@ -1,8 +1,11 @@ -- -*- M2-comint -*- hash: 7688935989390791107 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : fractions = import "fractions" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out index 6806add35b5..d54834fd69c 100644 --- a/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1731866675422889330 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : ceiling toPython 5.8 diff --git a/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out index abe6a0d369b..deff550f7ea 100644 --- a/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1730869845958507596 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : floor toPython 5.8 diff --git a/M2/Macaulay2/packages/Python/examples/_getattr.out b/M2/Macaulay2/packages/Python/examples/_getattr.out index e1d390469a9..1a515f00edc 100644 --- a/M2/Macaulay2/packages/Python/examples/_getattr.out +++ b/M2/Macaulay2/packages/Python/examples/_getattr.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 10112320777315990793 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : foo = pythonValue "'Hello, world!'" diff --git a/M2/Macaulay2/packages/Python/examples/_getitem.out b/M2/Macaulay2/packages/Python/examples/_getitem.out index e9d6e664c9a..a387d83b521 100644 --- a/M2/Macaulay2/packages/Python/examples/_getitem.out +++ b/M2/Macaulay2/packages/Python/examples/_getitem.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 11784266446829141384 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "[1,2,3,4]" diff --git a/M2/Macaulay2/packages/Python/examples/_hasattr.out b/M2/Macaulay2/packages/Python/examples/_hasattr.out index e82ca17d5d6..2e44ed6cb29 100644 --- a/M2/Macaulay2/packages/Python/examples/_hasattr.out +++ b/M2/Macaulay2/packages/Python/examples/_hasattr.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 10109958694099330308 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : foo = pythonValue "'Hello, world!'" diff --git a/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out index e5ab60af50a..6da66001b28 100644 --- a/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out @@ -1,8 +1,11 @@ -- -*- M2-comint -*- hash: 234211404776825840 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_import.out b/M2/Macaulay2/packages/Python/examples/_import.out index 7c3097a1612..82ab768554b 100644 --- a/M2/Macaulay2/packages/Python/examples/_import.out +++ b/M2/Macaulay2/packages/Python/examples/_import.out @@ -1,8 +1,11 @@ -- -*- M2-comint -*- hash: 235137481443939015 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out index 3fc022e5ecd..494bc482e9f 100644 --- a/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 16061367338054950412 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : isMember(toPython 3, toPython {1, 2, 3}) diff --git a/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out index f4c53a33553..f1d9b6d15ef 100644 --- a/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1731738896645393605 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "range(3)" @@ -8,7 +9,7 @@ o1 : PythonObject of class range i2 : i = iterator x -o2 = +o2 = o2 : PythonObject of class range_iterator diff --git a/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out index 6ae31ddadc5..d040e1b826f 100644 --- a/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1730448222125773796 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : length pythonValue "'Hello, world!'" diff --git a/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out index 31d535b12ae..19e1bff922e 100644 --- a/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 14455760057870246997 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "range(3)" @@ -8,7 +9,7 @@ o1 : PythonObject of class range i2 : i = iterator x -o2 = +o2 = o2 : PythonObject of class range_iterator diff --git a/M2/Macaulay2/packages/Python/examples/_object__Type.out b/M2/Macaulay2/packages/Python/examples/_object__Type.out index 85e009cf51b..e6ee74d04de 100644 --- a/M2/Macaulay2/packages/Python/examples/_object__Type.out +++ b/M2/Macaulay2/packages/Python/examples/_object__Type.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1729585357366275057 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : objectType pythonValue "2" diff --git a/M2/Macaulay2/packages/Python/examples/_python__Value.out b/M2/Macaulay2/packages/Python/examples/_python__Value.out index 645dcdc3b60..3328d4204fc 100644 --- a/M2/Macaulay2/packages/Python/examples/_python__Value.out +++ b/M2/Macaulay2/packages/Python/examples/_python__Value.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13262495016035396081 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : pythonValue "2 + 2" diff --git a/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out index 4ecb6d440ac..fb3d5527da0 100644 --- a/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 17298892581603033753 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : quotientRemainder(toPython 37, toPython 5) diff --git a/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out index e47ddd42dd3..4dbc0347647 100644 --- a/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 3509501310639924813 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = (import "math")@@pi diff --git a/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out b/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out index 6461ad3b611..55c64c49f96 100644 --- a/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out +++ b/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1331529053663 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : runSimpleString "print('Hello, world!')" diff --git a/M2/Macaulay2/packages/Python/examples/_setattr.out b/M2/Macaulay2/packages/Python/examples/_setattr.out index 82add55a59a..fb98ab68df3 100644 --- a/M2/Macaulay2/packages/Python/examples/_setattr.out +++ b/M2/Macaulay2/packages/Python/examples/_setattr.out @@ -1,8 +1,11 @@ -- -*- M2-comint -*- hash: 10814637973204880769 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_setitem.out b/M2/Macaulay2/packages/Python/examples/_setitem.out index c12b90ef8e7..11914d605df 100644 --- a/M2/Macaulay2/packages/Python/examples/_setitem.out +++ b/M2/Macaulay2/packages/Python/examples/_setitem.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 789145051544179922 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "[1,2,3,4]" diff --git a/M2/Macaulay2/packages/Python/examples/_to__Function.out b/M2/Macaulay2/packages/Python/examples/_to__Function.out index 01ef78a6d4e..3a219eb7909 100644 --- a/M2/Macaulay2/packages/Python/examples/_to__Function.out +++ b/M2/Macaulay2/packages/Python/examples/_to__Function.out @@ -1,8 +1,11 @@ -- -*- M2-comint -*- hash: 12972340179139801570 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_to__Python.out b/M2/Macaulay2/packages/Python/examples/_to__Python.out index 01efef5d7f6..3014bb68f51 100644 --- a/M2/Macaulay2/packages/Python/examples/_to__Python.out +++ b/M2/Macaulay2/packages/Python/examples/_to__Python.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 18231915748995903169 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : toPython 2 @@ -76,7 +77,7 @@ o12 : FunctionClosure i13 : pysqrt = toPython m2sqrt -o13 = +o13 = o13 : PythonObject of class builtin_function_or_method diff --git a/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out index cbeb0befa59..57a40b28ca2 100644 --- a/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 1731477845529974376 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : truncate toPython 5.8 diff --git a/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out index eb7a8e9a172..e83a6f78741 100644 --- a/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 5798072175071737422 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : value pythonValue "[1, 3.14159, 'foo', (1,2,3), {'foo':'bar'}]" diff --git a/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out b/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out index 44ac42c5a33..cc896899286 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 10480927928276198368 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : M=uniformMatroid(2,3); diff --git a/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out b/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out index 7d1709c9f9f..e445529cf25 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 9403660397014940741 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out b/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out index 02f2f614f32..f2a9f82a40d 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 2389386350486720709 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y]; diff --git a/M2/Macaulay2/packages/Tropical/examples/___Prime.out b/M2/Macaulay2/packages/Tropical/examples/___Prime.out index 588a262722f..239e6c777f4 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Prime.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Prime.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 9003283797531820781 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out b/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out index 6d3b5a33753..3ee31ee7729 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 7679271322316421514 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x_0,x_1,x_2]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out index 6409ec3f6cc..2220a3f10fd 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13297202816609704649 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out index cc6d4064aed..7af6685e894 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 18313553343135756437 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w,t] diff --git a/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out index afb549e507f..55f75aae450 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 189144728989167395 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w] diff --git a/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out index b87f14151d6..a6949a6bf35 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13296701600135843700 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out index 975886aed20..4629edd55a3 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 17585299807246447056 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out b/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out index 641bec08bc7..d19ddd6e0c7 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 8680144405152974406 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out index 184e08c2960..e7fdfdddc5d 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 12504509484220655469 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : F=fan ({posHull(matrix{{1,2,3},{0,2,0}}),posHull(matrix{{0},{1}})}); diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out index 41e1e69b9cd..0eaf11f06df 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 12504509484145185436 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : F=fan ({posHull(matrix{{1,2,3},{0,2,0}}),posHull(matrix{{0},{1}})}); diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out b/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out index 262acddeb20..481baae3dad 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13297736138753818122 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out index 5124671e53f..19c2df8cadd 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 12046403087054853784 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out index 3de7abd2644..ebad362acc3 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 10985225757709795911 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w] diff --git a/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out b/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out index 8db39d43737..e295cf0a53b 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out +++ b/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13298095477002488442 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out index 25299371ee9..b7ca338c4be 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 10985225756794301924 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w] diff --git a/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out b/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out index 526d97af406..b0dec271486 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out +++ b/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 5701661967162503759 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out b/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out index cc1e5fdbe1f..31ee191265e 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out +++ b/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 12667402382605992779 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : F = fan {posHull matrix {{1},{0},{0}}, posHull matrix {{0},{1},{0}}, posHull matrix {{0},{0},{1}}, posHull matrix {{-1},{-1},{-1}}} diff --git a/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out b/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out index 4a7366f55c0..f5f0c75049d 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out +++ b/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 13219964060630609236 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x_1,x_2,x_3,x_4] diff --git a/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out b/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out index d1994542f4a..b885a20581d 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out +++ b/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 3004202635849571771 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out b/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out index 7e918992ec4..454c100b039 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out +++ b/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out @@ -1,4 +1,5 @@ -- -*- M2-comint -*- hash: 12778844232558325682 +-- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=ZZ[x,y,z] diff --git a/M2/Macaulay2/system/supervisor.cpp b/M2/Macaulay2/system/supervisor.cpp index 6d8fb633f33..6bef8c2fe8e 100644 --- a/M2/Macaulay2/system/supervisor.cpp +++ b/M2/Macaulay2/system/supervisor.cpp @@ -417,7 +417,7 @@ void SupervisorThread::threadEntryPoint() { if(currentAllowedThreads<=m_LocalThreadId) { - using namespace std::chrono_literals; + using namespace std::literals::chrono_literals; std::this_thread::sleep_for(1s); continue; } From 9efb6a2b037916cf0b3cbe9ed5b3a5c0d957a467 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 16:39:33 -0400 Subject: [PATCH 036/691] Revert some accidental changes --- .../Bertini/examples/___B_sq__Constants.out | 1 - .../packages/Bertini/examples/___Bertini.out | 1 - .../___Bertini_spinput_spconfiguration.out | 1 - ...e_spdeclarations_co_sprandom_spnumbers.out | 1 - .../Bertini/examples/___Is__Projective.out | 1 - .../examples/___Number__To__B_sq__String.out | 1 - .../Bertini/examples/___Variable_spgroups.out | 1 - .../_bertini__Component__Member__Test.out | 1 - .../_bertini__Parameter__Homotopy.out | 1 - .../examples/_bertini__Pos__Dim__Solve.out | 1 - .../examples/_bertini__Refine__Sols.out | 3 +- .../Bertini/examples/_bertini__Sample.out | 1 - .../examples/_bertini__Track__Homotopy.out | 1 - .../examples/_bertini__User__Homotopy.out | 1 - .../examples/_bertini__Zero__Dim__Solve.out | 1 - .../examples/_import__Incidence__Matrix.out | 1 - .../examples/_import__Main__Data__File.out | 1 - .../examples/_import__Parameter__File.out | 1 - .../examples/_import__Solutions__File.out | 1 - .../examples/_make__B_sq__Input__File.out | 3 -- .../Bertini/examples/_make__B_sq__Section.out | 29 +++++++++---------- .../Bertini/examples/_make__B_sq__Slice.out | 1 - .../Bertini/examples/_move__B_sq__File.out | 5 ---- .../Bertini/examples/_radical__List.out | 1 - .../packages/Bertini/examples/_sub__Point.out | 1 - .../Bertini/examples/_value__B__M2.out | 1 - .../Bertini/examples/_write__Start__File.out | 1 - .../packages/Python/examples/___Python.out | 5 +--- .../Python/examples/___Python__Object.out | 1 - .../Python/examples/___Python__Object_sp~.out | 1 - .../examples/_abs_lp__Python__Object_rp.out | 1 - .../examples/_add__Py__To__M2__Function.out | 5 +--- .../_ceiling_lp__Python__Object_rp.out | 1 - .../examples/_floor_lp__Python__Object_rp.out | 1 - .../packages/Python/examples/_getattr.out | 1 - .../packages/Python/examples/_getitem.out | 1 - .../packages/Python/examples/_hasattr.out | 1 - .../examples/_help_lp__Python__Object_rp.out | 5 +--- .../packages/Python/examples/_import.out | 5 +--- ...Member_lp__Thing_cm__Python__Object_rp.out | 1 - .../_iterator_lp__Python__Object_rp.out | 3 +- .../_length_lp__Python__Object_rp.out | 1 - .../examples/_next_lp__Python__Object_rp.out | 3 +- .../Python/examples/_object__Type.out | 1 - .../Python/examples/_python__Value.out | 1 - ...__Python__Object_cm__Python__Object_rp.out | 1 - .../_round_lp__Z__Z_cm__Python__Object_rp.out | 1 - .../Python/examples/_run__Simple__String.out | 1 - .../packages/Python/examples/_setattr.out | 5 +--- .../packages/Python/examples/_setitem.out | 1 - .../Python/examples/_to__Function.out | 5 +--- .../packages/Python/examples/_to__Python.out | 3 +- .../_truncate_lp__Python__Object_rp.out | 1 - .../examples/_value_lp__Python__Object_rp.out | 1 - .../Tropical/examples/___Bergman__Fan.out | 1 - .../examples/___Compute__Multiplicities.out | 1 - .../Tropical/examples/___Is__Homogeneous.out | 1 - .../packages/Tropical/examples/___Prime.out | 1 - .../Tropical/examples/___Symmetry.out | 1 - .../_amb__Dim_lp__Tropical__Cycle_rp.out | 1 - ..._cones_lp__Z__Z_cm__Tropical__Cycle_rp.out | 1 - .../examples/_dim_lp__Tropical__Cycle_rp.out | 1 - .../_f__Vector_lp__Tropical__Cycle_rp.out | 1 - .../examples/_fan_lp__Tropical__Cycle_rp.out | 1 - .../Tropical/examples/_is__Balanced.out | 1 - .../_is__Pure_lp__Tropical__Cycle_rp.out | 1 - ..._is__Simplicial_lp__Tropical__Cycle_rp.out | 1 - .../examples/_is__Tropical__Basis.out | 1 - ...ineality__Space_lp__Tropical__Cycle_rp.out | 1 - .../_max__Cones_lp__Tropical__Cycle_rp.out | 1 - .../Tropical/examples/_multiplicities.out | 1 - .../examples/_rays_lp__Tropical__Cycle_rp.out | 1 - .../examples/_stable__Intersection.out | 1 - .../Tropical/examples/_tropical__Cycle.out | 1 - .../examples/_tropical__Prevariety.out | 1 - .../Tropical/examples/_tropical__Variety.out | 1 - .../examples/_visualize__Hypersurface.out | 1 - M2/Macaulay2/system/supervisor.cpp | 2 +- 78 files changed, 25 insertions(+), 120 deletions(-) diff --git a/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out b/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out index 421392d4336..601df0f3c74 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out +++ b/M2/Macaulay2/packages/Bertini/examples/___B_sq__Constants.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1729711110531181719 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[z,a,b,c] diff --git a/M2/Macaulay2/packages/Bertini/examples/___Bertini.out b/M2/Macaulay2/packages/Bertini/examples/___Bertini.out index 1eac0558516..1141daac55f 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Bertini.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Bertini.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 3052769501440199080 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : needsPackage("Bertini", Configuration=>{"BERTINIexecutable"=>"/folder/subfolder/bertini"}) diff --git a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out index 5635f15439e..73929b902b0 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spconfiguration.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 5125700499117494129 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : CC[x,y]; F = {x^2-1,y^2-1}; diff --git a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out index 6b5e91a1ec5..68be48eb23a 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Bertini_spinput_spfile_spdeclarations_co_sprandom_spnumbers.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1181429681429750825 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[x,y,c1,c2] diff --git a/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out b/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out index 8404ac57c90..876b410d16f 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Is__Projective.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 15049240509654635639 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y,z]; diff --git a/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out b/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out index 022765c0587..6b3c6f49585 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Number__To__B_sq__String.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 5537054878747415763 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : NumberToB'String(2+5*ii) diff --git a/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out b/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out index 410d5c5df4b..cf60bd7a813 100644 --- a/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out +++ b/M2/Macaulay2/packages/Bertini/examples/___Variable_spgroups.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 18358394276875387580 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out index 4d324ed231b..5485817e1b9 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Component__Member__Test.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 16509404147300812608 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y,z]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out index 3df7c3ea379..592d6a4ba6c 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Parameter__Homotopy.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 2393720217502712319 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=CC[u1,u2,u3,x,y]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out index a481e8e6602..5b12eea467e 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Pos__Dim__Solve.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1503209601929851452 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out index e9c9a81ba30..194ae745619 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Refine__Sols.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 12443373955151764050 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y]; @@ -30,7 +29,7 @@ o5 : List i6 : coords_0 o6 = 1.4142135623730950488016887242096980785696718753769480731766797379907324 - 784621070388503875343276415727 + 78462107038850387534327641573 o6 : CC (of precision 333) diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out index d3491acfd6c..eecb86a6c3d 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Sample.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 2266058223581986768 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y,z] diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out index 84dd0e00b29..3b9c9089da6 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Track__Homotopy.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 4423001283312120928 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,t]; -- include the path variable in the ring diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out index cb65ad584ec..7f9c0301432 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__User__Homotopy.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1497993508773629302 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,a,t]; -- include the path variable in the ring diff --git a/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out b/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out index a0987393425..629aebf97b9 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out +++ b/M2/Macaulay2/packages/Bertini/examples/_bertini__Zero__Dim__Solve.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 6114446290252515939 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R = CC[x,y]; diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out b/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out index 5ef22fe4a5c..17c7539f47f 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Incidence__Matrix.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 17285782284337978894 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : makeB'InputFile(storeBM2Files, BertiniInputConfiguration=>{{TrackType,1}}, AffVariableGroup=>{x,y,z}, B'Polynomials=>{"z*((x+y+z)^3-1)","z*(y^2-3+z)"} ); diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out b/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out index eab88f540ce..f2173651079 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Main__Data__File.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13875702623998209363 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : makeB'InputFile(storeBM2Files, AffVariableGroup=>{x,y,z}, diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out b/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out index e7f804c4f7e..77345daba15 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Parameter__File.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1729805987615673498 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : writeParameterFile(storeBM2Files,{1,2},NameParameterFile=>"final_parameters"); diff --git a/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out b/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out index a47606fa1cf..b2a48cf5120 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_import__Solutions__File.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 7920468485111445591 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[x,y] diff --git a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out index c3071671a56..d7ba92543c0 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Input__File.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 713363350566806638 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=QQ[x1,x2,y] @@ -11,8 +10,6 @@ i2 : theDir = temporaryFileName(); i3 : makeDirectory theDir -o3 = /var/folders/f4/54tv_3013gbcdz5jqk69txhm0000gn/T/M2-83605-0/1 - i4 : makeB'InputFile(theDir, BertiniInputConfiguration=>{MPType=>2}, AffVariableGroup=>{{x1,x2},{y}}, diff --git a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out index d2235b9cc5c..0202c1ab8ad 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out +++ b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Section.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 4847554454883991115 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : s=makeB'Section({x,y,z}) @@ -45,9 +44,9 @@ o7 : B'Section i8 : sRational#B'NumberCoefficients - 7 7 7 -o8 = {--, --, -} - 10 10 3 + 7 1 7 +o8 = {--, -, --} + 10 2 10 o8 : List @@ -77,11 +76,11 @@ o12 : B'Section i13 : r= affineContainingPoint#B'SectionString -o13 = (.849539-.106572*ii)*(x-(1)*(1))+(.307137+.911684*ii)*(y-(1)*(2 - ))+(.0156326-.285432*ii)*(z-(1)*(3)) +o13 = (1.18921+.849539*ii)*(x-(1)*(1))+(-.542371+.307137*ii)*(y-(1)*(2))+( + 1.36945+.015633*ii)*(z-(1)*(3)) i14 : print r -(.849539-.106572*ii)*(x-(1)*(1))+(.307137+.911684*ii)*(y-(1)*(2))+(.0156326-.285432*ii)*(z-(1)*(3)) +(1.18921+.849539*ii)*(x-(1)*(1))+(-.542371+.307137*ii)*(y-(1)*(2))+(1.36945+.015633*ii)*(z-(1)*(3)) i15 : rHomogeSection= makeB'Section({x,y,z},ContainsPoint=>P,B'Homogenization=>"x+y+z") @@ -91,20 +90,20 @@ o15 : B'Section i16 : peek rHomogeSection -o16 = B'Section{B'Homogenization => x+y+z - B'NumberCoefficients => {-.175945+.411267*ii, -.97539 - B'SectionString => (-.175945+.411267*ii)*(x-(x+y+z)*( +o16 = B'Section{B'Homogenization => x+y+z + B'NumberCoefficients => {.534614-.175945*ii, .426704 + B'SectionString => (.534614-.175945*ii)*(x-(x+y+z)*( ----------------------------------------------------------------------- - +.132106*ii, .041601+.946255*ii} - 1))+(-.97539+.132106*ii)*(y-(x+y+z)*(2))+(.041601+.946255*ii)*(z-(x+y+z + -.97539*ii, -.478803+.0416008*ii} + 1))+(.426704-.97539*ii)*(y-(x+y+z)*(2))+(-.478803+.0416008*ii)*(z-(x+y+ ----------------------------------------------------------------------- - } + } - )*(3)) + z)*(3)) i17 : print rHomogeSection#B'SectionString -(-.175945+.411267*ii)*(x-(x+y+z)*(1))+(-.97539+.132106*ii)*(y-(x+y+z)*(2))+(.041601+.946255*ii)*(z-(x+y+z)*(3)) +(.534614-.175945*ii)*(x-(x+y+z)*(1))+(.426704-.97539*ii)*(y-(x+y+z)*(2))+(-.478803+.0416008*ii)*(z-(x+y+z)*(3)) i18 : f="y^3-x*y+1" diff --git a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out index 55c0b6a9966..689cf889ed4 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out +++ b/M2/Macaulay2/packages/Bertini/examples/_make__B_sq__Slice.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 3879697425701981702 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : sliceType={1,1} diff --git a/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out b/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out index 2c2db4ffe54..f2b61b51633 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_move__B_sq__File.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 12643950388143032379 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : writeParameterFile(storeBM2Files,{2,3,5,7}); @@ -31,8 +30,6 @@ i9 : Dir1 = temporaryFileName(); i10 : makeDirectory Dir1 -o10 = /var/folders/f4/54tv_3013gbcdz5jqk69txhm0000gn/T/M2-83587-0/1 - i11 : writeParameterFile(storeBM2Files,{2,3,5,7}); i12 : moveB'File(storeBM2Files,"final_parameters","start_parameters",MoveToDirectory=>Dir1) @@ -43,8 +40,6 @@ o13 = true i14 : makeDirectory (storeBM2Files|"/Dir2") -o14 = /var/folders/f4/54tv_3013gbcdz5jqk69txhm0000gn/T/M2-83587-0/0/Dir2 - i15 : writeParameterFile(storeBM2Files,{2,3,5,7}); i16 : moveB'File(storeBM2Files,"final_parameters","start_parameters",SubFolder=>"Dir2") diff --git a/M2/Macaulay2/packages/Bertini/examples/_radical__List.out b/M2/Macaulay2/packages/Bertini/examples/_radical__List.out index 3f094f364a8..e8b8d6e4470 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_radical__List.out +++ b/M2/Macaulay2/packages/Bertini/examples/_radical__List.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1437360351269936102 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : radicalList({2.000,1.999}) diff --git a/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out b/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out index 4d8ef2bb9ed..5d4aff9746f 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out +++ b/M2/Macaulay2/packages/Bertini/examples/_sub__Point.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13034284525720479189 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=CC[x,y,z] diff --git a/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out b/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out index dfb1804d932..84a2a7cea0c 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out +++ b/M2/Macaulay2/packages/Bertini/examples/_value__B__M2.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 6438836643559783046 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : valueBM2("1.22e-2 4e-5") diff --git a/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out b/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out index 957d0bcc47e..6240e24b3c2 100644 --- a/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out +++ b/M2/Macaulay2/packages/Bertini/examples/_write__Start__File.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1731127908360029171 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : coordinatesOfTwoPnts={{1,0},{3,4}} diff --git a/M2/Macaulay2/packages/Python/examples/___Python.out b/M2/Macaulay2/packages/Python/examples/___Python.out index 95811f2236b..96687385971 100644 --- a/M2/Macaulay2/packages/Python/examples/___Python.out +++ b/M2/Macaulay2/packages/Python/examples/___Python.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13520444142344506266 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : toPython {1, 2/3, "foo", (1, 2, 3), hashTable {"foo" => "bar"}} @@ -15,9 +14,7 @@ o2 : List i3 : math = import "math" -o3 = +o3 = o3 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/___Python__Object.out b/M2/Macaulay2/packages/Python/examples/___Python__Object.out index e7a9034ce36..b9f51dbe50d 100644 --- a/M2/Macaulay2/packages/Python/examples/___Python__Object.out +++ b/M2/Macaulay2/packages/Python/examples/___Python__Object.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 10348206706567645224 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "5" diff --git a/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out b/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out index 27e49dec9fc..12690f729c1 100644 --- a/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out +++ b/M2/Macaulay2/packages/Python/examples/___Python__Object_sp~.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1330555084609 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : (toPython 5)~ diff --git a/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out index 2fcbc991b1a..99881c41376 100644 --- a/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_abs_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1332381382166 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : abs toPython(-12) diff --git a/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out b/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out index 239ff58e72f..67a0c92cdbf 100644 --- a/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out +++ b/M2/Macaulay2/packages/Python/examples/_add__Py__To__M2__Function.out @@ -1,11 +1,8 @@ -- -*- M2-comint -*- hash: 7688935989390791107 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : fractions = import "fractions" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out index d54834fd69c..6806add35b5 100644 --- a/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_ceiling_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1731866675422889330 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : ceiling toPython 5.8 diff --git a/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out index deff550f7ea..abe6a0d369b 100644 --- a/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_floor_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1730869845958507596 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : floor toPython 5.8 diff --git a/M2/Macaulay2/packages/Python/examples/_getattr.out b/M2/Macaulay2/packages/Python/examples/_getattr.out index 1a515f00edc..e1d390469a9 100644 --- a/M2/Macaulay2/packages/Python/examples/_getattr.out +++ b/M2/Macaulay2/packages/Python/examples/_getattr.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 10112320777315990793 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : foo = pythonValue "'Hello, world!'" diff --git a/M2/Macaulay2/packages/Python/examples/_getitem.out b/M2/Macaulay2/packages/Python/examples/_getitem.out index a387d83b521..e9d6e664c9a 100644 --- a/M2/Macaulay2/packages/Python/examples/_getitem.out +++ b/M2/Macaulay2/packages/Python/examples/_getitem.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 11784266446829141384 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "[1,2,3,4]" diff --git a/M2/Macaulay2/packages/Python/examples/_hasattr.out b/M2/Macaulay2/packages/Python/examples/_hasattr.out index 2e44ed6cb29..e82ca17d5d6 100644 --- a/M2/Macaulay2/packages/Python/examples/_hasattr.out +++ b/M2/Macaulay2/packages/Python/examples/_hasattr.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 10109958694099330308 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : foo = pythonValue "'Hello, world!'" diff --git a/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out index 6da66001b28..e5ab60af50a 100644 --- a/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_help_lp__Python__Object_rp.out @@ -1,11 +1,8 @@ -- -*- M2-comint -*- hash: 234211404776825840 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_import.out b/M2/Macaulay2/packages/Python/examples/_import.out index 82ab768554b..7c3097a1612 100644 --- a/M2/Macaulay2/packages/Python/examples/_import.out +++ b/M2/Macaulay2/packages/Python/examples/_import.out @@ -1,11 +1,8 @@ -- -*- M2-comint -*- hash: 235137481443939015 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out index 494bc482e9f..3fc022e5ecd 100644 --- a/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_is__Member_lp__Thing_cm__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 16061367338054950412 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : isMember(toPython 3, toPython {1, 2, 3}) diff --git a/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out index f1d9b6d15ef..f4c53a33553 100644 --- a/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_iterator_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1731738896645393605 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "range(3)" @@ -9,7 +8,7 @@ o1 : PythonObject of class range i2 : i = iterator x -o2 = +o2 = o2 : PythonObject of class range_iterator diff --git a/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out index d040e1b826f..6ae31ddadc5 100644 --- a/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_length_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1730448222125773796 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : length pythonValue "'Hello, world!'" diff --git a/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out index 19e1bff922e..31d535b12ae 100644 --- a/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_next_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 14455760057870246997 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "range(3)" @@ -9,7 +8,7 @@ o1 : PythonObject of class range i2 : i = iterator x -o2 = +o2 = o2 : PythonObject of class range_iterator diff --git a/M2/Macaulay2/packages/Python/examples/_object__Type.out b/M2/Macaulay2/packages/Python/examples/_object__Type.out index e6ee74d04de..85e009cf51b 100644 --- a/M2/Macaulay2/packages/Python/examples/_object__Type.out +++ b/M2/Macaulay2/packages/Python/examples/_object__Type.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1729585357366275057 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : objectType pythonValue "2" diff --git a/M2/Macaulay2/packages/Python/examples/_python__Value.out b/M2/Macaulay2/packages/Python/examples/_python__Value.out index 3328d4204fc..645dcdc3b60 100644 --- a/M2/Macaulay2/packages/Python/examples/_python__Value.out +++ b/M2/Macaulay2/packages/Python/examples/_python__Value.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13262495016035396081 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : pythonValue "2 + 2" diff --git a/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out index fb3d5527da0..4ecb6d440ac 100644 --- a/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_quotient__Remainder_lp__Python__Object_cm__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 17298892581603033753 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : quotientRemainder(toPython 37, toPython 5) diff --git a/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out index 4dbc0347647..e47ddd42dd3 100644 --- a/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_round_lp__Z__Z_cm__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 3509501310639924813 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = (import "math")@@pi diff --git a/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out b/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out index 55c64c49f96..6461ad3b611 100644 --- a/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out +++ b/M2/Macaulay2/packages/Python/examples/_run__Simple__String.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1331529053663 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : runSimpleString "print('Hello, world!')" diff --git a/M2/Macaulay2/packages/Python/examples/_setattr.out b/M2/Macaulay2/packages/Python/examples/_setattr.out index fb98ab68df3..82add55a59a 100644 --- a/M2/Macaulay2/packages/Python/examples/_setattr.out +++ b/M2/Macaulay2/packages/Python/examples/_setattr.out @@ -1,11 +1,8 @@ -- -*- M2-comint -*- hash: 10814637973204880769 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_setitem.out b/M2/Macaulay2/packages/Python/examples/_setitem.out index 11914d605df..c12b90ef8e7 100644 --- a/M2/Macaulay2/packages/Python/examples/_setitem.out +++ b/M2/Macaulay2/packages/Python/examples/_setitem.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 789145051544179922 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : x = pythonValue "[1,2,3,4]" diff --git a/M2/Macaulay2/packages/Python/examples/_to__Function.out b/M2/Macaulay2/packages/Python/examples/_to__Function.out index 3a219eb7909..01ef78a6d4e 100644 --- a/M2/Macaulay2/packages/Python/examples/_to__Function.out +++ b/M2/Macaulay2/packages/Python/examples/_to__Function.out @@ -1,11 +1,8 @@ -- -*- M2-comint -*- hash: 12972340179139801570 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : math = import "math" -o1 = +o1 = o1 : PythonObject of class module diff --git a/M2/Macaulay2/packages/Python/examples/_to__Python.out b/M2/Macaulay2/packages/Python/examples/_to__Python.out index 3014bb68f51..01efef5d7f6 100644 --- a/M2/Macaulay2/packages/Python/examples/_to__Python.out +++ b/M2/Macaulay2/packages/Python/examples/_to__Python.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 18231915748995903169 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : toPython 2 @@ -77,7 +76,7 @@ o12 : FunctionClosure i13 : pysqrt = toPython m2sqrt -o13 = +o13 = o13 : PythonObject of class builtin_function_or_method diff --git a/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out index 57a40b28ca2..cbeb0befa59 100644 --- a/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_truncate_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 1731477845529974376 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : truncate toPython 5.8 diff --git a/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out b/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out index e83a6f78741..eb7a8e9a172 100644 --- a/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out +++ b/M2/Macaulay2/packages/Python/examples/_value_lp__Python__Object_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 5798072175071737422 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : value pythonValue "[1, 3.14159, 'foo', (1,2,3), {'foo':'bar'}]" diff --git a/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out b/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out index cc896899286..44ac42c5a33 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Bergman__Fan.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 10480927928276198368 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : M=uniformMatroid(2,3); diff --git a/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out b/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out index e445529cf25..7d1709c9f9f 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Compute__Multiplicities.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 9403660397014940741 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out b/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out index f2a9f82a40d..02f2f614f32 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Is__Homogeneous.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 2389386350486720709 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y]; diff --git a/M2/Macaulay2/packages/Tropical/examples/___Prime.out b/M2/Macaulay2/packages/Tropical/examples/___Prime.out index 239e6c777f4..588a262722f 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Prime.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Prime.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 9003283797531820781 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out b/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out index 3ee31ee7729..6d3b5a33753 100644 --- a/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out +++ b/M2/Macaulay2/packages/Tropical/examples/___Symmetry.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 7679271322316421514 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x_0,x_1,x_2]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out index 2220a3f10fd..6409ec3f6cc 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_amb__Dim_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13297202816609704649 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out index 7af6685e894..cc6d4064aed 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_cones_lp__Z__Z_cm__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 18313553343135756437 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w,t] diff --git a/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out index 55f75aae450..afb549e507f 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_dim_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 189144728989167395 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w] diff --git a/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out index a6949a6bf35..b87f14151d6 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_f__Vector_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13296701600135843700 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out index 4629edd55a3..975886aed20 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_fan_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 17585299807246447056 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out b/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out index d19ddd6e0c7..641bec08bc7 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Balanced.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 8680144405152974406 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out index e7fdfdddc5d..184e08c2960 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Pure_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 12504509484220655469 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : F=fan ({posHull(matrix{{1,2,3},{0,2,0}}),posHull(matrix{{0},{1}})}); diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out index 0eaf11f06df..41e1e69b9cd 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Simplicial_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 12504509484145185436 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : F=fan ({posHull(matrix{{1,2,3},{0,2,0}}),posHull(matrix{{0},{1}})}); diff --git a/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out b/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out index 481baae3dad..262acddeb20 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out +++ b/M2/Macaulay2/packages/Tropical/examples/_is__Tropical__Basis.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13297736138753818122 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out index 19c2df8cadd..5124671e53f 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_lineality__Space_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 12046403087054853784 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out index ebad362acc3..3de7abd2644 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_max__Cones_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 10985225757709795911 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w] diff --git a/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out b/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out index e295cf0a53b..8db39d43737 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out +++ b/M2/Macaulay2/packages/Tropical/examples/_multiplicities.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13298095477002488442 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z] diff --git a/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out b/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out index b7ca338c4be..25299371ee9 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out +++ b/M2/Macaulay2/packages/Tropical/examples/_rays_lp__Tropical__Cycle_rp.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 10985225756794301924 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z,w] diff --git a/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out b/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out index b0dec271486..526d97af406 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out +++ b/M2/Macaulay2/packages/Tropical/examples/_stable__Intersection.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 5701661967162503759 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y,z]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out b/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out index 31ee191265e..cc1e5fdbe1f 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out +++ b/M2/Macaulay2/packages/Tropical/examples/_tropical__Cycle.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 12667402382605992779 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : F = fan {posHull matrix {{1},{0},{0}}, posHull matrix {{0},{1},{0}}, posHull matrix {{0},{0},{1}}, posHull matrix {{-1},{-1},{-1}}} diff --git a/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out b/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out index f5f0c75049d..4a7366f55c0 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out +++ b/M2/Macaulay2/packages/Tropical/examples/_tropical__Prevariety.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 13219964060630609236 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x_1,x_2,x_3,x_4] diff --git a/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out b/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out index b885a20581d..d1994542f4a 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out +++ b/M2/Macaulay2/packages/Tropical/examples/_tropical__Variety.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 3004202635849571771 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : QQ[x,y]; diff --git a/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out b/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out index 454c100b039..7e918992ec4 100644 --- a/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out +++ b/M2/Macaulay2/packages/Tropical/examples/_visualize__Hypersurface.out @@ -1,5 +1,4 @@ -- -*- M2-comint -*- hash: 12778844232558325682 --- warning: source code version: version-1.14.0.1-10750-gb7aabc663 != executable version 1.25.06 i1 : R=ZZ[x,y,z] diff --git a/M2/Macaulay2/system/supervisor.cpp b/M2/Macaulay2/system/supervisor.cpp index 6bef8c2fe8e..6d8fb633f33 100644 --- a/M2/Macaulay2/system/supervisor.cpp +++ b/M2/Macaulay2/system/supervisor.cpp @@ -417,7 +417,7 @@ void SupervisorThread::threadEntryPoint() { if(currentAllowedThreads<=m_LocalThreadId) { - using namespace std::literals::chrono_literals; + using namespace std::chrono_literals; std::this_thread::sleep_for(1s); continue; } From ea69113bb5a03dd689b6972c57a39f69b57aebb5 Mon Sep 17 00:00:00 2001 From: klee669 Date: Tue, 1 Jul 2025 15:42:37 -0500 Subject: [PATCH 037/691] changes in reals --- M2/Macaulay2/m2/reals.m2 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 8892c0cfa49..b314e81fa86 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -17,6 +17,7 @@ CCi.synonym = "complex interval" RR.texMath = ///{\mathbb R}/// RRi.texMath = ///{\square\mathbb R}/// CC.texMath = ///{\mathbb C}/// +CCi.texMath = ///{\square\mathbb C}/// Number.synonym = "number" InexactFieldFamily.synonym = "inexact field family" InexactNumber.synonym = "inexact number" @@ -52,11 +53,14 @@ CCi_* = CCi' = new Type of InexactNumber' RR'.texMath = ///{\mathbb R}_*/// RRi'.texMath = ///{\square\mathbb R}_*/// CC'.texMath = ///{\mathbb C}_*/// +CCi'.texMath = ///{\square\mathbb C}_*/// setAttribute(CC',PrintNet,"CC" | "*"^-1) +setAttribute(CCi',PrintNet,"CCi" | "*"^-1) setAttribute(RR',PrintNet,"RR" | "*"^-1) setAttribute(RRi',PrintNet,"RRi" | "*"^-1) setAttribute(CC',PrintNames,"CC_*") +setAttribute(CCi',PrintNames,"CCi_*") setAttribute(RR',PrintNames,"RR_*") setAttribute(RRi',PrintNames,"RRi_*") setAttribute(InexactNumber',PrintNet,"InexactNumber" | "*"^-1) @@ -65,6 +69,7 @@ protect back RR'.back = RR RRi'.back = RRi CC'.back = CC +CCi'.back = CCi new RealField of Nothing' from ZZ := memoize ( (RealField,Nothing',prec) -> newClass(RealField,Nothing', hashTable { @@ -99,11 +104,13 @@ default InexactFieldFamily := R -> R_defaultPrecision diameter' = diameter diameter = method() diameter RRi := diameter' +diameter CCi := diameter' -- lift and promote between real or complex rings promote(RawRingElement,RR') := (x,R) -> new RR from x promote(RawRingElement,RRi') := (x,R) -> new RRi from x promote(RawRingElement,CC') := (x,R) -> new CC from x +promote(RawRingElement,CCi') := (x,R) -> new CCi from x promote(RawRingElement,Number) := (x,R) -> new R from x promote(RawRingElement,RingElement) := (x,R) -> new R from x promote(Number,InexactNumber) := (x,RR) -> promote(x,default RR) From 19ed5128b6e423a2c760798e23e388861c6bf31a Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 16:47:32 -0400 Subject: [PATCH 038/691] RRb at top level! --- M2/Macaulay2/d/actors4.d | 7 +++++++ M2/Macaulay2/d/ballarith.d | 12 ++++++++++-- M2/Macaulay2/d/basic.d | 1 + M2/Macaulay2/d/classes.dd | 2 ++ M2/Macaulay2/d/equality.dd | 1 + M2/Macaulay2/d/expr.d | 1 + M2/Macaulay2/d/parse.d | 2 ++ M2/Macaulay2/d/util.d | 1 + M2/Macaulay2/m2/exports.m2 | 2 ++ 9 files changed, 27 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index c3ef1ac92c8..509d468b39a 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -991,6 +991,7 @@ tostringfun(e:Expr):Expr := ( is NetFile do toExpr("<>") is x:RRcell do toExpr(tostringRR(x.v)) is x:RRicell do toExpr(tostringRRi(x.v)) + is x:RRbcell do toExpr("<>") is z:CCcell do toExpr(tostringCC(z.v)) is x:CCicell do toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) is Error do toExpr("<>") @@ -1408,6 +1409,12 @@ toRRi(e:Expr):Expr := ( else WrongArg(1,"a pair or triple of integral, rational, or real numbers")); setupfun("toRRi",toRRi); +toRRb(e:Expr):Expr := ( + when e + is x:RRcell do toExpr(toRRb(x.v)) + else WrongArg("TODO")); +setupfun("toRRb", toRRb); + toCCi(e:Expr):Expr := ( when e is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 2891c8a4678..49f01fb5f6f 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -32,19 +32,27 @@ header " -- RRb -- ------------ -RRb := Pointer "arb_ptr"; +export RRb := Pointer "arb_ptr"; init(x:RRb) ::= ( Ccode(void, "arb_init(", x, ")"); x); newRRb():RRb := init(GCmalloc(RRb)); clear(x:RRb) ::= Ccode(void, "arb_clear(", x, ")"); +export RRbcell := {+v:RRb, prec:ulong}; + +export toRRbcell(x:RRb):RRbcell := ( + y := RRbcell(x, ulong(100)); + Ccode(void, "GC_REGISTER_FINALIZER(", y, + ", (GC_finalization_proc)arb_clear, 0, 0, 0)"); + y); + -- clear after using toRRb(x:RR, y:RR, prec:ulong):RRb := ( z := newRRb(); Ccode(void, "arb_set_interval_mpfr(", z, ", ", x, ", ", y, ", ", prec, ")"); z); -toRRb(x:RR):RRb := toRRb(x, x, precision(x)); +export toRRb(x:RR):RRb := toRRb(x, x, precision(x)); toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); toRR(x:RRb, prec:ulong):RR := ( diff --git a/M2/Macaulay2/d/basic.d b/M2/Macaulay2/d/basic.d index cf2a91bec97..fba0482b307 100644 --- a/M2/Macaulay2/d/basic.d +++ b/M2/Macaulay2/d/basic.d @@ -24,6 +24,7 @@ export hash(e:Expr):hash_t := ( is x:QQcell do hash(x.v) is x:RRcell do hash(x.v) is x:RRicell do hash(x.v) + is x:RRbcell do hash_t(6) is x:CCcell do hash(x.v) is x:CCicell do hash(x.v.re + x.v.im) is x:Sequence do ( diff --git a/M2/Macaulay2/d/classes.dd b/M2/Macaulay2/d/classes.dd index 2a361177b0d..5c58c06326c 100644 --- a/M2/Macaulay2/d/classes.dd +++ b/M2/Macaulay2/d/classes.dd @@ -22,6 +22,7 @@ setupconst("QQ",Expr(QQClass)); setupconst("RingFamily",Expr(ringFamilyClass)); setupconst("InexactFieldFamily",Expr(inexactNumberTypeClass)); setupconst("RRi",Expr(RRiClass)); +setupconst("RRb",Expr(RRbClass)); setupconst("RR",Expr(RRClass)); setupconst("CC",Expr(CCClass)); setupconst("CCi",Expr(CCiClass)); @@ -148,6 +149,7 @@ export Class(e:Expr):HashTable := ( is SymbolBody do symbolBodyClass is RRicell do RRiClass is RRcell do RRClass + is RRbcell do RRbClass is CCcell do CCClass is CCicell do CCiClass is RawComputationCell do rawComputationClass diff --git a/M2/Macaulay2/d/equality.dd b/M2/Macaulay2/d/equality.dd index c50413536a7..f3b0d449384 100644 --- a/M2/Macaulay2/d/equality.dd +++ b/M2/Macaulay2/d/equality.dd @@ -148,6 +148,7 @@ export equal(lhs:Expr,rhs:Expr):Expr := ( if strictequality(x.v,y.v) then True else False ) else False) -- End added for MPFI + is x:RRbcell do False is x:CCcell do ( when rhs is y:CCcell do ( diff --git a/M2/Macaulay2/d/expr.d b/M2/Macaulay2/d/expr.d index 4313c97aaa2..08932894534 100644 --- a/M2/Macaulay2/d/expr.d +++ b/M2/Macaulay2/d/expr.d @@ -356,6 +356,7 @@ export pointerClass := newbasictype(); export atomicIntClass := newbasictype(); export pseudocodeClosureClass := newtypeof(pseudocodeClass); export CCiClass := newbignumbertype(); +export RRbClass := newbignumbertype(); -- all new types, dictionaries, and classes go just above this line, if possible, so hash codes don't change gratuitously! diff --git a/M2/Macaulay2/d/parse.d b/M2/Macaulay2/d/parse.d index f3c7e4ce3c6..d05d48ce4d2 100644 --- a/M2/Macaulay2/d/parse.d +++ b/M2/Macaulay2/d/parse.d @@ -22,6 +22,7 @@ extern void err_error(struct M2_string_struct*); use nets; use gmp; +use ballarith; use xml; use engine; use varnets; @@ -363,6 +364,7 @@ export Expr := ( CCicell or RRcell or RRicell or + RRbcell or Boolean or PseudocodeClosure or Pseudocode or diff --git a/M2/Macaulay2/d/util.d b/M2/Macaulay2/d/util.d index b121a0720ac..16a106ce4b2 100644 --- a/M2/Macaulay2/d/util.d +++ b/M2/Macaulay2/d/util.d @@ -222,6 +222,7 @@ export toExpr(x:ZZ):Expr := Expr(ZZcell(x)); export toExpr(x:QQ):Expr := Expr(QQcell(x)); export toExpr(x:RR):Expr := Expr(RRcell(x)); export toExpr(x:RRi):Expr := Expr(RRicell(x)); +export toExpr(x:RRb):Expr := Expr(toRRbcell(x)); export toExpr(x:CC):Expr := Expr(CCcell(x)); export toExpr(x:CCi):Expr := Expr(CCicell(x)); export toExpr(x:float):Expr := Expr(RRcell(toRR(x,ulong(24)))); diff --git a/M2/Macaulay2/m2/exports.m2 b/M2/Macaulay2/m2/exports.m2 index d5e4b041730..9dccb27554b 100644 --- a/M2/Macaulay2/m2/exports.m2 +++ b/M2/Macaulay2/m2/exports.m2 @@ -344,6 +344,7 @@ export { "QuotientRing", "RR", "RR'", + "RRb", "RRi", "RRi'", "RaiseError", @@ -1216,6 +1217,7 @@ export { "toList", "toLower", "toRR", + "toRRb", "toRRi", "toSequence", "toString", From 521e73b5b833775d979c8e2d344da75aede4f3a5 Mon Sep 17 00:00:00 2001 From: Andrew Tawfeek Date: Tue, 1 Jul 2025 15:50:49 -0500 Subject: [PATCH 039/691] toCCi defined for pairs of ZZ, QQ, RR, RRi --- M2/Macaulay2/d/actors4.d | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index fd0c14f1f00..f81d8cefb15 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1418,14 +1418,26 @@ toCCi(e:Expr):Expr := ( is s:Sequence do ( if length(s) > 3 then WrongNumArgs(1,3) else if length(s) == 2 then ( - when s.0 is x:RRcell do ( + when s.0 is x:ZZcell do ( + when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:QQcell do ( + when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRcell do ( when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - is x:RRicell do ( - when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRicell do ( + when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) From a7a2a0a8af0e1c37a1a6c86dea53c23642b9da15 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 15:50:53 -0500 Subject: [PATCH 040/691] RRi division implemented --- M2/Macaulay2/d/actors.d | 2 ++ M2/Macaulay2/d/gmp.d | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index e8b31c300b1..9b279036c81 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -491,6 +491,8 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( else toExpr(x.v / y.v)) is y:RRcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RR, RRi is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RRi, RRi + is y:CCcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, CC, CCi + is y:CCicell do (toExpr(toCCi(x.v) / y.v)) -- # typical value: symbol /, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:CCcell do ( diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index b46c5a97ec9..a443bf533ea 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -2347,8 +2347,14 @@ export inverse(z:CC):CC := ( export (x:CC) / (y:CC) : CC := x * inverse(y); +export (x:CCi) / (y:CC) : CCi := x * inverse(y); + +export (x:CCi) / (y:CCi) : CCi := toCCi((x.re*y.re+x.im*y.im)/(y.re*y.re+y.im*y.im),(x.im*y.re-x.re*y.im)/(y.re*y.re+y.im*y.im)); + export (x:RR) / (y:CC) : CC := x * inverse(y); +export (x:RRi) / (y:CC) : CCi := x * inverse(y); + export (x:ZZ) / (y:CC) : CC := x * inverse(y); export (x:int) / (y:CC) : CC := x * inverse(y); From 8384e3443b39e0cfb4fc3810a680cf0f7f5d44da Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 16:01:08 -0500 Subject: [PATCH 041/691] RRi division implemented --- M2/Macaulay2/d/actors.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 9b279036c81..9fa6dccc9d4 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -492,7 +492,7 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( is y:RRcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RR, RRi is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RRi, RRi is y:CCcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, CC, CCi - is y:CCicell do (toExpr(toCCi(x.v) / y.v)) -- # typical value: symbol /, RRi, CCi, CCi + is y:CCicell do (toExpr(toCCi((x.v*y.v.re)/(y.v.re^long(2)+y.v.im^long(2)),(-x.v*y.v.im)/(y.v.re^long(2)+y.v.im^long(2))))) -- # typical value: symbol /, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:CCcell do ( From 3240243005ec72933a80bbf1af26cfcdeb3f47a8 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 16:09:33 -0500 Subject: [PATCH 042/691] CC division implemented --- M2/Macaulay2/d/actors.d | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 9fa6dccc9d4..e72161e636e 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -509,8 +509,12 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( ) is y:RRcell do ( -- # typical value: symbol /, CC, RR, CC toExpr(x.v / y.v)) + is y:RRicell do ( -- # typical value: symbol /, CC, RRi, CCi + toExpr(toCCi(x.v.re/y.v,x.v.im/y.v))) is y:CCcell do ( -- # typical value: symbol /, CC, CC, CC toExpr(x.v / y.v)) + is y:CCicell do ( -- # typical value: symbol /, CC, CCi, CCi + toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)+y.v.im^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:RawMonomialCell do ( From d4fae3dd5b4de61e296c27cdfdf3b32fa5708b34 Mon Sep 17 00:00:00 2001 From: klee669 Date: Tue, 1 Jul 2025 16:24:41 -0500 Subject: [PATCH 043/691] promote for CCi' implemented --- M2/Macaulay2/m2/modules.m2 | 8 ++++---- M2/Macaulay2/m2/reals.m2 | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/m2/modules.m2 b/M2/Macaulay2/m2/modules.m2 index f915b630ab6..eb9d550e2b8 100644 --- a/M2/Macaulay2/m2/modules.m2 +++ b/M2/Macaulay2/m2/modules.m2 @@ -47,10 +47,10 @@ scan( {ZZ,QQ}, K -> ( )) scan(( - (ZZ, { QQ, RR', CC', RRi' }), - (QQ, { RR', CC', RRi' }), - (RR',{ RR', CC', RRi' }), - (CC', { CC' }) + (ZZ, { QQ, RR', CC', RRi', CCi' }), + (QQ, { RR', CC', RRi', CCi' }), + (RR',{ RR', CC', RRi', CCi' }), + (CC', { CC', CCi' }) ), (K,Ls) -> scan(Ls, L -> ( p := makepromoter 0; diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index b314e81fa86..fc998b0d62c 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -125,6 +125,12 @@ promote(ZZ,RRi') := promote(QQ,RRi') := promote(RR,RRi') := (i,K) -> toRRi(K.precision,i,i) promote(RRi,RRi') := (i,K) -> toRRi(K.precision,left(i),right(i)) +promote(ZZ,CCi') := +promote(QQ,CCi') := (i,K) -> toCCi(toRRi(i),interval 0) +promote(RR,CCi') := (i,K) -> toCCi(toRRi(precision i,i,i),toRRi(precision i, 0,0)) +promote(RRi,CCi') := (i,K) -> toCCi(i, interval 0) +promote(CC,CCi') := (i,K) -> toCCi(toRRi(precision i,realPart i,realPart i),toRRi(precision i, imaginaryPart i, imaginaryPart i)) +promote(CCi,CCi') := (i,K) -> toCCi(realPart i, imaginaryPart i) -- this should be fixed lift(Number,InexactNumber) := opts -> (x,RR) -> lift(x,default RR,opts) liftable(Number,InexactNumber) := (x,RR) -> liftable(x,default RR) @@ -166,6 +172,12 @@ ZZ _ ComplexField := QQ _ ComplexField := RR _ ComplexField := CC _ ComplexField := (x,R) -> toCC(R.precision,x) +ZZ _ ComplexIntervalField := +QQ _ ComplexIntervalField := +RR _ ComplexIntervalField := +RRi _ ComplexIntervalField := (x,R) -> toCCi(R.precision,x, interval 0) +CC _ ComplexIntervalField := (x,R) -> toCCi(R.precision,x) +CCi _ ComplexIntervalField := (x,R) -> toCCi(R.precision,x) lift(RR,QQ) := opts -> (r,QQ) -> ( if r == 0 then return 0/1; From e3658146bed79a2db40d4b73f7f34ec39fdf01c6 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 17:38:55 -0400 Subject: [PATCH 044/691] Fix finalization of RRb's --- M2/Macaulay2/d/ballarith.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 49f01fb5f6f..1387ff67431 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -44,7 +44,7 @@ export RRbcell := {+v:RRb, prec:ulong}; export toRRbcell(x:RRb):RRbcell := ( y := RRbcell(x, ulong(100)); Ccode(void, "GC_REGISTER_FINALIZER(", y, - ", (GC_finalization_proc)arb_clear, 0, 0, 0)"); + ", (GC_finalization_proc)arb_clear, ", y.v, ", 0, 0)"); y); -- clear after using From c60c0045c399aa14a7022002d61ec75803082aa7 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 17:43:29 -0400 Subject: [PATCH 045/691] Improve printing (and precision, kind of) of RRb's Right now, precision is always 100, which is stupid. TODO: what should the precision be? --- M2/Macaulay2/d/actors4.d | 3 ++- M2/Macaulay2/d/ballarith.d | 6 ++++-- M2/Macaulay2/d/gmp1.d | 5 +++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index f137037e4f2..7ae1d830e7a 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -991,7 +991,7 @@ tostringfun(e:Expr):Expr := ( is NetFile do toExpr("<>") is x:RRcell do toExpr(tostringRR(x.v)) is x:RRicell do toExpr(tostringRRi(x.v)) - is x:RRbcell do toExpr("<>") + is x:RRbcell do toExpr(tostringRRb(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) is x:CCicell do toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) is Error do toExpr("<>") @@ -1601,6 +1601,7 @@ precision(e:Expr):Expr := ( when e is x:RRcell do toExpr(precision(x.v)) is x:RRicell do toExpr(precision(x.v)) + is x:RRbcell do toExpr(precision(x.v)) is x:CCcell do toExpr(precision(x.v)) is x:CCicell do toExpr(precision(x.v)) else WrongArgRR()); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 1387ff67431..b1ab5ac9e9e 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -39,10 +39,10 @@ init(x:RRb) ::= ( newRRb():RRb := init(GCmalloc(RRb)); clear(x:RRb) ::= Ccode(void, "arb_clear(", x, ")"); -export RRbcell := {+v:RRb, prec:ulong}; +export RRbcell := {+v:RRb}; export toRRbcell(x:RRb):RRbcell := ( - y := RRbcell(x, ulong(100)); + y := RRbcell(x); Ccode(void, "GC_REGISTER_FINALIZER(", y, ", (GC_finalization_proc)arb_clear, ", y.v, ", 0, 0)"); y); @@ -71,6 +71,8 @@ moveToRRiandclear(x:RRb, prec:ulong):RRi := ( clear(x); r); +export precision(x:RRb):ulong := ulong(100); + -- special functions export eint(x:RRi):RRi := ( y := toRRb(x); diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 1f6b644b8a0..9e0c089db7a 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -6,6 +6,7 @@ header ""; --Functions in this file may make calls to stdio. use gmp; +use ballarith; use stdio; use err; @@ -175,6 +176,10 @@ export tostringRRi(x:RRi):string := concatenate( )); tostringRRipointer = tostringRRi; +-- TODO: printingPrecision doesn't seem to work as expected +export tostringRRb(x:RRb):string := tostring(Ccode(charstar, + "arb_get_str(", x, ", ", printingPrecision, ", 0)")); + export tostringCCi(x:CCi):string := ( if isZero(x.im) then tostringRRi(x.re) else if isZero(x.re) then concatenate(array(string)(tostringRRi(x.im),"*ii")) From f552b0c50955b77e2aedc7b586b22281c3cfc7e8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 18:02:56 -0400 Subject: [PATCH 046/691] Construct RRb from RRi --- M2/Macaulay2/d/actors4.d | 1 + M2/Macaulay2/d/ballarith.d | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 7ae1d830e7a..62c78c61b11 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1412,6 +1412,7 @@ setupfun("toRRi",toRRi); toRRb(e:Expr):Expr := ( when e is x:RRcell do toExpr(toRRb(x.v)) + is x:RRicell do toExpr(toRRb(x.v)) else WrongArg("TODO")); setupfun("toRRb", toRRb); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index b1ab5ac9e9e..34fa0b8bbcb 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -53,7 +53,7 @@ toRRb(x:RR, y:RR, prec:ulong):RRb := ( Ccode(void, "arb_set_interval_mpfr(", z, ", ", x, ", ", y, ", ", prec, ")"); z); export toRRb(x:RR):RRb := toRRb(x, x, precision(x)); -toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); +export toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); toRR(x:RRb, prec:ulong):RR := ( y := newRRmutable(prec); From 3153cc820c58d382d73b32e883f064eca10b912f Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Tue, 1 Jul 2025 17:06:24 -0500 Subject: [PATCH 047/691] divisions with CCi are implemented --- M2/Macaulay2/d/actors.d | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index e72161e636e..b7399cc5cb6 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -517,6 +517,28 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)+y.v.im^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) + is x:CCicell do ( + when rhs + is y:ZZcell do ( -- # typical value: symbol /, CCi, ZZ, CCi + if y.v === 0 + then DivisionByZero() + else toExpr(toCCi(x.v.re / toRR(y.v,precision(x.v.re)),x.v.im / toRR(y.v,precision(x.v.re)))) + ) + is y:QQcell do ( -- # typical value: symbol /, CCi, QQ, CCi + if y.v === 0 + then DivisionByZero() + else toExpr(toCCi(x.v.re / toRR(y.v,precision(x.v.re)),x.v.im / toRR(y.v,precision(x.v.re)))) + ) + is y:RRcell do ( -- # typical value: symbol /, CCi, RR, CCi + toExpr(toCCi(x.v.re / y.v,x.v.im/y.v))) + is y:RRicell do ( -- # typical value: symbol /, CCi, RRi, CCi + toExpr(toCCi(x.v.re / y.v,x.v.im/y.v))) + is y:CCcell do ( -- # typical value: symbol /, CCi, CC, CCi + toExpr(x.v/y.v)) + is y:CCicell do ( -- # typical value: symbol /, CCi, CCi, CCi + toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) + is Error do rhs + else binarymethod(lhs,rhs,DivideS)) is x:RawMonomialCell do ( when rhs is y:RawMonomialCell do ( -- # typical value: symbol /, RawMonomial, RawMonomial, RawMonomial From 7e80a93535bd1db2495c8952a94f1dd736c043ce Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 18:15:07 -0400 Subject: [PATCH 048/691] Begin adding RRb stuff to reals.m2 --- M2/Macaulay2/m2/exports.m2 | 1 + M2/Macaulay2/m2/reals.m2 | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/M2/Macaulay2/m2/exports.m2 b/M2/Macaulay2/m2/exports.m2 index 9dccb27554b..1fb1263c24d 100644 --- a/M2/Macaulay2/m2/exports.m2 +++ b/M2/Macaulay2/m2/exports.m2 @@ -345,6 +345,7 @@ export { "RR", "RR'", "RRb", + "RRb'", "RRi", "RRi'", "RaiseError", diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index fc998b0d62c..81c26a29b3a 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -12,10 +12,12 @@ globalAssignment ImmutableType RR.synonym = "real number" RRi.synonym = "real interval" +RRb.synonym = "real ball" CC.synonym = "complex number" CCi.synonym = "complex interval" RR.texMath = ///{\mathbb R}/// RRi.texMath = ///{\square\mathbb R}/// +RRb.texMath = ///{\circle\mathbb R}/// CC.texMath = ///{\mathbb C}/// CCi.texMath = ///{\square\mathbb C}/// Number.synonym = "number" @@ -36,6 +38,8 @@ raw InexactField := R -> R.RawRing RR.InexactField = RealField = new Type of InexactField ; RealField.synonym = "real field" RRi.InexactField = RealIntervalField = new Type of InexactField ; RealIntervalField.synonym = "real interval field" +RRb.InexactField = RealBallField = new Type of InexactField +RealBallField.synonym = "real ball field" CC.InexactField = ComplexField = new Type of InexactField; ComplexField.synonym = "complex field" CCi.InexactField = ComplexIntervalField = new Type of InexactField; ComplexIntervalField.synonym = "complex interval field" @@ -44,14 +48,17 @@ RingFamily_* := RR -> RR#(symbol _*) RingFamily_* := RRi -> RRi#(symbol _*) RingFamily_* = (RR,e) -> RR#(symbol _*) = e RingFamily_* = (RRi,e) -> RRi#(symbol _*) = e +RingFamily_* = (RRb,e) -> RRb#(symbol _*) = e InexactNumber' = new Type of Nothing' RR_* = RR' = new Type of InexactNumber' RRi_* = RRi' = new Type of InexactNumber' +RRb_* = RRb' = new Type of InexactNumber' CC_* = CC' = new Type of InexactNumber' CCi_* = CCi' = new Type of InexactNumber' RR'.texMath = ///{\mathbb R}_*/// RRi'.texMath = ///{\square\mathbb R}_*/// +RRb'.texMath = ///{\circle\mathbb R}_*/// CC'.texMath = ///{\mathbb C}_*/// CCi'.texMath = ///{\square\mathbb C}_*/// @@ -59,15 +66,18 @@ setAttribute(CC',PrintNet,"CC" | "*"^-1) setAttribute(CCi',PrintNet,"CCi" | "*"^-1) setAttribute(RR',PrintNet,"RR" | "*"^-1) setAttribute(RRi',PrintNet,"RRi" | "*"^-1) +setAttribute(RRb',PrintNet,"RRb" | "*"^-1) setAttribute(CC',PrintNames,"CC_*") setAttribute(CCi',PrintNames,"CCi_*") setAttribute(RR',PrintNames,"RR_*") setAttribute(RRi',PrintNames,"RRi_*") +setAttribute(RRb',PrintNames,"RRb_*") setAttribute(InexactNumber',PrintNet,"InexactNumber" | "*"^-1) protect back RR'.back = RR RRi'.back = RRi +RRb'.back = RRb CC'.back = CC CCi'.back = CCi new RealField of Nothing' from ZZ := memoize ( From fcb0f0e0706e0c2aea8b232cdce08e7154c1a342 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 1 Jul 2025 18:32:40 -0400 Subject: [PATCH 049/691] Fix printing of RRb's --- M2/Macaulay2/d/gmp1.d | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 9e0c089db7a..9db1a6565f1 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -176,9 +176,8 @@ export tostringRRi(x:RRi):string := concatenate( )); tostringRRipointer = tostringRRi; --- TODO: printingPrecision doesn't seem to work as expected export tostringRRb(x:RRb):string := tostring(Ccode(charstar, - "arb_get_str(", x, ", ", printingPrecision, ", 0)")); + "arb_get_str(", x, ", mpfr_get_str_ndigits(10, arb_bits(", x, ")), 0)")); export tostringCCi(x:CCi):string := ( if isZero(x.im) then tostringRRi(x.re) From a30d0c8a0aa94492e4f7ff7427e226efe08b4f44 Mon Sep 17 00:00:00 2001 From: klee669 Date: Tue, 1 Jul 2025 23:05:12 -0500 Subject: [PATCH 050/691] reals updated --- M2/Macaulay2/m2/reals.m2 | 1 + 1 file changed, 1 insertion(+) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index fc998b0d62c..758d7730b3e 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -223,6 +223,7 @@ lift(RRi,ZZ) := opts -> (r,ZZ) -> ( ring RR := x -> new RealField of RR' from precision x ring RRi := x -> new RealIntervalField of RRi' from precision x ring CC := x -> new ComplexField of CC' from precision x +ring CCi := x -> new ComplexIntervalField of CCi' from precision x new RR from RawRingElement := (RRR,x) -> ( assert( RRR === RR ); rawToRR x) new RRi from RawRingElement := (RRRi,x) -> ( assert( RRRi === RRi ); rawToRRi x) From fb3036b4e4338b350acbfb9849f2cab8cacb43f5 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 08:27:21 -0400 Subject: [PATCH 051/691] Finish toRRb constructors --- M2/Macaulay2/d/actors4.d | 23 ++++++++++++++++++++++- M2/Macaulay2/d/ballarith.d | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 62c78c61b11..ad288f02675 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1411,9 +1411,30 @@ setupfun("toRRi",toRRi); toRRb(e:Expr):Expr := ( when e + -- # typical value: toRRb, ZZ, RRb + is x:ZZcell do toExpr(toRRb(toRR(x.v, defaultPrecision))) + -- # typical value: toRRb, QQ, RRb + is x:QQcell do toExpr(toRRb(toRR(x.v, defaultPrecision))) + -- # typical value: toRRb, RR, RRb is x:RRcell do toExpr(toRRb(x.v)) + -- # typical value: toRRb, RRi, RRb is x:RRicell do toExpr(toRRb(x.v)) - else WrongArg("TODO")); + is a:Sequence do ( + if length(a) == 3 then ( + when a.0 + is x:RRcell do ( + when a.1 + is y:RRcell do ( + when a.2 + -- # typical value: toRRb, RR, RR, ZZ, RRb + is prec:ZZcell do ( + if !isULong(prec) then WrongArgSmallUInteger(3) + else toExpr(toRRb(x.v, y.v, toULong(prec)))) + else WrongArgZZ(3)) + else WrongArgRR(2)) + else WrongArgRR(1)) + else WrongNumArgs(1, 2)) + else WrongArg("a real number, real interval, or (RR, RR, ZZ) triple")); setupfun("toRRb", toRRb); toCCi(e:Expr):Expr := ( diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 34fa0b8bbcb..4e7c943307d 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -48,7 +48,7 @@ export toRRbcell(x:RRb):RRbcell := ( y); -- clear after using -toRRb(x:RR, y:RR, prec:ulong):RRb := ( +export toRRb(x:RR, y:RR, prec:ulong):RRb := ( z := newRRb(); Ccode(void, "arb_set_interval_mpfr(", z, ", ", x, ", ", y, ", ", prec, ")"); z); From 7905039619769d8319d63a5f123c51edd20affd0 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 08:41:33 -0400 Subject: [PATCH 052/691] Fix precision for RRb's --- M2/Macaulay2/d/actors4.d | 18 ++++++++++++------ M2/Macaulay2/d/ballarith.d | 9 ++++----- M2/Macaulay2/d/util.d | 1 - 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index ad288f02675..dc0dbe514af 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1412,13 +1412,17 @@ setupfun("toRRi",toRRi); toRRb(e:Expr):Expr := ( when e -- # typical value: toRRb, ZZ, RRb - is x:ZZcell do toExpr(toRRb(toRR(x.v, defaultPrecision))) + is x:ZZcell do Expr(toRRbcell( + toRRb(toRR(x.v, defaultPrecision)), + defaultPrecision)) -- # typical value: toRRb, QQ, RRb - is x:QQcell do toExpr(toRRb(toRR(x.v, defaultPrecision))) + is x:QQcell do Expr(toRRbcell( + toRRb(toRR(x.v, defaultPrecision)), + defaultPrecision)) -- # typical value: toRRb, RR, RRb - is x:RRcell do toExpr(toRRb(x.v)) + is x:RRcell do Expr(toRRbcell(toRRb(x.v), precision(x.v))) -- # typical value: toRRb, RRi, RRb - is x:RRicell do toExpr(toRRb(x.v)) + is x:RRicell do Expr(toRRbcell(toRRb(x.v), precision(x.v))) is a:Sequence do ( if length(a) == 3 then ( when a.0 @@ -1429,7 +1433,9 @@ toRRb(e:Expr):Expr := ( -- # typical value: toRRb, RR, RR, ZZ, RRb is prec:ZZcell do ( if !isULong(prec) then WrongArgSmallUInteger(3) - else toExpr(toRRb(x.v, y.v, toULong(prec)))) + else Expr(toRRbcell( + toRRb(x.v, y.v, toULong(prec)), + toULong(prec)))) else WrongArgZZ(3)) else WrongArgRR(2)) else WrongArgRR(1)) @@ -1623,7 +1629,7 @@ precision(e:Expr):Expr := ( when e is x:RRcell do toExpr(precision(x.v)) is x:RRicell do toExpr(precision(x.v)) - is x:RRbcell do toExpr(precision(x.v)) + is x:RRbcell do toExpr(x.prec) is x:CCcell do toExpr(precision(x.v)) is x:CCicell do toExpr(precision(x.v)) else WrongArgRR()); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 4e7c943307d..0c60768d404 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -39,10 +39,11 @@ init(x:RRb) ::= ( newRRb():RRb := init(GCmalloc(RRb)); clear(x:RRb) ::= Ccode(void, "arb_clear(", x, ")"); -export RRbcell := {+v:RRb}; +export RRbcell := {+v:RRb, prec:ulong}; -export toRRbcell(x:RRb):RRbcell := ( - y := RRbcell(x); +-- every RRbcell should be constructed using this so that it's finalized +export toRRbcell(x:RRb, prec:ulong):RRbcell := ( + y := RRbcell(x, prec); Ccode(void, "GC_REGISTER_FINALIZER(", y, ", (GC_finalization_proc)arb_clear, ", y.v, ", 0, 0)"); y); @@ -71,8 +72,6 @@ moveToRRiandclear(x:RRb, prec:ulong):RRi := ( clear(x); r); -export precision(x:RRb):ulong := ulong(100); - -- special functions export eint(x:RRi):RRi := ( y := toRRb(x); diff --git a/M2/Macaulay2/d/util.d b/M2/Macaulay2/d/util.d index 16a106ce4b2..b121a0720ac 100644 --- a/M2/Macaulay2/d/util.d +++ b/M2/Macaulay2/d/util.d @@ -222,7 +222,6 @@ export toExpr(x:ZZ):Expr := Expr(ZZcell(x)); export toExpr(x:QQ):Expr := Expr(QQcell(x)); export toExpr(x:RR):Expr := Expr(RRcell(x)); export toExpr(x:RRi):Expr := Expr(RRicell(x)); -export toExpr(x:RRb):Expr := Expr(toRRbcell(x)); export toExpr(x:CC):Expr := Expr(CCcell(x)); export toExpr(x:CCi):Expr := Expr(CCicell(x)); export toExpr(x:float):Expr := Expr(RRcell(toRR(x,ulong(24)))); From d2075cd6ca1302d7ba668492185eb0eaf1bfb77d Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 2 Jul 2025 08:29:51 -0500 Subject: [PATCH 053/691] Adding CCi's to reals.m2 --- M2/Macaulay2/m2/reals.m2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index fc998b0d62c..bce78c484d5 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -114,7 +114,7 @@ promote(RawRingElement,CCi') := (x,R) -> new CCi from x promote(RawRingElement,Number) := (x,R) -> new R from x promote(RawRingElement,RingElement) := (x,R) -> new R from x promote(Number,InexactNumber) := (x,RR) -> promote(x,default RR) -promote(ZZ,RR') := +promote(ZZ,RR') := promote(QQ,RR') := promote(RR,RR') := (i,K) -> toRR(K.precision,i) promote(ZZ,CC') := @@ -130,7 +130,7 @@ promote(QQ,CCi') := (i,K) -> toCCi(toRRi(i),interval 0) promote(RR,CCi') := (i,K) -> toCCi(toRRi(precision i,i,i),toRRi(precision i, 0,0)) promote(RRi,CCi') := (i,K) -> toCCi(i, interval 0) promote(CC,CCi') := (i,K) -> toCCi(toRRi(precision i,realPart i,realPart i),toRRi(precision i, imaginaryPart i, imaginaryPart i)) -promote(CCi,CCi') := (i,K) -> toCCi(realPart i, imaginaryPart i) -- this should be fixed +promote(CCi,CCi') := (i,K) -> toCCi(realPart i, imaginaryPart i) -- this should be fixed lift(Number,InexactNumber) := opts -> (x,RR) -> lift(x,default RR,opts) liftable(Number,InexactNumber) := (x,RR) -> liftable(x,default RR) From 8c2e3cab946c4df8aad8c43f1eaaa790a30ac72e Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 10:22:04 -0400 Subject: [PATCH 054/691] Add (ring, RRb) --- M2/Macaulay2/m2/reals.m2 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 1dfe145e6af..c6803874146 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -107,6 +107,15 @@ new RealIntervalField of Nothing' from ZZ := memoize ( symbol isBasic => true, symbol RawRing => rawRRi prec })) +new RealBallField of Nothing' from ZZ := memoize ( + (RealBallField, Nothing', prec) -> newClass(RealBallField, Nothing', + hashTable { + symbol precision => prec, + symbol Engine => true, + symbol baseRings => {ZZ,QQ}, + symbol isBasic => true, + symbol RawRing => null -- TODO + })) precision InexactField := R -> R.precision InexactFieldFamily _ ZZ := (T,prec) -> new T.InexactField of T#(symbol _*) from prec -- oops... default InexactFieldFamily := R -> R_defaultPrecision @@ -232,6 +241,7 @@ lift(RRi,ZZ) := opts -> (r,ZZ) -> ( ring RR := x -> new RealField of RR' from precision x ring RRi := x -> new RealIntervalField of RRi' from precision x +ring RRb := x -> new RealBallField of RRb' from precision x ring CC := x -> new ComplexField of CC' from precision x ring CCi := x -> new ComplexIntervalField of CCi' from precision x @@ -424,6 +434,7 @@ toString ComplexField := R -> concatenate("CC_",toString R.precision) expression RealField := R -> new Subscript from {symbol RR, R.precision} expression RealIntervalField := R -> new Subscript from {symbol RRi, R.precision} +expression RealBallField := R -> new Subscript from {symbol RRb, R.precision} expression ComplexField := R -> new Subscript from {symbol CC, R.precision} expression RR := x -> ( if x < 0 From 3ab7617fc9cbb7103b155c811091e762fffa2c9e Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 2 Jul 2025 09:37:04 -0500 Subject: [PATCH 055/691] Fixed issue in division --- M2/Macaulay2/d/actors.d | 2 +- M2/Macaulay2/m2/rings.m2 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index b7399cc5cb6..6daafa78176 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -536,7 +536,7 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( is y:CCcell do ( -- # typical value: symbol /, CCi, CC, CCi toExpr(x.v/y.v)) is y:CCicell do ( -- # typical value: symbol /, CCi, CCi, CCi - toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) + toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)+y.v.im^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:RawMonomialCell do ( diff --git a/M2/Macaulay2/m2/rings.m2 b/M2/Macaulay2/m2/rings.m2 index 61c16bf8068..3065cdc33a8 100644 --- a/M2/Macaulay2/m2/rings.m2 +++ b/M2/Macaulay2/m2/rings.m2 @@ -68,6 +68,7 @@ ZZ.isCommutative = true QQ.isCommutative = true RR.isCommutative = true RRi.isCommutative = true +CCi.isCommutative = true isRing = method(TypicalValue => Boolean) isRing Thing := R -> false From ab503358fcb0ddaedfd325ccb93361a682323f50 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 10:42:47 -0400 Subject: [PATCH 056/691] Add toExpr(RRb,ulong) (and use it in toRRb) --- M2/Macaulay2/d/actors4.d | 22 +++++++++++----------- M2/Macaulay2/d/util.d | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index dc0dbe514af..e7987679fc4 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1412,17 +1412,17 @@ setupfun("toRRi",toRRi); toRRb(e:Expr):Expr := ( when e -- # typical value: toRRb, ZZ, RRb - is x:ZZcell do Expr(toRRbcell( - toRRb(toRR(x.v, defaultPrecision)), - defaultPrecision)) + is x:ZZcell do toExpr( + toRRb(toRR(x.v, defaultPrecision)), + defaultPrecision) -- # typical value: toRRb, QQ, RRb - is x:QQcell do Expr(toRRbcell( - toRRb(toRR(x.v, defaultPrecision)), - defaultPrecision)) + is x:QQcell do toExpr( + toRRb(toRR(x.v, defaultPrecision)), + defaultPrecision) -- # typical value: toRRb, RR, RRb - is x:RRcell do Expr(toRRbcell(toRRb(x.v), precision(x.v))) + is x:RRcell do toExpr(toRRb(x.v), precision(x.v)) -- # typical value: toRRb, RRi, RRb - is x:RRicell do Expr(toRRbcell(toRRb(x.v), precision(x.v))) + is x:RRicell do toExpr(toRRb(x.v), precision(x.v)) is a:Sequence do ( if length(a) == 3 then ( when a.0 @@ -1433,9 +1433,9 @@ toRRb(e:Expr):Expr := ( -- # typical value: toRRb, RR, RR, ZZ, RRb is prec:ZZcell do ( if !isULong(prec) then WrongArgSmallUInteger(3) - else Expr(toRRbcell( - toRRb(x.v, y.v, toULong(prec)), - toULong(prec)))) + else toExpr( + toRRb(x.v, y.v, toULong(prec)), + toULong(prec))) else WrongArgZZ(3)) else WrongArgRR(2)) else WrongArgRR(1)) diff --git a/M2/Macaulay2/d/util.d b/M2/Macaulay2/d/util.d index b121a0720ac..68a1a046624 100644 --- a/M2/Macaulay2/d/util.d +++ b/M2/Macaulay2/d/util.d @@ -222,6 +222,7 @@ export toExpr(x:ZZ):Expr := Expr(ZZcell(x)); export toExpr(x:QQ):Expr := Expr(QQcell(x)); export toExpr(x:RR):Expr := Expr(RRcell(x)); export toExpr(x:RRi):Expr := Expr(RRicell(x)); +export toExpr(x:RRb,prec:ulong):Expr := Expr(toRRbcell(x, prec)); export toExpr(x:CC):Expr := Expr(CCcell(x)); export toExpr(x:CCi):Expr := Expr(CCicell(x)); export toExpr(x:float):Expr := Expr(RRcell(toRR(x,ulong(24)))); From baa65bfaccb9feeff8d5f0298f0de80a043945c7 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 10:45:01 -0400 Subject: [PATCH 057/691] Add addition for RRb's --- M2/Macaulay2/d/actors.d | 6 ++++++ M2/Macaulay2/d/ballarith.d | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 6daafa78176..74147861114 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -63,6 +63,12 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) + is x:RRbcell do ( + when rhs + is y:RRbcell do ( + prec := min(x.prec, y.prec); + toExpr(RRbadd(x.v, y.v, prec), prec)) + else binarymethod(lhs, rhs, PlusS)) is x:CCcell do ( when rhs is y:ZZcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, ZZ, CC diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 0c60768d404..c9abe813b1e 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -72,6 +72,12 @@ moveToRRiandclear(x:RRb, prec:ulong):RRi := ( clear(x); r); +-- arithmetic +export RRbadd(x:RRb, y:RRb, prec:ulong):RRb := ( + z := newRRb(); + Ccode(void, "arb_add(", z, ", ", x, ", ", y, ", ", prec, ")"); + z); + -- special functions export eint(x:RRi):RRi := ( y := toRRb(x); From beaa5fdc36bfeb925a1a8aca201151e91f86c4e7 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 2 Jul 2025 09:45:37 -0500 Subject: [PATCH 058/691] Added single inputs to spanRRi --- M2/Macaulay2/m2/intervals.m2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 5693efdc9b6..ecf246ec045 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -22,6 +22,11 @@ interval(Array) := opts -> A -> ( spanRRi = method(Options => {Precision => -1}) +for A in {ZZ,QQ,RR,RRi} do +spanRRi(A) := opts -> (M) -> ( + if opts.Precision < 0 then toRRi(M) + else toRRi(opts.Precision,M)) + for A in {ZZ,QQ,RR} do for B in {ZZ,QQ,RR} do spanRRi(A,B) := opts -> (N,M) -> ( From 7ac883aa7401c3518f03e84ce7e1d50dc78b8e7e Mon Sep 17 00:00:00 2001 From: klee669 Date: Wed, 2 Jul 2025 09:58:38 -0500 Subject: [PATCH 059/691] constructor function interval supports CCi --- M2/Macaulay2/m2/intervals.m2 | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 5693efdc9b6..65fbe474dc1 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -8,6 +8,8 @@ for A in {ZZ,QQ,RR} do interval A := opts -> N -> ( if opts.Precision < 0 then toRRi(N) else toRRi(opts.Precision,N,N)) +interval(RRi) := opts -> A -> A +interval(CCi) := opts -> A -> toCCi A for A in {ZZ,QQ,RR} do for B in {ZZ,QQ,RR} do @@ -15,10 +17,30 @@ interval(A,B) := opts -> (N,M) -> ( if opts.Precision < 0 then toRRi(N,M) else toRRi(opts.Precision,N,M)) +interval(RRi,RRi) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(N,M)) +-- else toCCi(opts.Precision,N,M)) + +interval(CC) := opts -> A -> toCCi A + +for A in {ZZ,QQ,RR} do +interval(CC,A) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(interval(realPart N, M), interval imaginaryPart N)) +-- else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) +for A in {ZZ,QQ,RR} do +interval(A,CC) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(interval(N, realPart M), interval imaginaryPart M)) +-- else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) +for A in {ZZ,QQ,RR} do +interval(CC,CC) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(interval(realPart N, realPart M), interval (imaginaryPart N, imaginaryPart M))) +-- else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) + + interval(Array) := opts -> A -> ( if (length(A) == 0) or (length(A)>2) then error("expected length 2") else if length(A) == 1 then interval(opts,A_0) - else interval(opts,A_0,A_1)) + else interval(opts,A_0,A_1)) spanRRi = method(Options => {Precision => -1}) From 5b0fbb123a02ce3a5e40eaa740bc4c40ac46d6e4 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 2 Jul 2025 10:01:08 -0500 Subject: [PATCH 060/691] powers with z --- M2/Macaulay2/d/actors.d | 5 +++++ M2/Macaulay2/d/gmp.d | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 6daafa78176..b21205ddc6b 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -821,6 +821,11 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( is y:CCcell do toExpr(x.v^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) + is x:CCicell do ( + when rhs + is y:ZZcell do toExpr(x.v^y.v) + is Error do rhs + else binarymethod(lhs,rhs,PowerS)) is x:RawRingElementCell do ( when rhs is y:ZZcell do ( diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index a443bf533ea..317644a86f0 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -2929,6 +2929,22 @@ export (x:CC) ^ (y:ZZ):CC := ( ); exp(log(x)*y)); +export (x:CCi) ^ (y:ZZ):CCi := ( + if isZero0(y) then return toCCi(1,0,precision0(x.re)); + if isZero0(x.re) && isZero0(x.im) && isfinite0(x.re) && isfinite0(x.im) then return if isNegative0(y) then infinityCCi(precision0(x.re)) else x; + if isinf(x) then return if isNegative0(y) then toCCi(0,precision0(x.re)) else x; + if isLong(y) then ( + n := toLong(y); + if n == long(0) then return toCCi(1,precision(x)); + if n == long(1) then return x; + if n == long(-1) then return inverse(x); + if n == long(2) then return square(x); + if n == long(-2) then return inverse(square(x)); + -- we could do a few more of these optimizations here... + ); + if isEven(y) then return square(x^(y >> 1)) + else (return x*(x^(y-1)))); + export (x:RR) ^ (y:CC):CC := if isNegative(x) then exp(log(toCC(x))*y) else exp(log(x)*y); export arrayZZ := array(ZZ); From 56f7d93d7c1eb21403fc43841dcd18ace5cfe317 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 2 Jul 2025 10:17:14 -0500 Subject: [PATCH 061/691] powers with ZZ --- M2/Macaulay2/d/actors.d | 5 ----- M2/Macaulay2/d/gmp.d | 16 ---------------- 2 files changed, 21 deletions(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index b21205ddc6b..6daafa78176 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -821,11 +821,6 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( is y:CCcell do toExpr(x.v^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) - is x:CCicell do ( - when rhs - is y:ZZcell do toExpr(x.v^y.v) - is Error do rhs - else binarymethod(lhs,rhs,PowerS)) is x:RawRingElementCell do ( when rhs is y:ZZcell do ( diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 317644a86f0..a443bf533ea 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -2929,22 +2929,6 @@ export (x:CC) ^ (y:ZZ):CC := ( ); exp(log(x)*y)); -export (x:CCi) ^ (y:ZZ):CCi := ( - if isZero0(y) then return toCCi(1,0,precision0(x.re)); - if isZero0(x.re) && isZero0(x.im) && isfinite0(x.re) && isfinite0(x.im) then return if isNegative0(y) then infinityCCi(precision0(x.re)) else x; - if isinf(x) then return if isNegative0(y) then toCCi(0,precision0(x.re)) else x; - if isLong(y) then ( - n := toLong(y); - if n == long(0) then return toCCi(1,precision(x)); - if n == long(1) then return x; - if n == long(-1) then return inverse(x); - if n == long(2) then return square(x); - if n == long(-2) then return inverse(square(x)); - -- we could do a few more of these optimizations here... - ); - if isEven(y) then return square(x^(y >> 1)) - else (return x*(x^(y-1)))); - export (x:RR) ^ (y:CC):CC := if isNegative(x) then exp(log(toCC(x))*y) else exp(log(x)*y); export arrayZZ := array(ZZ); From d07567666dbf8ffb772410e5c33bb7a06d0fabc9 Mon Sep 17 00:00:00 2001 From: Andrew Tawfeek Date: Wed, 2 Jul 2025 10:20:15 -0500 Subject: [PATCH 062/691] added precision to toCCi --- M2/Macaulay2/d/actors4.d | 55 +++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 62c78c61b11..40b6abd6646 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1406,7 +1406,7 @@ toRRi(e:Expr):Expr := ( else WrongArg(1,"a pair of integral, rational, or real numbers, with a precision")) else WrongArg(1,"a pair of integral, rational, or real numbers, with a precision")) else buildErrorPacket(EngineError("The first argument should be an integer"))) - else WrongArg(1,"a pair or triple of integral, rational, or real numbers")); + else WrongArg(1,"a pair or triple of integral, rational, or real numbers")); setupfun("toRRi",toRRi); toRRb(e:Expr):Expr := ( @@ -1432,6 +1432,7 @@ toCCi(e:Expr):Expr := ( is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) + is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:QQcell do ( when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) @@ -1440,21 +1441,51 @@ toCCi(e:Expr):Expr := ( is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:RRcell do ( - when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) - is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) + is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:RRicell do ( - when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) - is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) + is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + + else when s.0 is prec:ZZcell do ( + when s.1 is x:ZZcell do ( + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,precision(y.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,defaultPrecision),y.v,toULong(prec.v))) + is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), defaultPrecision),toRRi(imaginaryPart(y.v), defaultPrecision),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:QQcell do ( + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,precision(y.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,defaultPrecision),y.v,toULong(prec.v))) + is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), defaultPrecision),toRRi(imaginaryPart(y.v), defaultPrecision),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRcell do ( + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,precision(x.v)),toRRi(y.v,precision(x.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,precision(x.v)),toRRi(y.v,precision(x.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),y.v,toULong(prec.v))) + is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), precision(x.v)),toRRi(imaginaryPart(y.v), precision(x.v)),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRicell do ( + when s.2 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),y.v,toULong(prec.v))) + is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), precision(x.v)),toRRi(imaginaryPart(y.v), precision(x.v)),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")) else WrongNumArgs(1,2)) - else WrongArg(1,"a pair or triple of integral, rational, or real numbers") -); + else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")); setupfun("toCCi",toCCi); rightRR(e:Expr):Expr := ( From b649e0e4497aee30673f4a9322ec2eec7f4d3d08 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 2 Jul 2025 10:20:40 -0500 Subject: [PATCH 063/691] Added spanner for spanning --- M2/Macaulay2/m2/intervals.m2 | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index ecf246ec045..b4288dcfe17 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -61,6 +61,19 @@ spanRRi(CCi,A) := opts -> (N,M) -> ( else toRRi(opts.Precision,min(left N,M),max(right N,M))); spanRRi(A,CCi) := opts -> (N,M) -> span(opts,M,N)) +spanner = method(Options => {Precision => -1}) + +for A in {ZZ,QQ,RR,RRi} do +for B in {ZZ,QQ,RR,RRi} do +spanner(A,B) := opts -> (N,M) -> (spanRRi(N,M)) + +for A in {ZZ,QQ,RR,RRi,CC,CCi} do +for B in {CC,CCi} do +spanner(A,B) := opts -> (N,M) -> (spanCCi(N,M)) + +for A in {CC,CCi} do +for B in {ZZ,QQ,RR,RRi} do +spanner(A,B) := opts -> (N,M) -> (spanCCi(N,M)) span = method(Dispatch => Thing, Options => true) @@ -68,7 +81,11 @@ span ZZ := span QQ := span RR := {Precision => -1} >> opts -> N -> interval(N,op span RRi := {Precision => -1} >> opts -> N -> interval(left N,right N,opts) -span List := span Sequence := {Precision => -1} >> opts -> L -> fold(L, (N, M) -> spanCCi(N, M, opts)) +span CC := {Precision => -1} >> opts -> N -> interval(realPart N,imaginaryPart N,opts) + +span CCi := {Precision => -1} >> opts -> N -> interval(realPart N,imaginaryPart N,opts) + +span List := span Sequence := {Precision => -1} >> opts -> L -> fold(L, (N, M) -> spanner(N, M, opts)) for A in {ZZ,QQ,RR} do isMember(A,RRi) := (N,M) -> subsetRRi(N,M); From a0f3a8ca65cbce83d9941b831339543172ef9a2d Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 11:25:25 -0400 Subject: [PATCH 064/691] Add low-level RRb constructors from ZZ/QQ, add RRb + ZZ --- M2/Macaulay2/d/actors.d | 3 +++ M2/Macaulay2/d/ballarith.d | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 74147861114..35516a26618 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -65,6 +65,9 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( else binarymethod(lhs,rhs,PlusS)) is x:RRbcell do ( when rhs + is y:ZZcell do toExpr( + RRbadd(x.v, toRRb(y.v, x.prec), x.prec), + x.prec) is y:RRbcell do ( prec := min(x.prec, y.prec); toExpr(RRbadd(x.v, y.v, prec), prec)) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index c9abe813b1e..8c367dceada 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -55,6 +55,12 @@ export toRRb(x:RR, y:RR, prec:ulong):RRb := ( z); export toRRb(x:RR):RRb := toRRb(x, x, precision(x)); export toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); +export toRRb(x:ZZ, prec:ulong):RRb := ( + y := toRR(x); + toRRb(y, y, prec)); +export toRRb(x:QQ, prec:ulong):RRb := ( + y := toRR(x); + toRRb(y, y, prec)); toRR(x:RRb, prec:ulong):RR := ( y := newRRmutable(prec); From 3f824633ff9e5152246cf56e53e1ace95571309e Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 2 Jul 2025 10:40:43 -0500 Subject: [PATCH 065/691] CCi to the power of ZZ --- M2/Macaulay2/d/actors.d | 5 +++++ M2/Macaulay2/d/gmp.d | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 74147861114..001b92236a0 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -827,6 +827,11 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( is y:CCcell do toExpr(x.v^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) + is x:CCicell do ( + when rhs + is y:ZZcell do toExpr(x.v^y.v) + is Error do rhs + else binarymethod(lhs,rhs,PowerS)) is x:RawRingElementCell do ( when rhs is y:ZZcell do ( diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index a443bf533ea..e89aba79505 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -2328,6 +2328,8 @@ export norm2(x:CCi):RRi := x.re*x.re + x.im*x.im; export (x:CC) << (n:long) : CC := if n == long(0) then x else CC(x.re<> (n:long) : CCi := if n == long(0) then x else CCi(x.re>>n,x.im>>n); + export (x:CC) >> (n:long) : CC := if n == long(0) then x else CC(x.re>>n,x.im>>n); export (x:CC) << (n:int) : CC := if n == 0 then x else CC(x.re< 10000 || expon < -10000 then z = z >> expon else expon = long(0); + n2 := norm2(z); + toCCi((z.re/n2) >> expon, -(z.im/n2) >> expon)) + else if isinf(z) then toCCi(0,0,precision(z)) + else nanCCi(precision(z))); + export (x:CC) / (y:CC) : CC := x * inverse(y); export (x:CCi) / (y:CC) : CCi := x * inverse(y); @@ -2895,6 +2908,12 @@ square(z:CC):CC := ( else infinityCC(precision0(z.re)) ); +square(z:CCi):CCi := ( + if isfinite0(z.re) && isfinite0(z.im) then toCCi(z.re^long(2)-z.im^long(2),2*z.re*z.im) + else if isnan0(z.re) || isnan0(z.im) then nanCCi(precision0(z.re)) + else infinityCCi(precision0(z.re)) + ); + export acos(z:CC):CC := idiv(log(z+itimes(sqrt(1-square(z))))); export asin(z:CC):CC := idiv(log(sqrt(1-square(z))+itimes(z))); @@ -2929,6 +2948,22 @@ export (x:CC) ^ (y:ZZ):CC := ( ); exp(log(x)*y)); +export (x:CCi) ^ (y:ZZ):CCi := ( + if isZero0(y) then return toCCi(1,0,precision0(x.re)); + if isZero0(x.re) && isZero0(x.im) && isfinite0(x.re) && isfinite0(x.im) then return if isNegative0(y) then infinityCCi(precision0(x.re)) else x; + if isinf(x) then return if isNegative0(y) then toCCi(0,precision0(x.re)) else x; + if isLong(y) then ( + n := toLong(y); + if n == long(0) then return toCCi(1,precision(x)); + if n == long(1) then return x; + if n == long(-1) then return inverse(x); + if n == long(2) then return square(x); + if n == long(-2) then return inverse(square(x)); + -- we could do a few more of these optimizations here... + ); + if isEven(y) then return square(x^(y >> 1)) + else (return x*(x^(y-1)))); + export (x:RR) ^ (y:CC):CC := if isNegative(x) then exp(log(toCC(x))*y) else exp(log(x)*y); export arrayZZ := array(ZZ); From 868292854efe35a42a1545d11a0945ee24e6d4ca Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 2 Jul 2025 10:46:32 -0500 Subject: [PATCH 066/691] CCi to the power of ZZ implemented --- M2/Macaulay2/d/actors.d | 3 +++ 1 file changed, 3 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 6719fd0231a..760b0e67f5e 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -1331,6 +1331,7 @@ isFinite(e:Expr):Expr := ( is x:RRcell do toExpr(isfinite(x.v)) is x:RRicell do toExpr(isfinite(x.v)) is x:CCcell do toExpr(isfinite(x.v)) + is x:CCicell do toExpr(isfinite(x.v)) else WrongArg("a number") ); setupfun("isFinite0",isFinite); @@ -1343,6 +1344,7 @@ isANumber(e:Expr):Expr := ( is x:RRcell do toExpr(!isnan(x.v)) is x:RRicell do toExpr(!isnan(x.v)) is x:CCcell do toExpr(!isnan(x.v)) + is x:CCicell do toExpr(!isnan(x.v)) else WrongArg("a number") ); setupfun("isANumber",isANumber); @@ -1354,6 +1356,7 @@ isInfinite(e:Expr):Expr := ( is x:RRcell do toExpr(isinf(x.v)) is x:RRicell do toExpr(isinf(x.v)) is x:CCcell do toExpr(isinf(x.v)) + is x:CCicell do toExpr(isinf(x.v)) else WrongArg("a number") ); setupfun("isInfinite",isInfinite).Protected=false; From f4bbb7bf26f35e38066985ad541a840f0c6ad7ad Mon Sep 17 00:00:00 2001 From: klee669 Date: Wed, 2 Jul 2025 11:06:13 -0500 Subject: [PATCH 067/691] span function added --- M2/Macaulay2/m2/intervals.m2 | 49 ++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index d176add67d9..f61e78d4e04 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -18,23 +18,23 @@ interval(A,B) := opts -> (N,M) -> ( else toRRi(opts.Precision,N,M)) interval(RRi,RRi) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(N,M)) --- else toCCi(opts.Precision,N,M)) + if opts.Precision < 0 then toCCi(N,M) + else toCCi(opts.Precision,N,M)) interval(CC) := opts -> A -> toCCi A for A in {ZZ,QQ,RR} do interval(CC,A) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval(realPart N, M), interval imaginaryPart N)) --- else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) + if opts.Precision < 0 then toCCi(interval(realPart N, M), interval imaginaryPart N) + else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) for A in {ZZ,QQ,RR} do interval(A,CC) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval(N, realPart M), interval imaginaryPart M)) --- else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) + if opts.Precision < 0 then toCCi(interval(N, realPart M), interval imaginaryPart M) + else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) for A in {ZZ,QQ,RR} do interval(CC,CC) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval(realPart N, realPart M), interval (imaginaryPart N, imaginaryPart M))) --- else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) + if opts.Precision < 0 then toCCi(interval(realPart N, realPart M), interval (imaginaryPart N, imaginaryPart M)) + else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) interval(Array) := opts -> A -> ( @@ -70,19 +70,30 @@ spanRRi(RRi,RRi) := opts -> (N,M) -> ( spanCCi = method(Options => {Precision => -1}) -for A in {ZZ,QQ,RR,RRi} do -for B in {ZZ,QQ,RR,RRi} do -spanCCi(A,B) := opts -> (N,M) -> ( - toCCi(spanRRi(N,M), interval 0) - ) +--for A in {ZZ,QQ,RR,RRi} do +--for B in {ZZ,QQ,RR,RRi} do +--spanCCi(A,B) := opts -> (N,M) -> ( +-- toCCi(spanRRi(N,M), interval 0) +-- ) for A in {ZZ,QQ,RR,RRi} do ( -spanRRi(CCi,A) := opts -> (N,M) -> ( - if isEmpty(N) then interval(opts,M) - else if opts.Precision < 0 then toRRi(min(left N,M),max(right N,M)) - else toRRi(opts.Precision,min(left N,M),max(right N,M))); -spanRRi(A,CCi) := opts -> (N,M) -> span(opts,M,N)) - +spanCCi(CC,A) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),toRRi imaginaryPart N) + else toCCi(opts.Precision,spanRRi(realPart N,M),toRRi imaginaryPart N));--toRRi(opts.Precision,min(left N,M),max(right N,M))); +spanCCi(A,CC) := opts -> (N,M) -> spanCCi(opts,M,N); +spanCCi(CCi,A) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),imaginaryPart N) + else toCCi(opts.Precision,spanRRi(realPart N,M),imaginaryPart N));--toRRi(opts.Precision,min(left N,M),max(right N,M))); +spanCCi(A,CCi) := opts -> (N,M) -> spanCCi(opts,M,N)) + +spanCCi(CC,CC) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(spanRRi(realPart N,realPart M),spanRRi(imaginaryPart N, imaginaryPart M))) +spanCCi(CC,CCi) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(spanRRi(realPart N,realPart M),spanRRi(imaginaryPart N, imaginaryPart M))) +spanCCi(CCi,CC) := opts -> (N,M) -> spanCCi(opts,M,N) +spanCCi(CCi,CCi) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(spanRRi(realPart N,realPart M),spanRRi(imaginaryPart N, imaginaryPart M))) + spanner = method(Options => {Precision => -1}) for A in {ZZ,QQ,RR,RRi} do From 0d21f7e581b0169d9422cb64b181d54c8d8f997c Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 2 Jul 2025 11:18:43 -0500 Subject: [PATCH 068/691] RRb plus QQ implemented --- M2/Macaulay2/d/actors.d | 3 +++ 1 file changed, 3 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 760b0e67f5e..aa42cb825d7 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -68,6 +68,9 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:ZZcell do toExpr( RRbadd(x.v, toRRb(y.v, x.prec), x.prec), x.prec) + is y:QQcell do toExpr( + RRbadd(x.v, toRRb(y.v, x.prec), x.prec), + x.prec) is y:RRbcell do ( prec := min(x.prec, y.prec); toExpr(RRbadd(x.v, y.v, prec), prec)) From 85fc6da0b5daa211edba6725c67acdb4d587ebda Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 12:39:04 -0400 Subject: [PATCH 069/691] RRb -> RRi conversion --- M2/Macaulay2/d/actors4.d | 1 + M2/Macaulay2/d/ballarith.d | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index f96f38dcac3..d173bc01b0b 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1369,6 +1369,7 @@ toRRi(e:Expr):Expr := ( is x:QQcell do toExpr(toRRi(x.v)) is x:RRcell do toExpr(toRRi(x.v)) is x:RRicell do e + is x:RRbcell do toExpr(toRRi(x.v, x.prec)) is s:Sequence do ( if length(s) > 3 then WrongNumArgs(1,3) else if length(s) == 2 then ( diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 8c367dceada..eb37456df0f 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -67,7 +67,7 @@ toRR(x:RRb, prec:ulong):RR := ( Ccode(int, "arf_get_mpfr(", y, ", arb_midref(", x, "), MPFR_RNDN)"); moveToRRandclear(y)); -toRRi(x:RRb, prec:ulong):RRi := ( +export toRRi(x:RRb, prec:ulong):RRi := ( y := newRRimutable(prec); Ccode(void, "arb_get_interval_mpfr((mpfr_ptr)&", y, "->left, (mpfr_ptr)&", y, "->right, ", x, ")"); From 743f8c7bbcf27ba3ea70c24aaa12686371dd4d51 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 12:40:35 -0400 Subject: [PATCH 070/691] Export CCb to top level --- M2/Macaulay2/d/actors4.d | 21 ++++++++++++++++++++- M2/Macaulay2/d/ballarith.d | 21 +++++++++++++++++---- M2/Macaulay2/d/basic.d | 1 + M2/Macaulay2/d/classes.dd | 2 ++ M2/Macaulay2/d/equality.dd | 1 + M2/Macaulay2/d/expr.d | 1 + M2/Macaulay2/d/parse.d | 1 + M2/Macaulay2/d/util.d | 1 + M2/Macaulay2/m2/exports.m2 | 2 ++ 9 files changed, 46 insertions(+), 5 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index d173bc01b0b..99a8548b60c 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -994,6 +994,7 @@ tostringfun(e:Expr):Expr := ( is x:RRbcell do toExpr(tostringRRb(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) is x:CCicell do toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) + is x:CCbcell do toExpr("<>") is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") @@ -1515,7 +1516,24 @@ toCCi(e:Expr):Expr := ( else WrongNumArgs(1,2)) else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")); setupfun("toCCi",toCCi); - + +toCCb(e:Expr):Expr := ( + when e + -- # typical value: toCCb, CC, CCb + is x:CCcell do toExpr(toCCb(x.v), precision(x.v)) + is a:Sequence do ( + if length(a) == 2 then ( + when a.0 + is x:RRbcell do ( + when a.1 + -- # typical value: toCCb, RRb, RRb, CCb + is y:RRbcell do toExpr(toCCb(x.v, y.v), min(x.prec, y.prec)) + else WrongArg(2, "a real ball")) + else WrongArg(1, "a real ball")) + else WrongNumArgs(1, 2)) + else WrongArg("a complex number or pair of real numbers")); +setupfun("toCCb", toCCb); + rightRR(e:Expr):Expr := ( when e is x:RRicell do toExpr(rightRR(x.v)) @@ -1664,6 +1682,7 @@ precision(e:Expr):Expr := ( is x:RRbcell do toExpr(x.prec) is x:CCcell do toExpr(precision(x.v)) is x:CCicell do toExpr(precision(x.v)) + is x:CCbcell do toExpr(x.prec) else WrongArgRR()); setupfun("precision0",precision); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index eb37456df0f..aacfa1d6472 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -212,19 +212,32 @@ export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( -- CCBall -- ------------ -CCb := Pointer "acb_ptr"; +export CCb := Pointer "acb_ptr"; init(z:CCb) ::= ( Ccode(void, "acb_init(", z, ")"); z); newCCb():CCb := init(GCmalloc(CCb)); clear(z:CCb) ::= Ccode(void, "acb_clear(", z, ")"); +export CCbcell := {+v:CCb, prec:ulong}; + +-- every CCbcell should be constructed using this so that it's finalized +export toCCbcell(x:CCb, prec:ulong):CCbcell := ( + y := CCbcell(x, prec); + Ccode(void, "GC_REGISTER_FINALIZER(", y, + ", (GC_finalization_proc)acb_clear, ", y.v, ", 0, 0)"); + y); + -- clear after using -toCCb(z:CC):CCb := ( +export toCCb(x:RRb, y:RRb):CCb := ( + z := newCCb(); + Ccode(void, "acb_set_arb_arb(", z, ", ", x, ", ", y, ")"); + z); + +export toCCb(z:CC):CCb := ( x := toRRb(realPart(z)); y := toRRb(imaginaryPart(z)); - w := newCCb(); - Ccode(void, "acb_set_arb_arb(", w, ", ", x, ", ", y, ")"); + w := toCCb(x, y); clear(x); clear(y); w); diff --git a/M2/Macaulay2/d/basic.d b/M2/Macaulay2/d/basic.d index fba0482b307..64c8049467c 100644 --- a/M2/Macaulay2/d/basic.d +++ b/M2/Macaulay2/d/basic.d @@ -27,6 +27,7 @@ export hash(e:Expr):hash_t := ( is x:RRbcell do hash_t(6) is x:CCcell do hash(x.v) is x:CCicell do hash(x.v.re + x.v.im) + is x:CCbcell do hash_t(7) is x:Sequence do ( -- the numbers here are the same as in binary lookup() in objects.d!! h := hash_t(27449); diff --git a/M2/Macaulay2/d/classes.dd b/M2/Macaulay2/d/classes.dd index 5c58c06326c..7dbcc841e48 100644 --- a/M2/Macaulay2/d/classes.dd +++ b/M2/Macaulay2/d/classes.dd @@ -26,6 +26,7 @@ setupconst("RRb",Expr(RRbClass)); setupconst("RR",Expr(RRClass)); setupconst("CC",Expr(CCClass)); setupconst("CCi",Expr(CCiClass)); +setupconst("CCb",Expr(CCbClass)); setupconst("RingElement",Expr(ringElementClass)); setupconst("Number",Expr(numberClass)); setupconst("InexactNumber",Expr(inexactNumberClass)); @@ -152,6 +153,7 @@ export Class(e:Expr):HashTable := ( is RRbcell do RRbClass is CCcell do CCClass is CCicell do CCiClass + is CCbcell do CCbClass is RawComputationCell do rawComputationClass is Nothing do nothingClass is Database do dbClass diff --git a/M2/Macaulay2/d/equality.dd b/M2/Macaulay2/d/equality.dd index f3b0d449384..30b130fe0d4 100644 --- a/M2/Macaulay2/d/equality.dd +++ b/M2/Macaulay2/d/equality.dd @@ -161,6 +161,7 @@ export equal(lhs:Expr,rhs:Expr):Expr := ( if strictequality(x.v.re,y.v.re) && strictequality(x.v.im,y.v.im) then True else False ) else False) + is x:CCbcell do False is x:SymbolClosure do ( when rhs is y:SymbolClosure do ( diff --git a/M2/Macaulay2/d/expr.d b/M2/Macaulay2/d/expr.d index 08932894534..111b1409ebf 100644 --- a/M2/Macaulay2/d/expr.d +++ b/M2/Macaulay2/d/expr.d @@ -357,6 +357,7 @@ export atomicIntClass := newbasictype(); export pseudocodeClosureClass := newtypeof(pseudocodeClass); export CCiClass := newbignumbertype(); export RRbClass := newbignumbertype(); +export CCbClass := newbignumbertype(); -- all new types, dictionaries, and classes go just above this line, if possible, so hash codes don't change gratuitously! diff --git a/M2/Macaulay2/d/parse.d b/M2/Macaulay2/d/parse.d index d05d48ce4d2..d2836e8f60e 100644 --- a/M2/Macaulay2/d/parse.d +++ b/M2/Macaulay2/d/parse.d @@ -362,6 +362,7 @@ export atomicIntCell := {+ v:atomicField, hash:hash_t }; export Expr := ( CCcell or CCicell or + CCbcell or RRcell or RRicell or RRbcell or diff --git a/M2/Macaulay2/d/util.d b/M2/Macaulay2/d/util.d index 68a1a046624..62fa0fbaeaa 100644 --- a/M2/Macaulay2/d/util.d +++ b/M2/Macaulay2/d/util.d @@ -225,6 +225,7 @@ export toExpr(x:RRi):Expr := Expr(RRicell(x)); export toExpr(x:RRb,prec:ulong):Expr := Expr(toRRbcell(x, prec)); export toExpr(x:CC):Expr := Expr(CCcell(x)); export toExpr(x:CCi):Expr := Expr(CCicell(x)); +export toExpr(x:CCb,prec:ulong):Expr := Expr(toCCbcell(x, prec)); export toExpr(x:float):Expr := Expr(RRcell(toRR(x,ulong(24)))); export toExpr(x:double):Expr := Expr(RRcell(toRR(x,ulong(53)))); export toExpr(x:RawComputation):Expr := Expr(RawComputationCell(x)); diff --git a/M2/Macaulay2/m2/exports.m2 b/M2/Macaulay2/m2/exports.m2 index 1fb1263c24d..949fa4fe1ae 100644 --- a/M2/Macaulay2/m2/exports.m2 +++ b/M2/Macaulay2/m2/exports.m2 @@ -95,6 +95,7 @@ export { "Boxes", "CC", "CC'", + "CCb", "CCi", "CCi'", "CacheExampleOutput", @@ -1212,6 +1213,7 @@ export { "to", "toAbsolutePath", "toCC", + "toCCb", "toCCi", "toExternalString", "toField", From 79ccda80113ec7ecec412ff978fb074516a4ecc8 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 2 Jul 2025 11:42:11 -0500 Subject: [PATCH 071/691] RRb plus RR implemented --- M2/Macaulay2/d/actors.d | 3 +++ 1 file changed, 3 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index aa42cb825d7..aef83c1269e 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -71,6 +71,9 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr( RRbadd(x.v, toRRb(y.v, x.prec), x.prec), x.prec) + is y:RRcell do toExpr( + RRbadd(x.v, toRRb(y.v), x.prec), + x.prec) is y:RRbcell do ( prec := min(x.prec, y.prec); toExpr(RRbadd(x.v, y.v, prec), prec)) From 95dc1471f5fed5cd7bc1290481541ba8bd2109cc Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 2 Jul 2025 11:51:49 -0500 Subject: [PATCH 072/691] additions with RRb implemented --- M2/Macaulay2/d/actors.d | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index aef83c1269e..aecd9722e30 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -20,6 +20,9 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, ZZ, QQ, QQ is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RRi, RRi + is y:RRbcell do toExpr( -- # typical value: symbol +, ZZ, RRb, RRb + RRbadd(toRRb(x.v,y.prec), y.v, y.prec), + y.prec) is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CC, CC is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CCi, CCi is Error do rhs @@ -30,6 +33,9 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, QQ, QQ, QQ is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RRi, RRi + is y:RRbcell do toExpr( -- # typical value: symbol +, QQ, RRb, RRb + RRbadd(toRRb(x.v,y.prec), y.v, y.prec), + y.prec) is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CC, CC is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CCi, CCi is Error do rhs @@ -49,6 +55,9 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, QQ, RR is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, RR, RRi, RRi + is y:RRbcell do toExpr( -- # typical value: symbol +, RR, RRb, RRb + RRbadd(toRRb(x.v), y.v, y.prec), + y.prec) is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, CC, CC is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RR, CCi, CCi is Error do rhs @@ -65,16 +74,16 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( else binarymethod(lhs,rhs,PlusS)) is x:RRbcell do ( when rhs - is y:ZZcell do toExpr( + is y:ZZcell do toExpr( -- # typical value: symbol +, RRb, ZZ, RRb RRbadd(x.v, toRRb(y.v, x.prec), x.prec), x.prec) - is y:QQcell do toExpr( + is y:QQcell do toExpr( -- # typical value: symbol +, RRb, QQ, RRb RRbadd(x.v, toRRb(y.v, x.prec), x.prec), x.prec) - is y:RRcell do toExpr( + is y:RRcell do toExpr( -- # typical value: symbol +, RRb, RR, RRb RRbadd(x.v, toRRb(y.v), x.prec), x.prec) - is y:RRbcell do ( + is y:RRbcell do ( -- # typical value: symbol +, RRb, RRb, RRb prec := min(x.prec, y.prec); toExpr(RRbadd(x.v, y.v, prec), prec)) else binarymethod(lhs, rhs, PlusS)) From 55ced1e79b476afe7a631f40d2a65c91cb3495ce Mon Sep 17 00:00:00 2001 From: Andrew Tawfeek Date: Wed, 2 Jul 2025 11:55:08 -0500 Subject: [PATCH 073/691] midpoint for CCi --- M2/Macaulay2/d/actors4.d | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index f96f38dcac3..13404a571b1 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1530,14 +1530,16 @@ setupfun("left",leftRR); widthRR(e:Expr):Expr := ( when e is x:RRicell do toExpr(widthRR(x.v)) + is x:CCicell do else WrongArg("an interval")); setupfun("diameter",widthRR).Protected = false; -midpointRR(e:Expr):Expr := ( +midpoint0(e:Expr):Expr := ( when e is x:RRicell do toExpr(midpointRR(x.v)) - else WrongArg("an interval")); -setupfun("midpoint",midpointRR); + is x:CCicell do toExpr(toCC(midpointRR(realPart(x.v)),midpointRR(imaginaryPart(x.v)))) + else WrongArg("an interval or complex interval")); +setupfun("midpoint",midpoint0); isEmptyRRi(e:Expr):Expr := ( when e From e18ba01f662c2f8f9a8a9813df10bc7f7077c420 Mon Sep 17 00:00:00 2001 From: klee669 Date: Wed, 2 Jul 2025 12:00:14 -0500 Subject: [PATCH 074/691] (an empty interval) tag fixed --- M2/Macaulay2/d/actors4.d | 2 +- M2/Macaulay2/d/gmp.d | 1 + M2/Macaulay2/d/gmp1.d | 14 +++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index f96f38dcac3..cbe0b850069 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -993,7 +993,7 @@ tostringfun(e:Expr):Expr := ( is x:RRicell do toExpr(tostringRRi(x.v)) is x:RRbcell do toExpr(tostringRRb(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) - is x:CCicell do toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) + is x:CCicell do toExpr(tostringCCi(x.v))--toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index e89aba79505..32d8e2f6ea2 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -901,6 +901,7 @@ isnan0 (x:RRi) ::= Ccode(bool,"mpfi_nan_p(",x,")"); sign0(x:RR) ::= 0 != Ccode(int,"mpfr_signbit(",x,")"); sign0(x:RRi) ::= 0 != Ccode(int,"mpfi_is_strictly_neg(",x,")"); export isEmpty(x:RRi):bool := Ccode(bool,"mpfi_is_empty(",x,")"); +export isEmpty(x:CCi):bool := isEmpty(x.re) || isEmpty(x.im); exponent0(x:RR) ::= Ccode(long,"(long)mpfr_get_exp(",x,")"); -- sometimes int, sometimes long, see gmp.h for type mp_exp_t exponent0(x:RRi) ::= max(exponent0(rightRR(x)),exponent0(leftRR(x))); diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 9db1a6565f1..70f0169c07f 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -176,13 +176,25 @@ export tostringRRi(x:RRi):string := concatenate( )); tostringRRipointer = tostringRRi; +export tostringRRiforCCi(x:RRi):string := concatenate( + array(string)( + "[", + tostringRR(leftRR(x)), + ",", + tostringRR(rightRR(x)), + "]" + )); +--tostringRRiforCCipointer = tostringRRiforCCi; + + export tostringRRb(x:RRb):string := tostring(Ccode(charstar, "arb_get_str(", x, ", mpfr_get_str_ndigits(10, arb_bits(", x, ")), 0)")); export tostringCCi(x:CCi):string := ( if isZero(x.im) then tostringRRi(x.re) else if isZero(x.re) then concatenate(array(string)(tostringRRi(x.im),"*ii")) - else concatenate(array(string)(tostringRRi(x.re),"+",tostringRRi(x.im),"*ii")) + else if isEmpty(x) then concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii", " (an empty interval)")) + else concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii")) ); tostringCCipointer = tostringCCi; From 91ab7905b49acfa3e230e5d4310515e1e0c00d71 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 15:46:27 -0400 Subject: [PATCH 075/691] Add midpoint and radius/diameter for RRb --- M2/Macaulay2/d/actors4.d | 14 ++++++-------- M2/Macaulay2/d/ballarith.d | 10 ++++++++++ M2/Macaulay2/m2/reals.m2 | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index ddbc02c314c..66cc428fd83 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -993,12 +993,8 @@ tostringfun(e:Expr):Expr := ( is x:RRicell do toExpr(tostringRRi(x.v)) is x:RRbcell do toExpr(tostringRRb(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) -<<<<<<< HEAD is x:CCicell do toExpr(tostringCCi(x.v))--toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) -======= - is x:CCicell do toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) is x:CCbcell do toExpr("<>") ->>>>>>> 8545957e0e9c71b4fc68ff9a0fb76cbd60a7e0f6 is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") @@ -1553,15 +1549,17 @@ setupfun("left",leftRR); widthRR(e:Expr):Expr := ( when e is x:RRicell do toExpr(widthRR(x.v)) - is x:CCicell do - else WrongArg("an interval")); + is x:RRbcell do toExpr(2 * radius(x.v)) + -- is x:CCicell do + else WrongArg("an interval or ball")); setupfun("diameter",widthRR).Protected = false; midpoint0(e:Expr):Expr := ( when e is x:RRicell do toExpr(midpointRR(x.v)) - is x:CCicell do toExpr(toCC(midpointRR(realPart(x.v)),midpointRR(imaginaryPart(x.v)))) - else WrongArg("an interval or complex interval")); + is x:RRbcell do toExpr(midpoint(x.v, x.prec)) + is x:CCicell do toExpr(toCC(midpointRR(realPart(x.v)),midpointRR(imaginaryPart(x.v)))) + else WrongArg("an interval or ball")); setupfun("midpoint",midpoint0); isEmptyRRi(e:Expr):Expr := ( diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index aacfa1d6472..5441578b86a 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -78,6 +78,16 @@ moveToRRiandclear(x:RRb, prec:ulong):RRi := ( clear(x); r); +export midpoint(x:RRb, prec:ulong):RR := ( + y := newRRmutable(prec); + Ccode(void, "arf_get_mpfr(", y, ", arb_midref(", x, "), MPFR_RNDN)"); + moveToRRandclear(y)); + +export radius(x:RRb):RR := ( + y := Ccode(double, "mag_get_d(arb_radref(", x, "))"); + -- radius is a mag_t, which always has precision 30 + toRR(y, ulong(30))); + -- arithmetic export RRbadd(x:RRb, y:RRb, prec:ulong):RRb := ( z := newRRb(); diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 658fc1d3efe..37dd7666ff5 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -122,7 +122,7 @@ default InexactFieldFamily := R -> R_defaultPrecision diameter' = diameter diameter = method() -diameter RRi := diameter' +diameter RRi := diameter RRb := diameter' diameter CCi := diameter' -- lift and promote between real or complex rings From 148fd5a3efe7476a5a4ca3c71bfa98b1c7e96859 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 2 Jul 2025 15:59:56 -0400 Subject: [PATCH 076/691] Fix hash for RRb --- M2/Macaulay2/d/ballarith.d | 3 +++ M2/Macaulay2/d/basic.d | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 5441578b86a..c96a882c5c1 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -88,6 +88,9 @@ export radius(x:RRb):RR := ( -- radius is a mag_t, which always has precision 30 toRR(y, ulong(30))); +export hash(x:RRb, prec:ulong):hash_t := ( + 953 * hash(midpoint(x, prec)) + 277 * hash(radius(x))); + -- arithmetic export RRbadd(x:RRb, y:RRb, prec:ulong):RRb := ( z := newRRb(); diff --git a/M2/Macaulay2/d/basic.d b/M2/Macaulay2/d/basic.d index 64c8049467c..e30a5bae098 100644 --- a/M2/Macaulay2/d/basic.d +++ b/M2/Macaulay2/d/basic.d @@ -24,7 +24,7 @@ export hash(e:Expr):hash_t := ( is x:QQcell do hash(x.v) is x:RRcell do hash(x.v) is x:RRicell do hash(x.v) - is x:RRbcell do hash_t(6) + is x:RRbcell do hash(x.v, x.prec) is x:CCcell do hash(x.v) is x:CCicell do hash(x.v.re + x.v.im) is x:CCbcell do hash_t(7) From 1748532937548bf4b3cf2b3f7bf57784ce2be71e Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 3 Jul 2025 07:00:19 -0400 Subject: [PATCH 077/691] Add realPart/imaginaryPart for CCb --- M2/Macaulay2/d/actors2.dd | 6 ++++-- M2/Macaulay2/d/ballarith.d | 10 ++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors2.dd b/M2/Macaulay2/d/actors2.dd index 367aa2f4d96..56c890cddbb 100644 --- a/M2/Macaulay2/d/actors2.dd +++ b/M2/Macaulay2/d/actors2.dd @@ -713,7 +713,8 @@ realPart(e:Expr):Expr := ( is RRcell do e is RRicell do e is z:CCcell do toExpr(realPart(z.v)) - is z:CCicell do toExpr(realPart(z.v)) + is z:CCicell do toExpr(realPart(z.v)) + is z:CCbcell do toExpr(realPart(z.v), z.prec) is QQcell do e else WrongArg("a number")); setupfun("realPart0",realPart); @@ -724,7 +725,8 @@ imaginaryPart(e:Expr):Expr := ( is RRcell do zeroE is RRicell do zeroE is z:CCcell do toExpr(imaginaryPart(z.v)) - is z:CCicell do toExpr(imaginaryPart(z.v)) + is z:CCicell do toExpr(imaginaryPart(z.v)) + is z:CCbcell do toExpr(imaginaryPart(z.v), z.prec) is QQcell do zeroE else WrongArg("a number")); setupfun("imaginaryPart0",imaginaryPart); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index c96a882c5c1..098ca835ff3 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -265,6 +265,16 @@ moveToCCandclear(z:CCb, prec:ulong):CC := ( clear(z); r); +export realPart(x:CCb):RRb := ( + y := newRRb(); + Ccode(void, "acb_get_real(", y, ", ", x, ")"); + y); + +export imaginaryPart(x:CCb):RRb := ( + y := newRRb(); + Ccode(void, "acb_get_imag(", y, ", ", x, ")"); + y); + export eint(z:CC):CC := ( w := toCCb(z); r := newCCb(); From 4a6a5b086dea1c4315a3a637812e3087d92a61c1 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 3 Jul 2025 07:12:23 -0400 Subject: [PATCH 078/691] Add proper string function for CCb Also move RRb's string function to ballarith.d for consistency --- M2/Macaulay2/d/actors4.d | 2 +- M2/Macaulay2/d/ballarith.d | 6 ++++++ M2/Macaulay2/d/gmp1.d | 4 ---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 66cc428fd83..d4cc2aab8b5 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -994,7 +994,7 @@ tostringfun(e:Expr):Expr := ( is x:RRbcell do toExpr(tostringRRb(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) is x:CCicell do toExpr(tostringCCi(x.v))--toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) - is x:CCbcell do toExpr("<>") + is x:CCbcell do toExpr(tostringCCb(x.v)) is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 098ca835ff3..0d7a589bf86 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -91,6 +91,9 @@ export radius(x:RRb):RR := ( export hash(x:RRb, prec:ulong):hash_t := ( 953 * hash(midpoint(x, prec)) + 277 * hash(radius(x))); +export tostringRRb(x:RRb):string := tostring(Ccode(charstar, + "arb_get_str(", x, ", mpfr_get_str_ndigits(10, arb_bits(", x, ")), 0)")); + -- arithmetic export RRbadd(x:RRb, y:RRb, prec:ulong):RRb := ( z := newRRb(); @@ -275,6 +278,9 @@ export imaginaryPart(x:CCb):RRb := ( Ccode(void, "acb_get_imag(", y, ", ", x, ")"); y); +export tostringCCb(x:CCb):string := ( + tostringRRb(realPart(x)) + "+" + tostringRRb(imaginaryPart(x)) + "*ii"); + export eint(z:CC):CC := ( w := toCCb(z); r := newCCb(); diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 70f0169c07f..7f5495e03cd 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -186,10 +186,6 @@ export tostringRRiforCCi(x:RRi):string := concatenate( )); --tostringRRiforCCipointer = tostringRRiforCCi; - -export tostringRRb(x:RRb):string := tostring(Ccode(charstar, - "arb_get_str(", x, ", mpfr_get_str_ndigits(10, arb_bits(", x, ")), 0)")); - export tostringCCi(x:CCi):string := ( if isZero(x.im) then tostringRRi(x.re) else if isZero(x.re) then concatenate(array(string)(tostringRRi(x.im),"*ii")) From 8bb01930522451228401153c7b5fda082fe254b6 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 3 Jul 2025 07:13:22 -0400 Subject: [PATCH 079/691] Add hash function for CCb --- M2/Macaulay2/d/ballarith.d | 3 +++ M2/Macaulay2/d/basic.d | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 0d7a589bf86..3888d63b3da 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -278,6 +278,9 @@ export imaginaryPart(x:CCb):RRb := ( Ccode(void, "acb_get_imag(", y, ", ", x, ")"); y); +export hash(x:CCb, prec:ulong):hash_t := ( + 761 * hash(realPart(x), prec) + 743 * hash(imaginaryPart(x), prec)); + export tostringCCb(x:CCb):string := ( tostringRRb(realPart(x)) + "+" + tostringRRb(imaginaryPart(x)) + "*ii"); diff --git a/M2/Macaulay2/d/basic.d b/M2/Macaulay2/d/basic.d index e30a5bae098..fb921825208 100644 --- a/M2/Macaulay2/d/basic.d +++ b/M2/Macaulay2/d/basic.d @@ -27,7 +27,7 @@ export hash(e:Expr):hash_t := ( is x:RRbcell do hash(x.v, x.prec) is x:CCcell do hash(x.v) is x:CCicell do hash(x.v.re + x.v.im) - is x:CCbcell do hash_t(7) + is x:CCbcell do hash(x.v, x.prec) is x:Sequence do ( -- the numbers here are the same as in binary lookup() in objects.d!! h := hash_t(27449); From 04b99fb82c2e1c5950e2f3a579d68986caea34bf Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 3 Jul 2025 07:40:35 -0400 Subject: [PATCH 080/691] Add more CCb constructors --- M2/Macaulay2/d/actors4.d | 8 ++++++++ M2/Macaulay2/d/ballarith.d | 30 ++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index d4cc2aab8b5..a283a72663f 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1519,6 +1519,14 @@ setupfun("toCCi",toCCi); toCCb(e:Expr):Expr := ( when e + -- # typical value: toCCb, ZZ, CCb + is x:ZZcell do toExpr(toCCb(x.v, defaultPrecision), defaultPrecision) + -- # typical value: toCCb, QQ, CCb + is x:QQcell do toExpr(toCCb(x.v, defaultPrecision), defaultPrecision) + -- # typical value: toCCb, RR, CCb + is x:RRcell do toExpr(toCCb(x.v), precision(x.v)) + -- # typical value: toCCb, RRb, CCb + is x:RRbcell do toExpr(toCCb(x.v), x.prec) -- # typical value: toCCb, CC, CCb is x:CCcell do toExpr(toCCb(x.v), precision(x.v)) is a:Sequence do ( diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 3888d63b3da..6a444c5504e 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -56,10 +56,10 @@ export toRRb(x:RR, y:RR, prec:ulong):RRb := ( export toRRb(x:RR):RRb := toRRb(x, x, precision(x)); export toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); export toRRb(x:ZZ, prec:ulong):RRb := ( - y := toRR(x); + y := toRR(x, prec); toRRb(y, y, prec)); export toRRb(x:QQ, prec:ulong):RRb := ( - y := toRR(x); + y := toRR(x, prec); toRRb(y, y, prec)); toRR(x:RRb, prec:ulong):RR := ( @@ -258,6 +258,32 @@ export toCCb(z:CC):CCb := ( clear(y); w); +export toCCb(x:RRb):CCb := ( + y := newRRb(); + Ccode(RRb, "arb_zero(", y, ")"); + z := toCCb(x, y); + clear(y); + z); + +export toCCb(x:ZZ, prec:ulong):CCb := ( + y := toRRb(x, prec); + z := toCCb(y); + clear(y); + z); + +export toCCb(x:QQ, prec:ulong):CCb := ( + y := toRRb(x, prec); + z := toCCb(y); + clear(y); + z); + +export toCCb(x:RR):CCb := ( + y := toRRb(x); + z := toCCb(y); + clear(y); + z); + + toCC(z:CCb, prec:ulong):CC := ( x := Ccode(RRb, "acb_realref(", z, ")"); y := Ccode(RRb, "acb_imagref(", z, ")"); From eb660db63d92dd4b04d08fd6b4c8dbea56e51c75 Mon Sep 17 00:00:00 2001 From: klee669 Date: Thu, 3 Jul 2025 10:59:19 -0500 Subject: [PATCH 081/691] CCi as a raw ring element --- M2/Macaulay2/m2/reals.m2 | 1 + 1 file changed, 1 insertion(+) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 37dd7666ff5..6a2ed5dd8e4 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -248,6 +248,7 @@ ring CCi := x -> new ComplexIntervalField of CCi' from precision x new RR from RawRingElement := (RRR,x) -> ( assert( RRR === RR ); rawToRR x) new RRi from RawRingElement := (RRRi,x) -> ( assert( RRRi === RRi ); rawToRRi x) new CC from RawRingElement := (CCC,x) -> ( assert( CCC === CC ); rawToCC x) +new CCi from RawRingElement := (CCCi,x) -> ( assert( RRRi === RRi ); rawToCCi x) -- arithmetic operations From 0b052617d2fbfaac386a41781c947a2fdccfa014 Mon Sep 17 00:00:00 2001 From: Andrew Tawfeek Date: Thu, 3 Jul 2025 11:34:46 -0500 Subject: [PATCH 082/691] midpoint of CCi --- M2/Macaulay2/d/actors4.d | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 0c209e8a79f..17371953ee9 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1546,12 +1546,12 @@ leftRR(e:Expr):Expr := ( else WrongArg("an interval")); setupfun("left",leftRR); -widthRR(e:Expr):Expr := ( +width0(e:Expr):Expr := ( when e is x:RRicell do toExpr(widthRR(x.v)) - is x:CCicell do - else WrongArg("an interval")); -setupfun("diameter",widthRR).Protected = false; + is x:CCicell do toExpr(sqrt(widthRR(realPart(x.v))*widthRR(realPart(x.v))+widthRR(imaginaryPart(x.v))*widthRR(imaginaryPart(x.v)))) + else WrongArg("an interval or complex interval")); +setupfun("diameter",width0).Protected = false; midpoint0(e:Expr):Expr := ( when e From 22e3df16e54c92155b16f1bcc1d35df060cf39fb Mon Sep 17 00:00:00 2001 From: klee669 Date: Thu, 3 Jul 2025 11:35:54 -0500 Subject: [PATCH 083/691] intersect function is added --- M2/Macaulay2/m2/intervals.m2 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index f61e78d4e04..b03e77b2864 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -131,6 +131,16 @@ intersect(RRi, RRi) := RRi => { Precision => -1 } >> opts -> (N, M) -> ( if opts.Precision < 0 then intersectRRi(N,M) else intersectRRi(opts.Precision,N,M)) +intersect CCi := CCi => { Precision => -1 } >> opts -> identity +intersect(CCi, RRi) := CCi => { Precision => -1 } >> opts -> (N, M) -> ( + if opts.Precision < 0 then interval(intersectRRi(realPart N,M), imaginaryPart N) + else interval(intersectRRi(opts.Precision,realPart N,M), imaginaryPart N)) +intersect(RRi, CCi) := CCi => { Precision => -1 } >> opts -> (N, M) -> intersect(M, N) +intersect(CCi, CCi) := CCi => { Precision => -1 } >> opts -> (N, M) -> ( + if opts.Precision < 0 then interval(intersectRRi(realPart N,realPart M), intersectRRi(imaginaryPart N, imaginaryPart M)) + else interval(intersectRRi(opts.Precision,realPart N, realPart M), intersectRRi(opts.Precision, imaginaryPart N, imaginaryPart M))) + + isEmpty RRi := Boolean => isEmptyRRi isEmpty CCi := x -> isEmptyRRi realPart x or isEmptyRRi imaginaryPart x From 832c97dbd83e8b6733621523d10bdd49d50efe74 Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Thu, 3 Jul 2025 11:43:51 -0500 Subject: [PATCH 084/691] isMember for CCi --- M2/Macaulay2/m2/intervals.m2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index f61e78d4e04..c78d82cbd27 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -125,6 +125,9 @@ isMember(A,RRi) := (N,M) -> subsetRRi(N,M); isSubset(RRi,RRi) := (N,M) -> subsetRRi(N,M); +--for A in {ZZ,QQ,RR} do +--isMember(A,CCi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N,imaginaryPart M); + -- intersect is an associative binary method, so it works on arbitrary lists and sequences intersect RRi := RRi => { Precision => -1 } >> opts -> identity intersect(RRi, RRi) := RRi => { Precision => -1 } >> opts -> (N, M) -> ( From 62fc4c978aef18e1ea4ad35865cab73addc8d819 Mon Sep 17 00:00:00 2001 From: klee669 Date: Thu, 3 Jul 2025 11:46:45 -0500 Subject: [PATCH 085/691] revert changes in reals.m2 --- M2/Macaulay2/m2/intervals.m2 | 9 +++++++++ M2/Macaulay2/m2/reals.m2 | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index b03e77b2864..3f211cf829e 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -17,6 +17,15 @@ interval(A,B) := opts -> (N,M) -> ( if opts.Precision < 0 then toRRi(N,M) else toRRi(opts.Precision,N,M)) +for A in {ZZ,QQ,RR} do +interval(A,RRi) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(interval N, M) + else toCCi(opts.Precision, interval N, M)) +for A in {ZZ,QQ,RR} do +interval(RRi,A) := opts -> (N,M) -> ( + if opts.Precision < 0 then toCCi(N, interval M) + else toCCi(opts.Precision, N, interval M)) + interval(RRi,RRi) := opts -> (N,M) -> ( if opts.Precision < 0 then toCCi(N,M) else toCCi(opts.Precision,N,M)) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 6a2ed5dd8e4..3660699e7d1 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -248,7 +248,7 @@ ring CCi := x -> new ComplexIntervalField of CCi' from precision x new RR from RawRingElement := (RRR,x) -> ( assert( RRR === RR ); rawToRR x) new RRi from RawRingElement := (RRRi,x) -> ( assert( RRRi === RRi ); rawToRRi x) new CC from RawRingElement := (CCC,x) -> ( assert( CCC === CC ); rawToCC x) -new CCi from RawRingElement := (CCCi,x) -> ( assert( RRRi === RRi ); rawToCCi x) +--new CCi from RawRingElement := (CCCi,x) -> ( assert( RRRi === RRi ); rawToCCi x) -- arithmetic operations From e5828013bd317f83247f6f189f4b0a6eb71789f5 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 3 Jul 2025 12:05:26 -0400 Subject: [PATCH 086/691] Use unsigned longs for precision --- M2/Macaulay2/d/interface.dd | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/M2/Macaulay2/d/interface.dd b/M2/Macaulay2/d/interface.dd index 042cbf228b8..b25a030e876 100644 --- a/M2/Macaulay2/d/interface.dd +++ b/M2/Macaulay2/d/interface.dd @@ -71,19 +71,19 @@ export rawRandomQQ(e:Expr):Expr := ( setupfun("rawRandomQQ",rawRandomQQ); export rawRandomRRUniform(e:Expr):Expr := ( when e - is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallInteger() + is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallUInteger() else toExpr(Ccode(RR, "rawRandomRRUniform(", toULong(prec.v), ")")) else WrongArgZZ()); setupfun("rawRandomRRUniform",rawRandomRRUniform); export rawRandomRRNormal(e:Expr):Expr := ( when e - is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallInteger() + is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallUInteger() else toExpr(Ccode(RR, "rawRandomRRNormal(", toULong(prec.v), ")")) else WrongArgZZ()); setupfun("rawRandomRRNormal",rawRandomRRNormal); export rawRandomCC(e:Expr):Expr := ( when e - is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallInteger() + is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallUInteger() else toExpr(Ccode(CC, "rawRandomCC(", toULong(prec.v), ")")) else WrongArgZZ()); setupfun("rawRandomCC",rawRandomCC); @@ -480,20 +480,20 @@ export rawConwayPolynomial(e:Expr):Expr := ( setupfun("rawConwayPolynomial",rawConwayPolynomial); export rawRRi(e:Expr):Expr := ( - when e is prec:ZZcell do if !isInt(prec) then WrongArgSmallInteger(1) - else toExpr(Ccode(RawRingOrNull, "IM2_Ring_RRi(",toInt(prec),")" )) + when e is prec:ZZcell do if !isULong(prec) then WrongArgSmallUInteger(1) + else toExpr(Ccode(RawRingOrNull, "IM2_Ring_RRi(",toULong(prec),")" )) else WrongArgZZ(1)); setupfun("rawRRi",rawRRi); export rawRR(e:Expr):Expr := ( - when e is prec:ZZcell do if !isInt(prec) then WrongArgSmallInteger(1) - else toExpr(Ccode(RawRingOrNull, "IM2_Ring_RRR(",toInt(prec),")" )) + when e is prec:ZZcell do if !isULong(prec) then WrongArgSmallUInteger(1) + else toExpr(Ccode(RawRingOrNull, "IM2_Ring_RRR(",toULong(prec),")" )) else WrongArgZZ(1)); setupfun("rawRR",rawRR); export rawCC(e:Expr):Expr := ( - when e is prec:ZZcell do if !isInt(prec) then WrongArgSmallInteger(1) - else toExpr(Ccode(RawRingOrNull, "IM2_Ring_CCC(",toInt(prec),")" )) + when e is prec:ZZcell do if !isULong(prec) then WrongArgSmallUInteger(1) + else toExpr(Ccode(RawRingOrNull, "IM2_Ring_CCC(",toULong(prec),")" )) else WrongArgZZ(1)); setupfun("rawCC",rawCC); From bb37436212ee2bee2bd77dd578de0c052e12d8ad Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Thu, 3 Jul 2025 12:02:56 -0500 Subject: [PATCH 087/691] isSubset and isMember for CCi implemented --- M2/Macaulay2/m2/intervals.m2 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 4f5b42cb2fa..34f047ce610 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -133,9 +133,13 @@ for A in {ZZ,QQ,RR} do isMember(A,RRi) := (N,M) -> subsetRRi(N,M); isSubset(RRi,RRi) := (N,M) -> subsetRRi(N,M); +isSubset(CCi,RRi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N,imaginaryPart M); ---for A in {ZZ,QQ,RR} do ---isMember(A,CCi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N,imaginaryPart M); +for A in {ZZ,QQ,RR} do +isMember(A,CCi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N,imaginaryPart M); + +for A in {RRi,CCi} do +isSubset(A,CCi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N,imaginaryPart M); -- intersect is an associative binary method, so it works on arbitrary lists and sequences intersect RRi := RRi => { Precision => -1 } >> opts -> identity From 4b99131b9f7da367cdbfc367388abdf4ad08e227 Mon Sep 17 00:00:00 2001 From: klee669 Date: Thu, 3 Jul 2025 15:56:37 -0500 Subject: [PATCH 088/691] basic Documents are added + minor fixes --- M2/Macaulay2/m2/intervals.m2 | 14 +++--- M2/Macaulay2/m2/reals.m2 | 3 +- .../packages/Macaulay2Doc/doc_intervals.m2 | 36 +++++++++++++++ .../packages/Macaulay2Doc/ov_rings.m2 | 46 +++++++++++++++++++ 4 files changed, 92 insertions(+), 7 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 34f047ce610..a17c2674e9d 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -87,12 +87,12 @@ spanCCi = method(Options => {Precision => -1}) for A in {ZZ,QQ,RR,RRi} do ( spanCCi(CC,A) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),toRRi imaginaryPart N) - else toCCi(opts.Precision,spanRRi(realPart N,M),toRRi imaginaryPart N));--toRRi(opts.Precision,min(left N,M),max(right N,M))); + if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)) + else toCCi(opts.Precision,spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)));--toRRi(opts.Precision,min(left N,M),max(right N,M))); spanCCi(A,CC) := opts -> (N,M) -> spanCCi(opts,M,N); spanCCi(CCi,A) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),imaginaryPart N) - else toCCi(opts.Precision,spanRRi(realPart N,M),imaginaryPart N));--toRRi(opts.Precision,min(left N,M),max(right N,M))); + if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)) + else toCCi(opts.Precision,spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)));--toRRi(opts.Precision,min(left N,M),max(right N,M))); spanCCi(A,CCi) := opts -> (N,M) -> spanCCi(opts,M,N)) spanCCi(CC,CC) := opts -> (N,M) -> ( @@ -123,14 +123,16 @@ span ZZ := span QQ := span RR := {Precision => -1} >> opts -> N -> interval(N,op span RRi := {Precision => -1} >> opts -> N -> interval(left N,right N,opts) -span CC := {Precision => -1} >> opts -> N -> interval(realPart N,imaginaryPart N,opts) +span CC := {Precision => -1} >> opts -> N -> interval(toRRi realPart N, toRRi imaginaryPart N,opts) -span CCi := {Precision => -1} >> opts -> N -> interval(realPart N,imaginaryPart N,opts) +span CCi := {Precision => -1} >> opts -> N -> interval(toRRi realPart N, toRRi imaginaryPart N,opts) span List := span Sequence := {Precision => -1} >> opts -> L -> fold(L, (N, M) -> spanner(N, M, opts)) for A in {ZZ,QQ,RR} do isMember(A,RRi) := (N,M) -> subsetRRi(N,M); +isMember(CC,CCi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N, imaginaryPart M); +isMember(CC,RRi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N, imaginaryPart M); isSubset(RRi,RRi) := (N,M) -> subsetRRi(N,M); isSubset(CCi,RRi) := (N,M) -> subsetRRi(realPart N,realPart M) and subsetRRi(imaginaryPart N,imaginaryPart M); diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 3660699e7d1..12aa1cde290 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -310,7 +310,7 @@ random QQ := QQ => opts -> x -> rawFareyApproximation( -- algebraic operations and functions -RR.isBasic = CC.isBasic = RRi.isBasic = true +RR.isBasic = CC.isBasic = RRi.isBasic = CCi.isBasic = true Thing ** InexactFieldFamily := (X,T) -> X ** default T @@ -490,6 +490,7 @@ InexactNumber#AfterPrint = x -> (class x," (of precision ",precision x,")") isReal = method() isReal RRi := isReal RR := isReal QQ := isReal ZZ := x -> true isReal CC := z -> imaginaryPart z == 0 +isReal CCi := z -> imaginaryPart z == 0 isReal Constant := isReal @@ numeric isReal InfiniteNumber := x -> false diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 04bd35307d9..cda24ea72b5 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -108,6 +108,7 @@ Key (isMember, QQ, RRi) (isMember, ZZ, RRi) (isMember, RR, RRi) + (isMember, QQ, CCi) Headline membership test in an interval Usage @@ -127,6 +128,7 @@ SeeAlso doc /// Key (isEmpty, RRi) + (isEmpty, CCi) Headline empty test for an interval Usage @@ -145,6 +147,8 @@ SeeAlso doc /// Key (isSubset, RRi, RRi) + (isSubset, RRi, CCi) + (isSubset, CCi, CCi) Headline subset test for intervals Usage @@ -237,6 +241,7 @@ Key (interval,QQ,RR) (interval,QQ,ZZ) (interval,RR) + (interval,RR,CC) (interval,RR,QQ) (interval,RR,RR) (interval,RR,ZZ) @@ -244,6 +249,11 @@ Key (interval,ZZ,QQ) (interval,ZZ,RR) (interval,ZZ,ZZ) + (interval,RRi,RRi) + (interval,CC) + (interval,CC,RR) + (interval,CC,CC) + (interval,CCi) [interval,Precision] Headline construct an interval @@ -320,3 +330,29 @@ SeeAlso interval toRRi /// + +doc /// +Key + toCCi +Headline + construct an interval +Usage + I = toCCi(n) + I = toCCi(re,im) + I = toCCi(prec,re,im) +Inputs + n:CC + re:RRi + im:RRi + prec:ZZ +Outputs + I:CCi +Description + Text + Returns an interval as small as possible containing {\tt n} or from {\tt l} to {\tt r}. Note that if {\tt l} is to the right of {\tt r}, the constructed interval is empty. This is a more low-level function and @TO interval@ or span should be used instead. +SeeAlso + (span, List) + (span, Sequence) + interval +/// + diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index 1c185b872b2..f99f09597e2 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -52,6 +52,7 @@ document { TO "RR", TO "RRi", TO "CC", + TO "CCi", }, "The names of some of these rings are double letters so the corresponding symbols with single letters are preserved for use as variables.", @@ -106,6 +107,7 @@ document { TO "RR", TO "RRi", TO "CC", + TO "CCi", } } @@ -484,6 +486,50 @@ document { }, } +undocumented {"CCi_*"} + +document { + Key => CCi, + Headline => "the class of all complex intervals", + "A real interval is entered as a pair of real numbers to the interval function. It is stored internally as an arbitrary precision interval using the ", TO "MPFI", " library.", + EXAMPLE "interval(interval(3.1415,3.1416), interval(2.7182,2.7183))", + "The precision is measured in bits, is visible in the ring displayed on + the second of each pair of output lines, and can be recovered using ", TO "precision", ".", + EXAMPLE "precision interval(interval(3.1415,3.1416), interval(2.7182,2.7183))", +-- "For complex intervals, the functions ", TO "class", " and ", TO "ring", " yield different +-- results. That allows numbers of various precisions +-- to be used without creating a new ring for each precision.", + EXAMPLE {"class interval(interval(3.1,3.5),interval(1.1,1.2))"}, + "The precision can be specified on input by specifying the precision of both input ", TO "CC", " numbers.", + "Alternatively, the precision can be specified by including the option ", TT "Precision", ".", + EXAMPLE {"interval(interval(2.5p1000,3.2p100),interval(2.3,3.1,Precision=>200))"}, + "Intervals can also be created using ", TO (span,Sequence), " to create the smallest interval containing the inputs.", + EXAMPLE {"span(2+3*ii,Precision=>100)","span(2,3*ii,interval(interval(-1.5,-0.5),interval(3,3.1)),73)"}, + "Operations using intervals are computed as sets so that the resulting intervals contain all possible outputs from pairs of points in input intervals.", + EXAMPLE {" (I, J, K) = (interval(interval(.5,.8),interval(.6,.9)), interval(interval(.54,.78),interval(.65,.89)), interval(interval(.45,.6),interval(.3,.78))); + I + J + I - J + I * K + I / K + I ^ 3 + 2 * I + (2+3*ii) * I"}, + SeeAlso => {RRi, toCCi, precision, interval, (span,Sequence), (span,List)}, + Subnodes => { + TO toCCi, +-* TO interval, +-- TO diameter, + TO midpoint, + TO intersect, + TO (isMember, QQ, CCi), + TO (isEmpty, CCi), + TO (isSubset, RRi,CCi), + TO span, -- TODO: perhaps this should be shared + TO (span, List), + TO (span, Sequence),*- + }, + } + document { Key => "integers modulo a prime", "Create the ring of integers modulo a prime number ", TT "p", " as follows.", From c1960f45818b41ebf5e8b1537c49a89970bc04e4 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Fri, 4 Jul 2025 09:24:34 -0500 Subject: [PATCH 089/691] Intervals aring for Anton --- M2/Macaulay2/d/gmp-old.d | 2973 ++++++++++++++++++++++ M2/Macaulay2/d/gmp.d | 22 +- M2/Macaulay2/d/interface.dd | 14 + M2/Macaulay2/e/CMakeLists.txt | 3 +- M2/Macaulay2/e/Makefile.files | 3 +- M2/Macaulay2/e/aring-CCi.cpp | 35 + M2/Macaulay2/e/aring-CCi.hpp | 583 +++++ M2/Macaulay2/e/aring-RRi.hpp | 5 +- M2/Macaulay2/e/aring-glue.hpp | 43 + M2/Macaulay2/e/aring-translate.hpp | 94 +- M2/Macaulay2/e/aring.hpp | 3 +- M2/Macaulay2/e/interface/gmp-util.h | 23 + M2/Macaulay2/e/interface/ring.cpp | 7 + M2/Macaulay2/e/interface/ring.h | 3 + M2/Macaulay2/e/interface/ringelement.cpp | 103 +- M2/Macaulay2/e/interface/ringelement.h | 4 + M2/Macaulay2/e/poly.cpp | 12 + M2/Macaulay2/e/poly.hpp | 1 + M2/Macaulay2/e/ring.cpp | 6 + M2/Macaulay2/e/ring.hpp | 3 + M2/Macaulay2/e/ringelem.hpp | 11 + M2/Macaulay2/m2/reals.m2 | 11 +- 22 files changed, 3940 insertions(+), 22 deletions(-) create mode 100644 M2/Macaulay2/d/gmp-old.d create mode 100644 M2/Macaulay2/e/aring-CCi.cpp create mode 100644 M2/Macaulay2/e/aring-CCi.hpp diff --git a/M2/Macaulay2/d/gmp-old.d b/M2/Macaulay2/d/gmp-old.d new file mode 100644 index 00000000000..e89aba79505 --- /dev/null +++ b/M2/Macaulay2/d/gmp-old.d @@ -0,0 +1,2973 @@ +--This file contains gmp declarations and elementary functions. +--Functions in this file should not need to make calls to stdio. + +use arithmetic; +use stdiop0; + +declarations " + #include +"; + +header " + #include \"gmp_aux.h\" + #include +"; + +-- We introduce two types of big gmp-type integers here. One type is mutable, and the vector of limbs gets +-- allocated with the standard memory allocator used by libgmp when we use +-- gmp routines to create the integers. The other type is immutable, and the limbs are allocated with libgc +-- by us in final step after the computation. The types ZZmutable and ZZ are distinct in the D language, so +-- neither one can be used as the other, but the underlying pointer types are the same, except that mpz_srcptr +-- is const, so an mpz_ptr can be used as an mpz_srcptr, perhaps mistakenly. +export ZZmutable := Pointer "mpz_ptr"; + +export ZZ := Pointer "mpz_srcptr"; + +export ZZorNull := ZZ or null; + +export ZZcell := {+v:ZZ}; + +export ZZpair := {a:ZZ,b:ZZ}; + +export ZZpairOrNull := ZZpair or null; + +export QQmutable := Pointer "mpq_ptr"; + +export QQ := Pointer "mpq_srcptr"; + +export QQorNull := QQ or null; + +export QQcell := {+v:QQ}; + +export RR := Pointer "mpfr_srcptr"; + +export RRorNull := RR or null; + +export RRcell := {+v:RR}; + +export RRimutable := Pointer "mpfi_ptr"; + +export RRi := Pointer "mpfi_srcptr"; +export leftRR(x:RRi):RR := Ccode( RR, "&", x, "->left" ); +export rightRR(x:RRi):RR := Ccode( RR, "&", x, "->right" ); + +export RRiorNull := RRi or null; + +export RRicell := {+v:RRi}; + +export RRmutable := Pointer "mpfr_ptr"; + +export CCmutable := { re:RRmutable, im:RRmutable }; + +export CC := { re:RR, im:RR }; + +export CCorNull := CC or null; + +export CCcell := {+v:CC}; + +export CCimutable := { re:RRimutable, im:RRimutable }; + +export CCi := { re:RRi, im:RRi }; + +export CCiorNull := CCi or null; + +export CCicell := {+v:CCi}; + +dummy(x:RR):string := ""; +dummyi(x:RRi):string := ""; -- Added for MPFI +dummyCCi(x:CCi):string := ""; -- Added for MPFI + +export tostringRRpointer := dummy; +export tostringRRipointer := dummyi; -- Added for MPFI +export tostringCCipointer := dummyCCi; -- Added for MPFI +dummy(x:CC):string := ""; + +export tonetCCpointer := dummy; + +export tonetCCparenpointer := dummy; + +dummy(x:CCi):string := ""; + +export tonetCCipointer := dummy; + +export tonetCCiparenpointer := dummy; + +export min(x:int,y:int):int := if x= 8") then int64_t(toLong(x)) + else ( + rop := int64_t(0); + Ccode(void, "mpz_export(&", rop, ", NULL, 1, 8, 0, 0, ", x, ")"); + if isNegative0(x) then -rop else rop)); +export toInt64(x:ZZcell):int64_t := toInt64(x.v); + +export toUInt64(x:ZZ):uint64_t := ( + if Ccode(bool, "sizeof(long) >= 8") then uint64_t(toULong(x)) + else ( + rop := uint64_t(0); + Ccode(void, "mpz_export(&", rop, ", NULL, 1, 8, 0, 0, ", x, ")"); + rop)); +export toUInt64(x:ZZcell):uint64_t := toUInt64(x.v); + +export minprec := Ccode(ulong,"MPFR_PREC_MIN"); + +export maxprec := Ccode(ulong,"MPFR_PREC_MAX"); + +export hash(x:ZZ):hash_t := ( + if isInt(x) then hash_t(0x7fffffff & toInt(x)) + else Ccode(hash_t, "mpz_hash(", -- see gmp_aux.c for this function + x, ")")); + +getstr(str:charstarOrNull, base:int, x:ZZ) ::= Ccode(charstarOrNull, "mpz_get_str(", str, ",", base, ",", x, ")" ); + +init(x:ZZmutable) ::= Ccode( ZZmutable, "(mpz_init(", x, "),",x,")" ); + +export newZZmutable():ZZmutable := init(GCmalloc(ZZmutable)); + +export clear(x:ZZmutable) ::= Ccode( void, "mpz_clear(", x, ")" ); + +init(x:QQmutable) ::= Ccode( QQmutable, "(mpq_init(", x, "),",x,")" ); + +export newQQmutable():QQmutable := init(GCmalloc(QQmutable)); + +clear(x:QQmutable) ::= Ccode( void, "mpq_clear(", x, ")" ); + +init(x:RRmutable,prec:ulong):RRmutable := ( + if prec < minprec then prec = minprec else if prec > maxprec then prec = maxprec; + Ccode( RRmutable, "(mpfr_init2(", x, ",(mpfr_prec_t)",prec,"),",x,")" ) + ); + +init(x:RRimutable,prec:ulong):RRimutable := ( + if prec < minprec then prec = minprec else if prec > maxprec then prec = maxprec; + Ccode( RRimutable, "(mpfi_init2(", x, ",(mpfr_prec_t)",prec,"),",x,")" ) + ); + +export newRRmutable(prec:ulong):RRmutable := init(GCmalloc(RRmutable),prec); + +export newRRimutable(prec:ulong):RRimutable := init(GCmalloc(RRimutable),prec); + +clear(x:RRmutable) ::= Ccode( void, "mpfr_clear(", x, ")" ); + +clear(x:RRimutable) ::= Ccode( void, "mpfi_clear(", x, ")" ); + +clear(z:CCmutable):void := ( clear(z.re); clear(z.im); ); + +clear(z:CCimutable):void := (clear(z.re);clear(z.im);); + +export moveToZZ(z:ZZmutable):ZZ := ( + y := GCmalloc(ZZmutable); + Ccode(void, " + int s = z->_mp_size, ss = s>=0 ? s : -s; + mp_limb_t *p = (mp_limb_t *)getmem_atomic(ss * sizeof(mp_limb_t)); + memcpy(p,z->_mp_d,ss*sizeof(mp_limb_t)); + ",y,"->_mp_alloc = ss, ",y,"->_mp_size = s, ",y,"->_mp_d = p; + "); + Ccode(ZZ,y)); + +export moveToZZandclear(z:ZZmutable):ZZ := ( + w := moveToZZ(z); + clear(z); + w); + +export moveToRR(z:RRmutable):RR := ( + y := GCmalloc(RRmutable); + Ccode(void, " + int limb_size = (",z,"->_mpfr_prec - 1) / GMP_NUMB_BITS + 1; + mp_limb_t *p = (mp_limb_t*) getmem_atomic(limb_size * sizeof(mp_limb_t)); + memcpy(p, ",z,"->_mpfr_d, limb_size * sizeof(mp_limb_t)); + ",y,"->_mpfr_prec = ",z,"->_mpfr_prec; + ",y,"->_mpfr_sign = ",z,"->_mpfr_sign; + ",y,"->_mpfr_exp = ",z,"->_mpfr_exp; + ",y,"->_mpfr_d = p; + "); + Ccode(RR,y) + ); + +export moveToRRi(z:RRimutable):RRi := ( + y := GCmalloc(RRimutable); + + -- left + Ccode(void, " + int limb_size = (",z,"->left._mpfr_prec - 1) / GMP_NUMB_BITS + 1; + mp_limb_t *p = (mp_limb_t*) getmem_atomic(limb_size * sizeof(mp_limb_t)); + memcpy(p, ",z,"->left._mpfr_d, limb_size * sizeof(mp_limb_t)); + ",y,"->left._mpfr_prec = ",z,"->left._mpfr_prec; + ",y,"->left._mpfr_sign = ",z,"->left._mpfr_sign; + ",y,"->left._mpfr_exp = ",z,"->left._mpfr_exp; + ",y,"->left._mpfr_d = p; + "); + + -- right + Ccode(void, " + limb_size = (",z,"->right._mpfr_prec - 1) / GMP_NUMB_BITS + 1; + p = (mp_limb_t*) getmem_atomic(limb_size * sizeof(mp_limb_t)); + memcpy(p, ",z,"->right._mpfr_d, limb_size * sizeof(mp_limb_t)); + ",y,"->right._mpfr_prec = ",z,"->right._mpfr_prec; + ",y,"->right._mpfr_sign = ",z,"->right._mpfr_sign; + ",y,"->right._mpfr_exp = ",z,"->right._mpfr_exp; + ",y,"->right._mpfr_d = p; + "); + + Ccode(RRi,y) + ); + +export moveToRRandclear(z:RRmutable):RR := ( + w := moveToRR(z); + clear(z); + w); + +export moveToRRiandclear(z:RRimutable):RRi := ( + w := moveToRRi(z); + clear(z); + w); + +export set(x:ZZmutable, y:ZZ ) ::= Ccode( void, "mpz_set (", x, ",", y, ")" ); +set(x:ZZmutable, n:int ) ::= Ccode( void, "mpz_set_si(", x, ",", n, ")" ); +set(x:ZZmutable, n:uint ) ::= Ccode( void, "mpz_set_ui(", x, ",", n, ")" ); +set(x:ZZmutable, n:long ) ::= Ccode( void, "mpz_set_si(", x, ",", n, ")" ); +set(x:ZZmutable, n:ulong) ::= Ccode( void, "mpz_set_ui(", x, ",", n, ")" ); +set(x:ZZmutable, s:charstar, base:int):int := Ccode( + int, "mpz_set_str(", x, ", ", s, ", ", base, ")"); + +negsmall := -100; +possmall := 300; +smallints := ( + new array(ZZ) len possmall - negsmall + 1 do for i from negsmall to possmall do ( + x := newZZmutable(); + set(x,i); + provide moveToZZandclear(x))); + +export toInteger(i:int):ZZ := ( + if i >= negsmall && i <= possmall then smallints.(i-negsmall) + else ( + x := newZZmutable(); + set(x,i); + moveToZZandclear(x))); + +export toInteger(i:uint):ZZ := ( + if i <= uint(possmall) then smallints.(int(i)-negsmall) + else ( + x := newZZmutable(); + set(x,i); + moveToZZandclear(x))); + +export zeroZZ := toInteger(0); + +export oneZZ := toInteger(1); + +export minusoneZZ := toInteger(-1); + +export zeroZZcell := ZZcell(zeroZZ); + +export oneZZcell := ZZcell( oneZZ); + +export minusoneZZcell := ZZcell( minusoneZZ); + +export toInteger(i:ushort):ZZ := toInteger(int(i)); + +export toInteger(i:ulong):ZZ := ( + if i <= ulong(possmall) then smallints.(int(i)-negsmall) + else ( + x := newZZmutable(); + set(x,i); + moveToZZandclear(x))); + +export toInteger(i:long):ZZ := ( + if i >= long(negsmall) && i <= long(possmall) then smallints.(int(i)-negsmall) + else ( + x := newZZmutable(); + set(x,i); + moveToZZandclear(x))); + +-- ints are at least 16 bits, so cast 8- and 16-bit fixed-width ints to int +export toInteger(i:int8_t ):ZZ := toInteger(int(i)); +export toInteger(i:uint8_t ):ZZ := toInteger(uint(i)); +export toInteger(i:int16_t ):ZZ := toInteger(int(i)); +export toInteger(i:uint16_t):ZZ := toInteger(uint(i)); +-- longs are at least 32 bits, so cast 32-bit fixed-width ints to long +export toInteger(i:int32_t ):ZZ := toInteger(long(i)); +export toInteger(i:uint32_t):ZZ := toInteger(ulong(i)); + +export toInteger(s:charstar, base:int):ZZorNull := ( + x := newZZmutable(); + if set(x, s, base) == 0 + then ZZorNull(moveToZZandclear(x)) + else ( + clear(x); + ZZorNull(null()))); + +neg(x:ZZmutable, y:ZZ) ::= Ccode( void, "mpz_neg(", x, ",", y, ")" ); + +export - (x:ZZ) : ZZ := ( + w := newZZmutable(); + neg(w,x); + moveToZZandclear(w)); + +export toInteger(i:int64_t):ZZ := ( + if i >= int64_t(negsmall) && i <= int64_t(possmall) then ( + smallints.(int(i) - negsmall)) + else if Ccode(bool, "sizeof(long) >= 8") then toInteger(long(i)) + else ( + isneg := i < int64_t(0); + absi := if isneg then -i else i; + x := newZZmutable(); + Ccode(void, "mpz_import(", x, ", 1, 1, 8, 0, 0, &", absi, ")"); + if isneg then -moveToZZandclear(x) + else moveToZZandclear(x))); +export toInteger(i:uint64_t):ZZ := ( + if i <= uint64_t(possmall) then smallints.(int(i) - negsmall) + else if Ccode(bool, "sizeof(long) >= 8") then toInteger(ulong(i)) + else ( + x := newZZmutable(); + Ccode(void, "mpz_import(", x, ", 1, 1, 8, 0, 0, &", i, ")"); + moveToZZandclear(x))); +export toInteger(i:hash_t):ZZ := toInteger(uint64_t(i)); + +abs(x:ZZmutable, y:ZZ) ::= Ccode( void, "mpz_abs(", x, ",", y, ")" ); + +export abs(x:ZZ) : ZZ := ( + if isNegative0(x) then ( + w := newZZmutable(); + abs(w,x); + moveToZZandclear(w)) + else x + ); +add(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_add(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) + (y:ZZ) : ZZ := ( + w := newZZmutable(); + add(w,x,y); + moveToZZandclear(w)); +add(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_add_ui(", x, ",", y, ",", z, ")" ); +sub(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_sub(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) - (y:ZZ) : ZZ := ( + w := newZZmutable(); + sub(w,x,y); + moveToZZandclear(w)); +compare(x:ZZ, y:ZZ) ::= Ccode( int, "mpz_cmp(", x, ",", y, ")" ); + +export (x:ZZ) === (y:ZZ) : bool := compare(x,y) == 0; + +export (x:ZZ) > (y:ZZ) : bool := compare(x,y) > 0; + +export (x:ZZ) < (y:ZZ) : bool := compare(x,y) < 0; + +export (x:ZZ) >= (y:ZZ) : bool := compare(x,y) >= 0; + +export (x:ZZ) <= (y:ZZ) : bool := compare(x,y) <= 0; +compare(x:ZZ, y:long) ::= Ccode( int, "mpz_cmp_si(", x, ",", y, ")" ); + +export (x:ZZ) > (y:int) : bool := compare(x,long(y)) > 0; + +export (x:ZZ) >= (y:int) : bool := compare(x,long(y)) >= 0; + +export (x:ZZ) === (y:int) : bool := compare(x,long(y)) == 0; + +export (x:ZZcell) === (y:int) : bool := compare(x.v,long(y)) == 0; + +export (x:ZZ) < (y:int) : bool := compare(x,long(y)) < 0; + +export (x:ZZ) <= (y:int) : bool := compare(x,long(y)) <= 0; + +export (x:int) < (y:ZZ) : bool := y > x; + +export (x:int) > (y:ZZ) : bool := y < x; + +export (x:int) <= (y:ZZ) : bool := y >= x; + +export (x:int) >= (y:ZZ) : bool := y <= x; + +export (x:int) === (y:ZZ) : bool := y === x; +sub(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_sub_ui(", x, ",", y, ",", z, ")" ); +mul(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_mul(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) * (y:ZZ) : ZZ := ( + w := newZZmutable(); + mul(w,x,y); + moveToZZandclear(w)); +mul(x:ZZmutable, y:ZZ, z:int) ::= Ccode( void, "mpz_mul_si(", x, ",", y, ",", z, ")" ); +mul(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_mul_ui(", x, ",", y, ",", z, ")" ); +pow(x:ZZmutable, y:ZZ, n:ulong) ::= Ccode( void, "mpz_pow_ui(", x, ",", y, ",", n, ")" ); + +export (x:ZZ) ^ (n:ulong) : ZZ := ( + w := newZZmutable(); + pow(w,x,n); + moveToZZandclear(w)); + +cdiv(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_cdiv_q(", x, ",", y, ",", z, ")" ); +fdiv(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_fdiv_q(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) // (y:ZZ) : ZZ := ( + w := newZZmutable(); + if isPositive0(y) then fdiv(w,x,y) else cdiv(w,x,y); + moveToZZandclear(w)); + +fmod(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_fdiv_r(", x, ",", y, ",", z, ")" ); +cmod(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_cdiv_r(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) % (y:ZZ) : ZZ := ( + w := newZZmutable(); + if isPositive0(y) then fmod(w,x,y) else cmod(w,x,y); + moveToZZandclear(w)); + +fdiv(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_fdiv_q_ui(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) // (y:ulong) : ZZ := ( + w := newZZmutable(); + fdiv(w,x,y); + moveToZZandclear(w)); + +export (x:ZZ) // (y:ushort) : ZZ := x // ulong(y); + +fmod(y:ZZ, z:ulong) ::= Ccode( ulong, "mpz_fdiv_ui(", y, ",", z, ")" ); + +export (x:ZZ) % (y:ulong) : ulong := fmod(x,y); + +export (x:ZZ) % (y:ushort) : ushort := ushort(x % ulong(y)); + +export nextPrime(x:ZZ):ZZ := ( + w := newZZmutable(); + Ccode(void, "mpz_nextprime(", w, ", ", x, ")"); + moveToZZandclear(w)); + +gcd(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_gcd(", x, ",", y, ",", z, ")" ); + +export gcd(x:ZZ,y:ZZ):ZZ := ( + w := newZZmutable(); + gcd(w,x,y); + moveToZZandclear(w)); + +mul_2exp(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_mul_2exp(", x, ",", y, ",", z, ")" ); + +leftshift(x:ZZ,n:ulong):ZZ := ( + w := newZZmutable(); + mul_2exp(w,x,n); + moveToZZandclear(w)); + +tdiv_q_2exp(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_tdiv_q_2exp(", x, ",", y, ",", z, ")" ); + +rightshift(x:ZZ,n:ulong):ZZ := ( + w := newZZmutable(); + tdiv_q_2exp(w,x,n); + moveToZZandclear(w)); + +export (x:ZZ) << (n:int) : ZZ := ( + if n == 0 then x else if n > 0 then leftshift(x,ulong(n)) else rightshift(x,ulong(-n)) + ); + +export (x:ZZ) >> (n:int) : ZZ := ( + if n == 0 then x else if n > 0 then rightshift(x,ulong(n)) else leftshift(x,ulong(-n)) + ); + +and(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_and(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) & (y:ZZ) : ZZ := ( + w := newZZmutable(); + and(w,x,y); + moveToZZandclear(w)); + +ior(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_ior(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) | (y:ZZ) : ZZ := ( + w := newZZmutable(); + ior(w,x,y); + moveToZZandclear(w)); + +xor(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_xor(", x, ",", y, ",", z, ")" ); + +export (x:ZZ) ^^ (y:ZZ) : ZZ := ( + w := newZZmutable(); + xor(w,x,y); + moveToZZandclear(w)); + +not(x:ZZmutable, y:ZZ) ::= Ccode(void, "mpz_com(", x, ",", y, ")"); + +export not(y:ZZ) : ZZ := ( + x := newZZmutable(); + not(x, y); + moveToZZandclear(x)); + +toCstring(x:ZZ, base:int) ::= getstr(charstarOrNull(null()), base, x); + +export tostring(x:ZZ, base:int):string := ( + cstr := toCstring(x, base); + ret := tostring(cstr); + Ccode(void,"mp_free_str(", cstr, ")"); + ret); +export tostring(x:ZZ):string := tostring(x, 10); + +export (x:int) + (y:ZZ) : ZZ := toInteger(x) + y; + +export (x:ZZ) + (y:int) : ZZ := x + toInteger(y); + +export (x:ulong) + (y:ZZ) : ZZ := toInteger(x) + y; + +export (x:ZZ) + (y:ulong) : ZZ := x + toInteger(y); + +export (x:int) - (y:ZZ) : ZZ := toInteger(x) - y; + +export (x:ZZ) - (y:int) : ZZ := x - toInteger(y); + +export (x:int) * (y:ZZ) : ZZ := toInteger(x) * y; + +export (x:ZZ) * (y:int) : ZZ := x * toInteger(y); + +export (x:ulong) * (y:ZZ) : ZZ := toInteger(x) * y; + +export (x:ZZ) * (y:ulong) : ZZ := x * toInteger(y); + +export (x:int) ^ (y:ulong) : ZZ := toInteger(x) ^ y; + + + +-- Integers and doubles + +get_d(x:ZZ) ::= Ccode( double, "mpz_get_d(", x, ")" ); + +export toDouble(x:ZZ):double := get_d(x); + +export toDouble(x:ZZcell):double := get_d(x.v); + +export (x:double) + (y:ZZ) : double := x + toDouble(y); + +export (x:ZZ) + (y:double) : double := toDouble(x) + y; + +export (x:double) - (y:ZZ) : double := x - toDouble(y); + +export (x:ZZ) - (y:double) : double := toDouble(x) - y; + +export (x:double) * (y:ZZ) : double := x * toDouble(y); + +export (x:ZZ) * (y:double) : double := toDouble(x) * y; + +export (x:double) / (y:ZZ) : double := x / toDouble(y); + +export (x:ZZ) / (y:double) : double := toDouble(x) / y; + +export (x:double) ^ (n:ZZ) : double := pow(x,toDouble(n)); + +export (x:ZZ) > (y:double) : bool := toDouble(x) > y; + +export (x:ZZ) < (y:double) : bool := toDouble(x) < y; + +export (x:ZZ) >= (y:double) : bool := toDouble(x) >= y; + +export (x:ZZ) <= (y:double) : bool := toDouble(x) <= y; + +export (x:double) < (y:ZZ) : bool := x < toDouble(y); + +export (x:double) > (y:ZZ) : bool := x > toDouble(y); + +export (x:double) <= (y:ZZ) : bool := x <= toDouble(y); + +export (x:double) >= (y:ZZ) : bool := x >= toDouble(y); + +log(x:double) ::= Ccode(double, "log(", x, ")" ); +logtwo := log(2.); +bigint := 2147483647.; -- 2^31-1 + +(x:double) << (n:int) ::= ldexp(x, n); +(x:double) >> (n:int) ::= ldexp(x,-n); + +----------------------------------------------------------------------------- +-- rationals +----------------------------------------------------------------------------- + +-- TO DO : this is inefficient -- we could just grab the numerator without copying its limbs +export numerator(x:QQ):ZZ := ( + w := newZZmutable(); + Ccode( void, "mpq_get_num(", w, ",", x, ")" ); + moveToZZandclear(w)); + +-- TO DO : this is inefficient -- we could just grab the denominator without copying its limbs +export denominator(x:QQ):ZZ := ( + w := newZZmutable(); + Ccode( void, "mpq_get_den(", w, ",", x, ")" ); + moveToZZandclear(w)); + +export numeratorRef (x:QQ) ::= Ccode( ZZ, "mpq_numref(", x, ")"); + +export denominatorRef(x:QQ) ::= Ccode( ZZ, "mpq_denref(", x, ")"); + +export numeratorRef (x:QQmutable) ::= Ccode( ZZmutable, "mpq_numref(", x, ")"); + +export denominatorRef(x:QQmutable) ::= Ccode( ZZmutable, "mpq_denref(", x, ")"); + +export hash(x:QQ):hash_t := hash(numeratorRef(x))+1299841*hash(denominatorRef(x)); + +export sign(x:QQ):int := Ccode(int, "mpq_sgn(",x,")"); +isZero0 (x:QQ):bool := 0 == sign(x); +isNegative0(x:QQ):bool := -1 == sign(x); + +export isZero (x:QQ):bool := isZero0(x); +export isNegative(x:QQ):bool := isNegative0(x); + +export newQQCanonical(i:ZZ,j:ZZ):QQ := ( + -- assume canonical: gcd(i,j)=1, j>0, and j==1 if i==0 + Ccode(void, " + mpq_ptr z = (mpq_ptr) getmem(sizeof(__mpq_struct)); + memcpy(&z->_mp_num,",i,",sizeof(__mpz_struct)); + memcpy(&z->_mp_den,",j,",sizeof(__mpz_struct))" + ); + Ccode(QQ,"z")); + +moveToQQ(y:QQmutable):QQ := newQQCanonical(moveToZZ(numeratorRef(y)),moveToZZ(denominatorRef(y))); + +export moveToQQandclear(z:QQmutable):QQ := ( + w := moveToQQ(z); + clear(z); + w); + +export newQQ(i:ZZ,j:ZZ):QQ := ( + x := newQQmutable(); + set( numeratorRef(x),i); + set(denominatorRef(x),j); + Ccode(void, "mpq_canonicalize(",x,")"); + moveToQQandclear(x) + ); + +-- integers and rationals + +export toRational(x:ZZ):QQ := newQQCanonical(x,oneZZ); + +export toRational(n:int):QQ := toRational(toInteger(n)); + +export toRational(n:ulong):QQ := toRational(toInteger(n)); + +export floor(x:QQ):ZZ := numeratorRef(x)//denominatorRef(x); + +export (x:QQ) + (y:QQ) : QQ := ( + z := newQQmutable(); + Ccode( void, "mpq_add(", z, ",", x, ",", y, ")" ); + moveToQQandclear(z)); + +export - (y:QQ) : QQ := ( + z := newQQmutable(); + Ccode( void, "mpq_neg(", z, ",", y, ")" ); + moveToQQandclear(z)); + +export abs(x:QQ) : QQ := if isNegative0(x) then -x else x; + +export inv(y:QQ) : QQ := ( -- reciprocal + z := newQQmutable(); + Ccode( void, "mpq_inv(", z, ",", y, ")" ); + moveToQQandclear(z)); + +export (x:QQ) - (y:QQ) : QQ := ( + z := newQQmutable(); + Ccode( void, "mpq_sub(", z, ",", x, ",", y, ")" ); + moveToQQandclear(z)); + +export (x:QQ) * (y:QQ) : QQ := ( + z := newQQmutable(); + Ccode( void, "mpq_mul(", z, ",", x, ",", y, ")" ); + moveToQQandclear(z)); + +export (x:QQ) / (y:QQ) : QQ := ( + z := newQQmutable(); + Ccode( void, "mpq_div(", z, ",", x, ",", y, ")" ); + moveToQQandclear(z)); + +export (x:QQ) === (y:QQ) : bool := Ccode( bool, "mpq_equal(", x, ",", y, ")"); + +export (x:QQ) + (y:ZZ ) : QQ := x + toRational(y); + +export (x:QQ) + (y:int ) : QQ := x + toRational(y); + +export (x:ZZ ) + (y:QQ) : QQ := toRational(x) + y; + +export (x:int ) + (y:QQ) : QQ := toRational(x) + y; + +export (x:QQ) - (y:ZZ ) : QQ := x - toRational(y); + +export (x:QQ) - (y:int ) : QQ := x - toRational(y); + +export (x:ZZ ) - (y:QQ) : QQ := toRational(x) - y; + +export (x:int ) - (y:QQ) : QQ := toRational(x) - y; + +export (x:QQ) * (y:ZZ ) : QQ := x * toRational(y); + +export (x:QQ) * (y:int ) : QQ := x * toRational(y); + +export (x:ZZ ) * (y:QQ) : QQ := toRational(x) * y; + +export (x:int ) * (y:QQ) : QQ := toRational(x) * y; + +export (x:ZZ ) / (y:ZZ ) : QQ := toRational(x)/toRational(y); + +export (x:QQ) / (y:ZZ ) : QQ := x / toRational(y); + +export (x:QQ) / (y:int ) : QQ := x / toRational(y); + +export (x:ZZ ) / (y:QQ) : QQ := toRational(x) / y; + +export (x:int ) / (y:QQ) : QQ := toRational(x) / y; + + +export tostring(x:QQ):string := tostring(numeratorRef(x)) + '/' + tostring(denominatorRef(x)); + + +export (x:QQ) === (y:ZZ) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; + +export (x:QQ) === (y:int) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; + +export (y:ZZ) === (x:QQ) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; + +export (y:int) === (x:QQ) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; + +compare(x:QQ, y:QQ) ::= Ccode( int, + "mpq_cmp(", x, ",", y, ")" ); +compare(x:QQ, y:ulong) ::= Ccode( int, "mpq_cmp_ui(", x, ",", y, ",1)"); +compare(x:QQ, y: long) ::= Ccode( int, "mpq_cmp_si(", x, ",", y, ",1)"); +compare(x:QQ, y: int) ::= Ccode( int, "mpq_cmp_si(", x, ",(long)", y, ",1)"); + +export (x:QQ) < (y:QQ) : bool := compare(x,y) < 0; + +export (x:QQ) >= (y:QQ) : bool := compare(x,y) >= 0; + +export (x:QQ) > (y:QQ) : bool := compare(x,y) > 0; + +export (x:QQ) <= (y:QQ) : bool := compare(x,y) <= 0; + +export (x:ZZ) < (y:QQ) : bool := toRational(x) < y; + +export (x:ZZ) <= (y:QQ) : bool := toRational(x) <= y; + +export (x:ZZ) > (y:QQ) : bool := toRational(x) > y; + +export (x:ZZ) >= (y:QQ) : bool := toRational(x) >= y; + +export (x:QQ) < (y:ZZ) : bool := x < toRational(y); + +export (x:QQ) <= (y:ZZ) : bool := x <= toRational(y); + +export (x:QQ) > (y:ZZ) : bool := x > toRational(y); + +export (x:QQ) >= (y:ZZ) : bool := x >= toRational(y); + +export (x:QQ) < (y:int) : bool := compare(x,y) < 0; + +export (x:QQ) >= (y:int) : bool := compare(x,y) >= 0; + +export (x:QQ) > (y:int) : bool := compare(x,y) > 0; + +export (x:QQ) <= (y:int) : bool := compare(x,y) <= 0; + +export (x:int) < (y:QQ) : bool := y > x; + +export (x:int) <= (y:QQ) : bool := y >= x; + +export (x:int) > (y:QQ) : bool := y < x; + +export (x:int) >= (y:QQ) : bool := y <= x; + +-- double and rationals + +export toDouble(x:QQ):double := Ccode( double, "mpq_get_d(", x, ")" ); + +export (x:double) + (y:QQ) : double := x + toDouble(y); + +export (x:double) - (y:QQ) : double := x - toDouble(y); + +export (x:double) * (y:QQ) : double := x * toDouble(y); + +export (x:double) / (y:QQ) : double := x / toDouble(y); + +export (x:QQ) + (y:double) : double := toDouble(x) + y; + +export (x:QQ) - (y:double) : double := toDouble(x) - y; + +export (x:QQ) * (y:double) : double := toDouble(x) * y; + +export (x:QQ) / (y:double) : double := toDouble(x) / y; + +export (x:double) < (y:QQ) : bool := x * denominatorRef(y) < numeratorRef(y); + +export (x:double) <= (y:QQ) : bool := x * denominatorRef(y) <= numeratorRef(y); + +export (x:double) > (y:QQ) : bool := x * denominatorRef(y) > numeratorRef(y); + +export (x:double) >= (y:QQ) : bool := x * denominatorRef(y) >= numeratorRef(y); + +export (x:QQ) < (y:double) : bool := numeratorRef(x) < y * denominatorRef(x); + +export (x:QQ) <= (y:double) : bool := numeratorRef(x) <= y * denominatorRef(x); + +export (x:QQ) > (y:double) : bool := numeratorRef(x) > y * denominatorRef(x); + +export (x:QQ) >= (y:double) : bool := numeratorRef(x) >= y * denominatorRef(x); + +----------------------------------------------------------------------------- +-- big reals +----------------------------------------------------------------------------- + +export realPart(z:CC):RR := z.re; + +export imaginaryPart(z:CC):RR := z.im; + +export realPart(z:CCi):RRi := z.re; + +export imaginaryPart(z:CCi):RRi := z.im; + +-- warning: these routines just check the sign bit, and don't verify finiteness! +export sign(x:RR):int := Ccode(int, "mpfr_sgn(", x, ")"); +isPositive0(x:RR) ::= 1 == sign(x); +isNegative0(x:RR) ::= -1 == sign(x); +isZero0 (x:RR) ::= 0 == sign(x); + +isPositive0(x:RRi) ::= 0 < Ccode(int, "mpfi_is_strictly_pos(", x, ")"); +isNegative0(x:RRi) ::= 0 < Ccode(int, "mpfi_is_strictly_neg(", x, ")"); +isZero0 (x:RRi) ::= 0 < Ccode(int, "mpfi_is_zero(", x, ")"); +contains0 (x:RRi) ::= 0 < Ccode(int, "mpfi_has_zero(", x, ")"); + +flagged0() ::= 0 != Ccode( int, "mpfr_erangeflag_p()" ); +setflag0() ::= Ccode( void, "mpfr_set_erangeflag()" ); +isfinite0(x:RR) ::=Ccode(bool,"mpfr_number_p(",x,")"); +isfinite0(x:RRmutable) ::=Ccode(bool,"mpfr_number_p(",x,")"); +isfinite0(x:RRi) ::=Ccode(bool,"mpfi_bounded_p(",x,")"); +isfinite0(x:RRimutable) ::=Ccode(bool,"mpfi_bounded_p(",x,")"); +isinf0 (x:RR) ::= Ccode(bool,"mpfr_inf_p(",x,")"); +isinf0 (x:RRi) ::= Ccode(bool,"mpfi_inf_p(",x,")"); +isnan0 (x:RR) ::= Ccode(bool,"mpfr_nan_p(",x,")"); +isnan0 (x:RRi) ::= Ccode(bool,"mpfi_nan_p(",x,")"); +sign0(x:RR) ::= 0 != Ccode(int,"mpfr_signbit(",x,")"); +sign0(x:RRi) ::= 0 != Ccode(int,"mpfi_is_strictly_neg(",x,")"); +export isEmpty(x:RRi):bool := Ccode(bool,"mpfi_is_empty(",x,")"); + +exponent0(x:RR) ::= Ccode(long,"(long)mpfr_get_exp(",x,")"); -- sometimes int, sometimes long, see gmp.h for type mp_exp_t +exponent0(x:RRi) ::= max(exponent0(rightRR(x)),exponent0(leftRR(x))); +sizeinbase0(x:ZZ,b:int) ::= Ccode( int, "mpz_sizeinbase(", x, ",", b, ")" ); + +-- warning: these routines just check the sign bit, and don't verify finiteness! +export isPositive(x:RR):bool := isPositive0(x); +export isPositive(x:RRi):bool := isPositive0(x); + +export isNegative(x:RR):bool := isNegative0(x); +export isNegative(x:RRi):bool := isNegative0(x); + +export isZero (x:RR):bool := isZero0(x) && isfinite0(x); +export isZero (x:RRi):bool := isZero0(x) && isfinite0(x); + +export isZero (x:CC):bool := isZero0(x.re) && isfinite0(x.re) && isZero0(x.im) && isfinite0(x.im); +export isZero (x:CCi):bool := isZero0(x.re) && isfinite0(x.re) && isZero0(x.im) && isfinite0(x.im); + +export defaultPrecision := ulong(53); -- should 53 be computed? + +export minExponent := Ccode(long,"(long)mpfr_get_emin()-1"); + +export maxExponent := Ccode(long,"(long)mpfr_get_emax()"); + +export exponent(x:ZZ):long := if isZero0(x) then minExponent else long(sizeinbase0(x,2)); + +export exponent(x:RR):long := if isZero0(x) && isfinite0(x) then minExponent else if isfinite0(x) then exponent0(x) else maxExponent; +export exponent(x:RRi):long := if isZero0(x) && isfinite0(x) then minExponent else if isfinite0(x) then exponent0(x) else maxExponent; + +export exponent(x:CC):long := max(exponent(x.re),exponent(x.im)); +export exponent(x:CCi):long := max(exponent(x.re),exponent(x.im)); + +export newCCmutable(prec:ulong):CCmutable := CCmutable(newRRmutable(prec),newRRmutable(prec)); +export newCCimutable(prec:ulong):CCimutable := CCimutable(newRRimutable(prec),newRRimutable(prec)); + +export moveToCC(y:CCmutable):CC := CC(moveToRR(y.re), moveToRR(y.im)); + +export moveToCCandclear(z:CCmutable):CC := ( + w := moveToCC(z); + clear(z); + w); + +export moveToCCi(y:CCimutable):CCi := CCi(moveToRRi(y.re),moveToRRi(y.im)); + +export moveToCCiandclear(z:CCimutable):CCi := ( + w := moveToCCi(z); + clear(z); + w); + +precision0(x:RR) ::= Ccode(ulong,"(unsigned long)mpfr_get_prec(", x, ")"); + +precision0(x:RRi) ::= Ccode(ulong,"(unsigned long)mpfi_get_prec(", x, ")"); + +precision0(x:CC) ::= Ccode(ulong,"(unsigned long)mpfr_get_prec(", x, ")"); + +precision0(x:CCi) ::= Ccode(ulong,"(unsigned long)mpfi_get_prec(", x, ")"); + +export precision(x:RR):ulong := precision0(x); + +export precision(x:RRi):ulong := precision0(x); + +export precision(x:CC):ulong := precision0(x.re); + +export precision(x:CCi):ulong := precision0(x.re); + +export toRR(x:RR,prec:ulong):RR := ( + if precision0(x) == prec then return x; + z := newRRmutable(prec); + Ccode( void, "mpfr_set(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export toRRi(x:RRi,prec:ulong):RRi := ( + if precision0(x) == prec then return x; + z := newRRimutable(prec); + Ccode( void, "mpfi_set(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export toRR(s:string,prec:ulong):RR := ( + z := newRRmutable(prec); + Ccode( void, "mpfr_set_str(", z,", (char *)", s, "->array,", "10,", "MPFR_RNDN", ")" ); + moveToRRandclear(z)); + +export toRRi(s:string,prec:ulong):RRi := ( + z := newRRimutable(prec); + Ccode( void, "mpfi_set_str(", z,", (char *)", s, "->array,", "10", ")" ); + moveToRRiandclear(z)); + +export toRR(x:QQ,prec:ulong):RR := ( + z := newRRmutable(prec); + Ccode( void, "mpfr_set_q(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export toRRi(x:QQ,prec:ulong):RRi := ( + z := newRRimutable(prec); + Ccode( void, "mpfi_set_q(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export toRR(x:QQ):RR := toRR(x,defaultPrecision); + +export toRRi(x:QQ):RRi := toRRi(x,defaultPrecision); + +export toRR(x:ZZ,prec:ulong):RR := ( + z := newRRmutable(prec); + Ccode( void, "mpfr_set_z(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export toRRi(x:ZZ,prec:ulong):RRi := ( + z := newRRimutable(prec); + Ccode( void, "mpfi_set_z(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export toRR(x:ZZ):RR := toRR(x,defaultPrecision); + +export toRRi(x:ZZ):RRi := toRRi(x,defaultPrecision); + +export toRR(n:int,prec:ulong):RR := ( + x := newRRmutable(prec); + Ccode( void, "mpfr_set_si(", x, ",(long)", n, ", MPFR_RNDN)" ); + moveToRRandclear(x)); + +export toRRi(n:int,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfi_set_si(", x, ",(long)", n, ")" ); + moveToRRiandclear(x)); + +export toRR(n:ulong,prec:ulong):RR := ( + x := newRRmutable(prec); + Ccode( void, "mpfr_set_ui(", x, ",(unsigned long)", n, ", MPFR_RNDN)" ); + moveToRRandclear(x)); + +export toRRi(n:ulong,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfi_set_ui(", x, ",(unsigned long)", n, ")" ); + moveToRRiandclear(x)); + +export toRR(n:float, prec:ulong):RR := ( + x := newRRmutable(prec); + Ccode(void, "mpfr_set_flt(", x, ", ", n, ", MPFR_RNDN)"); + moveToRRandclear(x)); + +export toRR(n:double,prec:ulong):RR := ( + x := newRRmutable(prec); + Ccode( void, "mpfr_set_d(", x, ",", n, ", MPFR_RNDN)" ); + moveToRRandclear(x)); + +export toRRi(n:double,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfi_set_d(", x, ",", n, ")" ); + moveToRRiandclear(x)); + +export toRR(n:double):RR := toRR(n,defaultPrecision); + +export toRRi(n:double):RRi := toRRi(n,defaultPrecision); + +export toRRi(n:RR,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode(void, "mpfi_set_fr(", x, ",", n, ")" ); + moveToRRiandclear(x)); + +export toRRi(n:RR):RRi := toRRi(n,precision(n)); + +export toRRi(a:ZZ,b:ZZ,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set_z( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set_z( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:ZZ,b:ZZ):RRi := toRRi(a,b,defaultPrecision); + +export toRRi(a:ZZ,b:QQ,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set_z( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set_q( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:ZZ, b:QQ):RRi := toRRi(a,b,defaultPrecision); + +export toRRi(a:ZZ,b:RR,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set_z( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:ZZ, b:RR):RRi := toRRi(a,b,precision(b)); + +export toRRi(a:QQ,b:ZZ,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set_q( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set_z( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:QQ,b:ZZ):RRi := toRRi(a,b,defaultPrecision); + +export toRRi(a:QQ,b:QQ,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set_q( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set_q( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:QQ, b:QQ):RRi := toRRi(a,b,defaultPrecision); + +export toRRi(a:QQ,b:RR,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set_q( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:QQ, b:RR):RRi := toRRi(a,b,precision(b)); + +export toRRi(a:RR,b:ZZ,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set_z( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:RR,b:ZZ):RRi := toRRi(a,b,precision(a)); + +export toRRi(a:RR,b:QQ,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set_q( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:RR, b:QQ):RRi := toRRi(a,b,precision(a)); + +export toRRi(a:RR,b:RR,prec:ulong):RRi := ( + x := newRRimutable(prec); + Ccode( void, "mpfr_set( &", x, "->left," , a, ",MPFR_RNDD)"); + Ccode( void, "mpfr_set( &", x, "->right," , b, ",MPFR_RNDU)"); + moveToRRiandclear(x)); + +export toRRi(a:RR, b:RR):RRi := toRRi(a,b,min(precision(a),precision(b))); + +export midpointRR(x:RRi):RR := ( + z := newRRmutable(precision0(x)); + Ccode( RR, "mpfi_mid(",z, ",", x, ")"); + moveToRRandclear(z)); + +export midpointRR(x:RRi,prec:ulong):RR := ( + z := newRRmutable(prec); + Ccode( RR, "mpfi_mid(",z, ",", x, ")"); + moveToRRandclear(z)); + +export widthRR(x:RRi):RR := ( + z := newRRmutable(precision0(x)); + Ccode( RR, "mpfi_diam_abs(",z, ",", x, ")"); + moveToRRandclear(z)); + +export infinityRR(prec:ulong,sign:int):RR := ( + x := newRRmutable(prec); + Ccode(void, "mpfr_set_inf(",x,",",sign,")"); + moveToRRandclear(x)); + +export infinityRR(prec:ulong):RR := infinityRR(prec,1); + +export infinityRRi(prec:ulong,sign:int):RRi := toRRi(infinityRR(prec,sign)); +export infinityRRi(prec:ulong):RRi := toRRi(infinityRR(prec)); + +export nanRR(prec:ulong):RR := ( + x := newRRmutable(prec); + Ccode(void, "mpfr_set_nan(",x,")"); + moveToRRandclear(x)); + +export nanRRi(prec:ulong):RRi := toRRi(nanRR(prec)); + +export toCC(x:RR,y:RR):CC := ( + if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRR(prec); CC(z,z)) + else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRR(prec,1); CC(z,z)) + else if precision0(x) == precision0(y) then CC(x,y) + else if precision0(x) < precision0(y) then CC(x,toRR(y,precision0(x))) + else CC(toRR(x,precision0(y)),y) + ); + +export toCCi(x:RR,y:RR):CCi := ( + if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) + else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) + else if precision0(x) == precision0(y) then CCi(toRRi(x),toRRi(y)) + else if precision0(x) < precision0(y) then CCi(toRRi(x),toRRi(y,precision0(x))) + else CCi(toRRi(x,precision0(y)),toRRi(y)) + ); + +export toCCi(x:RRi,y:RR):CCi := ( + if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) + else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) + else if precision0(x) == precision0(y) then CCi(x,toRRi(y)) + else if precision0(x) < precision0(y) then CCi(x,toRRi(y,precision0(x))) + else CCi(toRRi(x,precision0(y)),toRRi(y)) + ); + +export toCCi(x:RR,y:RRi):CCi := ( + if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) + else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) + else if precision0(x) == precision0(y) then CCi(toRRi(x),y) + else if precision0(x) < precision0(y) then CCi(toRRi(x),toRRi(y,precision0(x))) + else CCi(toRRi(x,precision0(y)),y) + ); + +export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); + +export infinityCCi(prec:ulong):CCi := (x := infinityRR(prec,1); toCCi(x,x)); + +export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); + +export nanCCi(prec:ulong):CCi := (x := nanRR(prec); toCCi(x,x)); + +export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); + +export toCCi(x:RRi):CCi := CCi(x,toRRi(0,precision0(x))); + +export toCCi(x:RR):CCi := CCi(toRRi(x),toRRi(0,precision0(x))); + +export toCC(x:int,y:RR):CC := CC(toRR(x,precision0(y)),y); + +export toCCi(x:int,y:RRi):CCi := CCi(toRRi(x,precision0(y)),y); + +export toCCi(x:int,y:RR):CCi := CCi(toRRi(x,precision0(y)),toRRi(y)); + +export toCC(x:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); + +export toCCi(x:RRi,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCCi(x:RR,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCC(x:CC,prec:ulong):CC := ( + if precision0(x.re) == prec then x + else CC(toRR(x.re,prec),toRR(x.im,prec))); + +export toCCi(x:CCi,prec:ulong):CCi := ( + if precision0(x.re) == prec then x + else CCi(toRRi(x.re,prec),toRRi(x.im,prec))); + +export toCCi(x:CC,prec:ulong):CCi := ( + if precision0(x.re) == prec then CCi(toRRi(x.re,prec),toRRi(x.im,prec)) + else CCi(toRRi(x.re,prec),toRRi(x.im,prec))); + +export toCC(x:RR,y:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); + +export toCC(x:QQ,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); + +export toCCi(x:QQ,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCC(x:ZZ,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); + +export toCCi(x:ZZ,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCC(x:QQ):CC := toCC(x,defaultPrecision); + +export toCCi(x:QQ):CCi := toCCi(x,defaultPrecision); + +export toCC(x:ZZ):CC := toCC(x,defaultPrecision); + +export toCCi(x:ZZ):CCi := toCCi(x,defaultPrecision); + +export toCCi(x:CC):CCi := toCCi(x,defaultPrecision); + +export toCC(x:int,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); + +export toCCi(x:int,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCC(x:int,y:int,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); + +export toCCi(x:int,y:int,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(y,prec)); + +export toCC(x:ulong,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); + +export toCCi(x:ulong,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCC(x:double,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); + +export toCCi(x:double,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); + +export toCC(x:double,y:double,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); + +export toCCi(x:double,y:double,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(y,prec)); + +export toCCi(a:RRi,b:RRi,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + +export toCCi(a:RRi,b:RRi):CCi := toCCi(a,b,min(precision(a),precision(b))); + +export toCCi(a:RR,b:RRi,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + +export toCCi(a:RRi,b:RR,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + +export toCCi(a:RR,b:RR,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); + +export toFloat(x:RR):float := Ccode(float, "mpfr_get_flt(", x, ", MPFR_RNDN)"); +export toFloat(x:RRi):float := toFloat(midpointRR(x)); +export toFloat(x:RRcell):float := toFloat(x.v); +export toFloat(x:RRicell):float := toFloat(x.v); + +export toDouble(x:RR):double := Ccode( double, "mpfr_get_d(", x, ", MPFR_RNDN)" ); + +export toDouble(x:RRi):double := toDouble(midpointRR(x)); + +export toDouble(x:RRcell):double := Ccode( double, "mpfr_get_d(", x.v, ", MPFR_RNDN)" ); + +export toDouble(x:RRicell):double := toDouble(midpointRR(x.v)); + +export flagged():bool := flagged0(); + +export isfinite(x:RR):bool := isfinite0(x); + +export isfinite(x:RRi):bool := isfinite0(x); + +export isinf(x:RR):bool := isinf0(x); + +export isinf(x:RRi):bool := isinf0(x); + +export isnan(x:RR):bool := isnan0(x); + +export isnan(x:RRi):bool := isnan0(x); + +export isfinite(x:CC):bool := isfinite0(x.re) && isfinite0(x.im); + +export isfinite(x:CCi):bool := isfinite0(x.re) && isfinite0(x.im); + +export isinf(x:CC):bool := isinf0(x.re) && !isnan0(x.im) || isinf0(x.im) && !isnan0(x.re); + +export isinf(x:CCi):bool := isinf0(x.re) && !isnan0(x.im) || isinf0(x.im) && !isnan0(x.re); + +export isnan(x:CC):bool := isnan0(x.re) || isnan0(x.im); + +export isnan(x:CCi):bool := isnan0(x.re) || isnan0(x.im); + +export (x:RR) === (y:RR):bool := ( -- weak equality + Ccode( void, "mpfr_clear_flags()" ); + 0 != Ccode( int, "mpfr_equal_p(", x, ",", y, ")" ) + && !flagged0() + ); + +export (x:RRi) === (y:RRi):bool := ( -- weak equality + Ccode( void, "mpfr_clear_flags()" ); -- No equivalent in mpfi + leftRR(x) === leftRR(y) && rightRR(x) === rightRR(y) && !flagged0() -- equality is not defined in mpfi + ); + +export strictequality(x:RR,y:RR):bool := ( + Ccode( void, "mpfr_clear_flags()" ); + 0 != Ccode( int, "mpfr_equal_p(", x, ",", y, ")" ) + && !flagged0() + && sign0(x) == sign0(y) + && precision0(x) == precision0(y) + ); + +export strictequality(x:RRi,y:RRi):bool := ( + Ccode( void, "mpfr_clear_flags()" ); -- No equivalent in mpfi + leftRR(x) === leftRR(y) + && rightRR(x) === rightRR(y) + && !flagged0() + && sign0(x) == sign0(y) + && precision0(x) == precision0(y) + ); + +compare0(x:RR, y:RR) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp(", x, ",", y, "))" ); + +compare0(x:RRi, y:RRi) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(x:RR, y:RR):int := compare0(x,y); -- use flagged(), too! +export (x:RR) > (y:RR) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RR) < (y:RR) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RR) >= (y:RR) : bool := compare0(x,y) >= 0 && !flagged0(); + +export (x:RR) <= (y:RR) : bool := compare0(x,y) <= 0 && !flagged0(); + +export compare(x:RRi, y:RRi):int := compare0(x,y); -- use flagged(), too! +export (x:RRi) > (y:RRi) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RRi) < (y:RRi) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RRi) >= (y:RRi) : bool := (compare0(x,y)>0 || (leftRR(x) == rightRR(y))) && !flagged0(); + +export (x:RRi) <= (y:RRi) : bool := (compare0(x,y)<0 || (rightRR(x) == leftRR(y))) && !flagged0(); + +compare0(x:RR, y:long) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_si(", x, ",", y, "))" ); + +compare0(x:RRi, y:long) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_si(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +compare0(x:RR, y:int ) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_si(", x, ",(long)", y, "))" ); + +compare0(x:RRi, y:int ) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_si(", x, ",(long)", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(x:RR, y:long):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_si(", x, ",", y, "))" ); + +export compare(y:long, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_si(", x, ",", y, "))" ); + +export compare(x:RRi, y:long):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_si(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(y:long, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_si(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export (x:RR) > (y:int) : bool := compare0(x,long(y)) > 0 && !flagged0(); + +export (x:RRi) > (y:int) : bool := compare0(x,long(y)) > 0 && !flagged0(); + +export (x:RR) >= (y:int) : bool := compare0(x,long(y)) >= 0 && !flagged0(); + +export (x:RR) === (y:int) : bool := compare0(x,long(y)) == 0 && !flagged0(); + +export (x:RRi) === (y:int) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export (x:RRi) >= (y:int) : bool := ((compare0(x,long(y)) > 0) || (leftRR(x) === y)) && !flagged0(); + +export (x:RR) < (y:int) : bool := compare0(x,long(y)) < 0 && !flagged0(); + +export (x:RRi) < (y:int) : bool := compare0(x,long(y)) < 0 && !flagged0(); + +export (x:RR) <= (y:int) : bool := compare0(x,long(y)) <= 0 && !flagged0(); + +export (x:RRi) <= (y:int) : bool := (compare0(x,long(y)) < 0 || rightRR(x) === y) && !flagged0(); + +export (x:CC) === (y:int) : bool := x.re === y && x.im === 0; + +export (x:CCi) === (y:int) : bool := x.re === y && x.im === 0; + +compare0(x:RR, y:double) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_d(", x, ",", y, "))" ); + +export compare(x:RR, y:double):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_d(", x, ",", y, "))" ); + +export compare(y:double, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_d(", x, ",", y, "))" ); + +compare0(x:RRi, y:double) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_d(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(x:RRi, y:double):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_d(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(y:double, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_d(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export (x:RR) > (y:double) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RRi) > (y:double) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RR) >= (y:double) : bool := compare0(x,y) >= 0 && !flagged0(); + +export (x:RR) === (y:double) : bool := compare0(x,y) == 0 && !flagged0(); + +export (x:RRi) === (y:double) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export (x:RRi) >= (y:double) : bool := ((compare0(x,y) > 0) || (leftRR(x) === y)) && !flagged0(); + +export (x:RR) < (y:double) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RRi) < (y:double) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RR) <= (y:double) : bool := compare0(x,y) <= 0 && !flagged0(); + +export (x:RRi) <= (y:double) : bool := ((compare0(x,y) < 0) || (rightRR(x) === y)) && !flagged0(); + +compare0(x:RR, y:ZZ) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_z(", x, ",", y, "))" ); + +export compare(x:RR, y:ZZ):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_z(", x, ",", y, "))" ); + +export compare(y:ZZ, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_z(", x, ",", y, "))" ); + +compare0(x:RRi, y:ZZ) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_z(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(x:RRi, y:ZZ):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_z(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(y:ZZ, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_z(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export (x:RR) > (y:ZZ) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RRi) > (y:ZZ) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RR) >= (y:ZZ) : bool := compare0(x,y) >= 0 && !flagged0(); + +export (x:RR) === (y:ZZ) : bool := compare0(x,y) == 0 && !flagged0(); + +export (x:RRi) === (y:ZZ) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export (y:ZZ) === (x:RR) : bool := compare0(x,y) == 0 && !flagged0(); + +export (y:ZZ) === (x:RRi) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export (x:RRi) >= (y:ZZ) : bool := ((compare0(x,y) > 0) || (leftRR(x) === y)) && !flagged0(); + +export (x:RR) < (y:ZZ) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RRi) < (y:ZZ) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RR) <= (y:ZZ) : bool := compare0(x,y) <= 0 && !flagged0(); + +export (x:RRi) <= (y:ZZ) : bool := ((compare0(x,y) < 0) || (rightRR(x) === y)) && !flagged0(); + +compare0(x:RR, y:QQ) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_q(", x, ",", y, "))" ); + +export compare(x:RR, y:QQ):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_q(", x, ",", y, "))" ); + +export compare(y:QQ, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_q(", x, ",", y, "))" ); + +compare0(x:RRi, y:QQ) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_q(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(x:RRi, y:QQ):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_q(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export compare(y:QQ, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_q(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr + +export (x:RR) > (y:QQ) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RRi) > (y:QQ) : bool := compare0(x,y) > 0 && !flagged0(); + +export (x:RR) >= (y:QQ) : bool := compare0(x,y) >= 0 && !flagged0(); + +export (x:RR) === (y:QQ) : bool := compare0(x,y) == 0 && !flagged0(); + +export (x:RRi) === (y:QQ) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export (y:QQ) === (x:RR) : bool := compare0(x,y) == 0 && !flagged0(); + +export (y:QQ) === (x:RRi) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export (x:RRi) >= (y:QQ) : bool := ((compare0(x,y) > 0) || (leftRR(x) === y)) && !flagged0(); + +export (x:RR) < (y:QQ) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RRi) < (y:QQ) : bool := compare0(x,y) < 0 && !flagged0(); + +export (x:RR) <= (y:QQ) : bool := compare0(x,y) <= 0 && !flagged0(); + +export (x:RRi) <= (y:QQ) : bool := ((compare0(x,y) < 0) || (rightRR(x) === y)) && !flagged0(); + +export (x:RRi) === (y:RR) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export (y:RR) === (x:RRi) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); + +export contains (y:ZZ, x:RRi):bool := Ccode(int,"mpfi_is_inside_z(",y,",",x,")") > 0; + +export contains (y:QQ, x:RRi):bool := Ccode(int,"mpfi_is_inside_q(",y,",",x,")") > 0; + +export contains (y:RR, x:RRi):bool := Ccode(int,"mpfi_is_inside_fr(",y,",",x,")") > 0; + +export contains (y:RRi, x:RRi):bool := Ccode(int,"mpfi_is_inside(",y,",",x,")") > 0; + +export intersectRRi (x:RRi, y:RRi):RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_intersect(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export intersectRRi (x:RRi, y:RRi, prec:ulong):RRi := ( + z := newRRimutable(prec); + Ccode( void, "mpfi_intersect(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export hash(x:RR):hash_t := hash_t(precision0(x)) + Ccode(hash_t, + "mpfr_hash(", -- see gmp_aux.c for this function + x, + ")" + ); + +export hash(x:RRi):hash_t := hash_t(precision0(x)) + Ccode(hash_t, + "mpfi_hash(", -- Added for MPFI + x, + ")" + ); -- End added for MPFI + +export hash(x:CC):hash_t := 123 + hash(x.re) + 111 * hash(x.im); + +export (x:RR) + (y:RR) : RR := ( + z := newRRmutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfr_add(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) + (y:RRi) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_add(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) + (y:int) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_add_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); +export (x:int) + (y:RR) : RR := (y + x); + +export (x:RRi) + (y:int) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_add_si(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) + (y:ZZ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_add_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) + (y:ZZ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_add_z(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) + (y:QQ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_add_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) + (y:QQ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_add_q(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RRi) + (y:RR) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_add_fr(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export - (y:RR) : RR := ( + z := newRRmutable(precision0(y)); + Ccode( void, "mpfr_neg(", z, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export - (y:RRi) : RRi := ( + z := newRRimutable(precision0(y)); + Ccode( void, "mpfi_neg(", z, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) - (y:RR) : RR := ( + z := newRRmutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfr_sub(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) - (y:RRi) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_sub(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) - (y:int) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sub_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (y:int) - (x:RR) : RR := -(x-y); + +export (x:RRi) - (y:int) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sub_si(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (y:int) - (x:RRi) : RRi := -(x-y); + +export (x:RR) - (y:ZZ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sub_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) - (y:ZZ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sub_z(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) - (y:QQ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sub_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) - (y:QQ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sub_q(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RRi) - (y:RR) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_sub_fr(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export abs(x:RR) : RR := if isNegative0(x) then -x else x; + +export abs(x:RRi) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_abs(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export (x:RR) * (y:RR) : RR := ( + z := newRRmutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfr_mul(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) * (y:RRi) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_mul(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) * (y:ZZ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_mul_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) * (y:ZZ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_mul_z(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (y:ZZ) * (x:RR) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_mul_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (y:ZZ) * (x:RRi) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_mul_z(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) * (y:int) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_mul_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) * (y:int) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_mul_si(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (y:int) * (x:RR) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_mul_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (y:int) * (x:RRi) : RRi := x*y; + +export (x:RR) * (y:QQ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_mul_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) * (y:QQ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_mul_q(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RRi) * (y:RR) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_mul_fr(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) / (y:RR) : RR := ( + z := newRRmutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfr_div(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) / (y:RRi) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_div(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (x:RR) / (y:long) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_div_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RR) / (y:int) : RR := x / long(y); + +export (x:RRi) / (y:long) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_div_si(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (y:long) / (x:RRi) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_si_div(", z, ",", y, ",", x, ")" ); + moveToRRiandclear(z)); + +export (x:RRi) / (y:int) : RRi := x / long(y); + +export (y:int) / (x:RRi) : RRi := long(y) / x; + +export (x:RR) / (y:ZZ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_div_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) / (y:ZZ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_div_z(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (y:ZZ) / (x:RRi) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_z_div(", z, ",", y, ",", x, ")" ); + moveToRRiandclear(z)); + +export (x:RR) / (y:QQ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_div_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) / (y:QQ) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_div_q(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (y:QQ) / (x:RRi) : RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_q_div(", z, ",", y, ",", x, ")" ); + moveToRRiandclear(z)); + +export (x:RRi) / (y:RR) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_div_fr(", z, ",", x, ",", y, ")" ); + moveToRRiandclear(z)); + +export (y:RR) / (x:RRi) : RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_fr_div(", z, ",", y, ",", x, ")" ); + moveToRRiandclear(z)); + +export sqrt(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sqrt(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export sqrt(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sqrt(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export (x:RR) ^ (n:long) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_pow_si(", z, ",", x, ",", n, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) ^ (n:long) : RRi := ( + if (n == long(0)) then return toRRi(1,precision0(x)); + + left := newRRmutable(precision0(x)); + right := newRRmutable(precision0(x)); + extra := newRRmutable(precision0(x)); + + upper := newRRmutable(precision0(x)); + lower := newRRmutable(precision0(x)); + + if contains0(x) then Ccode(void, "mpfr_set_si(", extra, ",0, MPFR_RNDN)") + else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); + + Ccode( void, "mpfr_pow_si(", left, ",", leftRR(x), ",", n, ", MPFR_RNDU)" ); + Ccode( void, "mpfr_pow_si(", right, ",", rightRR(x), ",", n, ", MPFR_RNDU)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); + + if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); + + Ccode( void, "mpfr_pow_si(", left, ",", leftRR(x), ",", n, ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow_si(", right, ",", rightRR(x), ",", n, ", MPFR_RNDD)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); + + clear(left); + clear(right); + clear(extra); + + toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); + +export (x:RR) ^ (n:ulong) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_pow_ui(", z, ",", x, ",", n, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) ^ (n:ulong) : RRi := ( + if (n == ulong(0)) then return toRRi(1,precision0(x)); + + left := newRRmutable(precision0(x)); + right := newRRmutable(precision0(x)); + extra := newRRmutable(precision0(x)); + + upper := newRRmutable(precision0(x)); + lower := newRRmutable(precision0(x)); + + if contains0(x) then Ccode(void, "mpfr_set_ui(", extra, ",0, MPFR_RNDN)") + else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); + + Ccode( void, "mpfr_pow_ui(", left, ",", leftRR(x), ",", n, ", MPFR_RNDU)" ); + Ccode( void, "mpfr_pow_ui(", right, ",", rightRR(x), ",", n, ", MPFR_RNDU)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); + + if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); + + Ccode( void, "mpfr_pow_ui(", left, ",", leftRR(x), ",", n, ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow_ui(", right, ",", rightRR(x), ",", n, ", MPFR_RNDD)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); + + clear(left); + clear(right); + clear(extra); + + toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); + +export pow10(n:ulong,prec:ulong):RR := ( + z := newRRmutable(prec); + Ccode( void, "mpfr_ui_pow_ui(", z, ",", ulong(10), ",", n, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export pow10RRi(n:ulong,prec:ulong):RRi := ( + left := newRRmutable(prec); + right := newRRmutable(prec); + Ccode( void, "mpfr_ui_pow_ui(", left, ",", ulong(10), ",", n, ", MPFR_RNDD)" ); + Ccode( void, "mpfr_ui_pow_ui(", right, ",", ulong(10), ",", n, ", MPFR_RNDU)" ); + toRRi(moveToRRandclear(left),moveToRRandclear(right))); + +export pow10(n:long,prec:ulong):RR := ( + if n < long(0) + then (pow10(ulong(-n),prec))^long(-1) + else pow10(ulong(n),prec)); + +export pow10RRi(n:long,prec:ulong):RRi := ( + if n < long(0) + then (pow10RRi(ulong(-n),prec))^long(-1) + else pow10RRi(ulong(n),prec)); + +export pow10(n:int,prec:ulong):RR := pow10(long(n),prec); + +export pow10RRi(n:int,prec:ulong):RRi := pow10RRi(long(n),prec); + +export (n:ulong) ^ (x:RR) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_ui_pow(", z, ",", n, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (n:ulong) ^ (x:RRi) : RRi := ( + if (n == ulong(1)) then return toRRi(1,precision0(x)); + + left := newRRmutable(precision0(x)); + right := newRRmutable(precision0(x)); + + if (n > ulong(1)) then ( + Ccode( void, "mpfr_ui_pow(", left, ",", n, ",", leftRR(x), ", MPFR_RNDD)" ); + Ccode( void, "mpfr_ui_pow(", right, ",", n, ",", rightRR(x), ", MPFR_RNDU)" )) + else ( + Ccode( void, "mpfr_ui_pow(", left, ",", n, ",", rightRR(x), ", MPFR_RNDD)" ); + Ccode( void, "mpfr_ui_pow(", right, ",", n, ",", leftRR(x), ", MPFR_RNDU)" )); + + toRRi(moveToRRandclear(left),moveToRRandclear(right))); + +export (x:RR) ^ (y:ZZ) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_pow_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) ^ (y:ZZ) : RRi := ( + if (isZero0(y)) then return toRRi(1,precision0(x)); + + left := newRRmutable(precision0(x)); + right := newRRmutable(precision0(x)); + extra := newRRmutable(precision0(x)); + + upper := newRRmutable(precision0(x)); + lower := newRRmutable(precision0(x)); + + if contains0(x) then Ccode(void, "mpfr_set_ui(", extra, ",0, MPFR_RNDN)") + else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); + + Ccode( void, "mpfr_pow_z(", left, ",", leftRR(x), ",", y, ", MPFR_RNDU)" ); + Ccode( void, "mpfr_pow_z(", right, ",", rightRR(x), ",", y, ", MPFR_RNDU)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); + + if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); + + Ccode( void, "mpfr_pow_z(", left, ",", leftRR(x), ",", y, ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow_z(", right, ",", rightRR(x), ",", y, ", MPFR_RNDD)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); + + clear(left); + clear(right); + clear(extra); + + toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); + +export (x:RR) ^ (y:RR) : RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_pow(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (y:RR) ^ (x:RRi) : RRi := ( + -- Needs y >= 0 + if (y == toRR(1,precision0(y))) then return toRRi(1,min(precision0(x),precision0(y))); + + left := newRRmutable(min(precision0(x),precision0(y))); + right := newRRmutable(min(precision0(x),precision0(y))); + + if (y > toRR(1,precision0(y))) then ( + Ccode( void, "mpfr_pow(", left, ",", y, ",", leftRR(x), ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow(", right, ",", y, ",", rightRR(x), ", MPFR_RNDU)" )) + else ( + Ccode( void, "mpfr_pow(", left, ",", y, ",", rightRR(x), ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow(", right, ",", y, ",", leftRR(x), ", MPFR_RNDU)" )); + + toRRi(moveToRRandclear(left),moveToRRandclear(right))); + +export (x:RRi) ^ (y:RR) : RRi := ( + if (y == toRR(0,precision0(y))) then return toRRi(1,min(precision0(x),precision0(y))); + + left := newRRmutable(min(precision0(x),precision0(y))); + right := newRRmutable(min(precision0(x),precision0(y))); + extra := newRRmutable(min(precision0(x),precision0(y))); + + upper := newRRmutable(min(precision0(x),precision0(y))); + lower := newRRmutable(min(precision0(x),precision0(y))); + + if contains0(x) then Ccode(void, "mpfr_set_ui(", extra, ",0, MPFR_RNDN)") + else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); + + Ccode( void, "mpfr_pow(", left, ",", leftRR(x), ",", y, ", MPFR_RNDU)" ); + Ccode( void, "mpfr_pow(", right, ",", rightRR(x), ",", y, ", MPFR_RNDU)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) + then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); + + if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); + + Ccode( void, "mpfr_pow(", left, ",", leftRR(x), ",", y, ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow(", right, ",", rightRR(x), ",", y, ", MPFR_RNDD)" ); + + if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) + then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) + else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) + then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); + + clear(left); + clear(right); + clear(extra); + + toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); + +export (y:RRi) ^ (x:RRi) : RRi := ( + -- Assumes that y >= 0 +-- if (y == toRRi(1,precision0(y))) then return toRRi(1,min(precision0(x),precision0(y))); + + left := newRRmutable(min(precision0(x),precision0(y))); + right := newRRmutable(min(precision0(x),precision0(y))); + + upperright := newRRmutable(min(precision0(x),precision0(y))); + upperleft := newRRmutable(min(precision0(x),precision0(y))); + lowerright := newRRmutable(min(precision0(x),precision0(y))); + lowerleft := newRRmutable(min(precision0(x),precision0(y))); + + Ccode( void, "mpfr_pow(", upperleft, ",", leftRR(y), ",", rightRR(x), ", MPFR_RNDU)" ); + Ccode( void, "mpfr_pow(", upperright, ",", rightRR(y), ",", rightRR(x), ", MPFR_RNDU)" ); + Ccode( void, "mpfr_pow(", lowerleft, ",", leftRR(y), ",", leftRR(x), ", MPFR_RNDU)" ); + Ccode( void, "mpfr_pow(", lowerright, ",", rightRR(y), ",", leftRR(x), ", MPFR_RNDU)" ); + + if (Ccode(int, "mpfr_cmp(", upperleft, ",", upperright, ")") > 0) then ( + if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") > 0) then ( + if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerleft, ")") > 0) + then Ccode(void, "mpfr_set(", right, ",", upperleft, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", right, ",", lowerleft, ", MPFR_RNDU)")) + else ( + if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerright, ")") > 0) + then Ccode(void, "mpfr_set(", right, ",", upperleft, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", right, ",", lowerright, ", MPFR_RNDU)"))) + else ( + if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") > 0) then ( + if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerleft, ")") > 0) + then Ccode(void, "mpfr_set(", right, ",", upperright, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", right, ",", lowerleft, ", MPFR_RNDU)")) + else ( + if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerright, ")") > 0) + then Ccode(void, "mpfr_set(", right, ",", upperright, ", MPFR_RNDU)") + else Ccode(void, "mpfr_set(", right, ",", lowerright, ", MPFR_RNDU)"))); + + Ccode( void, "mpfr_pow(", upperleft, ",", leftRR(y), ",", rightRR(x), ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow(", upperright, ",", rightRR(y), ",", rightRR(x), ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow(", lowerleft, ",", leftRR(y), ",", leftRR(x), ", MPFR_RNDD)" ); + Ccode( void, "mpfr_pow(", lowerright, ",", rightRR(y), ",", leftRR(x), ", MPFR_RNDD)" ); + + if (Ccode(int, "mpfr_cmp(", upperleft, ",", upperright, ")") < 0) then ( + if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") < 0) then ( + if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerleft, ")") < 0) + then Ccode(void, "mpfr_set(", left, ",", upperleft, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", left, ",", lowerleft, ", MPFR_RNDD)")) + else ( + if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerright, ")") < 0) + then Ccode(void, "mpfr_set(", left, ",", upperleft, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", left, ",", lowerright, ", MPFR_RNDD)"))) + else ( + if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") < 0) then ( + if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerleft, ")") < 0) + then Ccode(void, "mpfr_set(", left, ",", upperright, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", left, ",", lowerleft, ", MPFR_RNDD)")) + else ( + if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerright, ")") < 0) + then Ccode(void, "mpfr_set(", left, ",", upperright, ", MPFR_RNDD)") + else Ccode(void, "mpfr_set(", left, ",", lowerright, ", MPFR_RNDD)"))); + + clear(upperleft); + clear(lowerleft); + clear(upperright); + clear(lowerright); + + toRRi(moveToRRandclear(left),moveToRRandclear(right))); + +export floor(x:RR) : ZZ := ( + if !isfinite0(x) then return zeroZZ; -- nothing else to do! + w := newZZmutable(); + Ccode( void, "mpfr_get_z(", w, ",", x, ", MPFR_RNDD)" ); + moveToZZandclear(w)); + +export floor(x:RRi) : ZZ := floor(leftRR(x)); + +export ceil(x:RR) : ZZ := ( + if !isfinite0(x) then return zeroZZ; -- nothing else to do! + w := newZZmutable(); + Ccode( void, "mpfr_get_z(", w, ",", x, ", MPFR_RNDU)" ); + moveToZZandclear(w)); + +export ceil(x:RRi) : ZZ := ceil(rightRR(x)); + +export round(x:RR) : ZZ := ( + if !isfinite0(x) then return zeroZZ; -- nothing else to do! + w := newZZmutable(); + Ccode( void, "mpfr_get_z(", w, ",", x, ", MPFR_RNDN)" ); + moveToZZandclear(w)); + +export round(x:RRi) : ZZ := ( + if !isfinite0(x) then return zeroZZ; -- nothing else to do! + w := newRRmutable(precision0(x)); + Ccode( void, "mpfi_get_fr(", w, ",", x, ")" ); + if !isfinite0(w) then return zeroZZ; -- nothing else to do! + y := newZZmutable(); + Ccode( void, "mpfr_get_z(", y, ",", w, ", MPFR_RNDN)" ); + clear(w); + moveToZZandclear(y)); + +export (x:RR) << (n:long) : RR := ( + if n == long(0) then return x; + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_mul_2si(", z, ",", x, ",", n, ",MPFR_RNDN)" ); + moveToRRandclear(z)); + +export (x:RRi) << (n:long) : RRi := ( + if n == long(0) then return x; + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_mul_2si(", z, ",", x, ",", n, ")" ); + moveToRRiandclear(z)); + +export (x:RR) >> (n:long) : RR := x << -n; + +export (x:RRi) >> (n:long) : RRi := x << -n; + +export (x:RR) << (n:int) : RR := x << long(n); + +export (x:RRi) << (n:int) : RRi := x << long(n); + +export (x:RR) >> (n:int) : RR := x << long(-n); + +export (x:RRi) >> (n:int) : RRi := x << long(-n); + +-- complex arithmetic + +export (x:CC) + (y:CC) : CC := toCC(x.re+y.re, x.im+y.im); + +export (x:CCi) + (y:CCi) : CCi := toCCi(x.re+y.re, x.im+y.im); + +export (x:CC) - (y:CC) : CC := toCC(x.re-y.re, x.im-y.im); + +export (x:CCi) - (y:CCi) : CCi := toCCi(x.re-y.re, x.im-y.im); + +export (x:RR) - (y:CC) : CC := toCC(x-y.re,-y.im); + +export (x:int) - (y:CC) : CC := toCC(x-y.re,-y.im); + +export (x:int) - (y:CCi) : CCi := toCCi(x-y.re,-y.im); + +export (x:CC) - (y:int) : CC := toCC(x.re-y,x.im); + +export (x:CC) - (y:RR) : CC := toCC(x.re-y,x.im); + +export (x:CC) + (y:RR) : CC := toCC(x.re+y,x.im); + +export (x:RR) + (y:CC) : CC := toCC(x+y.re,y.im); + +export (x:int) + (y:CC) : CC := toCC(x+y.re,y.im); + +export -(y:CC) : CC := toCC(-y.re,-y.im); + +export -(y:CCi) : CCi := toCCi(-y.re,-y.im); + +export (x:CC) * (y:RR) : CC := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) + then toCC(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCC(min(precision(x),precision(y))) + else infinityCC(min(precision(x),precision(y)))); + +export (x:CC) * (y:RRi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) + then toCCi(y*x.re, y*x.im) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (x:CCi) * (y:RRi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (x:CCi) * (y:RR) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (y:RR) * (x:CC) : CC := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) + then toCC(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCC(min(precision(x),precision(y))) + else infinityCC(min(precision(x),precision(y)))); + +export (y:RRi) * (x:CC) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) + then toCCi(y*x.re, y*x.im) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (y:RRi) * (x:CCi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (y:RR) * (x:CCi) : CCi := ( + if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) + then toCCi(x.re*y, x.im*y) + else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) + else infinityCCi(min(precision(x),precision(y)))); + +export (y:int) * (x:CC) : CC := ( + if isinf(x) && y != 0 + then infinityCC(precision(x)) + else toCC(x.re*y, x.im*y)); + +export (x:CC) * (y:ZZ) : CC := ( + if isinf(x) && !isZero(y) + then infinityCC(precision(x)) + else toCC(x.re*y, x.im*y)); + +export (x:CCi) * (y:ZZ) : CCi := ( + if isinf(x) && !isZero(y) + then infinityCCi(precision(x)) + else toCCi(x.re*y, x.im*y)); + +export (y:ZZ) * (x:CC) : CC := ( + if isinf(x) && !isZero(y) + then infinityCC(precision(x)) + else toCC(x.re*y, x.im*y)); + +export (y:ZZ) * (x:CCi) : CCi := ( + if isinf(x) && !isZero(y) + then infinityCCi(precision(x)) + else toCCi(x.re*y, x.im*y)); + +export (x:CC) * (y:CC) : CC := ( + if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) + then infinityCC(min(precision(x),precision(y))) + else toCC(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); + +export (x:CC) * (y:CCi) : CCi := ( + if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) + then infinityCCi(min(precision(x),precision(y))) + else toCCi(y.re*x.re-y.im*x.im, y.re*x.im+y.im*x.re)); + +export (x:CCi) * (y:CC) : CCi := ( + if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) + then infinityCCi(min(precision(x),precision(y))) + else toCCi(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); + +export (x:CCi) * (y:CCi) : CCi := ( + if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) + then infinityCCi(min(precision(x),precision(y))) + else toCCi(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); + +export (x:CC) / (y:RR) : CC := ( + if isZero(y) && !isnan(x) && !isZero(x) + then infinityCC(min(precision(x),precision(y))) + else toCC(x.re/y, x.im/y)); + +export (x:CC) / (y:int) : CC := ( + if y == 0 && !isnan(x) && !isZero(x) + then infinityCC(precision(x)) + else toCC(x.re/y, x.im/y)); + +export conj(x:CC):CC := toCC(x.re,-x.im); + +export norm2(x:CC):RR := x.re*x.re + x.im*x.im; + +export norm2(x:CCi):RRi := x.re*x.re + x.im*x.im; + +export (x:CC) << (n:long) : CC := if n == long(0) then x else CC(x.re<> (n:long) : CCi := if n == long(0) then x else CCi(x.re>>n,x.im>>n); + +export (x:CC) >> (n:long) : CC := if n == long(0) then x else CC(x.re>>n,x.im>>n); + +export (x:CC) << (n:int) : CC := if n == 0 then x else CC(x.re<> (n:int) : CC := if n == 0 then x else CC(x.re>>n,x.im>>n); + +export inverse(z:CC):CC := ( + if isfinite(z) then + if isZero0(z.re) && isZero0(z.im) then infinityCC(precision0(z.re)) + else ( + expon := exponent(z); + if expon > 10000 || expon < -10000 then z = z >> expon else expon = long(0); + n2 := norm2(z); + toCC((z.re/n2) >> expon, -(z.im/n2) >> expon)) + else if isinf(z) then toCC(0,0,precision(z)) + else nanCC(precision(z))); + +export inverse(z:CCi):CCi := ( + if isfinite(z) then + if isZero0(z.re) && isZero0(z.im) then infinityCCi(precision0(z.re)) + else ( + expon := exponent(z); + if expon > 10000 || expon < -10000 then z = z >> expon else expon = long(0); + n2 := norm2(z); + toCCi((z.re/n2) >> expon, -(z.im/n2) >> expon)) + else if isinf(z) then toCCi(0,0,precision(z)) + else nanCCi(precision(z))); + +export (x:CC) / (y:CC) : CC := x * inverse(y); + +export (x:CCi) / (y:CC) : CCi := x * inverse(y); + +export (x:CCi) / (y:CCi) : CCi := toCCi((x.re*y.re+x.im*y.im)/(y.re*y.re+y.im*y.im),(x.im*y.re-x.re*y.im)/(y.re*y.re+y.im*y.im)); + +export (x:RR) / (y:CC) : CC := x * inverse(y); + +export (x:RRi) / (y:CC) : CCi := x * inverse(y); + +export (x:ZZ) / (y:CC) : CC := x * inverse(y); + +export (x:int) / (y:CC) : CC := x * inverse(y); + +export strictequality(x:CC,y:CC):bool := strictequality(x.re,y.re) && strictequality(x.im,y.im); + +export strictequality(x:CCi,y:CCi):bool := strictequality(x.re,y.re) && strictequality(x.im,y.im); + +export (x:CC) === (y:CC) : bool := x.re === y.re && x.im === y.im; + +export (x:CCi) === (y:CCi) : bool := x.re === y.re && x.im === y.im; + +export (x:CCi) === (y:CC) : bool := x.re === y.re && x.im === y.im; + +export (x:CC) === (y:CCi) : bool := x.re === y.re && x.im === y.im; + +export (x:CC) === (y:RR) : bool := x.re === y && x.im === 0; + +export (x:CCi) === (y:RRi) : bool := x.re === y && x.im === 0; + +export (x:CCi) === (y:RR) : bool := x.re === y && x.im === 0; + +export (x:RR) === (y:CC) : bool := x === y.re && y.im === 0; + +export (x:RRi) === (y:CCi) : bool := x === y.re && y.im === 0; + +export (x:RR) === (y:CCi) : bool := x === y.re && y.im === 0; + +export (x:CC) === (y:ZZ) : bool := x.re === y && x.im === 0; + +export (x:CCi) === (y:ZZ) : bool := x.re === y && x.im === 0; + +export (x:ZZ) === (y:CC) : bool := x === y.re && y.im === 0; + +export (x:ZZ) === (y:CCi) : bool := x === y.re && y.im === 0; + +export (x:CC) === (y:QQ) : bool := x.re === y && x.im === 0; + +export (x:CCi) === (y:QQ) : bool := x.re === y && x.im === 0; + +export (x:QQ) === (y:CC) : bool := x === y.re && y.im === 0; + +export (x:QQ) === (y:CCi) : bool := x === y.re && y.im === 0; + +export compare(x:CC,y:CC):int := ( + if ( isinf(x.re) || isinf(y.re) || isinf(x.im) || isinf(y.im) ) then ( + setflag0(); + return 0; + ); + r := compare(x.re,y.re); + if flagged() || r != 0 then r + else compare(x.im,y.im)); + +export compare(x:CC,y:RR):int := ( + if ( isinf(x.re) || isinf(x.im) || isinf(y) ) then ( + setflag0(); + return 0; + ); + r := compare(x.re,y); + if flagged() || r != 0 then r + else compare0(x.im,0)); + +export compare(x:RR,y:CC):int := ( + if ( isinf(x) || isinf(y.re) || isinf(y.im) ) then ( + setflag0(); + return 0; + ); + r := compare(x,y.re); + if flagged() || r != 0 then r + else -compare0(y.im,0)); + +export compare(x:CC,y:ZZ):int := ( + if ( isinf(x.re) || isinf(x.im) ) then ( + setflag0(); + return 0; + ); + r := compare(x.re,y); + if flagged() || r != 0 then r + else compare0(x.im,0)); + +export compare(x:ZZ,y:CC):int := ( + if ( isinf(y.re) || isinf(y.im) ) then ( + setflag0(); + return 0; + ); + r := compare(x,y.re); + if flagged() || r != 0 then r + else -compare0(y.im,0)); + +export compare(x:CC,y:QQ):int := ( + if ( isinf(x.re) || isinf(x.im) ) then ( + setflag0(); + return 0; + ); + r := compare(x.re,y); + if flagged() || r != 0 then r + else compare0(x.im,0)); + +export compare(x:QQ,y:CC):int := ( + if ( isinf(y.re) || isinf(y.im) ) then ( + setflag0(); + return 0; + ); + r := compare(x,y.re); + if flagged() || r != 0 then r + else -compare0(y.im,0)); + +export abs(x:CC):RR := ( + z := newRRmutable(precision(x)); + Ccode( void, "mpfr_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); + moveToRRandclear(z)); + +--export abs(x:CCi):RRi := ( +-- z := newRRimutable(precision(x)); +-- Ccode( void, "mpfi_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); +-- moveToRRiandclear(z)); + +header "#include "; + +export sqrt(x:CC):CC := ( + z := newCCmutable(precision(x)); + Ccode( void, "mpfc_sqrt(", z, ",", x, ")" ); -- see ../e/complex.c + moveToCCandclear(z)); + +-- real transcendental functions + +export pi(prec:ulong):RR := ( + z := newRRmutable(prec); + Ccode( void, "mpfr_const_pi(", z, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export piRRi(prec:ulong):RRi := ( + z := newRRimutable(prec); + Ccode( void, "mpfi_const_pi(", z, ")" ); + moveToRRiandclear(z)); + +export eRRi(prec:ulong):RRi := ( + z := newRRimutable(prec); + Ccode( void, "mpfi_const_euler(", z, ")" ); + moveToRRiandclear(z)); + +export cRRi(prec:ulong):RRi := ( + z := newRRimutable(prec); + Ccode( void, "mpfi_const_catalan(", z, ")" ); + moveToRRiandclear(z)); + +export exp(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_exp(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export exp(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_exp(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export log(x:RR):RR := ( -- works only if x>0 + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_log(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export log(x:RRi):RRi := ( -- works only if x>0 + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_log(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export log(b:RR,x:RR):RR := ( -- works only if x>0 and b>0 + if precision0(b) < precision0(x) then x = toRR(x,precision0(b)) + else if precision0(b) > precision0(x) then b = toRR(b,precision0(x)); + log(x)/log(b)); + +export log(b:RRi,x:RRi):RRi := ( -- works only if x>0 and b>0 + if precision0(b) < precision0(x) then x = toRRi(x,precision0(b)) + else if precision0(b) > precision0(x) then b = toRRi(b,precision0(x)); + log(x)/log(b)); + +export sin(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sin(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export sin(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sin(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export cos(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_cos(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export cos(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_cos(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export tan(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_tan(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export tan(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_tan(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export asin(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_asin(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export asin(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_asin(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export acos(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_acos(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export acos(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_acos(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export atan(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_atan(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export atan(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_atan(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export atan2(y:RR,x:RR):RR := ( + -- if isZero0(x) && isZero0(y) && isfinite0(x) && isfinite0(y) then return nanRR(min(precision0(x),precision0(y))); + z := newRRmutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfr_atan2(", z, ",", y, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export atan2(y:RRi,x:RRi):RRi := ( + z := newRRimutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfi_atan2(", z, ",", y, ",", x, ")" ); + moveToRRiandclear(z)); + +export Beta(x:RR,y:RR):RR := ( + z := newRRmutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfr_beta(", z, ",", y, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export agm(x:RR,y:RR):RR := ( + z := newRRmutable(min(precision0(x),precision0(y))); + Ccode( void, "mpfr_agm(", z, ",", x, ",", y, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export sinh(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sinh(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export sinh(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sinh(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export cosh(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_cosh(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export cosh(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_cosh(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export tanh(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_tanh(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export tanh(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_tanh(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export sec(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sec(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export sec(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sec(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export csc(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_csc(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export csc(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_csc(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export cot(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_cot(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export cot(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_cot(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export sech(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_sech(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export sech(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_sech(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export csch(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_csch(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export csch(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_csch(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export coth(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_coth(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export coth(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_coth(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export factorial(x:ulong):ZZ := ( + w := newZZmutable(); + Ccode( void, "mpz_fac_ui(", w, ",", x, ")" ); + moveToZZandclear(w)); + +export binomial(n:ZZ, k:ulong):ZZ := ( + w := newZZmutable(); + Ccode(void, "mpz_bin_ui(", w, ", ", n, ", ", k, ")"); + moveToZZandclear(w)); + +export log1p(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_log1p(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export log1p(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_log1p(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export expm1(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_expm1(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export expm1(x:RRi):RRi := ( + z := newRRimutable(precision0(x)); + Ccode( void, "mpfi_expm1(", z, ",", x, ")" ); + moveToRRiandclear(z)); + +export Gamma(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_gamma(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export Gamma(s:RR,x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_gamma_inc(", z, ",", s, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export Digamma(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_digamma(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export factorial(x:RR):RR := Gamma(x+1); + +export eint(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_eint(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); +--export lngamma(x:RR):RR := ( +-- z := newRRmutable(precision0(x)); +-- Ccode( void, "mpfr_lngamma(", z, ",", x, ", MPFR_RNDN)" ); +-- moveToRRandclear(z)); + +export zeta(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_zeta(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export zeta(x:ulong,prec:ulong):RR := ( + z := newRRmutable(prec); + Ccode( void, "mpfr_zeta_ui(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export erf(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_erf(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export erfc(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_erfc(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export j0(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_j0(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export j1(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_j1(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export jn(n:long,x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_jn(", z, ",",n,",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export y0(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_y0(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export y1(x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_y1(", z, ",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export yn(n:long,x:RR):RR := ( + z := newRRmutable(precision0(x)); + Ccode( void, "mpfr_yn(", z, ",",n,",", x, ", MPFR_RNDN)" ); + moveToRRandclear(z)); + +export signbit(x:RR):bool := 0 != Ccode(int,"mpfr_signbit(",x,")"); + +-- complex transcendental functions + +export exp(z:CC):CC := exp(z.re) * toCC(cos(z.im),sin(z.im)); + +export log(z:CC):CC := toCC(log(abs(z)),atan2(z.im,z.re)); + +export logc(x:RR):CC := ( -- works also for x<0 + if x<0 then toCC(log(-x),pi(precision0(x))) else toCC(log(x))); + +export logc(b:RR,x:RR):CC := ( -- works also for x<0 or b<0 + if precision0(b) < precision0(x) then x = toRR(x,precision0(b)) + else if precision0(b) > precision0(x) then b = toRR(b,precision0(x)); + if b<0 then ( + if x<0 then logc(x)/logc(b) else log(x)/logc(b) + ) + else if x<0 then logc(x)/log(b) else toCC(log(x)/log(b))); + +export log(b:CC,x:CC):CC := ( + if precision(b) < precision(x) then x = toCC(x,precision(b)) + else if precision(b) > precision(x) then b = toCC(b,precision(x)); + log(x)/log(b)); + +export log(b:RR,x:CC):CC := ( + if precision(b) < precision(x) then x = toCC(x,precision0(b)) + else if precision(b) > precision(x) then b = toRR(b,precision(x)); + if b<0 then log(x)/logc(b) else log(x)/log(b)); + +export log(b:CC,x:RR):CC := ( + if precision(b) < precision(x) then x = toRR(x,precision(b)) + else if precision(b) > precision(x) then b = toCC(b,precision(x)); + if x<0 then logc(x)/log(b) else log(x)/log(b)); + +export agm(x:CC,y:CC):CC := ( + if precision(y) < precision(x) then x = toCC(x,precision(y)) + else if precision(y) > precision(x) then y = toCC(y,precision(x)); + while true do ( + if !isfinite0(x.re) || !isfinite0(x.im) then return x; + if !isfinite0(y.re) || !isfinite0(y.im) then return y; + if x === 0 then return x; + if y === 0 then return y; + t := (x+y)/2; + diff := x-y; + prec := long(precision(x)); -- in practice, max prec is 2^31 - 1, so fits in an int, too. + if exponent(diff) + 3*(prec/4) < exponent(x) then return t; + u := sqrt(x*y); + x = t; + y = u; + )); + +itimes(z:CC):CC := toCC(-z.im, z.re); +mitimes(z:CC):CC := toCC(z.im, -z.re); +idiv(z:CC):CC := toCC(z.im, -z.re); +eitimes(z:CC):CC := exp(itimes(z)); +emitimes(z:CC):CC := exp(mitimes(z)); + +export cos(z:CC):CC := (eitimes(z) + emitimes(z))/2; + +export sin(z:CC):CC := idiv(eitimes(z) - emitimes(z))/2; + +export cot(z:CC):CC := cos(z)/sin(z); + +export tan(z:CC):CC := sin(z)/cos(z); + +export csc(z:CC):CC := 1/sin(z); + +export sec(z:CC):CC := 1/cos(z); + +export cosh(z:CC):CC := (exp(z) + exp(-z))/2; + +export sinh(z:CC):CC := (exp(z) - exp(-z))/2; + +export tanh(z:CC):CC := (exp(z) - exp(-z))/(exp(z) + exp(-z)); + +export coth(z:CC):CC := (exp(z) + exp(-z))/(exp(z) - exp(-z)); + +export sech(z:CC):CC := 1/cosh(z); + +export csch(z:CC):CC := 1/sinh(z); + +square(z:CC):CC := ( + if isfinite0(z.re) && isfinite0(z.im) then toCC(z.re^long(2)-z.im^long(2),2*z.re*z.im) + else if isnan0(z.re) || isnan0(z.im) then nanCC(precision0(z.re)) + else infinityCC(precision0(z.re)) + ); + +square(z:CCi):CCi := ( + if isfinite0(z.re) && isfinite0(z.im) then toCCi(z.re^long(2)-z.im^long(2),2*z.re*z.im) + else if isnan0(z.re) || isnan0(z.im) then nanCCi(precision0(z.re)) + else infinityCCi(precision0(z.re)) + ); + +export acos(z:CC):CC := idiv(log(z+itimes(sqrt(1-square(z))))); + +export asin(z:CC):CC := idiv(log(sqrt(1-square(z))+itimes(z))); + +export abs2(z:CC):RR := z.re^long(2) + z.im^long(2); + +export abs2(z:CCi):RRi := z.re^long(2) + z.im^long(2); + +export atan(x:CC):CC := ( + if isnan(x) then return x; + if isinf(x) then return toCC(atan(infinityRR(precision(x)))); + ss := abs2(x); + y2 := x.im << 1; + toCC( atan2(x.re<<1,1-ss)>>1, log((ss+1+y2)/(ss+1-y2))>>2 )); + +export (x:CC) ^ (y:CC):CC := exp(log(x)*y); + +export (x:CC) ^ (y:RR):CC := exp(log(x)*y); + +export (x:CC) ^ (y:ZZ):CC := ( + if isZero0(y) then return toCC(1,0,precision0(x.re)); + if isZero0(x.re) && isZero0(x.im) && isfinite0(x.re) && isfinite0(x.im) then return if isNegative0(y) then infinityCC(precision0(x.re)) else x; + if isinf(x) then return if isNegative0(y) then toCC(0,precision0(x.re)) else x; + if isLong(y) then ( + n := toLong(y); + if n == long(0) then return toCC(1,precision(x)); + if n == long(1) then return x; + if n == long(-1) then return inverse(x); + if n == long(2) then return square(x); + if n == long(-2) then return inverse(square(x)); + -- we could do a few more of these optimizations here... + ); + exp(log(x)*y)); + +export (x:CCi) ^ (y:ZZ):CCi := ( + if isZero0(y) then return toCCi(1,0,precision0(x.re)); + if isZero0(x.re) && isZero0(x.im) && isfinite0(x.re) && isfinite0(x.im) then return if isNegative0(y) then infinityCCi(precision0(x.re)) else x; + if isinf(x) then return if isNegative0(y) then toCCi(0,precision0(x.re)) else x; + if isLong(y) then ( + n := toLong(y); + if n == long(0) then return toCCi(1,precision(x)); + if n == long(1) then return x; + if n == long(-1) then return inverse(x); + if n == long(2) then return square(x); + if n == long(-2) then return inverse(square(x)); + -- we could do a few more of these optimizations here... + ); + if isEven(y) then return square(x^(y >> 1)) + else (return x*(x^(y-1)))); + +export (x:RR) ^ (y:CC):CC := if isNegative(x) then exp(log(toCC(x))*y) else exp(log(x)*y); + +export arrayZZ := array(ZZ); + +-- Local Variables: +-- compile-command: "echo \"make: Entering directory \\`$M2BUILDDIR/Macaulay2/d'\" && make -C $M2BUILDDIR/Macaulay2/d gmp.o " +-- End: diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index e89aba79505..1d21738be23 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -75,11 +75,11 @@ export CCicell := {+v:CCi}; dummy(x:RR):string := ""; dummyi(x:RRi):string := ""; -- Added for MPFI -dummyCCi(x:CCi):string := ""; -- Added for MPFI +dummyCCi(x:CCi):string := ""; export tostringRRpointer := dummy; export tostringRRipointer := dummyi; -- Added for MPFI -export tostringCCipointer := dummyCCi; -- Added for MPFI +export tostringCCipointer := dummyCCi; dummy(x:CC):string := ""; export tonetCCpointer := dummy; @@ -954,10 +954,6 @@ precision0(x:RR) ::= Ccode(ulong,"(unsigned long)mpfr_get_prec(", x, ")"); precision0(x:RRi) ::= Ccode(ulong,"(unsigned long)mpfi_get_prec(", x, ")"); -precision0(x:CC) ::= Ccode(ulong,"(unsigned long)mpfr_get_prec(", x, ")"); - -precision0(x:CCi) ::= Ccode(ulong,"(unsigned long)mpfi_get_prec(", x, ")"); - export precision(x:RR):ulong := precision0(x); export precision(x:RRi):ulong := precision0(x); @@ -1176,7 +1172,7 @@ export toCC(x:RR,y:RR):CC := ( export toCCi(x:RR,y:RR):CCi := ( if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) + else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec); CCi(z,z)) else if precision0(x) == precision0(y) then CCi(toRRi(x),toRRi(y)) else if precision0(x) < precision0(y) then CCi(toRRi(x),toRRi(y,precision0(x))) else CCi(toRRi(x,precision0(y)),toRRi(y)) @@ -1184,7 +1180,7 @@ export toCCi(x:RR,y:RR):CCi := ( export toCCi(x:RRi,y:RR):CCi := ( if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) + else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec); CCi(z,z)) else if precision0(x) == precision0(y) then CCi(x,toRRi(y)) else if precision0(x) < precision0(y) then CCi(x,toRRi(y,precision0(x))) else CCi(toRRi(x,precision0(y)),toRRi(y)) @@ -1192,7 +1188,7 @@ export toCCi(x:RRi,y:RR):CCi := ( export toCCi(x:RR,y:RRi):CCi := ( if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) + else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec); CCi(z,z)) else if precision0(x) == precision0(y) then CCi(toRRi(x),y) else if precision0(x) < precision0(y) then CCi(toRRi(x),toRRi(y,precision0(x))) else CCi(toRRi(x,precision0(y)),y) @@ -1200,12 +1196,12 @@ export toCCi(x:RR,y:RRi):CCi := ( export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); +export nanCCi(prec:ulong):CCi := (x := nanRR(prec); toCCi(x,x)); + export infinityCCi(prec:ulong):CCi := (x := infinityRR(prec,1); toCCi(x,x)); export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); -export nanCCi(prec:ulong):CCi := (x := nanRR(prec); toCCi(x,x)); - export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); export toCCi(x:RRi):CCi := CCi(x,toRRi(0,precision0(x))); @@ -2351,10 +2347,8 @@ export inverse(z:CCi):CCi := ( if isfinite(z) then if isZero0(z.re) && isZero0(z.im) then infinityCCi(precision0(z.re)) else ( - expon := exponent(z); - if expon > 10000 || expon < -10000 then z = z >> expon else expon = long(0); n2 := norm2(z); - toCCi((z.re/n2) >> expon, -(z.im/n2) >> expon)) + toCCi((z.re/n2), -(z.im/n2))) else if isinf(z) then toCCi(0,0,precision(z)) else nanCCi(precision(z))); diff --git a/M2/Macaulay2/d/interface.dd b/M2/Macaulay2/d/interface.dd index 042cbf228b8..030ef2e3b76 100644 --- a/M2/Macaulay2/d/interface.dd +++ b/M2/Macaulay2/d/interface.dd @@ -485,6 +485,12 @@ export rawRRi(e:Expr):Expr := ( else WrongArgZZ(1)); setupfun("rawRRi",rawRRi); +export rawCCi(e:Expr):Expr := ( + when e is prec:ZZcell do if !isInt(prec) then WrongArgSmallInteger(1) + else toExpr(Ccode(RawRingOrNull, "IM2_Ring_CCi(",toInt(prec),")" )) + else WrongArgZZ(1)); +setupfun("rawCCi",rawCCi); + export rawRR(e:Expr):Expr := ( when e is prec:ZZcell do if !isInt(prec) then WrongArgSmallInteger(1) else toExpr(Ccode(RawRingOrNull, "IM2_Ring_RRR(",toInt(prec),")" )) @@ -941,6 +947,7 @@ export rawFromNumber(e:Expr):Expr := ( is x:RRcell do toExpr(Ccode(RawRingElementOrNull, "IM2_RingElement_from_BigReal(",R.p,",",x.v,")")) is x:CCcell do toExpr(Ccode(RawRingElementOrNull, "IM2_RingElement_from_BigComplex(",R.p,",",x.v,")")) is x:RRicell do toExpr(Ccode(RawRingElementOrNull, "IM2_RingElement_from_Interval(",R.p,",",x.v,")")) + is x:CCicell do toExpr(Ccode(RawRingElementOrNull, "IM2_RingElement_from_ComplexInterval(",R.p,",",x.v,")")) else WrongArg(2,"an integer, real number, or complex number") else WrongArg(1,"a raw ring") else WrongNumArgs(2) @@ -1055,6 +1062,13 @@ export rawToRRi(e:Expr):Expr := ( WrongArg("a raw ring element")); setupfun("rawToRRi",rawToRRi); +export rawToCCi(e:Expr):Expr := ( + when e + is x:RawRingElementCell do toExpr(Ccode(CCiorNull, "IM2_RingElement_to_ComplexInterval(",x.p, ")" )) + else + WrongArg("a raw ring element")); +setupfun("rawToCCi",rawToCCi); + export rawToCC(e:Expr):Expr := ( when e is x:RawRingElementCell do toExpr(Ccode(CCorNull, "IM2_RingElement_to_BigComplex(",x.p, ")" )) diff --git a/M2/Macaulay2/e/CMakeLists.txt b/M2/Macaulay2/e/CMakeLists.txt index 72fd6ae7a45..560bc6800b0 100644 --- a/M2/Macaulay2/e/CMakeLists.txt +++ b/M2/Macaulay2/e/CMakeLists.txt @@ -182,11 +182,12 @@ set(SRCLIST SLP ZZ ZZp - aring-RRi aring-CC aring-CCC aring-RR aring-RRR + aring-RRi + aring-CCi aring-gf-flint-big aring-gf-flint aring-m2-gf diff --git a/M2/Macaulay2/e/Makefile.files b/M2/Macaulay2/e/Makefile.files index f75b786285a..ab4b200c29c 100644 --- a/M2/Macaulay2/e/Makefile.files +++ b/M2/Macaulay2/e/Makefile.files @@ -82,11 +82,12 @@ INTERFACE = \ aring-zz-flint \ aring-qq-flint \ aring-zzp-flint \ - aring-RRi \ aring-RR \ aring-CC \ aring-RRR \ aring-CCC \ + aring-RRi \ + aring-CCi \ aring-tower \ aring-gf-flint-big \ aring-gf-flint \ diff --git a/M2/Macaulay2/e/aring-CCi.cpp b/M2/Macaulay2/e/aring-CCi.cpp new file mode 100644 index 00000000000..dda28adb4e1 --- /dev/null +++ b/M2/Macaulay2/e/aring-CCi.cpp @@ -0,0 +1,35 @@ +#include "aring-CCi.hpp" + +namespace M2 { + +void ARingCCi::text_out(buffer &o) const { o << "ACCi_" << mPrecision; } +void ARingCCi::elem_text_out(buffer &o, + const ElementType &ap, + bool p_one, + bool p_plus, + bool p_parens) const +{ +// cci_struct a = &const_cast(&ap); + M2_string s1 = (*gmp_tostringRRpointer)(&(ap.re.left)); + M2_string s2 = (*gmp_tostringRRpointer)(&(ap.re.right)); + M2_string s3 = (*gmp_tostringRRpointer)(&(ap.im.left)); + M2_string s4 = (*gmp_tostringRRpointer)(&(ap.im.right)); + + if(p_plus) o << "+"; + o << "["; + o.put((char *)s1->array, s1->len); + o << ","; + o.put((char *)s2->array, s2->len); + o << "]+["; + o.put((char *)s3->array, s3->len); + o << ","; + o.put((char *)s4->array, s4->len); + o << "]i"; +} + +}; // end namespace M2 + +// Local Variables: +// compile-command: "make -C $M2BUILDDIR/Macaulay2/e " +// indent-tabs-mode: nil +// End: diff --git a/M2/Macaulay2/e/aring-CCi.hpp b/M2/Macaulay2/e/aring-CCi.hpp new file mode 100644 index 00000000000..a5d71fb2b89 --- /dev/null +++ b/M2/Macaulay2/e/aring-CCi.hpp @@ -0,0 +1,583 @@ +// Copyright 2012 Michael E. Stillman + +#ifndef _aring_CCi_hpp_ +#define _aring_CCi_hpp_ + +#include + +#include +#include "interface/random.h" +#include "interface/gmp-util.h" +#include "aring.hpp" +#include "buffer.hpp" +#include "ringelem.hpp" +#include "ringmap.hpp" +#include "aring-RRR.hpp" +#include "aring-RRi.hpp" +#include "aring-CCC.hpp" + +class CCi; +class RingMap; + +namespace M2 { +/** +\ingroup rings +*/ +class ARingCCi : public SimpleARing +{ + // Higher precision real intervals + + public: + static const RingID ringID = ring_CCi; + + typedef cci_struct elem; + typedef elem ElementType; + + ARingCCi(unsigned long precision) : mPrecision(precision) {} + // ring informational + size_t characteristic() const { return 0; } + unsigned long get_precision() const { return mPrecision; } + void text_out(buffer &o) const; + + unsigned int computeHashValue(const elem &a) const + { + std::cout << "In computeHash\n"; + double d = 12347. * mpfr_get_d(&(a.re.left), MPFR_RNDN) + 865800. * mpfr_get_d(&(a.re.right), MPFR_RNDN) + 72158 * mpfr_get_d(&(a.im.left), MPFR_RNDN) + 86429 * mpfr_get_d(&(a.im.right), MPFR_RNDN); + std::cout << "After computeHash\n"; + return static_cast(d); + } + + ///////////////////////////////// + // ElementType informational //// + ///////////////////////////////// + + bool is_unit(const ElementType &f) const { return !is_zero(f); } + bool is_zero(const ElementType &f) const { return mpfr_cmp_si(&(f.im.left), 0) == 0 and mpfr_cmp_si(&(f.im.right), 0) == 0 and + mpfr_cmp_si(&(f.re.left), 0) == 0 and + mpfr_cmp_si(&(f.re.right), 0) == 0; } + bool is_equal(const ElementType &f, const ElementType &g) const + { return + mpfr_cmp(&(f.re.left), &(g.re.left)) == 0 and mpfr_cmp(&(f.re.right), &(g.re.right)) == 0 and + mpfr_cmp(&(f.im.left), &(g.im.left)) == 0 and mpfr_cmp(&(f.im.right), &(g.im.right)) == 0; + } + + int compare_elems(const ElementType &f, const ElementType &g) const + { + int cmp = mpfi_cmp(&f.re, &g.re); + if (cmp < 0) return -1; + if (cmp > 0) return 1; + cmp = mpfi_cmp(&f.im, &g.im); + if (cmp < 0) return -1; + if (cmp > 0) return 1; + return 0; + } + + bool is_empty(const ElementType &f) const { return mpfi_is_empty(&f.re)>0 || mpfi_is_empty(&f.im)>0; } + bool is_member(const ARingCCC::ElementType &a, const ElementType &f) const { return mpfi_cmp_fr(&f.re,&a.re) == 0 && mpfi_cmp_fr(&f.im,&a.im) == 0; } + bool is_member(const ARingRRi::ElementType &a, const ElementType &f) const { return mpfi_cmp(&f.re,&a) == 0; } + bool is_member(const ARingRRR::ElementType &a, const ElementType &f) const { return mpfi_cmp_fr(&f.re,&a) == 0; } + bool is_member(mpq_srcptr a, const ElementType &f) const { return mpfi_cmp_q(&f.re,a) == 0; } + bool is_member(mpz_srcptr a, const ElementType &f) const { return mpfi_cmp_z(&f.re,a) == 0; } + bool is_member(long a, const ElementType &f) const { return mpfi_cmp_si(&f.re,a) == 0; } + bool is_member(double a, const ElementType &f) const { return mpfi_cmp_d(&f.re,a) == 0; } + + bool is_subset(const ElementType &g, const ElementType &f) const { return mpfi_cmp_fr(&f.re,&(g.re.left)) == 0 and mpfi_cmp_fr(&f.re,&(g.re.right)) == 0 and mpfi_cmp_fr(&f.im,&(g.im.left)) == 0 and mpfi_cmp_fr(&f.im,&(g.im.right)) == 0; } + + //////////////////////////// + // to/from ringelem //////// + //////////////////////////// + // These simply repackage the element as either a ringelem or an + // 'ElementType'. + // No reinitialization is done. + // Do not take the same element and store it as two different ring_elem's!! + void to_ring_elem(ring_elem &result, const ElementType &a) const + { + gmp_CCimutable res = getmemstructtype(gmp_CCimutable); + res->re = getmemstructtype(gmp_RRimutable); + res->im = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:8\n"; + mpfi_init2(res->re,mPrecision); + std::cout << "mpfi_init2:9\n"; + mpfi_init2(res->im,mPrecision); + mpfi_set(res->re,&a.re); + mpfi_set(res->im,&a.im); + result = ring_elem(moveTo_gmpCCi(res)); + } + + void from_ring_elem(ElementType &result, const ring_elem &a) const + { + mpfi_set(&result.re, &a.get_cci()->re); + mpfi_set(&result.im, &a.get_cci()->im); + } + + const ElementType &from_ring_elem_const(const ring_elem &a) const + { + return *a.get_cci(); + } + // 'init', 'init_set' functions + + void init(ElementType &result) const { + std::cout << "In init\n"; + std::cout << "mpfi_init2:3\n"; + mpfi_init2(&result.re, mPrecision); + std::cout << "mpfi_init2:4\n"; + mpfi_init2(&result.im, mPrecision); + std::cout << "After init\n"; + } + void init_set(ElementType &result, const ElementType &a) const + { + std::cout << "In init_set\n"; + init(result); + mpfi_set(&result.re, &a.re); + mpfi_set(&result.im, &a.im); + } + + void set(ElementType &result, const ElementType &a) const + { + mpfi_set(&result.re, &a.re); + mpfi_set(&result.im, &a.im); + } + + void set(ElementType &result, const gmp_CCi a) const + { + mpfi_set(&result.re, a->re); + mpfi_set(&result.im, a->im); + } + + void set_zero(ElementType &result) const + { + mpfi_set_si(&result.re, 0); + mpfi_set_si(&result.im, 0); + } + + static void clear(ElementType &result) { + mpfi_clear(&result.re); + mpfi_clear(&result.im); + } + void copy(ElementType &result, const ElementType &a) const + { + mpfi_set(&result.re, &a.re); + mpfi_set(&result.im, &a.im); + } + + void set_from_long(ElementType &result, long a) const + { + std::cout << "In set from long\n"; + mpfi_set_si(&result.re, a); + mpfi_set_si(&result.im, 0); + std::cout << "After set from long\n"; + } + + void set_var(ElementType &result, int v) const + { + mpfi_set_si(&result.re, v); + mpfi_set_si(&result.im, 0); + } + + void set_from_mpz(ElementType &result, mpz_srcptr a) const + { + mpfi_set_z(&result.re, a); + mpfi_set_si(&result.im, 0); + } + + bool set_from_mpq(ElementType &result, mpq_srcptr a) const + { + mpfi_set_q(&result.re, a); + mpfi_set_si(&result.im, 0); + return true; + } + + bool set_from_double(ElementType &result, double a) const + { + mpfi_set_d(&result.re, a); + mpfi_set_si(&result.im, 0); + return true; + } + + bool set_from_BigReal(ElementType &result, gmp_RR a) const + { + mpfi_set_fr(&result.re, a); + mpfi_set_si(&result.im, 0); + return true; + } + + bool set_from_Interval(ElementType &result, gmp_RRi a) const + { + mpfi_set(&result.re, a); + mpfi_set_si(&result.im, 0); + return true; + } + + bool set_from_BigComplex(ElementType &result, gmp_CC a) const + { + mpfi_set_fr(&result.re, a->re); + mpfi_set_fr(&result.im, a->re); + return true; + } + + bool set_from_BigComplex(ElementType &result, const cc_struct * a) const + { + mpfi_set_fr(&result.re, &a->re); + mpfi_set_fr(&result.im, &a->im); + return true; + } + + bool set_from_complex_double(ElementType &result, double re, double im) const + { + mpfi_set_d(&result.re, re); + mpfi_set_d(&result.im, im); + return true; + } + + bool set_from_ComplexInterval(ElementType &result, gmp_CCi a) const + { + mpfi_set(&result.re, a->re); + mpfi_set(&result.im, a->im); + return true; + } + + bool set_from_ComplexInterval(ElementType &result, ElementType &a) const + { + mpfi_set(&result.re, &a.re); + mpfi_set(&result.im, &a.im); + return true; + } + + void set_from_BigReals(ElementType& result, gmp_RR re, gmp_RR im) const + { + mpfi_set_fr(&result.re, re); + mpfi_set_fr(&result.im, im); + } + void set_from_doubles(ElementType& result, double re, double im) const + { + mpfi_set_d(&result.re, re); + mpfi_set_d(&result.im, im); + } + + const ARingRRi::ElementType& realPartReference(const ElementType& a) const + { + return a.re; + } + const ARingRRi::ElementType& imaginaryPartReference( + const ElementType& a) const + { + return a.im; + } + void set_real_part(ElementType& c, ARingRRi::ElementType& a) const + { + mpfi_set(&c.re, &a); + } + void set_imaginary_part(ElementType& c, ARingRRi::ElementType& a) const + { + mpfi_set(&c.im, &a); + } + + // arithmetic + void negate(ElementType &result, const ElementType &a) const + { + mpfi_mul_si(&result.re, &a.re, -1); + mpfi_mul_si(&result.im, &a.im, -1); + } + + void invert(ElementType &result, const ElementType &a) const + // we silently assume that a != 0. If it is, result is set to a^0, i.e. 1 + { + mpfi_t norm, temp; + std::cout << "mpfi_init2:5\n"; + mpfi_init2(norm,get_precision()); + std::cout << "mpfi_init2:6\n"; + mpfi_init2(temp,get_precision()); + mpfi_set(norm,&a.re); + mpfi_mul(norm,norm,norm); + mpfi_set(temp,&a.im); + mpfi_mul(temp,temp,temp); + mpfi_add(norm,norm,temp); + mpfi_set(&result.re,&a.re); + mpfi_mul_si(&result.im,&a.im,-1); + mpfi_div(&result.re,&result.re,norm); + mpfi_div(&result.im,&result.im,norm); + } + + void add(ElementType &result, + const ElementType &a, + const ElementType &b) const + { + mpfi_add(&result.re, &a.re, &b.re); + mpfi_add(&result.im, &a.im, &b.im); + } + + + void addMultipleTo(ElementType &result, + const ElementType &a, + const ElementType &b) const + { + ElementType ab; + init(ab); + mult(ab,a,b); + add(result,result,ab); + } + + + void subtract(ElementType &result, + const ElementType &a, + const ElementType &b) const + { + mpfi_sub(&result.re, &a.re, &b.re); + mpfi_sub(&result.im, &a.im, &b.im); + } + + void subtract_multiple(ElementType &result, + const ElementType &a, + const ElementType &b) const + { + // result -= a*b + ElementType ab; + init(ab); + mult(ab, a, b); + subtract(result, result, ab); + clear(ab); + } + + void mult(ElementType &result, + const ElementType &a, + const ElementType &b) const + { + mpfi_t temp; + std::cout << "mpfi_init2:7\n"; + mpfi_init2(temp,get_precision()); + mpfi_mul(temp,&a.re,&b.re); + mpfi_mul(&result.re,&a.im,&b.im); + mpfi_sub(&result.re,&result.re,temp); + mpfi_mul(temp,&a.re,&b.im); + mpfi_mul(&result.im,&a.im,&b.re); + mpfi_add(&result.im,&result.im,temp); + } + + void divide(ElementType &result, + const ElementType &a, + const ElementType &b) const + { + // result -= a*b + ElementType b_inv; + init(b_inv); + invert(b_inv,b); + mult(result,a,b_inv); + clear(b_inv); + } + + void power(ElementType &result, const ElementType &a, int n) const + { + if (n >= 2) + { + if (n%2 == 0) + { + ElementType b; + init(b); + power(b,a,n/2); + mult(result,b,b); + } + else + { + ElementType b; + init(b); + power(b,a,n-1); + mult(result,a,b); + } + } + else if (n == 1) + { + mpfi_set(&result.re,&a.re); + mpfi_set(&result.im,&a.im); + } + else if (n == 0) + { + mpfi_set_si(&result.re,1); + mpfi_set_si(&result.im,0); + } + else if (n<0) + throw 20; + } + + /* Not entirely sure how to deal with this one. */ + void power_mpz(ElementType &result, const ElementType &a, mpz_srcptr n) const + { + if (mpz_cmp_si(n,2)>=0) + { + mpz_t r; + mpz_init(r); + mpz_fdiv_r_ui(r,n,2); + + ElementType b; + init(b); + + mpz_t m; + mpz_init(m); + + if (mpz_cmp_si(r,0) == 0) + { + mpz_cdiv_q_ui(m,n,2); + + power_mpz(b,a,m); + mult(result,b,b); + } + else + { + mpz_sub_ui(m,n,1); + + power_mpz(b,a,m); + mult(result,a,b); + } + mpz_clear(r); + mpz_clear(m); + } + else if (mpz_cmp_si(n,1)==0) + { + mpfi_set(&result.re,&a.re); + mpfi_set(&result.im,&a.im); + } + else if (mpz_cmp_si(n,0)==0) + { + mpfi_set_si(&result.re,1); + mpfi_set_si(&result.im,0); + } + else if (mpz_cmp_si(n,0)<0) + throw 20; + } + + void swap(ElementType &a, ElementType &b) const { + mpfi_swap(&a.re, &b.re); + mpfi_swap(&a.im, &b.im); + } + + void midpoint(ARingCCC::ElementType &a, const ElementType &b) const { + mpfi_mid(&a.re,&b.re); + mpfi_mid(&a.im,&b.im); + } + + void diameter(ARingRRi::ElementType &a, const ElementType &b) const { + mpfi_t temp; + mpfi_set(&a,&b.re); + mpfi_sqr(&a,&a); + mpfi_set(temp,&b.im); + mpfi_sqr(temp,temp); + mpfi_add(&a,&a,temp); + mpfi_sqrt(&a,&a); + } + + void elem_text_out(buffer &o, + const ElementType &a, + bool p_one, + bool p_plus, + bool p_parens) const; + + void syzygy(const ElementType &a, + const ElementType &b, + ElementType &x, + ElementType &y) const // remove? + // returns x,y s.y. x*a + y*b == 0. + // if possible, x is set to 1. + // no need to consider the case a==0 or b==0. + { + set_var(x, 0); // set x=1 + if (!is_zero(b)) + { + set(y, a); + negate(y, y); + divide(y, y, b); + } + } + + /* rewrite this (in rand.cpp or just copy over?) */ + void random(ElementType &result) const // redo? + { + mpfr_t val; + mpfr_init2(val, mPrecision); + randomMpfr(val); + mpfi_set_fr(&result.re,val); + + randomMpfr(val); + mpfi_put_fr(&result.re,val); + + randomMpfr(val); + mpfi_set_fr(&result.im,val); + + randomMpfr(val); + mpfi_put_fr(&result.im,val); + mpfr_clear(val); + } + + /* Needs to be redone. */ + void eval(const RingMap *map, + const ElementType &f, + int first_var, + ring_elem &result) const + { + gmp_CCi_struct g; + g.re = &f.re; + g.im = &f.im; + if (!map->get_ring()->from_ComplexInterval(&g, result)) + { + result = map->get_ring()->from_long(0); + ERROR("cannot coerce RRi value to ring type"); + } + } + +/* Not ready */ + void zeroize_tiny(gmp_RR epsilon, ElementType &a) const + { + throw 20; + //if (mpfr_cmpabs(&a, epsilon) < 0) set_zero(a); + } + /* Not ready */ + void increase_norm(gmp_RRmutable norm, const ElementType &a) const + { + throw 20; + /* if (mpfr_cmpabs(&a, norm) > 0) + { + set(*norm, a); + abs(*norm, *norm); + }*/ + } + + void abs(ElementType &result, const ElementType &a) const + { + mpfi_t temp; + mpfi_set(&result.re,&a.re); + mpfi_sqr(&result.re,&result.re); + mpfi_set(temp,&a.im); + mpfi_sqr(temp,temp); + mpfi_add(&result.re,&result.re,temp); + mpfi_sqrt(&result.re,&result.re); + mpfi_set_si(&result.im,0); + } + + void abs_squared(ElementType &result, const ElementType &a) const + { + abs(result,a); + mult(result, result, result); + } + + gmp_CC toBigComplex(const ElementType &a) const + { + gmp_CCmutable result = getmemstructtype(gmp_CCmutable); + result->re = getmemstructtype(gmp_RRmutable); + result->im = getmemstructtype(gmp_RRmutable); + mpfr_init2(result->re, get_precision()); + mpfr_init2(result->im, get_precision()); + mpfi_get_fr(result->re, &a.re); + mpfi_get_fr(result->im, &a.im); + return moveTo_gmpCC(result); + } + + private: + unsigned long mPrecision; +}; + +}; // end namespace M2 + +#endif + +// Local Variables: +// compile-command: "make -C $M2BUILDDIR/Macaulay2/e " +// indent-tabs-mode: nil +// End: diff --git a/M2/Macaulay2/e/aring-RRi.hpp b/M2/Macaulay2/e/aring-RRi.hpp index 7c9c1bd9731..bd038fddb7a 100644 --- a/M2/Macaulay2/e/aring-RRi.hpp +++ b/M2/Macaulay2/e/aring-RRi.hpp @@ -81,6 +81,7 @@ class ARingRRi : public SimpleARing void to_ring_elem(ring_elem &result, const ElementType &a) const { mpfi_ptr res = getmemstructtype(mpfi_ptr); + std::cout << "mpfi_init2:2\n"; mpfi_init2(res,mPrecision); mpfi_set(res, &a); result = ring_elem(moveTo_gmpRRi(res)); @@ -97,7 +98,9 @@ class ARingRRi : public SimpleARing } // 'init', 'init_set' functions - void init(ElementType &result) const { mpfi_init2(&result, mPrecision); } + void init(ElementType &result) const { + std::cout << "mpfi_init2:1\n"; + mpfi_init2(&result, mPrecision); } void init_set(ElementType &result, const ElementType &a) const { init(result); diff --git a/M2/Macaulay2/e/aring-glue.hpp b/M2/Macaulay2/e/aring-glue.hpp index db26a5ed70b..d52b70e64c5 100644 --- a/M2/Macaulay2/e/aring-glue.hpp +++ b/M2/Macaulay2/e/aring-glue.hpp @@ -139,6 +139,14 @@ class ConcreteRing : public Ring return ret; } + virtual bool from_ComplexInterval(gmp_CCi z, ring_elem &result) const + { + Element a(*R); + bool ret = get_from_ComplexInterval(*R, a , z); + if (ret) R->to_ring_elem(result, a); + return ret; + } + virtual bool from_BigComplex(gmp_CC q, ring_elem &result) const { Element a(*R); @@ -513,15 +521,20 @@ template ConcreteRing *ConcreteRing::create( std::unique_ptr R) { + std::cout << "In createRing\n"; auto characteristic = R->characteristic(); ConcreteRing *result = new ConcreteRing(std::move(R)); result->initialize_ring(characteristic); result->declare_field(); + std::cout << "Before set 0\n"; result->zeroV = result->from_long(0); + std::cout << "After set 0\n"; result->oneV = result->from_long(1); result->minus_oneV = result->from_long(-1); + std::cout << "End createRing\n"; + return result; } @@ -640,6 +653,8 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_CCC: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } @@ -656,6 +671,8 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_CCC: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } @@ -672,6 +689,8 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_CCC: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } @@ -707,6 +726,24 @@ bool ConcreteRing::promote(const Ring *R, default: return false; } + case M2::ring_CCi: + switch (S->ringID()) + { + case M2::ring_RR: + return RP::promoter(R, S, fR, resultS); + case M2::ring_RRR: + return RP::promoter(R, S, fR, resultS); + case M2::ring_RRi: + return RP::promoter(R, S, fR, resultS); + case M2::ring_CCC: + return RP::promoter(R, S, fR, resultS); + case M2::ring_CC: + return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); + default: + return false; + } default: break; }; @@ -1103,6 +1140,12 @@ inline unsigned long ConcreteRing::get_precision() const return R->get_precision(); } +template <> +inline unsigned long ConcreteRing::get_precision() const +{ + return R->get_precision(); +} + template std::pair coerceToLongIntegerFcn(const RT &ring, ring_elem a) { diff --git a/M2/Macaulay2/e/aring-translate.hpp b/M2/Macaulay2/e/aring-translate.hpp index 367575f1b84..7964ef649cb 100644 --- a/M2/Macaulay2/e/aring-translate.hpp +++ b/M2/Macaulay2/e/aring-translate.hpp @@ -7,11 +7,12 @@ // Contains functions which are "ring translational" // /////////////////////////////////////////////////////// -#include "aring-RRi.hpp" #include "aring-RR.hpp" #include "aring-CC.hpp" #include "aring-RRR.hpp" #include "aring-CCC.hpp" +#include "aring-RRi.hpp" +#include "aring-CCi.hpp" #include "aring-zz-gmp.hpp" #include "aring-zzp.hpp" #include "aring-zzp-ffpack.hpp" @@ -38,6 +39,12 @@ bool get_from_Interval(const RT& R, typename RT::ElementType& a, gmp_RRi b) return false; } +template +bool get_from_ComplexInterval(const RT& R, typename RT::ElementType & a, gmp_CCi b) +{ + return false; +} + template bool get_from_BigComplex(const RT& R, typename RT::ElementType& a, gmp_CC b) { @@ -127,6 +134,42 @@ inline bool get_from_Interval(const ARingRRi& R, return R.set_from_Interval(a, b); } +inline bool get_from_ComplexInterval(const ARingCCi& R, + ARingCCi::ElementType& a, + gmp_CCi b) +{ + R.set(a, b); + return true; +} + +inline bool get_from_double(const ARingCCi& R, + ARingCCi::ElementType& a, + double b) +{ + return R.set_from_double(a, b); +} + +inline bool get_from_Interval(const ARingCCi& R, + ARingCCi::ElementType& a, + gmp_RRi b) +{ + return R.set_from_Interval(a, b); +} + +inline bool get_from_BigComplex(const ARingCCi& R, + ARingCCi::ElementType& a, + gmp_CC b) +{ + return R.set_from_BigComplex(a, b); +} + +inline bool get_from_BigReal(const ARingCCi& R, + ARingCCi::ElementType& a, + gmp_RR b) +{ + return R.set_from_BigReal(a, b); +} + inline bool get_from_double(const ARingRR& R, ARingRR::ElementType& a, double b) { return R.set_from_double(a, b); @@ -160,6 +203,14 @@ inline bool get_from_complex_double(const ARingCC& R, return R.set_from_complex_double(a, re, im); } +inline bool get_from_complex_double(const ARingCCi& R, + ARingCCi::ElementType& a, + double re, + double im) +{ + return R.set_from_complex_double(a, re, im); +} + // Promote an element of one ring to another. // Given a "natural and canonical" map R --> S (depends on the context) // and an element fR of R, set result_fS to be the image of fR under this map. @@ -347,6 +398,47 @@ inline bool mypromote(const ARingCCC& R, return true; } ///////////////////////////////////////////////////// +inline bool mypromote(const ARingCCi& R, + const ARingCCi& S, + const ARingCCi::ElementType& fR, + ARingCCi::ElementType& fS) +{ + S.set(fS, fR); + return true; +} +inline bool mypromote(const ARingRR& R, + const ARingCCi& S, + const ARingRR::ElementType& fR, + ARingCCi::ElementType& fS) +{ + S.set_from_double(fS, fR); + return true; +} +inline bool mypromote(const ARingRRR& R, + const ARingCCi& S, + const ARingRRR::ElementType& fR, + ARingCCi::ElementType& fS) +{ + S.set_from_BigReal(fS, &fR); + return true; +} +inline bool mypromote(const ARingCC& R, + const ARingCCi& S, + const ARingCC::ElementType& fR, + ARingCCi::ElementType& fS) +{ + S.set_from_complex_double(fS, fR.re, fR.im); + return true; +} +inline bool mypromote(const ARingCCC& R, + const ARingCCi& S, + const ARingCCC::ElementType& fR, + ARingCCi::ElementType& fS) +{ + S.set_from_BigComplex(fS, &fR); + return true; +} +///////////////////////////////////////////////////// ///////////////////////////////////////////////////// inline bool mylift(const ARingRRR& R, const ARingRR& S, diff --git a/M2/Macaulay2/e/aring.hpp b/M2/Macaulay2/e/aring.hpp index 20f9ee9f5c1..4e7e9508212 100644 --- a/M2/Macaulay2/e/aring.hpp +++ b/M2/Macaulay2/e/aring.hpp @@ -32,11 +32,12 @@ enum RingID { ring_GFM2, ring_GFFlintBig, ring_GFFlintZech, - ring_RRi, ring_RR, ring_CC, ring_RRR, ring_CCC, + ring_RRi, + ring_CCi, ring_tower_ZZp, ring_old ///< refers to all rings which are not ConcreteRing's. }; diff --git a/M2/Macaulay2/e/interface/gmp-util.h b/M2/Macaulay2/e/interface/gmp-util.h index 2d535e1e714..289290aff03 100644 --- a/M2/Macaulay2/e/interface/gmp-util.h +++ b/M2/Macaulay2/e/interface/gmp-util.h @@ -63,6 +63,19 @@ inline void mpfi_reallocate_limbs (mpfi_ptr _z) // typedef CCmutable_struct* gmp_CCmutable; // typedef CC_struct* gmp_CC; +typedef struct { + mpfi_srcptr re; + mpfi_srcptr im; +} CCi_struct; + +typedef struct { + mpfi_ptr re; + mpfi_ptr im; +} CCimutable_struct; + +// typedef CCimutable_struct* gmp_CCimutable; +// typedef CCi_struct* gmp_CCi; + inline mpfr_srcptr moveTo_gmpRR (mpfr_ptr _z) { mpfr_reallocate_limbs(_z); @@ -84,6 +97,16 @@ inline void mpfi_reallocate_limbs (mpfi_ptr _z) return (gmp_CC) a; } +inline gmp_CCi moveTo_gmpCCi (gmp_CCimutable _z) +{ + CCimutable_struct* a = (CCimutable_struct*) _z; + mpfr_reallocate_limbs(&(a->re->left)); + mpfr_reallocate_limbs(&(a->re->right)); + mpfr_reallocate_limbs(&(a->im->left)); + mpfr_reallocate_limbs(&(a->im->right)); + return (gmp_CCi) a; +} + # if defined(__cplusplus) } # endif diff --git a/M2/Macaulay2/e/interface/ring.cpp b/M2/Macaulay2/e/interface/ring.cpp index 273e9520a8a..168584aed9a 100644 --- a/M2/Macaulay2/e/interface/ring.cpp +++ b/M2/Macaulay2/e/interface/ring.cpp @@ -30,6 +30,7 @@ #include "aring.hpp" #include "aring-glue.hpp" #include "aring-RRi.hpp" +#include "aring-CCi.hpp" #include "aring-RR.hpp" #include "aring-CC.hpp" #include "aring-RRR.hpp" @@ -93,6 +94,12 @@ const Ring /* or null */ *IM2_Ring_RRi(unsigned long prec) return M2::ConcreteRing::create(prec); } +const Ring /* or null */ *IM2_Ring_CCi(unsigned long prec) +{ + std::cout << "Creating CCi ring\n"; + return M2::ConcreteRing::create(prec); +} + const Ring /* or null */ *IM2_Ring_RRR(unsigned long prec) { if (prec <= 53) return M2::ConcreteRing::create(); diff --git a/M2/Macaulay2/e/interface/ring.h b/M2/Macaulay2/e/interface/ring.h index c8806d0c21f..f7606dec644 100644 --- a/M2/Macaulay2/e/interface/ring.h +++ b/M2/Macaulay2/e/interface/ring.h @@ -57,6 +57,9 @@ const Ring /* or null */ *rawGaloisField(const RingElement *f); const Ring /* or null */ *IM2_Ring_RRi(unsigned long prec); /* drg: connected rawRRi */ +const Ring /* or null */ *IM2_Ring_CCi(unsigned long prec); +/* drg: connected rawCCi */ + const Ring /* or null */ *IM2_Ring_RRR(unsigned long prec); /* drg: connected rawRRR */ diff --git a/M2/Macaulay2/e/interface/ringelement.cpp b/M2/Macaulay2/e/interface/ringelement.cpp index 6aed3d0b018..5fa4c145ef8 100644 --- a/M2/Macaulay2/e/interface/ringelement.cpp +++ b/M2/Macaulay2/e/interface/ringelement.cpp @@ -13,6 +13,10 @@ #include "aring-CC.hpp" #include "aring-CCC.hpp" +#include "aring-RR.hpp" +#include "aring-RRR.hpp" +#include "aring-RRi.hpp" +#include "aring-CCi.hpp" #include "aring-glue.hpp" #include "aring.hpp" #include "buffer.hpp" @@ -85,6 +89,14 @@ const RingElement *IM2_RingElement_from_Interval(const Ring *R, gmp_RRi z) return nullptr; } +const RingElement *IM2_RingElement_from_ComplexInterval(const Ring *R, gmp_CCi z) +{ + ring_elem f; + if (R->from_ComplexInterval(z, f)) return RingElement::make_raw(R, f); + ERROR("cannot create element of this ring from an element of CCi"); + return nullptr; +} + gmp_ZZorNull IM2_RingElement_to_Integer(const RingElement *a) /* If the ring of a is ZZ, or ZZ/p, this returns the underlying representation. Otherwise, NULL is returned, and an error is given */ @@ -136,7 +148,7 @@ gmp_RRorNull IM2_RingElement_to_BigReal(const RingElement *a) return moveTo_gmpRR(result); case M2::ring_RRR: R1 = - dynamic_cast *>(a->get_ring()); + dynamic_cast *>(R); result = getmemstructtype(gmp_RRmutable); mpfr_init2(result, R1->get_precision()); mpfr_set(result, a->get_value().get_mpfr(), MPFR_RNDN); @@ -157,13 +169,23 @@ gmp_RRiorNull IM2_RingElement_to_Interval(const RingElement *a) { case M2::ring_RR: result = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:10\n"; mpfi_init2(result, 53); mpfi_set_d(result, a->get_value().get_double()); return moveTo_gmpRRi(result); + case M2::ring_RRR: + R1 = + dynamic_cast *>(R); + result = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:11\n"; + mpfi_init2(result, R1->get_precision()); + mpfi_set_fr(result, a->get_value().get_mpfr()); + return moveTo_gmpRRi(result); case M2::ring_RRi: R1 = - dynamic_cast *>(a->get_ring()); + dynamic_cast *>(R); result = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:12\n"; mpfi_init2(result, R1->get_precision()); mpfi_set(result, a->get_value().get_mpfi()); return moveTo_gmpRRi(result); @@ -196,6 +218,83 @@ gmp_CCorNull IM2_RingElement_to_BigComplex(const RingElement *a) return nullptr; } +gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a) +{ + const Ring *R = a->get_ring(); + gmp_CCimutable result; + const M2::ConcreteRing *R1; + + switch (R->ringID()) + { + case M2::ring_RR: + result = getmemstructtype(gmp_CCimutable); + result->re = getmemstructtype(gmp_RRimutable); + result->im = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:13\n"; + mpfi_init2(result->re, 53); + std::cout << "mpfi_init2:14\n"; + mpfi_init2(result->im, 53); + mpfi_set_d(result->re, a->get_value().get_double()); + mpfi_set_d(result->im, 0); + return moveTo_gmpCCi(result); + case M2::ring_RRR: + R1 = + dynamic_cast *>(R); + result = getmemstructtype(gmp_CCimutable); + result->re = getmemstructtype(gmp_RRimutable); + result->im = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:15\n"; + mpfi_init2(result->re, R1->get_precision()); + std::cout << "mpfi_init2:16\n"; + mpfi_init2(result->im, R1->get_precision()); + mpfi_set_fr(result->re, a->get_value().get_mpfr()); + mpfi_set_d(result->im, 0); + return moveTo_gmpCCi(result); + case M2::ring_RRi: + R1 = + dynamic_cast *>(R); + result = getmemstructtype(gmp_CCimutable); + result->re = getmemstructtype(gmp_RRimutable); + result->im = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:17\n"; + mpfi_init2(result->re, R1->get_precision()); + std::cout << "mpfi_init2:18\n"; + mpfi_init2(result->im, R1->get_precision()); + mpfi_set(result->re, a->get_value().get_mpfi()); + mpfi_set_d(result->im,0); + return moveTo_gmpCCi(result); + case M2::ring_CCC: + R1 = + dynamic_cast *>(R); + result = getmemstructtype(gmp_CCimutable); + result->re = getmemstructtype(gmp_RRimutable); + result->im = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:19\n"; + mpfi_init2(result->re, R1->get_precision()); + std::cout << "mpfi_init2:20\n"; + mpfi_init2(result->im, R1->get_precision()); + mpfi_set_fr(result->re, &a->get_value().get_cc()->re); + mpfi_set_fr(result->im, &a->get_value().get_cc()->im); + return moveTo_gmpCCi(result); + case M2::ring_CCi: + R1 = + dynamic_cast *>(R); + result = getmemstructtype(gmp_CCimutable); + result->re = getmemstructtype(gmp_RRimutable); + result->im = getmemstructtype(gmp_RRimutable); + std::cout << "mpfi_init2:21\n"; + mpfi_init2(result->re, R1->get_precision()); + std::cout << "mpfi_init2:22\n"; + mpfi_init2(result->im, R1->get_precision()); + mpfi_set(result->re, &a->get_value().get_cci()->re); + mpfi_set(result->im, &a->get_value().get_cci()->im); + return moveTo_gmpCCi(result); + default: + ERROR("expected an element of CCi"); + return nullptr; + } +} + #if 0 int rawDiscreteLog(const RingElement *h) { diff --git a/M2/Macaulay2/e/interface/ringelement.h b/M2/Macaulay2/e/interface/ringelement.h index 593cb9ea631..c06905f2950 100644 --- a/M2/Macaulay2/e/interface/ringelement.h +++ b/M2/Macaulay2/e/interface/ringelement.h @@ -40,6 +40,8 @@ const RingElement *IM2_RingElement_from_BigReal(const Ring *R, gmp_RR z); const RingElement *IM2_RingElement_from_Interval(const Ring *R, gmp_RRi z); +const RingElement *IM2_RingElement_from_ComplexInterval(const Ring *R, gmp_CCi z); + gmp_ZZorNull IM2_RingElement_to_Integer(const RingElement *a); /* If the ring of a is ZZ, or ZZ/p, this returns the underlying representation. Otherwise, NULL is returned, and an error is given */ @@ -52,6 +54,8 @@ gmp_CCorNull IM2_RingElement_to_BigComplex(const RingElement *a); gmp_RRiorNull IM2_RingElement_to_Interval(const RingElement *a); +gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a); + long rawDiscreteLog(const RingElement *h); const RingElement *rawMultiplicativeGenerator(const Ring *R); diff --git a/M2/Macaulay2/e/poly.cpp b/M2/Macaulay2/e/poly.cpp index c3be6d673e6..3b3db681b22 100644 --- a/M2/Macaulay2/e/poly.cpp +++ b/M2/Macaulay2/e/poly.cpp @@ -259,6 +259,18 @@ bool PolyRing::from_Interval(gmp_RRi z, ring_elem &result) const return true; } +bool PolyRing::from_ComplexInterval(gmp_CCi z, ring_elem &result) const +{ + ring_elem a; + if (!K_->from_ComplexInterval(z, a)) + { + result = ZERO_RINGELEM; + return false; + } + result = fromCoefficient(a); + return true; +} + bool PolyRing::from_double(double z, ring_elem &result) const { ring_elem a; diff --git a/M2/Macaulay2/e/poly.hpp b/M2/Macaulay2/e/poly.hpp index 359b4bf8633..9feb0a7f062 100644 --- a/M2/Macaulay2/e/poly.hpp +++ b/M2/Macaulay2/e/poly.hpp @@ -65,6 +65,7 @@ class PolyRing : public PolyRingFlat virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const; virtual bool from_BigReal(gmp_RR z, ring_elem &result) const; virtual bool from_Interval(gmp_RRi z, ring_elem &result) const; + virtual bool from_ComplexInterval(gmp_CCi z, ring_elem &result) const; virtual bool from_double(double a, ring_elem &result) const; virtual bool from_complex_double(double re, double im, diff --git a/M2/Macaulay2/e/ring.cpp b/M2/Macaulay2/e/ring.cpp index 4b9b94b483e..30f74a6e5ee 100644 --- a/M2/Macaulay2/e/ring.cpp +++ b/M2/Macaulay2/e/ring.cpp @@ -254,6 +254,12 @@ bool Ring::from_Interval(gmp_RRi z, ring_elem &result) const return false; } +bool Ring::from_ComplexInterval(gmp_CCi z, ring_elem &result) const +{ + result = from_long(0); + return false; +} + bool Ring::from_double(double a, ring_elem &result) const { result = from_long(0); diff --git a/M2/Macaulay2/e/ring.hpp b/M2/Macaulay2/e/ring.hpp index 06fc539b09d..a48d96a5337 100644 --- a/M2/Macaulay2/e/ring.hpp +++ b/M2/Macaulay2/e/ring.hpp @@ -28,6 +28,7 @@ class PolyRingFlat; class PolynomialRing; class RRR; class RRi; +class CCi; class RingMap; class RingZZ; class SchurRing2; @@ -328,6 +329,8 @@ class Ring : public MutableEngineObject virtual bool from_Interval(gmp_RRi a, ring_elem &result) const; // The default version calls from_long(0) and returns false. virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const; + // The default version calls from_long(0) and returns false. + virtual bool from_ComplexInterval(gmp_CCi z, ring_elem &result) const; // Returns false if this ring cannot coerce a double to an element in this // ring virtual bool from_double(double a, ring_elem &result) const; diff --git a/M2/Macaulay2/e/ringelem.hpp b/M2/Macaulay2/e/ringelem.hpp index 1153ec1e319..c794d258a0d 100644 --- a/M2/Macaulay2/e/ringelem.hpp +++ b/M2/Macaulay2/e/ringelem.hpp @@ -26,6 +26,14 @@ typedef struct using cc_ptr = cc_struct *; using cc_srcptr = cc_struct const *; +typedef struct +{ + __mpfi_struct re; + __mpfi_struct im; +} cci_struct; +using cci_ptr = cci_struct *; +using cci_srcptr = cci_struct const *; + typedef struct { double re; @@ -55,6 +63,7 @@ union ring_elem mpfi_srcptr mpfi_val; cc_doubles_srcptr cc_doubles_val; cc_srcptr cc_val; + cci_srcptr cci_val; const void *mPolyVal; public: ring_elem() : poly_val(nullptr) {} @@ -85,7 +94,9 @@ union ring_elem mpq_srcptr get_mpq() const { return mpq_val; } mpfr_srcptr get_mpfr() const { return mpfr_val; } mpfi_srcptr get_mpfi() const { return mpfi_val; } + cc_srcptr get_cc() const { return cc_val; } + cci_srcptr get_cci() const { return cci_val; } cc_doubles_srcptr get_cc_doubles() const { return cc_doubles_val; } const local_elem* get_local_elem() const { return local_val; } const schur_poly* get_schur_poly() const { return schur_poly_val; } diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 658fc1d3efe..64dc7fc9e8b 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -103,10 +103,19 @@ new RealIntervalField of Nothing' from ZZ := memoize ( hashTable { symbol precision => prec, symbol Engine => true, - symbol baseRings => {ZZ,QQ}, + symbol baseRings => {ZZ,QQ,RR_prec}, symbol isBasic => true, symbol RawRing => rawRRi prec })) +new ComplexIntervalField of Nothing' from ZZ := memoize ( + (ComplexIntervalField,Nothing',prec) -> newClass(ComplexIntervalField,Nothing', + hashTable { + symbol precision => prec, + symbol Engine => true, + symbol baseRings => {ZZ,QQ,RR_prec,CC_prec,RRi_prec}, + symbol isBasic => true, + symbol RawRing => rawCCi prec + })) new RealBallField of Nothing' from ZZ := memoize ( (RealBallField, Nothing', prec) -> newClass(RealBallField, Nothing', hashTable { From ff1a7db1121ec48949923654cb55d97bc238c629 Mon Sep 17 00:00:00 2001 From: klee669 Date: Fri, 4 Jul 2025 11:36:08 -0500 Subject: [PATCH 090/691] Documents for some CCi functions + inverse interval bug fixed --- M2/Macaulay2/d/actors.d | 5 ++- .../packages/Macaulay2Doc/doc_intervals.m2 | 32 +++++++++++++------ .../packages/Macaulay2Doc/ov_rings.m2 | 28 ++++++++-------- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index aecd9722e30..1cfd46cd4e3 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -816,7 +816,10 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( else binarymethod(lhs,rhs,PowerS)) is x:RRicell do ( when rhs - is y:ZZcell do toExpr(x.v^y.v) + is y:ZZcell do ( + if y.v < 0 then toExpr(1/(x.v^(-y.v))) + else toExpr(x.v^y.v) + ) is y:QQcell do ( d := denominator(y.v); if d === 1 then toExpr(x.v^numerator(y.v)) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index cda24ea72b5..4cac143121f 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -61,13 +61,14 @@ SeeAlso doc /// Key diameter + (diameter, CCi) (diameter, RRi) Headline diameter of an interval Usage x = diameter I Inputs - I:RRi + I:{RRi, CCi} Outputs x:RR Description @@ -105,17 +106,20 @@ SeeAlso doc /// Key + (isMember, QQ, CCi) + (isMember, RR, CCi) + (isMember, ZZ, CCi) + (isMember, CC, CCi) (isMember, QQ, RRi) (isMember, ZZ, RRi) (isMember, RR, RRi) - (isMember, QQ, CCi) Headline membership test in an interval Usage isMember(x,I) Inputs - x:{QQ,ZZ,RR} - I:RRi + x:{QQ,ZZ,RR,CC} + I:CCi Outputs :Boolean Description @@ -146,16 +150,17 @@ SeeAlso doc /// Key + (isSubset, CCi, CCi) (isSubset, RRi, RRi) (isSubset, RRi, CCi) - (isSubset, CCi, CCi) + (isSubset, CCi, RRi) Headline subset test for intervals Usage x = isSubset(I,J) Inputs - I:RRi - J:RRi + I:CCi + J:CCi Outputs x:Boolean Description @@ -165,7 +170,7 @@ SeeAlso isMember /// -undocumented{(span,RRi), (span, QQ), (span, RR), (span, ZZ)} +undocumented{(isReal, CCi), (span, CCi), (span,RRi), (span, QQ), (span, RR), (span, ZZ)} doc /// Key @@ -180,6 +185,7 @@ SeeAlso (span, Sequence) (span, List) toRRi + toCCi /// doc /// @@ -193,11 +199,13 @@ Usage I = span(L,Precision => prec) Inputs L:List - containing @TO Number@ (including @TO RRi@) + containing @TO Number@ (including @TO CCi@) Precision => ZZ specifies the desired precision of the output, a value of {\tt -1} uses the minimum precision of the inputs. Outputs I:RRi + when input List has only real numbers or intervals + I:CCi Description Text Returns the smallest interval containing the inputs (which can include intervals). Typically, the returned interval is not empty. @@ -205,6 +213,7 @@ SeeAlso interval (span, Sequence) toRRi + toCCi /// doc /// @@ -218,11 +227,13 @@ Usage I = span(S,Precision => prec) Inputs S:Sequence - containing @TO Number@ (including @TO RRi@) + containing @TO Number@ (including @TO CCi@) Precision => ZZ specifies the desired precision of the output, a value of {\tt -1} uses the minimum precision of the inputs. Outputs I:RRi + when input List has only real numbers or intervals + I:CCi Description Text Returns the smallest interval containing the inputs (which can include intervals). Typically, the returned interval is not empty. @@ -230,6 +241,7 @@ SeeAlso interval (span, List) toRRi + toCCi /// doc /// diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index f99f09597e2..b1fa62f1dfd 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -451,7 +451,7 @@ document { results. That allows numbers of various precisions to be used without creating a new ring for each precision.", EXAMPLE {"class interval(3.1,3.5)", "ring interval(3.1,3.5)"}, - "The precision can be specified on input by specifying the precision of both input ", TO "RR", " numbers.", + "The precision can be specified on input by specifying the precision of both input ", TO "RR", " numbers. ", "Alternatively, the precision can be specified by including the option ", TT "Precision", ".", EXAMPLE {"interval(2.5p100,3.2p1000)","interval(2.5,3.2,Precision=>200)"}, "Intervals can also be created using ", TO (span,Sequence), " to create the smallest interval containing the inputs.", @@ -467,7 +467,7 @@ document { EXAMPLE {"exp(interval(2,4))","cos(interval(1,1.3))","sqrt(interval(2))"}, "Transcendental functions are available to high precision, with ", TO "numericInterval", ".", EXAMPLE {"numericInterval(100,pi)","numericInterval_200 EulerConstant"}, - SeeAlso => {toRRi, numericInterval, precision, interval, (span,Sequence), (span,List)}, + SeeAlso => {CCi, toRRi, numericInterval, precision, interval, (span,Sequence), (span,List)}, Subnodes => { TO toRRi, TO interval, @@ -491,29 +491,27 @@ undocumented {"CCi_*"} document { Key => CCi, Headline => "the class of all complex intervals", - "A real interval is entered as a pair of real numbers to the interval function. It is stored internally as an arbitrary precision interval using the ", TO "MPFI", " library.", + "A complex interval is entered as a pair of real intervals to the ", TO "interval", " function. It is stored internally as an arbitrary precision interval using the ", TO "MPFI", " library.", EXAMPLE "interval(interval(3.1415,3.1416), interval(2.7182,2.7183))", "The precision is measured in bits, is visible in the ring displayed on the second of each pair of output lines, and can be recovered using ", TO "precision", ".", EXAMPLE "precision interval(interval(3.1415,3.1416), interval(2.7182,2.7183))", --- "For complex intervals, the functions ", TO "class", " and ", TO "ring", " yield different --- results. That allows numbers of various precisions --- to be used without creating a new ring for each precision.", + "Complex intervals are objects in ", TO "class", " CCi which is an ", TO "InexactFieldFamily", ".", EXAMPLE {"class interval(interval(3.1,3.5),interval(1.1,1.2))"}, - "The precision can be specified on input by specifying the precision of both input ", TO "CC", " numbers.", + "The precision can be specified on input by specifying the precision of both input ", TO "CC", " numbers. ", "Alternatively, the precision can be specified by including the option ", TT "Precision", ".", EXAMPLE {"interval(interval(2.5p1000,3.2p100),interval(2.3,3.1,Precision=>200))"}, "Intervals can also be created using ", TO (span,Sequence), " to create the smallest interval containing the inputs.", EXAMPLE {"span(2+3*ii,Precision=>100)","span(2,3*ii,interval(interval(-1.5,-0.5),interval(3,3.1)),73)"}, "Operations using intervals are computed as sets so that the resulting intervals contain all possible outputs from pairs of points in input intervals.", - EXAMPLE {" (I, J, K) = (interval(interval(.5,.8),interval(.6,.9)), interval(interval(.54,.78),interval(.65,.89)), interval(interval(.45,.6),interval(.3,.78))); - I + J - I - J - I * K - I / K - I ^ 3 - 2 * I - (2+3*ii) * I"}, + EXAMPLE {" (I, J, K) = (interval(interval(.5,.8),interval(.6,.9)), interval(interval(.54,.78),interval(.65,.89)), interval(interval(.45,.6),interval(.3,.78)));", + "I + J", + "I - J", + "I * K", + "I / K", + "I ^ 3", + "2 * I", + "(2+3*ii) * I"}, SeeAlso => {RRi, toCCi, precision, interval, (span,Sequence), (span,List)}, Subnodes => { TO toCCi, From 6cc5dd3891d67663c430a9acfe2db719fc889a1f Mon Sep 17 00:00:00 2001 From: Anton Leykin Date: Fri, 4 Jul 2025 14:51:05 -0500 Subject: [PATCH 091/691] fixed to_ring_elem --- M2/Macaulay2/e/aring-CCi.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/M2/Macaulay2/e/aring-CCi.hpp b/M2/Macaulay2/e/aring-CCi.hpp index a5d71fb2b89..84775a9546f 100644 --- a/M2/Macaulay2/e/aring-CCi.hpp +++ b/M2/Macaulay2/e/aring-CCi.hpp @@ -92,16 +92,16 @@ class ARingCCi : public SimpleARing // Do not take the same element and store it as two different ring_elem's!! void to_ring_elem(ring_elem &result, const ElementType &a) const { - gmp_CCimutable res = getmemstructtype(gmp_CCimutable); - res->re = getmemstructtype(gmp_RRimutable); - res->im = getmemstructtype(gmp_RRimutable); + cci_ptr res = getmemstructtype(cci_ptr); std::cout << "mpfi_init2:8\n"; - mpfi_init2(res->re,mPrecision); + mpfi_init2(&res->re,mPrecision); std::cout << "mpfi_init2:9\n"; - mpfi_init2(res->im,mPrecision); - mpfi_set(res->re,&a.re); - mpfi_set(res->im,&a.im); - result = ring_elem(moveTo_gmpCCi(res)); + mpfi_init2(&res->im,mPrecision); + mpfi_set(&res->re,&a.re); + mpfi_set(&res->im,&a.im); + mpfi_reallocate_limbs(&res->re); + mpfi_reallocate_limbs(&res->im); + result = ring_elem(res); } void from_ring_elem(ElementType &result, const ring_elem &a) const From 3bca5ca411a5a2567465f4072e16e9601e662b62 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Fri, 4 Jul 2025 14:57:57 -0500 Subject: [PATCH 092/691] Removing debugging code --- M2/Macaulay2/e/aring-CCi.hpp | 20 +++++--------------- M2/Macaulay2/e/aring-RRi.hpp | 2 -- M2/Macaulay2/e/aring-glue.hpp | 4 ---- M2/Macaulay2/e/interface/ring.cpp | 1 - M2/Macaulay2/e/interface/ringelement.cpp | 13 ------------- 5 files changed, 5 insertions(+), 35 deletions(-) diff --git a/M2/Macaulay2/e/aring-CCi.hpp b/M2/Macaulay2/e/aring-CCi.hpp index a5d71fb2b89..eef1c21a8d1 100644 --- a/M2/Macaulay2/e/aring-CCi.hpp +++ b/M2/Macaulay2/e/aring-CCi.hpp @@ -41,9 +41,11 @@ class ARingCCi : public SimpleARing unsigned int computeHashValue(const elem &a) const { - std::cout << "In computeHash\n"; - double d = 12347. * mpfr_get_d(&(a.re.left), MPFR_RNDN) + 865800. * mpfr_get_d(&(a.re.right), MPFR_RNDN) + 72158 * mpfr_get_d(&(a.im.left), MPFR_RNDN) + 86429 * mpfr_get_d(&(a.im.right), MPFR_RNDN); - std::cout << "After computeHash\n"; + double d1 = mpfr_get_d(&a.re.left, MPFR_RNDN); + double d2 = mpfr_get_d(&(a.re.right), MPFR_RNDN); + double d3 = mpfr_get_d(&(a.im.left), MPFR_RNDN); + double d4 = mpfr_get_d(&(a.im.right), MPFR_RNDN); + double d = 12347. * d1 + 865800. * d2 + 72158. * d3 + 86429. * d4; return static_cast(d); } @@ -95,9 +97,7 @@ class ARingCCi : public SimpleARing gmp_CCimutable res = getmemstructtype(gmp_CCimutable); res->re = getmemstructtype(gmp_RRimutable); res->im = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:8\n"; mpfi_init2(res->re,mPrecision); - std::cout << "mpfi_init2:9\n"; mpfi_init2(res->im,mPrecision); mpfi_set(res->re,&a.re); mpfi_set(res->im,&a.im); @@ -117,16 +117,11 @@ class ARingCCi : public SimpleARing // 'init', 'init_set' functions void init(ElementType &result) const { - std::cout << "In init\n"; - std::cout << "mpfi_init2:3\n"; mpfi_init2(&result.re, mPrecision); - std::cout << "mpfi_init2:4\n"; mpfi_init2(&result.im, mPrecision); - std::cout << "After init\n"; } void init_set(ElementType &result, const ElementType &a) const { - std::cout << "In init_set\n"; init(result); mpfi_set(&result.re, &a.re); mpfi_set(&result.im, &a.im); @@ -162,10 +157,8 @@ class ARingCCi : public SimpleARing void set_from_long(ElementType &result, long a) const { - std::cout << "In set from long\n"; mpfi_set_si(&result.re, a); mpfi_set_si(&result.im, 0); - std::cout << "After set from long\n"; } void set_var(ElementType &result, int v) const @@ -283,9 +276,7 @@ class ARingCCi : public SimpleARing // we silently assume that a != 0. If it is, result is set to a^0, i.e. 1 { mpfi_t norm, temp; - std::cout << "mpfi_init2:5\n"; mpfi_init2(norm,get_precision()); - std::cout << "mpfi_init2:6\n"; mpfi_init2(temp,get_precision()); mpfi_set(norm,&a.re); mpfi_mul(norm,norm,norm); @@ -343,7 +334,6 @@ class ARingCCi : public SimpleARing const ElementType &b) const { mpfi_t temp; - std::cout << "mpfi_init2:7\n"; mpfi_init2(temp,get_precision()); mpfi_mul(temp,&a.re,&b.re); mpfi_mul(&result.re,&a.im,&b.im); diff --git a/M2/Macaulay2/e/aring-RRi.hpp b/M2/Macaulay2/e/aring-RRi.hpp index bd038fddb7a..7cf4b79f0d2 100644 --- a/M2/Macaulay2/e/aring-RRi.hpp +++ b/M2/Macaulay2/e/aring-RRi.hpp @@ -81,7 +81,6 @@ class ARingRRi : public SimpleARing void to_ring_elem(ring_elem &result, const ElementType &a) const { mpfi_ptr res = getmemstructtype(mpfi_ptr); - std::cout << "mpfi_init2:2\n"; mpfi_init2(res,mPrecision); mpfi_set(res, &a); result = ring_elem(moveTo_gmpRRi(res)); @@ -99,7 +98,6 @@ class ARingRRi : public SimpleARing // 'init', 'init_set' functions void init(ElementType &result) const { - std::cout << "mpfi_init2:1\n"; mpfi_init2(&result, mPrecision); } void init_set(ElementType &result, const ElementType &a) const { diff --git a/M2/Macaulay2/e/aring-glue.hpp b/M2/Macaulay2/e/aring-glue.hpp index d52b70e64c5..a46af0c5811 100644 --- a/M2/Macaulay2/e/aring-glue.hpp +++ b/M2/Macaulay2/e/aring-glue.hpp @@ -521,19 +521,15 @@ template ConcreteRing *ConcreteRing::create( std::unique_ptr R) { - std::cout << "In createRing\n"; auto characteristic = R->characteristic(); ConcreteRing *result = new ConcreteRing(std::move(R)); result->initialize_ring(characteristic); result->declare_field(); - std::cout << "Before set 0\n"; result->zeroV = result->from_long(0); - std::cout << "After set 0\n"; result->oneV = result->from_long(1); result->minus_oneV = result->from_long(-1); - std::cout << "End createRing\n"; return result; } diff --git a/M2/Macaulay2/e/interface/ring.cpp b/M2/Macaulay2/e/interface/ring.cpp index 168584aed9a..60b688ce837 100644 --- a/M2/Macaulay2/e/interface/ring.cpp +++ b/M2/Macaulay2/e/interface/ring.cpp @@ -96,7 +96,6 @@ const Ring /* or null */ *IM2_Ring_RRi(unsigned long prec) const Ring /* or null */ *IM2_Ring_CCi(unsigned long prec) { - std::cout << "Creating CCi ring\n"; return M2::ConcreteRing::create(prec); } diff --git a/M2/Macaulay2/e/interface/ringelement.cpp b/M2/Macaulay2/e/interface/ringelement.cpp index 5fa4c145ef8..045d3af1f21 100644 --- a/M2/Macaulay2/e/interface/ringelement.cpp +++ b/M2/Macaulay2/e/interface/ringelement.cpp @@ -169,7 +169,6 @@ gmp_RRiorNull IM2_RingElement_to_Interval(const RingElement *a) { case M2::ring_RR: result = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:10\n"; mpfi_init2(result, 53); mpfi_set_d(result, a->get_value().get_double()); return moveTo_gmpRRi(result); @@ -177,7 +176,6 @@ gmp_RRiorNull IM2_RingElement_to_Interval(const RingElement *a) R1 = dynamic_cast *>(R); result = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:11\n"; mpfi_init2(result, R1->get_precision()); mpfi_set_fr(result, a->get_value().get_mpfr()); return moveTo_gmpRRi(result); @@ -185,7 +183,6 @@ gmp_RRiorNull IM2_RingElement_to_Interval(const RingElement *a) R1 = dynamic_cast *>(R); result = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:12\n"; mpfi_init2(result, R1->get_precision()); mpfi_set(result, a->get_value().get_mpfi()); return moveTo_gmpRRi(result); @@ -230,9 +227,7 @@ gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a) result = getmemstructtype(gmp_CCimutable); result->re = getmemstructtype(gmp_RRimutable); result->im = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:13\n"; mpfi_init2(result->re, 53); - std::cout << "mpfi_init2:14\n"; mpfi_init2(result->im, 53); mpfi_set_d(result->re, a->get_value().get_double()); mpfi_set_d(result->im, 0); @@ -243,9 +238,7 @@ gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a) result = getmemstructtype(gmp_CCimutable); result->re = getmemstructtype(gmp_RRimutable); result->im = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:15\n"; mpfi_init2(result->re, R1->get_precision()); - std::cout << "mpfi_init2:16\n"; mpfi_init2(result->im, R1->get_precision()); mpfi_set_fr(result->re, a->get_value().get_mpfr()); mpfi_set_d(result->im, 0); @@ -256,9 +249,7 @@ gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a) result = getmemstructtype(gmp_CCimutable); result->re = getmemstructtype(gmp_RRimutable); result->im = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:17\n"; mpfi_init2(result->re, R1->get_precision()); - std::cout << "mpfi_init2:18\n"; mpfi_init2(result->im, R1->get_precision()); mpfi_set(result->re, a->get_value().get_mpfi()); mpfi_set_d(result->im,0); @@ -269,9 +260,7 @@ gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a) result = getmemstructtype(gmp_CCimutable); result->re = getmemstructtype(gmp_RRimutable); result->im = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:19\n"; mpfi_init2(result->re, R1->get_precision()); - std::cout << "mpfi_init2:20\n"; mpfi_init2(result->im, R1->get_precision()); mpfi_set_fr(result->re, &a->get_value().get_cc()->re); mpfi_set_fr(result->im, &a->get_value().get_cc()->im); @@ -282,9 +271,7 @@ gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a) result = getmemstructtype(gmp_CCimutable); result->re = getmemstructtype(gmp_RRimutable); result->im = getmemstructtype(gmp_RRimutable); - std::cout << "mpfi_init2:21\n"; mpfi_init2(result->re, R1->get_precision()); - std::cout << "mpfi_init2:22\n"; mpfi_init2(result->im, R1->get_precision()); mpfi_set(result->re, &a->get_value().get_cci()->re); mpfi_set(result->im, &a->get_value().get_cci()->im); From 42924a2539ac6091eda77b04f84da4d273158813 Mon Sep 17 00:00:00 2001 From: Anton Leykin Date: Fri, 4 Jul 2025 15:19:17 -0500 Subject: [PATCH 093/691] new CCi from RawRingElement := (CCCi,x) --- M2/Macaulay2/e/ringelem.hpp | 1 + M2/Macaulay2/m2/reals.m2 | 1 + 2 files changed, 2 insertions(+) diff --git a/M2/Macaulay2/e/ringelem.hpp b/M2/Macaulay2/e/ringelem.hpp index c794d258a0d..e3aae517906 100644 --- a/M2/Macaulay2/e/ringelem.hpp +++ b/M2/Macaulay2/e/ringelem.hpp @@ -77,6 +77,7 @@ union ring_elem explicit ring_elem(mpfr_srcptr a) : mpfr_val(a) {} explicit ring_elem(mpfi_srcptr a) : mpfi_val(a) {} explicit ring_elem(cc_srcptr a) : cc_val(a) {} + explicit ring_elem(cci_srcptr a) : cci_val(a) {} explicit ring_elem(cc_doubles_srcptr a) : cc_doubles_val(a) {} explicit ring_elem(local_elem* a) : local_val(a) {} explicit ring_elem(const void* a) : mPolyVal(a) {} // non-commutative polynomials diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 64dc7fc9e8b..7058bf32a12 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -257,6 +257,7 @@ ring CCi := x -> new ComplexIntervalField of CCi' from precision x new RR from RawRingElement := (RRR,x) -> ( assert( RRR === RR ); rawToRR x) new RRi from RawRingElement := (RRRi,x) -> ( assert( RRRi === RRi ); rawToRRi x) new CC from RawRingElement := (CCC,x) -> ( assert( CCC === CC ); rawToCC x) +new CCi from RawRingElement := (CCCi,x) -> ( assert( CCCi === CCi ); rawToCCi x) -- arithmetic operations From 1f4e68de42993f58012520815f5edf7f55f814e2 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sat, 5 Jul 2025 14:17:28 -0400 Subject: [PATCH 094/691] Remove top-level RRb/CCb types --- M2/Macaulay2/d/actors.d | 24 ----------- M2/Macaulay2/d/actors2.dd | 2 - M2/Macaulay2/d/actors4.d | 70 +----------------------------- M2/Macaulay2/d/ballarith.d | 88 -------------------------------------- M2/Macaulay2/d/basic.d | 2 - M2/Macaulay2/d/classes.dd | 2 - M2/Macaulay2/d/equality.dd | 2 - M2/Macaulay2/d/parse.d | 2 - M2/Macaulay2/d/util.d | 2 - M2/Macaulay2/m2/exports.m2 | 9 +--- M2/Macaulay2/m2/reals.m2 | 23 +--------- 11 files changed, 5 insertions(+), 221 deletions(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 1cfd46cd4e3..4686a4099a6 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -20,9 +20,6 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, ZZ, QQ, QQ is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RRi, RRi - is y:RRbcell do toExpr( -- # typical value: symbol +, ZZ, RRb, RRb - RRbadd(toRRb(x.v,y.prec), y.v, y.prec), - y.prec) is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CC, CC is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CCi, CCi is Error do rhs @@ -33,9 +30,6 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, QQ, QQ, QQ is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RRi, RRi - is y:RRbcell do toExpr( -- # typical value: symbol +, QQ, RRb, RRb - RRbadd(toRRb(x.v,y.prec), y.v, y.prec), - y.prec) is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CC, CC is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CCi, CCi is Error do rhs @@ -55,9 +49,6 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, QQ, RR is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, RR, RR is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, RR, RRi, RRi - is y:RRbcell do toExpr( -- # typical value: symbol +, RR, RRb, RRb - RRbadd(toRRb(x.v), y.v, y.prec), - y.prec) is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, CC, CC is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RR, CCi, CCi is Error do rhs @@ -72,21 +63,6 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) - is x:RRbcell do ( - when rhs - is y:ZZcell do toExpr( -- # typical value: symbol +, RRb, ZZ, RRb - RRbadd(x.v, toRRb(y.v, x.prec), x.prec), - x.prec) - is y:QQcell do toExpr( -- # typical value: symbol +, RRb, QQ, RRb - RRbadd(x.v, toRRb(y.v, x.prec), x.prec), - x.prec) - is y:RRcell do toExpr( -- # typical value: symbol +, RRb, RR, RRb - RRbadd(x.v, toRRb(y.v), x.prec), - x.prec) - is y:RRbcell do ( -- # typical value: symbol +, RRb, RRb, RRb - prec := min(x.prec, y.prec); - toExpr(RRbadd(x.v, y.v, prec), prec)) - else binarymethod(lhs, rhs, PlusS)) is x:CCcell do ( when rhs is y:ZZcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, ZZ, CC diff --git a/M2/Macaulay2/d/actors2.dd b/M2/Macaulay2/d/actors2.dd index 56c890cddbb..c6c547e6f5b 100644 --- a/M2/Macaulay2/d/actors2.dd +++ b/M2/Macaulay2/d/actors2.dd @@ -714,7 +714,6 @@ realPart(e:Expr):Expr := ( is RRicell do e is z:CCcell do toExpr(realPart(z.v)) is z:CCicell do toExpr(realPart(z.v)) - is z:CCbcell do toExpr(realPart(z.v), z.prec) is QQcell do e else WrongArg("a number")); setupfun("realPart0",realPart); @@ -726,7 +725,6 @@ imaginaryPart(e:Expr):Expr := ( is RRicell do zeroE is z:CCcell do toExpr(imaginaryPart(z.v)) is z:CCicell do toExpr(imaginaryPart(z.v)) - is z:CCbcell do toExpr(imaginaryPart(z.v), z.prec) is QQcell do zeroE else WrongArg("a number")); setupfun("imaginaryPart0",imaginaryPart); diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 15f7e835abf..6a79ab2f915 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -991,10 +991,8 @@ tostringfun(e:Expr):Expr := ( is NetFile do toExpr("<>") is x:RRcell do toExpr(tostringRR(x.v)) is x:RRicell do toExpr(tostringRRi(x.v)) - is x:RRbcell do toExpr(tostringRRb(x.v)) is z:CCcell do toExpr(tostringCC(z.v)) is x:CCicell do toExpr(tostringCCi(x.v))--toExpr(concatenate(array(string)(tostringRRi(x.v.re),"+",tostringRRi(x.v.im),"*ii"))) - is x:CCbcell do toExpr(tostringCCb(x.v)) is Error do toExpr("<>") is Sequence do toExpr("<>") is HashTable do toExpr("<>") @@ -1370,7 +1368,6 @@ toRRi(e:Expr):Expr := ( is x:QQcell do toExpr(toRRi(x.v)) is x:RRcell do toExpr(toRRi(x.v)) is x:RRicell do e - is x:RRbcell do toExpr(toRRi(x.v, x.prec)) is s:Sequence do ( if length(s) > 3 then WrongNumArgs(1,3) else if length(s) == 2 then ( @@ -1411,40 +1408,6 @@ toRRi(e:Expr):Expr := ( else WrongArg(1,"a pair or triple of integral, rational, or real numbers")); setupfun("toRRi",toRRi); -toRRb(e:Expr):Expr := ( - when e - -- # typical value: toRRb, ZZ, RRb - is x:ZZcell do toExpr( - toRRb(toRR(x.v, defaultPrecision)), - defaultPrecision) - -- # typical value: toRRb, QQ, RRb - is x:QQcell do toExpr( - toRRb(toRR(x.v, defaultPrecision)), - defaultPrecision) - -- # typical value: toRRb, RR, RRb - is x:RRcell do toExpr(toRRb(x.v), precision(x.v)) - -- # typical value: toRRb, RRi, RRb - is x:RRicell do toExpr(toRRb(x.v), precision(x.v)) - is a:Sequence do ( - if length(a) == 3 then ( - when a.0 - is x:RRcell do ( - when a.1 - is y:RRcell do ( - when a.2 - -- # typical value: toRRb, RR, RR, ZZ, RRb - is prec:ZZcell do ( - if !isULong(prec) then WrongArgSmallUInteger(3) - else toExpr( - toRRb(x.v, y.v, toULong(prec)), - toULong(prec))) - else WrongArgZZ(3)) - else WrongArgRR(2)) - else WrongArgRR(1)) - else WrongNumArgs(1, 2)) - else WrongArg("a real number, real interval, or (RR, RR, ZZ) triple")); -setupfun("toRRb", toRRb); - toCCi(e:Expr):Expr := ( when e is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) @@ -1517,31 +1480,6 @@ toCCi(e:Expr):Expr := ( else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")); setupfun("toCCi",toCCi); -toCCb(e:Expr):Expr := ( - when e - -- # typical value: toCCb, ZZ, CCb - is x:ZZcell do toExpr(toCCb(x.v, defaultPrecision), defaultPrecision) - -- # typical value: toCCb, QQ, CCb - is x:QQcell do toExpr(toCCb(x.v, defaultPrecision), defaultPrecision) - -- # typical value: toCCb, RR, CCb - is x:RRcell do toExpr(toCCb(x.v), precision(x.v)) - -- # typical value: toCCb, RRb, CCb - is x:RRbcell do toExpr(toCCb(x.v), x.prec) - -- # typical value: toCCb, CC, CCb - is x:CCcell do toExpr(toCCb(x.v), precision(x.v)) - is a:Sequence do ( - if length(a) == 2 then ( - when a.0 - is x:RRbcell do ( - when a.1 - -- # typical value: toCCb, RRb, RRb, CCb - is y:RRbcell do toExpr(toCCb(x.v, y.v), min(x.prec, y.prec)) - else WrongArg(2, "a real ball")) - else WrongArg(1, "a real ball")) - else WrongNumArgs(1, 2)) - else WrongArg("a complex number or pair of real numbers")); -setupfun("toCCb", toCCb); - rightRR(e:Expr):Expr := ( when e is x:RRicell do toExpr(rightRR(x.v)) @@ -1557,15 +1495,13 @@ setupfun("left",leftRR); width0(e:Expr):Expr := ( when e is x:RRicell do toExpr(widthRR(x.v)) - is x:CCicell do toExpr(sqrt(widthRR(realPart(x.v))*widthRR(realPart(x.v))+widthRR(imaginaryPart(x.v))*widthRR(imaginaryPart(x.v)))) - is x:RRbcell do toExpr(2 * radius(x.v)) + is x:CCicell do toExpr(sqrt(widthRR(realPart(x.v))*widthRR(realPart(x.v))+widthRR(imaginaryPart(x.v))*widthRR(imaginaryPart(x.v)))) else WrongArg("an interval or complex interval or ball")); setupfun("diameter",width0).Protected = false; midpoint0(e:Expr):Expr := ( when e is x:RRicell do toExpr(midpointRR(x.v)) - is x:RRbcell do toExpr(midpoint(x.v, x.prec)) is x:CCicell do toExpr(toCC(midpointRR(realPart(x.v)),midpointRR(imaginaryPart(x.v)))) else WrongArg("an interval or ball")); setupfun("midpoint",midpoint0); @@ -1691,10 +1627,8 @@ precision(e:Expr):Expr := ( when e is x:RRcell do toExpr(precision(x.v)) is x:RRicell do toExpr(precision(x.v)) - is x:RRbcell do toExpr(x.prec) is x:CCcell do toExpr(precision(x.v)) - is x:CCicell do toExpr(precision(x.v)) - is x:CCbcell do toExpr(x.prec) + is x:CCicell do toExpr(precision(x.v)) else WrongArgRR()); setupfun("precision0",precision); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 6a444c5504e..8a313b1062c 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -39,15 +39,6 @@ init(x:RRb) ::= ( newRRb():RRb := init(GCmalloc(RRb)); clear(x:RRb) ::= Ccode(void, "arb_clear(", x, ")"); -export RRbcell := {+v:RRb, prec:ulong}; - --- every RRbcell should be constructed using this so that it's finalized -export toRRbcell(x:RRb, prec:ulong):RRbcell := ( - y := RRbcell(x, prec); - Ccode(void, "GC_REGISTER_FINALIZER(", y, - ", (GC_finalization_proc)arb_clear, ", y.v, ", 0, 0)"); - y); - -- clear after using export toRRb(x:RR, y:RR, prec:ulong):RRb := ( z := newRRb(); @@ -55,12 +46,6 @@ export toRRb(x:RR, y:RR, prec:ulong):RRb := ( z); export toRRb(x:RR):RRb := toRRb(x, x, precision(x)); export toRRb(x:RRi):RRb := toRRb(leftRR(x), rightRR(x), precision(x)); -export toRRb(x:ZZ, prec:ulong):RRb := ( - y := toRR(x, prec); - toRRb(y, y, prec)); -export toRRb(x:QQ, prec:ulong):RRb := ( - y := toRR(x, prec); - toRRb(y, y, prec)); toRR(x:RRb, prec:ulong):RR := ( y := newRRmutable(prec); @@ -78,28 +63,6 @@ moveToRRiandclear(x:RRb, prec:ulong):RRi := ( clear(x); r); -export midpoint(x:RRb, prec:ulong):RR := ( - y := newRRmutable(prec); - Ccode(void, "arf_get_mpfr(", y, ", arb_midref(", x, "), MPFR_RNDN)"); - moveToRRandclear(y)); - -export radius(x:RRb):RR := ( - y := Ccode(double, "mag_get_d(arb_radref(", x, "))"); - -- radius is a mag_t, which always has precision 30 - toRR(y, ulong(30))); - -export hash(x:RRb, prec:ulong):hash_t := ( - 953 * hash(midpoint(x, prec)) + 277 * hash(radius(x))); - -export tostringRRb(x:RRb):string := tostring(Ccode(charstar, - "arb_get_str(", x, ", mpfr_get_str_ndigits(10, arb_bits(", x, ")), 0)")); - --- arithmetic -export RRbadd(x:RRb, y:RRb, prec:ulong):RRb := ( - z := newRRb(); - Ccode(void, "arb_add(", z, ", ", x, ", ", y, ", ", prec, ")"); - z); - -- special functions export eint(x:RRi):RRi := ( y := toRRb(x); @@ -235,15 +198,6 @@ init(z:CCb) ::= ( newCCb():CCb := init(GCmalloc(CCb)); clear(z:CCb) ::= Ccode(void, "acb_clear(", z, ")"); -export CCbcell := {+v:CCb, prec:ulong}; - --- every CCbcell should be constructed using this so that it's finalized -export toCCbcell(x:CCb, prec:ulong):CCbcell := ( - y := CCbcell(x, prec); - Ccode(void, "GC_REGISTER_FINALIZER(", y, - ", (GC_finalization_proc)acb_clear, ", y.v, ", 0, 0)"); - y); - -- clear after using export toCCb(x:RRb, y:RRb):CCb := ( z := newCCb(); @@ -258,32 +212,6 @@ export toCCb(z:CC):CCb := ( clear(y); w); -export toCCb(x:RRb):CCb := ( - y := newRRb(); - Ccode(RRb, "arb_zero(", y, ")"); - z := toCCb(x, y); - clear(y); - z); - -export toCCb(x:ZZ, prec:ulong):CCb := ( - y := toRRb(x, prec); - z := toCCb(y); - clear(y); - z); - -export toCCb(x:QQ, prec:ulong):CCb := ( - y := toRRb(x, prec); - z := toCCb(y); - clear(y); - z); - -export toCCb(x:RR):CCb := ( - y := toRRb(x); - z := toCCb(y); - clear(y); - z); - - toCC(z:CCb, prec:ulong):CC := ( x := Ccode(RRb, "acb_realref(", z, ")"); y := Ccode(RRb, "acb_imagref(", z, ")"); @@ -294,22 +222,6 @@ moveToCCandclear(z:CCb, prec:ulong):CC := ( clear(z); r); -export realPart(x:CCb):RRb := ( - y := newRRb(); - Ccode(void, "acb_get_real(", y, ", ", x, ")"); - y); - -export imaginaryPart(x:CCb):RRb := ( - y := newRRb(); - Ccode(void, "acb_get_imag(", y, ", ", x, ")"); - y); - -export hash(x:CCb, prec:ulong):hash_t := ( - 761 * hash(realPart(x), prec) + 743 * hash(imaginaryPart(x), prec)); - -export tostringCCb(x:CCb):string := ( - tostringRRb(realPart(x)) + "+" + tostringRRb(imaginaryPart(x)) + "*ii"); - export eint(z:CC):CC := ( w := toCCb(z); r := newCCb(); diff --git a/M2/Macaulay2/d/basic.d b/M2/Macaulay2/d/basic.d index fb921825208..cf2a91bec97 100644 --- a/M2/Macaulay2/d/basic.d +++ b/M2/Macaulay2/d/basic.d @@ -24,10 +24,8 @@ export hash(e:Expr):hash_t := ( is x:QQcell do hash(x.v) is x:RRcell do hash(x.v) is x:RRicell do hash(x.v) - is x:RRbcell do hash(x.v, x.prec) is x:CCcell do hash(x.v) is x:CCicell do hash(x.v.re + x.v.im) - is x:CCbcell do hash(x.v, x.prec) is x:Sequence do ( -- the numbers here are the same as in binary lookup() in objects.d!! h := hash_t(27449); diff --git a/M2/Macaulay2/d/classes.dd b/M2/Macaulay2/d/classes.dd index 7dbcc841e48..32eaf7fa10b 100644 --- a/M2/Macaulay2/d/classes.dd +++ b/M2/Macaulay2/d/classes.dd @@ -150,10 +150,8 @@ export Class(e:Expr):HashTable := ( is SymbolBody do symbolBodyClass is RRicell do RRiClass is RRcell do RRClass - is RRbcell do RRbClass is CCcell do CCClass is CCicell do CCiClass - is CCbcell do CCbClass is RawComputationCell do rawComputationClass is Nothing do nothingClass is Database do dbClass diff --git a/M2/Macaulay2/d/equality.dd b/M2/Macaulay2/d/equality.dd index 30b130fe0d4..c50413536a7 100644 --- a/M2/Macaulay2/d/equality.dd +++ b/M2/Macaulay2/d/equality.dd @@ -148,7 +148,6 @@ export equal(lhs:Expr,rhs:Expr):Expr := ( if strictequality(x.v,y.v) then True else False ) else False) -- End added for MPFI - is x:RRbcell do False is x:CCcell do ( when rhs is y:CCcell do ( @@ -161,7 +160,6 @@ export equal(lhs:Expr,rhs:Expr):Expr := ( if strictequality(x.v.re,y.v.re) && strictequality(x.v.im,y.v.im) then True else False ) else False) - is x:CCbcell do False is x:SymbolClosure do ( when rhs is y:SymbolClosure do ( diff --git a/M2/Macaulay2/d/parse.d b/M2/Macaulay2/d/parse.d index d2836e8f60e..22da27fda31 100644 --- a/M2/Macaulay2/d/parse.d +++ b/M2/Macaulay2/d/parse.d @@ -362,10 +362,8 @@ export atomicIntCell := {+ v:atomicField, hash:hash_t }; export Expr := ( CCcell or CCicell or - CCbcell or RRcell or RRicell or - RRbcell or Boolean or PseudocodeClosure or Pseudocode or diff --git a/M2/Macaulay2/d/util.d b/M2/Macaulay2/d/util.d index 62fa0fbaeaa..b121a0720ac 100644 --- a/M2/Macaulay2/d/util.d +++ b/M2/Macaulay2/d/util.d @@ -222,10 +222,8 @@ export toExpr(x:ZZ):Expr := Expr(ZZcell(x)); export toExpr(x:QQ):Expr := Expr(QQcell(x)); export toExpr(x:RR):Expr := Expr(RRcell(x)); export toExpr(x:RRi):Expr := Expr(RRicell(x)); -export toExpr(x:RRb,prec:ulong):Expr := Expr(toRRbcell(x, prec)); export toExpr(x:CC):Expr := Expr(CCcell(x)); export toExpr(x:CCi):Expr := Expr(CCicell(x)); -export toExpr(x:CCb,prec:ulong):Expr := Expr(toCCbcell(x, prec)); export toExpr(x:float):Expr := Expr(RRcell(toRR(x,ulong(24)))); export toExpr(x:double):Expr := Expr(RRcell(toRR(x,ulong(53)))); export toExpr(x:RawComputation):Expr := Expr(RawComputationCell(x)); diff --git a/M2/Macaulay2/m2/exports.m2 b/M2/Macaulay2/m2/exports.m2 index 949fa4fe1ae..998b2e52cc5 100644 --- a/M2/Macaulay2/m2/exports.m2 +++ b/M2/Macaulay2/m2/exports.m2 @@ -95,7 +95,6 @@ export { "Boxes", "CC", "CC'", - "CCb", "CCi", "CCi'", "CacheExampleOutput", @@ -345,8 +344,6 @@ export { "QuotientRing", "RR", "RR'", - "RRb", - "RRb'", "RRi", "RRi'", "RaiseError", @@ -1213,15 +1210,13 @@ export { "to", "toAbsolutePath", "toCC", - "toCCb", - "toCCi", + "toCCi", "toExternalString", "toField", "toList", "toLower", "toRR", - "toRRb", - "toRRi", + "toRRi", "toSequence", "toString", "toUpper", diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 1d96278dbb2..ecff503c891 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -12,12 +12,10 @@ globalAssignment ImmutableType RR.synonym = "real number" RRi.synonym = "real interval" -RRb.synonym = "real ball" CC.synonym = "complex number" CCi.synonym = "complex interval" RR.texMath = ///{\mathbb R}/// RRi.texMath = ///{\square\mathbb R}/// -RRb.texMath = ///{\circle\mathbb R}/// CC.texMath = ///{\mathbb C}/// CCi.texMath = ///{\square\mathbb C}/// Number.synonym = "number" @@ -38,8 +36,6 @@ raw InexactField := R -> R.RawRing RR.InexactField = RealField = new Type of InexactField ; RealField.synonym = "real field" RRi.InexactField = RealIntervalField = new Type of InexactField ; RealIntervalField.synonym = "real interval field" -RRb.InexactField = RealBallField = new Type of InexactField -RealBallField.synonym = "real ball field" CC.InexactField = ComplexField = new Type of InexactField; ComplexField.synonym = "complex field" CCi.InexactField = ComplexIntervalField = new Type of InexactField; ComplexIntervalField.synonym = "complex interval field" @@ -48,17 +44,14 @@ RingFamily_* := RR -> RR#(symbol _*) RingFamily_* := RRi -> RRi#(symbol _*) RingFamily_* = (RR,e) -> RR#(symbol _*) = e RingFamily_* = (RRi,e) -> RRi#(symbol _*) = e -RingFamily_* = (RRb,e) -> RRb#(symbol _*) = e InexactNumber' = new Type of Nothing' RR_* = RR' = new Type of InexactNumber' RRi_* = RRi' = new Type of InexactNumber' -RRb_* = RRb' = new Type of InexactNumber' CC_* = CC' = new Type of InexactNumber' CCi_* = CCi' = new Type of InexactNumber' RR'.texMath = ///{\mathbb R}_*/// RRi'.texMath = ///{\square\mathbb R}_*/// -RRb'.texMath = ///{\circle\mathbb R}_*/// CC'.texMath = ///{\mathbb C}_*/// CCi'.texMath = ///{\square\mathbb C}_*/// @@ -66,18 +59,15 @@ setAttribute(CC',PrintNet,"CC" | "*"^-1) setAttribute(CCi',PrintNet,"CCi" | "*"^-1) setAttribute(RR',PrintNet,"RR" | "*"^-1) setAttribute(RRi',PrintNet,"RRi" | "*"^-1) -setAttribute(RRb',PrintNet,"RRb" | "*"^-1) setAttribute(CC',PrintNames,"CC_*") setAttribute(CCi',PrintNames,"CCi_*") setAttribute(RR',PrintNames,"RR_*") setAttribute(RRi',PrintNames,"RRi_*") -setAttribute(RRb',PrintNames,"RRb_*") setAttribute(InexactNumber',PrintNet,"InexactNumber" | "*"^-1) protect back RR'.back = RR RRi'.back = RRi -RRb'.back = RRb CC'.back = CC CCi'.back = CCi new RealField of Nothing' from ZZ := memoize ( @@ -116,22 +106,13 @@ new ComplexIntervalField of Nothing' from ZZ := memoize ( symbol isBasic => true, symbol RawRing => rawCCi prec })) -new RealBallField of Nothing' from ZZ := memoize ( - (RealBallField, Nothing', prec) -> newClass(RealBallField, Nothing', - hashTable { - symbol precision => prec, - symbol Engine => true, - symbol baseRings => {ZZ,QQ}, - symbol isBasic => true, - symbol RawRing => null -- TODO - })) precision InexactField := R -> R.precision InexactFieldFamily _ ZZ := (T,prec) -> new T.InexactField of T#(symbol _*) from prec -- oops... default InexactFieldFamily := R -> R_defaultPrecision diameter' = diameter diameter = method() -diameter RRi := diameter RRb := diameter' +diameter RRi := diameter' diameter CCi := diameter' -- lift and promote between real or complex rings @@ -250,7 +231,6 @@ lift(RRi,ZZ) := opts -> (r,ZZ) -> ( ring RR := x -> new RealField of RR' from precision x ring RRi := x -> new RealIntervalField of RRi' from precision x -ring RRb := x -> new RealBallField of RRb' from precision x ring CC := x -> new ComplexField of CC' from precision x ring CCi := x -> new ComplexIntervalField of CCi' from precision x @@ -444,7 +424,6 @@ toString ComplexField := R -> concatenate("CC_",toString R.precision) expression RealField := R -> new Subscript from {symbol RR, R.precision} expression RealIntervalField := R -> new Subscript from {symbol RRi, R.precision} -expression RealBallField := R -> new Subscript from {symbol RRb, R.precision} expression ComplexField := R -> new Subscript from {symbol CC, R.precision} expression RR := x -> ( if x < 0 From bfe255454589eaaa6318fe80c10404361a9f649d Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 8 Jul 2025 10:37:21 -0400 Subject: [PATCH 095/691] Add CCi <-> CCb conversion functions So we can use arb to compute various numerical functions of CCi's --- M2/Macaulay2/d/ballarith.d | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 8a313b1062c..6432882bee0 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -212,6 +212,14 @@ export toCCb(z:CC):CCb := ( clear(y); w); +toCCb(z:CCi):CCb := ( + x := toRRb(realPart(z)); + y := toRRb(imaginaryPart(z)); + w := toCCb(x, y); + clear(x); + clear(y); + w); + toCC(z:CCb, prec:ulong):CC := ( x := Ccode(RRb, "acb_realref(", z, ")"); y := Ccode(RRb, "acb_imagref(", z, ")"); @@ -222,6 +230,16 @@ moveToCCandclear(z:CCb, prec:ulong):CC := ( clear(z); r); +toCCi(z:CCb, prec:ulong):CCi := ( + x := Ccode(RRb, "acb_realref(", z, ")"); + y := Ccode(RRb, "acb_imagref(", z, ")"); + toCCi(toRRi(x, prec), toRRi(y, prec))); + +moveToCCiandclear(z:CCb, prec:ulong):CCi := ( + r := toCCi(z, prec); + clear(z); + r); + export eint(z:CC):CC := ( w := toCCb(z); r := newCCb(); From c0074e7db956ed553ac122952b0ce52135cf688c Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 8 Jul 2025 11:01:19 -0400 Subject: [PATCH 096/691] Add trig functions for CCi --- M2/Macaulay2/d/actors3.d | 11 ++++++ M2/Macaulay2/d/ballarith.d | 77 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 9662babf6e5..161fd6a9a6c 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -729,6 +729,7 @@ setup(StarS,starfun,timesfun); sin(e:Expr):Expr := ( when e is x:CCcell do toExpr(sin(x.v)) -- # typical value: sin, CC, CC + is x:CCicell do toExpr(sin(x.v)) -- # typical value: sin, CCi, CCi is x:RRcell do toExpr(sin(x.v)) -- # typical value: sin, RR, RR is x:RRicell do toExpr(sin(x.v)) -- # typical value: sin, RRi, RRi else WrongArgRRorCC() @@ -737,6 +738,7 @@ setupfun("sin",sin).Protected=false; cos(e:Expr):Expr := ( when e is x:CCcell do toExpr(cos(x.v)) -- # typical value: cos, CC, CC + is x:CCicell do toExpr(cos(x.v)) -- # typical value: cos, CCi, CCi is x:RRcell do toExpr(cos(x.v)) -- # typical value: cos, RR, RR is x:RRicell do toExpr(cos(x.v)) -- # typical value: cos, RRi, RRi else WrongArgRRorCC() @@ -745,6 +747,7 @@ setupfun("cos",cos).Protected=false; tan(e:Expr):Expr := ( when e is x:CCcell do toExpr(tan(x.v)) -- # typical value: tan, CC, CC + is x:CCicell do toExpr(tan(x.v)) -- # typical value: tan, CCi, CCi is x:RRcell do toExpr(tan(x.v)) -- # typical value: tan, RR, RR is x:RRicell do toExpr(tan(x.v)) -- # typical value: tan, RRi, RRi else WrongArgRRorCC() @@ -753,6 +756,7 @@ setupfun("tan",tan).Protected=false; acos(e:Expr):Expr := ( when e is x:CCcell do toExpr(acos(x.v)) -- # typical value: acos, CC, CC + is x:CCicell do toExpr(acos(x.v)) -- # typical value: acos, CCi, CCi is x:RRcell do ( if x.v > 1 || x.v < -1 then toExpr(acos(toCC(x.v))) @@ -769,6 +773,7 @@ setupfun("acos",acos).Protected=false; sec(e:Expr):Expr := ( when e is x:CCcell do toExpr(sec(x.v)) -- # typical value: sec, CC, CC + is x:CCicell do toExpr(sec(x.v)) -- # typical value: sec, CCi, CCi is x:RRcell do toExpr(sec(x.v)) -- # typical value: sec, RR, RR is x:RRicell do toExpr(sec(x.v)) -- # typical value: sec, RRi, RRi else WrongArgRRorCC() @@ -777,6 +782,7 @@ setupfun("sec",sec).Protected=false; csc(e:Expr):Expr := ( when e is x:CCcell do toExpr(csc(x.v)) -- # typical value: csc, CC, CC + is x:CCicell do toExpr(csc(x.v)) -- # typical value: csc, CCi, CCi is x:RRcell do toExpr(csc(x.v)) -- # typical value: csc, RR, RR is x:RRicell do toExpr(csc(x.v)) -- # typical value: csc, RRi, RRi else WrongArgRRorCC() @@ -785,6 +791,7 @@ setupfun("csc",csc).Protected=false; cot(e:Expr):Expr := ( when e is x:CCcell do toExpr(cot(x.v)) -- # typical value: cot, CC, CC + is x:CCicell do toExpr(cot(x.v)) -- # typical value: cot, CCi, CCi is x:RRcell do toExpr(cot(x.v)) -- # typical value: cot, RR, RR is x:RRicell do toExpr(cot(x.v)) -- # typical value: cot, RRi, RRi else WrongArgRRorCC() @@ -793,6 +800,7 @@ setupfun("cot",cot).Protected=false; sech(e:Expr):Expr := ( when e is x:CCcell do toExpr(sech(x.v)) -- # typical value: sech, CC, CC + is x:CCicell do toExpr(sech(x.v)) -- # typical value: sech, CCi, CCi is x:RRcell do toExpr(sech(x.v)) -- # typical value: sech, RR, RR is x:RRicell do toExpr(sech(x.v)) -- # typical value: sech, RRi, RRi else WrongArgRRorCC() @@ -801,6 +809,7 @@ setupfun("sech",sech).Protected=false; csch(e:Expr):Expr := ( when e is x:CCcell do toExpr(csch(x.v)) -- # typical value: csch, CC, CC + is x:CCicell do toExpr(csch(x.v)) -- # typical value: csch, CCi, CCi is x:RRcell do toExpr(csch(x.v)) -- # typical value: csch, RR, RR is x:RRicell do toExpr(csch(x.v)) -- # typical value: csch, RRi, RRi else WrongArgRRorCC() @@ -809,6 +818,7 @@ setupfun("csch",csch).Protected=false; coth(e:Expr):Expr := ( when e is x:CCcell do toExpr(coth(x.v)) -- # typical value: coth, CC, CC + is x:CCicell do toExpr(coth(x.v)) -- # typical value: coth, CCi, CCi is x:RRcell do toExpr(coth(x.v)) -- # typical value: coth, RR, RR is x:RRicell do toExpr(coth(x.v)) -- # typical value: coth, RRi, RRi else WrongArgRRorCC() @@ -817,6 +827,7 @@ setupfun("coth",coth).Protected=false; asin(e:Expr):Expr := ( when e is x:CCcell do toExpr(asin(x.v)) -- # typical value: asin, CC, CC + is x:CCicell do toExpr(asin(x.v)) -- # typical value: asin, CCi, CCi is x:RRcell do ( if x.v > 1 || x.v < -1 then toExpr(asin(toCC(x.v))) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 6432882bee0..4018f2290b7 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -240,6 +240,83 @@ moveToCCiandclear(z:CCb, prec:ulong):CCi := ( clear(z); r); +export sin(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_sin(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export cos(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_cos(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export tan(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_tan(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export acos(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_acos(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export sec(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_sec(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export csc(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_csc(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export cot(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_cot(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export sech(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_sech(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export csch(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_csch(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export coth(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_coth(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export asin(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_asin(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export eint(z:CC):CC := ( w := toCCb(z); r := newCCb(); From 486c471a5c497761675a745716dc06e5feb5fe55 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 8 Jul 2025 11:20:27 -0400 Subject: [PATCH 097/691] Use inheritance for printing inexact fields --- M2/Macaulay2/m2/reals.m2 | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index ecff503c891..d9b3e565802 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -418,13 +418,10 @@ Constant ! := c -> (numeric c)! -- printing -toString RealField := R -> concatenate("RR_",toString R.precision) -toString RealIntervalField := R -> concatenate("RRi_",toString R.precision) -toString ComplexField := R -> concatenate("CC_",toString R.precision) +toString InexactField := R -> concatenate( + toString (parent R).back, "_", toString R.precision) +expression InexactField := R -> Subscript((parent R).back, R.precision) -expression RealField := R -> new Subscript from {symbol RR, R.precision} -expression RealIntervalField := R -> new Subscript from {symbol RRi, R.precision} -expression ComplexField := R -> new Subscript from {symbol CC, R.precision} expression RR := x -> ( if x < 0 then ( From 28153bc8d59fddefa28d4734d42848683c0e212d Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 8 Jul 2025 11:34:57 -0400 Subject: [PATCH 098/691] Add some more special functions for CCi --- M2/Macaulay2/d/actors3.d | 3 +++ M2/Macaulay2/d/ballarith.d | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 161fd6a9a6c..af78d88d7f7 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -846,6 +846,7 @@ log1p(e:Expr):Expr := ( is x:RRcell do toExpr(log1p(x.v)) -- # typical value: log1p, RR, RR is x:RRicell do toExpr(log1p(x.v)) -- # typical value: log1p, RRi, RRi is x:CCcell do toExpr(log(1 + x.v)) -- # typical value: log1p, CC, CC + is x:CCicell do toExpr(log1p(x.v)) -- # typical value: log1p, CCi, CCi else WrongArgRRorCC() ); setupfun("log1p",log1p).Protected=false; @@ -854,6 +855,7 @@ expm1(e:Expr):Expr := ( is x:RRcell do toExpr(expm1(x.v)) -- # typical value: expm1, RR, RR is x:RRicell do toExpr(expm1(x.v)) -- # typical value: expm1, RRi, RRi is x:CCcell do toExpr(exp(x.v) - 1) -- # typical value: expm1, CC, CC + is x:CCicell do toExpr(expm1(x.v)) -- # typical value: expm1, CCi, CCi else WrongArgRRorCC() ); setupfun("expm1",expm1).Protected=false; @@ -862,6 +864,7 @@ eint(e:Expr):Expr := ( is x:RRcell do toExpr(eint(x.v)) -- # typical value: eint, RR, RR is x:RRicell do toExpr(eint(x.v)) -- # typical value: eint, RRi, RRi is x:CCcell do toExpr(eint(x.v)) -- # typical value: eint, CC, CC + is x:CCicell do toExpr(eint(x.v)) -- # typical value: eint, CCi, CCi else WrongArgRRorCC() ); setupfun("eint",eint).Protected=false; diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 4018f2290b7..1a0d191229b 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -317,6 +317,20 @@ export asin(z:CCi):CCi := ( clear(w); moveToCCiandclear(r, precision(z))); +export log1p(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_log1p(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export expm1(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_expm1(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export eint(z:CC):CC := ( w := toCCb(z); r := newCCb(); @@ -324,6 +338,13 @@ export eint(z:CC):CC := ( clear(w); moveToCCandclear(r, precision(z))); +export eint(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_hypgeom_ei(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export Gamma(z:CC):CC := ( w := toCCb(z); r := newCCb(); From f853db20c53a25ea320b6827e2eb3bb61fdfdeaf Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 9 Jul 2025 11:47:12 -0400 Subject: [PATCH 099/691] Add gamma function for CCi's --- M2/Macaulay2/d/actors3.d | 27 ++++++++++++++++++++------- M2/Macaulay2/d/ballarith.d | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index af78d88d7f7..e3dc221e377 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -870,9 +870,10 @@ eint(e:Expr):Expr := ( setupfun("eint",eint).Protected=false; Gamma(e:Expr):Expr := ( when e - is x:RRcell do toExpr(Gamma(x.v)) -- # typical value: Gamma, RR, RR + is x:RRcell do toExpr(Gamma(x.v)) -- # typical value: Gamma, RR, RR is x:RRicell do toExpr(Gamma(x.v)) -- # typical value: Gamma, RRi, RRi - is x:CCcell do toExpr(Gamma(x.v)) -- # typical value: Gamma, CC, CC + is x:CCcell do toExpr(Gamma(x.v)) -- # typical value: Gamma, CC, CC + is x:CCicell do toExpr(Gamma(x.v)) -- # typical value: Gamma, CCi, CCi is a:Sequence do if length(a) != 2 then WrongNumArgs(1,2) else ( @@ -882,16 +883,28 @@ Gamma(e:Expr):Expr := ( is x:RRcell do toExpr(Gamma( s.v , x.v)) -- # typical value: Gamma, RR, RR, RR is x:RRicell do toExpr(Gamma(toRRi(s.v), x.v)) -- # typical value: Gamma, RR, RRi, RRi is x:CCcell do toExpr(Gamma( toCC(s.v), x.v)) -- # typical value: Gamma, RR, CC, CC + is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) -- # typical value: Gamma, RR, CCi, CCi else WrongArgRRorCC(2)) is s:RRicell do ( when a.1 - is x:RRcell do toExpr(Gamma(s.v, toRRi(x.v))) -- # typical value: Gamma, RRi, RR, RRi - is x:RRicell do toExpr(Gamma(s.v, x.v )) -- # typical value: Gamma, RRi, RRi, RRi - else WrongArgRRorRRi(2)) + is x:RRcell do toExpr(Gamma( s.v, toRRi(x.v))) -- # typical value: Gamma, RRi, RR, RRi + is x:RRicell do toExpr(Gamma( s.v, x.v )) -- # typical value: Gamma, RRi, RRi, RRi + is x:CCcell do toExpr(Gamma(toCCi(s.v),toCCi(x.v))) -- # typical value: Gamma, RRi, CC, CCi + is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) -- # typical value: Gamma, RRi, CCi, CCi + else WrongArgRRorCC(2)) is s:CCcell do ( when a.1 - is x:RRcell do toExpr(Gamma(s.v, toCC(x.v))) -- # typical value: Gamma, CC, RR, CC - is x:CCcell do toExpr(Gamma(s.v, x.v)) -- # typical value: Gamma, CC, CC, CC + is x:RRcell do toExpr(Gamma( s.v, toCC(x.v))) -- # typical value: Gamma, CC, RR, CC + is x:RRicell do toExpr(Gamma(toCCi(s.v),toCCi(x.v))) -- # typical value: Gamma, CC, RRi, CCi + is x:CCcell do toExpr(Gamma( s.v, x.v)) -- # typical value: Gamma, CC, CC, CC + is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) -- # typical value: Gamma, CC, CCi, CCi + else WrongArgRRorCC(2)) + is s:CCicell do ( + when a.1 + is x:RRcell do toExpr(Gamma(s.v, toCCi(x.v))) -- # typical value: Gamma, CCi, RR, CCi + is x:RRicell do toExpr(Gamma(s.v, toCCi(x.v))) -- # typical value: Gamma, CCi, RRi, CCi + is x:CCcell do toExpr(Gamma(s.v, toCCi(x.v))) -- # typical value: Gamma, CCi, CC, CCi + is x:CCicell do toExpr(Gamma(s.v, x.v)) -- # typical value: Gamma, CCi, CCi, CCi else WrongArgRRorCC(2)) else WrongArgRRorCC(2)) else WrongArgRRorCC() diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 1a0d191229b..87c8c44cb1b 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -352,6 +352,13 @@ export Gamma(z:CC):CC := ( clear(w); moveToCCandclear(r, precision(z))); +export Gamma(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_gamma(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export Gamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); x := toCCb(z); @@ -363,6 +370,17 @@ export Gamma(z:CC,w:CC):CC := ( clear(y); moveToCCandclear(r, prec)); +export Gamma(z:CCi,w:CCi):CCi := ( + prec := min(precision(z), precision(w)); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); + Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 0, ", + prec, ")"); + clear(x); + clear(y); + moveToCCiandclear(r, prec)); + export regularizedGamma(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); x := toCCb(z); From b0e6bb9d1729598b837344b8c45c101769548f94 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 9 Jul 2025 11:50:58 -0400 Subject: [PATCH 100/691] Regenerate tvalues.m2 if d directory has been updated --- M2/Macaulay2/m2/typicalvalues.m2 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/m2/typicalvalues.m2 b/M2/Macaulay2/m2/typicalvalues.m2 index 82efde7c1d3..a61cf4eba50 100644 --- a/M2/Macaulay2/m2/typicalvalues.m2 +++ b/M2/Macaulay2/m2/typicalvalues.m2 @@ -125,8 +125,12 @@ generateTypicalValues = (srcdir) -> ( outfile << "-- DONE: generated based on " | version#"git description" << endl << close) -- if missing or not successfully generated, tvalues.m2 is regenerated directly -if not fileExists typicalValuesSource or not match("-- DONE", get typicalValuesSource) -then generateTypicalValues(currentFileDirectory | "../d/") +ddir := currentFileDirectory | "../d/" +if ( + not fileExists typicalValuesSource or + not match("-- DONE", get typicalValuesSource) or + isDirectory ddir and fileTime typicalValuesSource < fileTime ddir) +then generateTypicalValues ddir ----------------------------------------------------------------------------- -- numerical functions that will be wrapped From b49270aa5820fba3fd8fba8eda3b39dc2eb94f5b Mon Sep 17 00:00:00 2001 From: kellerlv <54511397+kellerlv@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:02:59 -0400 Subject: [PATCH 101/691] New package simplicial modules --- M2/Macaulay2/packages/=distributed-packages | 1 + M2/Macaulay2/packages/SimplicialModules.m2 | 208 + .../SimplicialModules/Normalization.m2 | 311 ++ .../SimplicialMapUtilities_Modified.m2 | 253 ++ .../SimplicialModules/SimplicialModule.m2 | 1436 ++++++ .../SimplicialModules/SimplicialModuleDOC.m2 | 4001 +++++++++++++++++ .../SimplicialModuleTESTS1.m2 | 1198 +++++ .../SimplicialModule_Modified.m2 | 823 ++++ 8 files changed, 8231 insertions(+) create mode 100644 M2/Macaulay2/packages/SimplicialModules.m2 create mode 100644 M2/Macaulay2/packages/SimplicialModules/Normalization.m2 create mode 100644 M2/Macaulay2/packages/SimplicialModules/SimplicialMapUtilities_Modified.m2 create mode 100644 M2/Macaulay2/packages/SimplicialModules/SimplicialModule.m2 create mode 100644 M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 create mode 100644 M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 create mode 100644 M2/Macaulay2/packages/SimplicialModules/SimplicialModule_Modified.m2 diff --git a/M2/Macaulay2/packages/=distributed-packages b/M2/Macaulay2/packages/=distributed-packages index 0afda8756c7..1a809e75238 100644 --- a/M2/Macaulay2/packages/=distributed-packages +++ b/M2/Macaulay2/packages/=distributed-packages @@ -288,3 +288,4 @@ AllMarkovBases Tableaux CpMackeyFunctors JSONRPC +SimplicialModules diff --git a/M2/Macaulay2/packages/SimplicialModules.m2 b/M2/Macaulay2/packages/SimplicialModules.m2 new file mode 100644 index 00000000000..5bec277a981 --- /dev/null +++ b/M2/Macaulay2/packages/SimplicialModules.m2 @@ -0,0 +1,208 @@ +newPackage( + "SimplicialModules", + AuxiliaryFiles => true, + Version => "0.1", + Date => "September 27, 2023", + Authors => { + {Name => "Keller VandeBogert", Email => "kvandebo@nd.edu", HomePage => "https://sites.google.com/view/kellervandebogert/home"}, + {Name => "Michael DeBellevue", Email => "", HomePage => ""}}, + Headline => "methods for working in the category of simplicial modules", + Keywords => {"Homological Algebra", "Commutative Algebra"}, + PackageExports => {"Complexes", "SchurFunctors"}, + PackageImports => {"Complexes"} + ) + +export {"SimplicialModule", + "SimplicialModuleMap", + "simplicialModule", + --"combineSFactors", + "forgetComplex", + "forgetDegeneracy", + "isSimplicialModule", + "isSimplicialMorphism", + "randomSimplicialMap", + "tensorwithComponents", + "topDegree", + "exteriorInclusion", + "extPower", + "naiveNorm", + "normalize", + "schurMap", + "simplicialTensor", + "symmetricQuotient", + "tensorLES", + --"CheckMap", + "CheckComplex", + "RememberSummands", + "Degeneracy", + "TopDegree", + "ss", + "complexLength", + "CheckSum", + "complexMap", + "summandSurjection" + } + + + + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- **CODE** -- +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + +load "./SimplicialModules/SimplicialMapUtilities_Modified.m2" +load "./SimplicialModules/SimplicialModule.m2" +load "./SimplicialModules/Normalization.m2" + + + +----------------------------------------------------------------------------- +-- Documentation +----------------------------------------------------------------------------- + +beginDocumentation() + +load "./SimplicialModules/SimplicialModuleDOC.m2" + + + +----------------------------------------------------------------------------- +-- Tests +----------------------------------------------------------------------------- + +load "./SimplicialModules/SimplicialModuleTESTS1.m2" + + + +----------------------------------------------------------------------------- +-- Development +----------------------------------------------------------------------------- + +end-- + +uninstallPackage "SimplicialModules" +restart +debug installPackage "SimplicialModules" +debug loadPackage("SimplicialModules", LoadDocumentation => true, Reload => true) +debug needsPackage "SimplicialModules" +check SimplicialModules +viewHelp SimplicialModules + + Q = QQ[x_1..x_3]; + K = koszulComplex vars Q; + isWellDefined simplicialModule(K, 4) --no degeneracy here + S = simplicialModule(K,4, Degeneracy => true) + S.dd**Q^1 + isWellDefined S + Sdegen = simplicialModule(K,4,Degeneracy => true) + S.dd + --S.ss --should return error, no such key + Sdegen.ss --this is the version that actually has degeneracy maps cached + simplicialModule(K, 5) + C = complex(Q^1, Base => 1) + simplicialModule(C, 3) + isWellDefined oo + simplicialModule(complex(Q^2, Base => 2), 6, Degeneracy => true) + isWellDefined oo --nice, now we can be confident the objects we are messing with actually make any sense + oo.ss + id_S + phi = exteriorInclusion(S); + prune phi + prune coker phi + K = koszulComplex {x_1,x_2} + Sn = simplicialModule(K, 4, Degeneracy => true) + phi = exteriorInclusion(K) + isCommutative phi + isWellDefined phi + isCommutative prune phi + isWellDefined prune phi + sphi = exteriorInclusion(Sn); + psphi = prune sphi; + isWellDefined (source psphi).cache.pruningMap + isCommutative (source psphi).cache.pruningMap + isSimplicialMorphism (source psphi).cache.pruningMap --pruningMaps are well-defined morphisms + + S = simplicialModule(K,6) + + + p = randomComplexMap(K, K, Degree => 1, InternalDegree => 1) + sp = simplicialModule p + isWellDefined sp + isCommutative sp + normalize(sp, CheckComplex => false) + prune oo ---reobtain p + p' = randomComplexMap(K, K, Degree => -1) + sp' = simplicialModule p' + isWellDefined sp' + isCommutative sp' + normalize(sp', CheckComplex => false) + prune oo --reobtain p' + p = randomComplexMap(K, K, Degree => 1, Cycle => true, InternalDegree => 2) + sp = simplicialModule p + isWellDefined sp + isCommutative sp + normalize(sp, CheckComplex => false) + prune oo ---reobtain p + diffs = simplicialModule K.dd + isWellDefined diffs + isCommutative diffs + + image(id_S) == S + simplicialModule(id_K, 6) == id_S + isSimplicialMorphism id_S + simplicialModule(complex(Q^0), 6, Degeneracy => true) -- should be able to input 0 and get a well-defined output + isWellDefined oo + phi = randomSimplicialMap(S, S, Cycle => true, InternalDegree => 1) + isWellDefined phi + isCommutative phi + + bS = basis(0, forgetComplex S) + prune bS.dd + isWellDefined bS + isWellDefined prune bS + bid = basis(0, id_(forgetComplex S)) + isWellDefined bid + isCommutative bid + isWellDefined prune bid + isCommutative prune bid + + fS = forgetComplex S + fS.?ss + + bS = basis(1, forgetComplex S) + isWellDefined bS + prune bS.dd + isWellDefined oo + prune bS.ss + isWellDefined oo + normalize bS + prune oo + prune basis(1, K) + + bS = basis(3, forgetComplex S) + isWellDefined bS + prune bS.dd; + isWellDefined oo + prune bS.ss; + isWellDefined oo + normalize bS + prune oo + prune basis(3, koszulComplex vars Q) + + tS = truncate(1, S) + isWellDefined tS + prune tS + isWellDefined prune tS + tS = truncate(1, fS) + isWellDefined tS + prune tS + isWellDefined prune tS + isCommutative truncate(2, id_S) + isCommutative truncate(2, id_fS) + + K = koszulComplex {x_1,x_2} + isWellDefined (Sc = schurMap({1,1}, K)) + prune ext(2, K) + prune schurMap({2,1}, K, TopDegree => 4) diff --git a/M2/Macaulay2/packages/SimplicialModules/Normalization.m2 b/M2/Macaulay2/packages/SimplicialModules/Normalization.m2 new file mode 100644 index 00000000000..8d09248a7bb --- /dev/null +++ b/M2/Macaulay2/packages/SimplicialModules/Normalization.m2 @@ -0,0 +1,311 @@ + needsPackage "SchurFunctors" + needsPackage "Complexes" + + altSumFace = method(); +altSumFace(SimplicialModule,ZZ) := (S,n) -> (sum(0..n,i->(-1)^i*(S.dd)_(n,i))) + +altSumFace(Complex,ZZ) := (C,n) -> (altSumFace(simplicialModule(C,n),n)) + +--this function computes the naive normalization +--of a simplicial object, with is just the complex built from the +--modules of the simplicial object equipped with differential which is just the alternating sum of the face maps. +naiveNorm = method(); +naiveNorm(SimplicialModule,ZZ) := (S,n) -> (complex for i from 1 to n list altSumFace(S,i)) + +naiveNorm(SimplicialModule) := S -> naiveNorm(S, S.topDegree) + +naiveNorm(Complex,ZZ) := (C,n) -> (naiveNorm(simplicialModule(C,n),n)) + + + +--we assume that S is Gamma(C) for some complex C here +--sym = method(); +--sym(ZZ,Matrix) := (d,M) -> ( +-*symMult = method(); +symMult(List,ZZ,Ring) := (L,d,Q) -> (Qn := Q[z_1..z_d]; + M1 := tensor(for i in L list basis(i,Qn)); + M2 := basis(sum L,Qn); + sub(M1//M2,Q) + )*- + +--this function constructs the Dold-Puppe extension of the Schur functor to the category +--of chain complexes. The list L should be a partition +schurMap = method(Options => {Degeneracy => false,TopDegree => null}); +schurMap(List,SimplicialModule) := SimplicialModule => opts -> (lambda,S) -> (tdeg := topDegree S; + --C := S.complex; + L := hashTable for i to tdeg list i => schurModule(lambda,combineSFactors(S,i)); + H1 := hashTable for i in keys (S.dd.map) list i => schur(lambda,((S.dd)_i)); + if opts.Degeneracy==true then H2 := hashTable for i in keys (S.ss.map) list i => schur(lambda,((S.ss)_i)); + --print("we made it"); + if opts.Degeneracy==true then return simplicialModule(L,H1,H2,tdeg); + simplicialModule(L,H1,tdeg) + ) + +schurMap(List,SimplicialModuleMap) := SimplicialModuleMap => opts -> (lambda,phi) -> ( + S1 := source phi; + S2 := target phi; + if instance((keys phi.map)#0,Sequence) then error "Expected SimplicialModuleMap to have singly graded indices"; + map(schurMap(lambda,S2),schurMap(lambda,S1),new HashTable from for i to max(topDegree S1,topDegree S2) list i => schur(lambda,phi_i),Degree => degree phi) + ) + +schurMap(List,Complex) := Complex => opts -> (lambda,C) -> (S := if not(opts.TopDegree === null) then simplicialModule(C,opts.TopDegree) + else simplicialModule(C,(sum lambda)*length(C)); + Sn := schurMap(lambda,S); + normalize(Sn) + ) + +schurMap(List,ComplexMap) := ComplexMap => opts -> (lambda,phi) -> (phin := if not(opts.TopDegree === null) then simplicialModule(phi,opts.TopDegree) + else simplicialModule(phi,(sum lambda)*(max(length(source phi),length target phi))); + phik := schurMap(lambda,phin); + normalize(phik) + ) + +-*sym = method(Options => {Degeneracy => false,TopDegree => null}); +sym(ZZ,Matrix) := Matrix => opts -> (d,phi) -> (Q := ring phi; + n := rank source phi; + m := rank target phi; + phitens := tensor((d:phi)); + M1 := symMult(toList(d:1),n,Q); + M2 := symMult(toList(d:1),m,Q); + matrix entries transpose ((matrix entries transpose(M2*phitens))//transpose(M1)) + ) + + +sym(ZZ,SimplicialModule) := SimplicialModule => opts -> (d,S) -> (tdeg := topDegree S; + --C := S.complex; + L = hashTable for i to tdeg list i => symmetricPower(d,combineSFactors(S,i)); + H1 = hashTable for i in keys (S.dd.map) list i => map(symmetricPower(d,target (S.dd)_i),symmetricPower(d,source (S.dd)_i),sym(d,((S.dd)_i))); + if opts.Degeneracy==true then H2 = hashTable for i in keys (S.ss.map) list i => sym(d,((S.ss)_i)); + --print("we made it"); + if opts.Degeneracy==true then return simplicialModule(L,H1,H2,tdeg); + simplicialModule(L,H1,tdeg) + ) + +sym(ZZ,SimplicialModuleMap) := SimplicialModuleMap => opts -> (d,phi) -> ( + S1 := source phi; + S2 := target phi; + if instance((keys phi.map)#0,Sequence) then error "Expected SimplicialModuleMap to have singly graded indices"; + map(sym(d,S2),sym(d,S1),new HashTable from for i to max(topDegree S1,topDegree S2) list i => sym(d,phi_i),Degree => degree phi) + ) + +sym(ZZ,Complex) := Complex => opts -> (d,C) -> (if not(opts.TopDegree === null) then S = simplicialModule(C,opts.TopDegree) + else S = simplicialModule(C,d*length(C)); + Sn := sym(d,S); + normalize(Sn) + ) + +sym(ZZ,ComplexMap) := ComplexMap => opts -> (d,phi) -> (if not(opts.TopDegree === null) then phin = simplicialModuleMap(phi,opts.TopDegree) + else phin = simplicialModuleMap(phi,d*(max(length(source phi),length target phi))); + phik := sym(d,phin); + normalize(phik) + )*- + + +--this function computes the Dold-Puppe extension of the exterior power functor +--to the category of chain complexes. The integer d is the degree of the exterior power +extPower = method(Options => {Degeneracy=>false,TopDegree => null}) +extPower(ZZ,SimplicialModule) := SimplicialModule => opts -> (d,S) -> (tdeg := topDegree S; + --C := S.complex; + L := hashTable for i to tdeg list i => exteriorPower(d,combineSFactors(S,i)); + H1 := hashTable for i in keys (S.dd.map) list i =>exteriorPower(d,((S.dd)_i)); + H2 := if opts.Degeneracy==true then hashTable for i in keys (S.ss.map) list i => exteriorPower(d,((S.ss)_i)); + --print("we made it"); + if opts.Degeneracy==true then return simplicialModule(L,H1,H2,tdeg); + simplicialModule(L,H1,tdeg) + ) + +extPower(ZZ,SimplicialModuleMap) := SimplicialModuleMap => opts -> (d,phi) -> ( + S1 := source phi; + S2 := target phi; + if instance((keys phi.map)#0,Sequence) then error "Expected SimplicialModuleMap to have singly graded indices"; + map(extPower(d,S2),extPower(d,S1),new HashTable from for i to max(topDegree S1,topDegree S2) list i => exteriorPower(d,phi_i),Degree => degree phi) + ) + +extPower(ZZ,Complex) := Complex => opts -> (d,C) -> (S := if not(opts.TopDegree === null) then simplicialModule(C,opts.TopDegree) + else simplicialModule(C,d*length(C)); + Sn := extPower(d,S); + normalize(Sn) + ) + +extPower(ZZ,ComplexMap) := ComplexMap => opts -> (d,phi) -> (phin := if not(opts.TopDegree === null) then simplicialModule(phi,opts.TopDegree) + else simplicialModule(phi,d*(max(length(source phi),length target phi))); + phik := extPower(d,phin); + normalize(phik) + ) + +--need to make this smarter: it should cache components so you can recover them easily + +--This function computes the simplicial tensor product and caches the direct sum +--indices so that the user can easily access components of the resulting face maps +--on particular direct summands of the tensor product +simplicialTensor = method(Options => {Degeneracy=>false,TopDegree => null}) +simplicialTensor(List) := SimplicialModule => opts -> T -> (if instance(T_0,SimplicialModule) then ( + degens := all(T, i->i.?ss); + tdeg := max apply(T,i->topDegree i); + L := hashTable for i to tdeg list i => tensorwithComponents(apply(T,s->s_i)); + H1 := hashTable for i in keys ((T_0).dd.map) list i => map(L#(i_0-1),L#(i_0),tensor(apply(T,s->s.dd_i))); + H2 := if opts.Degeneracy==true or degens then hashTable for i in keys ((T_0).ss.map) list i => tensorwithComponents(apply(T,s->s.ss_i)); + if opts.Degeneracy==true or degens then return simplicialModule(L,H1,H2,tdeg); + return simplicialModule(L,H1,tdeg); + ); + tLength := max apply(T,j->try length j else length source j); + if instance(T_0,Complex) then return normalize simplicialTensor(apply(T,j->simplicialModule(j,length(T)*tLength))); + if instance(T_0, ComplexMap) then return normalize tensor(apply(T, j -> simplicialModule(j, length(T)*tLength))); + ) + +simplicialTensor(SimplicialModule,SimplicialModule) := SimplicialModule => opts -> (S,T) -> (simplicialTensor({S,T})) + +simplicialTensor(ComplexMap, ComplexMap) := ComplexMap => opts -> (f,g) -> simplicialTensor({f,g}) + +simplicialTensor(ZZ,SimplicialModule) := SimplicialModule => opts -> (d,S) -> (simplicialTensor(toList(d:S),opts)) + +simplicialTensor(ZZ,Complex) := Complex => opts -> (d,C) -> (simplicialTensor(toList(d:C))) + +simplicialTensor(Complex,Complex) := Complex => opts -> (C,D) -> (simplicialTensor({C,D})) + + +SimplicialModule ** SimplicialModule := SimplicialModule => (S,T) -> (simplicialTensor(S,T)) + +hhh = method(); +hhh(Complex) := C -> (sum toList apply(0..length C,i->length HH_i(C))) + +degenMorphisms = method() +degenMorphisms(SimplicialModule,ZZ,ZZ) := (S,n,k) -> (Cn := naiveNorm(S,n); + map(Cn,Cn,i->(S.ss)_(i,k),Degree => 1) + ) + +degenMorphisms(Complex,ZZ,ZZ) := (C,n,k) -> (degenMorphisms(simplicialModule(C,n),n,k)) + +faceMorphisms = method() +faceMorphisms(SimplicialModule,ZZ,ZZ) := (S,n,k) -> (Cn := naiveNorm(S,n); + map(Cn,Cn,i->(S.dd)_(i,k),Degree => -1) + ) + +faceMorphisms(Complex,ZZ,ZZ) := (C,n,k) -> (faceMorphisms(simplicialModule(C,n),n,k)) + +makeNormMap = method(); +makeNormMap(SimplicialModule,ZZ) := (S,d) -> ( + K2 := intersect(for i from 1 to d list ker S.dd_(d,i)); + K1 := if d>1 then intersect(for i from 1 to d-1 list ker S.dd_(d-1,i)) else + if d ==1 then S_0; + I1 := if K1==0 then map(S_(d-1),(ring S)^0,0) + else inducedMap(S_(d-1),K1); + I2 := if K2==0 then map(S_d,(ring S)^0,0) + else inducedMap(S_(d),K2); + if I1 == 0 or I2 == 0 then return map(source I1,source I2,0); + ((S.dd_(d,0)*I2)//I1) + ) + +makeNormMap(SimplicialModuleMap,ZZ) := (phi,d) -> ( + S1 := source phi; + S2 := target phi; + if d==0 then return phi_0; + K1 := intersect( for i from 1 to d list ker S1.dd_(d,i)); + K2 := intersect( for i from 1 to d list ker S2.dd_(d,i)); + inducedMap(K2,K1,phi_d) + ) + +--this is the normalization functor from the category of simplicial modules +--back to the category of nonnegatively-graded chain complexes. +normalize = method(Options => {CheckSum => true,CheckComplex => true}); +normalize(SimplicialModule,ZZ) := Complex => opts -> (S,d) -> ( + if opts.CheckComplex and any(keys S,i->i==symbol complex) then return naiveTruncation(S.complex,0,d); + n := length components S; + if opts.CheckSum and n>1 then return directSum for i to n-1 list normalize((components S)_i,d); + complex for i from 1 to d list makeNormMap(S,i)) + +normalize(SimplicialModule) := Complex => opts -> S -> (if any(keys S,i->i==symbol complex) then return normalize(S,S.complexLength,opts); + normalize(S,S.topDegree,opts) + ) + +normalize(SimplicialModuleMap,ZZ) := ComplexMap => opts -> (phi,d) -> ( + if opts.CheckComplex and phi.cache.?complexMap then return naiveTruncation(phi.cache.complexMap,0,d); + n := length components phi; + if opts.CheckSum and n>1 then return directSum for i to n-1 list normalize((components phi)_i,d); + src := source phi; + trg := target phi; + C1 := normalize(src,d,opts); + C2 := normalize(trg,d,opts); + map(C2,C1,new HashTable from for i to max(max C1,max C2) list i => (if (f:=makeNormMap(phi,i)) == 0 then continue else map(C2_i, C1_i, f))) + ) + +normalize(SimplicialModuleMap) := ComplexMap => opts -> phi -> (d := max(topDegree source phi,topDegree target phi); + normalize(phi,d,opts) + ) + + +--this function computes the image of the 2nd exterior power into the tensor product +exteriorInclusion = method(); +exteriorInclusion(Module) := M -> ( + inducedMap(M**M,image(id_M**id_M-tensorCommutativity(M,M))) + ) + + +exteriorInclusion(SimplicialModule) := S -> (cS := forgetComplex S; + w2S := extPower(2,S); + T := S**S; + map(T,w2S,hashTable for i in keys cS.module list i => (dual wedgeProduct(1,1,dual cS.module#i))) + ) + +exteriorInclusion(Complex,ZZ) := (C,d) -> (normalize exteriorInclusion(simplicialModule(C,d))) + +exteriorInclusion(Complex) := C -> (exteriorInclusion(C,length C)) + +--computes the image of the surjection from the simplicial tensor product +--onto the second symmetric power of a complex +symmetricQuotient = method(); +symmetricQuotient(Module) := M -> ( + phi := exteriorInclusion(M); + inducedMap(coker phi,ambient coker phi) + ) + +symmetricQuotient(SimplicialModule) := S -> ( + phi := exteriorInclusion(S); + inducedMap(coker phi,target phi) + ) + +symmetricQuotient(Complex,ZZ) := (C,d) -> (normalize symmetricQuotient(simplicialModule(C,d))) + +symmetricQuotient(Complex) := C -> (symmetricQuotient(C,length C)) + + +--this computes the long exact sequence of homology induced by the canonical short +--exact sequence of complexes $0 --> \wedge^2 --> T^2 --> Sym^2 --> 0$ +tensorLES = method(); +tensorLES(Complex,ZZ) := (C,d) -> (phi1 := exteriorInclusion(C,d); + phi2 := inducedMap(coker phi1,target phi1); + longExactSequence(prune phi2,prune phi1, Concentration => LengthLimit => d-1) + ) + + + +posComps = (n,d) -> (compositions(d, n-d))/(i -> i + toList(d : 1)) + +surjectionBijection = L -> ( + n := length L - 1; + d := sum L - 1; + lo := 0; + H := new MutableHashTable from {}; + for i from 0 to n do ( + for j from lo to lo + L_i-1 do ( + H#(j) = i; + ); + lo = lo + L_i; + ); + new HashTable from H + ) + +summandSurjection = method() +summandSurjection(ZZ,ZZ) := (n,d) -> ( + L := sort posComps(n+1,d+1); + L/surjectionBijection + ) + + + + + + + + + diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialMapUtilities_Modified.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialMapUtilities_Modified.m2 new file mode 100644 index 00000000000..51d4e29b729 --- /dev/null +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialMapUtilities_Modified.m2 @@ -0,0 +1,253 @@ +entryCalculatorModified = (mu,j) -> ( + -- Calculates the (mu,j)'th entry of the A matrix + -- mu is a composition and j ranges from 0 to n + -- Note the we get compositions with strictly positive parts + -- by taking compositions with non-negative parts and adding one + u := 0; + for mui in (reverse mu) do ( + u=u+mui+1; + if u == j+1 then ( + if mui == 0 then + return 2 + else + return 1 + ); + ); + 0 +) + +entryCalculatorTrans = (j,mu) -> ( + -- Calculates the (mu,j)'th entry of the A matrix + -- mu is a composition and j ranges from 0 to n + -- Note the we get compositions with strictly positive parts + -- by taking compositions with non-negative parts and adding one + u := 0; + for i from 0 to #mu-1 do ( + u=u+mu_i+1; + if u == j+1 then ( + if mu_i == 0 then + return 2 + else + return 1 + ); + ); + 0 +) + + + +promoteMaptoComplex = (d,k,C) -> (matrix d)**id_(C_k) + +promoteFaceMapZerotoComplex = (d,C) -> matrix ( + -- This runs over the whole matrix again and so is probably not an efficient way of doing things + -- Having the output of FaceMapZero be a hash table would be faster + d / (i -> apply(i,j -> ( + if j<0 then ( + id_(C_(abs(j+1))) + -- abs because identities were stored as negatives + -- +1 first because we stored identity of C_k as -k-1 + ) + else if j>0 then ( + dd^C_(j-1) + -- -1 because we stored the differential of C_k as k+1 + -- I don't actually think we need to do that though? probably could just store it as k + ) + else 0 + ) + ) + ) + ) + +zeroMatrix = (numRow,numCol) -> toList (numRow:(toList(numCol:0))); +zeroMemoized = memoize zeroMatrix + -- Faster than using table + +-*ACol = ( + (n,k,j) -> apply(sort compositions(k+1,n-k), mu -> entryCalculator(mu,j)) + ) + -- Returns the jth column of the AMatrix + *- + +ACol = (n,k,j) -> ( + apply(compositions(k+1,n-k), mu -> entryCalculatorModified(mu,j)) + ) + +Amattrans = (n,k) -> ( + -- Computes the transpose of amatrix + -- since we always access it by columns later it's more convenient + table(sort compositions(k+1,n-k,0..n,entryCalculatorTrans) + ) +) + +--registerFinalizer(ACol,"Garbage Collected") + +rowOfId = (n,l) -> splice {l:0,1,(n-1-l):0} +-- n-1 so that the result has n-many columns + + +faceMapZero = (n,len) -> ( + -- Output is topDeg-many rows and sum(len,i->binomial(n,i))-many columns + -* This probably can be optimized + The output is extremely sparse, so should probably be reimplemented + as a hash table or function of some kind that specifies rules for + the i,j'th entry of the table + *- + -- If bounded => true then do this + -- TODO implement option toggle for bounded complexes + -- (otherwise why sum these binomial coefficients) + maxRows := sum(len+1,i->binomial(n-1,i)); + -- The number of rows, taking into account complex length bound + -- When len is larger than n, we'll have 2^n many rows + offset := 0; -- keeps track of what the top zero pad should be + verticalStrips := for k to len list ( + -- First loop over the vertical strips of columns + bink := binomial(n,k); -- Each strip is width binomial(n,k) + topZeros := zeroMatrix(offset,bink); + -- Create appropriately sized top pad of zeros + modifiedMat := for row to bink-1 list ( + -- This modified identity matrix uses Pascal's identity + -- First binomial(n-1,k-1) entries will be differential + if row<=binomial(n-1,k-1)-1 then splice{row:0,k+1,(bink-1-row):0} + --k+1 to keep track of which differential we'll need (k'th diff of complex) + else splice{row:0, -k-1,(bink-1-row):0} + -- -k-1 to keep track of which identity map we'll need (identity map of C_k) + ); + botZeros := zeroMatrix(maxRows-offset-binomial(n,k),binomial(n,k)); + -- Create appropriately sized bottom pad of zeros + offset = offset + binomial(n-1,k-1); + -- Update the offset + verticalStrip := flatten{topZeros,modifiedMat,botZeros} + -- Concat the modified matrix with the pads + ); + for row to maxRows-1 list ( + -- This concats the rows of the vertical strips together + flatten apply(verticalStrips, strip->strip#row) + ) + ) + + +faceMapnk = (n,k) -> ( + -- output is binomial(n-1,k)-many rows and binomial(n,k)-many columns + if k==n then + -- I don't remember if we actually need this check + -- I think we need to zero pad extra rows at when faceMapi is called below + {{0}} + else ( + Abigvector := ACol(n,k,n); + -- Selects the nth column of AMat(n,k) + Asmallvector := ACol(n-1,k,n-1); + -- Selects the (n-1)th column of AMat(n-1,k) + onePos := positions(Abigvector, i -> i==1); + -- The positions of ones in Asmallvector describe horizontal locations where we'll want a row of the identity matrix + outputMat := onePos / (l -> rowOfId(binomial(n,k),l)) + ) + ) + + -*faceMapnk = (n,k) -> ( + -- output is binomial(n-1,k)-many rows and binomial(n,k)-many columns + if k==n then + -- I don't remember if we actually need this check + -- I think we need to zero pad extra rows at when faceMapi is called below + {{0}} + else ( + Abigvector := ACol(n,k,n); + -- Selects the nth column of AMat(n,k) + Asmallvector := ACol(n-1,k,n-1); + -- Selects the (n-1)th column of AMat(n-1,k) + onePos := positions(Abigvector, i -> i==1); + -- The positions of ones in Asmallvector describe horizontal locations where we'll want a row of the identity matrix + outputMat := onePos / (l -> rowOfId(binomial(n,k),l)) + ) + )*- + +faceMapik = (n,k,i) -> ( + -- I think there are supposed to be binomial(n-1,k)-many rows + -- There are binomial(n,k)-many columns + -- I think my timing code was wack and this is actually slower than the earlier implementation + -- Need to go back and check that + -- From what I recall, they were both pretty close though so it's not a high priority + Abigvector := ACol(n,k,i); + Asmallvector := ACol(n-1,k,i-1); + zeroPos := positions(Abigvector, i -> i==0); + onePos := positions(Abigvector, i -> i==1); + outputMat := new MutableList from zeroPos / (l -> rowOfId(binomial(n,k),l)); + sumPositions := positions(Asmallvector, i->i>=1); + for l to #sumPositions-1 do ( + myIndex := sumPositions_l; + outputMat#myIndex = outputMat#myIndex + (rowOfId(binomial(n,k),onePos#l)); + ); + toList outputMat +) + +faceMapi = (n,i,C) -> ( + -- Need to check if this can be sped up by direct summing as lists + -- Instead of first passing to matrices + -- and then saving the creation of the matrix option till the very end + (lo, hi) := concentration C; + maxK := min(hi,n-1); + -- Are we running till maxK? or until maxK+1? + if i==0 then ( + maxK = min(hi,n); + promoteFaceMapZerotoComplex(faceMapZero(n,maxK),C) + ) + else if i==n then ( + preMat := fold(directSum,for k from 0 to maxK list ( + promoteMaptoComplex(faceMapnk(n,k),k,C) + -- Notice that we only pass in k at most n-1, so the check for k==n in faceMapi isn't needed + )); + preMat | map(target preMat,C_n,0) + ) + else ( + preMat = fold(directSum,for k from 0 to maxK list ( + promoteMaptoComplex(faceMapik(n,k,i),k,C) + )); + preMat | map(target preMat,C_n,0) + ) + ) + +degenMapik = (n, k, i) -> ( + -- We'll have binomial(n,k) many columns #A(n+1,k)=binomial(n+1,k)-many rows + + numCols := binomial(n,k); + zeroes := new List from (numCols) : 0; + col := ACol(n+1,k,i); + sig := new MutableList from 0..(#col-1); + l := 0; + for j to (#col-1) do( + if (col#j == 0) then ( + sig#j = rowOfId(numCols,l); + l = l+1; + continue; + ); + sig#j = zeroes; + ); + new List from sig + ) + +-*degenMapi = (n,i,C) -> ( + maxK := min(length C,n); + preMat := fold(directSum,for k from 0 to maxK list ( + promoteMaptoComplex(degenMapik(n,k,i),k,C) + ) + ); + preMat || map(C_(n+1),source preMat,0) + )*- + + +degenMapi = (n,i,C) -> ( + maxK := min(max C,n); + preMat := fold(directSum,for k from 0 to maxK list ( + promoteMaptoComplex(degenMapik(n,k,i),k,C) + ) + ); + preMat || map(C_(n+1),source preMat,0) + ) + + + + + + + + + diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialModule.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialModule.m2 new file mode 100644 index 00000000000..fa9d60d6fc5 --- /dev/null +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialModule.m2 @@ -0,0 +1,1436 @@ + needsPackage "Complexes" + + SimplicialModule = new Type of MutableHashTable -- + -- note: we make this mutable in order to construct the + -- differential as a morphism of Simplicial modules (in the style of Complexes) + -- BUT: after construction, it is should be IMMUTABLE!! + -- at some point, we might want to allow lazy determination of the modules and maps + -- but for now, we insist that all modules and maps are explicit. + -- key: + -- ring + -- modules: hash table: ZZ => Module + -- differential: SimplicialModuleMap from C --> C, degree -1 + + + SimplicialModuleMap = new Type of HashTable + -- keys: + -- degree: ZZ + -- source: Simplicial module over a ring R + -- target: simplicial module over the same ring R + -- maps themselves (HashTable of Matrices), keys lying in the concentration period of the source. + -- not all of the keys maps#i, need be present. + -- missing ones are presumed to be zero maps. + -- cache: a CacheTable + -- cache.isCommutative: whether this map commutes with the face/degeneracy maps + -- not set until needed. unset means we have not checked yet, + -- and the user hasn't declared it to be true/false yet. + +SimplicialModule.synonym = "Simplicial Module" +SimplicialModuleMap.synonym = "Map of Simplicial Modules" + +topDegree = method(); +topDegree SimplicialModule := ZZ => S -> S.topDegree +topDegree SimplicialModuleMap := ZZ => f -> max(topDegree source f, topDegree target f) + +ring SimplicialModule := Ring => S -> S.ring + +moduleMaker = (C,d) -> ( + moduleList := new MutableHashTable; + maxK := min (d, length C); + for k to maxK do ( + moduleList#(d,k) = directSum toList( + binomial(d,k):(C_k)); + ); + for i in (sort keys moduleList) list (i,moduleList#i) + ) + +mapMaker = (phi,d) -> ( + mapList := new MutableHashTable; + maxK := min (d, max(length source phi,length target phi)); + for k to maxK do ( + mapList#(d,k) = directSum toList( + binomial(d,k):(phi_k)); + ); + for i in (sort keys mapList) list (i,mapList#i) + ) + + + + +--H1 is the face maps, H2 is the degeneracy maps +simplicialModule = method(Options => {Base=>0,Degeneracy => false}) +simplicialModule(Complex,HashTable,HashTable,ZZ) := SimplicialModule => opts -> (C,H1,H2,d) -> ( + spots := sort keys H1; + if #spots === 0 then + error "expected at least one map"; + R := ring C; + moduleList := new MutableHashTable; + for b to d do ( + maxK := min (b, max C); + for k to maxK do ( + modwComps := directSum toList(binomial(b,k):(C_k)); + modwComps.cache.components = flatten toList(binomial(b,k):(components (C_k))); + moduleList#(b,k) = modwComps + ); + ); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => new HashTable from moduleList, + symbol cache => new CacheTable, + symbol complexLength => max C, + symbol complex => C + }; + S.dd = map(S,S,H1,Degree=>-1); + S.ss = map(S,S,H2,Degree=>1); + S + ) + +--H1 is the face maps +simplicialModule(Complex,HashTable,ZZ) := SimplicialModule => opts -> (C,H1,d) -> (--print("made it here!"); + spots := sort keys H1; + if #spots === 0 then + error "expected at least one map"; + (lo, hi) := concentration C; + R := ring C; + moduleList := new MutableHashTable; + for b to d do ( + maxK := min (b, hi); + for k to maxK do ( + modwComps := directSum toList(binomial(b,k):(C_k)); + modwComps.cache.components = flatten toList(binomial(b,k):(components (C_k))); + moduleList#(b,k) = modwComps + ); + ); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => new HashTable from moduleList, + symbol cache => new CacheTable, + symbol complexLength => hi, + symbol complex => C + }; + S.dd = map(S,S,H1,Degree=>-1); + S + ) + +simplicialModule(HashTable,HashTable,HashTable,ZZ) := SimplicialModule => opts -> (L,H1,H2,d) -> (--print("we got started"); + R := ring (L#((keys L)#0)); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => L, + symbol cache => new CacheTable, + }; + S.dd = map(S,S,H1,Degree=>-1); + S.ss = map(S,S,H2,Degree=>1); + S + ) + +simplicialModule(HashTable,HashTable,ZZ) := SimplicialModule => opts -> (L,H1,d) -> (--print("we got started"); + R := ring (L#((keys L)#0)); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => L, + symbol cache => new CacheTable, + }; + S.dd = map(S,S,H1,Degree=>-1); + S + ) + + +simplicialModule(Complex,ZZ) := SimplicialModule => opts -> (C,d) -> ( + --C is a chain complex, output is the Dold-Kan image of C in the category of simplicial modules + if not instance(opts.Base, ZZ) then + error "expected Base to be an integer"; + (lo, hi) := concentration C; + --if lo == hi then + if instance(C,Complex) then ( + if opts.Degeneracy == true then (degenmapHash := hashTable flatten for n from 0 to d-1 list ( + for i from 0 to n list ( + (n,i) => degenMapi(n,i,C) + ) + );); + facemapHash := hashTable flatten for n from 1 to d list ( + for i from 0 to n list ( + (n,i) => faceMapi(n,i,C) + ) + ); + --print("mde it here first"); + if opts.Degeneracy == true then break return simplicialModule(C,facemapHash,degenmapHash,d); + --print("made it here"); + return simplicialModule(C,facemapHash,d) + ); + ) + + simplicialModule(Complex) := SimplicialModule => opts -> C -> (simplicialModule(C,max C,Degeneracy => opts.Degeneracy)) + + + simplicialModule(Module,ZZ) := SimplicialModule => opts -> (M,d) -> (simplicialModule(complex M,d,Degeneracy => opts.Degeneracy)) + + simplicialModule(Ring,ZZ) := SimplicialModule => opts -> (R,d) -> (simplicialModule(R^1,d,Degeneracy => opts.Degeneracy)) + +simplicialModule(Ideal, ZZ) := SimplicialModule => opts -> (I,d) -> simplicialModule(module I, d, opts) + +simplicialModule(ComplexMap,ZZ) := SimplicialModuleMap => opts -> (phi,d) -> ( + deg := degree phi; + src := simplicialModule(source phi,d, opts); + trg := simplicialModule(target phi, d, opts); + if deg > 0 then return simplicialModule map((target phi)[deg], source phi, phi, Degree => 0); + if deg < 0 then return simplicialModule map(target phi, (source phi)[-deg], phi[-deg], Degree => 0); + result := map(trg,src,new HashTable from for i to d list i => directSum apply(mapMaker(phi,i),j->j_1),Degree => degree phi); + result.cache.complexMap = phi; + result + ) + +simplicialModule(ComplexMap) := SimplicialModuleMap => opts -> phi -> (tDeg := max((source phi).concentration_1,(target phi).concentration_1); + simplicialModule(phi,tDeg, opts) + ) + + + +isWellDefined SimplicialModule := Boolean => C -> ( + k := keys C; + -- check keys, check their types + if not instance(C.ring, Ring) then ( + if debugLevel > 0 then ( + << "-- expected 'ring C' to be a ring" << endl; + ); + return false; + ); + (lo,hi) := (0, C.topDegree); + if not instance(hi,ZZ) or lo > hi then ( + if debugLevel > 0 then ( + << "-- expected topDegree to be a nonnegative integer" << endl; + ); + return false; + ); + if not instance(C.module, HashTable) then ( + if debugLevel > 0 then ( + << "-- expected C.module to be a HashTable" << endl; + ); + return false; + ); + if not instance(C.dd, SimplicialModuleMap) then ( + if debugLevel > 0 then ( + << "-- expected dd^C to be a SimplicialModuleMap" << endl; + ); + return false; + ); + if not instance(C.cache, CacheTable) then ( + if debugLevel > 0 then ( + << "-- expected 'C.cache' to be a CacheTable" << endl; + ); + return false; + ); + -- check ring matches modules + if not all(keys C.module, i -> instance(i,Sequence) and i_0 >= lo and i_0 <= hi) + and not all(keys C.module, i -> instance(i,ZZ) and i >= lo and i <= hi) then ( + if debugLevel > 0 then ( + << "-- expected all keys of C.module to be sequences or integers with nonnegative first entry, bounded by the top degree" << [lo,hi] << endl; + ); + return false; + ); + if not all(values C.module, m -> ring m === ring C) then ( + if debugLevel > 0 then ( + << "-- expected all modules in C.module to be over 'ring C'" << endl; + ); + return false; + ); + -- check face maps + if ring C.dd =!= ring C then ( + if debugLevel > 0 then ( + << "-- expected ring of the face maps to be the ring of the simplicial module" << endl; + ); + return false; + ); + if degree C.dd =!= -1 then ( + if debugLevel > 0 then ( + << "-- expected degree of the face maps to be -1" << endl; + ); + return false; + ); + if not all(keys (dd^C).map, i -> instance(i,Sequence) and i_0 >= lo+1 and i_0 <= hi) then ( + if debugLevel > 0 then ( + << "-- expected all maps of the face maps to be indexed by integers in the concentration [lo+1,hi]" << endl; + ); + return false; + ); + for i from lo+1 to hi do ( + f := dd^C_i; + if source f =!= C_i or target f =!= C_(i-1) + then ( + if debugLevel > 0 then ( + << "-- expected source and target of the face maps to be modules in the simplicial module " << endl; + << "-- face map at index " << i << " fails this condition" << endl; + ); + return false; + ); + ); + if not(C.?ss) then ( + D := naiveNorm C; + if not isWellDefined D then ( + if debugLevel > 0 then ( + << "-- expected naive normalization to be a well-defined complex " << endl; + ); + return false; + ); + ); + if C.?ss then ( + if not isSimplicialModule C then ( + if debugLevel >0 then ( + << "--object fails to satisfy simplicial identities; run isSimplicialModule to see where it fails" << endl; + ); + return false; + ); + ); + true + ) + + +--this method checks if the simplicial identities hold for simplicial objects with degeneracy map keys +isSimplicialModule = method() +isSimplicialModule(SimplicialModule) := Boolean => S -> ( + if not S.?ss then error "Expected S to have both face and degeneracy maps"; + faceMaps := S.dd; + degenMaps := S.ss; + t := S.topDegree; + for i from 1 to t do ( + for j from 2 to i do ( + for k from 1 to j-1 do ( + if not(dd^S_(i-1,k)*dd^S_(i,j) == dd^S_(i-1,j-1)*dd^S_(i,k)) + then ( + if debugLevel > 0 then ( + << "--simplicial map identities fail for face/face compositions" << endl; + << "--face/face composition for indices " << (i,j,k) << " fail" << endl; + ); + return false; + ); + ); + ); + ); + for i from 0 to t-1 do ( + for j from 0 to i do ( + for k from 0 to j-1 do ( + if not(dd^S_(i+1,k)*ss^S_(i,j) == ss^S_(i-1,j-1)*dd^S_(i,k)) + then ( + if debugLevel > 0 then ( + << "--simplicial map identities fail for face/degeneracy compositions" << endl; + << "--face/degeneracy composition for indices " << (i,j,k) << " fail" << endl; + ); + return false; + ); + ); + ); + ); + for i from 0 to t-1 do ( + for j from 0 to i do ( + if not(dd^S_(i+1,j)*ss^S_(i,j) == 1) or not(dd^S_(i+1,j+1)*ss^S_(i,j) == 1) + then ( + if debugLevel > 0 then ( + << "--simplicial map identities fail for face/degeneracy compositions" << endl; + << "--face/degeneracy composition for indices " << (i,j,j) << " fail" << endl; + ); + return false; + ); + ); + ); + for i from 0 to t-1 do ( + for j from 0 to i do ( + for k from j+2 to i do ( + if not(dd^S_(i+1,k)*ss^S_(i,j) == ss^S_(i-1,j)*dd^S_(i,k-1)) + then ( + if debugLevel > 0 then ( + << "--simplicial map identities fail for face/degeneracy compositions" << endl; + << "--face/degeneracy composition for indices " << (i,j,k) << " fail" << endl; + ); + return false; + ); + ); + ); + ); + for i from 0 to t-1 do ( + for j from 0 to i do ( + for k from 0 to j do ( + if not(ss^S_(i+1,k)*ss^S_(i,j) == ss^S_(i+1,j+1)*ss^S_(i,k)) + then ( + if debugLevel > 0 then ( + << "--simplicial map identities fail for degeneracy/degeneracy compositions" << endl; + << "--degeneracy/degeneracy composition for indices " << (i,j,k) << " fail" << endl; + ); + return false; + ); + ); + ); + ); + true + ) + + + +isWellDefined SimplicialModuleMap := f -> ( + k := keys f; + -- source and target + if ring f.source =!= ring f.target then ( + if debugLevel > 0 then ( + << "-- expected source and target to have the same ring" << endl; + ); + return false; + ); + if not isWellDefined f.source or not isWellDefined f.target then ( + if debugLevel > 0 then ( + << "-- expected source and target to be well-defined simplicial modules" << endl; + ); + return false; + ); + if not instance(f.degree, ZZ) then ( + if debugLevel > 0 then ( + << "-- expected degree of homomorphism to be an integer" << endl; + ); + return false; + ); + (lo,hi) := (0,f.source.topDegree); + if not all(keys f.map, i -> instance(i,ZZ) or instance(i, Sequence)) then ( + if debugLevel > 0 then ( + << "-- expected all maps to be indexed by integers or sequences of two integers" << endl; + ); + return false; + ); + if all(keys f.map, i -> instance(i,ZZ)) then for i from lo to hi do ( + g := f_i; + if source g =!= f.source_i or target g =!= f.target_(i+f.degree) + then ( + if debugLevel > 0 then ( + << "-- expected source and target of maps to agree with those of simplicial module " << endl; + << "-- the map at index " << i << " fails this condition" << endl; + ); + return false; + ); + ); + --print "here we are"; + if all(keys f.map, i -> instance(i,ZZ)) and f.cache.?isCommutative then ( + deg := degree f; + C := f.source; + D := f.target; + (loC,hiC) := (0, C.topDegree); + (loD,hiD) := (0, D.topDegree); + iscommutative := true; + for i from loC to hiC do ( + if i+deg-1 >= loD and i+deg-1 <= hiD then ( + for l from 0 to i do ( + if not (dd^D_(i+deg,l) * f_i == (-1)^deg * (f_(i-1) * dd^C_(i,l))) + then ( + iscommutative = false; + if f.cache.isCommutative then ( + if debugLevel > 0 then ( + << "-- the cache table incorrectly asserts that the maps commute with the differentials " << endl; + << "-- differential at index " << i << " fails this condition" << endl; + ); + return false; + ); + ) + );)); + if iscommutative and not f.cache.isCommutative then ( + if debugLevel > 0 then ( + << "-- the cache table incorrectly asserts that the maps do not commute with the differentials " << endl; + ); + return false; + ); + ); + true + ) + + +isCommutative SimplicialModuleMap := Boolean => f -> ( + if debugLevel == 0 and f.cache.?isCommutative then + return f.cache.isCommutative; + C := source f; + D := target f; + deg := degree f; + hasDegens := C.?ss and D.?ss; + (loC,hiC) := (0, C.topDegree); + (loD,hiD) := (0, D.topDegree); + for i from loC to hiC do ( + if i+deg-1 >= loD and i+deg-1 <= hiD then ( + for l from 0 to i do ( + if not (dd^D_(i+deg,l) * f_i == (-1)^deg * (f_(i-1) * dd^C_(i,l))) + or not (if hasDegens then ss^D_(i+deg,l) * f_i == (-1)^deg * (f_(i+1) * ss^C_(i,l)) else true) + then ( + if debugLevel > 0 then ( + << "-- block " << (i,i-1) << " fails to commute" << endl; + ); + f.cache.isCommutative = false; + return false; + ) + ); + ) + ); + f.cache.isCommutative = true; + true + ) + +isSimplicialMorphism = method(TypicalValue => Boolean) +isSimplicialMorphism SimplicialModuleMap := (f) -> ( + if debugLevel > 0 and degree f =!= 0 then ( + << "-- the complex map has non-zero degree" << endl; + return false; + ); + degree f === 0 and isCommutative f + ) + + +--this function forgets the data of the underlying complex of a simplicial module, if the simplicial module S +--is obtained as a Dold-Kan image + forgetComplex = method(Options => {RememberSummands => true}); + forgetComplex(SimplicialModule) := SimplicialModule => opts -> S -> ( + if not any(keys S,i->i==symbol complex) then return S; + L := new HashTable from for i to S.topDegree list i => combineSFactors(S,i,RememberSummands => opts.RememberSummands); + faces := new HashTable from for i in keys S.dd.map list i => S.dd.map#i; + if any(keys S,i->i==symbol ss) then ( + degens := new HashTable from for i in keys S.ss.map list i => S.ss.map#i; + return simplicialModule(L,faces,degens,S.topDegree); + ); + D := simplicialModule(L,faces,S.topDegree); + D.cache.components = components S; + D + ) + +--totalizing operation +combineSFactors = method(Options => {RememberSummands => true}); +combineSFactors(SimplicialModule,ZZ) := Module => opts -> (S,d) -> ( + if d<0 or d > S.topDegree then return (ring S)^0; + modwComps := directSum for j in components S list directSum for i to min(d,j.complexLength) list (j.module)#(d,i); + if opts.RememberSummands then modwComps.cache.components = flatten flatten for j in components S list for i to min(d,S.complexLength) list components (S.module#(d,i)); + modwComps + ) + + +--forgets the data of degeneracy maps of a simplicial object + --useful for when the user wants to ignore degeneracy maps + --for the purposes of speeding up computations + forgetDegeneracy = method(); + forgetDegeneracy(SimplicialModule) := S -> ( + if not any(keys S,i->i==symbol ss) then return S; + if any(keys S,i->i==symbol complex) then return simplicialModule(S.complex,S.dd.map,S.topDegree); + simplicialModule(S.module,S.dd.map,S.topDegree) + ) + + +SimplicialModule _ Sequence := Module => (S,p) -> ( + if #p =!= 2 then + error ("Expected a pair of integer indices"); + if S.module#?(p#0,p#1) then S.module#(p#0,p#1) else (ring S)^0 + ) + + +SimplicialModule _ ZZ := Module => (S,n) -> (if S.module#?n then S.module#n else combineSFactors(S,n)) + + + +net SimplicialModule := S -> ( + (lo,hi) := (0,topDegree S); + if lo > hi then + error "In a simplical module, top degree should be nonnegative" + --"0" + else if lo == hi and S_lo === 0 then + "0" + else if any(keys S,i->i==symbol complex) then + (horizontalJoin (between(" <-- ", + for i from lo to hi list + stack (net directSum(for k from 0 to min(i,S.complexLength) list (S.module)#(i,k)), " ", net i)) | {"<-- ..."}) ) + else + horizontalJoin (between(" <-- ", + for i from lo to hi list + stack (net ((S.module)#i), " ", net i)) | {"<-- ..."}) + ) + + + Symbol ^ SimplicialModule := SimplicialModuleMap => (sym, C) -> ( + if sym === dd then return C.dd; + if sym === ss then C.ss + else error "expected symbol to be 'dd' or 'ss'" + ) + +lineOnTop := (s) -> concatenate(width s : "-") || s + +source SimplicialModuleMap := SimplicialModule => f -> f.source +target SimplicialModuleMap := SimplicialModule => f -> f.target +ring SimplicialModuleMap := SimplicialModule => f -> ring source f +degree SimplicialModuleMap := ZZ => f -> f.degree + +isHomogeneous SimplicialModuleMap := (f) -> all(values f.map, isHomogeneous) + +--simplicialModuleMap = method(Options => {Degeneracy => false}); + + + + +map(SimplicialModule, SimplicialModule, HashTable) := SimplicialModuleMap => opts -> (tar, src, maps) -> ( + if not(topDegree tar == topDegree src) then error "expected source and target to have the same top degree"; + R := ring tar; + if ring src =!= R or any(values maps, f -> ring f =!= R) then + error "expected source, target and maps to be over the same ring"; + deg := if opts.Degree === null + then 0 + else if instance(opts.Degree, ZZ) then + opts.Degree + else + error "expected integer degree"; + (lo,hi) := (0,topDegree tar); + maps' := hashTable for k in keys maps list ( + if instance(k, Sequence) then ( + f := maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + -*if rank source f != rank src_( first k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if rank target f != rank tar_(first(k)+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if first k < lo or first k > hi then continue else*- (k,f) + ) + else ( + f = maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + -*if source f != src_(k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if target f != tar_(k+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if k < lo or k > hi then continue else*- (k,f) + )); + new SimplicialModuleMap from { + symbol source => src, + symbol target => tar, + symbol degree => deg, + symbol map => maps', + symbol cache => new CacheTable + } + ) + +map(SimplicialModule, SimplicialModule, ZZ) := SimplicialModuleMap => opts -> (D, C, j) -> ( + if j === 0 then ( + result := map(D,C,hashTable{},opts); + result.cache.isCommutative = true; + return result + ); + if j === 1 then ( + if C == D and (opts.Degree === null or opts.Degree === 0) then + return id_C; + error "expected source and target to be the same"; + ); + error "expected integer to be zero or one"; + ) + +---this method is good for inducing maps on subcomplexes +map(SimplicialModule, SimplicialModule, SimplicialModuleMap) := SimplicialModuleMap => opts -> (tar, src, f) -> ( + deg := if opts.Degree === null then degree f else opts.Degree; + H := hashTable for k in keys f.map list k => map(tar_(deg+k), src_k, f.map#k); + map(tar,src,H, Degree=>deg) + ) + + + + +SimplicialModuleMap _ ZZ := Matrix => (f,i) -> ( + if f.map#?i then f.map#i else map((target f)_(i + degree f), (source f)_i, 0)) + +SimplicialModuleMap _ Sequence := Matrix => (f,s) -> ( + if f.map#?s then f.map#s else map((target f)_(s#0 + degree f), (source f)_(s#0), 0)) + + + + +expression SimplicialModuleMap := Expression => f -> ( + d := degree f; + s := sort keys f.map; + if #s === 0 then + new ZeroExpression from {0} + else if instance(s_0,Sequence) then new VerticalList from for i in s list + RowExpression {(i#0+d,i#1), ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + else if instance(s_0,ZZ) then return new VerticalList from for i in s list + RowExpression {i+d, ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + ) + + + + net SimplicialModuleMap := Net => f -> ( + v := between("", + for i in sort keys f.map list ( + if instance(i,Sequence) then (horizontalJoin( + net ((i#0+f.degree,i#1)), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + )) + else (horizontalJoin( + net (i+f.degree), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + )) + )); + if # v === 0 then net "0" + else stack v + ) + + + + +SimplicialModule == ZZ := (C,n) -> ( + if n =!= 0 then error "cannot compare Simplicial module to non-zero integer"; + (lo,hi) := (0,C.topDegree); + for i from lo to hi do if C_i != 0 then return false; + true + ) +ZZ == SimplicialModule := (n,C) -> C == n + +--as written, the code assumes one only takes direct sums of simplicial modules with same top degree +SimplicialModule.directSum = args -> ( + local D; + assert(#args > 0); + R := ring args#0; + if not all(args, C -> ring C === R) then error "expected all simplicial modules to be over the same ring"; + concentrations := for C in args list (0,C.topDegree); + --checking if they all are Dold-Kan images + allComplexes := all(args,i->any(keys i,j->j==symbol complex)); + allDegens := all(args,i->any(keys i, j->j== symbol ss)); + if not allComplexes then args = apply(args,i->forgetComplex(i)); + lo := concentrations/first//min; + hi := concentrations/last//max; + if not(all(args,i->i.topDegree==hi)) then error "all objects should have the same top degree"; + S := first args; + LM := new HashTable from for i in keys S.module list i => directSum for j in args list if j.module#?i then j_i else continue; + faceHashM := new HashTable from for i in keys S.dd.map list i => directSum for j in args list if j.dd.map#?i then j.dd_i; + if allDegens then ( + degenMapHashM := new HashTable from for i in keys S.ss.map list i => directSum for j in args list if j.ss.map#?i then j.ss_i; + D = if allComplexes then simplicialModule(directSum for i in args list i.complex,faceHashM,degenMapHashM,hi) + else simplicialModule(LM,faceHashM,degenMapHashM,hi); + D.cache.components = toList args; + return D; + ); + D = if allComplexes then simplicialModule(directSum for i in args list i.complex,faceHashM,S.topDegree) + else simplicialModule(LM,faceHashM,S.topDegree); + D.cache.components = toList args; + D + ) +SimplicialModule ++ SimplicialModule := SimplicialModule => (C,D) -> directSum(C,D) +directSum SimplicialModule := C -> directSum(1 : C) + +components SimplicialModule := C -> if C.cache.?components then C.cache.components else {C} + +SimplicialModule#id = (C) -> ( + (lo,hi) := (0,C.topDegree); + maps := hashTable for i from lo to hi list i => id_(C_i); + result := map(C,C,maps); + result.cache.isCommutative = true; + result + ) + + +SimplicialModuleMap ^ ZZ := SimplicialModuleMap => (f,n) -> ( + tDeg := (source f).topDegree; + df := degree f; + if n === -1 then ( + maps := hashTable for i from 0 to tDeg list (i+df) => ( + f_i^(-1) + ); + result := map(source f, target f, maps, Degree=>-df); + if f.cache.?isCommutative then result.cache.isCommutative = f.cache.isCommutative; + result + ) + else if n < 0 then (f^-1)^(-n) + else if n === 0 then id_(source f) + else if n === 1 then f + else ( + if source f != target f then error "expected source and target to be the same"; + maps = hashTable for i from 0 to tDeg list i => ( + s := f_i; + j := 1; + while j < n do ( + s = f_(i+j*df) * s; + j = j+1; + ); + if s == 0 then continue else s + ); + result = map(source f, source f, maps, Degree=> n * df); + if f.cache.?isCommutative then result.cache.isCommutative = f.cache.isCommutative; + result + ) + ) + + +SimplicialModule ** SimplicialModule := SimplicialModule => (C,D) -> simplicialTensor(C,D) + +--it seemed more efficient to directly define the tensor product with a module +--as opposed to converting the module into a simplicial object then using simplicialTensor +Module ** SimplicialModule := SimplicialModule => (M,S) -> ( + if any(keys S,i->i==symbol complex) then return simplicialModule(M**(S.complex), S.topDegree, Degeneracy => S.?ss); + LM := new HashTable from for i in keys S.module list i => M**(S.module)#i; + faceHashM := new HashTable from for i in keys S.dd.map list i => map(M ** S_(i_0-1), M ** S_(i_0), M**(S.dd.map)#i); + if any(keys S,i->i==symbol ss) then ( + degenMapHashM := new HashTable from for i in keys S.ss.map list i => map(M ** S_(i_0+1), S_(i_0), M**(S.ss.map)#i); + if any(keys S,i->i==symbol complex) then return simplicialModule(M**(S.complex),faceHashM,degenMapHashM,S.topDegree) + else return simplicialModule(LM,faceHashM,degenMapHashM,S.topDegree); + ); + simplicialModule(LM,faceHashM,S.topDegree) + ) + +SimplicialModule ** Module := SimplicialModule => (S,M) -> ( + if any(keys S,i->i==symbol complex) then return simplicialModule((S.complex)**M, S.topDegree, Degeneracy => S.?ss); + LM := new HashTable from for i in keys S.module list i => (S.module)#i**M; + faceHashM := new HashTable from for i in keys S.dd.map list i => map(S_(i_0-1) ** M, S_(i_0) ** M, (S.dd.map)#i**M); + if any(keys S,i->i==symbol ss) then ( + degenMapHashM := new HashTable from for i in keys S.ss.map list i => map(S_(i_0+1), S_(i_0), (S.ss.map)#i**M); + if any(keys S,i->i==symbol complex) then return simplicialModule((S.complex)**M,faceHashM,degenMapHashM,S.topDegree) + else return simplicialModule(LM,faceHashM,degenMapHashM,S.topDegree); + ); + simplicialModule(LM,faceHashM,S.topDegree) + ) + +SimplicialModule ** Matrix := SimplicialModuleMap => (S, f) -> ( + if S.?complex then return simplicialModule((S.complex)**f, topDegree S, Degeneracy => S.?ss); + if ring S =!= ring f then error "expected Simplicial module and Matrix over the same ring"; + src := S ** source f; + tar := S ** target f; + map(tar, src, new HashTable from for i to S.topDegree list i => map(tar_i, src_i, S_i ** f, Degeneracy => S.?ss)) + ) + +Matrix ** SimplicialModule := SimplicialModuleMap => (f, S) -> ( + if S.?complex then return simplicialModule(f**(S.complex), topDegree S, Degeneracy => S.?ss); + if ring S =!= ring f then error "expected Simplicial module and Matrix over the same ring"; + src := (source f) ** S; + tar := (target f) ** S; + map(tar, src, new HashTable from for i to S.topDegree list i => map(tar_i, src_i, f ** S_i, Degeneracy => S.?ss)) + ) + +SimplicialModule ** Ring := SimplicialModule => (S,R) -> ( + LM := new HashTable from for i in keys S.module list i => R**(S.module)#i; + faceHashM := new HashTable from for i in keys S.dd.map list i => R**(S.dd.map)#i; + if any(keys S,i->i==symbol complex) and not(S.?ss) then return simplicialModule(R**(S.complex),faceHashM,S.topDegree); + if any(keys S,i->i==symbol ss) then ( + degenMapHashM := new HashTable from for i in keys S.ss.map list i => R**(S.ss.map)#i; + if any(keys S,i->i==symbol complex) then return simplicialModule(R**(S.complex),faceHashM,degenMapHashM,S.topDegree) + else return simplicialModule(LM,faceHashM,degenMapHashM,S.topDegree); + ); + simplicialModule(LM,faceHashM,S.topDegree) + ) + +Ring ** SimplicialModule := SimplicialModule => (R,S) -> S ** R + +RingMap SimplicialModule := SimplicialModule => (phi,S) -> ( + if any(keys S,i->i==symbol complex) then return simplicialModule(phi(S.complex), S.topDegree, Degeneracy => S.?ss); + LM := new HashTable from for i in keys S.module list i => phi((S.module)#i); + faceHashM := new HashTable from for i in keys S.dd.map list i => phi((S.dd.map)#i); + if any(keys S,i->i==symbol ss) then ( + degenMapHashM := new HashTable from for i in keys S.ss.map list i => phi((S.ss.map)#i); + if any(keys S,i->i==symbol complex) then return simplicialModule(phi(S.complex),faceHashM,degenMapHashM,S.topDegree) + else return simplicialModule(LM,faceHashM, degenMapHashM, S.topDegree); + ); + simplicialModule(LM,faceHashM,S.topDegree) + ) + +tensor(RingMap, SimplicialModule) := SimplicialModule => {} >> opts -> (phi, S) -> ( + if source phi =!= ring S then error "expected the source of the ring map to be the ring of the simplicial module"; + LM := new HashTable from for i in keys S.module list i => tensor(phi,(S.module)#i); + faceHashM := new HashTable from for i in keys S.dd.map list i => tensor(phi,(S.dd.map)#i); + if any(keys S,i->i==symbol complex) and not(S.?ss) then return simplicialModule(tensor(phi,(S.complex)),faceHashM,S.topDegree); + if S.?ss then ( + degenMapHashM := new HashTable from for i in keys S.ss.map list i => tensor(phi,(S.ss.map)#i); + if any(keys S,i->i==symbol complex) then return simplicialModule(tensor(phi,(S.complex)),faceHashM,degenMapHashM,S.topDegree) + else return simplicialModule(LM,faceHashM,degenMapHashM,S.topDegree); + ); + simplicialModule(LM,faceHashM,S.topDegree) + ) +tensor(SimplicialModule, RingMap) := SimplicialModule => {} >> opts -> (S, phi) -> tensor(phi, S) + +RingMap ** SimplicialModule := SimplicialModule => (phi, S) -> tensor(phi, S) +SimplicialModule ** RingMap := SimplicialModule => (S, phi) -> tensor(phi, S) + + +SimplicialModuleMap | SimplicialModuleMap := SimplicialModuleMap => (f,g) -> ( + if target f != target g then error "expected targets to be the same"; + if (source f).topDegree =!= (source g).topDegree then error "expected sources to have same top degree"; + deg := degree f; + if deg =!= degree g then error "expected maps with the same degree"; + map(target f, source f ++ source g, new HashTable from for i to (source f).topDegree list i => (f_i|g_i), Degree=>deg) + ) + +SimplicialModuleMap || SimplicialModuleMap := SimplicialModuleMap => (f,g) -> ( + if source f != source g then error "expected sources to be the same"; + if (target f).topDegree =!= (target g).topDegree then error "expected targets to have same top degree"; + deg := degree f; + if deg =!= degree g then error "expected maps with the same degree"; + map(target f ++ target g, source f, new HashTable from for i to (source f).topDegree list i => (f_i||g_i), Degree=>deg) + ) + +SimplicialModule == SimplicialModule := (C,D) -> ( + --note: we don't check for equality of keys since some operations + --on simplicial modules may add a key + if C === D then return true; + if topDegree C =!= topDegree D then return false; + if ring C =!= ring D then return false; + for i from 0 to C.topDegree do ( + if C_i != D_i then return false; + ); + for i in keys C.dd.map do ( + if C.dd.map#i != D.dd.map#i then return false; + ); + if any(keys C,i->i==symbol ss) then for i in keys C.ss.map do ( + if C.ss.map#i != D.ss.map#i then return false; + ); + true + ) + +SimplicialModule == ZZ := (C,n) -> ( + if n =!= 0 then error "cannot compare simplicial module to non-zero integer"; + for i from 0 to C.topDegree do if C_i != 0 then return false; + true + ) +ZZ == SimplicialModule := (n,C) -> C == n + +transs := (C,v) -> ( + if C.cache.?indexComponents then ( + Ci := C.cache.indexComponents; + apply(v, i -> if Ci#?i then Ci#i else error "expected an index of a component of the direct sum")) + else ( + if not C.cache.?components then error "expected a direct sum of simplicialmodules"; + Cc := C.cache.components; + apply(v, i -> if not Cc#?i then error "expected an index of a component of the direct sum"); + v) + ) + + +SimplicialModule _ Array := SimplicialModuleMap => (C,v) -> ( + v = transs(C,v); + D := directSum apply(toList v, j -> C.cache.components#j); + Cc := if any(keys C,i->i==symbol complex) then forgetComplex(C,RememberSummands => false) else C; + maps := hashTable for i from 0 to Cc.topDegree list i => map(C_i,D_i,Cc_i_v); + result := map(C,D,maps); + result.cache.isCommutative = true; + result + ) + +SimplicialModule ^ Array := SimplicialModuleMap => (C,v) -> ( + v = transs(C,v); + D := directSum apply(toList v, j -> C.cache.components#j); + Cc := if any(keys C,i->i==symbol complex) then forgetComplex(C,RememberSummands => false) else C; + maps := hashTable for i from 0 to Cc.topDegree list i => map(D_i,C_i,Cc_i^v); + result := map(D,C,maps); + result.cache.isCommutative = true; + result + ) + + +SimplicialModuleMap == SimplicialModuleMap := (f,g) -> ( + if f === g then return true; + if source f != source g or target f != target g + then return false; + for i from 0 to (source f).topDegree do ( + if f_i != g_i then return false; + ); + true + ) +SimplicialModuleMap == ZZ := Boolean => (f,n) -> ( + if n === 0 then + all(keys f.map, k -> f.map#k == 0) + else if n === 1 then ( + if source f != target f then return false; + if degree f =!= 0 then return false; + (lo,hi) := (0,(source f).topDegree); + for i from lo to hi do + if f_i != 1 then return false; + f.cache.isCommutative = true; -- this is the identity, after all! + true + ) + else + error "cannot compare ComplexMap to integer other than 0 or 1" + ) +ZZ == SimplicialModuleMap := Boolean => (n,f) -> f == n + +RingElement * SimplicialModuleMap := (r,f) -> ( + df := degree f; + maps := hashTable for i to (source f).topDegree list i => ( + h := r * f_i; + if h == 0 then continue else h + ); + result := map(target f, source f, maps, Degree=>df); + result + ) + +SimplicialModuleMap * RingElement := (f,r) -> (r*f) + +Number * SimplicialModuleMap := (r,f) -> ( + try r = promote(r,ring f) else error "can't promote scalar to ring of complex homomorphism"; + r * f + ) + +SimplicialModuleMap * Number := (f,r) -> ( + try r = promote(r,ring f) else error "can't promote scalar to ring of complex homomorphism"; + f * r + ) + +- SimplicialModuleMap := (f) -> ( + result := (-1)*f; + if isCommutativeCached f then + result.cache.isCommutative = true; + result + ) + +SimplicialModuleMap + SimplicialModuleMap := (f,g) -> ( + df := degree f; + dg := degree g; + if source f != source g then error "expected simplicial module homomorphisms with the same source"; + if target f != target g then error "expected simplicial homomorphisms with the same target"; + if df =!= dg then error "expected complex homomorphisms with the same degree"; + maps := hashTable for i from 0 to (source f).topDegree list i => ( + h := f_i + g_i; + if h == 0 then continue else h + ); + result := map(target f, source f, maps, Degree=>df); + result + ) +SimplicialModuleMap + Number := +SimplicialModuleMap + RingElement := SimplicialModuleMap => (f,r) -> ( + if r == 0 then f + else ( + if source f != target f + then error "expected same source and target" + else f + r*id_(target f)) + ) +Number + SimplicialModuleMap := +RingElement + SimplicialModuleMap := SimplicialModuleMap => (r,f) -> f + r + +SimplicialModuleMap - Number := +SimplicialModuleMap - RingElement := +SimplicialModuleMap - SimplicialModuleMap := SimplicialModuleMap => (f,g) -> f + (-1)*g + +Number - SimplicialModuleMap := +RingElement - SimplicialModuleMap := SimplicialModuleMap => (r,f) -> -f + r + +SimplicialModuleMap * SimplicialModuleMap := (f,g) -> ( + --this is the case where just composing normal maps + if all(keys f.map, i-> instance(i, ZZ)) then ( + df := degree f; + dg := degree g; + maps := hashTable for i from 0 to (source g).topDegree list i => ( + h := f_(dg + i) * g_i; + if h == 0 then continue else h + ); + result := map(target f, source g, maps, Degree=>df+dg); + return result; + ); + --this is the case where face/degeneracy maps are being composed + --note: this case is not really used, since composition of face maps + --should be treated as a sort of totalized operation + if all(keys f.map, i-> instance(i, Sequence)) then ( + df = degree f; + dg = degree g; + maps = hashTable for i in keys g.map list i => ( + h := f_((dg + i_0, i_1)) * g_i; + if h == 0 then continue else h + ); + result = map(target f, source g, maps, Degree=>df+dg); + return result; + ); + ) + +--need to complete this +SimplicialModuleMap.directSum = args -> ( + -- args: sequence of SimplicialModuleMap's + -- args: f_i : C_i --> D_i, having same degree deg + -- result : sum(C_i) --> sum(D_i) + R := ring args#0; + deg := degree args#0; + if not all(args, f -> ring f === R) then + error "expected maps all over the same ring"; + if not all(args, f -> degree f === deg) then + error "expected maps to all have the same degree"; + -- WARNING: we call simplicialModule.directSum directly rather than using + -- just directSum to avoid getting a cached copy of the direct + -- sum. Otherwise the labels of the cached copies might get + -- changed (in Options.directSum). + src := SimplicialModule.directSum (args/source); + tar := SimplicialModule.directSum (args/target); + -- only keep matrices in the homomorphism that are non-zero + spots := unique flatten(args/(f -> keys f.map)); + maps := hashTable for i in spots list i => directSum(args/(f -> f_i)); + result := map(tar,src,maps,Degree=>deg); + result.cache.components = toList args; + result + ) + +SimplicialModuleMap ++ SimplicialModuleMap := SimplicialModuleMap => (f,g) -> directSum(f,g) +directSum SimplicialModuleMap := f -> directSum(1 : f) +components SimplicialModuleMap := f -> if f.cache.?components then f.cache.components else {f} +SimplicialModuleMap ^ Array := SimplicialModuleMap => (f,v) -> (target f)^v * f +SimplicialModuleMap _ Array := SimplicialModuleMap => (f,v) -> f * (source f)_v + + + + +-- the following method is not exported: +isCommutativeCached = method() +isCommutativeCached SimplicialModuleMap := Boolean => f -> f.cache.?isCommutative and f.cache.isCommutative + + +-------------------------------------------------------------------- +-- tensor products of simplicial maps ------------------------------ +-------------------------------------------------------------------- +tensor(SimplicialModuleMap, SimplicialModuleMap) := SimplicialModuleMap => {} >> opts -> (f,g) -> ( + -- f : C1 --> C2, g : D1 --> D2 + -- f**g : C1**D1 --> C2**D2 + -- (f**g)_i : sum_j(C1_j ** D1_(i-j) --> C2_(j+df) ** D2_(i-j+dg)) + df := degree f; + dg := degree g; + src := (source f) ** (source g); + tar := (target f) ** (target g); + -- for the i-th matrix src_i --> tar_(i+df+dg) + -- we make a table of matrices, and create a block matrix from that using "matrix" and "map" + (lo,hi) := (0,src.topDegree); + maps := hashTable for i from lo to hi list i => f_i**g_i; + result := map(tar, src, maps, Degree=>df+dg); + result + ) +SimplicialModuleMap ** SimplicialModuleMap := SimplicialModuleMap => (f,g) -> tensor(f,g) +SimplicialModule ** SimplicialModuleMap := SimplicialModuleMap => (C,g) -> id_C ** g +SimplicialModuleMap ** SimplicialModule := SimplicialModuleMap => (f,D) -> f ** id_D +Module ** SimplicialModuleMap := SimplicialModuleMap => (M,g) -> ( + map(M**(target g),M**(source g),new HashTable from for i in keys (g.map) list i => M**(g.map#i), Degree => degree g) + ) +SimplicialModuleMap ** Module := SimplicialModuleMap => (g,N) -> ( + map((target g) ** N,(source g) ** N,new HashTable from for i in keys (g.map) list i => (g.map#i)**N, Degree => degree g) + ) + + +SimplicialModuleMap ** Ring := SimplicialModuleMap => (g,R) -> ( + map((target g)**R,(source g)**R,new HashTable from for i in keys (g.map) list i => (g.map#i)**R, Degree => degree g) + ) +Ring ** SimplicialModuleMap := SimplicialModuleMap => (R,f) -> f ** R + +RingMap SimplicialModuleMap := SimplicialModuleMap => (phi,f) -> ( + if f.?complexMap then return simplicialModule(phi(f.complexMap), topDegree f, Degeneracy => (source f).?ss); + map(phi target f, phi source f, new HashTable from for i in keys (f.map) list i=> phi((f.map)#i), Degree => degree f) + ) + +tensor(RingMap, SimplicialModuleMap) := SimplicialModuleMap => {} >> opts -> (phi, f) -> ( + if source phi =!= ring f then error "expected the source of the ring map to be the ring of the complex map"; + map(tensor(phi, target f), tensor(phi, source f), new HashTable from for i in keys (f.map) list i=> tensor(phi,(f.map)#i), Degree => degree f) + ) +tensor(SimplicialModuleMap, RingMap) := SimplicialModuleMap => {} >> opts -> (f, phi) -> tensor(phi, f) + +RingMap ** SimplicialModuleMap := SimplicialModuleMap => (phi, f) -> tensor(phi, f) +SimplicialModuleMap ** RingMap := SimplicialModuleMap => (f, phi) -> tensor(phi, f) + +---------------------------------------------------------------------------------------- +------------- some functionality for complexes acting on simplicial modules ------------ + +Complex ** SimplicialModule := SimplicialModule => (C,S) -> (simplicialModule(C,S.topDegree)**S) + +SimplicialModule ** Complex := SimplicialModule => (S,C) -> (S**simplicialModule(C,S.topDegree)) + +ComplexMap ** SimplicialModuleMap := SimplicialModuleMap => (f,g) -> (tDeg := max((source g).topDegree,(target g).topDegree); + simplicialModule(f,tDeg)**g + ) + +SimplicialModuleMap ** ComplexMap := SimplicialModuleMap => (g,f) -> (tDeg := max((source g).topDegree,(target g).topDegree); + g**simplicialModule(f,tDeg) + ) + +Complex ** SimplicialModuleMap := SimplicialModuleMap => (C,f) -> (id_C**f) +SimplicialModuleMap ** Complex := SimplicialModuleMap => (f,C) -> (f**id_C) + + + +kernel SimplicialModuleMap := SimplicialModule => opts -> f -> ( + -- f : B --> C + local result; + B := source f; + modules := hashTable for i from 0 to B.topDegree list i => kernel f_i; + inducedMaps := hashTable for i from 0 to B.topDegree list i => inducedMap(B_i, modules#i); + facemaps := hashTable for i in keys (B.dd.map) list i => ( + b1 :=B.dd_i * inducedMaps#(i_0); + b2 := map(target b1,source inducedMaps#(i_0-1),inducedMaps#(i_0-1)); + (b1) // b2 + ); + if any(keys B,i->i==symbol ss) then ( + degenmaps := hashTable for i in keys (B.ss.map) list i => ( + b1 := B.ss_i * inducedMaps#(i_0); + b2 := map(target b1,source inducedMaps#(i_0+1),inducedMaps#(i_0+1)); + (b1) // b2 + ); + result = simplicialModule(modules,facemaps,degenmaps,B.topDegree); + result.cache.kernel = f; + return result; + ); + result = simplicialModule(modules,facemaps,B.topDegree); + result.cache.kernel = f; + result + ) +cokernel SimplicialModuleMap := SimplicialModule => f -> ( + -- f : B --> C + local result; + C := target f; + deg := degree f; + modules := hashTable for i from 0 to C.topDegree list i => cokernel f_(i-deg); + facemaps := hashTable for i in keys (C.dd.map) list i => ( + map(modules#(i_0-1), modules#(i_0), matrix C.dd_i) + ); + if any(keys C,i->i==symbol ss) then ( + degenmaps := hashTable for i in keys (C.ss.map) list i => ( + map(modules#(i_0+1), modules#(i_0), matrix C.ss_i) + ); + result = simplicialModule(modules,facemaps,degenmaps,C.topDegree); + result.cache.cokernel = f; + return result; + ); + result = simplicialModule(modules,facemaps,C.topDegree); + result.cache.cokernel = f; + result + ) + +image SimplicialModuleMap := SimplicialModule => f -> ( + -- f : B --> C + local result; + B := source f; + C := target f; + deg := degree f; + modules := hashTable for i from 0 to C.topDegree list i => image f_(i-deg); + inducedMaps := hashTable for i from 0 to B.topDegree list i => inducedMap(C_i, modules#i); + facemaps := hashTable for i in keys (C.dd.map) list i => ( + b1 :=C.dd_i * inducedMaps#(i_0); + b2 := map(target b1,source inducedMaps#(i_0-1),inducedMaps#(i_0-1)); + (b1) // b2 + ); + if any(keys C,i->i==symbol ss) then ( + degenmaps := hashTable for i in keys (C.ss.map) list i => ( + b1 := C.ss_i * inducedMaps#(i_0); + b2 := map(target b1,source inducedMaps#(i_0+1),inducedMaps#(i_0+1)); + (b1) // b2 + ); + result = simplicialModule(modules,facemaps,degenmaps,C.topDegree); + result.cache.image = f; + return result; + ); + result = simplicialModule(modules,facemaps,C.topDegree); + result.cache.image = f; + result + ) + +coimage SimplicialModuleMap := SimplicialModule => f -> ( + -- f : B --> C + local result; + B := source f; + modules := hashTable for i from 0 to B.topDegree list i => coimage f_(i); + facemaps := hashTable for i in keys (B.dd.map) list i => ( + map(modules#(i_0-1), modules#(i_0), matrix B.dd_i) + ); + if any(keys B,i->i==symbol ss) then ( + degenmaps := hashTable for i in keys (B.ss.map) list i => ( + map(modules#(i_0+1), modules#(i_0), matrix B.ss_i) + ); + result = simplicialModule(modules,facemaps,degenmaps,B.topDegree); + result.cache.coimage = f; + return result; + ); + result = simplicialModule(modules,facemaps,B.topDegree); + result.cache.coimage = f; + result + ) + +--this function takes the tensor product of a direct sum, but caches the components +--of the resulting tensor product based on the component indices of the original modules. +--useful for accessing induced maps on components of tensor products of direct sums +tensorwithComponents = method(); +tensorwithComponents(Module,Module) := (M,N) -> ( + T := if M.cache.?indexComponents then flatten table(keys (M.cache.indexComponents),toList(0..length components N-1),(u,v) -> {u,v}) + else flatten table(toList(0..length components M-1),toList(0..length components N-1),(u,v) -> {u,v}); + result := M**N; + if M.cache.?indexComponents then result.cache.components = apply(T,i->(M.cache.components#(M.cache.indexComponents#(i_0)))**(N.cache.components#(i_1))) + else result.cache.components = apply(T,i->((components M)#(i_0))**((components N)#(i_1))); + result.cache.indexComponents = hashTable for i to length(T)-1 list flatten (T_i) => i; + result.cache.indices = for i to length(T)-1 list flatten (T_i); + result + ) + +tensorwithComponents(Matrix,Matrix) := (A,B) -> ( + srcA := source A; + srcB := source B; + trgA := target A; + trgB := target B; + map(tensorwithComponents(trgA,trgB),tensorwithComponents(srcA,srcB),A**B) + ) + +tensorwithComponents List := L -> ( + if length L == 2 then return tensorwithComponents(L_0,L_1); + Ln := for i from 2 to length L-1 list L_i; + tensorwithComponents({tensorwithComponents(L_0,L_1)}|Ln) + ) + + +homology(SimplicialModule) := SimplicialModule => opts -> C -> ( + t := topDegree C; + simplicialModule( HH normalize C, t, Degeneracy => C.?ss) + ) + +homology(SimplicialModuleMap) := SimplicialModuleMap => opts -> f -> ( + t := topDegree f; + degens := (source f).?ss and (target f).?ss; + simplicialModule( HH normalize f, t, Degeneracy => degens) + ) + + +SimplicialModule Array := (C, L) -> (t := topDegree C; + simplicialModule( (normalize C) L, t, Degeneracy => C.?ss ) + ) + +SimplicialModuleMap Array := (f, L) -> (t := topDegree f; + simplicialModule( (normalize f) L, t, Degeneracy => (source f).?ss) + ) + +minimalPresentation SimplicialModule := +prune SimplicialModule := SimplicialModule => opts -> (cacheValue symbol minimalPresentation)(C -> ( + R := ring C; + -- opts is ignored here + -- to be cached: in the input C: cache the result D + -- in the result: cache pruningMap: D --> C + faceKeys := keys C.dd.map; + if any(keys C,i->i==symbol ss) then degenKeys := keys C.ss.map; + prunedMods := new MutableHashTable from for i to C.topDegree list i => prune C_i; + prunedFaceMaps := new MutableHashTable from for i in faceKeys list i => map(prune C_(i_0-1),prune C_(i_0),0); + if any(keys C,i->i==symbol ss) then prunedDegenMaps := new MutableHashTable from for i in degenKeys list i=>map(prune C_(i_0+1),prune C_(i_0),0); + nonzeros := select(0..C.topDegree, i -> minimalPresentation C_i != 0); + D := if #nonzeros === 0 + then ( + simplicialModule((ring C)^0,C.topDegree) + ) + else ( + lo := min nonzeros; + hi := max nonzeros; + for i from lo to hi do prunedMods#i = minimalPresentation(C_i); + for i in select(faceKeys,i->(i_0>=lo and i_0<=hi)) do prunedFaceMaps#i = minimalPresentation C.dd_i; + if any(keys C,i->i==symbol ss) then ( + for i in select(degenKeys,i->(i_0>=lo and i_0 prunedMods#i; + nmFaces := new HashTable from for i in keys prunedFaceMaps list i=> prunedFaceMaps#i; + if any(keys C,i->i==symbol ss) then ( + nmDegens := new HashTable from for i in keys prunedDegenMaps list i=> prunedDegenMaps#i; + ); + if any(keys C,i->i==symbol ss) then simplicialModule(nmMods,nmFaces,nmDegens,C.topDegree) else simplicialModule(nmMods,nmFaces,C.topDegree) + ); + -- create the isomorphism D --> C + pruning := hashTable for i from 0 to C.topDegree list i => (minimalPresentation C_i).cache.pruningMap; + D.cache.pruningMap = map(C,D,pruning); + D.cache.pruningMap.cache.isCommutative = true; + D + )) + + +minimalPresentation SimplicialModuleMap := +prune SimplicialModuleMap := SimplicialModuleMap => opts -> f -> ( + if all(keys f.map, i -> instance(i, Sequence)) then return (if degree f == -1 then (prune source f).dd else (prune source f).ss); + C := source f; + if not C.cache.?pruningMap then f = f * (minimalPresentation C).cache.pruningMap; + D := target f; + if not D.cache.?pruningMap then f = (minimalPresentation D).cache.pruningMap^-1 * f; + f + ) + +inducedMap(SimplicialModule, SimplicialModule) := SimplicialModuleMap => opts -> (D,C) -> ( + -- compute f : C --> D the map induced by the identity matrix. + deg := if opts.Degree === null then 0 else opts.Degree; + (loC,hiC) := (0,C.topDegree); + (loD,hiD) := (0,D.topDegree); + maps := hashTable for i from max(loC,loD-deg) to min(hiC,hiD-deg) list i => inducedMap(D_(i+deg),C_i, Verify => opts.Verify); + map(D,C,maps,Degree=>deg) + ) + + +randomSimplicialMap = method(Options=>{ + Degree => 0, + InternalDegree => null, + Cycle => false, + Boundary => false + }) +randomSimplicialMap(SimplicialModule, SimplicialModule) := SimplicialModuleMap => opts -> (C,D) -> ( + simplicialModule(randomComplexMap(normalize C, normalize D, opts), min(C.topDegree, D.topDegree), Degeneracy => C.?ss) + ) + +basis(List, Complex) := Complex => opts -> (deg, C) -> ( + (a,b) := concentration C; + L := for i from a+1 to b list basis(deg, C.dd_i, opts); + complex(L, Base => a)) + +basis(ZZ, Complex) := Complex => opts -> (deg, C) -> ( + (a,b) := concentration C; + L := for i from a+1 to b list basis(deg, C.dd_i, opts); + complex(L, Base => a)) + +basis(List, SimplicialModule) := SimplicialModule => opts -> (L, S) -> ( + if S.?complex then return simplicialModule(basis(L,S.complex), S.topDegree, Degeneracy => S.?ss); + mods := hashTable for i in keys S.module list i => image basis(L, S_i, opts); + H1 := hashTable for i in keys S.dd.map list i => basis(L, S.dd_i, opts); + if S.?ss then H2 := hashTable for i in keys S.ss.map list i => basis(L, S.ss_i, opts); + if S.?ss then return simplicialModule(mods, H1, H2, S.topDegree); + simplicialModule(mods, H1, S.topDegree) + ) + +basis(ZZ, SimplicialModule) := SimplicialModule => opts -> (L, S) -> ( + if S.?complex then return simplicialModule(basis(L,S.complex), S.topDegree, Degeneracy => S.?ss); + mods := hashTable for i in keys S.module list i => image basis(L, S_i, opts); + H1 := hashTable for i in keys S.dd.map list i => basis(L, S.dd_i, opts); + if S.?ss then H2 := hashTable for i in keys S.ss.map list i => basis(L, S.ss_i, opts); + if S.?ss then return simplicialModule(mods, H1, H2, S.topDegree); + simplicialModule(mods, H1, S.topDegree) + ) + +basis(List, SimplicialModuleMap) := SimplicialModuleMap => opts -> (L, phi) -> ( + map(basis(L, target phi, opts), basis(L, source phi, opts), hashTable for i in keys phi.map list i => ( + if (f := basis(L, phi_i, opts)) == 0 then continue else f) ) + ) + +basis(ZZ, SimplicialModuleMap) := SimplicialModuleMap => opts -> (L, phi) -> ( + map(basis(L, target phi, opts), basis(L, source phi, opts), hashTable for i in keys phi.map list i => ( + if (f := basis(L, phi_i, opts)) == 0 then continue else f) ) + ) + + +truncate(List, SimplicialModule) := SimplicialModule => {} >> opts -> (L, S) -> ( + if S.?complex then return simplicialModule(truncate(L,S.complex), S.topDegree, Degeneracy => S.?ss); + mods := hashTable for i in keys S.module list i => truncate(L, S_i, opts); + H1 := hashTable for i in keys S.dd.map list i => truncate(L, S.dd_i, opts); + if S.?ss then H2 := hashTable for i in keys S.ss.map list i => truncate(L, S.ss_i, opts); + if S.?ss then return simplicialModule(mods, H1, H2, S.topDegree); + simplicialModule(mods, H1, S.topDegree) + ) +truncate(ZZ, SimplicialModule) := SimplicialModule => {} >> opts -> (e, S) -> truncate({e}, S) + +truncate(List, SimplicialModuleMap) := SimplicialModuleMap => {} >> opts -> (L, phi) -> ( + map(truncate(L, target phi, opts), truncate(L, source phi, opts), hashTable for i in keys phi.map list i => ( + if (f := truncate(L, phi_i, opts)) == 0 then continue else f) ) + ) + +truncate(ZZ, SimplicialModuleMap) := SimplicialModuleMap => {} >> opts -> (L, phi) -> truncate({L}, phi, opts) + + + + +isShortExactSequence(SimplicialModuleMap, SimplicialModuleMap) := Boolean => (g, f) -> ( + -- f : A --> B, g : B --> C + -- the SES is 0 --> A --> B --> C --> 0. + isWellDefined g and + isWellDefined f and + isSimplicialMorphism g and + isSimplicialMorphism f and + g*f == 0 and + image f == kernel g and + kernel f == 0 and + coker g == 0 + ) diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 new file mode 100644 index 00000000000..19ac21cb776 --- /dev/null +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 @@ -0,0 +1,4001 @@ +doc /// + Key + SimplicialModules + Headline + A package for creating and computing objects in the category of Simplicial R-Modules + Description + Text + A simplicial R-module is a presheaf on the so-called Simplex Category, with values in the category of R-modules. Concretely, such objects can be viewed as nonnegatively graded R-modules + equipped with certain face and degeneracy operators satisfying the simplicial identites. As an example, every R-module M can be converted into a simplicial R-module whose degree + n piece is equal to M for all n, and with face/degeneracy operators simply given by the identity. + Example + S = simplicialModule(ZZ^2,3,Degeneracy => true) --the integer 3 specifies a top degree, the option Degeneracy specifies whether or not to compute degeneracy maps + Text + The output string for a simplicial module is meant to indicate that this object is infinite in general, + and the user can only compute a finite snapshot of the object. + The face/degeneracy maps can be accessed using the keys {\tt dd} and {\tt ss}, respectively. In order to verify that the resulting face/degeneracy maps satisfy the simplicial + identities, one can use the @TO isSimplicialModule@ command. + Example + S.dd + S.ss + assert isSimplicialModule S + Text + In general, simplicial objects are infinite objects. Because of this, the user can specify a top degree for the resulting simplicial object. If no top degree is specified, then + the default top degree is determined by the input object. + Text + @SUBSECTION "The Dold-Kan Correspondence"@ + Text + The category of simplicial R-modules is equivalent to the category of nonegatively graded + chain complexes via an equivalence known as the Dold-Kan correspondence. + + This means that there is a functor that converts a chain complex into a simplicial object, known as the Dold-Kan functor. In practice, the image of the Dold-Kan functor is + highly nontrivial to compute by hand. However, this package uses an algorithm of Kock-Sakuranath to compute Dold-Kan images quite efficiently by using the @TO simplicialModule@ + command: + Example + R = ZZ/101[x_1..x_3]; + K = koszulComplex vars R + simplicialModule(K) --defaults to top degree 3 + elapsedTime simplicialModule(K,6) --specify top degree 6 + elapsedTime S' = simplicialModule(K,6, Degeneracy => true) + isWellDefined S' --this method checks the simplicial identities as well as many other basic checks + Text + The other piece of the Dold-Kan correspondence is the functor that converts a simplicial module into a chain complex. This functor is often referred to as the normalization functor, + and is also implemented as the command @TO normalize@. If a simplicial R-module is computed as the Dold-Kan image of some complex, then this complex is cached and the @TO normalize@ command + returns this cached complex. If the user wants the normalization to be computed without accessing this cached value, one can use the {\tt CheckComplex => false} option. + By default, the normalization function does not prune the output, so the user should use @TO prune@ to get a nicer looking output. + Example + R = ZZ/101[x_1..x_3]; + K = koszulComplex vars R + Kn = normalize(simplicialModule(K,4), CheckComplex => false) + Kn.dd + K == prune Kn + Text + As the above example shows, applying the normalization to the Dold-Kan image recovers the original complex. + Text + @SUBSECTION "Canonical Extensions of Functors to the Category of Chain Complexes"@ + Text + One of the main utilities of the Dold-Kan correspondence from the perspective of a commutative algebraist is as a method of canonically extending any + endofunctor of R-modules to an endofunctor of nonnegatively chain complexes. This is because endofunctors of R-modules naturally extend to endofunctors + of simplicial R-modules by just applying the functor degree-wise. Since any nonnegatively graded chain complex can be converted into a simplicial R-module + (and vice versa) this yields a canonical way to extend endofunctors of R-modules to chain complexes in a way that preserves homotopy equivalence. + + This extension is often called the Dold-Puppe extension, and was introduced in pioneering work on the theory of derived nonlinear functors. + In general, the Dold-Puppe extension of a functor looks quite different from the classically defined functor, and in most cases may not be quasi-isomorphic over arbitrary base rings! + Example + Q = ZZ/101[x_1,x_2]; + K1 = complex {matrix{{x_1}}}; + K2 = complex {matrix{{x_2}}}; + T1 = K1**K2 + T1.dd + T2 = prune simplicialTensor({K1,K2}) + T2.dd + phi1 = extend(T1,T2,id_(T1_0)) + phi2 = extend(T2,T1,id_(T1_0)) + phi1*phi2 == id_T1 + isNullHomotopic(phi2*phi1 - id_T2) + Text + The above example allows us to directly verify that the classically defined tensor product is homotopy equivalent to the Dold-Kan version. This is true over arbitrary base rings, + but there are other functors such as the symmetric/exterior power functors that have classical definitions for chain complexes that are not necessarily + homotopy equivalent to the Dold-Puppe extensions: + Example + needsPackage "ChainComplexOperations" + Q = ZZ/2[x_1..x_3]; + K = koszulComplex vars Q; + W1 = complex wedge2(chainComplex K) --the classical "naively" defined exterior power functor + W2 = prune extPower(2,K) --the simplicial version of the exterior power functor + prune HH W1 + prune HH W2 + Text + Notice that the two definitions of exterior power yield complexes that are not even quasi-isomorphic, and hence certainly not homotopy equivalent. Moreover, the "naive" + definition yields a complex that does not even have finite length homology, while the Dold-Puppe extension applied to a complex with finite length homology is guaranteed + to have finite length homology. This preservation of "good behavior" for Dold-Puppe extensions of functors was the main motivation of the authors of CITE for using + simplicial techniques to prove the Total Rank Conjecture in characteristic 2. The @TO extPower@ command along with Schur functors in general have also been implemented in a + functorial way and can take morphisms of chain complexes as inputs: + Example + Q=ZZ/101[x_1,x_2]; + K = koszulComplex vars Q; + F = complex res ((ideal vars Q)^2); + phi = extend(K,F,id_(K_0)) + e2phi = prune extPower(2,phi) --induced map on the exterior powers of these complexes + assert isCommutative e2phi + --ephi = prune extPower(3,phi,TopDegree => 4); --the TopDegree option specifies how many homological degrees to compute + --assert isCommutative ephi; + --ephi_1 + --ephi_2; + --prune schurMap({2},phi) --the second symmetric power + --sphi = schurMap({2,1},phi,TopDegree => 3); --schur functor corresponding to partition {2,1} applied to phi + --sphi_1 + Text + This package thus lays the groundwork for computing with Dold-Puppe extensions of nonlinear functors, deriving nonlinear functors, and also allows any endofunctor of R-modules + implemented in Macaulay2 to immediately be canonically extended to an endofunctor at the level of chain complexes. Moreover, almost all methods + are implemented with an eye toward user accessibility and comprehension of the outputs. This is illustrated + in many of the documentation nodes below. + Text + @SUBSECTION "Getting started:"@ + Text + @UL { + TO "The Dold-Kan Correspondence in Macaulay2", + TO "Making simplicial modules", + TO "Making maps between simplicial modules", + TO "Basic invariants and properties", + TO "face/degeneracy maps of a simplicial module" + }@ + Text + @SUBSECTION "Contributors"@ + Text + The following people have generously contributed code or improved existing code: + Text + @SUBSECTION "Acknowledgments"@ + Text + This package began its life during the 2023 Macaulay2 workshop in Minneapolis. Many documentation + nodes for the basic constructors not specific to the {\tt SimplicialModule} type have been + repurposed from existing documentation coming from the @TO Complexes@ package. +/// + + +doc /// + Key + SimplicialModule + complexLength + Degeneracy + Headline + the class of all simplicial modules + Description + Text + A simplicial R-module is a presheaf on the so-called Simplex Category, with values in the category of R-modules. Concretely, such objects can be viewed as nonnegatively graded R-modules + equipped with certain face and degeneracy operators satisfying the simplicial identites. As an example, every R-module M can be converted into a simplicial R-module whose degree + n piece is equal to M for all n, and with face/degeneracy operators simply given by the identity. + Example + S = simplicialModule(ZZ^2,3,Degeneracy => true) --the integer 3 specifies a top degree, the option Degeneracy specifies whether or not to compute degeneracy maps + Text + The output string for a simplicial module is meant to indicate that this object is infinite in general, + and the user can only compute a finite snapshot of the object. + The face/degeneracy maps can be accessed using the keys {\tt dd} and {\tt ss}, respectively. In order to verify that the resulting face/degeneracy maps satisfy the simplicial + identities, one can use the @TO isSimplicialModule@ command. + Example + keys S + SeeAlso + "The Dold-Kan Correspondence in Macaulay2" + "Making simplicial modules" +/// + + +doc /// + Key + "The Dold-Kan Correspondence in Macaulay2" + (simplicialModule, Complex, ZZ) + (simplicialModule, Complex) + summandSurjection + Headline + compute the image of a non-negatively graded complex under the Dold-Kan correspondence + Usage + simplicialModule(C,d) + simplicialModule(C) + Inputs + C : Complex + d : ZZ + an integer specifying the top degree of the output SimplicialModule (if d is not specified, the top degree is the length of the complex C) + Description + Text + Given any non-negatively graded chain complex, the Dold-Kan correspondence is an equivalence of + categories: + $$\text{Ch}_{\geq 0} (R) \leftrightarrow \text{Simplicial R-modules}.$$ + If the simplicial module is obtained as a Dold-Kan image of some complex $C$, + then for each $i$ there is a decomposition + $$S_i = C_0 \oplus C_1^{\binom{i}{1}} \oplus \cdots \oplus C_j^{\binom{i}{j}} \oplus \cdots.$$ + To be technically correct, each of the direct summands $C_j$ of $S_i$ should be thought of as being + parametrized by an order preserving surjection $f : [i] \to [j]$ (where $[n] := \{ 0 ,\dots , n \}$. To deduce which surjection + corresponds to a given summand, first notice that order preserving surjections $f : [i] \to [j]$ + are in bijection with compositions of $i+1$ into $j+1$ parts by just listing the sizes of the + fibers of the map $f$. For instance, the composition $(2,2,1)$ corresponds to the surjection + $f : [4] \to [2]$ defined via + $$f(0) = f(1) = 0, \quad f(2) = f(3) = 1, \quad f(4) = 2.$$ + With this in mind, one can deduce the surjection corresponding to a summand as follows: + Example + R = ZZ/101[a..c] + C = koszulComplex vars R + S = simplicialModule(C, 4, Degeneracy => true) + S_2 + components S_2 --these are all the modules showing up + S_(2,1) + components S_(2,1) --these are only the components of C_1^2 + sort(select(compositions(2,3), i -> all(i, j -> j>0))) + Text + The ordering of the surjections corresponding to a summand agrees with the lexicographic + ordering of compositions via the bijection mentioned above. Thus the first summand of $C_1$ appearing + in $S_2$ corresponds to the surjection $f : [2] \to [1]$ given by $f(0) = 0$ and $f(1) = f(2) = 1$, + and the second summand corresponds to the surjection $f: [2] \to [1]$ with $f(0) = f(1) = 0$ and $f(2) = 1$. + These surjections may be accessed more directly using the {\tt summandSurjection} command: + Example + summandSurjection(2,0) --the surjection parametrizing C_0 + summandSurjection(2,1) --the surjections parametrizing C_1 + summandSurjection(2,2) --the surjection parametrizing C_2 + Text + Notice that the individual terms $C_j^{\binom{i}{j}}$ may be accessed as the $(i,j)$-component + of the simplicial module. There are moreover explicit formulas for the face and degeneracy + maps in terms of the differentials of $C$. These can also be accessed: + Example + S.dd --face maps + S.ss --degeneracy maps + S.dd_(2,0) + Text + If you want to restrict/project a face/degeneracy map to a particular summand, this can be done as follows: + Example + (S.dd_(2,0))_[1]^[0] --restrict to 1th summand of S_2, project onto 0th summand of S_1 + (S.dd_(2,0))_[2]^[1] --restrict to 2th summand of S_2, project onto 1th summand of S_1 + (S.dd_(2,0))_[3]^[1] --restrict to 3th summand of S_2, project onto 1th summand of S_1 + Text + The above computations tell us that the component of the face map $d_{2,0}$ mapping + $$C_{(1,2)} \to C_{(2)} $$ + is given by the differential of the original complex $C$ (we are using the compositions + correponding to the surjection to label the free modules now). The component + $$C_{(2,1)} \to C_{(1,1)}$$ + is simply the identity map, and the component + $$C_{(1,1,1)} \to C_{(1,1)}$$ + is also given by the differential of $C$. + SeeAlso + "Making simplicial modules" + "Making maps between simplicial modules" +/// + + +doc /// + Key + "Making simplicial modules" + Headline + information about the basic constructors + Description + Text + @SUBSECTION "Basic constructors"@ + Text + @UL { + TO (simplicialModule, HashTable, HashTable, HashTable, ZZ), + TO (simplicialModule, Module, ZZ), + TO (symbol SPACE, SimplicialModule, Array), + TO (isWellDefined, SimplicialModule) + }@ + Text + @SUBSECTION "Important computations creating new simplicial modules"@ + Text + @UL { + TO (simplicialModule, Complex), + TO (simplicialTensor, Complex, Complex) + }@ + Text + @SUBSECTION "More advanced constructors"@ + Text + @UL { + TO (symbol++, SimplicialModule, SimplicialModule), + TO (symbol**, SimplicialModule, SimplicialModule), + TO (symbol SPACE, RingMap, SimplicialModule), + TO (symbol **, RingMap, SimplicialModule), + TO (minimalPresentation, SimplicialModule), + TO (truncate, List, SimplicialModule) + }@ + Text + @SUBSECTION "Extracting simplicial modules from simplicial maps"@ + Text + @UL { + TO (source, SimplicialModuleMap), + TO (target, SimplicialModuleMap), + TO (kernel, SimplicialModuleMap), + TO (cokernel, SimplicialModuleMap), + TO (image, SimplicialModuleMap), + TO (coimage, SimplicialModuleMap) + }@ + SeeAlso + "Making maps between simplicial modules" + "Basic invariants and properties" +/// + +doc /// + Key + "Basic invariants and properties" + Headline + information about accessing basic features + Description + Text + @SUBSECTION "Predicates for simplicial modules and simplicial module maps"@ + Text + @UL { + TO (isWellDefined, SimplicialModule), + TO (isWellDefined, SimplicialModuleMap), + TO (isCommutative, SimplicialModuleMap), + TO (isSimplicialMorphism, SimplicialModuleMap), + TO (isShortExactSequence, SimplicialModuleMap, SimplicialModuleMap) + }@ + Text + @SUBSECTION "Other invariants for simplicial modules"@ + Text + @UL { + TO (ring, SimplicialModule), + TO (topDegree, SimplicialModule), + TO (components, SimplicialModule) + }@ + Text + @SUBSECTION "Other invariants for simplicial module maps"@ + Text + @UL { + TO (source, SimplicialModuleMap), + TO (target, SimplicialModuleMap), + TO (degree, SimplicialModuleMap), + TO (ring, SimplicialModuleMap), + TO (isHomogeneous, SimplicialModuleMap), + TO (components, SimplicialModuleMap) + }@ + SeeAlso + "Making simplicial modules" + "Making maps between simplicial modules" +/// + + + +doc /// + Key + (ring, SimplicialModule) + (ring, SimplicialModuleMap) + Headline + access the ring of a simplicial module or a simplicial module map + Usage + ring C + Inputs + C:SimplicialModule + or a @TO "SimplicialModuleMap"@ + Outputs + :Ring + Description + Text + Every simplicial module or simplicial module map has a base ring. This + function access that information. + Example + S = ZZ/101[a,b,c,d]; + C = simplicialModule freeResolution coker vars S + ring C + assert(ring C === S) + ring id_C + assert(ring id_C === S) + SeeAlso + "Basic invariants and properties" + ring +/// + + +doc /// + Key + topDegree + (topDegree, SimplicialModule) + (topDegree, SimplicialModuleMap) + Headline + top degree of a simplicial module + Usage + topDegree C + Inputs + C:SimplicialModule + Outputs + d:ZZ + an integer specifying the top degree to which the + face/degeneracy maps of a simplicial module have been computed + Description + Text + In this package, each simplicial module necessarily has a top degree which is a + finite bound up to which Macaulay2 will compute the face and/or degeneracy maps. + This function is mainly used in programming, to loop over all + non-zero modules or maps in the simplicial module. + Example + S = ZZ/101[a..c]; + C = simplicialModule(freeResolution coker vars S, 8) + topDegree C + C' = simplicialModule(freeResolution coker vars S, 6) + assert(topDegree C' == 6) + Text + Indices that are outside of the top degree automatically + return the zero object. + Example + C_-1 + C_9 + C'_7 + Text + The function {\tt topDegree} does no computation, and just accesses + a cached value. + SeeAlso + "Basic invariants and properties" + (symbol _, SimplicialModule, ZZ) +/// + + +doc /// + Key + simplicialModule + (simplicialModule, HashTable, HashTable, HashTable, ZZ) + (simplicialModule, HashTable, HashTable, ZZ) + (simplicialModule, Complex, HashTable, HashTable, ZZ) + (simplicialModule, Complex, HashTable, ZZ) + Headline + make a simplicial module + Usage + simplicialModule(H1, H2, H3, d) + Inputs + H1:HashTable + or @TO Complex@, used to determine the modules in each degree + H2:HashTable + used to specify the face maps + H3:HashTable + optional, used to specify degeneracy maps if needed + d:ZZ + an integer, specifying the top degree to compute the simplicial module up to + Degeneracy => Boolean + option specifying whether or not to also compute the degeneracy maps + Outputs + :SimplicialModule + Description + Text + A simplicial module is a sequence of objects (e.g. modules), + connected by maps called face/degeneracy maps denoted by $d$ and $s$, respectively. + These maps satisfy the simplicial identities: + 1. For face maps: + \[ d_j d_i = d_i d_{j-1} \text{ for } 0 \leq i < j \leq n \] + 2. For face and degeneracy maps: + \[ d_i s_j = s_{j-1} d_i \text{ for } i < j \] + \[ d_j s_j = \text{id} \] + \[ d_{j+1} s_j = \text{id} \] + \[ d_k s_j = s_j d_{k-1} \text{ for } k > j+1 \] + 3. For degeneracy maps: + \[ s_j s_i = s_i s_{j+1} \text{ for } i \leq j \] + + This constructor is the most basic constructor for building a simplicial module, + and is called by all of the more user friendly constructors. It is highly recommend + that the user sees @TO (simplicialModule, Complex)@ to quickly build simplicial modules. + Example + S = ZZ/101[a..d] + moduleHash = hashTable { 0 => S^1, + 1 => S^1++S^2, + 2 => S^1++S^2++S^2++S^1} + faceHash = hashTable {(1,0) => matrix {{1, a, b}}, + (1,1) => matrix {{1_S, 0, 0}}, + (2,0) => matrix {{1, a, b, 0, 0, 0}, + {0, 0, 0, 1, 0, -b}, + {0, 0, 0, 0, 1, a}}, + (2,1) => matrix {{1_S, 0, 0, 0, 0, 0}, + {0, 1, 0, 1, 0,0}, + {0, 0, 1, 0, 1, 0}}, + (2,2) => matrix {{1_S, 0, 0, 0, 0, 0}, + {0, 1, 0, 0, 0, 0}, + {0, 0, 1, 0, 0, 0}}} + degenHash = hashTable {(0,0) => matrix {{1_S}, {0}, {0}}, + (1,0) => matrix {{1_S, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 1, 0}, + {0, 0, 1}, + {0, 0, 0}}, + (1,1) => matrix {{1_S, 0, 0}, + {0, 1, 0}, + {0, 0, 1}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}}} + T = simplicialModule(moduleHash, faceHash, degenHash, 2) + T.module + T.dd + T.ss + T' = simplicialModule(moduleHash, faceHash, 2) + T'.?ss + Text + In the above, notice that if the user does not provide a hash table + specifying the degeneracy maps, then the simplicial module is still constructed + using only the data of the face maps. This feature is intentional since for the + purposes of efficiency, storing the data of the degeneracy maps may slow down + computations (and one can compute normalizations using only the face maps). In general, + the method @TO forgetDegeneracy@ allows the user to ignore the data of the degeneracy maps + if needed. + Text + In the following example, we see that one can construct simplicial modules + that are not well-defined. The user should use @TO (isWellDefined, SimplicialModule)@ + in order to check that a simplicial module is indeed well-defined. + Example + H1 = hashTable {0 => S^1, 1 => S^1, 2 => S^1} + H2 = hashTable {(1,0) => map(S^1, S^1, 0), + (1,1) => map(S^1, S^1, 0), + (2,0) => map(S^1, S^1, 0), + (2,1) => map(S^1, S^1, 0), + (2,2) => map(S^1, S^1, 0)} + H3 = hashTable {(0,0) => map(S^1, S^1, 0), + (1,0) => map(S^1, S^1, 0), + (1,1) => map(S^1, S^1, 0)} + U = simplicialModule(H1,H2,H3,2) + U.dd + U.ss + isWellDefined U + Caveat + This constructor minimizes computation + and does very little error checking. To verify that a complex + is well constructed, use @TO (isWellDefined, SimplicialModule)@. + SeeAlso + "Making simplicial modules" + (isWellDefined, SimplicialModule) + (simplicialModule, HashTable, HashTable, HashTable, ZZ) + (simplicialModule, Module, ZZ) + (symbol SPACE, SimplicialModule, Array) +/// + + +doc /// + Key + (simplicialModule, Module, ZZ) + (simplicialModule, Ideal, ZZ) + (simplicialModule, Ring, ZZ) + Headline + make a simplicial module associated to a complex concentrated in degree 0 + Usage + simplicialModule(M, d) + Inputs + M:Module + or @TO "Ideal"@, or @TO "Ring"@. + d:ZZ + top degree to compute the simplicial module up to + Outputs + :SimplicialModule + returns the complex whose 0-th component is {\tt M}. + Description + Text + In contrast to @TO (simplicialModule,HashTable,HashTable,HashTable,ZZ)@ or @TO + (simplicialModule,Complex,ZZ)@, this constructor provides a convenient + method to construct a simplicial module from a single module/ring/ideal. + + We illustrate this with a free module. + Example + S = ZZ/101[a..d] + C0 = simplicialModule( S^2, 6, Degeneracy => true) + f = dd^C0 + source f, target f + f == 0 + isWellDefined C0 + C0 == 0 + topDegree C0 + Example + C1 = simplicialModule(complex(S^2, Base=>3), 6, Degeneracy => true) + C1_3 + C1_0 + Text + A ring or an ideal will be converted to a module first. + Example + C2 = simplicialModule( S, 5, Degeneracy => true) + I = ideal(a^2-b, c^3) + C3 = simplicialModule( I, 7, Degeneracy => true) + C4 = simplicialModule( (S/I), 8, Degeneracy => true) + (ring C3, ring C4) + Text + The zero simplicial module over a ring {\tt S} is most conveniently + created by giving the zero module. + Example + C5 = simplicialModule(S^0, 8, Degeneracy => true) + C5 == 0 + dd^C5 == 0 + ss^C5 == 0 + C5_0 + SeeAlso + "Making simplicial modules" + (isWellDefined, SimplicialModule) + (simplicialModule, HashTable, HashTable, HashTable, ZZ) +/// + +doc /// + Key + (isWellDefined, SimplicialModule) + Headline + whether a simplicial module is well-defined + Usage + isWellDefined C + Inputs + C:SimplicialModule + Outputs + :Boolean + that is true when {\tt C} determines a well defined simplicial module + Description + Text + This routine checks that the face/degeneracy maps of {\tt C} satisfy the simplicial identities + (see @TO isSimplicialModule@ for a list of these identities). + If there are no degeneracy maps stored, it instead checks that the naive normalization of C + is a well-defined complex. + Additionally, it checks that the underlying data in {\tt C} is a properly formed + @TO SimplicialModule@ object in Macaulay2. If the variable {\tt debugLevel} is set to a value greater than zero, + then information about the nature of any failure is displayed. + Text + As a first example, we construct the Dold-Kan image of a free resolution and verify that it is + well-defined. + Example + R = QQ[a..d]; + f0 = matrix {{-b^2+a*c, b*c-a*d, -c^2+b*d}} + f1 = map(source f0,, {{d, c}, {c, b}, {b, a}}) + C = simplicialModule(complex {f0, f1}, 3, Degeneracy => true) + isWellDefined C + dd^C + ss^C + dd^C*ss^C --if C is well-defined, this should be all identity maps + Text + The zero simplicial module is well-defined. + Example + C = simplicialModule(R^0, 6, Degeneracy => true) + isWellDefined C + SeeAlso + (isWellDefined, SimplicialModuleMap) + map +/// + + +doc /// + Key + (symbol _, SimplicialModule, ZZ) + (symbol _, SimplicialModule, Sequence) + Headline + access individual objects of a simplicial module + Usage + C_i + Inputs + C:SimplicialModule + i:ZZ + or @TO Sequence@, indicating a term in some degree + Outputs + :Module + the {\tt i}-th object + Description + Text + The data of the modules of a simplicial module is stored in two different ways, + depending on whether the simplicial module $S$ is obtained as the Dold-Kan image + of some complex. If the simplicial module is obtained as a Dold-Kan image of some complex $C$, + then for each $i$ there is a decomposition + $$S_i = C_0 \oplus C_1^{\binom{i}{1}} \oplus \cdots \oplus C_j^{\binom{i}{j}} \oplus \cdots.$$ + Thus the individual terms $C_j^{\binom{i}{j}}$ may be accessed as the $(i,j)$-component + of the simplicial module. + If $S$ is not obtained as a Dold-Kan image, then each term is considered singly indexed with no additional components. + Example + S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker vars S, 4, Degeneracy => true) + C.?complex + C.complex + C_(1,0) == C.complex_0 + C_(1,1) == C.complex_1 + C_(2,1) == C.complex_1 ++ C.complex_1 + tC = C ** C + tC.?complex + tC_2 + Text + If the simplicial object is obtained as a Dold-Kan image, then using an integer subscript + will automatically take the direct sum over all the terms of the complex appearing in that degree + (and cache the components of that direct sum accordingly). + Example + C_3 + components C_3 + (C_3)_[1,2,3] --extract the inclusion of (C.complex_1)^3 + Text + Indices that are outside of the top degree automatically + return the zero object. + Example + C_(-1,3) + C_-7 + SeeAlso + (symbol _, SimplicialModuleMap, ZZ) +/// + + +doc /// + Key + (symbol ==, SimplicialModule, SimplicialModule) + (symbol ==, SimplicialModule, ZZ) + (symbol ==, ZZ, SimplicialModule) + Headline + whether two simplicial modules are equal + Usage + C == D + C == 0 + Inputs + C:SimplicialModule + D:SimplicialModule + Outputs + :Boolean + that is true when {\tt C} and {\tt D} are equal + Description + Text + Two simplicial modules are equal if the corresponding + objects and corresponding maps at each index are equal. + Example + S = ZZ/101[a..c] + C = simplicialModule(K = freeResolution coker vars S, 4) + D = image id_C; + C === D + C == D + Text + Both the maps and the objects must be equal. + Example + E = simplicialModule(complex for i from 1 to 3 list 0*dd^K_i, 4) + dd^E + C == E + E == 0 + Text + A simplicial module is equal to zero if all the objects and maps are zero. + This could require computation to determine if something that + is superficially not zero is in fact zero. + Example + f = id_C + D = coker f + D == 0 + Example + C0 = simplicialModule( S^0, 5, Degeneracy => true) + C1 = simplicialModule(complex(S^0, Base => 2), 5, Degeneracy => true) + topDegree C0 == topDegree C1 + C0 == C1 + C0 == 0 + C1 == 0 + Caveat + Testing for equality is not the same as testing for isomorphism. + SeeAlso +/// + + +doc /// + Key + "face/degeneracy maps of a simplicial module" + (symbol^, Symbol, SimplicialModule) + ss + Headline + access the face and degeneracy maps of a simplicial module + Usage + dd^C + ss^C + Inputs + C:SimplicialModule + Outputs + :SimplicialModuleMap + a map of degree -1 or 1, respectively + Description + Text + A simplicial module is a sequence of modules connected + by homomorphisms, called face/degeneracy maps, such that + these maps satisfy a set of identities known as the simplicial identities. + More precisely we should have the following equalities: + 1. For face maps: + \[ d_j d_i = d_i d_{j-1} \text{ for } 0 \leq i < j \leq n \] + 2. For face and degeneracy maps: + \[ d_i s_j = s_{j-1} d_i \text{ for } i < j \] + \[ d_j s_j = \text{id} \] + \[ d_{j+1} s_j = \text{id} \] + \[ d_k s_j = s_j d_{k-1} \text{ for } k > j+1 \] + 3. For degeneracy maps: + \[ s_j s_i = s_i s_{j+1} \text{ for } i \leq j \] + Text + The face/degeneracy maps are considered as double indexed in this package. This is because + for a fixed integer $n$, the module $S_n$ comes equipped with $n$ face and degeneracy maps: + $$d_{n,i} : S_n \to S_{n-1}, \quad \text{and} \quad s_{n,i} : S_n \to S_{n+1}.$$ + The above maps can be accessed as follows: + Example + R = QQ[a..d]; + I = ideal(a*d-b*c, b^2-a*c, c^2-b*d); + C = simplicialModule(freeResolution(R^1/I), 4, Degeneracy => true) + isWellDefined C + dd^C + C.dd + ss^C + C.ss + assert(dd^C === C.dd) + assert(source dd^C === C) + assert(target dd^C === C) + assert(degree dd^C === -1) + assert(source ss^C === C) + assert(target ss^C === C) + assert(degree ss^C === 1) + Text + The individual maps between terms are indexed by their + source. + Example + dd^C_(2,0) + assert(source dd^C_2 === C_2) + assert(target dd^C_2 === C_1) + SeeAlso + "Making maps between simplicial modules" + (symbol_, SimplicialModuleMap, ZZ) + (symbol_, SimplicialModule, ZZ) + (source, SimplicialModuleMap) + (target, SimplicialModuleMap) + (degree, SimplicialModuleMap) +/// + + + +doc /// + Key + (symbol_, SimplicialModule, Array) + (symbol^, SimplicialModule, Array) + Headline + the canonical inclusion or projection map of a direct sum + Usage + i = C_[name] + p = C^[name] + Inputs + C:SimplicialModule + name: + Outputs + :SimplicialModuleMap + {\tt i} is the canonical inclusion and {\tt p} is + the canonical projection + Description + Text + The direct sum is an n-ary operator with projection and + inclusion maps from each component satisfying appropriate + identities. + + One can access these maps as follows. + Example + S = ZZ/101[a,b,c]; + C1 = simplicialModule(freeResolution coker vars S, 5, Degeneracy => true) + C2 = simplicialModule(complex (ideal(a,b,c)) , 5, Degeneracy => true) + D = C1 ++ C2 + D_[0] + isCommutative D_[0] + D_[1] + D^[0] * D_[0] == 1 + D^[1] * D_[1] == 1 + D^[0] * D_[1] == 0 + D^[1] * D_[0] == 0 + D_[0] * D^[0] + D_[1] * D^[1] == 1 + Text + The default names for the components are the non-negative + integers. However, one can choose any name. + Example + E = (chicken => C1) ++ (nuggets => C2) + E_[chicken] + E_[nuggets] + E^[chicken] * E_[chicken] == 1 + E^[nuggets] * E_[nuggets] == 1 + E^[chicken] * E_[nuggets] == 0 + E^[nuggets] * E_[chicken] == 0 + E_[chicken] * E^[chicken] + E_[nuggets] * E^[nuggets] == 1 + Text + One can also access inclusion and projection maps of sub-direct sums. + Example + F = directSum(C1, C2, simplicialModule(complex(S^2, Base => 1), 5, Degeneracy => true)) + prune (F^[0,1]) + isSimplicialMorphism oo + prune (F_[0,2]) + isSimplicialMorphism oo + SeeAlso + (directSum, SimplicialModule) + (components, SimplicialModule) + indices +/// + +doc /// + Key + (components, SimplicialModule) + Headline + list the components of a direct sum + Usage + components C + Inputs + C:SimplicialModule + Outputs + :List + the component simplicial modules of a direct sum (of simplicial modules) + Description + Text + A simplicial module which has been constructed as a direct sum + stores its component simplicial modules. + Example + S = ZZ/101[a,b,c]; + C1 = simplicialModule freeResolution coker vars S + C2 = simplicialModule(complex (ideal(a,b,c)), 3) + D = C1 ++ C2 + L = components D + L_0 === C1 + L_1 === C2 + E = (peanut => C1) ++ (butter => C2) + components E + Text + The names of the component simplicial modules are called indices, + and are used to access the relevant inclusion and projection maps. + Example + indices D + D^[0] + indices E + E_[butter] + SeeAlso + (directSum, SimplicialModule) + indices + (symbol_, SimplicialModule, Array) + (symbol^, SimplicialModule, Array) +/// + + +doc /// + Key + (symbol**, SimplicialModule, SimplicialModule) + (symbol**, Complex, SimplicialModule) + (symbol**, SimplicialModule, Complex) + (symbol**, SimplicialModule, Module) + (symbol**, Module, SimplicialModule) + Headline + tensor product of simplicial modules + Usage + D = C1 ** C2 + Inputs + C1:SimplicialModule + or @ofClass Module@ + C2:SimplicialModule + or @ofClass Module@ + Outputs + D:SimplicialModule + tensor product of {\tt C1} and {\tt C2} + Description + Text + The tensor product is a simplicial module $D$ whose $i$th component is + the tensor product of the degree i components of $C1$ and $C2$. The face/degeneracy maps + are given by the tensor products of the face an degeneracy maps of the original objects. + + As the next example illustrates, the simplicial tensor product in general does not + normalize to give an object that is isomorphic to the classically defined tensor product + of complexes. + Example + S = ZZ/101[a..c] + Ca = simplicialModule(complex {matrix{{a}}}, 3) + Cb = simplicialModule(complex {matrix{{b}}}, 3) + Cc = simplicialModule(complex {matrix{{c}}}, 3) + Cab = Cb ** Ca + dd^Cab + (prune normalize Cab).dd + assert isWellDefined Cab + Cabc = Cc ** Cab + Cc ** Cb ** Ca + dd^(nC = prune normalize Cabc) + assert isWellDefined nC + Text + If one of the arguments is a module, it is considered as a complex concentrated in homological degree 0. + Example + Cabc ** (S^1/(a,b,c)); + S^2 ** Cabc + Text + Because the tensor product can be regarded as the total complex of a double complex, + each term of the tensor product comes with pairs of indices, labelling the summands. + Example + indices Cabc_1 + components Cabc_1 + Cabc_1_[{1,0}] + indices Cabc_2 + components Cabc_2 + Cabc_2_[{0,2}] + SeeAlso + indices + components + directSum +/// + + + +doc /// + Key + (truncate, List, SimplicialModule) + (truncate, ZZ, SimplicialModule) + Headline + truncation of a simplicial module at a specified degree or set of degrees + Usage + truncate(d, C) + Inputs + d:List + or @TO "ZZ"@, if the underlying ring $R$ is singly graded. + C:SimplicialModule + that is homogeneous over $R$ + Outputs + :SimplicialModule + a simplicial module whose terms consist of all elements of component-wise degree at least {\tt d}. + Description + Text + Truncation of homogeneous (graded) modules induces a natural + operation on simplicial modules. + Text + In the singly graded case, the truncation of a homogeneous + module $M$ at degree $d$ is generated by all homogeneous + elements of degree at least $d$ in $M$. This method applies + this operation to each term in a simplicial module. + Example + R = QQ[a,b,c]; + I = ideal(a*b, a*c, b*c) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D = truncate(3,C) + assert isWellDefined D + Text + Truncating at a degree less than the minimal generators + is the identity operation. + Example + assert(C == truncate(0, C)) + Text + In the multi-graded case, the truncation of a homogeneous module at + a list of degrees is generated by all homogeneous elements of degree + that are component-wise greater than or equal to at least one + of the degrees. + Example + A = ZZ/101[x_0, x_1, y_0, y_1, y_2, Degrees => {2:{1,0}, 3:{0,1}}]; + I = intersect(ideal(x_0, x_1), ideal(y_0, y_1, y_2)) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D1 = prune truncate({{1,1}}, C) + D2 = truncate({{1,0}}, C) + D3 = truncate({{0,1}}, C) + D4 = truncate({{1,0},{0,1}}, C); + D5 = truncate({{2,2}}, C); + assert all({D1,D2,D3,D4,D5}, isWellDefined) + SeeAlso + "Making simplicial modules" + (truncate, List, Module) + (truncate, List, SimplicialModuleMap) +/// + + +doc /// + Key + (symbol SPACE, RingMap, SimplicialModule) + Headline + apply a ring map to a simplicial module + Usage + phi C + Inputs + phi:RingMap + whose source is a ring $R$, and whose target is a ring $S$ + C:SimplicialModule + over the ring $R$ + Outputs + :SimplicialModule + over the ring $S$ + Description + Text + We illustrate the image of a simplicial module under a ring map. + Example + R = QQ[x,y,z] + S = QQ[s,t] + phi = map(S, R, {s, s+t, t}) + I = ideal(x^3, x^2*y, x*y^4, y*z^5) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D = phi C + isWellDefined D + dd^D + Text + When the ring map doesn't preserve homogeneity, + the @TO "DegreeMap"@ option is needed to determine + the degrees of the image free modules in the simplicial module. + Example + R = ZZ/101[a..d] + S = ZZ/101[s,t] + phi = map(S, R, {s^4, s^3*t, s*t^3, t^4}, DegreeMap => i -> 4*i) + C = simplicialModule(freeResolution coker vars R, 4, Degeneracy => true) + D = phi C + assert isWellDefined D + Caveat + Every term in the simplicial module must be free or a submodule of a free module. + Otherwise, use @TO (tensor, RingMap, SimplicialModule)@. + SeeAlso + (symbol SPACE, RingMap, SimplicialModuleMap) + (symbol **, RingMap, SimplicialModule) +/// + + +doc /// + Key + (symbol**, RingMap, SimplicialModule) + (symbol**, SimplicialModule, RingMap) + (tensor, RingMap, SimplicialModule) + (tensor, SimplicialModule, RingMap) + (symbol**, SimplicialModule, Ring) + (symbol**, Ring, SimplicialModule) + Headline + tensor a simplicial module along a ring map + Usage + phi ** C + tensor(phi, C) + S ** C + C ** S + Inputs + phi:RingMap + whose source is a ring $R$ and whose target is a ring $S$ + C:SimplicialModule + over the ring $R$ + Outputs + :SimplicialModule + over the ring $S$ + Description + Text + These methods implement the base change of rings. As input, one can either + give a ring map $\phi$, or the ring $S$ (when there is a canonical map + from $R$ to $S$). + Text + We illustrate the tensor product of a simplicial module along a ring map. + Example + R = QQ[x,y,z]; + S = QQ[s,t]; + phi = map(S, R, {s, s+t, t}) + I = ideal(x^3, x^2*y, x*y^4, y*z^5) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D = phi ** C + assert isWellDefined D + dd^D + ss^D + Text + If a ring is used rather than a ring map, then the implicit + map from the underlying ring of the complex to the given ring + is used. + Example + A = R/(x^2+y^2+z^2); + C ** A + assert(map(A,R) ** C == C ** A) + Text + The commutativity of tensor product is witnessed as follows. + Example + assert(D == C ** phi) + assert(C ** A == A ** C) + Text + When the modules in the complex are not free modules, + this is different than the image of a complex + under a ring map. + Example + use R + I = ideal(x*y, x*z, y*z); + J = I + ideal(x^2, y^2); + g = inducedMap(module J, module I) + assert isWellDefined g + C = simplicialModule(complex {g}, 3, Degeneracy => true) + D1 = phi C + assert isWellDefined D1 + D2 = phi ** C + assert isWellDefined D2 + prune D1 + prune D2 + Text + When the ring map doesn't preserve homogeneity, + the @TO "DegreeMap"@ option is needed to determine + the degrees of the image free modules in the complex. + Example + R = ZZ/101[a..d]; + S = ZZ/101[s,t]; + f = map(S, R, {s^4, s^3*t, s*t^3, t^4}, DegreeMap => i -> 4*i) + C = simplicialModule(freeResolution coker vars R, 3, Degeneracy => true) + D = f ** C + D == f C + assert isWellDefined D + SeeAlso + (symbol **, RingMap, SimplicialModuleMap) + (symbol SPACE, RingMap, SimplicialModule) +/// + + + +doc /// + Key + (minimalPresentation, SimplicialModule) + (prune, SimplicialModule) + (prune, SimplicialModuleMap) + (minimalPresentation, SimplicialModuleMap) + Headline + minimal presentation of all terms in a simplicial module + Usage + D = minimalPresentation C + D = prune C + h = minimalPresentation f + h = prune f + Inputs + C:SimplicialModule + or $f$ @ofClass SimplicialModuleMap@ + Exclude => + unused + Outputs + D:SimplicialModule + isomorphic to the input, where each term is replaced + by a minimally presented model, or $h$ @ofClass SimplicialModuleMap@ + where the source and target are minimally presented + Consequences + Item + The isomorphism $g : D \to C$ is available as + @TT "g = D.cache.pruningMap"@. The inverse isomorphism + can be obtained as @TT "g^-1"@ + Description + Text + This is frequently useful to make the output of certain + operations readable or understandable. This operation + is functorial, applying both to simplicial modules and simplicial module maps. + Text + In particular, images/kernels/cokernels of maps need to be pruned to + be understood. For instance, this is useful + for recognizing when terms given by subquotient modules + are actually zero. + Example + S = ZZ/101[a,b,c,d,e]; + I = ideal(a,b) * ideal(c,d,e) + F = simplicialModule((dual freeResolution I)[-4], 2, Degeneracy => true) + C = HH F + D = prune C + g = D.cache.pruningMap + assert isWellDefined g + assert isSimplicialMorphism g + assert (target g == C) + assert (source g == D) + g^-1 + assert(g*g^-1 == 1 and g^-1*g == 1) + Text + The image of a map of simplicial modules also becomes more + understandable via pruning. + Example + S = ZZ/101[a,b,c]; + I = ideal(a^2,b^2,c^2); + J = I + ideal(a*b*c); + FI = simplicialModule(freeResolution I, Degeneracy => true) + FJ = simplicialModule(freeResolution J, Degeneracy => true) + f = randomSimplicialMap(FJ, FI ** S^{-1}, Cycle => true) + C = image f + D = prune C + g = D.cache.pruningMap + assert isWellDefined g + assert isSimplicialMorphism g + assert (target g == C) + assert (source g == D) + g^-1 + assert(g*g^-1 == 1 and g^-1*g == 1) + Text + One can directly prune the map of simplicial modules $f$. + Example + h = prune f + assert(source h === prune source f) + assert(target h === prune target f) + SeeAlso + "Making simplicial modules" + (minimalPresentation, Module) + randomSimplicialMap + isSimplicialMorphism +/// + + +doc /// + Key + "Making maps between simplicial modules" + Headline + information about the basic constructors + Description + Text + @SUBSECTION "Basic constructors"@ + Text + @UL { + TO (map, SimplicialModule, SimplicialModule, HashTable), + TO (map, SimplicialModule, SimplicialModule, ZZ), + TO (map, SimplicialModule, SimplicialModule, SimplicialModuleMap), + TO (id, SimplicialModule), + TO "face/degeneracy maps of a simplicial module", + TO (symbol SPACE, SimplicialModuleMap, Array), + TO (isWellDefined, SimplicialModuleMap) + }@ + Text + @SUBSECTION "Important computations creating new simplicial module maps"@ + Text + @UL { + TO (symbol**, SimplicialModule, Matrix) + }@ + Text + @SUBSECTION "Canonical maps between simplicial modules"@ + Text + Some simplicial modules come with canonical maps. + These are best accessed using @TO inducedMap@. + Text + @UL { + TO (kernel, SimplicialModuleMap), + TO (cokernel, SimplicialModuleMap), + TO (image, SimplicialModuleMap), + TO (coimage, SimplicialModuleMap), + TO (inducedMap, SimplicialModule, SimplicialModule) + }@ + Text + @SUBSECTION "Random maps of simplicial modules"@ + Text + The method @TO (randomSimplicialMap, SimplicialModule, SimplicialModule)@ + allows one to construct random simplicial module maps, + random morphisms between simplicial modules, and random + null homotopies between simplicial modules. + Text + @UL { + TO (isCommutative, SimplicialModuleMap), + TO (isSimplicialMorphism, SimplicialModuleMap) + }@ + Text + @SUBSECTION "Elementary operations on simplicial module maps"@ + Text + @UL { + TO "arithmetic with simplicial module maps", + TO (symbol +, SimplicialModuleMap, SimplicialModuleMap), + TO (symbol |, SimplicialModuleMap, SimplicialModuleMap), + TO (symbol ||, SimplicialModuleMap, SimplicialModuleMap), + TO (symbol ++, SimplicialModuleMap, SimplicialModuleMap), + TO (symbol **, SimplicialModuleMap, SimplicialModuleMap), + TO (symbol _, SimplicialModuleMap, Array), + TO (symbol ^, SimplicialModuleMap, Array), + TO (truncate, List, SimplicialModuleMap), + TO (symbol SPACE, RingMap, SimplicialModuleMap), + TO (symbol **, RingMap, SimplicialModuleMap) + }@ + SeeAlso + "Making simplicial modules" + "Basic invariants and properties" +/// + + +doc /// + Key + SimplicialModuleMap + complexMap + Headline + the class of all maps between simplicial modules + Description + Text + @LITERAL ////////@ + + A map of simplicial modules $f \colon C \rightarrow D$ of degree $d$ is a + sequence of maps $f_i \colon C_i \rightarrow D_{d+i}$. + No relationship between the maps $f_i$ and + and the face/degeneracy maps of either $C$ or $D$ is assumed. If a simplicial module map + is obtained as the image of a morphism of complexes under the Dold-Kan functor, + the key {\tt complexMap} will be stored for more efficient normalization computations. + + The usual algebraic operations are available: addition, + subtraction, scalar multiplication, and composition. The + identity map from a simplicial module to itself can be produced with + @TO "id"@. An attempt to add (subtract, or compare) a ring + element to a simplicial module will result in the ring element being + multiplied by the appropriate identity map. + SeeAlso + SimplicialModule + "Making maps between simplicial modules" + "arithmetic with simplicial module maps" +/// + + +doc /// + Key + (map, SimplicialModule, SimplicialModule, HashTable) + Headline + make a map of simplicial modules + Usage + f = map(D, C, H) + Inputs + C:SimplicialModule + D:SimplicialModule + H:HashTable + whose keys are integers, and whose values are the maps between + the corresponding terms + Degree => ZZ + the degree of the resulting map + DegreeLift => + unused + DegreeMap => + unused + Outputs + f:SimplicialModuleMap + Description + Text + A map of simplicial modules $f : C \rightarrow D$ of degree $d$ is a + sequence of maps $f_i : C_i \rightarrow D_{d+i}$. + No relationship between the maps $f_i$ and + and the face/degeneracy maps of either $C$ or $D$ is assumed. + + We construct a map of simplicial modules by specifying the + individual maps between the terms. Note that this constructor is typically + used more behind the scenes, and using the @TO simplicialModule@ or basic map constructors + is typically much more efficient than typing the maps by hand. + Example + R = ZZ/101[a,b,c]; + C = simplicialModule(F = freeResolution coker matrix{{a^2-b^2,b^3-c^3,c^4}}, Degeneracy => true) + D = simplicialModule(G = freeResolution coker vars R, Degeneracy => true) + H = hashTable { 0 => map(D_0, C_0, 1), + 1 => map(D_1, C_1, {{1, 0, 0, 0}, {0, a, 0, 0}, {0, -b, b^2, 0}, {0, 0, -c^2, c^3}}), + 2 => map(D_2, C_2, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, a, 0, 0, 0, 0,0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0}, + {0, 0, 0, 0, -b, b^2, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3}}), + 3 => map(D_3, C_3, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, -b, b^2, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0,0, 0, 0, 0, 0, 0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0, 0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-a*c^2, a*c^3, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0,0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0, 0,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2,a*c^3, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2*c^3}}) + } + f = map(D, C, H) + assert isWellDefined f + assert isHomogeneous f + assert(degree f == 0) + assert isSimplicialMorphism f + Text + The keys in the hash table index the terms in the source of the + map. If a key is missing, that map is taken to be the zero map. + We illustrate this by constructing the 0 map as follows: + Example + h = map(C, C, hashTable {}) + h == 0 + Text + This is the primary constructor used by all of the more user friendly + methods for constructing a chain complex. + Caveat + This constructor minimizes computation + and does very little error checking. To verify that a simplicial module map + is well constructed, use @TO (isWellDefined, SimplicialModuleMap)@. + SeeAlso + SimplicialModuleMap + (isWellDefined, SimplicialModuleMap) + (isHomogeneous, SimplicialModuleMap) + (degree, SimplicialModuleMap) + (isSimplicialMorphism, SimplicialModuleMap) + (isCommutative, SimplicialModuleMap) + (source, SimplicialModuleMap) + (target, SimplicialModuleMap) +/// + + +doc /// + Key + (map, SimplicialModule, SimplicialModule, ZZ) + Headline + make the zero map or identity between simplicial modules + Usage + f = map(D, C, 0) + f = map(C, C, 1) + Inputs + C:SimplicialModule + D:SimplicialModule + 0:ZZ + or 1 + Degree => ZZ + the degree of the resulting map + DegreeLift => + unused + DegreeMap => + unused + Outputs + f:SimplicialModuleMap + the zero map from $C$ to $D$ or the identity map from $C$ to $C$ + Description + Text + A map of simplicial modules $f : C \rightarrow D$ of degree $d$ is a + sequence of maps $f_i : C_i \rightarrow D_{d+i}$. + + We construct the zero map between two + simplicial modules. + Example + R = QQ[a,b,c] + C = simplicialModule(freeResolution coker vars R, Degeneracy => true) + D = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}, Degeneracy => true) + f = map(D, C, 0) + assert isWellDefined f + assert isSimplicialMorphism f + g = map(C, C, 0, Degree => 13) + assert isWellDefined g + assert(degree g == 13) + assert not isSimplicialMorphism g + assert isCommutative g + assert isHomogeneous g + assert(source g == C) + assert(target g == C) + Text + Using this function to create the identity map + is the same as using @TO (id, SimplicialModule)@. + Example + assert(map(C, C, 1) === id_C) + SeeAlso + SimplicialModuleMap + (isWellDefined, SimplicialModuleMap) + (isHomogeneous, SimplicialModuleMap) + (degree, SimplicialModuleMap) + (isSimplicialMorphism, SimplicialModuleMap) + (isCommutative, SimplicialModuleMap) + (source, SimplicialModuleMap) + (target, SimplicialModuleMap) + (id, SimplicialModule) +/// + +doc /// + Key + (map, SimplicialModule, SimplicialModule, SimplicialModuleMap) + Headline + make a new map of simplicial modules, induced from an existing one + Usage + g = map(D, C, f) + Inputs + C:SimplicialModule + D:SimplicialModule + f:SimplicialModuleMap + regarded as providing matrices which induce maps between the terms of $C$ and $D$ + Degree => ZZ + the degree $d$ of the resulting map + DegreeLift => + unused + DegreeMap => + unused + Outputs + g:SimplicialModuleMap + Description + Text + A map of simplicial modules $f : C' \rightarrow D'$ is a + sequence of maps $f_i : C'_i \rightarrow D'_{d'+i}$. + The new map $g : C \rightarrow D$ is the sequence of maps $g_i : C_i \rightarrow D_{d+i}$ + induced by the matrix of $f_i$. + + One use for this function is to get the new map of simplicial modules induced by + forgetting the underlying complexes of the course and target, assuming that the + source and target is obtained as a Dold-Kan image. + Example + R = ZZ/101[a,b,c]; + C = simplicialModule(freeResolution coker vars R, Degeneracy => true) + f = map(forgetComplex C, forgetComplex C, id_C) + assert isWellDefined f + assert(degree f == 0) + assert isCommutative f + assert isSimplicialMorphism f + normalize f --notice how the normalization is not already pruned + normalize id_C + prune normalize f == normalize id_C + SeeAlso + SimplicialModuleMap + (isWellDefined, SimplicialModuleMap) + (degree, SimplicialModuleMap) + (isSimplicialMorphism, SimplicialModuleMap) + (isCommutative, SimplicialModuleMap) + (symbol SPACE, SimplicialModule, Array) +/// + + + +doc /// + Key + (id, SimplicialModule) + Headline + the identity map of a simplicial module + Usage + f = id_C + Inputs + C:SimplicialModule + Outputs + f:SimplicialModuleMap + the identity map from $C$ to itself + Description + Text + The simplicial modules together with simplicial morphisms + forms a category. In particular, every simplicial module has an identity map. + Example + R = ZZ/101[x,y]/(x^3, y^3) + C = simplicialModule(freeResolution(coker vars R, LengthLimit=>6), 6, Degeneracy => true) + f = id_C; + assert isWellDefined f + assert isSimplicialMorphism f + SeeAlso + (map, SimplicialModule, SimplicialModule, ZZ) + (isWellDefined, SimplicialModuleMap) + (isSimplicialMorphism, SimplicialModuleMap) +/// + +doc /// + Key + (isWellDefined, SimplicialModuleMap) + Headline + whether a map of simplicial modules is well-defined + Usage + isWellDefined f + Inputs + f:SimplicialModuleMap + Outputs + :Boolean + that is true when {\tt f} determines a well defined simplicial module map + Description + Text + A map of simplicial modules $f : C \to D$ of degree $d$ is a sequence of + maps $f_i : C_i \to D_{d+i}$. No relationship is required between + these maps and the face/degeneracy maps in the source and target. + + This routine checks that $C$ and $D$ are well-defined + simplicial modules, and that, for each $f_i$, the source and + target equal $C_i$ and $D_{d+i}$, respectively. If the + variable {\tt debugLevel} is set to a value greater than + zero, then information about the nature of any failure is + displayed. + Text + Unlike the @TO2((isWellDefined, SimplicialModule), + "corresponding function for SimplicialModulees")@, + the basic constructors for simplicial module maps are all but + assured to be well defined. The only case that could cause + a problem is if one constructs the source or target + complex, and those are not well defined. + Example + R = ZZ/101[a,b,c]; + C = simplicialModule(F = freeResolution coker matrix{{a^2-b^2,b^3-c^3,c^4}}, Degeneracy => true) + D = simplicialModule(G = freeResolution coker vars R, Degeneracy => true) + H = hashTable { 0 => map(D_0, C_0, 1), + 1 => map(D_1, C_1, {{1, 0, 0, 0}, {0, a, 0, 0}, {0, -b, b^2, 0}, {0, 0, -c^2, c^3}}), + 2 => map(D_2, C_2, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, a, 0, 0, 0, 0,0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0}, + {0, 0, 0, 0, -b, b^2, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3}}), + 3 => map(D_3, C_3, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, -b, b^2, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0,0, 0, 0, 0, 0, 0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0, 0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-a*c^2, a*c^3, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0,0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0, 0,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2,a*c^3, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2*c^3}}) + } + f = map(D, C, H) + assert isWellDefined f + assert isHomogeneous f + assert(degree f == 0) + assert isSimplicialMorphism f + Text + We construct two random maps of simplicial modules, + and check to see that, as should be the case, + both are well defined. + Example + g = randomSimplicialMap(D,C); --outputs are large + normalize g + assert isWellDefined g + assert not isCommutative g + Example + h = randomSimplicialMap(D,C, Cycle => true); + normalize h + assert isWellDefined h + assert isSimplicialMorphism h + Text + This method also checks the following aspects of + the data structure: + Text + @UL { + TEX "The underlying hash table has exactly the expected keys, + namely, {\\tt source, target, degree, map, cache}", + "The ring of the source and target are the same", + "The source and target are well defined simplicial modules", + "The degree is an integer", + TEX "All keys in the {\\tt map} field are integers or sequences, + in the range of the top degree of the source", + TEX "The source and target of each $f_i$ is as expected", + TEX "If the {\\tt isCommutative} key is present in the cache + table, then commutativity of the map with the face/degeneracy maps + is checked" + }@ + SeeAlso + (isWellDefined, SimplicialModule) + (isCommutative, SimplicialModuleMap) + (isSimplicialMorphism, SimplicialModuleMap) + (map, SimplicialModule, SimplicialModule, HashTable) +/// + +doc /// + Key + (source, SimplicialModuleMap) + Headline + get the source of a map of simplicial modules + Usage + C = source f + Inputs + f:SimplicialModuleMap + Outputs + C:SimplicialModule + Description + Text + Given a simplicial module map $f : C \to D$ + this method returns the simplicial module $C$. + Example + R = ZZ/101[a..d] + I = ideal(a^2, b^2, c^2) + J = I + ideal(a*b*c) + FI = simplicialModule(freeResolution I, Degeneracy => true) + FJ = simplicialModule(freeResolution J, Degeneracy => true) + f = randomSimplicialMap(FJ, FI, Cycle=>true) + source f + assert isWellDefined f + assert isSimplicialMorphism f + assert(source f == FI) + assert(target f == FJ) + Text + The face/degeneracy map in a simplicial module is considered to have type SimplicialModuleMap. + Example + kk = coker vars R + F = simplicialModule(freeResolution kk, Degeneracy => true) + source dd^F == F + target dd^F == F + degree dd^F == -1 + SeeAlso + "Making simplicial modules" + (target, SimplicialModuleMap) + (randomSimplicialMap, SimplicialModule, SimplicialModule) +/// + +doc /// + Key + (target, SimplicialModuleMap) + Headline + get the target of a map of simplicial modules + Usage + C = target f + Inputs + f:SimplicialModuleMap + Outputs + C:SimplicialModule + Description + Text + Given a simplicial module map $f : C \to D$ + this method returns the simplicial module $D$. + Example + R = ZZ/101[a..d] + I = ideal(a^2, b^2, c^2) + J = I + ideal(a*b*c) + FI = simplicialModule(freeResolution I, Degeneracy => true) + FJ = simplicialModule(freeResolution J, Degeneracy => true) + f = randomSimplicialMap(FJ, FI, Cycle=>true) + source f + assert isWellDefined f + assert isSimplicialMorphism f + assert(source f == FI) + assert(target f == FJ) + Text + The face/degeneracy map in a simplicial module is considered to have type SimplicialModuleMap. + Example + kk = coker vars R + F = simplicialModule(freeResolution kk, Degeneracy => true) + source dd^F == F + target dd^F == F + degree dd^F == -1 + SeeAlso + "Making simplicial modules" + (source, SimplicialModuleMap) + (freeResolution, Ideal) + (randomSimplicialMap, SimplicialModule, SimplicialModule) +/// + +doc /// + Key + (degree, SimplicialModuleMap) + Headline + get the degree of a map of simplicial modules + Usage + degree f + Inputs + f:SimplicialModuleMap + Outputs + :ZZ + Description + Text + A simplicial module map $f : C \to D$ of degree $d$ is a sequence of + of maps $f_i : C_i \to D_{i+d}$. + This method returns $d$. + Text + The degree of the face/degeneracy map of a simplicial module is -1 or 1, respectively. + Example + R = ZZ/101[a..d]; + I = ideal(a^2, b^2, c^2) + FI = simplicialModule(freeResolution I, Degeneracy => true) + assert(degree dd^FI == -1) + assert(degree ss^FI == 1) + Example + FJ = simplicialModule(freeResolution (I + ideal(a*b*c)), Degeneracy => true) + f = randomSimplicialMap(FJ, FI, Cycle=>true, Degree => -2); + normalize f + SeeAlso + "Basic invariants and properties" + (source, SimplicialModuleMap) + (target, SimplicialModuleMap) + (randomSimplicialMap, SimplicialModule, SimplicialModule) +/// + + +doc /// + Key + (symbol _, SimplicialModuleMap, ZZ) + (symbol _, SimplicialModuleMap, Sequence) + Headline + access individual matrices in a simplicial module map + Usage + f_i + Inputs + f:SimplicialModuleMap + i:ZZ + the degree index or a sequence + Outputs + :Matrix + the {\tt i}-th map + Description + Text + A simplicial module map $f : C \to D$ of degree $d$ is a sequence of maps $f_i : C_i \to D_{i+d}$. + This method allows one to access the individual $f_i$. + Example + S = ZZ/101[a..c]; + C = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}, Degeneracy => true) + D = simplicialModule(freeResolution coker vars S, Degeneracy => true) + f = randomSimplicialMap(D, C) + f_2 + f_0 + Text + The face/degeneracy maps of a simplicial module are instead instead by sequences $(a,b)$ of integers, + where $b \leq a$. + Example + dd^C_(2,0) + dd^C_(2,1) + dd^C_(2,2) + ss^C_(0,0) + ss^C_(1,0) + ss^C_(1,1) + Text + Indices that are outside of the top degree or range of sequences return 0 by default. + Example + topDegree f + f_-1 + f_3 + f_4 + ss^D_(2,3) + ss^D_(4,0) + SeeAlso + (symbol_, SimplicialModule, ZZ) +/// + +doc /// + Key + (isHomogeneous, SimplicialModuleMap) + Headline + whether a map of simplicial modules is homogeneous + Usage + isHomogeneous f + Inputs + f:SimplicialModuleMap + Outputs + :Boolean + that is true when $f_i$ is homogeneous, for all $i$ + Description + Text + A map of simplicial modules $f \colon C \to D$ is homogeneous + (graded) if its underlying ring is graded, and all the + component maps $f_i \colon C_i \to D_{d+i}$ are graded of + degree zero, where $f$ has degree $d$. + Example + S = ZZ/101[a,b,c,d]; + I = minors(2, matrix{{a,b,c},{b,c,d}}) + C = simplicialModule(freeResolution (S^1/I), Degeneracy => true) + assert isHomogeneous dd^C + f = randomSimplicialMap(C, C, Degree => -1) + assert isHomogeneous f + f = randomSimplicialMap(C, C, InternalDegree => 2) + Text + A map of simplicial modules may be homogeneous even if the + source or the target is not homogeneous. + Example + phi = map(S, S, {1,b,c,d}) + D = phi C + dd^D + assert not isHomogeneous dd^D + SeeAlso + "Basic invariants and properties" + isHomogeneous + (isHomogeneous, SimplicialModuleMap) + (randomSimplicialMap, SimplicialModule, SimplicialModule) +/// + + + +doc /// + Key + (components, SimplicialModuleMap) + Headline + list the components of a direct sum + Usage + components f + Inputs + f:SimplicialModuleMap + Outputs + :List + the component maps of a direct sum of maps of simplicial modules + Description + Text + A map of simplicial modules stores its component maps. + Example + S = ZZ/101[a,b,c]; + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + g1 = id_C + g2 = randomSimplicialMap(C[1], C[2], Boundary => true) + f = g1 ++ g2 + assert isWellDefined f + L = components f + L_0 === g1 + L_1 === g2 + indices f + Text + The names of the components are called indices, and are + used to access the relevant inclusion and projection maps. + Example + f^[0] + f_[0] + SeeAlso + (directSum, SimplicialModuleMap) + (components, SimplicialModule) + indices + (symbol_, SimplicialModuleMap, Array) + (symbol^, SimplicialModuleMap, Array) +/// + +doc /// + Key + (symbol*, SimplicialModuleMap, SimplicialModuleMap) + Headline + composition of homomorphisms of simplicial modules + Usage + f = h * g + Inputs + h:SimplicialModuleMap + if a ring element or integer, then we multiply the ring element + by the appropriate identity map + g:SimplicialModuleMap + Outputs + f:SimplicialModuleMap + the composition of $g$ followed by $h$ + Description + Text + If $g_i : C_i \rightarrow D_{d+i}$, and $h_j : D_j \rightarrow E_{e+j}$, + then the composition corresponds to + $f_i := h_{d+i} * g_i : C_i \rightarrow E_{i+d+e}$. In particular, + the degree of the composition $f$ is the sum of the degrees of + $g$ and $h$. + Example + R = ZZ/101[a..d] + C = simplicialModule(freeResolution coker vars R, Degeneracy => true) + 3 * dd^C + 0 * dd^C + dd^C * ss^C --if C is a well-defined simplicial object, these should all be identity maps + SeeAlso + "Making maps between simplicial modules" + "arithmetic with simplicial module maps" +/// + +doc /// + Key + (symbol ^, SimplicialModuleMap, ZZ) + Headline + the n-fold composition + Usage + f^n + Inputs + f:SimplicialModuleMap + whose source and target are the same simplicial module + n:ZZ + Outputs + :SimplicialModuleMap + the composition of $f$ with itself $n$ times. + Description + Text + A simplicial module map $f : C \to C$ can be composed with itself. + This method produces these new maps of simplicial modules. + Text + The face/degeneracy maps -- always composes with itself to give the + zero map. + Example + S = ZZ/101[a..c]; + C = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}, Degeneracy => true) + f = dd^C + f^2 + assert(source f == target f) + assert(degree f == -1) + assert(degree f^2 == -2) + Example + g = randomSimplicialMap(C, C) + g^2 + g^3 + Text + The zero-th power returns the identity map + Example + f^0 == id_(C[1]) + g^0 == id_C + Text + When $n$ is negative, the result is the $n$-fold power + of the inverse simplicial module map, if it exists. + Example + h = randomSimplicialMap(C, C) + h^-1 + assert(h * h^-1 == id_C) + h^-4 + assert(h^-4 * h^4 == id_C) + SeeAlso + (symbol^, Matrix, ZZ) +/// + +doc /// + Key + (symbol ==, SimplicialModuleMap, SimplicialModuleMap) + (symbol ==, SimplicialModuleMap, ZZ) + (symbol ==, ZZ, SimplicialModuleMap) + Headline + whether two simplicial module maps are equal + Usage + f == g + f == 0 + f == 1 + Inputs + f:SimplicialModuleMap + or 0, or 1. + g:SimplicialModuleMap + or 0, or 1. + Outputs + :Boolean + that is true when {\tt f} and {\tt g} are equal + Description + Text + Two simplicial module maps are equal if they have the same source, + the same target, and $f_i = g_i$ for all $i$. + Example + S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + f = id_C + assert(f == 1) + Text + A simplicial module map is equal to zero if all the maps are zero. + This could require computation to determine if something that + is superficially not zero is in fact zero. + Example + assert(0 * id_C == 0) + Example + g = randomSimplicialMap(C, C) + h = inducedMap(coker g, target g) + assert(h == 0) + Text + Testing whether a map is equal to 1 is a shorthand for determining + if the simplicial module map is the identity. + Although the matrices may appear to be the identity, the map is not the + identity when the source and target are not equal. + Example + g = randomSimplicialMap(C, C, InternalDegree=>1, Cycle=>true) + h = inducedMap(coker g, target g) + assert(h != 1) + Text + Testing for equality is not the same testing for isomorphism. + In particular, different presentations of a simplicial module need not be equal. + Example + D = prune image g + p = D.cache.pruningMap + p == 1 + assert(coker p == 0 and ker p == 0) + assert(prune p == 1) + SeeAlso + (symbol ==, SimplicialModule, SimplicialModule) + (symbol SPACE, SimplicialModuleMap, Array) + randomSimplicialMap + (prune, SimplicialModule) +/// + +doc /// + Key + (isCommutative, SimplicialModuleMap) + Headline + whether a simplicial module map commutes with the face/degeneracy maps + Usage + isCommutative f + Inputs + f:SimplicialModuleMap + Outputs + :Boolean + that is true when $f$ commutes with the face/degeneracy maps + Description + Text + For a simplicial module map $f : C \to D$, this method + checks whether, for all $i$, we have + $dd^D_{i} * f_i = f_{i-1} * dd^C_i$ and, if the source at target are equipped with + degeneracy maps, it also checks the equality $ss^D_{i} * f_i = f_{i+1} * ss^C_i$. + Text + We first construct a random simplicial module map which commutes with the face/degeneracy map. + Example + S = ZZ/101[a,b,c]; + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D = C ** C + isWellDefined D + f1 = prune randomSimplicialMap(D, C, Cycle => true, InternalDegree => 1); + prune normalize f1 + isCommutative oo + isCommutative f1 + assert(degree f1 == 0) + Text + We next generate a simplicial module map that is commutative and (likely) + induces a nontrivial map on homology. + Example + f2 = randomSimplicialMap(D, C, Cycle => true); + isCommutative f2 + assert(degree f2 == 0) + assert isSimplicialMorphism f2 + Text + If the @TO "debugLevel"@ is greater than zero, then + the location of the first failure of commutativity is displayed. + SeeAlso + isSimplicialMorphism + randomSimplicialMap +/// + +doc /// + Key + (isSimplicialMorphism, SimplicialModuleMap) + isSimplicialMorphism + Headline + whether a simplicial module map is a morphism of simplicial modules + Usage + isSimplicialMorphism f + Inputs + f:SimplicialModuleMap + Outputs + :Boolean + that is true when $f$ commutes with the face/degeneracy maps and has degree $0$ + Description + Text + For a simplicial module map $f : C \to D$ of degree $d$, this method + checks whether $d = 0$ and, for all $i$, we have + $dd^D_{i+d} * f_i = f_{i-1} * dd^C_i$ and if the simplicial module + also has degeneracy maps, it checks that $ss^D_{i} * f_i = f_{i+1} * ss^C_i$. + Text + We first construct a random simplicial module morphism. + Example + S = ZZ/101[a,b,c]; + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D = C ** C + f1 = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 1); + isSimplicialMorphism f1 + assert(degree f1 == 0) + Text + We next generate a complex morphism that (likely) + induces a nontrivial map on homology. + Example + f2 = randomSimplicialMap(D, C, Cycle => true); + isSimplicialMorphism f2 + assert(degree f2 == 0) + assert isSimplicialMorphism f2 + prune HH f2 + Text + If the @TO "debugLevel"@ is greater than zero, then + information about the failure is displayed. + SeeAlso + (isCommutative, SimplicialModuleMap) + randomSimplicialMap +/// + + +doc /// + Key + (symbol**, SimplicialModule, Matrix) + (symbol**, Matrix, SimplicialModule) + Headline + create the tensor product of a simplicial module and a map of modules + Usage + h = C ** f + h = f ** C + Inputs + C:SimplicialModule + over a ring $R$ + f:Matrix + defining a homomorphism from the $R$-module $M$ to the $R$-module $N$ + Outputs + h:SimplicialModuleMap + from $C \otimes M$ to $C \otimes N$ + Description + Text + For any simplicial module $C$, a map $f \colon M \to N$ of $R$-modules induces a + morphism $C \otimes f$ of simplicial modules + from $C \otimes M$ to $C \otimes N$. This method returns this map of simplicial modules. + Example + R = ZZ/101[a..d]; + I = ideal(c^2-b*d, b*c-a*d, b^2-a*c) + J = ideal(I_0, I_1) + C = simplicialModule(koszulComplex vars R, Degeneracy => true) + f = map(R^1/I, R^1/J, 1) + C ** f; + isSimplicialMorphism oo + f ** C; + isSimplicialMorphism oo + f' = random(R^2, R^{-1, -1, -1}) + C ** f'; + f' ** C; + assert isWellDefined(C ** f') + assert isWellDefined(f' ** C) + Text + Tensoring with a simplicial module defines a functor from the category + of $R$-modules to the category of simplicial modules over $R$. + Example + f'' = random(source f', R^{-2,-2}) + assert((C ** f') * (C ** f'') == C ** (f' * f'')) + assert(C ** id_(R^{-1,-2,-3}) == id_(C ** R^{-1,-2,-3})) + SeeAlso + "Making maps between simplicial modules" + (symbol**, SimplicialModule, SimplicialModule) +/// + +doc /// + Key + (symbol**, SimplicialModuleMap, SimplicialModuleMap) + (tensor, SimplicialModuleMap, SimplicialModuleMap) + (symbol**, SimplicialModule, SimplicialModuleMap) + (symbol**, SimplicialModuleMap, SimplicialModule) + (symbol**, ComplexMap, SimplicialModuleMap) + (symbol**, SimplicialModuleMap, ComplexMap) + (symbol**, Complex, SimplicialModuleMap) + (symbol**, SimplicialModuleMap, Complex) + (symbol**, SimplicialModuleMap, Module) + (symbol**, Module, SimplicialModuleMap) + Headline + the map of simplicial modules between tensor simplicial modules + Usage + h = f ** g + h = tensor(f, g) + Inputs + f:SimplicialModuleMap + g:SimplicialModuleMap + Outputs + h:SimplicialModuleMap + Description + Text + The maps $f : C \to D$ and $g : E \to F$ of simplicial modules induces the map + $h = f \otimes g : C \otimes E \to D \otimes F$ defined by $c \otimes e \mapsto f(c) \otimes g(e)$. + Example + S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D = simplicialModule((freeResolution coker matrix{{a^2,a*b,b^3}})[-1], Degeneracy => true) + f = randomSimplicialMap(D,C) + E = simplicialModule((dual C.complex)[-3], Degeneracy => true) + F = simplicialModule((dual D.complex)[-3], 3, Degeneracy => true) + g = randomSimplicialMap(F,E) + h = f ** g; + assert isWellDefined h + assert(prune source h == C ** E) + assert(prune target h == D ** F) + Text + If one argument is a SimplicialModule or Module, + then the identity map of the corresponding complex is used. + Example + fE = f ** E; + assert(fE == f ** id_E) + k = coker vars S + gk = g ** k; + Text + This routine is functorial. + Example + D' = simplicialModule((freeResolution coker matrix{{a^2,a*b,c^3}})[-1], 3, Degeneracy => true) + f' = randomSimplicialMap(D', D) + (f' * f) ** g == (f' ** g) * (f ** id_E) + (f' * f) ** g == (f' ** id_F) * (f ** g) + F' = simplicialModule(dual (freeResolution coker matrix{{a^2,a*b,a*c,b^3}})[-3], Degeneracy => true) + g' = randomSimplicialMap(F', F) + f ** (g' * g) == (f ** g') * (id_C ** g) + f ** (g' * g) == (id_D ** g') * (f ** g) + SeeAlso + (symbol**, SimplicialModule, SimplicialModule) + (randomSimplicialMap, SimplicialModule, SimplicialModule) +/// + +doc /// + Key + (truncate, List, SimplicialModuleMap) + (truncate, ZZ, SimplicialModuleMap) + Headline + truncation of a simplicial module map at a specified degree or set of degrees + Usage + truncate(d, f) + Inputs + d:List + or @TO "ZZ"@, if the underlying ring $R$ is singly graded. + f:SimplicialModuleMap + that is homogeneous over $R$ + Outputs + :SimplicialModuleMap + a simplicial module map over $R$ whose terms in the source and target + consist of all elements of component-wise degree at least {\tt d}. + Description + Text + Truncation of homogeneous (graded) maps induces a natural + operation on maps of simplicial modules. + Text + In the singly graded case, the truncation of a homogeneous + module $M$ at degree $d$ is generated by all homogeneous + elements of degree at least $d$ in $M$. The truncation of + a map between homogeneous modules is the induced map + between the truncation of the source and the truncation of + the target. This method applies this operation to each + term in a map of simplicial modules. + Example + R = QQ[a,b,c]; + C = simplicialModule(freeResolution ideal(a*b, a*c, b*c), 3, Degeneracy => true) + D = simplicialModule((freeResolution ideal(a*b, a*c, b*c, a^2-b^2))[-1], 3, Degeneracy => true) + f = randomSimplicialMap(D,C, Cycle => true) + g = truncate(3,f); + assert isWellDefined g + assert (source g == truncate(3, source f)) + assert (target g == truncate(3, target f)) + Text + Truncating at a degree less than the minimal generators + is the identity operation. + Example + assert(f == truncate(0, f)) + Text + In the multi-graded case, the truncation of a homogeneous module at + a list of degrees is generated by all homogeneous elements of degree + that are component-wise greater than or equal to at least one + of the degrees. As in the singly graded case, this induces a map between + the truncations the source and target. + Example + A = ZZ/101[x_0, x_1, y_0, y_1, y_2, Degrees => {2:{1,0}, 3:{0,1}}]; + I = intersect(ideal(x_0, x_1), ideal(y_0, y_1, y_2)) + C = simplicialModule(freeResolution I, 4, Degeneracy => true) + J = intersect(ideal(x_0^2, x_1^2), ideal(y_0^2, y_1^2, y_2^2)) + D = simplicialModule(freeResolution J, 4, Degeneracy => true) + f = simplicialModule(extend(C.complex, D.complex, id_(A^1)), 2) + g1 = prune truncate({{1,1}}, f); + g1_0 + g1_1 + g2 = truncate({{1,0}}, f); + g2_1 + g3 = truncate({{0,1}}, f); + g4 = truncate({{1,0},{0,1}}, f); + g4_1 + g5 = truncate({{2,2}}, f); + assert all({g1,g2,g3,g4,g5}, isWellDefined) + SeeAlso + "Making maps between simplicial modules" + (truncate, List, Matrix) + (truncate, List, SimplicialModule) +/// + + +doc /// + Key + (symbol SPACE, RingMap, SimplicialModuleMap) + Headline + apply a ring map to a map of simplicial modules + Usage + phi f + Inputs + phi:RingMap + whose source is a ring $R$, and whose target is a ring $S$ + f:SimplicialModuleMap + over the ring $R$ + Outputs + :SimplicialModuleMap + over the ring $S$ + Description + Text + We illustrate the image of a simplicial module map along a ring map. + Example + R = QQ[a,b,c,d]; + S = QQ[s,t]; + phi = map(S, R, {s, s+t, t, s-t}) + I = ideal(a*b, b*c, c*d) + J = I + ideal(a^2, b^2, c^2, d^2) + CI = simplicialModule(freeResolution I, 4, Degeneracy => true) + CJ = simplicialModule(freeResolution J, Degeneracy => true) + f = simplicialModule(extend(CJ.complex, CI.complex, map(CJ_0, CI_0, 1)), Degeneracy => true) + assert isWellDefined f + g = phi f + assert isWellDefined g + dd^(source g) + ss^(source g) + dd^(target g); + prune HH normalize g + SeeAlso + (symbol SPACE, RingMap, SimplicialModule) + (symbol **, RingMap, SimplicialModuleMap) +/// + +doc /// + Key + (symbol**, RingMap, SimplicialModuleMap) + (symbol**, Ring, SimplicialModuleMap) + (symbol**, SimplicialModuleMap, RingMap) + (symbol**, SimplicialModuleMap, Ring) + (tensor, RingMap, SimplicialModuleMap) + (tensor, SimplicialModuleMap, RingMap) + Headline + tensor a map of simplicial modules along a ring map + Usage + phi ** f + tensor(phi, f) + S ** f + f ** S + Inputs + phi:RingMap + whose source is a ring $R$, and whose target is a ring $S$ + f:SimplicialModuleMap + over the ring $R$ + Outputs + :SimplicialModuleMap + over the ring $S$ + Description + Text + These methods implement the base change of rings. As input, one can either + give a ring map $\phi$, or the ring $S$ (when there is a canonical map + from $R$ to $S$). + Text + We illustrate the tensor product of a map of simplicial modules along a ring map. + Example + R = QQ[a,b,c,d]; + S = QQ[s,t]; + phi = map(S, R, {s, s+t, t, s-t}) + I = ideal(a*b, b*c, c*d) + J = I + ideal(a^2, b^2, c^2, d^2) + CI = simplicialModule(freeResolution I, 4, Degeneracy => true) + CJ = simplicialModule(freeResolution J, Degeneracy => true) + f = simplicialModule(extend(CJ.complex, CI.complex, map(CJ_0, CI_0, 1)), Degeneracy => true) + assert isWellDefined f + g = phi ** f + assert isWellDefined g + dd^(source g) + ss^(source g) + dd^(target g); + simplicialModule prune HH normalize g + isSimplicialMorphism oo + SeeAlso + (symbol **, RingMap, SimplicialModule) + (symbol SPACE, RingMap, SimplicialModuleMap) +/// + +doc /// + Key + (inducedMap, SimplicialModule, SimplicialModule) + Headline + make the map of simplicial modules induced at each term by the identity map + Usage + f = inducedMap(D, C) + Inputs + C:SimplicialModule + D:SimplicialModule + Degree => ZZ + specify the degree of the map of simplicial modules, if not 0 + Verify => Boolean + if true, check that the resulting maps are well-defined + Outputs + f:SimplicialModuleMap + Description + Text + Let $d$ be the value of the optional argument {\tt + Degree}, or zero, if not given. For each $i$, the terms + $D_{i+d}$ and $C_i$ must be subquotients of the same + ambient free module. This method returns the simplicial module map + induced by the identity on each of these free modules. + + If {\tt Verify => true} is given, then this method + also checks that these identity maps induced well-defined + maps. This can be a relatively expensive computation. + Text + We illustrate this method by truncating a free resolution + at two distinct internal degrees. We check that + the various induced maps compose to give another + induced map. + Example + needsPackage "Truncations" + kk = ZZ/32003 + R = kk[a,b,c] + F = simplicialModule(freeResolution (ideal gens R)^2, 2, Degeneracy => true) + C1 = truncate(3, F); + prune normalize C1 + C2 = truncate(4, F); + prune normalize C2 + assert isWellDefined C1 + assert isWellDefined C2 + f = inducedMap(C1, C2); + prune normalize f + assert isWellDefined f + f1 = inducedMap(F, C1) + f2 = inducedMap(F, C2) + assert isWellDefined f1 + assert isWellDefined f2 + assert(f2 == f1 * f) + SeeAlso + (inducedMap, Module, Module) + "Truncations :: truncate(ZZ,SimplicialModule)" +/// + + +doc /// + Key + "arithmetic with simplicial module maps" + (symbol+, SimplicialModuleMap, SimplicialModuleMap) + (symbol+, RingElement, SimplicialModuleMap) + (symbol+, Number, SimplicialModuleMap) + (symbol+, SimplicialModuleMap, RingElement) + (symbol+, SimplicialModuleMap, Number) + (symbol-, SimplicialModuleMap) + (symbol-, SimplicialModuleMap, SimplicialModuleMap) + (symbol-, RingElement, SimplicialModuleMap) + (symbol-, Number, SimplicialModuleMap) + (symbol-, SimplicialModuleMap, RingElement) + (symbol-, SimplicialModuleMap, Number) + (symbol*, RingElement, SimplicialModuleMap) + (symbol*, Number, SimplicialModuleMap) + (symbol*, SimplicialModuleMap, RingElement) + (symbol*, SimplicialModuleMap, Number) + Headline + perform arithmetic operations on simplicial module maps + Usage + f + g + a + f + f + a + -f + f - g + a - f + f - a + a * f + Inputs + f:SimplicialModuleMap + g:SimplicialModuleMap + a:RingElement + that is, an element in the underlying ring or a number + Outputs + :SimplicialModuleMap + Description + Text + The set of simplicial module maps forms a module over the underlying @TO2((ring, SimplicialModuleMap), "ring")@. + These methods implement the basic operations of addition, subtraction, and scalar multiplication. + Example + R = ZZ/101[a..d]; + C = simplicialModule(freeResolution coker matrix{{a*b, a*c^2, b*c*d^3, a^3}}, Degeneracy => true) + D = simplicialModule(freeResolution coker matrix{{a*b, a*c^2, b*c*d^3, a^3, a*c*d}}, 3, Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true); + prune normalize f + g = randomSimplicialMap(D, C, Boundary => true); + prune normalize g + Example + f+g; + isSimplicialMorphism oo + f-g; + isSimplicialMorphism oo + -f; + 3*f; + 0*f + a*f; + assert(0*f == 0) + assert(1*f == f) + assert((-1)*f == -f) + assert(-(f-g) == g-f) + assert((a+b)*f == a*f + b*f) + assert(a*(f+g) == a*f + a*g) + assert isSimplicialMorphism (f+g) + Text + Adding or subtracting a scalar is the same as adding or subtracting the + scalar multiple of the identity. In particular, the source and target must be equal. + Example + h = randomSimplicialMap(C, C); + prune normalize h + prune normalize(h+1) + assert(h+1 == h + id_C) + assert(h+a == h + a*id_C) + assert(1-h == id_C - h) + assert(b-c*h == -c*h + b*id_C) + assert(b-h*c == -h*c + id_C*b) + SeeAlso + "Making maps between simplicial modules" + randomSimplicialMap + (map, SimplicialModule, SimplicialModule, SimplicialModuleMap) +/// + +doc /// + Key + (symbol|, SimplicialModuleMap, SimplicialModuleMap) + Headline + join or concatenate maps horizontally + Usage + f | g + Inputs + f:SimplicialModuleMap + g:SimplicialModuleMap + Outputs + :SimplicialModuleMap + Description + Text + Given simplicial module maps with the same target, + this method constructs the associated map + from the direct sum of the sources to the target. + + First, we define some non-trivial maps of simplicial modules. + Example + R = ZZ/101[a..d]; + C1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], Degeneracy => true) + C2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, Degeneracy => true) + D = simplicialModule(freeResolution coker matrix{{a^2,b^2,c*d}}, Degeneracy => true) + f = randomSimplicialMap(D, C1) + g = randomSimplicialMap(D, C2) + Example + h = f|g + assert isWellDefined h + assert(source h === source f ++ source g) + assert(target h === target f) + SeeAlso + (symbol++, SimplicialModule, SimplicialModule) + (symbol++, SimplicialModuleMap, SimplicialModuleMap) + (symbol||, SimplicialModuleMap, SimplicialModuleMap) + (symbol|, Matrix, Matrix) +/// + +doc /// + Key + (symbol||, SimplicialModuleMap, SimplicialModuleMap) + Headline + join or concatenate maps vertically + Usage + f || g + Inputs + f:SimplicialModuleMap + g:SimplicialModuleMap + Outputs + :SimplicialModuleMap + Description + Text + Given simplicial module maps with the same source, + this method constructs the associated map + from the source to the direct sum of the targets. + + First, we define some non-trivial maps of simplicial modules. + Example + R = ZZ/101[a..d]; + D1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], Degeneracy => true) + D2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, Degeneracy => true) + C = simplicialModule(freeResolution coker matrix{{a^2,b^2,c*d}}, Degeneracy => true) + f = randomSimplicialMap(D1, C) + g = randomSimplicialMap(D2, C) + Example + h = f||g + assert isWellDefined h + assert(target h === target f ++ target g) + assert(source h === source f) + SeeAlso + (symbol++, SimplicialModule, SimplicialModule) + (symbol++, SimplicialModuleMap, SimplicialModuleMap) + (symbol|, SimplicialModuleMap, SimplicialModuleMap) + (symbol||, Matrix, Matrix) +/// + +doc /// + Key + (symbol++, SimplicialModuleMap, SimplicialModuleMap) + (directSum, SimplicialModuleMap) + Headline + direct sum of simplicial module maps + Usage + h = f ++ g + h = directSum(f,g,...) + h = directSum(name1 => f, name2 => g, ...) + Inputs + f:SimplicialModuleMap + g:SimplicialModuleMap + Outputs + h:SimplicialModuleMap + that is the direct sum of the input chain simplicial module maps + Description + Text + The direct sum of two simplicial module maps is a a simplicial module map + from the direct sum of the sources to the direct sum of + the targets. + + First, we define some non-trivial maps of simplicial modules. + Example + R = ZZ/101[a..d]; + C1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], Degeneracy => true) + C2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, Degeneracy => true) + D1 = simplicialModule((freeResolution coker matrix{{a,b,c}}),2, Degeneracy => true) + D2 = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}[-1], 2, Degeneracy => true) + f = randomSimplicialMap(D1, C1, Cycle => true) + g = randomSimplicialMap(D2, C2, Cycle => true) + Example + h = f ++ g + assert isWellDefined h + assert isSimplicialMorphism h + Text + The direct sum of any sequence of simplicial module maps can be + computed as follows. + Example + directSum(f, g, f[2]) + h2 = directSum(peanut => f, butter => g, jelly => f[2]) + indices h2 + h2_[butter,jelly] + assert(source oo == C2 ++ C1[2]) + Text + One can easily obtain the compositions with canonical + injections and surjections. + Example + h_[0]^[0] == f + h_[1]^[1] == g + h_[0]^[1] == 0 + h_[1]^[0] == 0 + Example + h_[0] == h * (C1 ++ C2)_[0] + h_[1] == h * (C1 ++ C2)_[1] + h^[0] == (D1 ++ D2)^[0] * h + h^[1] == (D1 ++ D2)^[1] * h + SeeAlso + (symbol++, SimplicialModule, SimplicialModule) + (symbol**, SimplicialModuleMap, SimplicialModuleMap) + (symbol_, SimplicialModuleMap, Array) +/// + + +doc /// + Key + (image, SimplicialModuleMap) + Headline + make the image of a map of simplicial modules + Usage + E = image f + Inputs + f : SimplicialModuleMap + Outputs + E : SimplicialModule + Description + Text + If $f : C \to D$ is a map of simplicial modules of degree $d$, + then the image is the simplicial module $E$ whose $i-th$ is $image(f_{i-d})$, + and whose face/degeneracy map is induced from the face/degeneracy map + on the target. + Text + In the following example, we first construct a random + simplicial morphism $f : C \to D$. + Example + S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d),3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 0) + prune image f + prune normalize oo + i = inducedMap(forgetComplex target f, image f) + isSimplicialMorphism i + normalize i + Text + There is a canonical map of simplicial modules from the image to the target. + Example + g1 = inducedMap(target f, image f) + ker g1 == 0 + image g1 == image f + SeeAlso + "Making simplicial modules" + "Making maps between simplicial modules" + image + (coimage, SimplicialModuleMap) + (kernel, SimplicialModuleMap) + (cokernel, SimplicialModuleMap) +/// + +doc /// + Key + (coimage, SimplicialModuleMap) + Headline + make the coimage of a map of simplicial modules + Usage + coimage f + Inputs + f : SimplicialModuleMap + Outputs + : SimplicialModule + Description + Text + The coimage of a simplicial module map $f : C \to D$ + is the simplicial module $E$ whose $i-th$ term is $coimage(f_i)$, + and whose face/degeneracy map is induced from the face/degeneracy map + on the source. + Text + In the following example, we first construct a random + simplicial morphism $f : C \to D$. + Example + S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d), 3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 0) + g1 = inducedMap(coimage f, source f) + coimage g1 == coimage f + coker g1 == 0 + Caveat + The coimage is more computationally intensive than @TO (image, SimplicialModuleMap)@ + because, unlike {\tt image}, it computes kernels of maps of modules. + SeeAlso + "Making simplicial modules" + "Making maps between simplicial modules" + coimage + (image, SimplicialModuleMap) + (kernel, SimplicialModuleMap) + (cokernel, SimplicialModuleMap) +/// + +doc /// + Key + (kernel, SimplicialModuleMap) + Headline + make the kernel of a map of simplicial modules + Usage + kernel f + ker f + Inputs + f : SimplicialModuleMap + Outputs + : SimplicialModule + Description + Text + The kernel of a simplicial module map $f : C \to D$ + is the simplicial module $E$ whose $i-th$ term is $kernel(f_i)$, + and whose face/degeneracy map is induced from the face/degeneracy map + on the source. + Text + In the following example, we first construct a random + simplicial morphism $f : C \to D$. + Example + S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d), 3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Boundary => true, InternalDegree => 0) + prune ker f + h1 = inducedMap(source f, ker f) + ker f == image h1 + ker h1 == 0 + SeeAlso + "Making simplicial modules" + "Making maps between simplicial modules" + ker + (image, SimplicialModuleMap) + (coimage, SimplicialModuleMap) + (cokernel, SimplicialModuleMap) +/// + +doc /// + Key + (cokernel, SimplicialModuleMap) + Headline + make the cokernel of a map of simplicial modules + Usage + cokernel f + coker f + Inputs + f : SimplicialModuleMap + Outputs + : SimplicialModule + Description + Text + If $f : C \to D$ is a map of simplicial modules of degree $d$, + then the cokernel is the simplicial module $E$ whose $i-th$ is $cokernel(f_{i-d})$, + and whose face/degeneracy map is induced from the face/degeneracy map + on the target. + Text + In the following example, we first construct a random + simplicial morphism $f : C \to D$. + Example + S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d), 3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 0) + prune coker f + prune normalize oo + prune HH coker f + g1 = inducedMap(coker f, target f) + coker f == image g1 + coker g1 == 0 + SeeAlso + "Making simplicial modules" + "Making maps between simplicial modules" + cokernel + (image, SimplicialModuleMap) + (coimage, SimplicialModuleMap) + (kernel, SimplicialModuleMap) +/// + + +doc /// + Key + (symbol^, SimplicialModuleMap, Array) + (symbol_, SimplicialModuleMap, Array) + Headline + the composition with the canonical inclusion or projection map + Usage + i = f_[name] + p = f^[name] + Inputs + f:SimplicialModuleMap + name: + Outputs + :SimplicialModuleMap + {\tt i} is the composition of {\tt f} with the canonical inclusion and {\tt p} is + the composition of the canonical projection with {\tt f} + Description + Text + The direct sum is an n-ary operator with projection and + inclusion maps from each component satisfying appropriate + identities. + + One can access these maps as follows. First, we define + some non-trivial maps of simplicial modules. + Example + R = ZZ/101[a..d]; + C1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], 3, Degeneracy => true) + C2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, 3, Degeneracy => true) + D1 = simplicialModule((freeResolution coker matrix{{a,b,c}}), Degeneracy => true) + D2 = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}[-1], 3, Degeneracy => true) + f = randomSimplicialMap(D1, C1, Cycle => true) + g = randomSimplicialMap(D2, C2, Cycle => true) + Example + h = f ++ g; + Text + The four basic maps are the inclusion from each summand of the source + and the projection to each summand of the target. + Example + h_[0] == h * (C1 ++ C2)_[0] + h_[1] == h * (C1 ++ C2)_[1] + h^[0] == (D1 ++ D2)^[0] * h + h^[1] == (D1 ++ D2)^[1] * h + Text + These can be combined to obtain the blocks of the map of simplicial modules. + Example + h_[0]^[0] == f + h_[1]^[1] == g + h_[0]^[1] == 0 + h_[1]^[0] == 0 + Text + The default names for the components are the non-negative + integers. However, one can choose any name. + Example + h = (chicken => f) ++ (nuggets => g); + indices h + h_[chicken]^[chicken] == f + h_[nuggets]^[nuggets] == g + SeeAlso + (symbol++, SimplicialModule, SimplicialModule) + (symbol^, SimplicialModule, Array) + (symbol_, SimplicialModule, Array) + (directSum, SimplicialModule) + (components, SimplicialModule) + indices +/// + +doc /// + Key + (randomSimplicialMap, SimplicialModule, SimplicialModule) + randomSimplicialMap + [randomSimplicialMap, Boundary] + [randomSimplicialMap, Cycle] + [randomSimplicialMap, Degree] + [randomSimplicialMap, InternalDegree] + Cycle + Boundary + InternalDegree + Headline + a random map of simplicial modules + Usage + f = randomSimplicialMap(C,D) + Inputs + C:SimplicialModule + D:SimplicialModule + Boundary => Boolean + whether the constructed {\tt f} is a simplicial null homotopy + Cycle => Boolean + whether the constructed {\tt f} commutes with the face/degeneracy maps + Degree => ZZ + the degree of the constructed map of simplicial modules + InternalDegree => List + or @ofClass ZZ@ + Outputs + f:SimplicialModuleMap + Description + Text + A random simplicial module map $f : C \to D$ is obtained from choosing a random + map of the underlying normalizations, which uses the @TO randomComplexMap@ command. + Example + S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker matrix{{a*b, a*c, b*c}}, 3, Degeneracy => true) + D = simplicialModule(freeResolution coker vars S, Degeneracy => true) + f = randomSimplicialMap(D,C) + assert isWellDefined f + assert not isCommutative f + Text + When the random element is chosen with option {\tt Cycle => true}, the associated map of simplicial modules commutes + with the face/degeneracy map. + Example + g = randomSimplicialMap(D,C, Cycle => true) + assert isWellDefined g + assert isCommutative g + assert isSimplicialMorphism g + Text + When the random element is chosen with option {\tt Boundary => true}, the associated map of simplicial modules is a + simplicial null homotopy. + Example + h = randomSimplicialMap(D,C, Boundary => true) + assert isWellDefined h + assert isCommutative h + assert isSimplicialMorphism h + assert isNullHomotopic normalize h + nullHomotopy normalize h + Text + When the degree of the random element is chosen with specific degree, + the associated map of simplicial modules will be a well-defined degree 0 simplicial + morphism mapping to the Dold-Kan image of the shift of the normalization. Thus, + even when specifying nonzero degree this constructor will still yield a simplicial + morphism. + Example + p = randomSimplicialMap(D, C, Cycle => true, Degree => -1) + assert isWellDefined p + assert isCommutative p + assert isSimplicialMorphism p + Text + Given an internal degree, the random element is constructed as maps of modules with this degree. + Example + q = randomSimplicialMap(D, C, Boundary => true, InternalDegree => 2); + assert isCommutative q + assert isSimplicialMorphism q + source q === C + target q === D + assert isNullHomotopic normalize q +/// + + +doc /// + Key + (isShortExactSequence, SimplicialModuleMap, SimplicialModuleMap) + Headline + whether a pair of simplicial module maps forms a short exact sequence + Usage + isShortExactSequence(g, f) + Inputs + f:SimplicialModuleMap + g:SimplicialModuleMap + Outputs + :Boolean + that is @TO true@ if these form a short exact sequence + Description + Text + A short exact sequence of simplicial modules + \[ 0 \to B \xrightarrow{f} C \xrightarrow{g} D \to 0\] + consists of two morphisms of simplicial modules + $f \colon B \to C$ and $g \colon C \to D$ such that + $g f = 0$, $\operatorname{image} f = \operatorname{ker} g$, + $\operatorname{ker} f = 0$, and $\operatorname{coker} g = 0$. + Text + From a simplicial morphism $h \colon B \to C$, one obtains a + short exact sequence + \[ 0 \to \operatorname{image} h \to C \to \operatorname{coker} h \to 0. \] + Example + R = ZZ/101[a,b,c]; + B = simplicialModule(freeResolution coker matrix{{a^2*b, a*b*c, c^3}}, Degeneracy => true) + C = simplicialModule(freeResolution coker vars R, 2, Degeneracy => true) + h = randomSimplicialMap(C, B, Cycle => true) + f = inducedMap(C, image h) + g = inducedMap(coker h, C) + assert isShortExactSequence(g,f) + Text + A short exact sequence of modules gives rise to a short + exact sequence of simplicial modules. These simplicial modules arise + as free resolutions of the modules. + Example + I = ideal(a^3, b^3, c^3) + J = I + ideal(a*b*c) + K = I : ideal(a*b*c) + SES = complex{ + map(comodule J, comodule I, 1), + map(comodule I, (comodule K) ** R^{-3}, {{a*b*c}}) + } + assert isWellDefined SES + assert isShortExactSequence(dd^SES_1, dd^SES_2) + (g,f) = (horseshoeResolution SES)/simplicialModule; + assert isShortExactSequence(g,f) + SeeAlso + "Basic invariants and properties" +/// + +doc /// + Key + (symbol SPACE, SimplicialModule, Array) + (symbol SPACE, SimplicialModuleMap, Array) + Headline + shift a simplicial module or simplicial module map + Usage + D = C[i] + g = f[i] + Inputs + C:SimplicialModule + or {\tt f}, a @TO SimplicialModuleMap@ + :Array + {\tt [i]}, where {\tt i} is an integer + Outputs + D:SimplicialModule + or {\tt g}, a @TO SimplicialModuleMap@. + Description + Text + The shifted simplicial module $D$ is not as simple to define as the + shift in the category of chain complexes. This method naively normalizes the + given simplicial module/map, applies the shift in the category of chain complexes, + then applied the Dold-Kan functor to the result. + + As the following example shows, this is not the same thing as simply shifting + all terms of the simplicial module. + Example + S = ZZ/101[a..d] + D = simplicialModule(S^1, 5) + D[-1] + oo.dd + D[-2] + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + dd^C_(3,0) + ss^C_(2,0) + D = C[1] + assert isWellDefined D + dd^D_(2,0) + ss^D_(1,0) + Text + Notice that the face maps of the shifted simplicial module are not simply the negation + of the face maps of the original. The shift operator is functorial, as illustrated below. + Example + C2 = simplicialModule(freeResolution (S^1/(a^2, b^2, c^2, d^2)), Degeneracy => true) + C3 = simplicialModule(freeResolution (S^1/(a^2, b^3, c^4, d^5)), Degeneracy => true) + f2 = simplicialModule(extend(C.complex, C2.complex, map(C_0, C2_0, 1))); + f3 = simplicialModule(extend(C2.complex, C3.complex, map(C2_0, C3_0, 1))); + isWellDefined (f2[-1]) + isSimplicialMorphism (f2[-1]) + isSimplicialMorphism (f3[-2]) + SeeAlso + "Making simplicial modules" +/// + +doc /// + Key + (directSum, SimplicialModule) + (symbol++, SimplicialModule, SimplicialModule) + Headline + direct sum of simplicial modules + Usage + D = C1 ++ C2 + D = directSum(C1,C2,...) + D = directSum(name1 => C1, name2 => C2, ...) + Inputs + Ci:SimplicialModule + Outputs + D:SimplicialModule + the direct sum of the input simplicial modules + Description + Text + The direct sum of two simplicial modules is another simplicial module. + Example + S = ZZ/101[a,b,c]; + C1 = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D1 = C1 ++ simplicialModule(complex(S^13)[-2], 3, Degeneracy => true) + isWellDefined D1 + D1.?ss --knows to cache degeneracy maps if inputs have degeneracy maps + C2 = simplicialModule(ideal(a,b,c), 3, Degeneracy => true) + C1 ++ C2 + assert isWellDefined(C1 ++ C2) + Text + The direct sum of a sequence of simplicialModule can be computed as follows. + Example + C3 = directSum(C1,C2,C2[-2]) + assert isWellDefined C3 + Text + The direct sum is an n-ary operator with projection and + inclusion maps from each component satisfying appropriate + identities. + Example + C4 = directSum(first => C1, second => C2) + C4_[first] -- inclusion map C1 --> C4 + C4^[first] -- projection map C4 --> C1 + C4^[first] * C4_[first] == 1 + C4^[second] * C4_[second] == 1 + C4^[first] * C4_[second] == 0 + C4^[second] * C4_[first] == 0 + C4_[first] * C4^[first] + C4_[second] * C4^[second] == 1 + Text + There are two short exact sequences associated to a direct sum. + Example + isShortExactSequence(C4^[first], C4_[second]) + isShortExactSequence(C4^[second], C4_[first]) + Text + Given a simplicial module which is a direct sum, we obtain the component + simplicial complexes and their names (indices) as follows. + Example + components C3 + indices C3 + components C4 + indices C4 + SeeAlso + (components,SimplicialModule) + indices + (symbol^, SimplicialModule, Array) + (symbol_, SimplicialModule, Array) + (isShortExactSequence, SimplicialModuleMap, SimplicialModuleMap) +/// + + + +doc /// + Key + (isSimplicialModule, SimplicialModule) + isSimplicialModule + Headline + check if the simplicial identities hold for a simplicial object with degeneracy map keys + Usage + isSimplicialModule(S) + Inputs + S:SimplicialModule + A simplicial module with face maps `dd` and degeneracy maps `ss`. + Outputs + :Boolean + true if the simplicial identities hold, false otherwise + Description + Text + This function checks if the simplicial identities hold for a given simplicial object `S` with face maps `dd` and degeneracy maps `ss`. The simplicial identities are a set of equations that need to be satisfied by the face and degeneracy maps of the simplicial object. + Text + Specifically, the function verifies the following identities: + 1. For face maps: + \[ d_j d_i = d_i d_{j-1} \text{ for } 0 \leq i < j \leq n \] + 2. For face and degeneracy maps: + \[ d_i s_j = s_{j-1} d_i \text{ for } i < j \] + \[ d_j s_j = \text{id} \] + \[ d_{j+1} s_j = \text{id} \] + \[ d_k s_j = s_j d_{k-1} \text{ for } k > j+1 \] + 3. For degeneracy maps: + \[ s_j s_i = s_i s_{j+1} \text{ for } i \leq j \] + Text + If any of these identities fail, the function returns `false`. If all identities are satisfied, the function returns `true`. + Example + R = QQ[a..d]; + f0 = matrix {{-b^2+a*c, b*c-a*d, -c^2+b*d}} + f1 = map(source f0,, {{d, c}, {c, b}, {b, a}}) + C = simplicialModule(complex {f0, f1}, 3, Degeneracy => true) + isSimplicialModule C + dd^C + ss^C + dd^C*ss^C --if C is simplicial, this should be all identity maps + Text + The zero simplicial module is well-defined. + Example + C = simplicialModule(R^0, 6, Degeneracy => true) + isSimplicialModule C + SeeAlso + isWellDefined +/// + + +doc /// + Key + (forgetComplex, SimplicialModule) + forgetComplex + RememberSummands + Headline + forget the underlying complex data of a simplicial module obtained as a Dold-Kan image + Usage + forgetComplex(S) + Inputs + S:SimplicialModule + A simplicial module, which is assumed to be obtained as a Dold-Kan image. + RememberSummands => Boolean + Default value is true. Indicates whether to remember the component summands of the simplicial module when creating the new simplicial module. + Outputs + :SimplicialModule + A new simplicial module that has no longer is no longer viewed as a Dold-Kan image of some complex + Description + Text + This function removes the data of the underlying complex from a simplicial module $S$ that is obtained as a Dold-Kan image. + The function checks if the simplicial module has an associated complex and, if so, it reconstructs the simplicial module without the complex data + while preserving the face and degeneracy maps. + Text + If the option `RememberSummands` is set to true (the default), the function will remember the summands + of the simplicial module when reconstructing it. The face and degeneracy maps of the original simplicial module + are preserved in the new simplicial module. + This function is good for testing that the normalization of the Dold-Kan functor recovers the original complex, + since the @TO normalize@ command by default first checks if a simplicial module is obtained as a Dold-Kan image + before attempting a more costly computation. + Example + R = ZZ/101[x_1..x_3]; + K = koszulComplex vars R + S = simplicialModule(K,4, Degeneracy => true) + S.?complex + fS = forgetComplex S + components fS_3 + ffS = forgetComplex(S, RememberSummands => false) + components ffS_3 + Kn = normalize fS + Knn = normalize ffS + Kn.dd + K == prune Kn + SeeAlso + normalize + forgetDegeneracy +/// + + + +doc /// + Key + (forgetDegeneracy, SimplicialModule) + forgetDegeneracy + Headline + forget the data of degeneracy maps of a simplicial object + Usage + forgetDegeneracy(S) + Inputs + S:SimplicialModule + A simplicial module whose degeneracy maps are to be forgotten. + Outputs + :SimplicialModule + The simplicial module S, but with no degeneracy maps stored. + Description + Text + This function removes the data of degeneracy maps from a simplicial module `S`. + It is useful when the user wants to ignore degeneracy maps for the purpose of speeding up computations or simplifying the simplicial object. + Example + Q = ZZ/101[a..d] + K = koszulComplex vars Q + S = simplicialModule(K, 6, Degeneracy => true) + elapsedTime S**S + fS = forgetDegeneracy S + elapsedTime fS**fS --faster when degeneracy is ignored + Text + The change in speed becomes much more noticeable as ranks get larger. + SeeAlso + forgetComplex +/// + + + + +doc /// + Key + tensorwithComponents + (tensorwithComponents, Module, Module) + (tensorwithComponents, Matrix, Matrix) + (tensorwithComponents, List) + Headline + compute the tensor product of direct summands, caching the components for easy access + Usage + tensorwithComponents(M, N) + Inputs + M:Module + N:Module + Two modules whose tensor product of direct summands is to be computed. + Outputs + :Module + The tensor product of M and N, with cached components for easier access + Description + Text + This function computes the tensor product of two modules M and N, but additionally caches the components based on the component indices of the original modules. + This caching is particularly useful for easily accessing induced maps on components of tensor products of direct sums. + Text + If M and N have cached index components, then this function will use those indices. This function + is mostly used to extracting components of the simplicial tensor product, since the full + face/degeneracy maps are typically much too large to be displayed on their own. + Example + Q = ZZ/101[a..b] + M = Q^2++Q^3 + N = Q^3++Q^4 + components(M**N) --all components of M and N have been forgotten + T = tensorwithComponents(M,N) + components T + indices T + Text + This method also works for lists of modules, for purposes of iterating: + Example + tensorwithComponents {M,M,M} + indices oo + Text + This method is also functorial, which makes it easy to restrict maps + to tensor summands: + Example + L = directSum {Q^2, Q^3, Q^4} + f = L_[0,2] + phi = tensorwithComponents(f, f) + phi^[{0,2}]_[{0,1}] +/// + + + +doc /// + Key + (naiveNorm, SimplicialModule, ZZ) + (naiveNorm, SimplicialModule) + (naiveNorm, Complex, ZZ) + naiveNorm + Headline + compute the naive normalization of a simplicial object + Usage + naiveNorm(S, n) + Inputs + S:SimplicialModule + A simplicial module or @TO Complex@ + n:ZZ + and an integer n specifying the top degree for normalization. + Outputs + :Complex + The naive normalization complex of S, where the differential is the alternating sum of face maps. + Description + Text + This function computes the naive normalization of a simplicial object S. The naive normalization is a complex built from the modules of the simplicial object, + with a differential that is the alternating sum of the face maps. In general the naive normalization + is homotopy equivalent to the normalization (see @TO normalize@), but is much bigger in general. + Example + Q = ZZ/101[a..d] + K = koszulComplex vars Q + S = simplicialModule(K, Degeneracy => true) + nK = naiveNorm(S) + isWellDefined nK + prune HH nK + Text + Note that in the above, the naive normalization will always be an infinite complex, + so there will always be extraneous homology at the tail end. Note in this case that + the homology of the naive normalization is precisely the homology of {\tt K}, as it should + be (in fact, it is homotopy equivalent to {\tt K}). + SeeAlso + normalize +/// + + + +doc /// + Key + schurMap + (schurMap, List, SimplicialModule) + (schurMap, List, SimplicialModuleMap) + (schurMap, List, Complex) + (schurMap, List, ComplexMap) + TopDegree + Headline + construct the Dold-Puppe extension of the Schur functor + Usage + schurMap(lambda, S, Options => {Degeneracy => false, TopDegree => null}) + Inputs + lambda: List + A list representing a partition. + S: SimplicialModule + or @TO SimplicialModuleMap@, or @TO Complex@, or @TO ComplexMap@ to apply the Schur functor extension. + Degeneracy => Boolean + Default value is false. Indicates whether to include degeneracy maps in the construction. + TopDegree => ZZ + Default is null. If provided, specifies the top degree for the construction of the simplicial module. + Outputs + : SimplicialModule + The Dold-Puppe extension of the Schur functor applied to the simplicial module S. + Description + Text + This function constructs the Dold-Puppe extension of the Schur functor to the category of simplicial modules, + applied to a simplicial module S or a complex (or maps thereof). The construction involves + creating a simplicial module where each component is a Schur functor applied to the corresponding component of S. + Text + By default, degeneracy maps are not computed in this method since it adds additional computation time + that is not necessary for computing the normalization or many of invariants of interest. However, + if the user is interested in having degeneracy maps, use the option {\tt Degeneracy => true}. + Example + Q = ZZ/101[a..b] + K = koszulComplex vars Q; + S = simplicialModule(K, 4, Degeneracy => true) + S2S = elapsedTime schurMap({2}, S) + elapsedTime schurMap({2}, S, Degeneracy => true) + Text + In general, if a polynomial functor has degree $d$, the Dold-Puppe extension of a functor + applied to a chain complex of length $t$ will have length at most $d \cdot t$. We can see this + explicitly in the following example: + Example + S = simplicialModule(K, 5) + S2 = schurMap({2}, S) + prune normalize S2 --notice the output has length 4 + minimize oo + Text + If the input is a complex, then the default top degree is taken to be the degree of the + Schur functor multiplied by the length of the complex. Computationally, this upper bound + is often too big to be computed at the moment, so the user may need to specify a top degree + by using the {\tt TopDegree => d} option. + Example + Q = ZZ/101[a..c] + K = koszulComplex vars Q; + S2K = elapsedTime prune schurMap({2}, K, TopDegree => 4) + (minimize S2K).dd --ignore the last differential + --S21K = elapsedTime prune schurMap({2,1}, K, TopDegree => 3) --top degree 4 takes ~1 minute + Text + These functors are particularly interesting in the modular setting, ie, when the characteristic + of the underlying field is small relative to the degree of the Schur functor. In this case, + the induced complexes will have different homotopy classes as the characteristic varies. + Example + needsPackage "ChainComplexOperations" + Q = ZZ/2[a,b] + K = koszulComplex vars Q; + S2K = minimize prune schurMap({2}, K) + S2K' = sym2(chainComplex K) --the "naive" sym2 functor + S2K.dd + S2K'.dd + prune HH S2K + prune HH S2K' --not quasi-isomorphic! + Q = ZZ/3[a,b]; + K = koszulComplex vars Q; + prune HH schurMap({2}, K) + prune HH complex sym2(chainComplex K) --quasi-isomorphic in all other characterisics + --S3K = elapsedTime minimize prune schurMap({3}, K) --takes 23 seconds + --S21K = elapsedTime minimize prune schurMap({2,1}, K) --takes 17 seconds + --S21K.dd + --prune HH S21K + Text + This method is also implemented in a functorial way. + Example + Q = ZZ/2[a,b] + K = koszulComplex vars Q; + F = freeResolution( (ideal vars Q)^2) + phi = extend(K, F, id_(K_0)) + f = elapsedTime prune schurMap({2}, phi) + isCommutative f + isWellDefined f + prune HH source f + prune HH target f + prune HH f + Caveat + As many of the above examples show, this method can quickly become + computationally infeasible when the modules in the complex have too big of rank. + This seems to stem more from the efficiency of the @TO schur@ method, since methods such + as the tensor product still run very quickly even with huge matrices. + SeeAlso + extPower + simplicialTensor + symmetricQuotient +/// + + + +doc /// + Key + extPower + (extPower, ZZ, SimplicialModule) + (extPower, ZZ, SimplicialModuleMap) + (extPower, ZZ, Complex) + (extPower, ZZ, ComplexMap) + Headline + compute the Dold-Puppe extension of the exterior power functor to simplicial modules + Usage + extPower(d, S, Options => {Degeneracy => false, TopDegree => null}) + Inputs + d: ZZ + An integer representing the degree of the exterior power. + S: SimplicialModule + A simplicial module to which the exterior power functor extension is applied. + Degeneracy => Boolean + Default value is false. Indicates whether to include degeneracy maps in the construction. + TopDegree => ZZ + Default is null. If provided, specifies the top degree for the construction of the simplicial module. + Outputs + : SimplicialModule + The Dold-Puppe extension of the exterior power functor applied to the simplicial module S. + Description + Text + This function computes the Dold-Puppe extension of the exterior power functor to the category of chain complexes. + It can be applied to a simplicial module, a complex, or maps thereof. This method is equivalent + to using @TO schurMap@ for the partition $(1, 1, \dots , 1)$, but is generally much faster. + Example + Q = ZZ/2[a,b] + K = koszulComplex vars Q + w3K = elapsedTime prune extPower(3, K) + --elapsedTime prune schurMap({1,1,1}, K) --takes much longer + (minimize w3K).dd + prune HH w3K + Text + This method is also implemented in a functorial way: + Example + F = freeResolution( (ideal vars Q)^2) + phi = extend(K, F, id_(K_0)) + f = elapsedTime prune extPower(2, phi) + prune HH f + Text + Since this method runs significantly faster than using {\tt schurMap}, we can compute the + full exterior power complex of a longer complex: + Example + Q = ZZ/2[a..c]; + K = koszulComplex vars Q + --w2K = elapsedTime prune extPower(2, K) + --(minimize w2K).dd + --prune HH w2K --has more interesting homology than in the nonmodular case + needsPackage "ChainComplexOperations" + Q = ZZ/3[a..c] + K = koszulComplex vars Q + prune HH wedge2(chainComplex K) --notice: homology concentrated in odd degrees + Caveat + This method may take a very long time to run if the user inputs a large/long complex. + Use the option {\tt TopDegree => d} to only run the computation up to a certain degree. + SeeAlso + schurMap + exteriorInclusion + symmetricQuotient + simplicialTensor +/// + + + +doc /// + Key + simplicialTensor + (simplicialTensor, List) + (simplicialTensor, Complex, Complex) + (simplicialTensor, ComplexMap, ComplexMap) + (simplicialTensor, ZZ, Complex) + (simplicialTensor, ZZ, SimplicialModule) + Headline + compute the simplicial tensor product and cache direct sum indices for easy access + Usage + simplicialTensor(T, Options => {Degeneracy => false, TopDegree => null}) + Inputs + T: List + A list of simplicial modules or complexes to compute the tensor product. + Degeneracy => Boolean + Default value is false. Indicates whether to include degeneracy maps in the construction. + TopDegree => ZZ + Default is null. If provided, specifies the top degree for the construction of the simplicial module. + Outputs + : SimplicialModule + The simplicial tensor product of the components in T, with cached direct sum indices. + Description + Text + This function computes the simplicial tensor product of a list T, which can consist of simplicial modules or complexes. + It caches direct sum indices using @TO tensorwithComponents@ so that the user can easily access + components of the resulting face/degeneracy maps on particular direct summands of the tensor product. + + The simplicial tensor product of complexes is built as the Dold-Kan extension of the tensor product + functor on the category of R-modules. In general, this complex looks quite different from the + standard tensor product of complexes. In fact, the simplicial tensor product is always homotopy + equivalent to the classically defined tensor product. + Example + Q = ZZ/101[x_1,x_2]; + K1 = complex {matrix{{x_1}}}; + K2 = complex {matrix{{x_2}}}; + T1 = K1**K2 + T1.dd + T2 = prune simplicialTensor({K1,K2}) + T2.dd + phi1 = extend(T1,T2,id_(T1_0)) + phi2 = extend(T2,T1,id_(T1_0)) + phi1*phi2 == id_T1 + isNullHomotopic(phi2*phi1 - id_T2) + Text + Here is how to access specific components of the face maps for a tensor product of simplicial + modules: + Example + S1 = simplicialModule(K1, 4) + S2 = simplicialModule(K2, 4) + S12 = S1**S2 + indices S12_4 --lists the indices of the summands + netList flatten for i in indices S12_4 list ( + for j in indices S12_3 list ( if (dd^S12_(4,0))_[i]^[j]==0 then continue else + horizontalJoin {net (dd^S12_(4,0))_[i]^[j], " : ", net i, " --> " , net j} )) + Text + One reason for using the simplicial tensor product + is that its components as a simplicial module are more canonically built, and thus naturally + extend functorial maps on the category of R-modules to the category of chain complexes. + + We can see actually see this in an example. The exterior power functor admits a canonical + comultiplication map + $$\bigwedge^{i+j} \to \bigwedge^i \otimes \bigwedge^j.$$ + This means that for any chain complex $C$ there is a canonical inclusion of complexes + $$\bigwedge^{i+j} C \hookrightarrow \bigwedge^i C \otimes \bigwedge^j C.$$ + Constructing this inclusion directly using the naive definition of the exterior power functor + on complexes would be extremely unnatural, but filtering through the simplicial category + makes this a very easy task: + Example + Q = ZZ/101[a,b]; + K = koszulComplex vars Q + SK = simplicialModule(K,6) --want top degree 6 since the resulting complexes should have length 6 + w21K = extPower(2, SK) ** SK + w3K = extPower(3, SK) + H = hashTable for i from 0 to 6 list i => dual wedgeProduct(2,1, dual SK_i); + inclusion = map(w21K, w3K, H); + isWellDefined inclusion + isCommutative inclusion + prune ker inclusion --should be 0 since it is an inclusion + S21' = chainComplex { matrix {{a, b, 0, 0, -b}, {0, 0, a, b, a}}, matrix {{-b, b, 0, 0, + b, 0}, {a, -a, 0, 0, 0, b}, {0, 0, -b, b, -a, 0}, {0, 0, a, -a, 0, -a}, {0, 0, 0, 0, a, b}}, + matrix {{a, b, 0, -b, -b}, {a, b, 0, 0, -2*b}, {0, a, b, a, 0}, {0, a, b, 0, a}, {0, 0, 0, + -b, b}, {0, 0, 0, a, -a}}, matrix {{3*b, 0}, {-a, 2*b}, {0, -3*a}, {a, b}, {a, b}}} + S21 = complex(S21')[-1] --this is the S^(2,1) schur functor; note the ranks + prune HH S21 --note the homology + Text + Just for sake of illustration, let us see how the above example changes in the modular + setting; note that the only characteristic for which the inclusion + $$\bigwedge^3 \hookrightarrow \bigwedge^2 \otimes \bigwedge^1$$ + is not canonically split is for characteristic 3, so we should expect the Dold-Kan + extension of the Schur functor $\mathbb{S}^{(2,1)} (K)$ to look different in characteristic 3. + (the resulting minimization of $\mathbb{S}^{(2,1)} (K)$ should not have coefficients, for instance). + Example + Q = ZZ/3[a,b]; + K = koszulComplex vars Q + SK = simplicialModule(K,6) --want top degree 6 since the resulting complexes should have length 6 + w21K = extPower(2, SK) ** SK + w3K = extPower(3, SK) + H = hashTable for i from 0 to 6 list i => dual wedgeProduct(2,1, dual SK_i); + inclusion = map(w21K, w3K, H); + --inc = prune normalize inclusion; + --next commands are commented out since they are longer computations + --S21K = prune coker inc --the char 3 simplicial schur functor + --(minimize S21K).dd --complex is longer! All other cases have ranks (2,5,6,5,2) + --prune HH S21K --more homology as well! + Text + Note that the above method of computing the Schur functor $\mathbb{S}^{(2,1)} (K)$ is + significantly faster than the {\tt schurMap} command. + + This method is also implemented functorially, so it can be applied to simplicial maps + and complex maps. + Example + F = freeResolution( (ideal vars Q)^2) + phi = extend(K, F, id_(K_0)) + prune simplicialTensor(phi, phi) + Caveat + The user should remember to prune the output upon normalizing a simplicial + tensor product. + SeeAlso + extPower + symmetricQuotient +/// + + + +doc /// + Key + normalize + (normalize, SimplicialModule, ZZ) + (normalize, SimplicialModule) + (normalize, SimplicialModuleMap, ZZ) + (normalize, SimplicialModuleMap) + CheckSum + CheckComplex + Headline + normalization functor from simplicial modules to nonnegatively-graded chain complexes + Usage + normalize(S, d, Options => {CheckSum => true, CheckComplex => true}) + Inputs + S: SimplicialModule + or @TO SimplicialModuleMap@, the object to be normalized. + d: ZZ + An integer specifying the degree up to which the normalization should be computed. + CheckSum => Boolean + Default value is true. If true and S has more than one component, computes the direct sum of normalized components. + CheckComplex => Boolean + Default value is true. If true and S contains a cached simplicial module or map, it outputs this cached value. + Outputs + : Complex + or @TO ComplexMap@, the normalized nonnegatively-graded chain complex resulting from the normalization process. + Description + Text + This function computes the normalization functor from the category of simplicial modules + to the category of nonnegatively-graded chain complexes. It is implemented in a functorial way, + applying both to simplicial modules and simplicial module maps. + + The normalization of a simplicial module $S$ is by definition equal to the complex $N (S)$ with: + $$N(S)_n := \bigcap_{i=1}^n \ker d^S_{(n,i)},$$ + with differential induced by the face map $d_{(n,0)}^S$. As currently implemented, the normalization + does not prune the output; the user should use {\tt prune} to obtain the best looking output. + + The {\tt normalize} command is implemented so that it first checks whether a simplicial module + has been obtained as the Dold-Kan image of some complex. If it has, then it returns that complex + without doing any additional computation. If the user prefers that the normalization is computed + by definition instead of accessing this cached value, use the option {\tt CheckComplex => false}. + Example + R = ZZ/101[x_1..x_3]; + K = koszulComplex vars R + S = simplicialModule(K,10, Degeneracy => true) + keys S + K == normalize S + Kn = normalize(S, CheckComplex => false) + Kn.dd + K == Kn + K == prune Kn + Text + For computational efficiency, this method also checks if the simplicial module has been constructed as a direct sum of simplicial + modules. If it has, then it returns the direct sum of the normalizations of each component. If the + user prefers that this shortcut is not taken, use {\tt CheckSum => false}. + Example + S10 = directSum toList(10: forgetComplex S) + elapsedTime prune normalize S10 + elapsedTime prune normalize(S10, CheckSum => false) --about 3-4 times slower; becomes significant for larger ranks + Text + The user may also specify the top homological degree to compute the normalization up to. Note that + this can help speed up computational time; if the user knows the normalization should have + a shorter length, then they should specify this upper bound in the syntax: + Example + elapsedTime prune normalize(S10, 3, CheckSum => false) --MUCH FASTER! + Text + Again, this method is functorial, and when combined with other methods in this package + can be a particularly power way of obtaining nontrivial morphisms of complexes. We use this + method to obtain the image of the inclusion + $$\bigwedge^3 K \to bigwedge^2 K \otimes K$$ + for a Koszul complex K. Constructing this map directly using the naive definitions of + tensor products/exterior powers of complexes is not possible in full generality. Taking + advantage of the Dold-Kan correspondence and simplicial methods allows us to obtain + this inclusion explicitly. + Example + Q = ZZ/3[a,b]; + K = koszulComplex vars Q + SK = simplicialModule(K,6) --want top degree 6 since the resulting complexes should have length 6 + w21K = extPower(2, SK) ** SK + w3K = extPower(3, SK) + H = hashTable for i from 0 to 6 list i => dual wedgeProduct(2,1, dual SK_i); + inclusion = map(w21K, w3K, H); + inc = prune normalize(inclusion,3); + isWellDefined inc + isCommutative inc + Text + Taking the cokernel of the above morphism yields a canonically + defined Schur functor $\mathbb{S}^{(2,1)} (K)$; constructing this complex + using the classical Schur complex definition will yield a complex that does not + have finite length homology (and hence isn't even homotopically equivalent). + Example + S21K = prune coker inc --this is only a snapshot; should go up to degree 6 + (minimize S21K).dd + prune HH S21K --free part is because we truncated + SeeAlso + (directSum, SimplicialModule) + naiveNorm + extPower + simplicialTensor +/// + + +doc /// + Key + exteriorInclusion + (exteriorInclusion, SimplicialModule) + (exteriorInclusion, Complex, ZZ) + (exteriorInclusion, Complex) + (exteriorInclusion, Module) + Headline + computes the image of the 2nd exterior power into the tensor product + Usage + exteriorInclusion(S) + Inputs + M:SimplicialModule + or @TO Complex@ or @TO Module@, optional integer argument specifies top degree + Outputs + :SimplicialModuleMap + or @TO Matrix@, the map representing the image of the 2nd exterior power of $S$ into the tensor product $S \otimes S$. + Description + Text + Given a simplicial module $S$ (or a complex), this function computes the map + $$\bigwedge^2 S \to S \otimes S,$$ + The cokernel of + this map is by definition the second symmetric power of $S$. This method + is main used in conjunction with the @TO tensorLES@ command to compute induced + maps on homology for canonical short exact sequences. + Example + Q = ZZ/101[a,b,c] + K = koszulComplex vars Q + --elapsedTime schurMap({2}, K) --takes some time + phi = elapsedTime exteriorInclusion(K,3); --specify top degree 3 + isWellDefined phi + isCommutative phi + prune coker phi + Text + All of the homology of the second symmetric/exterior powers are guaranteed to be concentrated + in degrees $0$ to $3$ in the above example, so it suffices to compute only $4$ terms to + understand all of the homology. + Example + for i to 3 list prune HH_i source phi + for i to 3 list prune HH_i (coker phi) + Text + Notice that since the tensor square splits outside of characteristic 2, the symmetric power + picks up the even degree homology and the exterior square picks up the odd homology. In + characteristic 2 this changes: + Example + Q = ZZ/2[a,b,c] + K = koszulComplex vars Q + phi = elapsedTime exteriorInclusion(K,3); --specify top degree 3 + isWellDefined phi + isCommutative phi + for i to 2 list prune HH_i source phi + for i to 2 list prune HH_i (coker phi) + SeeAlso + symmetricQuotient + extPower + simplicialTensor +/// + + + + +doc /// + Key + symmetricQuotient + (symmetricQuotient, SimplicialModule) + (symmetricQuotient, Complex, ZZ) + (symmetricQuotient, Complex) + (symmetricQuotient, Module) + Headline + computes the image of the surjection from the simplicial tensor product onto the second symmetric power of a simplicial module + Usage + symmetricQuotient(S) + Inputs + S: SimplicialModule + or @TO Complex@ or @TO Module@, optional integer argument specifies top degree + Outputs + : SimplicialModuleMap + The induced map representing the image of the surjection from the simplicial tensor product onto the second symmetric power of S. + Description + Text + This function computes the induced map on the cokernel of the map constructed by + the @TO exteriorInclusion@ method, which is explicitly giving the map + $$S \otimes S \to \operatorname{Sym}^2 (S).$$ + Let us see some examples: + Example + Q = ZZ/2[a,b]; + K = koszulComplex vars Q; + phi = prune symmetricQuotient(K,4) + isWellDefined phi + isCommutative phi + prune coker phi == 0 + prune HH phi + prune coker oo --the induced map on homology is NOT surjective, in contrast to the case when 2 is a unit + SeeAlso + tensorLES + exteriorInclusion + simplicialTensor +/// + + + + +doc /// + Key + tensorLES + (tensorLES, Complex, ZZ) + Headline + computes the long exact sequence of homology induced by the canonical short exact sequence of complexes + Usage + tensorLES(C, d) + Inputs + C: Complex + A complex. + d: ZZ + An integer specifying the top degree for constructing the simplicial module. + Outputs + : Complex + The long exact sequence of homology induced by the canonical short exact sequence \( 0 \to \wedge^2 C \to T^2 C \to Sym^2 C \to 0 \). + Description + Text + This function computes the long exact sequence of homology associated with the canonical short exact sequence of complexes: + \( 0 \to \bigwedge^2 C \to C \otimes C \to operatorname{Sym}^2 C \to 0 \). + Text + This function first computes the exterior inclusion map on the complex C up to degree d using the @TO exteriorInclusion@ function. + Then it constructs the induced map on the cokernel of this exterior inclusion map, which is the surjection to the second symmetric power of C. + Finally, it computes the long exact sequence of homology using the @TO longExactSequence@ function on the pruned maps of the induced maps. + + This long exact sequence is only interesting in characteristic 2, since the above sequence is split whenever 2 is a unit, + so there are no interesting connecting homomorphisms. Let's see some examples in characteristic 2 of the + connecting homomorphisms: + Example + Q = ZZ/2[a,b] + K = koszulComplex vars Q + prune tensorLES(K,4) + oo.dd_6 --nontrivial connecting homomorphism + F = freeResolution( (ideal vars Q)^3) + --prune tensorLES(F,4) --takes time to run, commented out + L = complex {K.dd_1, map(source K.dd_1,target K.dd_2 ,K.dd_2*K.dd_1), K.dd_2} + hL = elapsedTime prune tensorLES(L,4) + netList {hL.dd_3, hL.dd_6, hL.dd_9, hL.dd_12, hL.dd_15} --two nontrivial connecting homs + SeeAlso + exteriorInclusion + simplicialTensor + /// + diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 new file mode 100644 index 00000000000..a8405c35b1b --- /dev/null +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 @@ -0,0 +1,1198 @@ +TEST /// +---basic test arising from ring documentation +S = ZZ/101[a,b,c,d]; + C = simplicialModule freeResolution coker vars S + ring C + assert(ring C === S) + ring id_C + assert(ring id_C === S) +/// + + +TEST /// +--test for topdeg from doc +S = ZZ/101[a..c]; + C = simplicialModule(freeResolution coker vars S, 8) + assert(topDegree C == 8) + C' = simplicialModule(freeResolution coker vars S, 6) + assert(topDegree C' == 6) + + S = ZZ/101[a..d] + C0 = simplicialModule( S^2, 6, Degeneracy => true) + f = dd^C0 + assert(source f == target f) + f == 0 + isWellDefined C0 + C0 == 0 + assert(topDegree C0 == 6) + C5 = simplicialModule(S^0, 8, Degeneracy => true) + assert(C5 == 0) + assert(dd^C5 == 0) + assert(ss^C5 == 0) + C5_0 +/// + + +TEST /// +R = QQ[a..d]; + I = ideal(a*d-b*c, b^2-a*c, c^2-b*d); + C = simplicialModule(freeResolution(R^1/I), 4, Degeneracy => true) + dd^C + C.dd + ss^C + C.ss + assert(dd^C === C.dd) + assert(source dd^C === C) + assert(target dd^C === C) + assert(degree dd^C === -1) + assert(source ss^C === C) + assert(target ss^C === C) + assert(degree ss^C === 1) + dd^C_(2,0) + assert(source dd^C_2 === C_2) + assert(target dd^C_2 === C_1) +/// + + +TEST /// +--direct sum testing +S = ZZ/101[a,b,c]; + C1 = simplicialModule(freeResolution coker vars S, 5, Degeneracy => true) + C2 = simplicialModule(complex (ideal(a,b,c)) , 5, Degeneracy => true) + D = C1 ++ C2 + assert isWellDefined D_[0] + assert isCommutative D_[0] + assert isWellDefined D_[1] + assert isCommutative D_[1] + assert(D^[0] * D_[0] == 1) + assert(D^[1] * D_[1] == 1) + assert(D^[0] * D_[1] == 0) + assert(D^[1] * D_[0] == 0) + assert(D_[0] * D^[0] + D_[1] * D^[1] == 1) +/// + +TEST /// +S = ZZ/101[a..d] + moduleHash = hashTable { 0 => S^1, + 1 => S^1++S^2, + 2 => S^1++S^2++S^2++S^1} + faceHash = hashTable {(1,0) => matrix {{1, a, b}}, + (1,1) => matrix {{1_S, 0, 0}}, + (2,0) => matrix {{1, a, b, 0, 0, 0}, + {0, 0, 0, 1, 0, -b}, + {0, 0, 0, 0, 1, a}}, + (2,1) => matrix {{1_S, 0, 0, 0, 0, 0}, + {0, 1, 0, 1, 0,0}, + {0, 0, 1, 0, 1, 0}}, + (2,2) => matrix {{1_S, 0, 0, 0, 0, 0}, + {0, 1, 0, 0, 0, 0}, + {0, 0, 1, 0, 0, 0}}} + degenHash = hashTable {(0,0) => matrix {{1_S}, {0}, {0}}, + (1,0) => matrix {{1_S, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 1, 0}, + {0, 0, 1}, + {0, 0, 0}}, + (1,1) => matrix {{1_S, 0, 0}, + {0, 1, 0}, + {0, 0, 1}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}}} + T = simplicialModule(moduleHash, faceHash, degenHash, 2) + assert(T.?module) + assert T.?dd + assert T.?ss + T' = simplicialModule(moduleHash, faceHash, 2) + H1 = hashTable {0 => S^1, 1 => S^1, 2 => S^1} + H2 = hashTable {(1,0) => map(S^1, S^1, 0), + (1,1) => map(S^1, S^1, 0), + (2,0) => map(S^1, S^1, 0), + (2,1) => map(S^1, S^1, 0), + (2,2) => map(S^1, S^1, 0)} + H3 = hashTable {(0,0) => map(S^1, S^1, 0), + (1,0) => map(S^1, S^1, 0), + (1,1) => map(S^1, S^1, 0)} + U = simplicialModule(H1,H2,H3,2) + assert U.?dd + assert U.?ss + assert not isWellDefined U +/// + +TEST /// +S = ZZ/101[a..d] + C0 = simplicialModule( S^2, 6, Degeneracy => true) + f = dd^C0 + source f, target f + f == 0 + assert isWellDefined C0 + C0 == 0 + assert(topDegree C0 ==6) + C2 = simplicialModule( S, 5, Degeneracy => true) + I = ideal(a^2-b, c^3) + C3 = simplicialModule( I, 7, Degeneracy => true) + C4 = simplicialModule( (S/I), 8, Degeneracy => true) + assert isSimplicial C2 + assert isSimplicial C3 + assert isSimplicial C4 + C5 = simplicialModule(S^0, 8, Degeneracy => true) + assert(C5 == 0) + assert (dd^C5 == 0) + assert(ss^C5 == 0) + C5_0 +/// + +TEST /// +S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker vars S, 4, Degeneracy => true) + assert C.?complex + assert isWellDefined C.complex + assert(C_(1,0) == C.complex_0) + assert(C_(1,1) == C.complex_1) + assert(C_(2,1) == C.complex_1 ++ C.complex_1) + tC = C ** C + assert not tC.?complex + tC_2 +/// + + +TEST /// +S = ZZ/101[a..c] + C = simplicialModule(K = freeResolution coker vars S, 4) + D = image id_C; + assert(not(C === D)) + assert(C == D) + E = simplicialModule(complex for i from 1 to 3 list 0*dd^K_i, 4) + assert isWellDefined dd^E + assert not(C == E) + assert not(E == 0) + f = id_C + D = coker f + assert(D == 0) + C0 = simplicialModule( S^0, 5, Degeneracy => true) + C1 = simplicialModule(complex(S^0, Base => 2), 5, Degeneracy => true) + topDegree C0 == topDegree C1 + assert(C0 == C1) + assert(C0 == 0) + assert(C1 == 0) +/// + + +TEST /// +R = QQ[a..d]; + I = ideal(a*d-b*c, b^2-a*c, c^2-b*d); + C = simplicialModule(freeResolution(R^1/I), 4, Degeneracy => true) + isWellDefined C + dd^C + C.dd + ss^C + C.ss + assert(dd^C === C.dd) + assert(source dd^C === C) + assert(target dd^C === C) + assert(degree dd^C === -1) + assert(source ss^C === C) + assert(target ss^C === C) + assert(degree ss^C === 1) + dd^C_(2,0) + assert(source dd^C_2 === C_2) + assert(target dd^C_2 === C_1) +/// + + +TEST /// +S = ZZ/101[a,b,c]; + C1 = simplicialModule(freeResolution coker vars S, 5, Degeneracy => true) + C2 = simplicialModule(complex (ideal(a,b,c)) , 5, Degeneracy => true) + D = C1 ++ C2 + D_[0] + assert isCommutative D_[0] + D_[1] + assert(D^[0] * D_[0] == 1) + assert(D^[1] * D_[1] == 1) + assert(D^[0] * D_[1] == 0) + assert(D^[1] * D_[0] == 0) + assert(D_[0] * D^[0] + D_[1] * D^[1] == 1) + E = (chicken => C1) ++ (nuggets => C2) + E_[chicken] + E_[nuggets] + assert(E^[chicken] * E_[chicken] == 1) + assert(E^[nuggets] * E_[nuggets] == 1) + assert(E^[chicken] * E_[nuggets] == 0) + assert(E^[nuggets] * E_[chicken] == 0) + assert(E_[chicken] * E^[chicken] + E_[nuggets] * E^[nuggets] == 1) + F = directSum(C1, C2, simplicialModule(complex(S^2, Base => 1), 5, Degeneracy => true)) + prune (F^[0,1]) + assert isSimplicialMorphism oo + prune (F_[0,2]) + assert isSimplicialMorphism oo +/// + + +TEST /// +S = ZZ/101[a,b,c]; + C1 = simplicialModule freeResolution coker vars S + C2 = simplicialModule(complex (ideal(a,b,c)), 3) + D = C1 ++ C2 + L = components D + assert(L_0 === C1) + assert(L_1 === C2) + E = (peanut => C1) ++ (butter => C2) + components E +/// + + +TEST /// +S = ZZ/101[a..c] + Ca = simplicialModule(complex {matrix{{a}}}, 3) + Cb = simplicialModule(complex {matrix{{b}}}, 3) + Cc = simplicialModule(complex {matrix{{c}}}, 3) + Cab = Cb ** Ca + dd^Cab + (prune normalize Cab).dd + assert isWellDefined Cab + Cabc = Cc ** Cab + Cc ** Cb ** Ca + dd^(nC = prune normalize Cabc) + assert isWellDefined nC + Cabc ** (S^1/(a,b,c)); + assert isWellDefined oo + S^2 ** Cabc + assert isWellDefined oo +/// + +TEST /// +R = QQ[a,b,c]; + I = ideal(a*b, a*c, b*c) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D = truncate(3,C) + assert isWellDefined D + assert(C == truncate(0, C)) + A = ZZ/101[x_0, x_1, y_0, y_1, y_2, Degrees => {2:{1,0}, 3:{0,1}}]; + I = intersect(ideal(x_0, x_1), ideal(y_0, y_1, y_2)) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D1 = prune truncate({{1,1}}, C) + D2 = truncate({{1,0}}, C) + D3 = truncate({{0,1}}, C) + D4 = truncate({{1,0},{0,1}}, C); + D5 = truncate({{2,2}}, C); + assert all({D1,D2,D3,D4,D5}, isWellDefined) +/// + + +TEST /// +R = QQ[x,y,z] + S = QQ[s,t] + phi = map(S, R, {s, s+t, t}) + I = ideal(x^3, x^2*y, x*y^4, y*z^5) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D = phi C + assert isWellDefined D + dd^D + R = ZZ/101[a..d] + S = ZZ/101[s,t] + phi = map(S, R, {s^4, s^3*t, s*t^3, t^4}, DegreeMap => i -> 4*i) + C = simplicialModule(freeResolution coker vars R, 4, Degeneracy => true) + D = phi C + assert isWellDefined D +/// + +TEST /// +R = QQ[x,y,z]; + S = QQ[s,t]; + phi = map(S, R, {s, s+t, t}) + I = ideal(x^3, x^2*y, x*y^4, y*z^5) + C = simplicialModule(freeResolution I, 3, Degeneracy => true) + D = phi ** C + assert isWellDefined D + assert isWellDefined dd^D + assert isWellDefined ss^D + A = R/(x^2+y^2+z^2); + C ** A + assert(map(A,R) ** C == C ** A) + use R + I = ideal(x*y, x*z, y*z); + J = I + ideal(x^2, y^2); + g = inducedMap(module J, module I) + assert isWellDefined g + C = simplicialModule(complex {g}, 3, Degeneracy => true) + D1 = phi C + assert isWellDefined D1 + D2 = phi ** C + assert isWellDefined D2 + prune D1 + prune D2 + R = ZZ/101[a..d]; + S = ZZ/101[s,t]; + f = map(S, R, {s^4, s^3*t, s*t^3, t^4}, DegreeMap => i -> 4*i) + C = simplicialModule(freeResolution coker vars R, 3, Degeneracy => true) + D = f ** C + D == f C + assert isWellDefined D +/// + + +TEST /// +S = ZZ/101[a,b,c,d,e]; + I = ideal(a,b) * ideal(c,d,e) + F = simplicialModule((dual freeResolution I)[-4], 2, Degeneracy => true) + C = HH F + D = prune C + g = D.cache.pruningMap + assert isWellDefined g + assert isSimplicialMorphism g + assert (target g == C) + assert (source g == D) + g^-1 + assert(g*g^-1 == 1 and g^-1*g == 1) + S = ZZ/101[a,b,c]; + I = ideal(a^2,b^2,c^2); + J = I + ideal(a*b*c); + FI = simplicialModule(freeResolution I, Degeneracy => true) + FJ = simplicialModule(freeResolution J, Degeneracy => true) + f = randomSimplicialMap(FJ, FI ** S^{-1}, Cycle => true) + C = image f + D = prune C + g = D.cache.pruningMap + assert isWellDefined g + assert isSimplicialMorphism g + assert (target g == C) + assert (source g == D) + g^-1 + assert(g*g^-1 == 1 and g^-1*g == 1) + h = prune f + assert(source h === prune source f) + assert(target h === prune target f) +/// + + +TEST /// +R = ZZ/101[a,b,c]; + C = simplicialModule(F = freeResolution coker matrix{{a^2-b^2,b^3-c^3,c^4}}, Degeneracy => true) + D = simplicialModule(G = freeResolution coker vars R, Degeneracy => true) + H = hashTable { 0 => map(D_0, C_0, 1), + 1 => map(D_1, C_1, {{1, 0, 0, 0}, {0, a, 0, 0}, {0, -b, b^2, 0}, {0, 0, -c^2, c^3}}), + 2 => map(D_2, C_2, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, a, 0, 0, 0, 0,0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0}, + {0, 0, 0, 0, -b, b^2, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3}}), + 3 => map(D_3, C_3, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, -b, b^2, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0,0, 0, 0, 0, 0, 0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0, 0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-a*c^2, a*c^3, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0,0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0, 0,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2,a*c^3, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2*c^3}}) + } + f = map(D, C, H) + assert isWellDefined f + assert isHomogeneous f + assert(degree f == 0) + assert isSimplicialMorphism f + h = map(C, C, hashTable {}) + assert(h == 0) +/// + + +TEST /// +R = QQ[a,b,c] + C = simplicialModule(freeResolution coker vars R, Degeneracy => true) + D = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}, Degeneracy => true) + f = map(D, C, 0) + assert isWellDefined f + assert isSimplicialMorphism f + g = map(C, C, 0, Degree => 13) + assert isWellDefined g + assert(degree g == 13) + assert not isSimplicialMorphism g + assert isCommutative g + assert isHomogeneous g + assert(source g == C) + assert(target g == C) + assert(map(C, C, 1) === id_C) +/// + + +TEST /// +R = ZZ/101[a,b,c]; + C = simplicialModule(freeResolution coker vars R, Degeneracy => true) + f = map(forgetComplex C, forgetComplex C, id_C) + assert isWellDefined f + assert(degree f == 0) + assert isCommutative f + assert isSimplicialMorphism f + normalize f --notice how the normalization is not already pruned + normalize id_C + prune normalize f == normalize id_C +/// + + +TEST /// +R = ZZ/101[x,y]/(x^3, y^3) + C = simplicialModule(freeResolution(coker vars R, LengthLimit=>6), 6, Degeneracy => true) + f = id_C; + assert isWellDefined f + assert isSimplicialMorphism f +/// + +TEST /// +R = ZZ/101[a,b,c]; + C = simplicialModule(F = freeResolution coker matrix{{a^2-b^2,b^3-c^3,c^4}}, Degeneracy => true) + D = simplicialModule(G = freeResolution coker vars R, Degeneracy => true) + H = hashTable { 0 => map(D_0, C_0, 1), + 1 => map(D_1, C_1, {{1, 0, 0, 0}, {0, a, 0, 0}, {0, -b, b^2, 0}, {0, 0, -c^2, c^3}}), + 2 => map(D_2, C_2, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, a, 0, 0, 0, 0,0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0}, + {0, 0, 0, 0, -b, b^2, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3}}), + 3 => map(D_3, C_3, {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0}, + {0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, a, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, -b, b^2, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,-c^2, c^3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0,0, 0, 0, 0, 0, 0, -b, b^2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0, 0, 0, -c^2, c^3, 0, 0, 0, 0, 0, 0,0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0,0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-a*c^2, a*c^3, 0, 0, 0, 0, 0, 0, 0,0}, + {0, 0, 0, 0, 0, 0,0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0, 0,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2,a*c^3, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, b*c^2, -b*c^3, b^2*c^3, 0, 0, 0, 0}, + {0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2, 0, 0, 0}, + {0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -a*c^2, a*c^3,0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b*c^2, -b*c^3, b^2*c^3, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, a*b^2*c^3}}) + } + f = map(D, C, H) + assert isWellDefined f + assert isHomogeneous f + assert(degree f == 0) + assert isSimplicialMorphism f + g = randomSimplicialMap(D,C); --outputs are large + normalize g + assert isWellDefined g + assert not isCommutative g + h = randomSimplicialMap(D,C, Cycle => true); + normalize h + assert isWellDefined h + assert isSimplicialMorphism h +/// + + +TEST /// +R = ZZ/101[a..d] + I = ideal(a^2, b^2, c^2) + J = I + ideal(a*b*c) + FI = simplicialModule(freeResolution I, Degeneracy => true) + FJ = simplicialModule(freeResolution J, Degeneracy => true) + f = randomSimplicialMap(FJ, FI, Cycle=>true) + source f + assert isWellDefined f + assert isSimplicialMorphism f + assert(source f == FI) + assert(target f == FJ) + kk = coker vars R + F = simplicialModule(freeResolution kk, Degeneracy => true) + assert(source dd^F == F) + assert(target dd^F == F) + assert(degree dd^F == -1) +/// + +TEST /// +R = ZZ/101[a..d]; + I = ideal(a^2, b^2, c^2) + FI = simplicialModule(freeResolution I, Degeneracy => true) + assert(degree dd^FI == -1) + assert(degree ss^FI == 1) +/// + + +TEST /// +S = ZZ/101[a,b,c,d]; + I = minors(2, matrix{{a,b,c},{b,c,d}}) + C = simplicialModule(freeResolution (S^1/I), Degeneracy => true) + assert isHomogeneous dd^C + f = randomSimplicialMap(C, C, Degree => -1) + assert isHomogeneous f + f = randomSimplicialMap(C, C, InternalDegree => 2) + phi = map(S, S, {1,b,c,d}) + D = phi C + dd^D + assert not isHomogeneous dd^D +/// + + +TEST /// +S = ZZ/101[a..c]; + C = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}, Degeneracy => true) + f = dd^C + f^2 + assert(source f == target f) + assert(degree f == -1) + assert(degree f^2 == -2) + g = randomSimplicialMap(C, C) + assert isWellDefined g^2 + assert isWellDefined g^3 + assert not(f^0 == id_(C[1])) + assert(g^0 == id_C) + h = randomSimplicialMap(C, C) + assert isWellDefined h^-1 + assert(h * h^-1 == id_C) + assert isWellDefined h^-4 + assert(h^-4 * h^4 == id_C) +/// + + +TEST /// +S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + f = id_C + assert(f == 1) + assert(0 * id_C == 0) + g = randomSimplicialMap(C, C) + h = inducedMap(coker g, target g) + assert(h == 0) + g = randomSimplicialMap(C, C, InternalDegree=>1, Cycle=>true) + h = inducedMap(coker g, target g) + assert(h != 1) + D = prune image g + p = D.cache.pruningMap + p == 1 + assert(coker p == 0 and ker p == 0) + assert(prune p == 1) +/// + + +TEST /// +S = ZZ/101[a,b,c]; + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D = C ** C + isWellDefined D + f1 = prune randomSimplicialMap(D, C, Cycle => true, InternalDegree => 1); + prune normalize f1 + isCommutative oo + isCommutative f1 + assert(degree f1 == 0) + f2 = randomSimplicialMap(D, C, Cycle => true); + isCommutative f2 + assert(degree f2 == 0) + assert isSimplicialMorphism f2 +/// + +TEST /// +S = ZZ/101[a,b,c]; + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D = C ** C + f1 = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 1); + assert isSimplicialMorphism f1 + assert(degree f1 == 0) +/// + +TEST /// +R = ZZ/101[a..d]; + I = ideal(c^2-b*d, b*c-a*d, b^2-a*c) + J = ideal(I_0, I_1) + C = simplicialModule(koszulComplex vars R, Degeneracy => true) + f = map(R^1/I, R^1/J, 1) + C ** f; + assert isSimplicialMorphism oo + f ** C; + assert isSimplicialMorphism oo + f' = random(R^2, R^{-1, -1, -1}) + C ** f'; + f' ** C; + assert isWellDefined(C ** f') + assert isWellDefined(f' ** C) + f'' = random(source f', R^{-2,-2}) + assert((C ** f') * (C ** f'') == C ** (f' * f'')) + assert(C ** id_(R^{-1,-2,-3}) == id_(C ** R^{-1,-2,-3})) +/// + +TEST /// +S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D = simplicialModule((freeResolution coker matrix{{a^2,a*b,b^3}})[-1], Degeneracy => true) + f = randomSimplicialMap(D,C) + E = simplicialModule((dual C.complex)[-3], Degeneracy => true) + F = simplicialModule((dual D.complex)[-3], 3, Degeneracy => true) + g = randomSimplicialMap(F,E) + h = f ** g; + assert isWellDefined h + assert(prune source h == C ** E) + assert(prune target h == D ** F) + fE = f ** E; + assert(fE == f ** id_E) + k = coker vars S + gk = g ** k; + D' = simplicialModule((freeResolution coker matrix{{a^2,a*b,c^3}})[-1], 3, Degeneracy => true) + f' = randomSimplicialMap(D', D) + assert((f' * f) ** g == (f' ** g) * (f ** id_E)) + assert((f' * f) ** g == (f' ** id_F) * (f ** g)) + F' = simplicialModule(dual (freeResolution coker matrix{{a^2,a*b,a*c,b^3}})[-3], Degeneracy => true) + g' = randomSimplicialMap(F', F) + assert(f ** (g' * g) == (f ** g') * (id_C ** g)) + assert(f ** (g' * g) == (id_D ** g') * (f ** g)) +/// + + +TEST /// +R = QQ[a,b,c]; + C = simplicialModule(freeResolution ideal(a*b, a*c, b*c), 3, Degeneracy => true) + D = simplicialModule((freeResolution ideal(a*b, a*c, b*c, a^2-b^2))[-1], 3, Degeneracy => true) + f = randomSimplicialMap(D,C, Cycle => true) + g = truncate(3,f); + assert isWellDefined g + assert (source g == truncate(3, source f)) + assert (target g == truncate(3, target f)) + assert(f == truncate(0, f)) + A = ZZ/101[x_0, x_1, y_0, y_1, y_2, Degrees => {2:{1,0}, 3:{0,1}}]; + I = intersect(ideal(x_0, x_1), ideal(y_0, y_1, y_2)) + C = simplicialModule(freeResolution I, 4, Degeneracy => true) + J = intersect(ideal(x_0^2, x_1^2), ideal(y_0^2, y_1^2, y_2^2)) + D = simplicialModule(freeResolution J, 4, Degeneracy => true) + f = simplicialModule(extend(C.complex, D.complex, id_(A^1)), 2) + g1 = prune truncate({{1,1}}, f); + g1_0 + g1_1 + g2 = truncate({{1,0}}, f); + g2_1 + g3 = truncate({{0,1}}, f); + g4 = truncate({{1,0},{0,1}}, f); + g4_1 + g5 = truncate({{2,2}}, f); + assert all({g1,g2,g3,g4,g5}, isWellDefined) +/// + +TEST /// +R = QQ[a,b,c,d]; + S = QQ[s,t]; + phi = map(S, R, {s, s+t, t, s-t}) + I = ideal(a*b, b*c, c*d) + J = I + ideal(a^2, b^2, c^2, d^2) + CI = simplicialModule(freeResolution I, 4, Degeneracy => true) + CJ = simplicialModule(freeResolution J, Degeneracy => true) + f = simplicialModule(extend(CJ.complex, CI.complex, map(CJ_0, CI_0, 1)), Degeneracy => true) + assert isWellDefined f + g = phi ** f + assert isWellDefined g + assert isWellDefined dd^(source g) + assert isWellDefined ss^(source g) + dd^(target g); + simplicialModule prune HH normalize g + assert isSimplicialMorphism oo +/// + +TEST /// +needsPackage "Truncations" + kk = ZZ/32003 + R = kk[a,b,c] + F = simplicialModule(freeResolution (ideal gens R)^2, 2, Degeneracy => true) + C1 = truncate(3, F); + prune normalize C1 + C2 = truncate(4, F); + prune normalize C2 + assert isWellDefined C1 + assert isWellDefined C2 + f = inducedMap(C1, C2); + prune normalize f + assert isWellDefined f + f1 = inducedMap(F, C1) + f2 = inducedMap(F, C2) + assert isWellDefined f1 + assert isWellDefined f2 + assert(f2 == f1 * f) +/// + + +TEST /// +R = ZZ/101[a..d]; + C = simplicialModule(freeResolution coker matrix{{a*b, a*c^2, b*c*d^3, a^3}}, Degeneracy => true) + D = simplicialModule(freeResolution coker matrix{{a*b, a*c^2, b*c*d^3, a^3, a*c*d}}, 3, Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true); + prune normalize f + g = randomSimplicialMap(D, C, Boundary => true); + prune normalize g + f+g; + assert isSimplicialMorphism oo + f-g; + assert isSimplicialMorphism oo + -f; + 3*f; + 0*f + a*f; + assert(0*f == 0) + assert(1*f == f) + assert((-1)*f == -f) + assert(-(f-g) == g-f) + assert((a+b)*f == a*f + b*f) + assert(a*(f+g) == a*f + a*g) + assert isSimplicialMorphism (f+g) + h = randomSimplicialMap(C, C); + prune normalize h + prune normalize(h+1) + assert(h+1 == h + id_C) + assert(h+a == h + a*id_C) + assert(1-h == id_C - h) + assert(b-c*h == -c*h + b*id_C) + assert(b-h*c == -h*c + id_C*b) +/// + + +TEST /// +R = ZZ/101[a..d]; + C1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], Degeneracy => true) + C2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, Degeneracy => true) + D = simplicialModule(freeResolution coker matrix{{a^2,b^2,c*d}}, Degeneracy => true) + f = randomSimplicialMap(D, C1) + g = randomSimplicialMap(D, C2) + h = f|g + assert isWellDefined h + assert(source h === source f ++ source g) + assert(target h === target f) +/// + +TEST /// +R = ZZ/101[a..d]; + D1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], Degeneracy => true) + D2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, Degeneracy => true) + C = simplicialModule(freeResolution coker matrix{{a^2,b^2,c*d}}, Degeneracy => true) + f = randomSimplicialMap(D1, C) + g = randomSimplicialMap(D2, C) + h = f||g + assert isWellDefined h + assert(target h === target f ++ target g) + assert(source h === source f) +/// + +TEST /// +R = ZZ/101[a..d]; + C1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], Degeneracy => true) + C2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, Degeneracy => true) + D1 = simplicialModule((freeResolution coker matrix{{a,b,c}}),2, Degeneracy => true) + D2 = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}[-1], 2, Degeneracy => true) + f = randomSimplicialMap(D1, C1, Cycle => true) + g = randomSimplicialMap(D2, C2, Cycle => true) + h = f ++ g + assert isWellDefined h + assert isSimplicialMorphism h + directSum(f, g, f[2]) + h2 = directSum(peanut => f, butter => g, jelly => f[2]) + indices h2 + h2_[butter,jelly] + assert(source oo == C2 ++ C1[2]) + assert(h_[0]^[0] == f) + assert(h_[1]^[1] == g) + assert(h_[0]^[1] == 0) + assert(h_[1]^[0] == 0) + assert(h_[0] == h * (C1 ++ C2)_[0]) + assert(h_[1] == h * (C1 ++ C2)_[1]) + assert(h^[0] == (D1 ++ D2)^[0] * h) + assert(h^[1] == (D1 ++ D2)^[1] * h) +/// + +TEST /// +S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d),3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 0) + assert isCommutative f + assert isWellDefined prune image f + prune normalize oo + i = inducedMap(forgetComplex target f, image f) + isSimplicialMorphism i + normalize i + g1 = inducedMap(target f, image f) + assert(ker g1 == 0) + assert(image g1 == image f) +/// + + +TEST /// +S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d), 3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 0) + assert isCommutative f + g1 = inducedMap(coimage f, source f) + assert(coimage g1 == coimage f) + assert(coker g1 == 0) +/// + +TEST /// +S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d), 3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Boundary => true, InternalDegree => 0) + assert isCommutative f + assert isWellDefined prune ker f + h1 = inducedMap(source f, ker f) + assert(ker f == image h1) + assert(ker h1 == 0) +/// + + +TEST /// +S = ZZ/101[a,b,c,d]; + C = simplicialModule(freeResolution ideal(b^2-a*c, b*c-a*d, c^2-b*d), 3, Degeneracy => true) + D = simplicialModule(freeResolution ideal(a,b,c), Degeneracy => true) + f = randomSimplicialMap(D, C, Cycle => true, InternalDegree => 0) + assert isCommutative f + assert isWellDefined prune coker f + prune normalize oo + prune HH coker f + g1 = inducedMap(coker f, target f) + assert(coker f == image g1) + assert(coker g1 == 0) +/// + + +TEST /// +R = ZZ/101[a..d]; + C1 = simplicialModule((freeResolution coker matrix{{a,b,c}})[1], 3, Degeneracy => true) + C2 = simplicialModule(freeResolution coker matrix{{a*b,a*c,b*c}}, 3, Degeneracy => true) + D1 = simplicialModule((freeResolution coker matrix{{a,b,c}}), Degeneracy => true) + D2 = simplicialModule(freeResolution coker matrix{{a^2, b^2, c^2}}[-1], 3, Degeneracy => true) + f = randomSimplicialMap(D1, C1, Cycle => true) + assert isCommutative f + g = randomSimplicialMap(D2, C2, Cycle => true) + assert isCommutative g + h = f ++ g; + assert(h_[0] == h * (C1 ++ C2)_[0]) + assert(h_[1] == h * (C1 ++ C2)_[1]) + assert(h^[0] == (D1 ++ D2)^[0] * h) + assert(h^[1] == (D1 ++ D2)^[1] * h) + assert(h_[0]^[0] == f) + assert(h_[1]^[1] == g) + assert(h_[0]^[1] == 0) + assert(h_[1]^[0] == 0) + h = (chicken => f) ++ (nuggets => g); + indices h + assert(h_[chicken]^[chicken] == f) + assert(h_[nuggets]^[nuggets] == g) +/// + + +TEST /// +S = ZZ/101[a..c] + C = simplicialModule(freeResolution coker matrix{{a*b, a*c, b*c}}, 3, Degeneracy => true) + D = simplicialModule(freeResolution coker vars S, Degeneracy => true) + f = randomSimplicialMap(D,C) + assert isWellDefined f + assert not isCommutative f + g = randomSimplicialMap(D,C, Cycle => true) + assert isWellDefined g + assert isCommutative g + assert isSimplicialMorphism g + h = randomSimplicialMap(D,C, Boundary => true) + assert isWellDefined h + assert isCommutative h + assert isSimplicialMorphism h + assert isNullHomotopic normalize h + nullHomotopy normalize h + p = randomSimplicialMap(D, C, Cycle => true, Degree => -1) + assert isWellDefined p + assert isCommutative p + assert isSimplicialMorphism p + q = randomSimplicialMap(D, C, Boundary => true, InternalDegree => 2); + assert isCommutative q + assert isSimplicialMorphism q + assert(source q == C) + assert(target q == D) + assert isNullHomotopic normalize q +/// + +TEST /// +R = ZZ/101[a,b,c]; + B = simplicialModule(freeResolution coker matrix{{a^2*b, a*b*c, c^3}}, Degeneracy => true) + C = simplicialModule(freeResolution coker vars R, 2, Degeneracy => true) + h = randomSimplicialMap(C, B, Cycle => true) + f = inducedMap(C, image h) + assert isCommutative f + g = inducedMap(coker h, C) + assert isCommutative g + assert isShortExactSequence(g,f) + I = ideal(a^3, b^3, c^3) + J = I + ideal(a*b*c) + K = I : ideal(a*b*c) + SES = complex{ + map(comodule J, comodule I, 1), + map(comodule I, (comodule K) ** R^{-3}, {{a*b*c}}) + } + assert isWellDefined SES + assert isShortExactSequence(dd^SES_1, dd^SES_2) + (g,f) = (horseshoeResolution SES)/simplicialModule; + assert isShortExactSequence(g,f) +/// + + +TEST /// +S = ZZ/101[a..d] + D = simplicialModule(S^1, 5) + D[-1] + oo.dd + D[-2] + C = simplicialModule(freeResolution coker vars S, Degeneracy => true) + dd^C_(3,0) + ss^C_(2,0) + D = C[1] + assert isWellDefined D + assert isWellDefined dd^D_(2,0) + ss^D_(1,0) + C2 = simplicialModule(freeResolution (S^1/(a^2, b^2, c^2, d^2)), Degeneracy => true) + C3 = simplicialModule(freeResolution (S^1/(a^2, b^3, c^4, d^5)), Degeneracy => true) + f2 = simplicialModule(extend(C.complex, C2.complex, map(C_0, C2_0, 1))); + f3 = simplicialModule(extend(C2.complex, C3.complex, map(C2_0, C3_0, 1))); + assert isWellDefined (f2[-1]) + assert isSimplicialMorphism (f2[-1]) + assert isSimplicialMorphism (f3[-2]) +/// + + +TEST /// +S = ZZ/101[a,b,c]; + C1 = simplicialModule(freeResolution coker vars S, Degeneracy => true) + D1 = C1 ++ simplicialModule(complex(S^13)[-2], 3, Degeneracy => true) + assert isWellDefined D1 + assert(D1.?ss) --knows to cache degeneracy maps if inputs have degeneracy maps + C2 = simplicialModule(ideal(a,b,c), 3, Degeneracy => true) + C1 ++ C2 + assert isWellDefined(C1 ++ C2) + C3 = directSum(C1,C2,C2[-2]) + assert isWellDefined C3 + C4 = directSum(first => C1, second => C2) + assert isCommutative C4_[first] -- inclusion map C1 --> C4 + assert isCommutative C4^[first] -- projection map C4 --> C1 + assert(C4^[first] * C4_[first] == 1) + assert(C4^[second] * C4_[second] == 1) + assert(C4^[first] * C4_[second] == 0) + assert(C4^[second] * C4_[first] == 0) + assert(C4_[first] * C4^[first] + C4_[second] * C4^[second] == 1) + assert isShortExactSequence(C4^[first], C4_[second]) + assert isShortExactSequence(C4^[second], C4_[first]) +/// + + +TEST /// +Q = ZZ/101[a..d] + K = koszulComplex vars Q + S = simplicialModule(K, Degeneracy => true) + nK = naiveNorm(S) + assert isWellDefined nK + prune HH nK +/// + +TEST /// +Q = QQ[x_1..x_3]; + K = koszulComplex vars Q; + assert isWellDefined simplicialModule(K, 4) --no degeneracy here + S = simplicialModule(K,4, Degeneracy => true) + S.dd**Q^1 + assert isWellDefined oo + assert isWellDefined S + Sdegen = simplicialModule(K,4,Degeneracy => true) + S.dd + assert Sdegen.?ss --this is the version that actually has degeneracy maps cached + simplicialModule(K, 5) + C = complex(Q^1, Base => 1) + simplicialModule(C, 3) + assert isWellDefined oo + simplicialModule(complex(Q^2, Base => 2), 6, Degeneracy => true) + assert isWellDefined oo --nice, now we can be confident the objects we are messing with actually make any sense + assert oo.?ss + assert isSimplicialMorphism id_S + phi = exteriorInclusion(S); + assert isWellDefined phi + assert isCommutative phi + assert isWellDefined prune phi + assert isCommutative prune phi + assert isWellDefined prune coker phi + K = koszulComplex {x_1,x_2} + Sn = simplicialModule(K, 4, Degeneracy => true) + phi = exteriorInclusion(K) + assert isCommutative phi + assert isWellDefined phi + assert isCommutative prune phi + assert isWellDefined prune phi + sphi = exteriorInclusion(Sn); + psphi = prune sphi; + assert isWellDefined (source psphi).cache.pruningMap + assert isCommutative (source psphi).cache.pruningMap + assert isSimplicialMorphism (source psphi).cache.pruningMap --pruningMaps are well-defined morphisms + S = simplicialModule(K,6) + + + p = randomComplexMap(K, K, Degree => 1, InternalDegree => 1) + sp = simplicialModule p + assert isWellDefined sp + assert not isCommutative sp + normalize(sp, CheckComplex => false) + prune oo ---reobtain p + p' = randomComplexMap(K, K, Degree => -1) + sp' = simplicialModule p' + assert isWellDefined sp' + assert not isCommutative sp' + normalize(sp', CheckComplex => false) + prune oo --reobtain p' + p = randomComplexMap(K, K, Degree => 1, Cycle => true, InternalDegree => 2) + sp = simplicialModule p + assert isWellDefined sp + assert isCommutative sp + normalize(sp, CheckComplex => false) + prune oo ---reobtain p + diffs = simplicialModule K.dd + isWellDefined diffs + assert isCommutative diffs + + assert(image(id_S) == S) + assert(simplicialModule(id_K, 6) == id_S) + assert isSimplicialMorphism id_S + simplicialModule(complex(Q^0), 6, Degeneracy => true) -- should be able to input 0 and get a well-defined output + assert isWellDefined oo + phi = randomSimplicialMap(S, S, Cycle => true, InternalDegree => 1) + assert isWellDefined phi + assert isCommutative phi + + bS = basis(0, forgetComplex S) + prune bS.dd + assert isWellDefined bS + assert isWellDefined prune bS + bid = basis(0, id_(forgetComplex S)) + assert isWellDefined bid + assert isCommutative bid + assert isWellDefined prune bid + assert isCommutative prune bid + + fS = forgetComplex S + assert not fS.?ss + + bS = basis(1, forgetComplex S) + assert isWellDefined bS + prune bS.dd + assert isWellDefined oo + --prune bS.ss + --assert isWellDefined oo + normalize bS + prune oo + prune basis(1, K) + + bS = basis(3, forgetComplex S) + assert isWellDefined bS + prune bS.dd; + assert isWellDefined oo + --prune bS.ss; + --assert isWellDefined oo + normalize bS + prune oo + prune basis(3, koszulComplex vars Q) + + tS = truncate(1, S) + assert isWellDefined tS + prune tS + assert isWellDefined prune tS + tS = truncate(1, fS) + assert isWellDefined tS + prune tS + assert isWellDefined prune tS + assert isCommutative truncate(2, id_S) + assert isCommutative truncate(2, id_fS) + + K = koszulComplex {x_1,x_2} + assert isWellDefined (Sc = schurMap({1,1}, K)) + prune extPower(2, K) + assert isWellDefined prune schurMap({2,1}, K, TopDegree => 4) +/// + + +TEST /// +Q = ZZ/2[a,b] + K = koszulComplex vars Q; + F = freeResolution( (ideal vars Q)^2) + phi = extend(K, F, id_(K_0)) + f = elapsedTime prune schurMap({2}, phi) + assert isCommutative f + assert isWellDefined f + prune HH source f + prune HH target f + prune HH f +/// + + +TEST /// +Q = ZZ/101[x_1,x_2]; + K1 = complex {matrix{{x_1}}}; + K2 = complex {matrix{{x_2}}}; + T1 = K1**K2 + T1.dd + T2 = prune simplicialTensor({K1,K2}) + T2.dd + phi1 = extend(T1,T2,id_(T1_0)) + phi2 = extend(T2,T1,id_(T1_0)) + assert(phi1*phi2 == id_T1) + assert isNullHomotopic(phi2*phi1 - id_T2) + Q = ZZ/101[a,b]; + K = koszulComplex vars Q + SK = simplicialModule(K,6) --want top degree 6 since the resulting complexes should have length 6 + w21K = extPower(2, SK) ** SK + w3K = extPower(3, SK) + assert isWellDefined w3K + H = hashTable for i from 0 to 6 list i => dual wedgeProduct(2,1, dual SK_i); + inclusion = map(w21K, w3K, H); + assert isWellDefined inclusion + assert isCommutative inclusion +/// + +TEST /// +R = ZZ/101[x_1..x_3]; + K = koszulComplex vars R + S = simplicialModule(K,10, Degeneracy => true) + keys S + assert(K == normalize S) + Kn = normalize(S, CheckComplex => false) + Kn.dd + assert not(K == Kn) + assert(K == prune Kn) + Q = ZZ/3[a,b]; + K = koszulComplex vars Q + SK = simplicialModule(K,6) --want top degree 6 since the resulting complexes should have length 6 + w21K = extPower(2, SK) ** SK + w3K = extPower(3, SK) + H = hashTable for i from 0 to 6 list i => dual wedgeProduct(2,1, dual SK_i); + inclusion = map(w21K, w3K, H); + assert isWellDefined inclusion + assert isCommutative inclusion + Q = ZZ/2[a,b,c] + K = koszulComplex vars Q + phi = elapsedTime exteriorInclusion(K,4); --specify top degree 4 + assert isWellDefined phi + assert isCommutative phi +/// + diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialModule_Modified.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialModule_Modified.m2 new file mode 100644 index 00000000000..b9882e5a75a --- /dev/null +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialModule_Modified.m2 @@ -0,0 +1,823 @@ + + needsPackage "Complexes" + load "SimplicialMapUtilities_Modified.m2" + + + SimplicialModule = new Type of MutableHashTable -- + -- note: we make this mutable in order to construct the + -- differential as a morphism of ZZdFactorizations (in the style of Complexes) + -- BUT: after construction, it is should be IMMUTABLE!! + -- at some point, we might want to allow lazy determination of the modules and maps + -- but for now, we insist that all modules and maps are explicit. + -- key: + -- ring + -- modules: hash table: ZZ => Module + -- differential: ComplexMap from C --> C, degree -1 (mod d) + -- period: an integer d, tells us for which d the factorization C is ZZ/d-graded + -- cache: a CacheTable + + SimplicialModuleMap = new Type of HashTable + -- keys: + -- degree: ZZ + -- source: Simplicial module over a ring R + -- target: simplicial module over the same ring R + -- maps themselves (HashTable of Matrices), keys lying in the concentration period of the source. + -- not all of the keys maps#i, need be present. + -- missing ones are presumed to be zero maps. + -- cache: a CacheTable + -- cache.isCommutative: whether this map commutes with the differentials + -- not set until needed. unset means we have not checked yet, + -- and the user hasn't declared it to be true/false yet. + +SimplicialModule.synonym = "Simplicial Module" +SimplicialModuleMap.synonym = "Map of Simplicial Modules" + +topDegree = method(); +topDegree SimplicialModule := ZZ => S -> S.topDegree + +ring SimplicialModule := Ring => S -> S.ring + +moduleMaker = (C,d) -> ( + moduleList := new MutableHashTable; + maxK := min (d, length C); + for k to maxK do ( + moduleList#(d,k) = directSum toList( + binomial(d,k):(C_k)); + ); + for i in (sort keys moduleList) list (i,moduleList#i) + ) + +mapMaker = (phi,d) -> ( + mapList := new MutableHashTable; + maxK = min (d, max(length source phi,length target phi)); + for k to maxK do ( + mapList#(d,k) = directSum toList( + binomial(d,k):(phi_k)); + ); + for i in (sort keys mapList) list (i,mapList#i) + ) + +combineSFactors = method(); +combineSFactors(SimplicialModule,ZZ) := (S,d) -> (directSum for i to min(d,S.complexLength) list (S.module)#(d,i)) + +--H1 is the face maps, H2 is the degeneracy maps +simplicialModuleModified = method(Options => {Base=>0,Degeneracy => false}) +simplicialModuleModified(Complex,HashTable,HashTable,ZZ) := SimplicialModule => opts -> (C,H1,H2,d) -> ( + spots := sort keys H1; + if #spots === 0 then + error "expected at least one map"; + R := ring C; + moduleList := new MutableHashTable; + for b to d do ( + maxK = min (b, length C); + for k to maxK do ( + moduleList#(b,k) = directSum toList(binomial(b,k):(C_k)); + ); + ); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => new HashTable from moduleList, + symbol cache => new CacheTable, + symbol complexLength => length C, + symbol complex => C + }; + S.dd = map(S,S,H1,Degree=>-1); + S.ss = map(S,S,H2,Degree=>1); + S + ) + +--H1 is the face maps +simplicialModuleModified(Complex,HashTable,ZZ) := SimplicialModule => opts -> (C,H1,d) -> (--print("made it here!"); + spots := sort keys H1; + if #spots === 0 then + error "expected at least one map"; + R := ring C; + moduleList := new MutableHashTable; + for b to d do ( + maxK = min (b, length C); + for k to maxK do ( + moduleList#(b,k) = directSum toList(binomial(b,k):(C_k)); + ); + ); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => new HashTable from moduleList, + symbol cache => new CacheTable, + symbol complexLength => length C, + symbol complex => C + }; + S.dd = map(S,S,H1,Degree=>-1); + S + ) + +simplicialModuleModified(HashTable,HashTable,HashTable,ZZ) := SimplicialModule => opts -> (L,H1,H2,d) -> (--print("we got started"); + R := ring (L#((keys L)#0)); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => L, + symbol cache => new CacheTable, + }; + --print("made it to face"); + S.dd = map(S,S,H1,Degree=>-1); + --print("we are almost done"); + S.ss = map(S,S,H2,Degree=>1); + S + ) + +simplicialModuleModified(HashTable,HashTable,ZZ) := SimplicialModule => opts -> (L,H1,d) -> (--print("we got started"); + R := ring (L#((keys L)#0)); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => L, + symbol cache => new CacheTable, + }; + --print("made it to face"); + S.dd = map(S,S,H1,Degree=>-1); + --print("we are almost done"); + S + ) + + +simplicialModuleModified(Complex,ZZ) := SimplicialModule => opts -> (C,d) -> ( + --C is a chain complex, output is the Dold-Kan image of C in the category of simplicial modules + if not instance(opts.Base, ZZ) then + error "expected Base to be an integer"; + if instance(C,Complex) then ( + if opts.Degeneracy == true then (degenmapHash := hashTable flatten for n from 1 to d-1 list ( + for i from 0 to n list ( + (n,i) => degenMapiModified(n,i,C) + ) + );); + facemapHash := hashTable flatten for n from 1 to d list ( + for i from 0 to n list ( + (n,i) => faceMapiModified(n,i,C) + ) + ); + --print("mde it here first"); + if opts.Degeneracy == true then break return simplicialModule(C,facemapHash,degenmapHash,d); + --print("made it here"); + return simplicialModule(C,facemapHash,d) + ); + ) + + simplicialModuleModified(Complex) := SimplicialModule => opts -> C -> (simplicialModule(C,length C,Degeneracy => opts.Degeneracy)) + + simplicialModuleModified(Module,ZZ) := SimplicialModule => opts -> (M,d) -> (simplicialModule(complex M,d,Degeneracy => opts.Degeneracy)) + + +SimplicialModule _ Sequence := Module => (S,p) -> ( + if #p =!= 2 then + error ("Expected a pair of integer indices"); + if S.module#?(p#0,p#1) then S.module#(p#0,p#1) else (ring S)^0 + ) +SimplicialModule _ ZZ := Module => (S,n) -> directSum for i in keys (S.module) list (if first(splice(toSequence{i}))==n then S.module#(i) else continue) + +net SimplicialModule := S -> ( + (lo,hi) := (0,topDegree S); + if lo > hi then + error "In a complex, lo <= hi should always hold in the concentration" + --"0" + else if lo == hi and C_lo === 0 then + "0" + else if any(keys S,i->i==symbol complex) then + (horizontalJoin between(" <-- ", + for i from lo to hi list + stack (net directSum(for k from 0 to min(i,S.complexLength) list (S.module)#(i,k)), " ", net i))) + else + horizontalJoin between(" <-- ", + for i from lo to hi list + stack (net ((S.module)#i), " ", net i)) + ) + + + Symbol ^ SimplicialModule := SimplicialModuleMap => (sym, C) -> ( + if sym === dd then C.dd; + if sym === ss then C.ss + else error "expected symbol to be 'dd' or 'ss'" + ) + + lineOnTop := (s) -> concatenate(width s : "-") || s + +source SimplicialModuleMap := SimplicialModule => f -> f.source +target SimplicialModuleMap := SimplicialModule => f -> f.target +ring SimplicialModuleMap := SimplicialModule => f -> ring source f +degree SimplicialModuleMap := ZZ => f -> f.degree + +isHomogeneous SimplicialModuleMap := (f) -> all(values f.map, isHomogeneous) + +simplicialModuleMap = method(Options => {Degeneracy => false}); +simplicialModuleMap(ComplexMap,ZZ) := SimplicialModuleMap => opts -> (phi,d) -> ( + src := simplicialModule(source phi,d); + trg := simplicialModule(target phi,d); + map(trg,src,new HashTable from for i to d list i => directSum apply(mapMaker(phi,i),j->j_1),Degree => degree phi) + ) + + +-*map(SimplicialModule, SimplicialModule, HashTable) := SimplicialModuleMap => opts -> (tar, src, maps) -> ( + if not(topDegree tar == topDegree src) then error "expected source and target to have the same top degree"; + R := ring tar; + if ring src =!= R or any(values maps, f -> ring f =!= R) then + error "expected source, target and maps to be over the same ring"; + deg := if opts.Degree === null + then 0 + else if instance(opts.Degree, ZZ) then + opts.Degree + else + error "expected integer degree"; + (lo,hi) := (0,topDegree tar); + maps' := hashTable for k in keys maps list ( + if not instance(k_0, ZZ) then error "expected integer keys"; + f := maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + if rank source f != rank src_(first k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if rank target f != rank tar_(first(k)+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if first k < lo or first k > hi then continue else (k,f) + ); + new SimplicialModuleMap from { + symbol source => src, + symbol target => tar, + symbol degree => deg, + symbol map => maps', + symbol cache => new CacheTable + } + )*- + +map(SimplicialModule, SimplicialModule, HashTable) := SimplicialModuleMap => opts -> (tar, src, maps) -> ( + if not(topDegree tar == topDegree src) then error "expected source and target to have the same top degree"; + R := ring tar; + if ring src =!= R or any(values maps, f -> ring f =!= R) then + error "expected source, target and maps to be over the same ring"; + deg := if opts.Degree === null + then 0 + else if instance(opts.Degree, ZZ) then + opts.Degree + else + error "expected integer degree"; + (lo,hi) := (0,topDegree tar); + maps' := hashTable for k in keys maps list ( + if instance(k, Sequence) then ( + f := maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + if rank source f != rank src_(first k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if rank target f != rank tar_(first(k)+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if first k < lo or first k > hi then continue else (k,f) + ) + else ( + f := maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + if rank source f != rank src_(k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if rank target f != rank tar_(k+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if k < lo or k > hi then continue else (k,f) + )); + new SimplicialModuleMap from { + symbol source => src, + symbol target => tar, + symbol degree => deg, + symbol map => maps', + symbol cache => new CacheTable + } + ) + +map(SimplicialModule, SimplicialModule, List) := SimplicialModuleMap => opts -> (tar, src, maps) -> ( + -- case 1: maps is a (single) list of matrices (maps between components of the complex) + -- case 2: maps is a double list of ComplexMap's + -- in this case, if the maps all commute with differentials, and are diagonal, then + -- we could declare the result to be commutative as well. Should we do this? + -- Can tell, depending on the class of maps#0. + (lo,hi) := (0,topDegree tar); + if instance(maps#0, List) then ( + mapHash := hashTable for i from lo to hi list i => ( + h := maps#(i-lo); + if h_0 == 0 then continue else h + ); + --print("makde it here"); + return map(tar,src,mapHash,opts) + ); + -- At this point, the first entry of 'maps' is a List. + -- Check: it is a table of ComplexMap + -*R := ring tar; + if R =!= ring src then error "expected complexes over the same ring"; + if not isTable maps then error "expected a table of SimplicialModuleMaps"; + -- check: all entries which are SimplicialModuleMaps have the same homological degree + deg := if opts.Degree === null + then null + else if instance(opts.Degree, ZZ) then + opts.Degree + else + error "expected integer degree"; + degs := unique for f in flatten maps list + if instance(f,ZZdFactorizationMap) + then degree f + else continue; + if #degs > 1 then error "expected all ZZdFactorizationMaps to have the same degree"; + if deg =!= null and #degs == 1 and degs#0 =!= deg then error "Supplied degree is incompatible with the ComplexMaps"; + if deg === null then deg = (if #degs == 1 then degs#0 else 0); + -- At this point, we need to create (block) matrices for each component of the complex. + mapHash = hashTable for i from lo to hi list i => ( + newmaps := applyTable(maps, f -> if instance(f,SimplicialModuleMap) then f_i else f); + h := map(tar_(i+deg), src_i, matrix newmaps); + if h == 0 then continue else h + ); + map(tar,src,mapHash,opts, Degree=>deg)*- + ) + +-*flatten(SimplicialModuleMap) := SimplicialModuleMap => phi -> (if instance((keys phi.map)#0,ZZ) then return phi + else (*- + + +SimplicialModuleMap _ ZZ := Matrix => (f,i) -> ( + if f.map#?i then f.map#i else map((target f)_(i + degree f), (source f)_i, 0)) + +SimplicialModuleMap _ Sequence := Matrix => (f,s) -> ( + if f.map#?s then f.map#s else map((target f)_(s#0 + degree f), (source f)_(s#0), 0)) + + + + +-*expression SimplicialModuleMap := Expression => f -> ( + d := degree f; + s := sort keys f.map; + if #s === 0 then + new ZeroExpression from {0} + else new VerticalList from for i in s list + RowExpression {(i#0+d,i#1), ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + )*- + +expression SimplicialModuleMap := Expression => f -> ( + d := degree f; + s := sort keys f.map; + if #s === 0 then + new ZeroExpression from {0} + else if instance(s_0,Sequence) then new VerticalList from for i in s list + RowExpression {(i#0+d,i#1), ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + else if instance(s_0,ZZ) then return new VerticalList from for i in s list + RowExpression {i+d, ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + ) + +-*net SimplicialModuleMap := Net => f -> ( + v := between("", + for i in sort keys f.map list ( + horizontalJoin( + net ((i#0+f.degree,i#1)), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + ) + )); + if # v === 0 then net "0" + else stack v + )*- + + net SimplicialModuleMap := Net => f -> ( + v := between("", + for i in sort keys f.map list ( + if instance(i,Sequence) then (horizontalJoin( + net ((i#0+f.degree,i#1)), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + )) + else (horizontalJoin( + net (i+f.degree), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + )) + )); + if # v === 0 then net "0" + else stack v + ) + + + + SimplicialModule = new Type of MutableHashTable -- + -- note: we make this mutable in order to construct the + -- differential as a morphism of ZZdFactorizations (in the style of Complexes) + -- BUT: after construction, it is should be IMMUTABLE!! + -- at some point, we might want to allow lazy determination of the modules and maps + -- but for now, we insist that all modules and maps are explicit. + -- key: + -- ring + -- modules: hash table: ZZ => Module + -- differential: ComplexMap from C --> C, degree -1 (mod d) + -- period: an integer d, tells us for which d the factorization C is ZZ/d-graded + -- cache: a CacheTable + + SimplicialModuleMap = new Type of HashTable + -- keys: + -- degree: ZZ + -- source: Simplicial module over a ring R + -- target: simplicial module over the same ring R + -- maps themselves (HashTable of Matrices), keys lying in the concentration period of the source. + -- not all of the keys maps#i, need be present. + -- missing ones are presumed to be zero maps. + -- cache: a CacheTable + -- cache.isCommutative: whether this map commutes with the differentials + -- not set until needed. unset means we have not checked yet, + -- and the user hasn't declared it to be true/false yet. + +SimplicialModule.synonym = "Simplicial Module" +SimplicialModuleMap.synonym = "Map of Simplicial Modules" + +topDegree = method(); +topDegree SimplicialModule := ZZ => S -> S.topDegree + +ring SimplicialModule := Ring => S -> S.ring + +moduleMaker = (C,d) -> ( + moduleList := new MutableHashTable; + maxK := min (d, length C); + for k to maxK do ( + moduleList#(d,k) = directSum toList( + binomial(d,k):(C_k)); + ); + for i in (sort keys moduleList) list (i,moduleList#i) + ) + +mapMaker = (phi,d) -> ( + mapList := new MutableHashTable; + maxK = min (d, max(length source phi,length target phi)); + for k to maxK do ( + mapList#(d,k) = directSum toList( + binomial(d,k):(phi_k)); + ); + for i in (sort keys mapList) list (i,mapList#i) + ) + +combineSFactors = method(); +combineSFactors(SimplicialModule,ZZ) := (S,d) -> (directSum for i to min(d,S.complexLength) list (S.module)#(d,i)) + +--H1 is the face maps, H2 is the degeneracy maps +simplicialModule = method(Options => {Base=>0,Degeneracy => false}) +simplicialModule(Complex,HashTable,HashTable,ZZ) := SimplicialModule => opts -> (C,H1,H2,d) -> ( + spots := sort keys H1; + if #spots === 0 then + error "expected at least one map"; + R := ring C; + moduleList := new MutableHashTable; + for b to d do ( + maxK = min (b, length C); + for k to maxK do ( + moduleList#(b,k) = directSum toList(binomial(b,k):(C_k)); + ); + ); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => new HashTable from moduleList, + symbol cache => new CacheTable, + symbol complexLength => length C, + symbol complex => C + }; + S.dd = map(S,S,H1,Degree=>-1); + S.ss = map(S,S,H2,Degree=>1); + S + ) + +--H1 is the face maps +simplicialModule(Complex,HashTable,ZZ) := SimplicialModule => opts -> (C,H1,d) -> (--print("made it here!"); + spots := sort keys H1; + if #spots === 0 then + error "expected at least one map"; + R := ring C; + moduleList := new MutableHashTable; + for b to d do ( + maxK = min (b, length C); + for k to maxK do ( + moduleList#(b,k) = directSum toList(binomial(b,k):(C_k)); + ); + ); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => new HashTable from moduleList, + symbol cache => new CacheTable, + symbol complexLength => length C, + symbol complex => C + }; + S.dd = map(S,S,H1,Degree=>-1); + S + ) + +simplicialModule(HashTable,HashTable,HashTable,ZZ) := SimplicialModule => opts -> (L,H1,H2,d) -> (--print("we got started"); + R := ring (L#((keys L)#0)); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => L, + symbol cache => new CacheTable, + }; + --print("made it to face"); + S.dd = map(S,S,H1,Degree=>-1); + --print("we are almost done"); + S.ss = map(S,S,H2,Degree=>1); + S + ) + +simplicialModule(HashTable,HashTable,ZZ) := SimplicialModule => opts -> (L,H1,d) -> (--print("we got started"); + R := ring (L#((keys L)#0)); + S := new SimplicialModule from { + symbol ring => R, + symbol topDegree => d, + symbol module => L, + symbol cache => new CacheTable, + }; + --print("made it to face"); + S.dd = map(S,S,H1,Degree=>-1); + --print("we are almost done"); + S + ) + + +simplicialModule(Complex,ZZ) := SimplicialModule => opts -> (C,d) -> ( + --C is a chain complex, output is the Dold-Kan image of C in the category of simplicial modules + if not instance(opts.Base, ZZ) then + error "expected Base to be an integer"; + if instance(C,Complex) then ( + if opts.Degeneracy == true then (degenmapHash := hashTable flatten for n from 1 to d-1 list ( + for i from 0 to n list ( + (n,i) => degenMapiModified(n,i,C) + ) + );); + facemapHash := hashTable flatten for n from 1 to d list ( + for i from 0 to n list ( + (n,i) => faceMapiModified(n,i,C) + ) + ); + --print("mde it here first"); + if opts.Degeneracy == true then break return simplicialModule(C,facemapHash,degenmapHash,d); + --print("made it here"); + return simplicialModule(C,facemapHash,d) + ); + ) + + simplicialModule(Complex) := SimplicialModule => opts -> C -> (simplicialModule(C,length C,Degeneracy => opts.Degeneracy)) + + simplicialModule(Module,ZZ) := SimplicialModule => opts -> (M,d) -> (simplicialModule(complex M,d,Degeneracy => opts.Degeneracy)) + + +SimplicialModule _ Sequence := Module => (S,p) -> ( + if #p =!= 2 then + error ("Expected a pair of integer indices"); + if S.module#?(p#0,p#1) then S.module#(p#0,p#1) else (ring S)^0 + ) +SimplicialModule _ ZZ := Module => (S,n) -> directSum for i in keys (S.module) list (if first(splice(toSequence{i}))==n then S.module#(i) else continue) + +net SimplicialModule := S -> ( + (lo,hi) := (0,topDegree S); + if lo > hi then + error "In a complex, lo <= hi should always hold in the concentration" + --"0" + else if lo == hi and C_lo === 0 then + "0" + else if any(keys S,i->i==symbol complex) then + (horizontalJoin between(" <-- ", + for i from lo to hi list + stack (net directSum(for k from 0 to min(i,S.complexLength) list (S.module)#(i,k)), " ", net i))) + else + horizontalJoin between(" <-- ", + for i from lo to hi list + stack (net ((S.module)#i), " ", net i)) + ) + + + Symbol ^ SimplicialModule := SimplicialModuleMap => (sym, C) -> ( + if sym === dd then C.dd; + if sym === ss then C.ss + else error "expected symbol to be 'dd' or 'ss'" + ) + + lineOnTop := (s) -> concatenate(width s : "-") || s + +source SimplicialModuleMap := SimplicialModule => f -> f.source +target SimplicialModuleMap := SimplicialModule => f -> f.target +ring SimplicialModuleMap := SimplicialModule => f -> ring source f +degree SimplicialModuleMap := ZZ => f -> f.degree + +isHomogeneous SimplicialModuleMap := (f) -> all(values f.map, isHomogeneous) + +simplicialModuleMap = method(Options => {Degeneracy => false}); +simplicialModuleMap(ComplexMap,ZZ) := SimplicialModuleMap => opts -> (phi,d) -> ( + src := simplicialModule(source phi,d); + trg := simplicialModule(target phi,d); + map(trg,src,new HashTable from for i to d list i => directSum apply(mapMaker(phi,i),j->j_1),Degree => degree phi) + ) + + +-*map(SimplicialModule, SimplicialModule, HashTable) := SimplicialModuleMap => opts -> (tar, src, maps) -> ( + if not(topDegree tar == topDegree src) then error "expected source and target to have the same top degree"; + R := ring tar; + if ring src =!= R or any(values maps, f -> ring f =!= R) then + error "expected source, target and maps to be over the same ring"; + deg := if opts.Degree === null + then 0 + else if instance(opts.Degree, ZZ) then + opts.Degree + else + error "expected integer degree"; + (lo,hi) := (0,topDegree tar); + maps' := hashTable for k in keys maps list ( + if not instance(k_0, ZZ) then error "expected integer keys"; + f := maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + if rank source f != rank src_(first k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if rank target f != rank tar_(first(k)+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if first k < lo or first k > hi then continue else (k,f) + ); + new SimplicialModuleMap from { + symbol source => src, + symbol target => tar, + symbol degree => deg, + symbol map => maps', + symbol cache => new CacheTable + } + )*- + +map(SimplicialModule, SimplicialModule, HashTable) := SimplicialModuleMap => opts -> (tar, src, maps) -> ( + if not(topDegree tar == topDegree src) then error "expected source and target to have the same top degree"; + R := ring tar; + if ring src =!= R or any(values maps, f -> ring f =!= R) then + error "expected source, target and maps to be over the same ring"; + deg := if opts.Degree === null + then 0 + else if instance(opts.Degree, ZZ) then + opts.Degree + else + error "expected integer degree"; + (lo,hi) := (0,topDegree tar); + maps' := hashTable for k in keys maps list ( + if instance(k, Sequence) then ( + f := maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + if rank source f != rank src_(first k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if rank target f != rank tar_(first(k)+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if first k < lo or first k > hi then continue else (k,f) + ) + else ( + f := maps#k; + -- note: we use != instead of =!= in the next 2 tests, + -- since we want to ignore any term order differences + --print(k); + --print(source f); + --print(src_(first k)); + if rank source f != rank src_(k) then ( + error ("map with index "|toString(k)|" has inconsistent source"); + ); + if rank target f != rank tar_(k+deg) then + error ("map with index "|toString(k)|" has inconsistent target"); + if k < lo or k > hi then continue else (k,f) + )); + new SimplicialModuleMap from { + symbol source => src, + symbol target => tar, + symbol degree => deg, + symbol map => maps', + symbol cache => new CacheTable + } + ) + +map(SimplicialModule, SimplicialModule, List) := SimplicialModuleMap => opts -> (tar, src, maps) -> ( + -- case 1: maps is a (single) list of matrices (maps between components of the complex) + -- case 2: maps is a double list of ComplexMap's + -- in this case, if the maps all commute with differentials, and are diagonal, then + -- we could declare the result to be commutative as well. Should we do this? + -- Can tell, depending on the class of maps#0. + (lo,hi) := (0,topDegree tar); + if instance(maps#0, List) then ( + mapHash := hashTable for i from lo to hi list i => ( + h := maps#(i-lo); + if h_0 == 0 then continue else h + ); + --print("makde it here"); + return map(tar,src,mapHash,opts) + ); + -- At this point, the first entry of 'maps' is a List. + -- Check: it is a table of ComplexMap + -*R := ring tar; + if R =!= ring src then error "expected complexes over the same ring"; + if not isTable maps then error "expected a table of SimplicialModuleMaps"; + -- check: all entries which are SimplicialModuleMaps have the same homological degree + deg := if opts.Degree === null + then null + else if instance(opts.Degree, ZZ) then + opts.Degree + else + error "expected integer degree"; + degs := unique for f in flatten maps list + if instance(f,ZZdFactorizationMap) + then degree f + else continue; + if #degs > 1 then error "expected all ZZdFactorizationMaps to have the same degree"; + if deg =!= null and #degs == 1 and degs#0 =!= deg then error "Supplied degree is incompatible with the ComplexMaps"; + if deg === null then deg = (if #degs == 1 then degs#0 else 0); + -- At this point, we need to create (block) matrices for each component of the complex. + mapHash = hashTable for i from lo to hi list i => ( + newmaps := applyTable(maps, f -> if instance(f,SimplicialModuleMap) then f_i else f); + h := map(tar_(i+deg), src_i, matrix newmaps); + if h == 0 then continue else h + ); + map(tar,src,mapHash,opts, Degree=>deg)*- + ) + +-*flatten(SimplicialModuleMap) := SimplicialModuleMap => phi -> (if instance((keys phi.map)#0,ZZ) then return phi + else (*- + + +SimplicialModuleMap _ ZZ := Matrix => (f,i) -> ( + if f.map#?i then f.map#i else map((target f)_(i + degree f), (source f)_i, 0)) + +SimplicialModuleMap _ Sequence := Matrix => (f,s) -> ( + if f.map#?s then f.map#s else map((target f)_(s#0 + degree f), (source f)_(s#0), 0)) + + + + +-*expression SimplicialModuleMap := Expression => f -> ( + d := degree f; + s := sort keys f.map; + if #s === 0 then + new ZeroExpression from {0} + else new VerticalList from for i in s list + RowExpression {(i#0+d,i#1), ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + )*- + +expression SimplicialModuleMap := Expression => f -> ( + d := degree f; + s := sort keys f.map; + if #s === 0 then + new ZeroExpression from {0} + else if instance(s_0,Sequence) then new VerticalList from for i in s list + RowExpression {(i#0+d,i#1), ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + else if instance(s_0,ZZ) then return new VerticalList from for i in s list + RowExpression {i+d, ":", MapExpression { target f_i, source f_i, f_i }, ":", i} + ) + +-*net SimplicialModuleMap := Net => f -> ( + v := between("", + for i in sort keys f.map list ( + horizontalJoin( + net ((i#0+f.degree,i#1)), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + ) + )); + if # v === 0 then net "0" + else stack v + )*- + + net SimplicialModuleMap := Net => f -> ( + v := between("", + for i in sort keys f.map list ( + if instance(i,Sequence) then (horizontalJoin( + net ((i#0+f.degree,i#1)), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + )) + else (horizontalJoin( + net (i+f.degree), " : ", net target f_i, " <--", + lineOnTop net f_i, + "-- ", net source f_i, " : ", net i + )) + )); + if # v === 0 then net "0" + else stack v + ) + + + From 8b24e46c2a850404eb02fb716b6e49b6224a6c32 Mon Sep 17 00:00:00 2001 From: kellerlv <54511397+kellerlv@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:07:21 -0400 Subject: [PATCH 102/691] Fixed typos --- .../packages/SimplicialModules/SimplicialModuleDOC.m2 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 index 19ac21cb776..d12d98c46b9 100644 --- a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleDOC.m2 @@ -6,7 +6,7 @@ doc /// Description Text A simplicial R-module is a presheaf on the so-called Simplex Category, with values in the category of R-modules. Concretely, such objects can be viewed as nonnegatively graded R-modules - equipped with certain face and degeneracy operators satisfying the simplicial identites. As an example, every R-module M can be converted into a simplicial R-module whose degree + equipped with certain face and degeneracy operators satisfying the simplicial identities. As an example, every R-module M can be converted into a simplicial R-module whose degree n piece is equal to M for all n, and with face/degeneracy operators simply given by the identity. Example S = simplicialModule(ZZ^2,3,Degeneracy => true) --the integer 3 specifies a top degree, the option Degeneracy specifies whether or not to compute degeneracy maps @@ -143,7 +143,7 @@ doc /// Description Text A simplicial R-module is a presheaf on the so-called Simplex Category, with values in the category of R-modules. Concretely, such objects can be viewed as nonnegatively graded R-modules - equipped with certain face and degeneracy operators satisfying the simplicial identites. As an example, every R-module M can be converted into a simplicial R-module whose degree + equipped with certain face and degeneracy operators satisfying the simplicial identities. As an example, every R-module M can be converted into a simplicial R-module whose degree n piece is equal to M for all n, and with face/degeneracy operators simply given by the identity. Example S = simplicialModule(ZZ^2,3,Degeneracy => true) --the integer 3 specifies a top degree, the option Degeneracy specifies whether or not to compute degeneracy maps @@ -228,7 +228,7 @@ doc /// The above computations tell us that the component of the face map $d_{2,0}$ mapping $$C_{(1,2)} \to C_{(2)} $$ is given by the differential of the original complex $C$ (we are using the compositions - correponding to the surjection to label the free modules now). The component + corresponding to the surjection to label the free modules now). The component $$C_{(2,1)} \to C_{(1,1)}$$ is simply the identity map, and the component $$C_{(1,1,1)} \to C_{(1,1)}$$ @@ -3530,7 +3530,7 @@ doc /// Q = ZZ/3[a,b]; K = koszulComplex vars Q; prune HH schurMap({2}, K) - prune HH complex sym2(chainComplex K) --quasi-isomorphic in all other characterisics + prune HH complex sym2(chainComplex K) --quasi-isomorphic in all other characteristics --S3K = elapsedTime minimize prune schurMap({3}, K) --takes 23 seconds --S21K = elapsedTime minimize prune schurMap({2,1}, K) --takes 17 seconds --S21K.dd From 30402be3dd02e69f5aaad8dbd54b5426a2b28a80 Mon Sep 17 00:00:00 2001 From: kellerlv <54511397+kellerlv@users.noreply.github.com> Date: Thu, 14 Aug 2025 08:15:07 -0400 Subject: [PATCH 103/691] Bug fix in test 5 (forgot to update old function name) --- .../packages/SimplicialModules/SimplicialModuleTESTS1.m2 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 index a8405c35b1b..5ee2e76fad0 100644 --- a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 @@ -133,9 +133,9 @@ S = ZZ/101[a..d] I = ideal(a^2-b, c^3) C3 = simplicialModule( I, 7, Degeneracy => true) C4 = simplicialModule( (S/I), 8, Degeneracy => true) - assert isSimplicial C2 - assert isSimplicial C3 - assert isSimplicial C4 + assert isSimplicialModule C2 + assert isSimplicialModule C3 + assert isSimplicialModule C4 C5 = simplicialModule(S^0, 8, Degeneracy => true) assert(C5 == 0) assert (dd^C5 == 0) From c136b1721c382263f4cfc336952c167ef598e4dd Mon Sep 17 00:00:00 2001 From: kellerlv <54511397+kellerlv@users.noreply.github.com> Date: Thu, 14 Aug 2025 18:03:36 -0400 Subject: [PATCH 104/691] Pruned down tests Should now run without taking too much memory --- .../SimplicialModuleTESTS1.m2 | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 index 5ee2e76fad0..a614fc3036b 100644 --- a/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 +++ b/M2/Macaulay2/packages/SimplicialModules/SimplicialModuleTESTS1.m2 @@ -598,14 +598,14 @@ S = ZZ/101[a,b,c]; D = C ** C isWellDefined D f1 = prune randomSimplicialMap(D, C, Cycle => true, InternalDegree => 1); - prune normalize f1 - isCommutative oo - isCommutative f1 + g1 = prune normalize f1 + assert(isCommutative g1) + assert(isCommutative f1) assert(degree f1 == 0) - f2 = randomSimplicialMap(D, C, Cycle => true); - isCommutative f2 - assert(degree f2 == 0) - assert isSimplicialMorphism f2 + --f2 = randomSimplicialMap(D, C, Cycle => true); + --isCommutative f2 + --assert(degree f2 == 0) + --assert isSimplicialMorphism f2 /// TEST /// @@ -1128,7 +1128,7 @@ Q = QQ[x_1..x_3]; K = koszulComplex {x_1,x_2} assert isWellDefined (Sc = schurMap({1,1}, K)) prune extPower(2, K) - assert isWellDefined prune schurMap({2,1}, K, TopDegree => 4) + --assert isWellDefined prune schurMap({2,1}, K, TopDegree => 4) /// @@ -1182,7 +1182,7 @@ R = ZZ/101[x_1..x_3]; assert(K == prune Kn) Q = ZZ/3[a,b]; K = koszulComplex vars Q - SK = simplicialModule(K,6) --want top degree 6 since the resulting complexes should have length 6 + SK = simplicialModule(K,4) --want top degree 6 since the resulting complexes should have length 6 w21K = extPower(2, SK) ** SK w3K = extPower(3, SK) H = hashTable for i from 0 to 6 list i => dual wedgeProduct(2,1, dual SK_i); @@ -1191,7 +1191,7 @@ R = ZZ/101[x_1..x_3]; assert isCommutative inclusion Q = ZZ/2[a,b,c] K = koszulComplex vars Q - phi = elapsedTime exteriorInclusion(K,4); --specify top degree 4 + phi = elapsedTime exteriorInclusion(K,3); --specify top degree 3 assert isWellDefined phi assert isCommutative phi /// From 69b9c264d06e3a44d112c11f33f1a20efe8d58c3 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 21 Aug 2025 15:40:14 -0400 Subject: [PATCH 105/691] Revert "Regenerate tvalues.m2 if d directory has been updated" This reverts commit b0e6bb9d1729598b837344b8c45c101769548f94. --- M2/Macaulay2/m2/typicalvalues.m2 | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/M2/Macaulay2/m2/typicalvalues.m2 b/M2/Macaulay2/m2/typicalvalues.m2 index a61cf4eba50..82efde7c1d3 100644 --- a/M2/Macaulay2/m2/typicalvalues.m2 +++ b/M2/Macaulay2/m2/typicalvalues.m2 @@ -125,12 +125,8 @@ generateTypicalValues = (srcdir) -> ( outfile << "-- DONE: generated based on " | version#"git description" << endl << close) -- if missing or not successfully generated, tvalues.m2 is regenerated directly -ddir := currentFileDirectory | "../d/" -if ( - not fileExists typicalValuesSource or - not match("-- DONE", get typicalValuesSource) or - isDirectory ddir and fileTime typicalValuesSource < fileTime ddir) -then generateTypicalValues ddir +if not fileExists typicalValuesSource or not match("-- DONE", get typicalValuesSource) +then generateTypicalValues(currentFileDirectory | "../d/") ----------------------------------------------------------------------------- -- numerical functions that will be wrapped From df03ac03ce52415f8010ac866a3e0929d531383d Mon Sep 17 00:00:00 2001 From: Ben Spitz <1844060+diracdeltafunk@users.noreply.github.com> Date: Thu, 10 Jul 2025 22:44:57 -0400 Subject: [PATCH 106/691] fixed `makeFreeModuleSurjection` --- .../CpMackeyFunctors/Code/Resolutions.m2 | 7 ++++-- .../CpMackeyFunctors/Tests/ResolutionTests.m2 | 22 +++++++------------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Resolutions.m2 b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Resolutions.m2 index 1501459f980..565e4d58bc5 100644 --- a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Resolutions.m2 +++ b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Resolutions.m2 @@ -1,11 +1,14 @@ --- first make sure we hit everything on the bottom makeFreeModuleSurjection = method() makeFreeModuleSurjection(CpMackeyFunctor) := MackeyFunctorHomomorphism => (M) -> ( gensUnderlying0 := mingens cokernel (id_(M.Underlying) - M.Conj); gensUnderlying := inducedMap(M.Underlying, source gensUnderlying0, gensUnderlying0); gensFixed0 := mingens cokernel (M.Trans * gensUnderlying); gensFixed := inducedMap(M.Fixed, source gensFixed0, gensFixed0); - makeUniversalMap(M, gensUnderlying, gensFixed) + f := makeUniversalMap(M, gensUnderlying, gensFixed); + gensTorsion0 := mingens ((cokernel f).Underlying); + gensTorsion := inducedMap(M.Underlying, source gensTorsion0, gensTorsion0); + g:= makeUniversalMapUnderlying(M, gensTorsion); + f|g ) -- get resolution up to F_(n-1) <-- F_n diff --git a/M2/Macaulay2/packages/CpMackeyFunctors/Tests/ResolutionTests.m2 b/M2/Macaulay2/packages/CpMackeyFunctors/Tests/ResolutionTests.m2 index 2fb9b483178..3e5a0990000 100644 --- a/M2/Macaulay2/packages/CpMackeyFunctors/Tests/ResolutionTests.m2 +++ b/M2/Macaulay2/packages/CpMackeyFunctors/Tests/ResolutionTests.m2 @@ -1,17 +1,11 @@ TEST /// -F = (cokernel matrix {{84}}) ++ (cokernel matrix {{28}}) -U = (cokernel matrix {{2}}) ++ module ZZ -r = map(U,F, matrix {{1,1}, {0,0}}) -t = map(F,U, matrix {{42,42}, {0,14}}) -c = map(U,U, matrix {{1, 0}, {0,-1}}) -cursedMF := makeCpMackeyFunctor(2,r,t,c) +-- if this passes then free resolutions should be exact. +for i to 50 do ( + p = 2; + M = makeRandomCpMackeyFunctor(p); + d = res(M, 0); + assert isTrivialMackeyFunctor coker d_0; +); --- verify free resolutions are in fact complexes -d = res(cursedMF,3) -for i to (length d) - 2 do ( - comp = d#i * d#(i+1); - assert(comp.UnderlyingMap == 0 and comp.FixedMap == 0) -) - -/// +/// \ No newline at end of file From 2f99a9f3f34d49010e190121e646cdbf15eb3213 Mon Sep 17 00:00:00 2001 From: Ben Spitz <1844060+diracdeltafunk@users.noreply.github.com> Date: Thu, 10 Jul 2025 22:57:54 -0400 Subject: [PATCH 107/691] better sanity checks for homalg --- .../CpMackeyFunctors/Tests/HomAlgTest.m2 | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 b/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 index 269a1ece310..80e9c70ec39 100644 --- a/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 +++ b/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 @@ -1,31 +1,29 @@ TEST /// p = 2; -F = (cokernel matrix {{84}}) ++ (cokernel matrix {{28}}) -U = (cokernel matrix {{2}}) ++ module ZZ -r = map(U,F, matrix {{1,1}, {0,0}}) -t = map(F,U, matrix {{42,42}, {0,14}}) -c = map(U,U, matrix {{1, 0}, {0,-1}}) -cursedMF := makeCpMackeyFunctor(p,r,t,c) - -d = res(cursedMF,10); - - --- check that Tor_i(A,-) and Tor_i(B,-) and Ext^i(A,-) and Ext^i(B,-) are zero for i > 0 A = makeBurnsideMackeyFunctor p; B = makeBurnsideMackeyFunctor p; -for i from 1 to 5 do ( + +-- check that A and B have projective dimension 0, i.e. +-- Tor_i(A,-) and Tor_i(B,-) and Ext^i(A,-) and Ext^i(B,-) are zero for i > 0 +for n to 5 do ( + M = makeRandomCpMackeyFunctor p; + for i from 1 to 5 do ( + assert(isTrivialMackeyFunctor Tor_i(A,M)); + assert(isTrivialMackeyFunctor Tor_i(B,M)); + assert(isTrivialMackeyFunctor Ext^i(A,M)); + assert(isTrivialMackeyFunctor Ext^i(B,M)); + ); +); + +-- Check that A and B have injective dimension 1, i.e. +-- Ext^i(-,A) and Ext^i(-,B) are zero for i > 1 +for n to 5 do ( M = makeRandomCpMackeyFunctor p; - assert(isTrivialMackeyFunctor Tor_i(A,M)); - assert(isTrivialMackeyFunctor Tor_i(B,M)); - assert(isTrivialMackeyFunctor Ext^i(A,M)); - assert(isTrivialMackeyFunctor Ext^i(B,M)); -) + for i from 2 to 5 do ( + assert(isTrivialMackeyFunctor Ext^i(M,A)); + assert(isTrivialMackeyFunctor Ext^i(M,B)); + ); +); --- testing Ext --- check that Ext^0 is internalHom -M = makeRandomCpMackeyFunctor p; -assert(prune Ext^0(A,A) == prune internalHom(A,A)) -assert(prune Ext^0(A,cursedMF) == prune internalHom(A,cursedMF)) -assert(prune Ext^0(M,cursedMF) == prune internalHom(M,cursedMF)) /// From e7cf8385457e7d86099a779538d3815c05e718b5 Mon Sep 17 00:00:00 2001 From: Ben Spitz <1844060+diracdeltafunk@users.noreply.github.com> Date: Fri, 11 Jul 2025 09:43:37 -0400 Subject: [PATCH 108/691] faster HomAlg test --- .../CpMackeyFunctors/Tests/HomAlgTest.m2 | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 b/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 index 80e9c70ec39..2beb247780a 100644 --- a/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 +++ b/M2/Macaulay2/packages/CpMackeyFunctors/Tests/HomAlgTest.m2 @@ -6,24 +6,18 @@ B = makeBurnsideMackeyFunctor p; -- check that A and B have projective dimension 0, i.e. -- Tor_i(A,-) and Tor_i(B,-) and Ext^i(A,-) and Ext^i(B,-) are zero for i > 0 -for n to 5 do ( - M = makeRandomCpMackeyFunctor p; - for i from 1 to 5 do ( - assert(isTrivialMackeyFunctor Tor_i(A,M)); - assert(isTrivialMackeyFunctor Tor_i(B,M)); - assert(isTrivialMackeyFunctor Ext^i(A,M)); - assert(isTrivialMackeyFunctor Ext^i(B,M)); - ); -); - --- Check that A and B have injective dimension 1, i.e. +-- and that A and B have injective dimension 1, i.e. -- Ext^i(-,A) and Ext^i(-,B) are zero for i > 1 -for n to 5 do ( - M = makeRandomCpMackeyFunctor p; - for i from 2 to 5 do ( - assert(isTrivialMackeyFunctor Ext^i(M,A)); - assert(isTrivialMackeyFunctor Ext^i(M,B)); - ); +M = makeRandomCpMackeyFunctor p; +for i from 1 to 5 do ( + assert(isTrivialMackeyFunctor Tor_i(A,M)); + assert(isTrivialMackeyFunctor Tor_i(B,M)); + assert(isTrivialMackeyFunctor Ext^i(A,M)); + assert(isTrivialMackeyFunctor Ext^i(B,M)); +); +for i from 2 to 5 do ( + assert(isTrivialMackeyFunctor Ext^i(M,A)); + assert(isTrivialMackeyFunctor Ext^i(M,B)); ); /// From 6b90d187402f19fb7abd786cc6c7b361d2cb3448 Mon Sep 17 00:00:00 2001 From: Ben Spitz <1844060+diracdeltafunk@users.noreply.github.com> Date: Fri, 11 Jul 2025 09:47:51 -0400 Subject: [PATCH 109/691] fixed cohomological resolutions --- .../packages/CpMackeyFunctors/Code/Cohomological.m2 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 index e5de9b6bfde..49e51697992 100644 --- a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 +++ b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 @@ -34,7 +34,11 @@ makeFreeModuleSurjectionCohomological(CpMackeyFunctor) := MackeyFunctorHomomorph gensUnderlying := inducedMap(M.Underlying, source gensUnderlying0, gensUnderlying0); gensFixed0 := mingens cokernel (M.Trans * gensUnderlying); gensFixed := inducedMap(M.Fixed, source gensFixed0, gensFixed0); - makeUniversalMapCohomological(M, gensUnderlying, gensFixed) + f := makeUniversalMapCohomological(M, gensUnderlying, gensFixed); + gensTorsion0 := mingens ((cokernel f).Underlying); + gensTorsion := inducedMap(M.Underlying, source gensTorsion0, gensTorsion0); + g := makeUniversalMapUnderlying(M, gensTorsion); + f | g ) From e4f11704625d84f9b7d426363de9fa1ce2f8aef4 Mon Sep 17 00:00:00 2001 From: Ben Spitz <1844060+diracdeltafunk@users.noreply.github.com> Date: Sat, 12 Jul 2025 09:54:06 -0400 Subject: [PATCH 110/691] typo in comment --- M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 index 49e51697992..aa7816fabd2 100644 --- a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 +++ b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Cohomological.m2 @@ -1,8 +1,8 @@ ------additional stuff for cohomological Mackey functors------ makeUniversalMapFixedCohomological = method() --- Given a Mackey functor M and vector x in fixed module, produce map A -> M +-- Given a Mackey functor M and vector x in fixed module, produce map Z -> M makeUniversalMapFixedCohomological(CpMackeyFunctor,Vector) := MackeyFunctorHomomorphism => (M,x) -> makeUniversalMapFixedCohomological(M,matrix x) --- Given a Mackey functor M and a matrix of n vectors in fixed module, produce map A^n -> M +-- Given a Mackey functor M and a matrix of n vectors in fixed module, produce map Z^n -> M makeUniversalMapFixedCohomological(CpMackeyFunctor,Matrix) := MackeyFunctorHomomorphism => (M,x) -> ( if not isCohomological(M) then error "input is not a cohomological Mackey functor"; n := numColumns x; From e749769503158dea8c9cc1b02088e2ac386682a9 Mon Sep 17 00:00:00 2001 From: Ben Spitz <1844060+diracdeltafunk@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:35:09 -0400 Subject: [PATCH 111/691] restore degree info --- M2/Macaulay2/packages/CpMackeyFunctors/Code/Homomorphisms.m2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Homomorphisms.m2 b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Homomorphisms.m2 index 95574aea268..7e6f5137e4b 100644 --- a/M2/Macaulay2/packages/CpMackeyFunctors/Code/Homomorphisms.m2 +++ b/M2/Macaulay2/packages/CpMackeyFunctors/Code/Homomorphisms.m2 @@ -10,6 +10,8 @@ isMorphism MackeyFunctorHomomorphism := f -> true ring MackeyFunctorHomomorphism := f -> ZZ -- Hack to make matrix() work; unclear if this is justified. promote (MackeyFunctorHomomorphism, ZZ) := (f,R) -> f +-- This is true, we don't have gradings +degree MackeyFunctorHomomorphism := f -> 0 isWellDefined MackeyFunctorHomomorphism := Boolean => F ->( -- Verify the keys are correct From ab058847a838927c4615c94c88d91f2020f4a7c0 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 06:29:07 -0400 Subject: [PATCH 112/691] CCi support for more special functions --- M2/Macaulay2/d/actors3.d | 144 +++++++++++++++++++++++++++++++++++-- M2/Macaulay2/d/ballarith.d | 91 +++++++++++++++++++++++ 2 files changed, 231 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index e3dc221e377..288074df2a4 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -922,16 +922,28 @@ regularizedGamma(e:Expr):Expr := ( midpointRR(regularizedGamma(toRRi(s.v), toRRi(x.v)))) -- # typical value: regularizedGamma, RR, RR, RR is x:RRicell do toExpr(regularizedGamma(toRRi(s.v), x.v)) -- # typical value: regularizedGamma, RR, RRi, RRi is x:CCcell do toExpr(regularizedGamma(toCC(s.v), x.v)) -- # typical value: regularizedGamma, RR, CC, CC + is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) -- # typical value: regularizedGamma, RR, CCi, CCi else WrongArgRRorCC(2)) is s:RRicell do ( when a.1 is x:RRcell do toExpr(regularizedGamma(s.v, toRRi(x.v))) -- # typical value: regularizedGamma, RRi, RR, RRi is x:RRicell do toExpr(regularizedGamma(s.v, x.v)) -- # typical value: regularizedGamma, RRi, RRi, RRi + is x:CCcell do toExpr(regularizedGamma(toCCi(s.v), toCCi(x.v))) -- # typical value: regularizedGamma, RRi, CC, CCi + is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) -- # typical value: regularizedGamma, RRi, CCi, CCi else WrongArgRRorRRi(2)) is s:CCcell do ( when a.1 is x:RRcell do toExpr(regularizedGamma(s.v, toCC(x.v))) -- # typical value: regularizedGamma, CC, RR, CC + is x:RRicell do toExpr(regularizedGamma(toCCi(s.v), toCCi(x.v))) -- # typical value: regularizedGamma, CC, RRi, CCi is x:CCcell do toExpr(regularizedGamma(s.v, x.v)) -- # typical value: regularizedGamma, CC, CC, CC + is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) -- # typical value: regularizedGamma, CC, CCi, CCi + else WrongArgRRorCC(2)) + is s:CCicell do ( + when a.1 + is x:RRcell do toExpr(regularizedGamma(s.v, toCCi(x.v))) -- # typical value: regularizedGamma, CCi, RR, CCi + is x:RRicell do toExpr(regularizedGamma(s.v, toCCi(x.v))) -- # typical value: regularizedGamma, CCi, RRi, CCi + is x:CCcell do toExpr(regularizedGamma(s.v, toCCi(x.v))) -- # typical value: regularizedGamma, CCi, CC, CCi + is x:CCicell do toExpr(regularizedGamma(s.v, x.v)) -- # typical value: regularizedGamma, CCi, CCi, CCi else WrongArgRRorCC(2)) else WrongArgRRorCC(2))) else WrongNumArgs(2)); @@ -941,6 +953,7 @@ Digamma(e:Expr):Expr := ( is x:RRcell do toExpr(Digamma(x.v)) -- # typical value: Digamma, RR, RR is x:RRicell do toExpr(Digamma(x.v)) -- # typical value: Digamma, RRi, RRi is x:CCcell do toExpr(Digamma(x.v)) -- # typical value: Digamma, CC, CC + is x:CCicell do toExpr(Digamma(x.v)) -- # typical value: Digamma, CCi, CCi else WrongArgRRorCC() ); setupfun("Digamma",Digamma).Protected=false; @@ -954,6 +967,7 @@ lgamma(e:Expr):Expr := ( is x:RRcell do lgamma(x.v) -- # typical value: lgamma, RR, RR is x:RRicell do toExpr(lgamma(x.v)) -- # typical value: lgamma, RRi, RRi is x:CCcell do toExpr(lgamma(x.v)) -- # typical value: lgamma, CC, CC + is x:CCicell do toExpr(lgamma(x.v)) -- # typical value: lgamma, CCi, CCi else WrongArgRRorCC() ); setupfun("lgamma",lgamma); @@ -962,6 +976,7 @@ zeta(e:Expr):Expr := ( is x:RRcell do toExpr(zeta(x.v)) -- # typical value: zeta, RR, RR is x:RRicell do toExpr(zeta(x.v)) -- # typical value: zeta, RRi, RRi is x:CCcell do toExpr(zeta(x.v)) -- # typical value: zeta, CC, CC + is x:CCicell do toExpr(zeta(x.v)) -- # typical value: zeta, CCi, CCi else WrongArgRRorCC() ); setupfun("zeta",zeta).Protected=false; @@ -970,6 +985,7 @@ erf(e:Expr):Expr := ( is x:RRcell do toExpr(erf(x.v)) -- # typical value: erf, RR, RR is x:RRicell do toExpr(erf(x.v)) -- # typical value: erf, RRi, RRi is x:CCcell do toExpr(erf(x.v)) -- # typical value: erf, CC, CC + is x:CCicell do toExpr(erf(x.v)) -- # typical value: erf, CCi, CCi else WrongArgRRorCC() ); setupfun("erf",erf).Protected=false; @@ -978,6 +994,7 @@ erfc(e:Expr):Expr := ( is x:RRcell do toExpr(erfc(x.v)) -- # typical value: erfc, RR, RR is x:RRicell do toExpr(erfc(x.v)) -- # typical value: erfc, RRi, RRi is x:CCcell do toExpr(erfc(x.v)) -- # typical value: erfc, CC, CC + is x:CCicell do toExpr(erfc(x.v)) -- # typical value: erfc, CCi, CCi else WrongArgRRorCC() ); setupfun("erfc",erfc).Protected=false; @@ -1000,6 +1017,7 @@ BesselJ(e:Expr):Expr := ( is x:RRcell do toExpr(BesselJ(toLong(n.v), x.v)) is x:RRicell do toExpr(BesselJ(toRRi(n.v,precision(x.v)),x.v)) is x:CCcell do toExpr(BesselJ(toCC(n.v), x.v)) + is x:CCicell do toExpr(BesselJ(toCCi(n.v), x.v)) else WrongArgRRorCC(2)) else ( when s.1 @@ -1007,6 +1025,7 @@ BesselJ(e:Expr):Expr := ( midpointRR(BesselJ(toRRi(n.v), toRRi(x.v)))) is x:RRicell do toExpr(BesselJ(toRRi(n.v,precision(x.v)),x.v)) is x:CCcell do toExpr(BesselJ(toCC(n.v), x.v )) + is x:CCicell do toExpr(BesselJ(toCCi(n.v), x.v )) else WrongArgRRorCC(2))) is n:RRcell do ( when s.1 @@ -1014,16 +1033,28 @@ BesselJ(e:Expr):Expr := ( midpointRR(BesselJ(toRRi(n.v), toRRi(x.v)))) is x:RRicell do toExpr(BesselJ(toRRi(n.v), x.v)) is x:CCcell do toExpr(BesselJ(toCC(n.v), x.v )) + is x:CCicell do toExpr(BesselJ(toCCi(n.v), x.v )) else WrongArgRRorCC(2)) is n:RRicell do ( when s.1 is x:RRcell do toExpr(BesselJ(n.v, toRRi(x.v))) is x:RRicell do toExpr(BesselJ(n.v, x.v)) - else WrongArgRRorRRi(2)) + is x:CCcell do toExpr(BesselJ(toCCi(n.v), toCCi(x.v))) + is x:CCicell do toExpr(BesselJ(toCCi(n.v), x.v)) + else WrongArgRRorCC(2)) is n:CCcell do ( when s.1 is x:RRcell do toExpr(BesselJ(n.v, toCC(x.v))) + is x:RRicell do toExpr(BesselJ(toCCi(n.v), toCCi(x.v))) is x:CCcell do toExpr(BesselJ(n.v, x.v )) + is x:CCicell do toExpr(BesselJ(toCCi(n.v), x.v )) + else WrongArgRRorCC(2)) + is n:CCicell do ( + when s.1 + is x:RRcell do toExpr(BesselJ(n.v, toCCi(x.v))) + is x:RRicell do toExpr(BesselJ(n.v, toCCi(x.v))) + is x:CCcell do toExpr(BesselJ(n.v, toCCi(x.v))) + is x:CCicell do toExpr(BesselJ(n.v, x.v)) else WrongArgRRorCC(2)) else WrongArg(1, "an integer, real number or interval, or complex number")) else WrongNumArgs(2)); @@ -1041,6 +1072,7 @@ BesselY(e:Expr):Expr := ( is x:RRcell do toExpr(BesselY(toLong(n.v), x.v)) is x:RRicell do toExpr(BesselY(toRRi(n.v,precision(x.v)),x.v)) is x:CCcell do toExpr(BesselY(toCC(n.v), x.v)) + is x:CCicell do toExpr(BesselY(toCCi(n.v), x.v)) else WrongArgRRorCC(2)) else ( when s.1 @@ -1048,6 +1080,7 @@ BesselY(e:Expr):Expr := ( midpointRR(BesselY(toRRi(n.v), toRRi(x.v)))) is x:RRicell do toExpr(BesselY(toRRi(n.v,precision(x.v)),x.v)) is x:CCcell do toExpr(BesselY(toCC(n.v), x.v )) + is x:CCicell do toExpr(BesselY(toCCi(n.v), x.v)) else WrongArgRRorCC(2))) is n:RRcell do ( when s.1 @@ -1055,16 +1088,28 @@ BesselY(e:Expr):Expr := ( midpointRR(BesselY(toRRi(n.v), toRRi(x.v)))) is x:RRicell do toExpr(BesselY(toRRi(n.v), x.v)) is x:CCcell do toExpr(BesselY(toCC(n.v), x.v )) + is x:CCicell do toExpr(BesselY(toCCi(n.v), x.v)) else WrongArgRRorCC(2)) is n:RRicell do ( when s.1 is x:RRcell do toExpr(BesselY(n.v, toRRi(x.v))) is x:RRicell do toExpr(BesselY(n.v, x.v)) + is x:CCcell do toExpr(BesselY(toCCi(n.v), toCCi(x.v))) + is x:CCicell do toExpr(BesselY(toCCi(n.v), x.v)) else WrongArgRRorRRi(2)) is n:CCcell do ( when s.1 is x:RRcell do toExpr(BesselY(n.v, toCC(x.v))) + is x:RRicell do toExpr(BesselY(toCCi(n.v), toCCi(x.v))) is x:CCcell do toExpr(BesselY(n.v, x.v )) + is x:CCicell do toExpr(BesselY(toCCi(n.v), x.v)) + else WrongArgRRorCC(2)) + is n:CCicell do ( + when s.1 + is x:RRcell do toExpr(BesselY(n.v, toCCi(x.v))) + is x:RRicell do toExpr(BesselY(n.v, toCCi(x.v))) + is x:CCcell do toExpr(BesselY(n.v, toCCi(x.v))) + is x:CCicell do toExpr(BesselY(n.v, x.v)) else WrongArgRRorCC(2)) else WrongArg(1, "an integer, real number or interval, or complex number")) else WrongNumArgs(2)); @@ -1104,16 +1149,28 @@ Beta(yy:Expr,xx:Expr):Expr := ( is x:RRcell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, RR, RR, RR is x:RRicell do toExpr(Beta(toRRi(y.v), x.v)) -- # typical value: Beta, RR, RRi, RRi is x:CCcell do toExpr(Beta(toCC(y.v), x.v)) -- # typical value: Beta, RR, CC, CC + is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) -- # typical value: Beta, RR, CCi, CCi else WrongArgRRorCC(2)) is y:RRicell do ( when xx is x:RRcell do toExpr(Beta(y.v, toRRi(x.v))) -- # typical value: Beta, RRi, RR, RRi is x:RRicell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, RRi, RRi, RRi + is x:CCcell do toExpr(Beta(toCCi(y.v), toCCi(x.v))) -- # typical value: Beta, RRi, CC, CCi + is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) -- # typical value: Beta, RRi, CCi, CCi else WrongArgRRorRRi(2)) is y:CCcell do ( when xx is x:RRcell do toExpr(Beta(y.v, toCC(x.v))) -- # typical value: Beta, CC, RR, CC + is x:RRicell do toExpr(Beta(toCCi(y.v), toCCi(x.v))) -- # typical value: Beta, CC, RRi, CCi is x:CCcell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, CC, CC, CC + is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) -- # typical value: Beta, CC, CCi, CCi + else WrongArgRRorCC(2)) + is y:CCicell do ( + when xx + is x:RRcell do toExpr(Beta(y.v, toCCi(x.v))) -- # typical value: Beta, CCi, RR, CCi + is x:RRicell do toExpr(Beta(y.v, toCCi(x.v))) -- # typical value: Beta, CCi, RRi, CCi + is x:CCcell do toExpr(Beta(y.v, toCCi(x.v))) -- # typical value: Beta, CCi, CC, CCi + is x:CCicell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, CCi, CCi, CCi else WrongArgRRorCC(2)) else WrongArgRRorCC(1) ); @@ -1133,16 +1190,28 @@ regularizedBeta(xx:Expr,yy:Expr,zz:Expr):Expr := ( midpointRR(regularizedBeta(toRRi(x.v), toRRi(y.v), toRRi(z.v)))) -- # typical value: regularizedBeta, RR, RR, RR, RR is z:RRicell do toExpr(regularizedBeta(toRRi(x.v), toRRi(y.v), z.v)) -- # typical value: regularizedBeta, RR, RR, RRi, RRi is z:CCcell do toExpr(regularizedBeta(toCC(x.v), toCC(y.v), z.v)) -- # typical value: regularizedBeta, RR, RR, CC, CC + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RR, RR, CCi, CCi else WrongArgRRorCC(3)) is y:RRicell do ( when zz is z:RRcell do toExpr(regularizedBeta(toRRi(x.v), y.v, toRRi(z.v))) -- # typical value: regularizedBeta, RR, RRi, RR, RRi is z:RRicell do toExpr(regularizedBeta(toRRi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RR, RRi, RRi, RRi + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RR, RRi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RR, RRi, CCi, CCi else WrongArgRRorRRi(3)) is y:CCcell do ( when zz is z:RRcell do toExpr(regularizedBeta(toCC(x.v), y.v, toCC(z.v))) -- # typical value: regularizedBeta, RR, CC, RR, CC + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RR, CC, RRi, CCi is z:CCcell do toExpr(regularizedBeta(toCC(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RR, CC, CC, CC + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RR, CC, CCi, CCi + else WrongArgRRorCC(3)) + is y:CCicell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RR, CCi, RR, CCi + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RR, CCi, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RR, CCi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RR, CCi, CCi, CCi else WrongArgRRorCC(3)) else WrongArgRRorCC(2)) is x:RRicell do ( @@ -1151,24 +1220,91 @@ regularizedBeta(xx:Expr,yy:Expr,zz:Expr):Expr := ( when zz is z:RRcell do toExpr(regularizedBeta(x.v, toRRi(y.v), toRRi(z.v))) -- # typical value: regularizedBeta, RRi, RR, RR, RRi is z:RRicell do toExpr(regularizedBeta(x.v, toRRi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, RR, RRi, RRi - else WrongArgRRorRRi(3)) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, RR, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, RR, CCi, CCi + else WrongArgRRorCC(3)) is y:RRicell do ( when zz is z:RRcell do toExpr(regularizedBeta((x.v), y.v, toRRi(z.v))) -- # typical value: regularizedBeta, RRi, RRi, RR, RRi is z:RRicell do toExpr(regularizedBeta(x.v, y.v, z.v)) -- # typical value: regularizedBeta, RRi, RRi, RRi, RRi - else WrongArgRRorRRi(3)) - else WrongArgRRorRRi(2)) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, RRi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, RRi, CCi, CCi + else WrongArgRRorCC(3)) + is y:CCcell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CC, RR, CCi + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CC, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CC, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, CC, CCi, CCi + else WrongArgRRorCC(3)) + is y:CCicell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CCi, RR, CCi + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CCi, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CCi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RRi, CCi, CCi, CCi + else WrongArgRRorCC(3)) + else WrongArgRRorCC(2)) is x:CCcell do ( when yy is y:RRcell do ( when zz is z:RRcell do toExpr(regularizedBeta(x.v, toCC(y.v), toCC(z.v))) -- # typical value: regularizedBeta, CC, RR, RR, CC + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RR, RRi, CCi is z:CCcell do toExpr(regularizedBeta(x.v, toCC(y.v), z.v)) -- # typical value: regularizedBeta, CC, RR, CC, CC + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CC, RR, CCi, CCi + else WrongArgRRorCC(3)) + is y:RRicell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RRi, RR, CCi + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RRi, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RRi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CC, RRi, CCi, CCi else WrongArgRRorCC(3)) is y:CCcell do ( when zz is z:RRcell do toExpr(regularizedBeta(x.v, y.v, toCC(z.v))) -- # typical value: regularizedBeta, CC, CC, RR, CC + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, CC, RRi, CCi is z:CCcell do toExpr(regularizedBeta(x.v, y.v, z.v)) -- # typical value: regularizedBeta, CC, CC, CC, CC + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CC, CC, CCi, CCi + else WrongArgRRorCC(3)) + is y:CCicell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CC, CCi, RR, CCi + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CC, CCi, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CC, CCi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, CC, CCi, CCi, CCi + else WrongArgRRorCC(3)) + else WrongArgRRorCC(2)) + is x:CCicell do ( + when yy + is y:RRcell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RR, RR, CCi + is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RR, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RR, CC, CCi + is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CCi, RR, CCi, CCi + else WrongArgRRorCC(3)) + is y:RRicell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RRi, RR, CCi + is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RRi, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RRi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CCi, RRi, CCi, CCi + else WrongArgRRorCC(3)) + is y:CCcell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CC, RR, CCi + is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CC, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CC, CC, CCi + is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CCi, CC, CCi, CCi + else WrongArgRRorCC(3)) + is y:CCicell do ( + when zz + is z:RRcell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CCi, RR, CCi + is z:RRicell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CCi, RRi, CCi + is z:CCcell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CCi, CC, CCi + is z:CCicell do toExpr(regularizedBeta(x.v, y.v, z.v)) -- # typical value: regularizedBeta, CCi, CCi, CCi, CCi else WrongArgRRorCC(3)) else WrongArgRRorCC(2)) else WrongArgRRorCC(1)); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 87c8c44cb1b..ac7869df010 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -392,6 +392,17 @@ export regularizedGamma(z:CC,w:CC):CC := ( clear(y); moveToCCandclear(r, prec)); +export regularizedGamma(z:CCi,w:CCi):CCi := ( + prec := min(precision(z), precision(w)); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); + Ccode(void, "acb_hypgeom_gamma_upper(", r, ", ", x, ", ", y, ", 1, ", + prec, ")"); + clear(x); + clear(y); + moveToCCiandclear(r, prec)); + export Digamma(z:CC):CC := ( w := toCCb(z); r := newCCb(); @@ -399,6 +410,13 @@ export Digamma(z:CC):CC := ( clear(w); moveToCCandclear(r, precision(z))); +export Digamma(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_digamma(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export lgamma(z:CC):CC := ( w := toCCb(z); r := newCCb(); @@ -406,6 +424,13 @@ export lgamma(z:CC):CC := ( clear(w); moveToCCandclear(r, precision(z))); +export lgamma(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_lgamma(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export zeta(z:CC):CC := ( w := toCCb(z); r := newCCb(); @@ -413,6 +438,13 @@ export zeta(z:CC):CC := ( clear(w); moveToCCandclear(r, precision(z))); +export zeta(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_zeta(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export erf(z:CC):CC := ( w := toCCb(z); r := newCCb(); @@ -420,6 +452,13 @@ export erf(z:CC):CC := ( clear(w); moveToCCandclear(r, precision(z))); +export erf(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_hypgeom_erf(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export erfc(z:CC):CC := ( w := toCCb(z); r := newCCb(); @@ -427,6 +466,13 @@ export erfc(z:CC):CC := ( clear(w); moveToCCandclear(r, precision(z))); +export erfc(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_hypgeom_erfc(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export BesselJ(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); x := toCCb(z); @@ -437,6 +483,16 @@ export BesselJ(z:CC,w:CC):CC := ( clear(y); moveToCCandclear(r, prec)); +export BesselJ(z:CCi,w:CCi):CCi := ( + prec := min(precision(z), precision(w)); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); + Ccode(void, "acb_hypgeom_bessel_j(", r, ", ", x, ", ", y, ", ", prec, ")"); + clear(x); + clear(y); + moveToCCiandclear(r, prec)); + export BesselY(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); x := toCCb(z); @@ -447,6 +503,16 @@ export BesselY(z:CC,w:CC):CC := ( clear(y); moveToCCandclear(r, prec)); +export BesselY(z:CCi,w:CCi):CCi := ( + prec := min(precision(z), precision(w)); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); + Ccode(void, "acb_hypgeom_bessel_y(", r, ", ", x, ", ", y, ", ", prec, ")"); + clear(x); + clear(y); + moveToCCiandclear(r, prec)); + export Beta(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); x := toCCb(z); @@ -459,6 +525,18 @@ export Beta(z:CC,w:CC):CC := ( clear(y); moveToCCandclear(r, prec)); +export Beta(z:CCi,w:CCi):CCi := ( + prec := min(precision(z), precision(w)); + x := toCCb(z); + y := toCCb(w); + v := toCCb(toCC(1, prec)); + r := newCCb(); + Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", x, ", ", y, ", ", v, + ", 0, ", prec, ")"); + clear(x); + clear(y); + moveToCCiandclear(r, prec)); + export regularizedBeta(u:CC,v:CC,w:CC):CC := ( prec := min(min(precision(u), precision(v)), precision(w)); x := toCCb(u); @@ -471,3 +549,16 @@ export regularizedBeta(u:CC,v:CC,w:CC):CC := ( clear(y); clear(z); moveToCCandclear(r, prec)); + +export regularizedBeta(u:CCi,v:CCi,w:CCi):CCi := ( + prec := min(min(precision(u), precision(v)), precision(w)); + x := toCCb(u); + y := toCCb(v); + z := toCCb(w); + r := newCCb(); + Ccode(void, "acb_hypgeom_beta_lower(", r, ", ", y, ", ", z, ", ", x, + ", 1, ", prec, ")"); + clear(x); + clear(y); + clear(z); + moveToCCiandclear(r, prec)); From 9399c835bc5caa2d85f79a980b733059812fa399 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 14:21:37 -0400 Subject: [PATCH 113/691] Simplify interval w/ one complex argument And fix some bugs --- M2/Macaulay2/m2/intervals.m2 | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index a17c2674e9d..818678f36a4 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -32,19 +32,13 @@ interval(RRi,RRi) := opts -> (N,M) -> ( interval(CC) := opts -> A -> toCCi A -for A in {ZZ,QQ,RR} do -interval(CC,A) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval(realPart N, M), interval imaginaryPart N) - else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) -for A in {ZZ,QQ,RR} do -interval(A,CC) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval(N, realPart M), interval imaginaryPart M) - else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) -for A in {ZZ,QQ,RR} do +interval(Number, CC) := opts -> (N, M) -> interval(toCC N, M, opts) +interval(CC, Number) := opts -> (N, M) -> interval(N, toCC M, opts) interval(CC,CC) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval(realPart N, realPart M), interval (imaginaryPart N, imaginaryPart M)) - else toCCi(opts.Precision, interval(realPart N, M), interval imaginaryPart N)) - + if opts.Precision < 0 then toCCi(span(realPart N, realPart M), span (imaginaryPart N, imaginaryPart M)) + else toCCi(opts.Precision, + span(realPart N, realPart M, opts), + span(imaginaryPart N, imaginaryPart M, opts))) interval(Array) := opts -> A -> ( if (length(A) == 0) or (length(A)>2) then error("expected length 2") From 22e928e4759109990774513ce7dba65dda1a4fe3 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 14:22:57 -0400 Subject: [PATCH 114/691] Pass options to span --- M2/Macaulay2/m2/intervals.m2 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 818678f36a4..051aeda916c 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -101,15 +101,15 @@ spanner = method(Options => {Precision => -1}) for A in {ZZ,QQ,RR,RRi} do for B in {ZZ,QQ,RR,RRi} do -spanner(A,B) := opts -> (N,M) -> (spanRRi(N,M)) +spanner(A,B) := opts -> (N,M) -> spanRRi(N,M,opts) for A in {ZZ,QQ,RR,RRi,CC,CCi} do for B in {CC,CCi} do -spanner(A,B) := opts -> (N,M) -> (spanCCi(N,M)) +spanner(A,B) := opts -> (N,M) -> spanCCi(N,M,opts) for A in {CC,CCi} do for B in {ZZ,QQ,RR,RRi} do -spanner(A,B) := opts -> (N,M) -> (spanCCi(N,M)) +spanner(A,B) := opts -> (N,M) -> spanCCi(N,M,opts) span = method(Dispatch => Thing, Options => true) From 082fecb6be6af574a7f3141b927613a11083c263 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 14:23:13 -0400 Subject: [PATCH 115/691] Update "interval" docs --- .../packages/Macaulay2Doc/doc_intervals.m2 | 48 ++++++++++++++++--- .../packages/Macaulay2Doc/ov_rings.m2 | 4 +- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 4cac143121f..f0028106f7a 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -248,24 +248,31 @@ doc /// Key interval (interval,Array) + (interval,CC) + (interval,CC,CC) + (interval,CC,Number) + (interval,CCi) + (interval,Number,CC) (interval,QQ) (interval,QQ,QQ) (interval,QQ,RR) + (interval,QQ,RRi) (interval,QQ,ZZ) (interval,RR) - (interval,RR,CC) (interval,RR,QQ) (interval,RR,RR) + (interval,RR,RRi) (interval,RR,ZZ) + (interval,RRi) + (interval,RRi,QQ) + (interval,RRi,RR) + (interval,RRi,RRi) + (interval,RRi,ZZ) (interval,ZZ) (interval,ZZ,QQ) (interval,ZZ,RR) + (interval,ZZ,RRi) (interval,ZZ,ZZ) - (interval,RRi,RRi) - (interval,CC) - (interval,CC,RR) - (interval,CC,CC) - (interval,CCi) [interval,Precision] Headline construct an interval @@ -286,7 +293,34 @@ Outputs I:RRi Description Text - Returns an interval as small as possible containing {\tt n} or from {\tt l} to {\tt r}. Note that if {\tt l} is to the right of {\tt r}, the constructed interval is empty. + If given one argument, returns a real or complex interval as small as possible containing {\tt n}. + Example + interval 3 + interval(2 + 5*ii) + Text + If given two real arguments (or an array with two entries), the interval + from {\tt l} to {\tt r}. Note that if {\tt l} is to the right of + {\tt r}, the constructed interval is empty. + Example + interval(2, 3) + interval(5, 4) + interval [7, 8] + Text + If given two arguments, at least one of which is a complex number, + then the rectangle in the complex plane containing the two + arguments is returned. + Example + interval(2 + 3*ii, 5) + Text + If given two arguments, at least one of which is a real interval, + then the first argument gives the real part and the second argument + the imaginary part of a complex interval. + Example + interval(interval(3, 4), interval(5, 6)) + Text + The @M2CODE "Precision"@ option sets the precision of the output. + Example + interval(Precision => 100, 5) SeeAlso (span, List) (span, Sequence) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index b1fa62f1dfd..e8dfe2658ed 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -515,8 +515,8 @@ document { SeeAlso => {RRi, toCCi, precision, interval, (span,Sequence), (span,List)}, Subnodes => { TO toCCi, --* TO interval, --- TO diameter, + TO interval, +-* TO diameter, TO midpoint, TO intersect, TO (isMember, QQ, CCi), From ecefb3d7272dff162efc8d259ae4731c02f40cac Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 14:32:25 -0400 Subject: [PATCH 116/691] Updated "diameter" docs --- M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index f0028106f7a..78e67147e8d 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -74,6 +74,15 @@ Outputs Description Text Returns the diameter (the difference between the endpoints) of the input interval. + Example + interval (2, 7) + diameter oo + Text + For a complex interval, the length of the diagonal in the complex + plane is returned. + Example + interval (0, 3 + 4*ii) + diameter oo SeeAlso left right From c4a7e3255181f8e48acb8035977a20df9effa75f Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 14:40:17 -0400 Subject: [PATCH 117/691] Update "midpoint" docs --- M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 | 13 +++++++++++-- M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 78e67147e8d..ebb144d9df9 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -46,12 +46,21 @@ Headline Usage x = midpoint I Inputs - I:RRi + I:{RRi,CCi} Outputs - x:RR + x:{RR,CC} Description Text Returns the midpoint (the average of the endpoints) of the input interval. + Example + interval(2,4) + midpoint oo + Text + For complex intervals, the center of the rectangle in the complex + plane is returned. + Example + interval(2 + 3*ii, 4 + 7*ii) + midpoint oo SeeAlso left right diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index e8dfe2658ed..0b7e0d3bc3a 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -516,9 +516,9 @@ document { Subnodes => { TO toCCi, TO interval, --* TO diameter, + TO diameter, TO midpoint, - TO intersect, +-* TO intersect, TO (isMember, QQ, CCi), TO (isEmpty, CCi), TO (isSubset, RRi,CCi), From 561b399bdb0f6e0202f7f73062439dbc84563be1 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 14:48:34 -0400 Subject: [PATCH 118/691] Actually fixed "interval" --- M2/Macaulay2/m2/intervals.m2 | 6 +++--- M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 051aeda916c..56c02e7e92b 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -35,10 +35,10 @@ interval(CC) := opts -> A -> toCCi A interval(Number, CC) := opts -> (N, M) -> interval(toCC N, M, opts) interval(CC, Number) := opts -> (N, M) -> interval(N, toCC M, opts) interval(CC,CC) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(span(realPart N, realPart M), span (imaginaryPart N, imaginaryPart M)) + if opts.Precision < 0 then toCCi(interval(realPart N, realPart M), interval(imaginaryPart N, imaginaryPart M)) else toCCi(opts.Precision, - span(realPart N, realPart M, opts), - span(imaginaryPart N, imaginaryPart M, opts))) + interval(realPart N, realPart M, opts), + interval(imaginaryPart N, imaginaryPart M, opts))) interval(Array) := opts -> A -> ( if (length(A) == 0) or (length(A)>2) then error("expected length 2") diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index ebb144d9df9..883c9b1f64f 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -325,8 +325,9 @@ Description interval [7, 8] Text If given two arguments, at least one of which is a complex number, - then the rectangle in the complex plane containing the two - arguments is returned. + then the rectangle in the complex plane whose lower left hand corner + is the first argument and upper right hand corner is the second argument + is returned. Example interval(2 + 3*ii, 5) Text From 1e28e15b964a6cd3518a327bcce972566462df56 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 22 Oct 2025 15:37:49 -0400 Subject: [PATCH 119/691] Update "interval" docs so complex example isn't empty --- M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 883c9b1f64f..9ca56eec798 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -329,7 +329,7 @@ Description is the first argument and upper right hand corner is the second argument is returned. Example - interval(2 + 3*ii, 5) + interval(2 + 3*ii, 5 + 4*ii) Text If given two arguments, at least one of which is a real interval, then the first argument gives the real part and the second argument From 4b473b3a0f93e721e02c29cefb56fc5897c820d8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 23 Oct 2025 05:56:03 -0400 Subject: [PATCH 120/691] Move interval, diameter, and midpoint to SeeAlso in CCi doc As subnodes, we got a "repeated references" error --- M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index 0b7e0d3bc3a..3a7a736dbd0 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -512,12 +512,17 @@ document { "I ^ 3", "2 * I", "(2+3*ii) * I"}, - SeeAlso => {RRi, toCCi, precision, interval, (span,Sequence), (span,List)}, + SeeAlso => { + RRi, + toCCi, + precision, + interval, + midpoint, + diameter, + (span,Sequence), + (span,List)}, Subnodes => { TO toCCi, - TO interval, - TO diameter, - TO midpoint, -* TO intersect, TO (isMember, QQ, CCi), TO (isEmpty, CCi), From 6f353fdd891d139bf7100ce85274e3106e3f6924 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 23 Oct 2025 06:54:35 -0400 Subject: [PATCH 121/691] Updates to one-argument "interval" * Replace interval(ZZ) and interval(QQ) w/ interval(Number) -- this way, we also support Constant objects (e.g., "interval pi") * Support Precision option in all cases --- M2/Macaulay2/m2/intervals.m2 | 21 ++++++++++++------- .../packages/Macaulay2Doc/doc_intervals.m2 | 3 +-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 56c02e7e92b..cbecdcfb960 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -4,12 +4,19 @@ needs "reals.m2" interval = method(Options => {Precision => -1}) -for A in {ZZ,QQ,RR} do -interval A := opts -> N -> ( - if opts.Precision < 0 then toRRi(N) - else toRRi(opts.Precision,N,N)) -interval(RRi) := opts -> A -> A -interval(CCi) := opts -> A -> toCCi A +interval Number := opts -> N -> interval(numeric N, opts) +interval RR := opts -> N -> ( + if opts.Precision < 0 or opts.Precision == precision N then toRRi N + else toRRi(opts.Precision, N, N)) +interval RRi := opts -> N -> ( + if opts.Precision < 0 or opts.Precision == precision N then N + else toRRi(opts.Precision, left N, right N)) +interval CC := opts -> N -> ( + if opts.Precision < 0 or opts.Precision == precision N then toCCi N + else toCCi(opts.Precision, realPart N, imaginaryPart N)) +interval CCi := opts -> N -> ( + if opts.Precision < 0 or opts.Precision == precision N then N + else toCCi(opts.Precision, realPart N, imaginaryPart N)) for A in {ZZ,QQ,RR} do for B in {ZZ,QQ,RR} do @@ -30,8 +37,6 @@ interval(RRi,RRi) := opts -> (N,M) -> ( if opts.Precision < 0 then toCCi(N,M) else toCCi(opts.Precision,N,M)) -interval(CC) := opts -> A -> toCCi A - interval(Number, CC) := opts -> (N, M) -> interval(toCC N, M, opts) interval(CC, Number) := opts -> (N, M) -> interval(N, toCC M, opts) interval(CC,CC) := opts -> (N,M) -> ( diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 9ca56eec798..b9017709bc8 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -270,8 +270,8 @@ Key (interval,CC,CC) (interval,CC,Number) (interval,CCi) + (interval,Number) (interval,Number,CC) - (interval,QQ) (interval,QQ,QQ) (interval,QQ,RR) (interval,QQ,RRi) @@ -286,7 +286,6 @@ Key (interval,RRi,RR) (interval,RRi,RRi) (interval,RRi,ZZ) - (interval,ZZ) (interval,ZZ,QQ) (interval,ZZ,RR) (interval,ZZ,RRi) From 685dc0e0e3a8bac2eaed685f76c022cc9e07eda1 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 23 Oct 2025 07:00:58 -0400 Subject: [PATCH 122/691] Use Precision option when calling "numeric" in interval(Number) Otherwise we'll lose precision --- M2/Macaulay2/m2/intervals.m2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index cbecdcfb960..6061b9568c5 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -4,7 +4,9 @@ needs "reals.m2" interval = method(Options => {Precision => -1}) -interval Number := opts -> N -> interval(numeric N, opts) +interval Number := opts -> N -> ( + p := if opts.Precision < 0 then defaultPrecision else opts.Precision; + interval(numeric(p, N), opts)) interval RR := opts -> N -> ( if opts.Precision < 0 or opts.Precision == precision N then toRRi N else toRRi(opts.Precision, N, N)) From 28344dc05d88bf942124faac67505bfdfdc6b092 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Thu, 23 Oct 2025 07:14:00 -0400 Subject: [PATCH 123/691] Added a test, fixed some bugs in polynomial rings with CCi and matrices --- M2/Macaulay2/e/aring-CCi.hpp | 21 +++++++++++---------- M2/Macaulay2/m2/reals.m2 | 2 ++ M2/Macaulay2/tests/normal/RRi.m2 | 2 ++ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/M2/Macaulay2/e/aring-CCi.hpp b/M2/Macaulay2/e/aring-CCi.hpp index 80406be82e2..4ead5b87721 100644 --- a/M2/Macaulay2/e/aring-CCi.hpp +++ b/M2/Macaulay2/e/aring-CCi.hpp @@ -333,14 +333,17 @@ class ARingCCi : public SimpleARing const ElementType &a, const ElementType &b) const { - mpfi_t temp; + mpfi_t temp, retemp, imtemp; mpfi_init2(temp,get_precision()); - mpfi_mul(temp,&a.re,&b.re); - mpfi_mul(&result.re,&a.im,&b.im); - mpfi_sub(&result.re,&result.re,temp); + mpfi_init2(retemp,get_precision()); + mpfi_init2(imtemp,get_precision()); + mpfi_mul(retemp,&a.re,&b.re); + mpfi_mul(temp,&a.im,&b.im); + mpfi_sub(retemp,retemp,temp); mpfi_mul(temp,&a.re,&b.im); - mpfi_mul(&result.im,&a.im,&b.re); - mpfi_add(&result.im,&result.im,temp); + mpfi_mul(imtemp,&a.im,&b.re); + mpfi_add(&result.im,imtemp,temp); + mpfi_set(&result.re,retemp); } void divide(ElementType &result, @@ -359,17 +362,15 @@ class ARingCCi : public SimpleARing { if (n >= 2) { + ElementType b; + init(b); if (n%2 == 0) { - ElementType b; - init(b); power(b,a,n/2); mult(result,b,b); } else { - ElementType b; - init(b); power(b,a,n-1); mult(result,a,b); } diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index d9b3e565802..d84728f7a2a 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -163,8 +163,10 @@ numeric Number := x -> numeric(defaultPrecision, x) numeric CC := identity numeric RR := identity numeric RRi := identity +numeric CCi := identity numeric(ZZ,Number) := toRR numeric(ZZ,RRi) := (prec,x) -> toRRi(prec,left(x),right(x)) +numeric(ZZ,CCi) := (prec,x) -> toCCi(prec,realPart(x),imaginaryPart(x)) numeric(ZZ,CC) := toCC infty := prec -> 1/toRR(prec,0) numeric InfiniteNumber := infinity -> infinity#0 * infty defaultPrecision diff --git a/M2/Macaulay2/tests/normal/RRi.m2 b/M2/Macaulay2/tests/normal/RRi.m2 index aa9bd75f08e..a0d79b82484 100644 --- a/M2/Macaulay2/tests/normal/RRi.m2 +++ b/M2/Macaulay2/tests/normal/RRi.m2 @@ -71,6 +71,8 @@ assert (right atan I == atan 3) assert (left sinh I == sinh 1) assert (acosh(I) >= 0) +assert (interval(1+2*ii,2+3*ii)*interval (1+3*ii,2+4*ii) == interval(-11 + 5*ii , -2+14*ii)) + --- TO FIX: --------------------------------------------- From 076423a9e99b889d83cfd4f30dd2be56cd743d29 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 23 Oct 2025 23:38:01 -0400 Subject: [PATCH 124/691] Add hyperbolic functions, exp, and log for CCi --- M2/Macaulay2/d/actors3.d | 8 +++++++ M2/Macaulay2/d/ballarith.d | 48 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 288074df2a4..ad17f43606f 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -1317,6 +1317,7 @@ setupfun("regularizedBeta",regularizedBeta).Protected=false; cosh(e:Expr):Expr := ( when e is x:CCcell do toExpr(cosh(x.v)) -- # typical value: cosh, CC, CC + is x:CCicell do toExpr(cosh(x.v)) -- # typical value: cosh, CCi, CCi is x:RRcell do toExpr(cosh(x.v)) -- # typical value: cosh, RR, RR is x:RRicell do toExpr(cosh(x.v)) -- # typical value: cosh, RRi, RRi else WrongArgRRorCC() @@ -1325,6 +1326,7 @@ setupfun("cosh",cosh).Protected=false; sinh(e:Expr):Expr := ( when e is x:CCcell do toExpr(sinh(x.v)) -- # typical value: sinh, CC, CC + is x:CCicell do toExpr(sinh(x.v)) -- # typical value: sinh, CCi, CCi is x:RRcell do toExpr(sinh(x.v)) -- # typical value: sinh, RR, RR is x:RRicell do toExpr(sinh(x.v)) -- # typical value: sinh, RRi, RRi else WrongArgRRorCC() @@ -1333,6 +1335,7 @@ setupfun("sinh",sinh).Protected=false; tanh(e:Expr):Expr := ( when e is x:CCcell do toExpr(tanh(x.v)) -- # typical value: tanh, CC, CC + is x:CCicell do toExpr(tanh(x.v)) -- # typical value: tanh, CCi, CCi is x:RRcell do toExpr(tanh(x.v)) -- # typical value: tanh, RR, RR is x:RRicell do toExpr(tanh(x.v)) -- # typical value: tanh, RRi, RRi else WrongArgRRorCC() @@ -1341,6 +1344,7 @@ setupfun("tanh",tanh).Protected=false; exp(e:Expr):Expr := ( when e is x:CCcell do toExpr(exp(x.v)) -- # typical value: exp, CC, CC + is x:CCicell do toExpr(exp(x.v)) -- # typical value: exp, CCi, CCi is x:RRcell do toExpr(exp(x.v)) -- # typical value: exp, RR, RR is x:RRicell do toExpr(exp(x.v)) -- # typical value: exp, RRi, RRi else WrongArgRRorCC() @@ -1354,6 +1358,7 @@ log(e:Expr):Expr := ( is b:RRcell do ( when a.1 is x:CCcell do toExpr(log(b.v,x.v)) -- # typical value: log, RR, CC, CC + is x:CCicell do toExpr(log(toCCi(b.v), x.v)) -- # typical value: log, RR, CCi, CCi is x:RRcell do ( -- # typical value: log, RR, RR, CC if b.v>0 && x.v>0 then toExpr(log(b.v,x.v)) else toExpr(logc(b.v,x.v)) ) @@ -1365,6 +1370,8 @@ log(e:Expr):Expr := ( else WrongArgRRorCC(1)) is b:RRicell do ( when a.1 + is x:CCcell do toExpr(log(toCCi(b.v), toCCi(x.v))) -- #typical value: log, RRi, CC, CCi + is x:CCicell do toExpr(log(toCCi(b.v), x.v)) -- # typical value: log, RRi, CCi, CCi is x:RRcell do ( -- # typical value: log, RRi, RR, RRi if b.v>0 && x.v>=0 then toExpr(log(b.v,toRRi(x.v,precision(x.v)))) else @@ -1378,6 +1385,7 @@ log(e:Expr):Expr := ( else WrongArgRRorRRi(2)) else WrongArgRRorRRi(1)) is x:CCcell do toExpr(log(x.v)) -- # typical value: log, CC, CC + is x:CCicell do toExpr(log(x.v)) -- # typical value: log, CCi, CCi is x:RRcell do if isNegative(x.v) then toExpr(logc(x.v)) else toExpr(log(x.v)) -- # typical value: log, RR, RR is x:RRicell do if x.v >= 0 then toExpr(log(x.v)) -- # typical value: log, RRi, RRi else buildErrorPacket("Not defined") diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index ac7869df010..51cb73be41f 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -562,3 +562,51 @@ export regularizedBeta(u:CCi,v:CCi,w:CCi):CCi := ( clear(y); clear(z); moveToCCiandclear(r, prec)); + +export cosh(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_cosh(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export sinh(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_sinh(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export tanh(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_tanh(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export exp(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_exp(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export log(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_log(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export log(z:CCi, w:CCi):CCi := ( + prec := min(precision(z), precision(w)); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); + Ccode(void, "acb_log(", x, ", ", x, ", ", prec, ")"); + Ccode(void, "acb_log(", y, ", ", y, ", ", prec, ")"); + Ccode(void, "acb_div(", r, ", ", y, ", ", x, ", ", prec, ")"); + clear(x); + clear(y); + moveToCCiandclear(r, prec)); + From 16fd3b6d3e1c7f4241e8274a8dbf8c855dd04b3c Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 23 Oct 2025 23:59:05 -0400 Subject: [PATCH 125/691] Add exponentiation for CCi now that we have exp & log --- M2/Macaulay2/d/actors.d | 11 +++++++++++ M2/Macaulay2/d/ballarith.d | 1 + 2 files changed, 12 insertions(+) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 4686a4099a6..6edb399fa8a 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -722,6 +722,7 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( else toExpr(toRR(x.v,precision(y.v))^y.v) ) is y:CCcell do toExpr(toRR(x.v,precision(y.v))^y.v) + is y:CCicell do toExpr(toCCi(x.v,precision(y.v))^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:QQcell do ( @@ -760,6 +761,7 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( then buildErrorPacket("negative base not implemented") else toExpr(toRR(x.v,precision(y.v))^y.v)) is y:CCcell do toExpr(toRR(x.v,precision(y.v))^y.v) + is y:CCicell do toExpr(toCCi(x.v,precision(y.v))^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:RRcell do ( @@ -788,6 +790,7 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( else toExpr(x.v^y.v) ) is y:CCcell do toExpr(x.v^y.v) + is y:CCicell do toExpr(toCCi(x.v)^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:RRicell do ( @@ -812,6 +815,8 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( then toExpr(x.v^y.v) else buildErrorPacket("negative base not implemented") ) + is y:CCcell do toExpr(toCCi(x.v)^toCCi(y.v)) + is y:CCicell do toExpr(toCCi(x.v)^y.v) else binarymethod(lhs,rhs,PowerS)) is x:CCcell do ( when rhs @@ -822,11 +827,17 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( else toExpr(x.v^toRR(y.v,precision(x.v)))) is y:RRcell do toExpr(x.v^y.v) is y:CCcell do toExpr(x.v^y.v) + is y:CCicell do toExpr(toCCi(x.v)^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:CCicell do ( when rhs is y:ZZcell do toExpr(x.v^y.v) + is y:QQcell do toExpr(x.v^toCCi(y.v,precision(x.v))) + is y:RRcell do toExpr(x.v^toCCi(y.v)) + is y:RRicell do toExpr(x.v^toCCi(y.v)) + is y:CCcell do toExpr(x.v^toCCi(y.v)) + is y:CCicell do toExpr(x.v^y.v) is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:RawRingElementCell do ( diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 51cb73be41f..8b3122dab10 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -610,3 +610,4 @@ export log(z:CCi, w:CCi):CCi := ( clear(y); moveToCCiandclear(r, prec)); +export (z:CCi) ^ (w:CCi):CCi := exp(log(z)*w); From 40678f7abcefa2515eca9ec61e264c1469d91b73 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 07:02:08 -0400 Subject: [PATCH 126/691] Add agm for both interval types --- M2/Macaulay2/d/actors3.d | 26 ++++++++++++++++++++++---- M2/Macaulay2/d/ballarith.d | 20 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index ad17f43606f..a424112b6b9 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -1399,13 +1399,31 @@ agm(e:Expr):Expr := ( when a.0 is x:CCcell do ( when a.1 - is y:CCcell do toExpr(agm(x.v,y.v)) -- # typical value: agm, CC, CC, CC - is y:RRcell do toExpr(agm(x.v,toCC(y.v))) -- # typical value: agm, CC, RR, CC + is y:CCcell do toExpr(agm(x.v,y.v)) -- # typical value: agm, CC, CC, CC + is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) -- # typical value: agm, CC, CCi, CCi + is y:RRcell do toExpr(agm(x.v,toCC(y.v))) -- # typical value: agm, CC, RR, CC + is y:RRicell do toExpr(agm(toCCi(x.v),toCCi(y.v))) -- # typical value: agm, CC, RRi, CCi + else WrongArgRRorCC(2)) + is x:CCicell do ( + when a.1 + is y:CCcell do toExpr(agm(x.v,toCCi(y.v))) -- # typical value: agm, CCi, CC, CCi + is y:CCicell do toExpr(agm(x.v, y.v)) -- # typical value: agm, CCi, CCi, CCi + is y:RRcell do toExpr(agm(x.v,toCCi(y.v))) -- # typical value: agm, CCi, RR, CCi + is y:RRicell do toExpr(agm(x.v, toCCi(y.v))) -- # typical value: agm, CCi, RRi, CCi else WrongArgRRorCC(2)) is x:RRcell do ( when a.1 - is y:CCcell do toExpr(agm(toCC(x.v),y.v)) -- # typical value: agm, RR, CC, CC - is y:RRcell do toExpr(agm(x.v,y.v)) -- # typical value: agm, RR, RR, RR + is y:CCcell do toExpr(agm(toCC(x.v),y.v)) -- # typical value: agm, RR, CC, CC + is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) -- # typical value: agm, RR, CCi, CCi + is y:RRcell do toExpr(agm(x.v,y.v)) -- # typical value: agm, RR, RR, RR + is y:RRicell do toExpr(agm(toRRi(x.v), y.v)) -- # typical value: agm, RR, RRi, RRi + else WrongArgRRorCC(2)) + is x:RRicell do ( + when a.1 + is y:CCcell do toExpr(agm(toCCi(x.v),toCCi(y.v))) -- # typical value: agm, RRi, CC, CCi + is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) -- # typical value: agm, RRi, CCi, CCi + is y:RRcell do toExpr(agm(x.v,toRRi(y.v))) -- # typical value: agm, RRi, RR, RRi + is y:RRicell do toExpr(agm(x.v, y.v)) -- # typical value: agm, RRi, RRi, RRi else WrongArgRRorCC(2)) else WrongArgRRorCC(1)) else WrongNumArgs(2) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 8b3122dab10..8095098655e 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -187,6 +187,16 @@ export regularizedBeta(u:RRi,v:RRi,w:RRi):RRi := ( clear(z); moveToRRiandclear(r, prec)); +export agm(z:RRi, w:RRi):RRi := ( + prec := min(precision(z), precision(w)); + x := toRRb(z); + y := toRRb(w); + r := newRRb(); + Ccode(void, "arb_agm(", r, ", ", x, ", ", y, ", ", prec, ")"); + clear(x); + clear(y); + moveToRRiandclear(r, prec)); + ------------ -- CCBall -- ------------ @@ -611,3 +621,13 @@ export log(z:CCi, w:CCi):CCi := ( moveToCCiandclear(r, prec)); export (z:CCi) ^ (w:CCi):CCi := exp(log(z)*w); + +export agm(z:CCi, w:CCi):CCi := ( + prec := min(precision(z), precision(w)); + x := toCCb(z); + y := toCCb(w); + r := newCCb(); + Ccode(void, "acb_agm(", r, ", ", x, ", ", y, ", ", prec, ")"); + clear(x); + clear(y); + moveToCCiandclear(r, prec)); From d351bf21ff762154ff525448e4ba6725a22b0330 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 07:08:34 -0400 Subject: [PATCH 127/691] Add abs(CCi), sign(CCi), and sign(RRi) --- M2/Macaulay2/d/actors4.d | 3 +++ M2/Macaulay2/d/ballarith.d | 21 +++++++++++++++++++ M2/Macaulay2/m2/integers.m2 | 2 +- .../packages/Macaulay2Doc/operators.m2 | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 6a79ab2f915..6c3412b08fd 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -102,6 +102,7 @@ absfun(e:Expr):Expr := ( is x:RRcell do toExpr(if signbit(x.v) then -x.v else x.v) is x:RRicell do toExpr(abs(x.v)) is x:CCcell do toExpr(abs(x.v)) + is x:CCicell do toExpr(abs(x.v)) is r:QQcell do toExpr(abs(r.v)) else WrongArg("a number, real or complex")); setupfun("abs0",absfun); @@ -111,9 +112,11 @@ sign(e:Expr):Expr := ( is x:ZZcell do toExpr(sign(x.v)) is x:QQcell do toExpr(sign(x.v)) is x:RRcell do toExpr(sign(x.v)) + is x:RRicell do toExpr(sign(x.v)) is x:CCcell do ( if isZero(x.v) then toExpr(toCC(0, 0, precision(x.v))) else toExpr(x.v / abs(x.v))) + is x:CCicell do toExpr(sign(x.v)) else WrongArg("a number, real or complex")); setupfun("sign0", sign); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 8095098655e..1be9b162fb8 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -197,6 +197,13 @@ export agm(z:RRi, w:RRi):RRi := ( clear(y); moveToRRiandclear(r, prec)); +export sign(z:RRi):RRi := ( + w := toRRb(z); + r := newRRb(); + Ccode(void, "arb_sgn(", r, ", ", w, ")"); + clear(w); + moveToRRiandclear(r, precision(z))); + ------------ -- CCBall -- ------------ @@ -631,3 +638,17 @@ export agm(z:CCi, w:CCi):CCi := ( clear(x); clear(y); moveToCCiandclear(r, prec)); + +export abs(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_abs(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + +export sign(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_sgn(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); diff --git a/M2/Macaulay2/m2/integers.m2 b/M2/Macaulay2/m2/integers.m2 index e014afbc673..8f86cd6cdf3 100644 --- a/M2/Macaulay2/m2/integers.m2 +++ b/M2/Macaulay2/m2/integers.m2 @@ -54,7 +54,7 @@ gcd(QQ,QQ) := QQ => (x,y) -> ( gcd ZZ := gcd QQ := identity abs = method() -abs ZZ := abs RR := abs RRi := abs CC := abs QQ := abs0 +abs Number := abs0 abs Constant := abs @@ numeric sign = method() diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 index dfe0df4a479..3a899379c73 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 @@ -37,7 +37,7 @@ document { } document { - Key => {abs,(abs, RR),(abs, CC),(abs, ZZ),(abs, QQ),(abs, RRi),(abs, Constant)}, + Key => {abs,(abs, Number),(abs, Constant)}, Headline => "absolute value function", Usage => "abs x\nabs I", Inputs => { From b8a52853c7703bcd62ebdcaf56f1c56855218c1d Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 08:44:00 -0400 Subject: [PATCH 128/691] abs(CCi) should return an RRi --- M2/Macaulay2/d/ballarith.d | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 1be9b162fb8..5d12e95921c 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -639,12 +639,12 @@ export agm(z:CCi, w:CCi):CCi := ( clear(y); moveToCCiandclear(r, prec)); -export abs(z:CCi):CCi := ( +export abs(z:CCi):RRi := ( w := toCCb(z); - r := newCCb(); + r := newRRb(); Ccode(void, "acb_abs(", r, ", ", w, ", ", precision(z), ")"); clear(w); - moveToCCiandclear(r, precision(z))); + moveToRRiandclear(r, precision(z))); export sign(z:CCi):CCi := ( w := toCCb(z); From ec5dfe62382688413bf97ddd2e8409247e999314 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 10:29:50 -0400 Subject: [PATCH 129/691] Add sqrt and atan for CCi --- M2/Macaulay2/d/actors3.d | 2 ++ M2/Macaulay2/d/ballarith.d | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index a424112b6b9..3af3b5ac32c 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -1131,6 +1131,7 @@ atan2(yy:Expr,xx:Expr):Expr := ( atan(e:Expr):Expr := ( when e is x:CCcell do toExpr(atan(x.v)) -- # typical value: atan, CC, CC + is x:CCicell do toExpr(atan(x.v)) -- # typical value: atan, CCi, CCi is x:RRcell do toExpr(atan(x.v)) -- # typical value: atan, RR, RR is x:RRicell do toExpr(atan(x.v)) -- # typical value: atan, RRi, RRi else WrongArgRRorCC() @@ -1493,6 +1494,7 @@ sqrt(a:Expr):Expr := ( else buildErrorPacket("Not implemented") ) is x:CCcell do toExpr(sqrt(x.v)) -- # typical value: sqrt, CC, CC + is x:CCicell do toExpr(sqrt(x.v)) -- # typical value: sqrt, CCi, CCi is Error do a else WrongArgRRorCC()); setupfun("sqrt",sqrt).Protected=false; diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 5d12e95921c..972e63ebdef 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -530,6 +530,13 @@ export BesselY(z:CCi,w:CCi):CCi := ( clear(y); moveToCCiandclear(r, prec)); +export atan(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_atan(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export Beta(z:CC,w:CC):CC := ( prec := min(precision(z), precision(w)); x := toCCb(z); @@ -639,6 +646,13 @@ export agm(z:CCi, w:CCi):CCi := ( clear(y); moveToCCiandclear(r, prec)); +export sqrt(z:CCi):CCi := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_sqrt(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCiandclear(r, precision(z))); + export abs(z:CCi):RRi := ( w := toCCb(z); r := newRRb(); From b927e4afca2702a0888972d22213dd95cf9210e5 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 10:35:11 -0400 Subject: [PATCH 130/691] Fix numericInterval ii (now returns a CCi instead of an empty RRi) --- M2/Macaulay2/m2/reals.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index d84728f7a2a..8a8e08b83f8 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -318,7 +318,7 @@ char InexactField := R -> 0 pi = new Constant from { symbol pi, pi0, piRRi0 } EulerConstant = new Constant from { symbol EulerConstant, mpfrConstantEuler, eRRi0} CatalanConstant = new Constant from { symbol CatalanConstant, mpfrConstantCatalan, cRRi0} -ii = new Constant from { symbol ii, ConstantII} +ii = new Constant from { symbol ii, ConstantII, p -> toCCi(p, 0, 1)} ring Constant := ring @@ numeric promote(Constant, InexactNumber') := From 9b218d4f938795e38d11b9e7b4810bc399a709b5 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 12:21:41 -0400 Subject: [PATCH 131/691] Simplify span (now a binary method) --- M2/Macaulay2/m2/intervals.m2 | 94 +++++++----------------------------- 1 file changed, 17 insertions(+), 77 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 6061b9568c5..e299148dace 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -52,83 +52,23 @@ interval(Array) := opts -> A -> ( else if length(A) == 1 then interval(opts,A_0) else interval(opts,A_0,A_1)) -spanRRi = method(Options => {Precision => -1}) - -for A in {ZZ,QQ,RR,RRi} do -spanRRi(A) := opts -> (M) -> ( - if opts.Precision < 0 then toRRi(M) - else toRRi(opts.Precision,M)) - -for A in {ZZ,QQ,RR} do -for B in {ZZ,QQ,RR} do -spanRRi(A,B) := opts -> (N,M) -> ( - if opts.Precision < 0 then toRRi(min(M,N),max(M,N)) - else toRRi(opts.Precision,min(M,N),max(M,N))) - -for A in {ZZ,QQ,RR} do ( -spanRRi(RRi,A) := opts -> (N,M) -> ( - if isEmpty(N) then interval(opts,M) - else if opts.Precision < 0 then toRRi(min(left N,M),max(right N,M)) - else toRRi(opts.Precision,min(left N,M),max(right N,M))); -spanRRi(A,RRi) := opts -> (N,M) -> span(opts,M,N)) - -spanRRi(RRi,RRi) := opts -> (N,M) -> ( - if isEmpty(N) then interval(opts,left M, right M) - else if isEmpty(M) then interval(opts, left N, right N) - else if opts.Precision < 0 then toRRi(min(left N,left M),max(right N,right M)) - else toRRi(opts.Precision,min(left N,left M),max(right N,right M))) - -spanCCi = method(Options => {Precision => -1}) - ---for A in {ZZ,QQ,RR,RRi} do ---for B in {ZZ,QQ,RR,RRi} do ---spanCCi(A,B) := opts -> (N,M) -> ( --- toCCi(spanRRi(N,M), interval 0) --- ) - -for A in {ZZ,QQ,RR,RRi} do ( -spanCCi(CC,A) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)) - else toCCi(opts.Precision,spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)));--toRRi(opts.Precision,min(left N,M),max(right N,M))); -spanCCi(A,CC) := opts -> (N,M) -> spanCCi(opts,M,N); -spanCCi(CCi,A) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)) - else toCCi(opts.Precision,spanRRi(realPart N,M),spanRRi(0, imaginaryPart N)));--toRRi(opts.Precision,min(left N,M),max(right N,M))); -spanCCi(A,CCi) := opts -> (N,M) -> spanCCi(opts,M,N)) - -spanCCi(CC,CC) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(spanRRi(realPart N,realPart M),spanRRi(imaginaryPart N, imaginaryPart M))) -spanCCi(CC,CCi) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(spanRRi(realPart N,realPart M),spanRRi(imaginaryPart N, imaginaryPart M))) -spanCCi(CCi,CC) := opts -> (N,M) -> spanCCi(opts,M,N) -spanCCi(CCi,CCi) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(spanRRi(realPart N,realPart M),spanRRi(imaginaryPart N, imaginaryPart M))) - -spanner = method(Options => {Precision => -1}) - -for A in {ZZ,QQ,RR,RRi} do -for B in {ZZ,QQ,RR,RRi} do -spanner(A,B) := opts -> (N,M) -> spanRRi(N,M,opts) - -for A in {ZZ,QQ,RR,RRi,CC,CCi} do -for B in {CC,CCi} do -spanner(A,B) := opts -> (N,M) -> spanCCi(N,M,opts) - -for A in {CC,CCi} do -for B in {ZZ,QQ,RR,RRi} do -spanner(A,B) := opts -> (N,M) -> spanCCi(N,M,opts) - -span = method(Dispatch => Thing, Options => true) - -span ZZ := span QQ := span RR := {Precision => -1} >> opts -> N -> interval(N,opts) - -span RRi := {Precision => -1} >> opts -> N -> interval(left N,right N,opts) - -span CC := {Precision => -1} >> opts -> N -> interval(toRRi realPart N, toRRi imaginaryPart N,opts) - -span CCi := {Precision => -1} >> opts -> N -> interval(toRRi realPart N, toRRi imaginaryPart N,opts) - -span List := span Sequence := {Precision => -1} >> opts -> L -> fold(L, (N, M) -> spanner(N, M, opts)) +span = method(Dispatch => Thing, Options => {Precision => -1}, Binary => true) +span Number := opts -> N -> interval(N, opts) +span(Number, Number) := opts -> (N,M) -> span( + interval(N, opts), interval(M, opts), opts) +span(RRi, RRi) := opts -> (N,M) -> ( + if isEmpty(N) then interval(M, opts) + else if isEmpty(M) then interval(N, opts) + else interval(min(left N, left M), max(right N, right M), opts)) +span(RRi, CCi) := opts -> (N, M) -> span(toCCi N, M, opts) +span(CCi, RRi) := opts -> (N, M) -> span(N, toCCi M, opts) +span(CCi, CCi) := opts -> (N, M) -> ( + if isEmpty N then interval(M, opts) + else if isEmpty M then interval(N, opts) + else interval( + span(realPart M, realPart N, opts), + span(imaginaryPart M, imaginaryPart N, opts), + opts)) for A in {ZZ,QQ,RR} do isMember(A,RRi) := (N,M) -> subsetRRi(N,M); From 4fecd4fe06b0d957725be4f333b02eaada00b49b Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 12:31:08 -0400 Subject: [PATCH 132/691] Update span docs --- .../packages/Macaulay2Doc/doc_intervals.m2 | 66 ++++--------------- 1 file changed, 14 insertions(+), 52 deletions(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index b9017709bc8..1f5f0244428 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -188,76 +188,38 @@ SeeAlso isMember /// -undocumented{(isReal, CCi), (span, CCi), (span,RRi), (span, QQ), (span, RR), (span, ZZ)} +undocumented{(isReal, CCi)} doc /// Key span -Headline - construct smallest interval -Description - Text - Returns the smallest interval containing the inputs (which can include intervals). Typically, the returned interval is not empty. See @TO (span, Sequence)@ and @TO (span, List)@ -SeeAlso - interval - (span, Sequence) - (span, List) - toRRi - toCCi -/// - -doc /// -Key - (span, List) - [(span,List),Precision] + (span,CCi,CCi) + (span,CCi,RRi) + (span,List) + (span,Number) + (span,Number,Number) + (span,RRi,CCi) + (span,RRi,RRi) + (span,Sequence) Headline construct smallest interval Usage I = span(L) I = span(L,Precision => prec) Inputs - L:List - containing @TO Number@ (including @TO CCi@) - Precision => ZZ - specifies the desired precision of the output, a value of {\tt -1} uses the minimum precision of the inputs. -Outputs - I:RRi - when input List has only real numbers or intervals - I:CCi -Description - Text - Returns the smallest interval containing the inputs (which can include intervals). Typically, the returned interval is not empty. -SeeAlso - interval - (span, Sequence) - toRRi - toCCi -/// - -doc /// -Key - (span, Sequence) - [(span,Sequence),Precision] -Headline - construct smallest interval -Usage - I = span(S) - I = span(S,Precision => prec) -Inputs - S:Sequence - containing @TO Number@ (including @TO CCi@) + L:{List, Sequence} + containing @TO Number@ objects Precision => ZZ specifies the desired precision of the output, a value of {\tt -1} uses the minimum precision of the inputs. Outputs - I:RRi - when input List has only real numbers or intervals - I:CCi + I:{RRi, CCi} Description Text Returns the smallest interval containing the inputs (which can include intervals). Typically, the returned interval is not empty. + Example + span(1 + 3*ii, pi, 4 + ii) SeeAlso interval - (span, List) toRRi toCCi /// From dcd779dbf7d0d258b4d47d90ad10b80a7520bc5c Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 24 Oct 2025 13:06:00 -0400 Subject: [PATCH 133/691] Simplify two-argument "interval" methods --- M2/Macaulay2/m2/intervals.m2 | 30 ++++++++++--------- .../packages/Macaulay2Doc/doc_intervals.m2 | 27 +++++++---------- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index e299148dace..7af31acd865 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -20,21 +20,14 @@ interval CCi := opts -> N -> ( if opts.Precision < 0 or opts.Precision == precision N then N else toCCi(opts.Precision, realPart N, imaginaryPart N)) -for A in {ZZ,QQ,RR} do -for B in {ZZ,QQ,RR} do -interval(A,B) := opts -> (N,M) -> ( +interval(Number, Number) := opts -> (N, M) -> ( + p := if opts.Precision < 0 then defaultPrecision else opts.Precision; + interval(numeric(p, N), numeric(p, M), opts)) +interval(RR, RR) := opts -> (N,M) -> ( if opts.Precision < 0 then toRRi(N,M) else toRRi(opts.Precision,N,M)) - -for A in {ZZ,QQ,RR} do -interval(A,RRi) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval N, M) - else toCCi(opts.Precision, interval N, M)) -for A in {ZZ,QQ,RR} do -interval(RRi,A) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(N, interval M) - else toCCi(opts.Precision, N, interval M)) - +interval(RR, RRi) := opts -> (N,M) -> interval(toRRi N, M, opts) +interval(RRi, RR) := opts -> (N,M) -> interval(N, toRRi M, opts) interval(RRi,RRi) := opts -> (N,M) -> ( if opts.Precision < 0 then toCCi(N,M) else toCCi(opts.Precision,N,M)) @@ -42,11 +35,20 @@ interval(RRi,RRi) := opts -> (N,M) -> ( interval(Number, CC) := opts -> (N, M) -> interval(toCC N, M, opts) interval(CC, Number) := opts -> (N, M) -> interval(N, toCC M, opts) interval(CC,CC) := opts -> (N,M) -> ( - if opts.Precision < 0 then toCCi(interval(realPart N, realPart M), interval(imaginaryPart N, imaginaryPart M)) + if opts.Precision < 0 + then toCCi( + interval(realPart N, realPart M), + interval(imaginaryPart N, imaginaryPart M)) else toCCi(opts.Precision, interval(realPart N, realPart M, opts), interval(imaginaryPart N, imaginaryPart M, opts))) +-- the following don't make sense +interval(RRi, CC) := +interval(CC, RRi) := +interval(CCi, Number) := +interval(Number, CCi) := opts -> (N, M) -> error "interval not well-defined" + interval(Array) := opts -> A -> ( if (length(A) == 0) or (length(A)>2) then error("expected length 2") else if length(A) == 1 then interval(opts,A_0) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 1f5f0244428..7c935c75033 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -231,27 +231,20 @@ Key (interval,CC) (interval,CC,CC) (interval,CC,Number) + (interval,CC,RRi) (interval,CCi) + (interval,CCi,Number) (interval,Number) (interval,Number,CC) - (interval,QQ,QQ) - (interval,QQ,RR) - (interval,QQ,RRi) - (interval,QQ,ZZ) + (interval,Number,CCi) + (interval,Number,Number) (interval,RR) - (interval,RR,QQ) (interval,RR,RR) (interval,RR,RRi) - (interval,RR,ZZ) (interval,RRi) - (interval,RRi,QQ) + (interval,RRi,CC) (interval,RRi,RR) (interval,RRi,RRi) - (interval,RRi,ZZ) - (interval,ZZ,QQ) - (interval,ZZ,RR) - (interval,ZZ,RRi) - (interval,ZZ,ZZ) [interval,Precision] Headline construct an interval @@ -285,14 +278,14 @@ Description interval(5, 4) interval [7, 8] Text - If given two arguments, at least one of which is a complex number, - then the rectangle in the complex plane whose lower left hand corner - is the first argument and upper right hand corner is the second argument - is returned. + If given two arguments, at least one of which is a complex number + and neither of which is an interval, then the rectangle in the + complex plane whose lower left hand corner is the first argument + and upper right hand corner is the second argument is returned. Example interval(2 + 3*ii, 5 + 4*ii) Text - If given two arguments, at least one of which is a real interval, + If given two real arguments, at least one of which is an interval, then the first argument gives the real part and the second argument the imaginary part of a complex interval. Example From f097a5e53da9f64845133cf446ca0f746185871f Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Sun, 26 Oct 2025 20:24:56 -0400 Subject: [PATCH 134/691] Added == for CCi's --- M2/Macaulay2/d/actors3.d | 15 +++++++++++++++ M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 | 4 +--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 3af3b5ac32c..85fc1bacea3 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -112,6 +112,7 @@ EqualEqualfun(x:Expr,y:Expr):Expr := ( is yy:RRcell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, ZZ, RR, Boolean is yy:RRicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, ZZ, RRi, Boolean is yy:CCcell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, ZZ, CC, Boolean + is yy:CCicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, ZZ, CCi, Boolean else equalmethod(x,y) ) is xx:SymbolClosure do ( @@ -125,6 +126,7 @@ EqualEqualfun(x:Expr,y:Expr):Expr := ( is yy:RRcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, QQ, RR, Boolean is yy:RRicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, QQ, RRi, Boolean is yy:CCcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, QQ, CC, Boolean + is yy:CCicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, QQ, CCi, Boolean else equalmethod(x,y) ) is xx:RRcell do ( @@ -134,6 +136,7 @@ EqualEqualfun(x:Expr,y:Expr):Expr := ( is yy:RRcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, RR, RR, Boolean is yy:RRicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, RR, RRi, Boolean is yy:CCcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, RR, CC, Boolean + is yy:CCicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, RR, CCi, Boolean else equalmethod(x,y) ) is xx:RRicell do ( @@ -141,6 +144,7 @@ EqualEqualfun(x:Expr,y:Expr):Expr := ( is yy:ZZcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, RRi, ZZ, Boolean is yy:QQcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, RRi, QQ, Boolean is yy:RRcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, RRi, RR, Boolean + is yy:CCicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, RRi, CCi, Boolean else buildErrorPacket(EngineError("equality not implemented"))) is xx:CCcell do ( when y @@ -148,6 +152,17 @@ EqualEqualfun(x:Expr,y:Expr):Expr := ( is yy:QQcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, CC, QQ, Boolean is yy:RRcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, CC, RR, Boolean is yy:CCcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, CC, CC, Boolean + is yy:CCicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, CC, CCi, Boolean + else equalmethod(x,y) + ) + is xx:CCicell do ( + when y + is yy:ZZcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, CCi, ZZ, Boolean + is yy:QQcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, CCi, QQ, Boolean + is yy:RRcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, CCi, RR, Boolean + is yy:RRicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, CCi, RRi, Boolean + is yy:CCcell do toExpr(xx.v === yy.v) -- # typical value: symbol ==, CCi, CC, Boolean + is yy:CCicell do toExpr(yy.v === xx.v) -- # typical value: symbol ==, CCi, CCi, Boolean else equalmethod(x,y) ) is xx:Boolean do ( diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index 3a7a736dbd0..aa91c2bd064 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -480,9 +480,7 @@ document { TO (isMember, QQ, RRi), TO (isEmpty, RRi), TO (isSubset, RRi, RRi), - TO span, -- TODO: perhaps this should be shared - TO (span, List), - TO (span, Sequence), + TO span }, } From 6f111b406321ff7427d41e62c53417bffc99f6a1 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 29 Oct 2025 12:42:08 -0400 Subject: [PATCH 135/691] Fix 2-argument "interval" when ii is one of the arguments --- M2/Macaulay2/m2/intervals.m2 | 4 ++-- M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 7af31acd865..6c9ab6c8ff1 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -32,8 +32,8 @@ interval(RRi,RRi) := opts -> (N,M) -> ( if opts.Precision < 0 then toCCi(N,M) else toCCi(opts.Precision,N,M)) -interval(Number, CC) := opts -> (N, M) -> interval(toCC N, M, opts) -interval(CC, Number) := opts -> (N, M) -> interval(N, toCC M, opts) +interval(RR,CC) := opts -> (N, M) -> interval(toCC N, M, opts) +interval(CC,RR) := opts -> (N, M) -> interval(N, toCC M, opts) interval(CC,CC) := opts -> (N,M) -> ( if opts.Precision < 0 then toCCi( diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 7c935c75033..b79be6c62a8 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -230,15 +230,15 @@ Key (interval,Array) (interval,CC) (interval,CC,CC) - (interval,CC,Number) + (interval,CC,RR) (interval,CC,RRi) (interval,CCi) (interval,CCi,Number) (interval,Number) - (interval,Number,CC) (interval,Number,CCi) (interval,Number,Number) (interval,RR) + (interval,RR,CC) (interval,RR,RR) (interval,RR,RRi) (interval,RRi) From 4f55cfc1d7f7b54152d00615e2c43d68fe5971f8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 29 Oct 2025 12:47:49 -0400 Subject: [PATCH 136/691] Fix precision for 2-argument "interval" --- M2/Macaulay2/m2/intervals.m2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 6c9ab6c8ff1..f3f8cf18781 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -21,7 +21,9 @@ interval CCi := opts -> N -> ( else toCCi(opts.Precision, realPart N, imaginaryPart N)) interval(Number, Number) := opts -> (N, M) -> ( - p := if opts.Precision < 0 then defaultPrecision else opts.Precision; + p := opts.Precision; + if p < 0 then p = min(precision N, precision M); + if isInfinite p then p = defaultPrecision; interval(numeric(p, N), numeric(p, M), opts)) interval(RR, RR) := opts -> (N,M) -> ( if opts.Precision < 0 then toRRi(N,M) From 9b3d7cd3fcde86b6547d60d474d2f6522b5be35a Mon Sep 17 00:00:00 2001 From: Rickey Huang Date: Wed, 29 Oct 2025 13:48:27 -0400 Subject: [PATCH 137/691] fixed the empty interval output when the real parts are zero --- M2/Macaulay2/d/gmp1.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 7f5495e03cd..3bde03e0a5f 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -188,7 +188,7 @@ export tostringRRiforCCi(x:RRi):string := concatenate( export tostringCCi(x:CCi):string := ( if isZero(x.im) then tostringRRi(x.re) - else if isZero(x.re) then concatenate(array(string)(tostringRRi(x.im),"*ii")) + else if isZero(x.re) then concatenate(array(string)(tostringRRiforCCi(x.im),"*ii", " (an empty interval)")) else if isEmpty(x) then concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii", " (an empty interval)")) else concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii")) ); From c00544e8638ae1df72d6b8680ae230fd7d0a6e02 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 29 Oct 2025 14:19:15 -0400 Subject: [PATCH 138/691] Fixing precision in toCCi --- M2/Macaulay2/d/actors4.d | 46 ++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 6c3412b08fd..b06858aab4f 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1424,16 +1424,16 @@ toCCi(e:Expr):Expr := ( if length(s) == 2 then ( when s.0 is x:ZZcell do ( when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) - is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) + is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:QQcell do ( when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) is y:QQcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) + is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:RRcell do ( when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) @@ -1451,32 +1451,28 @@ toCCi(e:Expr):Expr := ( else when s.0 is prec:ZZcell do ( when s.1 is x:ZZcell do ( - when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,precision(y.v)),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,defaultPrecision),y.v,toULong(prec.v))) - is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), defaultPrecision),toRRi(imaginaryPart(y.v), defaultPrecision),toULong(prec.v))) + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:QQcell do ( - when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,defaultPrecision),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(y.v,precision(y.v)),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,defaultPrecision),y.v,toULong(prec.v))) - is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), defaultPrecision),toRRi(imaginaryPart(y.v), defaultPrecision),toULong(prec.v))) + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:RRcell do ( - when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,precision(x.v)),toRRi(y.v,precision(x.v)),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v,precision(x.v)),toRRi(y.v,precision(x.v)),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),y.v,toULong(prec.v))) - is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), precision(x.v)),toRRi(imaginaryPart(y.v), precision(x.v)),toULong(prec.v))) + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:RRicell do ( - when s.2 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),y.v,toULong(prec.v))) - is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), precision(x.v)),toRRi(imaginaryPart(y.v), precision(x.v)),toULong(prec.v))) + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")) else WrongNumArgs(1,2)) From 976f9c96622227f7ed12eda0422935369967246e Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 29 Oct 2025 14:22:28 -0400 Subject: [PATCH 139/691] Added toCCi for CCi input --- M2/Macaulay2/d/actors4.d | 1 + 1 file changed, 1 insertion(+) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index b06858aab4f..a8d7d9cab10 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1428,6 +1428,7 @@ toCCi(e:Expr):Expr := ( is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) + is y:CCicell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) is x:QQcell do ( when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) From 5dd78c468ce0a3f66c1f4d57b2f4a28b0b2669e4 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 5 Nov 2025 14:33:10 -0500 Subject: [PATCH 140/691] Add lngamma(CCi) --- M2/Macaulay2/m2/reals.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 8a8e08b83f8..d4fd212e6a9 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -333,7 +333,7 @@ lngamma RR := x -> ( if s == -1 then y + ii * numeric_(precision y) pi else y ) lngamma Number := lngamma @@ numeric -lngamma RRi := lngamma CC := lgamma +lngamma RRi := lngamma CC := lngamma CCi := lgamma expression Constant := hold toString Constant := net Constant := c -> toString c#0 From 2f4ea35574988757ba7504ebce89b54f32944446 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 5 Nov 2025 14:54:29 -0500 Subject: [PATCH 141/691] Add size2(CCi) --- M2/Macaulay2/d/actors2.dd | 1 + 1 file changed, 1 insertion(+) diff --git a/M2/Macaulay2/d/actors2.dd b/M2/Macaulay2/d/actors2.dd index c6c547e6f5b..21b1476ad0d 100644 --- a/M2/Macaulay2/d/actors2.dd +++ b/M2/Macaulay2/d/actors2.dd @@ -704,6 +704,7 @@ exponent(e:Expr):Expr := ( is x:RRcell do toExpr(exponent(x.v)) -- # typical value: size2, RR, ZZ is x:RRicell do toExpr(exponent(x.v)) -- # typical value: size2, RRi, ZZ is z:CCcell do toExpr(exponent(z.v)) -- # typical value: size2, CC, ZZ + is z:CCicell do toExpr(exponent(z.v)) -- # typical value: size2, CCi, ZZ else WrongArg("a number")); setupfun("size2",exponent); From bbbfc4be97d95a9e478886b9d0a9ab49988d6662 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 5 Nov 2025 14:54:44 -0500 Subject: [PATCH 142/691] Lots o' CCi docs --- .../packages/Macaulay2Doc/doc_arithmetic.m2 | 4 +- .../packages/Macaulay2Doc/doc_intervals.m2 | 6 ++- .../Macaulay2Doc/functions/Beta-doc.m2 | 44 +++++++++++++++++ .../Macaulay2Doc/functions/Gamma-doc.m2 | 16 ++++++ .../Macaulay2Doc/functions/atan-doc.m2 | 2 +- .../Macaulay2Doc/functions/cos-doc.m2 | 2 +- .../Macaulay2Doc/functions/erf-doc.m2 | 2 + .../Macaulay2Doc/functions/promote-doc.m2 | 1 + .../Macaulay2Doc/functions/ring-doc.m2 | 3 +- .../Macaulay2Doc/functions/sin-doc.m2 | 2 +- .../Macaulay2Doc/functions/sinh-doc.m2 | 2 +- .../Macaulay2Doc/functions/tan-doc.m2 | 2 +- .../Macaulay2Doc/functions/tanh-doc.m2 | 2 +- .../packages/Macaulay2Doc/operators.m2 | 20 ++++++-- .../Macaulay2Doc/ov_analytic_functions.m2 | 49 ++++++++++++------- M2/submodules/flint | 2 +- 16 files changed, 126 insertions(+), 33 deletions(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 index 1bdac8b86ee..0639ce331e0 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 @@ -33,8 +33,8 @@ document { document { Key => {numeric,(numeric,Matrix),(numeric,ZZ,Matrix), (numeric, Vector),(numeric, ZZ, Vector), - (numeric, ZZ, CC), (numeric, RR), (numeric, RRi), - (numeric, ZZ, RRi), + (numeric, ZZ, CC), (numeric, RR), (numeric, RRi), (numeric, CCi), + (numeric, ZZ, RRi), (numeric, ZZ, CCi), (numeric, CC), (numeric, ZZ, VisibleList), (numeric, VisibleList), (numeric, ZZ, Constant), (numeric, Constant), (numeric, InfiniteNumber, Constant), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index b79be6c62a8..eca711afca2 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -102,6 +102,10 @@ doc /// Key (intersect, RRi) (intersect, RRi, RRi) + (intersect, CCi) + (intersect, CCi, CCi) + (intersect, CCi, RRi) + (intersect, RRi, CCi) [(intersect, RRi), Precision] [(intersect, RRi, RRi), Precision] Headline @@ -188,8 +192,6 @@ SeeAlso isMember /// -undocumented{(isReal, CCi)} - doc /// Key span diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 index e7659807d6d..9f956b8b7e0 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 @@ -2,10 +2,17 @@ doc /// Key Beta (Beta,CC,CC) + (Beta,CC,CCi) (Beta,CC,RR) + (Beta,CCi,CC) + (Beta,CCi,CCi) + (Beta,CCi,RR) + (Beta,CCi,RRi) (Beta,RR,CC) + (Beta,RR,CCi) (Beta,RR,RR) (Beta,RR,RRi) + (Beta,RRi,CCi) (Beta,RRi,RR) (Beta,RRi,RRi) Headline @@ -32,18 +39,55 @@ doc /// Key regularizedBeta (regularizedBeta,CC,CC,CC) + (regularizedBeta,CC,CC,CCi) (regularizedBeta,CC,CC,RR) + (regularizedBeta,CC,CCi,CC) + (regularizedBeta,CC,CCi,CCi) + (regularizedBeta,CC,CCi,RR) + (regularizedBeta,CC,CCi,RRi) (regularizedBeta,CC,RR,CC) + (regularizedBeta,CC,RR,CCi) (regularizedBeta,CC,RR,RR) + (regularizedBeta,CC,RRi,CCi) + (regularizedBeta,CCi,CC,CC) + (regularizedBeta,CCi,CC,CCi) + (regularizedBeta,CCi,CC,RR) + (regularizedBeta,CCi,CC,RRi) + (regularizedBeta,CCi,CCi,CC) + (regularizedBeta,CCi,CCi,CCi) + (regularizedBeta,CCi,CCi,RR) + (regularizedBeta,CCi,CCi,RRi) + (regularizedBeta,CCi,RR,CC) + (regularizedBeta,CCi,RR,CCi) + (regularizedBeta,CCi,RR,RR) + (regularizedBeta,CCi,RR,RRi) + (regularizedBeta,CCi,RRi,CC) + (regularizedBeta,CCi,RRi,CCi) + (regularizedBeta,CCi,RRi,RR) + (regularizedBeta,CCi,RRi,RRi) (regularizedBeta,RR,CC,CC) + (regularizedBeta,RR,CC,CCi) (regularizedBeta,RR,CC,RR) + (regularizedBeta,RR,CCi,CC) + (regularizedBeta,RR,CCi,CCi) + (regularizedBeta,RR,CCi,RR) + (regularizedBeta,RR,CCi,RRi) (regularizedBeta,RR,RR,CC) + (regularizedBeta,RR,RR,CCi) (regularizedBeta,RR,RR,RR) (regularizedBeta,RR,RR,RRi) + (regularizedBeta,RR,RRi,CCi) (regularizedBeta,RR,RRi,RR) (regularizedBeta,RR,RRi,RRi) + (regularizedBeta,RRi,CC,CCi) + (regularizedBeta,RRi,CCi,CC) + (regularizedBeta,RRi,CCi,CCi) + (regularizedBeta,RRi,CCi,RR) + (regularizedBeta,RRi,CCi,RRi) + (regularizedBeta,RRi,RR,CCi) (regularizedBeta,RRi,RR,RR) (regularizedBeta,RRi,RR,RRi) + (regularizedBeta,RRi,RRi,CCi) (regularizedBeta,RRi,RRi,RR) (regularizedBeta,RRi,RRi,RRi) Headline diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 index a516c879660..781a00fa1fa 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 @@ -11,6 +11,14 @@ doc /// (Gamma,RRi) (Gamma,RRi,RR) (Gamma,RRi,RRi) + (Gamma,CC,CCi) + (Gamma,CCi) + (Gamma,CCi,CC) + (Gamma,CCi,CCi) + (Gamma,CCi,RR) + (Gamma,CCi,RRi) + (Gamma,RR,CCi) + (Gamma,RRi,CCi) Headline Gamma function Usage @@ -42,10 +50,17 @@ doc /// Key regularizedGamma (regularizedGamma,CC,CC) + (regularizedGamma,CC,CCi) (regularizedGamma,CC,RR) + (regularizedGamma,CCi,CC) + (regularizedGamma,CCi,CCi) + (regularizedGamma,CCi,RR) + (regularizedGamma,CCi,RRi) (regularizedGamma,RR,CC) + (regularizedGamma,RR,CCi) (regularizedGamma,RR,RR) (regularizedGamma,RR,RRi) + (regularizedGamma,RRi,CCi) (regularizedGamma,RRi,RR) (regularizedGamma,RRi,RRi) Headline @@ -99,6 +114,7 @@ doc /// lngamma (lngamma, RR) (lngamma, CC) + (lngamma, CCi) (lngamma, RRi) (lngamma, Number) Headline diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 index f85b4f489a6..4e496e102b8 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 @@ -22,7 +22,7 @@ document { } document { - Key => {atan,(atan,RR),(atan,CC),(atan, RRi)}, + Key => {atan,(atan,RR),(atan,CC),(atan, RRi),(atan,CCi)}, Headline => "compute the arctangent of a number", Usage => "atan x\natan I", Inputs => { "x" => RR, "I" => RRi}, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 index 3a11982d5a2..eb4a9366f99 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 @@ -3,7 +3,7 @@ --- notes: document { - Key => {cos, (cos,CC),(cos,RR),(cos, RRi)}, + Key => {cos, (cos,CC),(cos,CCi),(cos,RR),(cos, RRi)}, Headline => "compute the cosine", Usage => "cos x\ncos I", Inputs => { "x" => RR,"I"=>RRi}, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 index 02226d7576e..f14c70e6380 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 @@ -2,6 +2,7 @@ doc /// Key erf (erf,CC) + (erf,CCi) (erf,RR) (erf,RRi) Headline @@ -27,6 +28,7 @@ doc /// Key erfc (erfc,CC) + (erfc,CCi) (erfc,RR) (erfc,RRi) Headline diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 index 12fc357c243..9bc954ff7ae 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 @@ -52,6 +52,7 @@ undocumented {(promote,CC,CC_*), (promote,RR,CC_*), (promote,RR,RR_*), (promote, RRi, RRi_*), + (promote, CCi, CCi_*), (promote,ZZ,CC_*), (promote,ZZ,QQ), (promote,ZZ,RingElement), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/ring-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/ring-doc.m2 index f5b0382f986..d60a9cc0276 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/ring-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/ring-doc.m2 @@ -6,7 +6,8 @@ document { Key => {ring, (ring,Vector), (ring,RingElement), (ring, GroebnerBasis),(ring, Number), (ring,Module),(ring,Matrix), - (ring,MutableMatrix),(ring,Ideal), (ring,CC),(ring,RR),(ring,RRi) + (ring,MutableMatrix),(ring,Ideal), (ring,CC),(ring,RR),(ring,RRi), + (ring,CCi) }, Headline => "get the associated ring of an object", Usage => "ring M", diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 index e4aeff6bfc6..04e40aaa4c5 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 @@ -3,7 +3,7 @@ --- notes: Is the comment about being used as an example still relevant? document { - Key => {sin,(sin,CC),(sin,RR),(sin, RRi)}, + Key => {sin,(sin,CC),(sin,CCi),(sin,RR),(sin, RRi)}, -- this node is used as an example in the documentation node Inputs and Outputs. Headline => "compute the sine", Usage => "sin x\nsin I", diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 index ad273d0aa79..6521a58078f 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 @@ -3,7 +3,7 @@ --- notes: include example? document { - Key => {sinh,(sinh,CC),(sinh,RR),(sinh, RRi)}, + Key => {sinh,(sinh,CC),(sinh,RR),(sinh, RRi),(sinh,CCi)}, Headline => "compute the hyperbolic sine", Usage => "sinh x\nsinh I", Inputs => { diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 index b53f3290395..16874e74e5a 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 @@ -3,7 +3,7 @@ --- notes: document { - Key => {tan,(tan,CC),(tan,RR), (tan,RRi)}, + Key => {tan,(tan,CC),(tan,CCi),(tan,RR), (tan,RRi)}, Headline => "compute the tangent", Usage => "tan x\ntan I", Inputs => { diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 index 432c7984dd0..2a17014a024 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 @@ -3,7 +3,7 @@ --- notes: include example? document { - Key => {tanh, (tanh,CC),(tanh,RR),(tanh, RRi)}, + Key => {tanh, (tanh,CC),(tanh,RR),(tanh, RRi),(tanh,CCi)}, Headline => "compute the hyperbolic tangent", Usage => "tanh x\ntanh I", Inputs => { diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 index 3a899379c73..9aa21e67955 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 @@ -68,7 +68,7 @@ document { } document { - Key => {exp,(exp,RR),(exp,CC),(exp,RRi)}, + Key => {exp,(exp,RR),(exp,CC),(exp,RRi),(exp,CCi)}, Headline => "exponential function", Usage => "exp x\nexp I", Inputs => { "x" => RR ,"I"=>RRi}, @@ -81,8 +81,20 @@ document { } document { - Key => {log,(log, RR),(log,CC),(log, RRi),(log, RR, RR),(log, RRi, RRi), - (log,RR,CC),(log,RR,RRi),(log,RRi,RR)}, + Key => { + log, + (log, RR), + (log,CC), + (log,CCi), + (log,RR,CCi), + (log,RR,RR), + (log,RR,RRi), + (log,RRi), + (log,RRi,CCi), + (log,RRi,RR), + (log,RRi,RRi), + (log,RR,CC) + }, Headline => "logarithm function", Usage => "log x\nlog(b,x)\nlog_b x\nlog I\nlog(b,I)\nlog_b I\nlog(J,x)\nlog_J x\nlog(J,I)\nlog_J I", Inputs => { "x" => RR, "b" => RR => {"the base for the logarithm"}, "I" => RRi, "J" => RRi => {"an interval of bases for the logarithm"} }, @@ -94,7 +106,7 @@ Outputs => { { "the logarithm of ", TT "x"}, RRi => {"an interval containing the /// } document { - Key => {sqrt,(sqrt, CC),(sqrt, RR), (sqrt, RRi)}, + Key => {sqrt,(sqrt, CC),(sqrt, RR), (sqrt, RRi),(sqrt,CCi)}, Headline => "square root function", Usage => "sqrt x\nsqrt I", Inputs => { "x" => RR, "I" => RRi }, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 index bbc68162df5..caa6481586b 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 @@ -153,6 +153,7 @@ doc /// Key log1p (log1p,CC) + (log1p,CCi) (log1p,RR) (log1p,RRi) Headline @@ -166,7 +167,7 @@ doc /// Outputs :{RR,CC} the logarithm of @TT "1+x"@ - :{RRi} + :{RRi,CCi} an interval containing logarithm of 1 plus the points of @TT "I"@ Description Example @@ -178,6 +179,7 @@ doc /// Key expm1 (expm1,CC) + (expm1,CCi) (expm1,RR) (expm1,RRi) Headline @@ -191,7 +193,7 @@ doc /// Outputs :{RR,CC} the quantity @TT "exp(x)-1"@ - :RRi + :{RRi,CCi} an interval containing the exponential of the points of @TT "I"@ minus one Description Example @@ -199,7 +201,7 @@ doc /// exp(1p100e-10)-1 /// -document { Key => {eint,(eint, RR),(eint,CC),(eint,RRi)}, +document { Key => {eint,(eint, RR),(eint,CC),(eint,RRi),(eint,CCi)}, Usage => "eint x", Headline => "exponential integral", Inputs => { "x" }, @@ -210,7 +212,7 @@ document { Key => {eint,(eint, RR),(eint,CC),(eint,RRi)}, PARA {"See ", wikipedia "Exponential integral", "."} } -document { Key => {Digamma,(Digamma, RR),(Digamma,CC),(Digamma,RRi)}, +document { Key => {Digamma,(Digamma, RR),(Digamma,CC),(Digamma,RRi),(Digamma,CCi)}, Usage => "Digamma x", Headline => "Digamma function", Inputs => { "x" }, @@ -222,7 +224,7 @@ document { Key => {Digamma,(Digamma, RR),(Digamma,CC),(Digamma,RRi)}, SeeAlso => {Gamma} } -document { Key => {zeta,(zeta, RR),(zeta,CC),(zeta,RRi)}, +document { Key => {zeta,(zeta, RR),(zeta,CC),(zeta,RRi),(zeta,CCi)}, Usage => "zeta x", Headline => "Riemann zeta function", Inputs => { "x" }, @@ -235,7 +237,7 @@ document { Key => {zeta,(zeta, RR),(zeta,CC),(zeta,RRi)}, document { --- author(s): L. Gold, Dan Grayson - Key => {acos,(acos,RR),(acos,CC),(acos, RRi)}, + Key => {acos,(acos,RR),(acos,CC),(acos, RRi),(acos,CCi)}, Headline => "arccosine", Usage => "acos x\nacos I", Inputs => { "x", "I" => RRi }, @@ -249,7 +251,7 @@ document { document { --- author(s): L. Gold, Dan Grayson - Key => {asin,(asin,RR),(asin,CC),(asin, RRi)}, + Key => {asin,(asin,RR),(asin,CC),(asin, RRi),(asin,CCi)}, Headline => "arcsine", Usage => "asin x\nasin I", Inputs => { "x", "I" => RRi }, @@ -265,7 +267,7 @@ document { document { --- author(s): L. Gold - Key => {cosh, (cosh,RR),(cosh,CC),(cosh,RRi)}, + Key => {cosh, (cosh,RR),(cosh,CC),(cosh,RRi),(cosh,CCi)}, Headline => "compute the hyperbolic cosine", Usage => "cosh x\ncosh I", Inputs => { "x", "I"=>RRi}, @@ -301,7 +303,7 @@ document { PARA {"See ", wikipedia "Hyperbolic function", "."} } -document { Key => {sec,(sec,CC),(sec, RR),(sec, RRi)}, +document { Key => {sec,(sec,CC),(sec, RR),(sec, RRi),(sec,CCi)}, Usage => "sec x\nsec I", Headline => "secant", Inputs => { "x", "I" => RRi }, @@ -314,7 +316,7 @@ document { Key => {sec,(sec,CC),(sec, RR),(sec, RRi)}, PARA {"See ", wikipedia "Trigonometric function", "."} } -document { Key => {csc,(csc,CC),(csc, RR),(csc,RRi)}, +document { Key => {csc,(csc,CC),(csc, RR),(csc,RRi),(csc,CCi)}, Usage => "csc x\ncsc I", Headline => "cosecant", Inputs => { "x","I"=>RRi }, @@ -327,7 +329,7 @@ document { Key => {csc,(csc,CC),(csc, RR),(csc,RRi)}, PARA {"See ", wikipedia "Trigonometric function", "."} } -document { Key => {cot,(cot, RR),(cot,CC),(cot,RRi)}, +document { Key => {cot,(cot, RR),(cot,CC),(cot,RRi),(cot,CCi)}, Usage => "cot x\ncot I", Headline => "cotangent", Inputs => { "x", "I"=>RRi }, @@ -340,7 +342,7 @@ document { Key => {cot,(cot, RR),(cot,CC),(cot,RRi)}, PARA {"See ", wikipedia "Trigonometric function", "."} } -document { Key => {sech,(sech,CC),(sech, RR),(sech, RRi)}, +document { Key => {sech,(sech,CC),(sech, RR),(sech, RRi),(sech,CCi)}, Usage => "sech x\nsech I", Headline => "hyperbolic secant", Inputs => { "x", "I" => RRi }, @@ -353,7 +355,7 @@ document { Key => {sech,(sech,CC),(sech, RR),(sech, RRi)}, PARA {"See ", wikipedia "Hyperbolic function", "."} } -document { Key => {csch,(csch,CC),(csch, RR),(csch,RRi)}, +document { Key => {csch,(csch,CC),(csch, RR),(csch,RRi),(csch,CCi)}, Usage => "csch x\ncsch I", Headline => "hyperbolic cosecant", Inputs => { "x", "I"=>RRi }, @@ -366,7 +368,7 @@ document { Key => {csch,(csch,CC),(csch, RR),(csch,RRi)}, PARA {"See ", wikipedia "Hyperbolic function", "."} } -document { Key => {coth,(coth,CC),(coth, RR),(coth,RRi)}, +document { Key => {coth,(coth,CC),(coth, RR),(coth,RRi),(coth,CCi)}, Usage => "coth x\ncoth I", Headline => "hyperbolic cotangent", Inputs => { "x","I"=>RRi}, @@ -415,7 +417,19 @@ document { Key => {BesselY,(BesselY, ZZ, Number),(BesselY,Number,Number)}, SeeAlso => { BesselJ } } -document { Key => {agm, (agm, RR, RR), (agm,CC,CC), (agm,CC,RR), (agm,RR,CC)}, +document { Key => { + agm, + (agm, RR, RR), + (agm,CC,CC), + (agm,CC,CCi), + (agm,CC,RR), + (agm,CCi,CC), + (agm,CCi,CCi), + (agm,CCi,RR), + (agm,CCi,RRi), + (agm,RR,CC), + (agm,RR,CCi), + (agm,RRi,CCi)}, Usage => "agm(x,y)", Inputs => { "x" => "a number", "y" => "a number" }, Outputs => { {"the arithmetic-geometric mean of ", TT "x", " and ", TT "y"}}, @@ -427,7 +441,8 @@ document { Key => {agm, (agm, RR, RR), (agm,CC,CC), (agm,CC,RR), (agm,RR,CC)}, } -- TODO: find a better place for these -document { Key => {size2, (size2,CC), (size2,RR), (size2,ZZ), (size2,RRi)}, +document { Key => {size2, (size2,CC), (size2,RR), (size2,ZZ), (size2,RRi), + (size2,CCi)}, Usage => "size2 x", Headline => "number of binary digits to the left of the point", Inputs => {"x" => Number}, @@ -444,7 +459,7 @@ document { Key => {size2, (size2,CC), (size2,RR), (size2,ZZ), (size2,RRi)}, size2 (1/0.-1/0.) ///} -document { Key => {isReal,(isReal,CC),(isReal,QQ),(isReal,RR),(isReal,ZZ), +document { Key => {isReal,(isReal,CC),(isReal,CCi),(isReal,QQ),(isReal,RR),(isReal,ZZ), (isReal, RRi), (isReal, Constant), (isReal, InfiniteNumber)}, Usage => "isReal x", Headline => "whether a number is real", diff --git a/M2/submodules/flint b/M2/submodules/flint index b1145e68fd8..17950040404 160000 --- a/M2/submodules/flint +++ b/M2/submodules/flint @@ -1 +1 @@ -Subproject commit b1145e68fd8160104c183fb67676f7114cd71c7a +Subproject commit 17950040404e6ed797a4becd8a866fb3f62b5c5e From b0d5c305a2436a74e6fcbf157458deef8a6585e9 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 7 Nov 2025 12:03:25 -0500 Subject: [PATCH 143/691] Even more CCi docs --- .../packages/Macaulay2Doc/doc_intervals.m2 | 1 + .../Macaulay2Doc/functions/Beta-doc.m2 | 14 ++++++++++++++ .../Macaulay2Doc/functions/Gamma-doc.m2 | 4 ++++ .../Macaulay2Doc/functions/lift-doc.m2 | 4 ++++ .../Macaulay2Doc/functions/promote-doc.m2 | 13 +++++++++++++ .../Macaulay2Doc/operators/division.m2 | 19 ++++++++++++++++--- .../packages/Macaulay2Doc/operators/minus.m2 | 14 ++++++++++++++ .../packages/Macaulay2Doc/operators/plus.m2 | 14 ++++++++++++++ .../packages/Macaulay2Doc/operators/times.m2 | 13 +++++++++++++ .../Macaulay2Doc/ov_analytic_functions.m2 | 7 ++++++- 10 files changed, 99 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index eca711afca2..300916676b5 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -135,6 +135,7 @@ Key (isMember, QQ, RRi) (isMember, ZZ, RRi) (isMember, RR, RRi) + (isMember, CC, RRi) Headline membership test in an interval Usage diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 index 9f956b8b7e0..b053287ef7b 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 @@ -4,6 +4,7 @@ doc /// (Beta,CC,CC) (Beta,CC,CCi) (Beta,CC,RR) + (Beta,CC,RRi) (Beta,CCi,CC) (Beta,CCi,CCi) (Beta,CCi,RR) @@ -12,6 +13,7 @@ doc /// (Beta,RR,CCi) (Beta,RR,RR) (Beta,RR,RRi) + (Beta,RRi,CC) (Beta,RRi,CCi) (Beta,RRi,RR) (Beta,RRi,RRi) @@ -41,6 +43,7 @@ doc /// (regularizedBeta,CC,CC,CC) (regularizedBeta,CC,CC,CCi) (regularizedBeta,CC,CC,RR) + (regularizedBeta,CC,CC,RRi) (regularizedBeta,CC,CCi,CC) (regularizedBeta,CC,CCi,CCi) (regularizedBeta,CC,CCi,RR) @@ -48,7 +51,11 @@ doc /// (regularizedBeta,CC,RR,CC) (regularizedBeta,CC,RR,CCi) (regularizedBeta,CC,RR,RR) + (regularizedBeta,CC,RR,RRi) + (regularizedBeta,CC,RRi,CC) (regularizedBeta,CC,RRi,CCi) + (regularizedBeta,CC,RRi,RR) + (regularizedBeta,CC,RRi,RRi) (regularizedBeta,CCi,CC,CC) (regularizedBeta,CCi,CC,CCi) (regularizedBeta,CCi,CC,RR) @@ -68,6 +75,7 @@ doc /// (regularizedBeta,RR,CC,CC) (regularizedBeta,RR,CC,CCi) (regularizedBeta,RR,CC,RR) + (regularizedBeta,RR,CC,RRi) (regularizedBeta,RR,CCi,CC) (regularizedBeta,RR,CCi,CCi) (regularizedBeta,RR,CCi,RR) @@ -76,17 +84,23 @@ doc /// (regularizedBeta,RR,RR,CCi) (regularizedBeta,RR,RR,RR) (regularizedBeta,RR,RR,RRi) + (regularizedBeta,RR,RRi,CC) (regularizedBeta,RR,RRi,CCi) (regularizedBeta,RR,RRi,RR) (regularizedBeta,RR,RRi,RRi) + (regularizedBeta,RRi,CC,CC) (regularizedBeta,RRi,CC,CCi) + (regularizedBeta,RRi,CC,RR) + (regularizedBeta,RRi,CC,RRi) (regularizedBeta,RRi,CCi,CC) (regularizedBeta,RRi,CCi,CCi) (regularizedBeta,RRi,CCi,RR) (regularizedBeta,RRi,CCi,RRi) + (regularizedBeta,RRi,RR,CC) (regularizedBeta,RRi,RR,CCi) (regularizedBeta,RRi,RR,RR) (regularizedBeta,RRi,RR,RRi) + (regularizedBeta,RRi,RRi,CC) (regularizedBeta,RRi,RRi,CCi) (regularizedBeta,RRi,RRi,RR) (regularizedBeta,RRi,RRi,RRi) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 index 781a00fa1fa..cc38d9ff44b 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 @@ -4,11 +4,13 @@ doc /// (Gamma,CC) (Gamma,CC,CC) (Gamma,CC,RR) + (Gamma,CC,RRi) (Gamma,RR) (Gamma,RR,CC) (Gamma,RR,RR) (Gamma,RR,RRi) (Gamma,RRi) + (Gamma,RRi,CC) (Gamma,RRi,RR) (Gamma,RRi,RRi) (Gamma,CC,CCi) @@ -52,6 +54,7 @@ doc /// (regularizedGamma,CC,CC) (regularizedGamma,CC,CCi) (regularizedGamma,CC,RR) + (regularizedGamma,CC,RRi) (regularizedGamma,CCi,CC) (regularizedGamma,CCi,CCi) (regularizedGamma,CCi,RR) @@ -60,6 +63,7 @@ doc /// (regularizedGamma,RR,CCi) (regularizedGamma,RR,RR) (regularizedGamma,RR,RRi) + (regularizedGamma,RRi,CC) (regularizedGamma,RRi,CCi) (regularizedGamma,RRi,RR) (regularizedGamma,RRi,RRi) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/lift-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/lift-doc.m2 index f4e2138b827..42d2161d46c 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/lift-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/lift-doc.m2 @@ -38,6 +38,10 @@ document { (lift,Matrix,CC_*,QQ), (lift,Matrix,CC_*,RR_*), (lift,Matrix,CC_*,ZZ), + (lift,Matrix,CCi_*,CC_*), + (lift,Matrix,CCi_*,QQ), + (lift,Matrix,CCi_*,RR_*), + (lift,Matrix,CCi_*,ZZ), (lift,Matrix,Number), (lift,Matrix,QQ,QQ), (lift,Matrix,QQ,ZZ), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 index 9bc954ff7ae..29fc3d2843e 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/promote-doc.m2 @@ -19,41 +19,54 @@ promote(Vector,type of RingElement) *- undocumented {(promote,CC,CC_*), + (promote,CC,CCi_*), (promote, Matrix, InexactNumber),(promote, Number, InexactNumber), (promote, Ideal, Number), (promote, Ideal, RingElement), (promote, List, QQ, CC_*), + (promote, List, QQ, CCi_*), (promote, List, QQ, QQ), (promote, List, QQ, RR_*), (promote, List, RR_*, CC_*), + (promote, List, RR_*, CCi_*), (promote, List, RR_*, RR_*), (promote, List, CC_*, CC_*), + (promote, List, CC_*, CCi_*), (promote, List, ZZ, CC_*), + (promote, List, ZZ, CCi_*), (promote, List, ZZ, QQ), (promote, List, ZZ, RR_*), (promote, List, ZZ, ZZ), (promote,Matrix,CC_*,CC_*), + (promote,Matrix,CC_*,CCi_*), (promote,Matrix,Number), (promote,Matrix,QQ,CC_*), + (promote,Matrix,QQ,CCi_*), (promote,Matrix,QQ,QQ), (promote,Matrix,QQ,RR_*), (promote,Matrix,RingElement), (promote,Matrix,RR_*,CC_*), + (promote,Matrix,RR_*,CCi_*), (promote,Matrix,RR_*,RR_*), (promote,Matrix,ZZ,CC_*), + (promote,Matrix,ZZ,CCi_*), (promote,Matrix,ZZ,QQ), (promote,Matrix,ZZ,RR_*), (promote,Matrix,ZZ,ZZ), (promote,MonoidElement,RingElement), (promote,QQ,CC_*), + (promote,QQ,CCi_*), (promote,QQ,QQ), (promote, QQ, RingElement), (promote,QQ,RR_*), (promote,RR,CC_*), + (promote,RR,CCi_*), (promote,RR,RR_*), (promote, RRi, RRi_*), + (promote, RRi, CCi_*), (promote, CCi, CCi_*), (promote,ZZ,CC_*), + (promote,ZZ,CCi_*), (promote,ZZ,QQ), (promote,ZZ,RingElement), (promote,ZZ,RR_*), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 index 74226001747..c475fc49445 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 @@ -29,28 +29,41 @@ document { Key => { symbol /, (symbol /, CC, CC), + (symbol /, CC, CCi), (symbol /, CC, QQ), (symbol /, CC, RR), + (symbol /, CC, RRi), (symbol /, CC, ZZ), + (symbol /, CCi, CC), + (symbol /, CCi, CCi), + (symbol /, CCi, QQ), + (symbol /, CCi, RR), + (symbol /, CCi, RRi), + (symbol /, CCi, ZZ), (symbol /, QQ, CC), + (symbol /, QQ, CCi), (symbol /, QQ, QQ), (symbol /, QQ, RR), + (symbol /, QQ, RRi), (symbol /, QQ, ZZ), (symbol /, RR, CC), + (symbol /, RR, CCi), (symbol /, RR, QQ), (symbol /, RR, RR), + (symbol /, RR, RRi), (symbol /, RR, ZZ), (symbol /, ZZ, CC), + (symbol /, ZZ, CCi), (symbol /, ZZ, QQ), (symbol /, ZZ, RR), + (symbol /, ZZ, RRi), (symbol /, ZZ, ZZ), - (symbol /, QQ, RRi), - (symbol /, RR, RRi), + (symbol /, RRi, CC), + (symbol /, RRi, CCi), (symbol /, RRi, QQ), (symbol /, RRi, RR), (symbol /, RRi, RRi), (symbol /, RRi, ZZ), - (symbol /, ZZ, RRi) }, Headline => "a binary operator, usually used for division", Usage => "x / y", diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 index 9f235ecdd72..69811c81e87 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 @@ -26,33 +26,47 @@ document { symbol -, (symbol -, ZZ), (symbol -, ZZ, CC), + (symbol -, ZZ, CCi), (symbol -, ZZ, QQ), (symbol -, ZZ, RR), (symbol -, ZZ, RRi), (symbol -, ZZ, ZZ), (symbol -, QQ), (symbol -, QQ, CC), + (symbol -, QQ, CCi), (symbol -, QQ, QQ), (symbol -, QQ, RR), (symbol -, QQ, RRi), (symbol -, QQ, ZZ), (symbol -, RR), (symbol -, RR, CC), + (symbol -, RR, CCi), (symbol -, RR, QQ), (symbol -, RR, RR), (symbol -, RR, RRi), (symbol -, RR, ZZ), (symbol -, RRi), + (symbol -, RRi, CC), + (symbol -, RRi, CCi), (symbol -, RRi, QQ), (symbol -, RRi, RR), (symbol -, RRi, RRi), (symbol -, RRi, ZZ), (symbol -, CC), (symbol -, CC, CC), + (symbol -, CC, CCi), (symbol -, CC, InfiniteNumber), (symbol -, CC, QQ), (symbol -, CC, RR), + (symbol -, CC, RRi), (symbol -, CC, ZZ), + (symbol -, CCi), + (symbol -, CCi, CC), + (symbol -, CCi, CCi), + (symbol -, CCi, QQ), + (symbol -, CCi, RR), + (symbol -, CCi, RRi), + (symbol -, CCi, ZZ), (symbol -, Constant), (symbol -, Constant, Constant), (symbol -, Constant, InexactNumber), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 index 388c18536d3..b8e38cda3ad 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 @@ -17,33 +17,47 @@ document { symbol +, (symbol +, ZZ), (symbol +, ZZ, CC), + (symbol +, ZZ, CCi), (symbol +, ZZ, QQ), (symbol +, ZZ, RR), (symbol +, ZZ, RRi), (symbol +, ZZ, ZZ), (symbol +, QQ), (symbol +, QQ, CC), + (symbol +, QQ, CCi), (symbol +, QQ, QQ), (symbol +, QQ, RR), (symbol +, QQ, RRi), (symbol +, QQ, ZZ), (symbol +, RR), (symbol +, RR, CC), + (symbol +, RR, CCi), (symbol +, RR, QQ), (symbol +, RR, RR), (symbol +, RR, RRi), (symbol +, RR, ZZ), (symbol +, RRi), + (symbol +, RRi, CC), + (symbol +, RRi, CCi), (symbol +, RRi, QQ), (symbol +, RRi, RR), (symbol +, RRi, RRi), (symbol +, RRi, ZZ), (symbol +, CC), (symbol +, CC, CC), + (symbol +, CC, CCi), (symbol +, CC, InfiniteNumber), (symbol +, CC, QQ), (symbol +, CC, RR), + (symbol +, CC, RRi), (symbol +, CC, ZZ), + (symbol +, CCi), + (symbol +, CCi, CC), + (symbol +, CCi, CCi), + (symbol +, CCi, QQ), + (symbol +, CCi, RR), + (symbol +, CCi, RRi), + (symbol +, CCi, ZZ), (symbol +, Constant), (symbol +, Constant, Constant), (symbol +, Constant, InexactNumber), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 index a5a53a400a2..f7f78f16074 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 @@ -56,23 +56,36 @@ document { (symbol *, Number,Constant), (symbol *, Number,Matrix), (symbol *, QQ,CC), + (symbol *, QQ,CCi), (symbol *, QQ,QQ), (symbol *, QQ,RR), (symbol *, QQ,ZZ), (symbol *, RR,CC), + (symbol *, RR,CCi), (symbol *, RR,QQ), (symbol *, RR,RR), (symbol *, RR,ZZ), (symbol *, ZZ,CC), + (symbol *, ZZ,CCi), (symbol *, ZZ,QQ), (symbol *, ZZ,RR), (symbol *, ZZ,ZZ), (symbol *, CC,CC), + (symbol *, CC,CCi), (symbol *, CC,QQ), (symbol *, CC,RR), + (symbol *, CC,RRi), (symbol *, CC,ZZ), + (symbol *, CCi, CC), + (symbol *, CCi, CCi), + (symbol *, CCi, QQ), + (symbol *, CCi, RR), + (symbol *, CCi, RRi), + (symbol *, CCi, ZZ), (symbol *, QQ, RRi), (symbol *, RR, RRi), + (symbol *, RRi, CC), + (symbol *, RRi, CCi), (symbol *, RRi, QQ), (symbol *, RRi, RR), (symbol *, RRi, RRi), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 index caa6481586b..fc48c69e4b6 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 @@ -423,13 +423,18 @@ document { Key => { (agm,CC,CC), (agm,CC,CCi), (agm,CC,RR), + (agm,CC,RRi), (agm,CCi,CC), (agm,CCi,CCi), (agm,CCi,RR), (agm,CCi,RRi), (agm,RR,CC), (agm,RR,CCi), - (agm,RRi,CCi)}, + (agm,RR,RRi), + (agm,RRi,CC), + (agm,RRi,CCi), + (agm,RRi,RR), + (agm,RRi,RRi)}, Usage => "agm(x,y)", Inputs => { "x" => "a number", "y" => "a number" }, Outputs => { {"the arithmetic-geometric mean of ", TT "x", " and ", TT "y"}}, From 3c41263513b0fb39372a8e04e2012531280de00e Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 11 Nov 2025 18:04:03 -0500 Subject: [PATCH 144/691] Add comparison of CCi's --- M2/Macaulay2/m2/intervals.m2 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index f3f8cf18781..46eb07f80ec 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -103,6 +103,19 @@ intersect(CCi, CCi) := CCi => { Precision => -1 } >> opts -> (N, M) -> ( if opts.Precision < 0 then interval(intersectRRi(realPart N,realPart M), intersectRRi(imaginaryPart N, imaginaryPart M)) else interval(intersectRRi(opts.Precision,realPart N, realPart M), intersectRRi(opts.Precision, imaginaryPart N, imaginaryPart M))) +CCi ? CCi := (x, y) -> ( + if (r := realPart x ? realPart y) =!= symbol == then r + else imaginaryPart x ? imaginaryPart y) +CCi ? Number := (x, y) -> x ? toCCi numeric y +Number ? CCi := (x, y) -> toCCi numeric x ? y + +-- need to define these or we get "comparison not implemented" from the +-- interpeter +ZZ ? CCi := +QQ ? CCi := +RR ? CCi := +RRi ? CCi := +CC ? CCi := (x, y) -> toCCi x ? y isEmpty RRi := Boolean => isEmptyRRi isEmpty CCi := x -> isEmptyRRi realPart x or isEmptyRRi imaginaryPart x From 5eb4f3279a081bc3d8d04b36071e9dd7e50d6ac5 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 12 Nov 2025 13:53:20 -0500 Subject: [PATCH 145/691] Fixed empty interval --- M2/Macaulay2/d/gmp1.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 3bde03e0a5f..7b747375cec 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -188,7 +188,7 @@ export tostringRRiforCCi(x:RRi):string := concatenate( export tostringCCi(x:CCi):string := ( if isZero(x.im) then tostringRRi(x.re) - else if isZero(x.re) then concatenate(array(string)(tostringRRiforCCi(x.im),"*ii", " (an empty interval)")) + else if isZero(x.re) then concatenate(array(string)(tostringRRiforCCi(x.im),"*ii")) else if isEmpty(x) then concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii", " (an empty interval)")) else concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii")) ); From e23a541708bc35de514c4d717d530f0eb03d51e2 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 12 Nov 2025 14:04:21 -0500 Subject: [PATCH 146/691] Use CCi in log(RRi) when input is negative --- M2/Macaulay2/d/actors3.d | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 85fc1bacea3..f8139c36d77 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -1403,8 +1403,9 @@ log(e:Expr):Expr := ( is x:CCcell do toExpr(log(x.v)) -- # typical value: log, CC, CC is x:CCicell do toExpr(log(x.v)) -- # typical value: log, CCi, CCi is x:RRcell do if isNegative(x.v) then toExpr(logc(x.v)) else toExpr(log(x.v)) -- # typical value: log, RR, RR - is x:RRicell do if x.v >= 0 then toExpr(log(x.v)) -- # typical value: log, RRi, RRi - else buildErrorPacket("Not defined") + is x:RRicell do ( + if x.v >= 0 then toExpr(log(x.v)) -- # typical value: log, RRi, RRi + else toExpr(log(toCCi(x.v)))) else WrongArgRRorCC() ); setupfun("log",log).Protected=false; From 35eecb91ae334236183e4eb5f9c2b13f0053fc6c Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 12 Nov 2025 14:46:26 -0500 Subject: [PATCH 147/691] Allow logs with negative bases --- M2/Macaulay2/d/actors3.d | 25 +++++++++++++------ .../packages/Macaulay2Doc/operators.m2 | 8 ++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index f8139c36d77..8e54cfe5706 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -1380,8 +1380,7 @@ log(e:Expr):Expr := ( ) is x:RRicell do ( -- # typical value: log, RR, RRi, RRi if b.v>0 && x.v>=0 then toExpr(log(toRRi(b.v,precision(b.v)),x.v)) - else - buildErrorPacket("Not defined") + else toExpr(log(toCCi(b.v), toCCi(x.v))) ) else WrongArgRRorCC(1)) is b:RRicell do ( @@ -1390,16 +1389,28 @@ log(e:Expr):Expr := ( is x:CCicell do toExpr(log(toCCi(b.v), x.v)) -- # typical value: log, RRi, CCi, CCi is x:RRcell do ( -- # typical value: log, RRi, RR, RRi if b.v>0 && x.v>=0 then toExpr(log(b.v,toRRi(x.v,precision(x.v)))) - else - buildErrorPacket("Not defined") + else toExpr(log(toCCi(b.v), toCCi(x.v))) ) is x:RRicell do ( -- # typical value: log, RRi, RRi, RRi if b.v>0 && x.v>=0 then toExpr(log(b.v,x.v)) - else - buildErrorPacket("Not defined") + else toExpr(log(toCCi(b.v), toCCi(x.v))) ) else WrongArgRRorRRi(2)) - else WrongArgRRorRRi(1)) + is b:CCcell do ( + when a.1 + is x:CCcell do toExpr(log(b.v, x.v)) -- # typical value: log, CC, CC, CC + is x:CCicell do toExpr(log(toCCi(b.v), x.v)) -- # typical value: log, CC, CCi, CCi + is x:RRcell do toExpr(log(b.v, x.v)) -- # typical value: log, CC, RR, CC + is x:RRicell do toExpr(log(toCCi(b.v), toCCi(x.v))) -- # typical value: log, CC, RRi, CCi + else WrongArgRRorCC(2)) + is b:CCicell do ( + when a.1 + is x:CCcell do toExpr(log(b.v, toCCi(x.v))) -- # typical value: log, CCi, CC, CCi + is x:CCicell do toExpr(log(b.v, x.v)) -- # typical value: log, CCi, CCi, CCi + is x:RRcell do toExpr(log(b.v, toCCi(x.v))) -- # typical value: log, CCi, RR, CCi + is x:RRicell do toExpr(log(b.v, toCCi(x.v))) -- # typical value: log, CCi, RRi, CCi + else WrongArgRRorCC(2)) + else WrongArgRRorCC(1)) is x:CCcell do toExpr(log(x.v)) -- # typical value: log, CC, CC is x:CCicell do toExpr(log(x.v)) -- # typical value: log, CCi, CCi is x:RRcell do if isNegative(x.v) then toExpr(logc(x.v)) else toExpr(log(x.v)) -- # typical value: log, RR, RR diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 index 9aa21e67955..04cda9a181b 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 @@ -85,7 +85,15 @@ document { log, (log, RR), (log,CC), + (log,CC,CC), + (log,CC,CCi), + (log,CC,RR), + (log,CC,RRi), (log,CCi), + (log,CCi,CC), + (log,CCi,CCi), + (log,CCi,RR), + (log,CCi,RRi), (log,RR,CCi), (log,RR,RR), (log,RR,RRi), From 78a7cc81778f996d3a69e2806d03ceb087da8824 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 12 Nov 2025 16:10:58 -0500 Subject: [PATCH 148/691] Add support for acos/asin for RRi's outside [-1, 1] --- M2/Macaulay2/d/actors3.d | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 8e54cfe5706..f35f726b812 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -780,7 +780,7 @@ acos(e:Expr):Expr := ( is x:RRicell do ( if x.v <= 1 && x.v >= -1 then toExpr(acos(x.v)) -- # typical value: acos, RRi, RRi - else buildErrorPacket("Must be between -1 and 1") + else toExpr(acos(toCCi(x.v))) ) else WrongArgRRorCC() ); @@ -851,7 +851,7 @@ asin(e:Expr):Expr := ( is x:RRicell do ( if x.v <= 1 && x.v >= -1 then toExpr(asin(x.v)) -- # typical value: asin, RRi, RRi - else buildErrorPacket("Must be between -1 and 1") + else toExpr(asin(toCCi(x.v))) ) else WrongArgRRorCC() ); From c4abc0cb50b709274639d7b438db0f0387224cf8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 12 Nov 2025 16:11:25 -0500 Subject: [PATCH 149/691] Add some RRi/CCi unit tests --- M2/Macaulay2/tests/normal/numbers.m2 | 42 ++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/M2/Macaulay2/tests/normal/numbers.m2 b/M2/Macaulay2/tests/normal/numbers.m2 index 0a12f00ca48..0e25de58e27 100644 --- a/M2/Macaulay2/tests/normal/numbers.m2 +++ b/M2/Macaulay2/tests/normal/numbers.m2 @@ -68,6 +68,7 @@ assert ch( +ii*.73249827349273948274398273498273p100e0) assert ch( +ii*.92837938475938759387539847539847p100e0) assert ch( -ii*.73249827349273948274398273498273p100e0) assert ch( -ii*.92837938475938759387539847539847p100e0) +assert ch toCCi(2, 3) assert( 1. === 1. ) assert( 1. =!= .1 ) @@ -280,6 +281,8 @@ assert( isReal (1/1) ) assert( isReal pi ) assert( not isReal ii ) assert( not isReal infinity ) +assert isReal toCCi(1, 0) +assert not isReal toCCi(0, 1) assert( instance(log(3.), RR) ) assert( instance(log(3/1), RR) ) @@ -287,6 +290,8 @@ assert( instance(log(3), RR) ) assert( instance(log(-3.), CC) ) assert( instance(log(-3/1), CC) ) assert( instance(log(-3), CC) ) +assert( instance(log toRRi(-3), CCi) ) +assert( instance(log toCCi(-3), CCi) ) assert( instance(log(3.,2), RR) ) assert( instance(log(3/1,2), RR) ) @@ -294,6 +299,8 @@ assert( instance(log(3,2), RR) ) assert( instance(log(-3.,2), CC) ) assert( instance(log(-3/1,2), CC) ) assert( instance(log(-3,2), CC) ) +assert( instance(log(-3, toRRi 2), CCi) ) +assert( instance(log(-3, toCCi 2), CCi) ) assert( instance(log(3.,-2), CC) ) assert( instance(log(3/1,-2), CC) ) @@ -301,6 +308,8 @@ assert( instance(log(3,-2), CC) ) assert( instance(log(-3.,-2), CC) ) assert( instance(log(-3/1,-2), CC) ) assert( instance(log(-3,-2), CC) ) +assert( instance(log(-3, toRRi(-2)), CCi) ) +assert( instance(log(-3, toCCii(-2)), CCi) ) assert( instance(log(3.,2.), RR) ) assert( instance(log(3/1,2.), RR) ) @@ -308,6 +317,8 @@ assert( instance(log(3,2.), RR) ) assert( instance(log(-3.,2.), CC) ) assert( instance(log(-3/1,2.), CC) ) assert( instance(log(-3,2.), CC) ) +assert( instance(log(toRRi(-3), 2.), CCi) ) +assert( instance(log(toCCi(-3), 2.), CCi) ) assert( instance(log(3.,-2.), CC) ) assert( instance(log(3/1,-2.), CC) ) @@ -315,6 +326,8 @@ assert( instance(log(3,-2.), CC) ) assert( instance(log(-3.,-2.), CC) ) assert( instance(log(-3/1,-2.), CC) ) assert( instance(log(-3,-2.), CC) ) +assert( instance(log(toRRi(-3), -2.), CCi) ) +assert( instance(log(toCCi(-3), -2.), CCi) ) assert( instance(log(3.,2/1), RR) ) assert( instance(log(3/1,2/1), RR) ) @@ -322,6 +335,8 @@ assert( instance(log(3,2/1), RR) ) assert( instance(log(-3.,2/1), CC) ) assert( instance(log(-3/1,2/1), CC) ) assert( instance(log(-3,2/1), CC) ) +assert( instance(log(toRRi(-3), 2/1), CCi) ) +assert( instance(log(toCCi(-3), 2/1), CCi) ) assert( instance(log(3.,-2/1), CC) ) assert( instance(log(3/1,-2/1), CC) ) @@ -329,16 +344,16 @@ assert( instance(log(3,-2/1), CC) ) assert( instance(log(-3.,-2/1), CC) ) assert( instance(log(-3/1,-2/1), CC) ) assert( instance(log(-3,-2/1), CC) ) +assert( instance(log(toRRi(-3), -2/1), CCi) ) +assert( instance(log(toCCi(-3), -2/1), CCi) ) -scan(((3.), (3/1), (3), (-3.), (-3/1), (-3)), x -> assert( abs(exp(log(x)) - x) < 1e-10) ) -scan(( -(3.,2), (3/1,2), (3,2), (-3.,2), -(-3/1,2), (-3,2), (3.,-2), (3/1,-2), (3,-2), (-3.,-2), (-3/1,-2), (-3,-2), -(3.,2.), (3/1,2.), (3,2.), (-3.,2.), (-3/1,2.), (-3,2.), (3.,-2.), (3/1,-2.), -(3,-2.), (-3.,-2.), (-3/1,-2.), (-3,-2.), (3.,2/1), (3/1,2/1), (3,2/1), -(-3.,2/1), (-3/1,2/1), (-3,2/1), (3.,-2/1), (3/1,-2/1), (3,-2/1), (-3.,-2/1), -(-3/1,-2/1), (-3,-2/1) -), (b,x) -> assert(abs(log(b,x)-log x/log b)<1e-10)) +scan(((3.), (3/1), (3), (-3.), (-3/1), (-3), toRRi 3, toCCi 3, toRRi(-3), + toCCi(-3)), x -> assert( abs(exp(log(x)) - x) < 1e-10) ) +funcs = {identity, x -> x/1, toRR, toCC, toRRi, toCCi} +scan(apply(funcs ** funcs, (f, g) -> (f 3, f 2)), + (b, x) -> assert(abs(log(b,x) - log x/log b) < 1e-10)) +scan(apply(funcs ** funcs, (f, g) -> (f 3, f(-2))), + (b, x) -> assert(abs(log(b,x) - log x/log b) < 1e-10)) assert( format_10 .00044448888 === ".00044448888" ) assert( format_9 .00044448888 === ".00044448888" ) @@ -438,7 +453,7 @@ toExternalString (0 *(1-ii)) toExternalString (0.*(1-ii)) assert( 0*(1-ii) === 0.*(1-ii) ) -epsilon = 10 * 2.^-defaultPrecision +epsilon = 1e-14 small = z -> abs z < epsilon see = z -> (<< "see: " << z << endl; z) scan( {exp,log,sin,cos,sinh,cosh,tanh,coth,asin,acos,asinh,acosh,atan,acot,cot,tan,csc,sec}, @@ -449,7 +464,8 @@ scan( {exp,log,sin,cos,sinh,cosh,tanh,coth,asin,acos,asinh,acosh,atan,acot,cot,t ) ) -scan({.2, 1.2, .2 + .3*ii, 1.2 - .13*ii}, z -> ( +scan({.2, 1.2, .2 + .3*ii, 1.2 - .13*ii, toRRi .2, toRRi 1.2, + toCCi(.2, .3), toCCi(1.2, .13)}, z -> ( assert small(z - acosh cosh z); assert small(z - acos cos z); assert small(z - asinh sinh z); @@ -463,11 +479,15 @@ assert( class asin .3 === RR ) assert( class asin 1.3 === CC ) assert( class acos .3 === RR ) assert( class acos 1.3 === CC ) +assert( class acos toRRi .3 === RRi ) +assert( class acos toRRi 1.3 === CCi ) assert( class acot .3 === RR ) assert( class acot 1.3 === RR ) assert( class acot (-.3) === RR ) assert( class acot (-1.3) === RR ) +assert( class acos toRRi(-.3) === RRi ) +assert( class acos toRRi(-1.3) === CCi ) assert( class asinh .3 === RR ) assert( class asinh 1.3 === RR ) From 24c712126591c126a9cffa1690983b4f7482ee12 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 12 Nov 2025 16:20:12 -0500 Subject: [PATCH 150/691] Another tostringCCi update (fix empty intervals w/ zero real part) --- M2/Macaulay2/d/gmp1.d | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/gmp1.d b/M2/Macaulay2/d/gmp1.d index 7b747375cec..188ae5b85ab 100644 --- a/M2/Macaulay2/d/gmp1.d +++ b/M2/Macaulay2/d/gmp1.d @@ -187,10 +187,14 @@ export tostringRRiforCCi(x:RRi):string := concatenate( --tostringRRiforCCipointer = tostringRRiforCCi; export tostringCCi(x:CCi):string := ( - if isZero(x.im) then tostringRRi(x.re) - else if isZero(x.re) then concatenate(array(string)(tostringRRiforCCi(x.im),"*ii")) - else if isEmpty(x) then concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii", " (an empty interval)")) - else concatenate(array(string)(tostringRRiforCCi(x.re),"+",tostringRRiforCCi(x.im),"*ii")) + re := tostringRRiforCCi(x.re); + im := tostringRRiforCCi(x.im) + "*ii"; + r := ( + if isZero(x.im) then re + else if isZero(x.re) then im + else re + "+" + im); + if isEmpty(x) then r = r + " (an empty interval)"; + r ); tostringCCipointer = tostringCCi; From dfbd71f1dac995244ffe6da13b65aba2c31e43d4 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sun, 16 Nov 2025 15:33:06 -0500 Subject: [PATCH 151/691] Document "Citation" option to "document" --- .../Macaulay2Doc/functions/document-doc.m2 | 23 +++++++++++++++++++ M2/Macaulay2/packages/PackageCitations.m2 | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/document-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/document-doc.m2 index b6a5887b01e..47055cf4e97 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/document-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/document-doc.m2 @@ -33,6 +33,7 @@ Node Subnodes=>List SourceCode=>List ExampleFiles=>List + Citation=>List Consequences Item formatted documentation is created and stored in the @TO2 {"currentPackage", "current package"}@ @@ -118,6 +119,7 @@ Node [document, Subnodes] [document, SourceCode] [document, ExampleFiles] + [document, Citation] Node Key @@ -459,6 +461,27 @@ Node [newPackage, AuxiliaryFiles] /// +doc /// +Node + Key + Citation + [document, Citation] + Headline + package citation information + Description + Text + This option gives the BibTeX code to be used to cite the package being + documented. Note this is only used in the main documentation node for + the package and is ignored otherwise. + Code + EXAMPLE { PRE ////Citation => {//////@misc{mypkg, + author = "John Doe", + title = "My Macaulay2 package", + year = "2025" }//////}//// } + SeeAlso + "PackageCitations::cite" +/// + doc /// Node Key diff --git a/M2/Macaulay2/packages/PackageCitations.m2 b/M2/Macaulay2/packages/PackageCitations.m2 index e1d2d73d233..470c5d32c64 100644 --- a/M2/Macaulay2/packages/PackageCitations.m2 +++ b/M2/Macaulay2/packages/PackageCitations.m2 @@ -310,6 +310,10 @@ doc /// user is urged to check for correct spelling and grammar. Example cite "Bruns" + Text + To override the automatically generated citation, package authors + may provide a @TO "Macaulay2Doc::Citation"@ entry in the main + documentation node for a package. SeeAlso PackageCitations /// From 9af53bc7b2488b0b95a6bfe3bc9fc9083b42223d Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sun, 16 Nov 2025 19:35:23 -0500 Subject: [PATCH 152/691] Use macos-15 for GitHub builds --- .github/workflows/test_build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_build.yml b/.github/workflows/test_build.yml index a370a0b80a6..e94f4fde5b4 100644 --- a/.github/workflows/test_build.yml +++ b/.github/workflows/test_build.yml @@ -39,17 +39,17 @@ jobs: - cmake os: - ubuntu-24.04 - - macos-14 + - macos-15 compiler: - default include: # This build tests Clang rather than AppleClang (keep) - build-system: cmake - os: macos-14 + os: macos-15 compiler: brew-clang exclude: - build-system: cmake - os: macos-14 + os: macos-15 compiler: default steps: - uses: actions/checkout@v5 From 2512a6b9a98420f9ff97de005bf3dccfce880371 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 17 Nov 2025 16:45:02 -0500 Subject: [PATCH 153/691] Update cached NumericalSchubertCalculus::setVerboseLevel example The hash has changed since we added "-* no-capture-flag *-", so it's always updated. [ci skip] --- .../examples/_set__Verbose__Level.out | 100 +++++++++--------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/M2/Macaulay2/packages/NumericalSchubertCalculus/examples/_set__Verbose__Level.out b/M2/Macaulay2/packages/NumericalSchubertCalculus/examples/_set__Verbose__Level.out index 8a20f5ae9eb..afb0b89c5c5 100644 --- a/M2/Macaulay2/packages/NumericalSchubertCalculus/examples/_set__Verbose__Level.out +++ b/M2/Macaulay2/packages/NumericalSchubertCalculus/examples/_set__Verbose__Level.out @@ -1,4 +1,4 @@ --- -*- M2-comint -*- hash: 317641762447771653 +-- -*- M2-comint -*- hash: 11766660079572042236 i1 : SchPblm = randomSchubertProblemInstance ({{1},{1},{1},{1}},2,4) @@ -52,88 +52,88 @@ o3 : List i4 : assert all(S,s->checkIncidenceSolution(s,SchPblm)) -i5 : setVerboseLevel 1; +i5 : setVerboseLevel 1; i6 : S = solveSchubertProblem(SchPblm,2,4) -- playCheckers --- cpu time = .0154201 +-- cpu time = .0109853 -- making a recursive call to resolveNode -- playCheckers --- cpu time = .0120184 +-- cpu time = .00400091 -- making a recursive call to resolveNode -- playCheckers --- cpu time = 0 +-- cpu time = .00100066 resolveNode reached node of no remaining conditions --- time to make equations: .163919 +-- time to make equations: .00499959 Setup time: 0 Computing time:0 - -- trackHomotopy time = .0126281 sec. for [{0, 1, 2, 3}, {0, infinity, 2, infinity}] --- time of performing one checker move: .188607 --- time of performing one checker move: .00292733 --- time of performing one checker move: .00401444 --- time to make equations: .0116789 + -- trackHomotopy time = .00570243 sec. for [{0, 1, 2, 3}, {0, infinity, 2, infinity}] +-- time of performing one checker move: .0159995 +-- time of performing one checker move: .000999811 +-- time of performing one checker move: .000999681 +-- time to make equations: .00499988 Setup time: 0 Computing time:0 - -- trackHomotopy time = .0396773 sec. for [{1, 2, 3, 0}, {1, infinity, infinity, 2}] --- time of performing one checker move: .0387082 --- time to make equations: .0112116 + -- trackHomotopy time = .0295184 sec. for [{1, 2, 3, 0}, {1, infinity, infinity, 2}] +-- time of performing one checker move: .196997 +-- time to make equations: .00500053 Setup time: 0 Computing time:0 - -- trackHomotopy time = .0147794 sec. for [{1, 3, 2, 0}, {1, infinity, infinity, 2}] --- time of performing one checker move: .177902 --- time to make equations: .0158854 + -- trackHomotopy time = .00602776 sec. for [{1, 3, 2, 0}, {1, infinity, infinity, 2}] +-- time of performing one checker move: .0160007 +-- time to make equations: .00600012 Setup time: 0 Computing time:0 - -- trackHomotopy time = .015358 sec. for [{2, 3, 1, 0}, {2, infinity, infinity, 1}] --- time of performing one checker move: .0397252 --- time to make equations: .0278454 + -- trackHomotopy time = .00595454 sec. for [{2, 3, 1, 0}, {2, infinity, infinity, 1}] +-- time of performing one checker move: .0159997 +-- time to make equations: .170913 Setup time: 0 Computing time:0 - -- trackHomotopy time = .0173996 sec. for [{0, 1, 2, 3}, {infinity, 1, 2, infinity}] --- time of performing one checker move: .194614 --- time to make equations: .0254151 + -- trackHomotopy time = .00692619 sec. for [{0, 1, 2, 3}, {infinity, 1, 2, infinity}] +-- time of performing one checker move: .183914 +-- time to make equations: .0119998 Setup time: 0 Computing time:0 - -- trackHomotopy time = .100483 sec. for [{0, 1, 3, 2}, {infinity, 1, infinity, 2}] --- time of performing one checker move: .203755 --- time of performing one checker move: .00400148 --- time of performing one checker move: .00393395 --- time to make equations: .0239996 + -- trackHomotopy time = .00723693 sec. for [{0, 1, 3, 2}, {infinity, 1, infinity, 2}] +-- time of performing one checker move: .182283 +-- time of performing one checker move: .00099989 +-- time of performing one checker move: .000999771 +-- time to make equations: .0109995 Setup time: 0 Computing time:0 - -- trackHomotopy time = .0188128 sec. for [{1, 3, 2, 0}, {infinity, 3, infinity, 1}] --- time of performing one checker move: .0558564 + -- trackHomotopy time = .00692467 sec. for [{1, 3, 2, 0}, {infinity, 3, infinity, 1}] +-- time of performing one checker move: .0230001 -- making a recursive call to resolveNode -- playCheckers --- cpu time = .0079901 +-- cpu time = .00498282 -- making a recursive call to resolveNode -- playCheckers --- cpu time = 0 +-- cpu time = .000999721 resolveNode reached node of no remaining conditions --- time to make equations: .0118377 +-- time to make equations: .167022 Setup time: 0 Computing time:0 - -- trackHomotopy time = .0176744 sec. for [{0, 1, 2, 3}, {0, infinity, 2, infinity}] --- time of performing one checker move: .0408146 --- time of performing one checker move: .142637 --- time to make equations: .0120001 + -- trackHomotopy time = .00594482 sec. for [{0, 1, 2, 3}, {0, infinity, 2, infinity}] +-- time of performing one checker move: .178023 +-- time of performing one checker move: .000999351 +-- time to make equations: .00499974 Setup time: 0 Computing time:0 - -- trackHomotopy time = .0144319 sec. for [{0, 2, 3, 1}, {0, infinity, infinity, 2}] --- time of performing one checker move: .0357794 --- time of performing one checker move: .00400301 --- time of performing one checker move: 0 --- time of performing one checker move: 0 --- time of performing one checker move: .00470073 --- time of performing one checker move: .0031443 --- time of performing one checker move: .00400018 --- time of performing one checker move: .158215 --- time to make equations: .0237389 + -- trackHomotopy time = .00596614 sec. for [{0, 2, 3, 1}, {0, infinity, infinity, 2}] +-- time of performing one checker move: .0160006 +-- time of performing one checker move: .00199911 +-- time of performing one checker move: .00100014 +-- time of performing one checker move: .0010001 +-- time of performing one checker move: .00200083 +-- time of performing one checker move: .000999761 +-- time of performing one checker move: .155392 +-- time of performing one checker move: .00200002 +-- time to make equations: .0109989 Setup time: 0 Computing time:0 - -- trackHomotopy time = .024264 sec. for [{1, 3, 2, 0}, {1, infinity, infinity, 3}] --- time of performing one checker move: .0592573 --- time of performing one checker move: .00625287 + -- trackHomotopy time = .00714963 sec. for [{1, 3, 2, 0}, {1, infinity, infinity, 3}] +-- time of performing one checker move: .0239992 +-- time of performing one checker move: .00300012 o6 = {| -1.65573-.600637ii .0201935+.0437095ii |, | -.154703+.175591ii | -1.23037-1.66989ii -.0308057-.00120618ii | | -.801221-.0354303ii From ce9e7f7b93fca5abfe1be224d0b5c67827fe7173 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 24 Nov 2025 06:03:32 -0500 Subject: [PATCH 154/691] Add promoters for CC -> CCi --- M2/Macaulay2/e/aring-glue.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/M2/Macaulay2/e/aring-glue.hpp b/M2/Macaulay2/e/aring-glue.hpp index a46af0c5811..f0704496aff 100644 --- a/M2/Macaulay2/e/aring-glue.hpp +++ b/M2/Macaulay2/e/aring-glue.hpp @@ -709,6 +709,8 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_CCC: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } @@ -719,6 +721,8 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_CC: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } From a0fa2f5070201d5883dcaaaaa29c236ebda7442e Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 24 Nov 2025 07:58:28 -0500 Subject: [PATCH 155/691] Make InexactNumber' inherit from Number InexactNumber (w/o the apostrophe) already does. This also simplifies promotion for inexact numbers, as when the ring has Number as an ancestor, then we promote directly in the engine rather than promoting chain-wise through each of the base rings. --- M2/Macaulay2/m2/reals.m2 | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index d4fd212e6a9..9edc9e9c00f 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -39,12 +39,11 @@ RRi.InexactField = RealIntervalField = new Type of InexactField ; RealInter CC.InexactField = ComplexField = new Type of InexactField; ComplexField.synonym = "complex field" CCi.InexactField = ComplexIntervalField = new Type of InexactField; ComplexIntervalField.synonym = "complex interval field" -Nothing' = Nothing -- maybe we'll want to rename it later... RingFamily_* := RR -> RR#(symbol _*) RingFamily_* := RRi -> RRi#(symbol _*) RingFamily_* = (RR,e) -> RR#(symbol _*) = e RingFamily_* = (RRi,e) -> RRi#(symbol _*) = e -InexactNumber' = new Type of Nothing' +InexactNumber' = new Type of Number RR_* = RR' = new Type of InexactNumber' RRi_* = RRi' = new Type of InexactNumber' CC_* = CC' = new Type of InexactNumber' @@ -70,8 +69,8 @@ RR'.back = RR RRi'.back = RRi CC'.back = CC CCi'.back = CCi -new RealField of Nothing' from ZZ := memoize ( - (RealField,Nothing',prec) -> newClass(RealField,Nothing', +new RealField of Number from ZZ := memoize ( + (RealField,Number,prec) -> newClass(RealField,Number, hashTable { symbol precision => prec, symbol Engine => true, @@ -79,8 +78,8 @@ new RealField of Nothing' from ZZ := memoize ( symbol isBasic => true, symbol RawRing => rawRR prec })) -new ComplexField of Nothing' from ZZ := memoize( - (ComplexField,Nothing',prec) -> newClass(ComplexField,Nothing', +new ComplexField of Number from ZZ := memoize( + (ComplexField,Number,prec) -> newClass(ComplexField,Number, hashTable { symbol precision => prec, symbol Engine => true, @@ -88,8 +87,8 @@ new ComplexField of Nothing' from ZZ := memoize( symbol baseRings => {ZZ,QQ,RR_prec}, symbol RawRing => rawCC prec })) -new RealIntervalField of Nothing' from ZZ := memoize ( - (RealIntervalField,Nothing',prec) -> newClass(RealIntervalField,Nothing', +new RealIntervalField of Number from ZZ := memoize ( + (RealIntervalField,Number,prec) -> newClass(RealIntervalField,Number, hashTable { symbol precision => prec, symbol Engine => true, @@ -97,8 +96,8 @@ new RealIntervalField of Nothing' from ZZ := memoize ( symbol isBasic => true, symbol RawRing => rawRRi prec })) -new ComplexIntervalField of Nothing' from ZZ := memoize ( - (ComplexIntervalField,Nothing',prec) -> newClass(ComplexIntervalField,Nothing', +new ComplexIntervalField of Number from ZZ := memoize ( + (ComplexIntervalField,Number,prec) -> newClass(ComplexIntervalField,Number, hashTable { symbol precision => prec, symbol Engine => true, From 16940311f3002d0039b056d03cb7243486a25658 Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Mon, 24 Nov 2025 15:03:25 +0000 Subject: [PATCH 156/691] allow for rational coordinates when writing data --- M2/Macaulay2/packages/Normaliz.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/Normaliz.m2 b/M2/Macaulay2/packages/Normaliz.m2 index 5a2b35502f7..540e9f044f4 100644 --- a/M2/Macaulay2/packages/Normaliz.m2 +++ b/M2/Macaulay2/packages/Normaliz.m2 @@ -212,7 +212,7 @@ doWriteNmzData List := matrices -> ( for i from 0 to numRows sgr - 1 do ( s := ""; for j from 0 to numColumns sgr - 1 - do s = s | sgr_(i,j) | " "; + do s = s | toString(sgr_(i,j)) | " "; outf << s << endl; ); -- Until version 3.9.4, input type normal_toric_ideal was called lattice_ideal From 10295cc741bd7fa1fc9caba2c6652d6885419f96 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 24 Nov 2025 10:32:33 -0500 Subject: [PATCH 157/691] Fixed isMember and added a few promotes --- M2/Macaulay2/e/aring-CCi.hpp | 12 ++++++------ M2/Macaulay2/e/aring-glue.hpp | 17 ++++++----------- M2/Macaulay2/e/aring-translate.hpp | 10 ++++++++++ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/M2/Macaulay2/e/aring-CCi.hpp b/M2/Macaulay2/e/aring-CCi.hpp index 4ead5b87721..f3f76ce1cc7 100644 --- a/M2/Macaulay2/e/aring-CCi.hpp +++ b/M2/Macaulay2/e/aring-CCi.hpp @@ -76,12 +76,12 @@ class ARingCCi : public SimpleARing bool is_empty(const ElementType &f) const { return mpfi_is_empty(&f.re)>0 || mpfi_is_empty(&f.im)>0; } bool is_member(const ARingCCC::ElementType &a, const ElementType &f) const { return mpfi_cmp_fr(&f.re,&a.re) == 0 && mpfi_cmp_fr(&f.im,&a.im) == 0; } - bool is_member(const ARingRRi::ElementType &a, const ElementType &f) const { return mpfi_cmp(&f.re,&a) == 0; } - bool is_member(const ARingRRR::ElementType &a, const ElementType &f) const { return mpfi_cmp_fr(&f.re,&a) == 0; } - bool is_member(mpq_srcptr a, const ElementType &f) const { return mpfi_cmp_q(&f.re,a) == 0; } - bool is_member(mpz_srcptr a, const ElementType &f) const { return mpfi_cmp_z(&f.re,a) == 0; } - bool is_member(long a, const ElementType &f) const { return mpfi_cmp_si(&f.re,a) == 0; } - bool is_member(double a, const ElementType &f) const { return mpfi_cmp_d(&f.re,a) == 0; } + bool is_member(const ARingRRi::ElementType &a, const ElementType &f) const { return mpfi_cmp(&f.re,&a) == 0 && mpfi_cmp_si(&f.im,0); } + bool is_member(const ARingRRR::ElementType &a, const ElementType &f) const { return mpfi_cmp_fr(&f.re,&a) == 0 && mpfi_cmp_si(&f.im,0); } + bool is_member(mpq_srcptr a, const ElementType &f) const { return mpfi_cmp_q(&f.re,a) == 0 && mpfi_cmp_si(&f.im,0); } + bool is_member(mpz_srcptr a, const ElementType &f) const { return mpfi_cmp_z(&f.re,a) == 0 && mpfi_cmp_si(&f.im,0); } + bool is_member(long a, const ElementType &f) const { return mpfi_cmp_si(&f.re,a) == 0 && mpfi_cmp_si(&f.im,0); } + bool is_member(double a, const ElementType &f) const { return mpfi_cmp_d(&f.re,a) == 0 && mpfi_cmp_si(&f.im,0); } bool is_subset(const ElementType &g, const ElementType &f) const { return mpfi_cmp_fr(&f.re,&(g.re.left)) == 0 and mpfi_cmp_fr(&f.re,&(g.re.right)) == 0 and mpfi_cmp_fr(&f.im,&(g.im.left)) == 0 and mpfi_cmp_fr(&f.im,&(g.im.right)) == 0; } diff --git a/M2/Macaulay2/e/aring-glue.hpp b/M2/Macaulay2/e/aring-glue.hpp index a46af0c5811..29a46111e8d 100644 --- a/M2/Macaulay2/e/aring-glue.hpp +++ b/M2/Macaulay2/e/aring-glue.hpp @@ -699,6 +699,8 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_RRi: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } @@ -709,6 +711,8 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_CCC: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } @@ -719,22 +723,14 @@ bool ConcreteRing::promote(const Ring *R, return RP::promoter(R, S, fR, resultS); case M2::ring_CC: return RP::promoter(R, S, fR, resultS); + case M2::ring_CCi: + return RP::promoter(R, S, fR, resultS); default: return false; } case M2::ring_CCi: switch (S->ringID()) { - case M2::ring_RR: - return RP::promoter(R, S, fR, resultS); - case M2::ring_RRR: - return RP::promoter(R, S, fR, resultS); - case M2::ring_RRi: - return RP::promoter(R, S, fR, resultS); - case M2::ring_CCC: - return RP::promoter(R, S, fR, resultS); - case M2::ring_CC: - return RP::promoter(R, S, fR, resultS); case M2::ring_CCi: return RP::promoter(R, S, fR, resultS); default: @@ -906,7 +902,6 @@ inline bool ConcreteRing::promote(const Ring *Rf, // Rf = Z/p[x]/F(x) ---> GF(p,n) // promotion: need to be able to know the value of 'x'. // lift: need to compute (primite_element)^e - ElementType a; bool retval = R->promote(Rf, f, a); R->to_ring_elem(result, a); diff --git a/M2/Macaulay2/e/aring-translate.hpp b/M2/Macaulay2/e/aring-translate.hpp index 7964ef649cb..2e429466eb6 100644 --- a/M2/Macaulay2/e/aring-translate.hpp +++ b/M2/Macaulay2/e/aring-translate.hpp @@ -414,6 +414,16 @@ inline bool mypromote(const ARingRR& R, S.set_from_double(fS, fR); return true; } + +inline bool mypromote(const ARingRRi& R, + const ARingCCi& S, + const ARingRRi::ElementType& fR, + ARingCCi::ElementType& fS) +{ + S.set_from_Interval(fS, &fR); + return true; +} + inline bool mypromote(const ARingRRR& R, const ARingCCi& S, const ARingRRR::ElementType& fR, From 5c9d303b94673184a3b3fa96e724a30cb03c85e8 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 24 Nov 2025 10:41:32 -0500 Subject: [PATCH 158/691] Fixed a typo/bug converting CC to CCi --- M2/Macaulay2/e/aring-CCi.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/e/aring-CCi.hpp b/M2/Macaulay2/e/aring-CCi.hpp index f3f76ce1cc7..2053c28ab27 100644 --- a/M2/Macaulay2/e/aring-CCi.hpp +++ b/M2/Macaulay2/e/aring-CCi.hpp @@ -204,7 +204,7 @@ class ARingCCi : public SimpleARing bool set_from_BigComplex(ElementType &result, gmp_CC a) const { mpfi_set_fr(&result.re, a->re); - mpfi_set_fr(&result.im, a->re); + mpfi_set_fr(&result.im, a->im); return true; } From 4efa0ddb209fd5cface1422e4b79226bcff23384 Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Mon, 24 Nov 2025 16:31:21 +0000 Subject: [PATCH 159/691] update: documentation for writeNmzData --- M2/Macaulay2/packages/Normaliz.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/Normaliz.m2 b/M2/Macaulay2/packages/Normaliz.m2 index 540e9f044f4..7c302de9923 100644 --- a/M2/Macaulay2/packages/Normaliz.m2 +++ b/M2/Macaulay2/packages/Normaliz.m2 @@ -1077,7 +1077,7 @@ document { PARA{},"This function creates an input file for ", TT "Normaliz", " containing one or several matrices, whose rows are considered according to the type:", UL { "integral closure, normalization: generators of a rational cone", - "polytope: lattice points spanning a polytope", + "polytope: lattice points or rational points spanning a polytope", "rees_algebra: exponent vectors of monomials generating an ideal", "inequalities, equations, congruences: constraints defining the cone to be computed", "inhom_inequalities, inhom_equations, inhom_congruences: inhomogeneous constraints defining the cone to be computed", From 5b7e4bfc1c7c67e7a48a5258e733b879c892ec70 Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Mon, 24 Nov 2025 16:32:03 +0000 Subject: [PATCH 160/691] Add test: normaliz works with rational polytopes --- M2/Macaulay2/packages/Normaliz.m2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/M2/Macaulay2/packages/Normaliz.m2 b/M2/Macaulay2/packages/Normaliz.m2 index 7c302de9923..dcb39bde051 100644 --- a/M2/Macaulay2/packages/Normaliz.m2 +++ b/M2/Macaulay2/packages/Normaliz.m2 @@ -1287,6 +1287,11 @@ TEST /// {1, 0, 2, 2, 1, 0, 0, 2, 1}}) ) rmNmzFiles(); ///, +TEST /// +-- check that normaliz works with rational polytopes +V = matrix "1/2,0;-1/2,0;1,0;-1,0"; +C = normaliz(V, "polytope"); +///, } document{ From c0bcebd93e8616c018c0d08c7109b746a9bac78a Mon Sep 17 00:00:00 2001 From: Oliver Clarke Date: Mon, 24 Nov 2025 16:34:16 +0000 Subject: [PATCH 161/691] fix: rational example --- M2/Macaulay2/packages/Normaliz.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/Normaliz.m2 b/M2/Macaulay2/packages/Normaliz.m2 index dcb39bde051..011d8a2c861 100644 --- a/M2/Macaulay2/packages/Normaliz.m2 +++ b/M2/Macaulay2/packages/Normaliz.m2 @@ -1289,7 +1289,7 @@ TEST /// ///, TEST /// -- check that normaliz works with rational polytopes -V = matrix "1/2,0;-1/2,0;1,0;-1,0"; +V = matrix "1/2,0;-1/2,0;0,1;0,-1"; C = normaliz(V, "polytope"); ///, } From d96ef14758ae154b1fb8db3d69e89bab16d1d32c Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Mon, 24 Nov 2025 21:58:20 -0500 Subject: [PATCH 162/691] Improving documentation --- M2/Macaulay2/m2/enginering.m2 | 2 + M2/Macaulay2/m2/reals.m2 | 4 + .../packages/Macaulay2Doc/doc_rings.m2 | 5 -- .../packages/Macaulay2Doc/operators.m2 | 82 ++++++++++++------- .../Macaulay2Doc/operators/division.m2 | 5 +- .../Macaulay2Doc/operators/equality.m2 | 6 +- .../packages/Macaulay2Doc/operators/minus.m2 | 5 +- .../packages/Macaulay2Doc/operators/plus.m2 | 5 +- .../packages/Macaulay2Doc/operators/times.m2 | 5 +- .../Macaulay2Doc/operators/underscore.m2 | 2 + .../Macaulay2Doc/ov_analytic_functions.m2 | 4 +- .../packages/Macaulay2Doc/ov_rings.m2 | 31 ++++--- 12 files changed, 96 insertions(+), 60 deletions(-) diff --git a/M2/Macaulay2/m2/enginering.m2 b/M2/Macaulay2/m2/enginering.m2 index 350c123ce85..7fb66f3ebf6 100644 --- a/M2/Macaulay2/m2/enginering.m2 +++ b/M2/Macaulay2/m2/enginering.m2 @@ -277,6 +277,8 @@ texMath EngineRing := texMath @@ expression ZZ _ EngineRing := RR _ EngineRing := +CC _ EngineRing := +CCi _ EngineRing := RRi _ EngineRing := RingElement => (i,R) -> new R from i_(R.RawRing) new RingElement from RawRingElement := (R, f) -> ( diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 9edc9e9c00f..d3b6ef7c8ea 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -41,8 +41,12 @@ CCi.InexactField = ComplexIntervalField = new Type of InexactField; ComplexInter RingFamily_* := RR -> RR#(symbol _*) RingFamily_* := RRi -> RRi#(symbol _*) +RingFamily_* := CC -> CC#(symbol _*) +RingFamily_* := CCi -> CCi#(symbol _*) RingFamily_* = (RR,e) -> RR#(symbol _*) = e RingFamily_* = (RRi,e) -> RRi#(symbol _*) = e +RingFamily_* = (CC,e) -> CC#(symbol _*) = e +RingFamily_* = (CCi,e) -> CCi#(symbol _*) = e InexactNumber' = new Type of Number RR_* = RR' = new Type of InexactNumber' RRi_* = RRi' = new Type of InexactNumber' diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_rings.m2 index 4015bf1ad84..426616e239d 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_rings.m2 @@ -450,11 +450,6 @@ document { Key => RealField, PARA { "A real number ring is a ring whose elements are real numbers of variable precision." } } -undocumented { - (NewOfFromMethod,ComplexField,Nothing,ZZ), - (NewOfFromMethod,RealField,Nothing,ZZ) - } - document { Key => ComplexField, Headline => "the class of all complex fields", PARA { "A complex number ring is a ring whose elements are complex numbers of variable precision." } diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 index 04cda9a181b..54a97a96eb9 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 @@ -36,24 +36,31 @@ document { /// } -document { - Key => {abs,(abs, Number),(abs, Constant)}, - Headline => "absolute value function", - Usage => "abs x\nabs I", - Inputs => { - "x" => "a number", - "I" => RRi - }, - Outputs => { - {"the absolute value of ", TT "x"}, - RRi => {"an interval containing the absolute values of all the point of ", TT "I"} - }, - TT "abs x", " computes the absolute value of ", TT "x", ".", - EXAMPLE { - "abs(-pi)", - "abs(1+ii)" - }, - } +doc /// + Key + abs + (abs, Number) + (abs, Constant) + Headline + absolute value function + Usage + abs x + abs I + Inputs + x:{RR,CC} + I:{RRi,CCi} + Outputs + :RR + the absolute value of @TT "x"@ + :RRi + an interval containing the absolute values of all the points of @TT "x"@ + Description + Example + abs(-pi) + abs(1+ii) + abs(interval(1,2)) + abs(interval(1+2*ii,3+4*ii)) +/// document { Key => (exp,RingElement), @@ -67,18 +74,33 @@ document { /// } -document { - Key => {exp,(exp,RR),(exp,CC),(exp,RRi),(exp,CCi)}, - Headline => "exponential function", - Usage => "exp x\nexp I", - Inputs => { "x" => RR ,"I"=>RRi}, - Outputs => { { "the exponential of ", TT "x" }, - RRi=>{"an interval containing the exponentials of points of ", TT "I"} } , - EXAMPLE lines /// - exp 1p300 - exp(pi*ii) - /// - } +doc /// + Key + exp + (exp, RR) + (exp, CC) + (exp, RRi) + (exp, CCi) + Headline + exponential function + Usage + exp x + exp I + Inputs + x:{RR,CC} + I:{RRi,CCi} + Outputs + :{RR,CC} + the exponential of @TT "x"@ + :{RRi,CCi} + an interval containing the exponentials of all the points of @TT "x"@ + Description + Example + exp 1p300 + exp(pi*ii) + exp(interval(1,2)) + exp(interval(1+2*ii,3+4*ii)) +/// document { Key => { diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 index c475fc49445..6e4658a142c 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/division.m2 @@ -79,11 +79,12 @@ document { 2./3 ///, HEADER3 "Intervals", - PARA { "If one of the inputs is an ", TO "RRi", ", the output is an interval containing all quotients of pairs in the inputs." }, + PARA { "If one of the inputs is an ", TO "RRi", " or a ", TO "CCi", ", the output is an interval containing all quotients of pairs in the inputs." }, EXAMPLE { "2/interval(1,3)", "interval(-1,2)/interval(1,3)", - "interval(1,2)/interval(1,2)" + "interval(1,2)/interval(1,2)", + "interval(1,2+3*ii)/(1+2*ii)" }, SeeAlso => { "//"} } diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/equality.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/equality.m2 index d1ca246d315..0f6a20b9527 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/equality.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/equality.m2 @@ -120,11 +120,13 @@ document { "image matrix {{2,a},{0,5}} == R^2" }, HEADER3 "Intervals", - PARA { "If either side of the equality is an ", TO "RRi", ", the equality is an equality of sets." }, + PARA { "If either side of the equality is an ", TO "RRi", " or a ", TO "CCi", ", the equality is an equality of sets." }, EXAMPLE { "interval(1,3) == interval(1,3)", "interval(1/2) == 1/2", - "interval(1/3) == 1/3" + "interval(1/3) == 1/3", + "interval(1+2*ii,3+4*ii) == span(1+4*ii,3+2*ii)", + "interval(1/2+ii/3) == (1/2+ii/3)" }, PARA{ "It may happen that for certain types of objects, there is no method installed (yet) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 index 69811c81e87..5e17780fdb4 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 @@ -116,11 +116,12 @@ document { M-1, M-2 ///, HEADER3 "Intervals", - PARA { "If one of the inputs is an ", TO "RRi", ", the output is an interval containing all differences of pairs in the inputs." }, + PARA { "If one of the inputs is an ", TO "RRi", " or a ", TO "CCi", ", the output is an interval containing all differences of pairs in the inputs." }, EXAMPLE { "2-interval(1,3)", "interval(1,3)-interval(-1,2)", - "interval(-1,1)-interval(-1,1)" + "interval(-1,1)-interval(-1,1)", + "interval(1,2+3*ii)-(2+ii)" }, SeeAlso =>{ "difference", "minus"} } diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 index b8e38cda3ad..2a3e9669934 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 @@ -107,11 +107,12 @@ document { M+1, M+2 ///, HEADER3 "Intervals", - PARA { "If one of the addends is an ", TO "RRi", ", the output is an interval containing all sums of pairs in the addends." }, + PARA { "If one of the addends is an ", TO "RRi", " or a ", TO "CCi", ", the output is an interval containing all sums of pairs in the addends." }, EXAMPLE { "2+interval(1,3)", "interval(1,3)+interval(-1,2)", - "interval(-1,1)+interval(-1,1)" + "interval(-1,1)+interval(-1,1)", + "interval(1,1+2*ii)+interval(2+3*ii,3+5*ii)" }, SeeAlso =>{ "plus", "sum"} } diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 index f7f78f16074..110ee880ca8 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/times.m2 @@ -150,11 +150,12 @@ document { "isHomogeneous N" }, HEADER3 "Intervals", - PARA { "If one of the factors is an ", TO "RRi", ", the output is an interval containing all products of pairs in the factors." }, + PARA { "If one of the factors is an ", TO "RRi", " or a ", TO "CCi", ", the output is an interval containing all products of pairs in the factors." }, EXAMPLE { "2*interval(1,3)", "interval(1,3)*interval(-1,2)", - "interval(-1,1)*interval(-1,1)" + "interval(-1,1)*interval(-1,1)", + "interval(1,2+2*ii)*interval(2+3*ii,4+3*ii)" }, SeeAlso =>{ "times", "product"} } diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/underscore.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/underscore.m2 index 6129d1d6c4e..c645e292458 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/underscore.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/underscore.m2 @@ -3,6 +3,8 @@ undocumented { (symbol _, EngineRing, ZZ), (symbol _, RR, EngineRing), (symbol _, RRi, EngineRing), + (symbol _, CC, EngineRing), + (symbol _, CCi, EngineRing), (symbol _, ZZ, Monoid), (symbol _, Vector, ZZ), (symbol _, Monoid, List), diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 index fc48c69e4b6..1f90d4f46d2 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 @@ -162,8 +162,8 @@ doc /// log1p x log1p I Inputs - x:{CC,RR} - I:RRi + x:{RR,CC} + I:{RRi,CCi} Outputs :{RR,CC} the logarithm of @TT "1+x"@ diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index aa91c2bd064..f939f138b4e 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -489,19 +489,21 @@ undocumented {"CCi_*"} document { Key => CCi, Headline => "the class of all complex intervals", - "A complex interval is entered as a pair of real intervals to the ", TO "interval", " function. It is stored internally as an arbitrary precision interval using the ", TO "MPFI", " library.", + "A complex interval is entered as a pair of real intervals to the ", TO "interval", " function. It is stored internally as a pair of arbitrary precision intervals using the ", TO "MPFI", " library.", EXAMPLE "interval(interval(3.1415,3.1416), interval(2.7182,2.7183))", "The precision is measured in bits, is visible in the ring displayed on the second of each pair of output lines, and can be recovered using ", TO "precision", ".", EXAMPLE "precision interval(interval(3.1415,3.1416), interval(2.7182,2.7183))", - "Complex intervals are objects in ", TO "class", " CCi which is an ", TO "InexactFieldFamily", ".", + "Complex intervals are objects in ", TO "class", " CCi which is an ", TO "InexactFieldFamily", ".", "For complex intervals, the functions ", TO "class", " and ", TO "ring", " yield different + results. That allows numbers of various precisions + to be used without creating a new ring for each precision.", EXAMPLE {"class interval(interval(3.1,3.5),interval(1.1,1.2))"}, "The precision can be specified on input by specifying the precision of both input ", TO "CC", " numbers. ", "Alternatively, the precision can be specified by including the option ", TT "Precision", ".", EXAMPLE {"interval(interval(2.5p1000,3.2p100),interval(2.3,3.1,Precision=>200))"}, - "Intervals can also be created using ", TO (span,Sequence), " to create the smallest interval containing the inputs.", + "Complex intervals can also be created using ", TO (span,Sequence), " to create the smallest complex axis-aligned rectangle containing the inputs.", EXAMPLE {"span(2+3*ii,Precision=>100)","span(2,3*ii,interval(interval(-1.5,-0.5),interval(3,3.1)),73)"}, - "Operations using intervals are computed as sets so that the resulting intervals contain all possible outputs from pairs of points in input intervals.", + "Operations using complex intervals are computed as sets so that the resulting intervals contain all possible outputs from pairs of points in input intervals.", EXAMPLE {" (I, J, K) = (interval(interval(.5,.8),interval(.6,.9)), interval(interval(.54,.78),interval(.65,.89)), interval(interval(.45,.6),interval(.3,.78)));", "I + J", "I - J", @@ -517,17 +519,20 @@ document { interval, midpoint, diameter, - (span,Sequence), - (span,List)}, + realPart, + imaginaryPart, + intersect, + isEmpty, + isSubset, + span, + }, Subnodes => { TO toCCi, --* TO intersect, - TO (isMember, QQ, CCi), - TO (isEmpty, CCi), - TO (isSubset, RRi,CCi), - TO span, -- TODO: perhaps this should be shared - TO (span, List), - TO (span, Sequence),*- + --TO (intersect, CCi, CCi), + --TO (isMember, QQ, CCi), + --TO (isEmpty, CCi), + --TO (isSubset, RRi, CCi), + --TO span, }, } From 2b2fe74dfb85d8f00d9e6db821535c28b9f4d702 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 25 Nov 2025 07:32:03 -0500 Subject: [PATCH 163/691] Adding tests and improving documentation --- M2/Macaulay2/m2/reals.m2 | 1 + .../packages/Macaulay2Doc/doc_arithmetic.m2 | 27 ++-- .../packages/Macaulay2Doc/doc_intervals.m2 | 22 +++ .../packages/Macaulay2Doc/operators.m2 | 135 +++++++++++------- .../Macaulay2Doc/ov_analytic_functions.m2 | 66 ++++++--- .../packages/Macaulay2Doc/ov_rings.m2 | 9 +- M2/Macaulay2/tests/normal/RRi.m2 | 49 ++++++- 7 files changed, 222 insertions(+), 87 deletions(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index d3b6ef7c8ea..08f6bc238b4 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -275,6 +275,7 @@ imaginaryPart InexactNumber := imaginaryPart0 imaginaryPart Number := imaginaryPart0 @@ numeric conjugate CC := z -> toCC(precision z, realPart z, - imaginaryPart z) +conjugate CCi := z -> toCCi(precision z, realPart z, - imaginaryPart z) conjugate Constant := conjugate @@ numeric isConstant Number := i -> true diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 index 0639ce331e0..1e0629ed983 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_arithmetic.m2 @@ -75,40 +75,45 @@ document { document { Key => {realPart, (realPart,Number), (realPart,QQ), (realPart,ZZ), - (realPart,InexactNumber)}, + (realPart,InexactNumber),"(realPart,CC)","(realPart,CCi)"}, Headline => "real part", Usage => "realPart z", - Inputs => {"z" => "an integer, rational, real or complex number"}, - Outputs => {"the real part of the complex number z."}, + Inputs => {"z" => "an integer, rational, real or complex number, or a real or complex interval"}, + Outputs => {"the real part of the complex number z or an interval containing the real parts of real or complex interval z"}, EXAMPLE { "realPart(3/4)", - "realPart(1.5+2*ii)" + "realPart(1.5+2*ii)", + "realPart(interval(1+2*ii,3+4*ii))" }, SeeAlso => {CC, imaginaryPart} } document { Key => {imaginaryPart,(imaginaryPart,Number), (imaginaryPart,QQ), - (imaginaryPart,ZZ), (imaginaryPart,InexactNumber)}, + (imaginaryPart,ZZ), (imaginaryPart,InexactNumber),"(imaginaryPart,CCi)","(imaginaryPart,CC)"}, Headline => "imaginary part", Usage => "imaginaryPart z", - Inputs => {"z" => "an integer, rational, real or complex number"}, - Outputs => {"the imaginary part of the complex number z."}, + Inputs => {"z" => "an integer, rational, real or complex number or a real or complex interval"}, + Outputs => {"the imaginary part of the complex number z or an interval containing the complex parts of real or complex interval z."}, EXAMPLE { "imaginaryPart(3/4)", - "imaginaryPart(1.5+2*ii)" + "imaginaryPart(1.5+2*ii)", + "imaginaryPart(interval(1+2*ii,3+4*ii))" }, SeeAlso => {CC, realPart} } document { - Key => {conjugate,(conjugate,CC),(conjugate,Number),(conjugate,Constant)}, + Key => {conjugate,(conjugate,CC),(conjugate,Number),(conjugate,CCi),(conjugate,Constant)}, Headline => "complex conjugate", Usage => "conjugate z", Inputs => {"z"}, - Outputs => {CC => {"the complex conjugate of ", TT "z"}}, + Outputs => {CC => {"the complex conjugate of ", TT "z"}, + CCi => {"a complex interval containing all complex conjugate of points of ", TT "z"} +}, EXAMPLE { "conjugate(1+2.5*ii)", - "conjugate 3" + "conjugate 3", + "conjugate interval(1+2*ii,3+4*ii)" } } diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 300916676b5..4b0890242e1 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -12,6 +12,8 @@ doc /// Description Text Returns the left endpoint of the input interval. + Example + left interval(2,3) SeeAlso right midpoint @@ -32,6 +34,8 @@ Outputs Description Text Returns the right endpoint of the input interval. + Example + right interval(2,3) SeeAlso left midpoint @@ -122,6 +126,9 @@ Outputs Description Text Returns the intersection of any number of input intervals. + Example + intersect(interval(1,3),interval(2,4)) + intersect(interval(1,2+3*ii),interval(2*ii,3+2*ii)) SeeAlso intersect /// @@ -148,6 +155,10 @@ Outputs Description Text Returns true if the input number is in the interval. + Example + isMember(1,interval(2,3)) + isMember(2,interval(1,3)) + isMember(1+2*ii,interval(0,2+3*ii)) SeeAlso isEmpty /// @@ -167,6 +178,10 @@ Outputs Description Text Returns true if the input interval is empty, i.e., the left endpoint is to the right of the right endpoint. + Example + isEmpty interval(1,2) + isEmpty interval(2,1) + isEmpty interval(1,2*ii) SeeAlso isMember /// @@ -189,6 +204,10 @@ Outputs Description Text Returns true if interval I is a subset of interval J. + Example + isSubset(interval(2,3),interval(1,4)) + isSubset(interval(1,3),interval(2,4)) + isSubset(interval(0,4+4*ii),interval(1+ii,2+3*ii)) SeeAlso isMember /// @@ -220,6 +239,7 @@ Description Text Returns the smallest interval containing the inputs (which can include intervals). Typically, the returned interval is not empty. Example + span(1,4,interval(2,5),interval(-3)) span(1 + 3*ii, pi, 4 + ii) SeeAlso interval @@ -326,6 +346,8 @@ SeeAlso (span, List) (span, Sequence) interval + left + right /// doc /// diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 index 54a97a96eb9..1b1d53e21ab 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 @@ -53,7 +53,7 @@ doc /// :RR the absolute value of @TT "x"@ :RRi - an interval containing the absolute values of all the points of @TT "x"@ + an interval containing the absolute values of all the points of @TT "I"@ Description Example abs(-pi) @@ -93,7 +93,7 @@ doc /// :{RR,CC} the exponential of @TT "x"@ :{RRi,CCi} - an interval containing the exponentials of all the points of @TT "x"@ + an interval containing the exponentials of all the points of @TT "I"@ Description Example exp 1p300 @@ -102,52 +102,91 @@ doc /// exp(interval(1+2*ii,3+4*ii)) /// -document { - Key => { - log, - (log, RR), - (log,CC), - (log,CC,CC), - (log,CC,CCi), - (log,CC,RR), - (log,CC,RRi), - (log,CCi), - (log,CCi,CC), - (log,CCi,CCi), - (log,CCi,RR), - (log,CCi,RRi), - (log,RR,CCi), - (log,RR,RR), - (log,RR,RRi), - (log,RRi), - (log,RRi,CCi), - (log,RRi,RR), - (log,RRi,RRi), - (log,RR,CC) - }, - Headline => "logarithm function", - Usage => "log x\nlog(b,x)\nlog_b x\nlog I\nlog(b,I)\nlog_b I\nlog(J,x)\nlog_J x\nlog(J,I)\nlog_J I", -Inputs => { "x" => RR, "b" => RR => {"the base for the logarithm"}, "I" => RRi, "J" => RRi => {"an interval of bases for the logarithm"} }, -Outputs => { { "the logarithm of ", TT "x"}, RRi => {"an interval containing the logarithms of points of ", TT "I"}, RRi => {"an interval containing the logarithms for bases in ", TT "J"} }, - EXAMPLE lines /// - log 10 - log_2 10 - log_10 2p100 - /// - } -document { - Key => {sqrt,(sqrt, CC),(sqrt, RR), (sqrt, RRi),(sqrt,CCi)}, - Headline => "square root function", -Usage => "sqrt x\nsqrt I", - Inputs => { "x" => RR, "I" => RRi }, - Outputs => { { "the square root of ", TT "x"}, -RRi => { "an interval containing the square roots of the points of ", TT "I" } -}, - EXAMPLE lines /// - sqrt 2p200 - sqrt (+ii) - /// - } +doc /// + Key + log + (log, RR) + (log,CC) + (log,CC,CC) + (log,CC,CCi) + (log,CC,RR) + (log,CC,RRi) + (log,CCi) + (log,CCi,CC) + (log,CCi,CCi) + (log,CCi,RR) + (log,CCi,RRi) + (log,RR,CCi) + (log,RR,RR) + (log,RR,RRi) + (log,RRi) + (log,RRi,CCi) + (log,RRi,RR) + (log,RRi,RRi) + (log,RR,CC) + Headline + logarithm function + Usage + log x + log(b,x) + log_b x + log I + log(b,I) + log_b I + log(J,x) + log_J x + log(J,I) + log_J I + Inputs + x:{RR,CC} + b:RR + the base for the logarithm + I:{RRi,CCi} + J:RRi + an interval of bases for the logarithm + Outputs + :{RR,CC} + the logarithm of @TT "x"@ + :{RRi,CCi} + an interval containing the logarithms of all the points of @TT "I"@ + :{RR,CC,RRi,CCi} + an interval containing the logarithms for bases in @TT "J"@ + Description + Example + log 10 + log_2 10 + log_10 2p100 + log interval(2,3) + log interval(1+2*ii,3+4*ii) +/// + +doc /// + Key + sqrt + (sqrt, RR) + (sqrt, CC) + (sqrt, RRi) + (sqrt, CCi) + Headline + square root function + Usage + sqrt x + sqrt I + Inputs + x:{RR,CC} + I:{RRi,CCi} + Outputs + :{RR,CC} + the square root of @TT "x"@ + :{RRi,CCi} + an interval containing the square roots of all the points of @TT "I"@ + Description + Example + sqrt 2p200 + sqrt(+ii) + sqrt(interval(2,3)) + sqrt(interval(1+2*ii,3+4*ii)) +/// document { Key => {gcd, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 index 1f90d4f46d2..510561b8249 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 @@ -173,6 +173,8 @@ doc /// Example log1p 1p100e-10 log(1 + 1p100e-10) + log1p interval(2,3) + log1p interval(1+2*ii,3+4*ii) /// doc /// @@ -199,13 +201,18 @@ doc /// Example expm1 1p100e-10 exp(1p100e-10)-1 + expm1 interval(2,3) + expm1 interval(1+2*ii,3+4*ii) /// document { Key => {eint,(eint, RR),(eint,CC),(eint,RRi),(eint,CCi)}, Usage => "eint x", Headline => "exponential integral", Inputs => { "x" }, - Outputs => { RR => { "the exponential integral of ", TT "x" }}, + Outputs => { RR => { "the exponential integral of ", TT "x" }, + RRi => { "an interval containing the exponential integral of the points of ", TT "x" }, + CCi => { "a complex interval containing the exponential integral of the points of ", TT "x" } +}, EXAMPLE lines /// eint 2 ///, @@ -216,7 +223,10 @@ document { Key => {Digamma,(Digamma, RR),(Digamma,CC),(Digamma,RRi),(Digamma,CCi Usage => "Digamma x", Headline => "Digamma function", Inputs => { "x" }, - Outputs => { RR => { "the digamma function (logarithmic derivative of the gamma function) of ", TT "x" }}, + Outputs => { RR => { "the digamma function (logarithmic derivative of the gamma function) of ", TT "x" }, + RRi => { "an interval containing the digamma function (logarithmic derivative of the gamma function) of the points of ", TT "x" }, + CCi => { "a complex interval containing the digamma function (logarithmic derivative of the gamma function) of the points of ", TT "x" } +}, EXAMPLE lines /// Digamma 6 ///, @@ -228,7 +238,10 @@ document { Key => {zeta,(zeta, RR),(zeta,CC),(zeta,RRi),(zeta,CCi)}, Usage => "zeta x", Headline => "Riemann zeta function", Inputs => { "x" }, - Outputs => { RR => { "the zeta function of ", TT "x" }}, + Outputs => { RR => { "the zeta function of ", TT "x" }, + RRi => { "an interval containing the the zeta function of the points of ", TT "x" }, + CCi => { "a complex interval containing the the zeta function of the points of ", TT "x" } +}, EXAMPLE lines /// zeta 2 ///, @@ -240,9 +253,11 @@ document { Key => {acos,(acos,RR),(acos,CC),(acos, RRi),(acos,CCi)}, Headline => "arccosine", Usage => "acos x\nacos I", - Inputs => { "x", "I" => RRi }, + Inputs => { "x" => RR, "x" => CC, "I" => RRi, "I" => CCi }, Outputs => { Number => { "the arccosine (in radians) of ", TT "x"}, - RRi => { "an interval containing the arccosines of the points of ", TT "I" }}, + RRi => { "an interval containing the arccosines of the points of ", TT "I" }, + CCi => { "a complex interval containing the arccosines of the points of ", TT "I" } +}, EXAMPLE lines /// acos 0.5 ///, @@ -254,10 +269,11 @@ document { Key => {asin,(asin,RR),(asin,CC),(asin, RRi),(asin,CCi)}, Headline => "arcsine", Usage => "asin x\nasin I", - Inputs => { "x", "I" => RRi }, + Inputs => { "x" => RR, "x" => CC, "I" => RRi, "I" => CCi }, Outputs => { Number => {"the arcsine (in radians) of ", TT "x"}, - RRi => { "an interval containing the arcsines of the points of ", TT "I" } + RRi => { "an interval containing the arcsines of the points of ", TT "I" }, + CCi => { "a complex interval containing the arcsines of the points of ", TT "I" } }, EXAMPLE { "asin 1" @@ -270,9 +286,11 @@ document { Key => {cosh, (cosh,RR),(cosh,CC),(cosh,RRi),(cosh,CCi)}, Headline => "compute the hyperbolic cosine", Usage => "cosh x\ncosh I", - Inputs => { "x", "I"=>RRi}, + Inputs => { "x"=>RR, "x"=>CC, "I"=>RRi, "I"=>CCi}, Outputs => { Number => { "the hyperbolic cosine of ", TT "x" }, - RRi => { "an interval containing the hyerbolic cosines of the points of ", TT "I" } }, + RRi => { "an interval containing the hyerbolic cosines of the points of ", TT "I" }, + CCi => { "a complex interval containing the hyerbolic cosines of the points of ", TT "I" } +}, EXAMPLE lines /// cosh .2 ///, @@ -306,9 +324,10 @@ document { document { Key => {sec,(sec,CC),(sec, RR),(sec, RRi),(sec,CCi)}, Usage => "sec x\nsec I", Headline => "secant", - Inputs => { "x", "I" => RRi }, + Inputs => { "x" => RR, "x" => CC, "I" => RRi, "I" => CCi }, Outputs => { RR => { "the secant of ", TT "x" }, - RRi => { "an interval containing the secants of the points of ", TT "I" } + RRi => { "an interval containing the secants of the points of ", TT "I" }, + CCi => { "a complex interval containing the secants of the points of ", TT "I" } }, EXAMPLE lines /// sec(pi/3) @@ -319,9 +338,10 @@ document { Key => {sec,(sec,CC),(sec, RR),(sec, RRi),(sec,CCi)}, document { Key => {csc,(csc,CC),(csc, RR),(csc,RRi),(csc,CCi)}, Usage => "csc x\ncsc I", Headline => "cosecant", - Inputs => { "x","I"=>RRi }, + Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, Outputs => { RR => { "the cosecant of ", TT "x" }, - RRi => { "an interval containing the cosecants of the points of ", TT "I" } + RRi => { "an interval containing the cosecants of the points of ", TT "I" }, + CCi => { "a complex interval containing the cosecants of the points of ", TT "I" } }, EXAMPLE lines /// csc(pi/3) @@ -332,9 +352,10 @@ document { Key => {csc,(csc,CC),(csc, RR),(csc,RRi),(csc,CCi)}, document { Key => {cot,(cot, RR),(cot,CC),(cot,RRi),(cot,CCi)}, Usage => "cot x\ncot I", Headline => "cotangent", - Inputs => { "x", "I"=>RRi }, + Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, Outputs => { RR => { "the cotangent of ", TT "x" }, - RRi => { "an interval containing the cotangents of points of ", TT "I"} + RRi => { "an interval containing the cotangents of points of ", TT "I"}, + CCi => { "a complex interval containing the cotangents of points of ", TT "I"} }, EXAMPLE lines /// cot(pi/3) @@ -345,9 +366,10 @@ document { Key => {cot,(cot, RR),(cot,CC),(cot,RRi),(cot,CCi)}, document { Key => {sech,(sech,CC),(sech, RR),(sech, RRi),(sech,CCi)}, Usage => "sech x\nsech I", Headline => "hyperbolic secant", - Inputs => { "x", "I" => RRi }, + Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, Outputs => { RR => { "the hyperbolic secant of ", TT "x" }, - RRi => { "an interval containing the hyerbolic secants of the points of ", TT "I" } + RRi => { "an interval containing the hyerbolic secants of the points of ", TT "I" }, + CCi => { "a complex interval containing the hyerbolic secants of the points of ", TT "I" } }, EXAMPLE lines /// sech(pi/3) @@ -358,9 +380,10 @@ document { Key => {sech,(sech,CC),(sech, RR),(sech, RRi),(sech,CCi)}, document { Key => {csch,(csch,CC),(csch, RR),(csch,RRi),(csch,CCi)}, Usage => "csch x\ncsch I", Headline => "hyperbolic cosecant", - Inputs => { "x", "I"=>RRi }, + Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, Outputs => { RR => { "the hyperbolic cosecant of ", TT "x" }, - RRi => { "an interval containing the hyperbolic cosecants of the points of ", TT "I" } + RRi => { "an interval containing the hyperbolic cosecants of the points of ", TT "I" }, + CCi => { "a complex interval containing the hyperbolic cosecants of the points of ", TT "I" } }, EXAMPLE lines /// csch(pi/3) @@ -371,9 +394,10 @@ document { Key => {csch,(csch,CC),(csch, RR),(csch,RRi),(csch,CCi)}, document { Key => {coth,(coth,CC),(coth, RR),(coth,RRi),(coth,CCi)}, Usage => "coth x\ncoth I", Headline => "hyperbolic cotangent", - Inputs => { "x","I"=>RRi}, + Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, Outputs => { RR => { "the hyperbolic cotangent of ", TT "x" }, - RRi => { "an interval containing the hyperbolic cotangents of the points of ", TT "I" } + RRi => { "an interval containing the hyperbolic cotangents of the points of ", TT "I" }, + CCi => { "a complex interval containing the hyperbolic cotangents of the points of ", TT "I" } }, EXAMPLE lines /// coth(pi/3) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index f939f138b4e..2d7921cefa2 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -467,6 +467,8 @@ document { EXAMPLE {"exp(interval(2,4))","cos(interval(1,1.3))","sqrt(interval(2))"}, "Transcendental functions are available to high precision, with ", TO "numericInterval", ".", EXAMPLE {"numericInterval(100,pi)","numericInterval_200 EulerConstant"}, + "The left and right endpoints of an interval can be accessed with ", TO "left", " and ", TO "right", ". Similarly, the midpoint and the length of an interval can be found with ", TO "midpoint", " and ", TO "diameter", ".", + EXAMPLE {"left interval(1,5)","right interval(1,5)","midpoint interval(1,5)","diameter interval(1,5)"}, SeeAlso => {CCi, toRRi, numericInterval, precision, interval, (span,Sequence), (span,List)}, Subnodes => { TO toRRi, @@ -512,6 +514,8 @@ document { "I ^ 3", "2 * I", "(2+3*ii) * I"}, + "The real and imaginary parts of a complex interval can be accessed with ", TO "realPart", " and ", TO "imaginaryPart", ". These are real intervals of class ", TO "RRi", ". The ", TO "diameter", " of a complex interval is the (rounded) approximation to the length of its diagonal, while its ", TO "midpoint", " is the complex midpoint of its real and imaginary parts", + EXAMPLE {"realPart interval(1+2*ii,3+4*ii)","imaginaryPart interval(1+2*ii,3+4*ii)","realPart diameter(1+2*ii,3+4*ii)","midpoint interval(1+2*ii,3+4*ii)"}, SeeAlso => { RRi, toCCi, @@ -528,11 +532,6 @@ document { }, Subnodes => { TO toCCi, - --TO (intersect, CCi, CCi), - --TO (isMember, QQ, CCi), - --TO (isEmpty, CCi), - --TO (isSubset, RRi, CCi), - --TO span, }, } diff --git a/M2/Macaulay2/tests/normal/RRi.m2 b/M2/Macaulay2/tests/normal/RRi.m2 index a0d79b82484..030f4b50849 100644 --- a/M2/Macaulay2/tests/normal/RRi.m2 +++ b/M2/Macaulay2/tests/normal/RRi.m2 @@ -48,8 +48,8 @@ assert (abs(K)===interval(0,3)) assert (midpoint(I) == J) assert (diameter(I) == 2) assert isMember(numeric_100 pi,numericInterval_100 pi) -L = interval(-2/3,1.5_(RR_53)) -M = interval(-4,2.7) +L := interval(-2/3,1.5_(RR_53)) +M := interval(-4,2.7) assert (L+M===interval(-14/3,4.2)) assert isSubset(interval(-10.1/3,5.5),L-M) assert isSubset(interval(-6,4.05),L*M) @@ -73,6 +73,51 @@ assert (acosh(I) >= 0) assert (interval(1+2*ii,2+3*ii)*interval (1+3*ii,2+4*ii) == interval(-11 + 5*ii , -2+14*ii)) +FF := CCi_1000 +assert(precision FF===1000) +I := interval(1+2*ii,3+4*ii) +assert not (I===interval(3+2*ii,1+4*ii)) +assert isEmpty interval(3+2*ii,1+4*ii) +assert (I===span(3+2*ii,1+4*ii)) +assert (I===interval[1+2*ii,3+4*ii]) +assert (precision ring I === 53) +assert (precision interval(1_(RR_100)+2_(RR_300)*ii,3_(RR_1000)+4_(RR_200)*ii)==100) +assert (precision (interval(Precision=>100,1+2*ii,3+4*ii)+interval(Precision=>200,5+6*ii,7+8*ii)) == 100) +assert (precision toCCi(100,1,3) == 100) +assert (precision toCCi(2,3) == 53) +assert (precision toCCi(2_(RR_100),3)==100) +assert (toCCi(interval(1,3),interval(2,4)) == interval(1+2*ii,3+4*ii)) +assert(toString FF === "CCi_1000") +assert(expression FF === new Subscript from {symbol CCi,1000}) +assert(realPart I === interval(1,3)) +assert(imaginaryPart I === interval(2,4)) +assert(midpoint I === 2+3*ii) +J := toCCi(1+4*ii) +assert(isSubset(J,I)) +assert(J==J) +assert(I===I) +assert(I==interval(1+2*ii,3+4*ii)) +assert(I+J===J+I) +assert(I*J===J*I) +K := interval(-1-2*ii,3+4*ii) +assert(not (K*K === K^2)) +assert(diameter I < 3) +assert(isSubset(interval(1,5),abs I)) +assert(J == 1+4*ii) +assert(isFinite I) +assert(not isFinite (I/K)) +assert(not isInfinite I) +assert(isInfinite (I/K)) +assert isANumber(I) +assert isANumber(I/K) +assert isMember(sqrt(midpoint I),sqrt I) +L := interval(-2/3+1.5_(RR_53)*ii,4+2.7*ii) +M := toCCi(interval((-2/3)_(RR_53)+1,7),interval(3.5,6.7)) +assert(I+L == M) +assert isSubset(toCCi(interval(-23/3,10/3),interval(-5,-.8)),L-M) +assert isSubset(K^2,K*K) +assert not isSubset(K*K,K^2) +assert isSubset(toCCi(interval(-14,17),interval(-10,24)),L*K) --- TO FIX: --------------------------------------------- From dd6fcce7bfac0379beed2eb9401f837719fa5de8 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 25 Nov 2025 10:38:14 -0500 Subject: [PATCH 164/691] Small typo fixed in numbers --- M2/Macaulay2/tests/normal/numbers.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/tests/normal/numbers.m2 b/M2/Macaulay2/tests/normal/numbers.m2 index 0e25de58e27..c56e53d9596 100644 --- a/M2/Macaulay2/tests/normal/numbers.m2 +++ b/M2/Macaulay2/tests/normal/numbers.m2 @@ -309,7 +309,7 @@ assert( instance(log(-3.,-2), CC) ) assert( instance(log(-3/1,-2), CC) ) assert( instance(log(-3,-2), CC) ) assert( instance(log(-3, toRRi(-2)), CCi) ) -assert( instance(log(-3, toCCii(-2)), CCi) ) +assert( instance(log(-3, toCCi(-2)), CCi) ) assert( instance(log(3.,2.), RR) ) assert( instance(log(3/1,2.), RR) ) From a07432a2f13cd261d4579be74cd6098cb1d61dfb Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 25 Nov 2025 10:54:05 -0500 Subject: [PATCH 165/691] Fixed merge fail --- M2/Macaulay2/d/gmp.d | 4 ---- 1 file changed, 4 deletions(-) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index c7d1bc0316b..960bde65464 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1199,14 +1199,10 @@ export toCCi(x:RR,y:RRi):CCi := ( else CCi(toRRi(x,precision0(y)),y) ); -export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); - export nanCCi(prec:ulong):CCi := (x := nanRR(prec); toCCi(x,x)); export infinityCCi(prec:ulong):CCi := (x := infinityRR(prec,1); toCCi(x,x)); -export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); - export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); export toCCi(x:RRi):CCi := CCi(x,toRRi(0,precision0(x))); From be3d338e6c94936516905759b346c2dd0a4f7423 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 25 Nov 2025 11:20:16 -0500 Subject: [PATCH 166/691] Fixed typo in documentation for CCi --- M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index 2d7921cefa2..4b642103a95 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -515,7 +515,7 @@ document { "2 * I", "(2+3*ii) * I"}, "The real and imaginary parts of a complex interval can be accessed with ", TO "realPart", " and ", TO "imaginaryPart", ". These are real intervals of class ", TO "RRi", ". The ", TO "diameter", " of a complex interval is the (rounded) approximation to the length of its diagonal, while its ", TO "midpoint", " is the complex midpoint of its real and imaginary parts", - EXAMPLE {"realPart interval(1+2*ii,3+4*ii)","imaginaryPart interval(1+2*ii,3+4*ii)","realPart diameter(1+2*ii,3+4*ii)","midpoint interval(1+2*ii,3+4*ii)"}, + EXAMPLE {"realPart interval(1+2*ii,3+4*ii)","imaginaryPart interval(1+2*ii,3+4*ii)","diameter(1+2*ii,3+4*ii)","midpoint interval(1+2*ii,3+4*ii)"}, SeeAlso => { RRi, toCCi, From 4b91e7d08b8a6d59871205a9d675a5a879dd1042 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 25 Nov 2025 11:55:01 -0500 Subject: [PATCH 167/691] Fixed the typo on the typo --- M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 index 4b642103a95..1ae227a16c0 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_rings.m2 @@ -515,7 +515,7 @@ document { "2 * I", "(2+3*ii) * I"}, "The real and imaginary parts of a complex interval can be accessed with ", TO "realPart", " and ", TO "imaginaryPart", ". These are real intervals of class ", TO "RRi", ". The ", TO "diameter", " of a complex interval is the (rounded) approximation to the length of its diagonal, while its ", TO "midpoint", " is the complex midpoint of its real and imaginary parts", - EXAMPLE {"realPart interval(1+2*ii,3+4*ii)","imaginaryPart interval(1+2*ii,3+4*ii)","diameter(1+2*ii,3+4*ii)","midpoint interval(1+2*ii,3+4*ii)"}, + EXAMPLE {"realPart interval(1+2*ii,3+4*ii)","imaginaryPart interval(1+2*ii,3+4*ii)","diameter interval(1+2*ii,3+4*ii)","midpoint interval(1+2*ii,3+4*ii)"}, SeeAlso => { RRi, toCCi, From 2ee34f70d1bbed868ea950f96430a360b2be0587 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 25 Nov 2025 16:09:19 -0500 Subject: [PATCH 168/691] Fixed test, I think --- M2/Macaulay2/tests/normal/RRi.m2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/tests/normal/RRi.m2 b/M2/Macaulay2/tests/normal/RRi.m2 index 030f4b50849..34bee329d5e 100644 --- a/M2/Macaulay2/tests/normal/RRi.m2 +++ b/M2/Macaulay2/tests/normal/RRi.m2 @@ -17,7 +17,7 @@ assert (precision toRRi(30) == 53) assert (precision toRRi(10_(RR_100)) == 100) assert (toRRi(4) == interval(4)) assert(toString FF === "RRi_1000") -assert(expression FF === new Subscript from {symbol RRi,1000}) +assert(expression FF === new Subscript from {RRi,1000}) assert(left I === 1_(RR_53)) assert(right I === 3_(RR_53)) assert(midpoint I === 2_(RR_53)) @@ -88,7 +88,7 @@ assert (precision toCCi(2,3) == 53) assert (precision toCCi(2_(RR_100),3)==100) assert (toCCi(interval(1,3),interval(2,4)) == interval(1+2*ii,3+4*ii)) assert(toString FF === "CCi_1000") -assert(expression FF === new Subscript from {symbol CCi,1000}) +assert(expression FF === new Subscript from {CCi,1000}) assert(realPart I === interval(1,3)) assert(imaginaryPart I === interval(2,4)) assert(midpoint I === 2+3*ii) From 3d965629fe5c6a69c0d2260178ef2075c6dce8b0 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 26 Nov 2025 08:58:52 -0500 Subject: [PATCH 169/691] Deleting old backup --- M2/Macaulay2/d/gmp-old.d | 2973 -------------------------------------- 1 file changed, 2973 deletions(-) delete mode 100644 M2/Macaulay2/d/gmp-old.d diff --git a/M2/Macaulay2/d/gmp-old.d b/M2/Macaulay2/d/gmp-old.d deleted file mode 100644 index e89aba79505..00000000000 --- a/M2/Macaulay2/d/gmp-old.d +++ /dev/null @@ -1,2973 +0,0 @@ ---This file contains gmp declarations and elementary functions. ---Functions in this file should not need to make calls to stdio. - -use arithmetic; -use stdiop0; - -declarations " - #include -"; - -header " - #include \"gmp_aux.h\" - #include -"; - --- We introduce two types of big gmp-type integers here. One type is mutable, and the vector of limbs gets --- allocated with the standard memory allocator used by libgmp when we use --- gmp routines to create the integers. The other type is immutable, and the limbs are allocated with libgc --- by us in final step after the computation. The types ZZmutable and ZZ are distinct in the D language, so --- neither one can be used as the other, but the underlying pointer types are the same, except that mpz_srcptr --- is const, so an mpz_ptr can be used as an mpz_srcptr, perhaps mistakenly. -export ZZmutable := Pointer "mpz_ptr"; - -export ZZ := Pointer "mpz_srcptr"; - -export ZZorNull := ZZ or null; - -export ZZcell := {+v:ZZ}; - -export ZZpair := {a:ZZ,b:ZZ}; - -export ZZpairOrNull := ZZpair or null; - -export QQmutable := Pointer "mpq_ptr"; - -export QQ := Pointer "mpq_srcptr"; - -export QQorNull := QQ or null; - -export QQcell := {+v:QQ}; - -export RR := Pointer "mpfr_srcptr"; - -export RRorNull := RR or null; - -export RRcell := {+v:RR}; - -export RRimutable := Pointer "mpfi_ptr"; - -export RRi := Pointer "mpfi_srcptr"; -export leftRR(x:RRi):RR := Ccode( RR, "&", x, "->left" ); -export rightRR(x:RRi):RR := Ccode( RR, "&", x, "->right" ); - -export RRiorNull := RRi or null; - -export RRicell := {+v:RRi}; - -export RRmutable := Pointer "mpfr_ptr"; - -export CCmutable := { re:RRmutable, im:RRmutable }; - -export CC := { re:RR, im:RR }; - -export CCorNull := CC or null; - -export CCcell := {+v:CC}; - -export CCimutable := { re:RRimutable, im:RRimutable }; - -export CCi := { re:RRi, im:RRi }; - -export CCiorNull := CCi or null; - -export CCicell := {+v:CCi}; - -dummy(x:RR):string := ""; -dummyi(x:RRi):string := ""; -- Added for MPFI -dummyCCi(x:CCi):string := ""; -- Added for MPFI - -export tostringRRpointer := dummy; -export tostringRRipointer := dummyi; -- Added for MPFI -export tostringCCipointer := dummyCCi; -- Added for MPFI -dummy(x:CC):string := ""; - -export tonetCCpointer := dummy; - -export tonetCCparenpointer := dummy; - -dummy(x:CCi):string := ""; - -export tonetCCipointer := dummy; - -export tonetCCiparenpointer := dummy; - -export min(x:int,y:int):int := if x= 8") then int64_t(toLong(x)) - else ( - rop := int64_t(0); - Ccode(void, "mpz_export(&", rop, ", NULL, 1, 8, 0, 0, ", x, ")"); - if isNegative0(x) then -rop else rop)); -export toInt64(x:ZZcell):int64_t := toInt64(x.v); - -export toUInt64(x:ZZ):uint64_t := ( - if Ccode(bool, "sizeof(long) >= 8") then uint64_t(toULong(x)) - else ( - rop := uint64_t(0); - Ccode(void, "mpz_export(&", rop, ", NULL, 1, 8, 0, 0, ", x, ")"); - rop)); -export toUInt64(x:ZZcell):uint64_t := toUInt64(x.v); - -export minprec := Ccode(ulong,"MPFR_PREC_MIN"); - -export maxprec := Ccode(ulong,"MPFR_PREC_MAX"); - -export hash(x:ZZ):hash_t := ( - if isInt(x) then hash_t(0x7fffffff & toInt(x)) - else Ccode(hash_t, "mpz_hash(", -- see gmp_aux.c for this function - x, ")")); - -getstr(str:charstarOrNull, base:int, x:ZZ) ::= Ccode(charstarOrNull, "mpz_get_str(", str, ",", base, ",", x, ")" ); - -init(x:ZZmutable) ::= Ccode( ZZmutable, "(mpz_init(", x, "),",x,")" ); - -export newZZmutable():ZZmutable := init(GCmalloc(ZZmutable)); - -export clear(x:ZZmutable) ::= Ccode( void, "mpz_clear(", x, ")" ); - -init(x:QQmutable) ::= Ccode( QQmutable, "(mpq_init(", x, "),",x,")" ); - -export newQQmutable():QQmutable := init(GCmalloc(QQmutable)); - -clear(x:QQmutable) ::= Ccode( void, "mpq_clear(", x, ")" ); - -init(x:RRmutable,prec:ulong):RRmutable := ( - if prec < minprec then prec = minprec else if prec > maxprec then prec = maxprec; - Ccode( RRmutable, "(mpfr_init2(", x, ",(mpfr_prec_t)",prec,"),",x,")" ) - ); - -init(x:RRimutable,prec:ulong):RRimutable := ( - if prec < minprec then prec = minprec else if prec > maxprec then prec = maxprec; - Ccode( RRimutable, "(mpfi_init2(", x, ",(mpfr_prec_t)",prec,"),",x,")" ) - ); - -export newRRmutable(prec:ulong):RRmutable := init(GCmalloc(RRmutable),prec); - -export newRRimutable(prec:ulong):RRimutable := init(GCmalloc(RRimutable),prec); - -clear(x:RRmutable) ::= Ccode( void, "mpfr_clear(", x, ")" ); - -clear(x:RRimutable) ::= Ccode( void, "mpfi_clear(", x, ")" ); - -clear(z:CCmutable):void := ( clear(z.re); clear(z.im); ); - -clear(z:CCimutable):void := (clear(z.re);clear(z.im);); - -export moveToZZ(z:ZZmutable):ZZ := ( - y := GCmalloc(ZZmutable); - Ccode(void, " - int s = z->_mp_size, ss = s>=0 ? s : -s; - mp_limb_t *p = (mp_limb_t *)getmem_atomic(ss * sizeof(mp_limb_t)); - memcpy(p,z->_mp_d,ss*sizeof(mp_limb_t)); - ",y,"->_mp_alloc = ss, ",y,"->_mp_size = s, ",y,"->_mp_d = p; - "); - Ccode(ZZ,y)); - -export moveToZZandclear(z:ZZmutable):ZZ := ( - w := moveToZZ(z); - clear(z); - w); - -export moveToRR(z:RRmutable):RR := ( - y := GCmalloc(RRmutable); - Ccode(void, " - int limb_size = (",z,"->_mpfr_prec - 1) / GMP_NUMB_BITS + 1; - mp_limb_t *p = (mp_limb_t*) getmem_atomic(limb_size * sizeof(mp_limb_t)); - memcpy(p, ",z,"->_mpfr_d, limb_size * sizeof(mp_limb_t)); - ",y,"->_mpfr_prec = ",z,"->_mpfr_prec; - ",y,"->_mpfr_sign = ",z,"->_mpfr_sign; - ",y,"->_mpfr_exp = ",z,"->_mpfr_exp; - ",y,"->_mpfr_d = p; - "); - Ccode(RR,y) - ); - -export moveToRRi(z:RRimutable):RRi := ( - y := GCmalloc(RRimutable); - - -- left - Ccode(void, " - int limb_size = (",z,"->left._mpfr_prec - 1) / GMP_NUMB_BITS + 1; - mp_limb_t *p = (mp_limb_t*) getmem_atomic(limb_size * sizeof(mp_limb_t)); - memcpy(p, ",z,"->left._mpfr_d, limb_size * sizeof(mp_limb_t)); - ",y,"->left._mpfr_prec = ",z,"->left._mpfr_prec; - ",y,"->left._mpfr_sign = ",z,"->left._mpfr_sign; - ",y,"->left._mpfr_exp = ",z,"->left._mpfr_exp; - ",y,"->left._mpfr_d = p; - "); - - -- right - Ccode(void, " - limb_size = (",z,"->right._mpfr_prec - 1) / GMP_NUMB_BITS + 1; - p = (mp_limb_t*) getmem_atomic(limb_size * sizeof(mp_limb_t)); - memcpy(p, ",z,"->right._mpfr_d, limb_size * sizeof(mp_limb_t)); - ",y,"->right._mpfr_prec = ",z,"->right._mpfr_prec; - ",y,"->right._mpfr_sign = ",z,"->right._mpfr_sign; - ",y,"->right._mpfr_exp = ",z,"->right._mpfr_exp; - ",y,"->right._mpfr_d = p; - "); - - Ccode(RRi,y) - ); - -export moveToRRandclear(z:RRmutable):RR := ( - w := moveToRR(z); - clear(z); - w); - -export moveToRRiandclear(z:RRimutable):RRi := ( - w := moveToRRi(z); - clear(z); - w); - -export set(x:ZZmutable, y:ZZ ) ::= Ccode( void, "mpz_set (", x, ",", y, ")" ); -set(x:ZZmutable, n:int ) ::= Ccode( void, "mpz_set_si(", x, ",", n, ")" ); -set(x:ZZmutable, n:uint ) ::= Ccode( void, "mpz_set_ui(", x, ",", n, ")" ); -set(x:ZZmutable, n:long ) ::= Ccode( void, "mpz_set_si(", x, ",", n, ")" ); -set(x:ZZmutable, n:ulong) ::= Ccode( void, "mpz_set_ui(", x, ",", n, ")" ); -set(x:ZZmutable, s:charstar, base:int):int := Ccode( - int, "mpz_set_str(", x, ", ", s, ", ", base, ")"); - -negsmall := -100; -possmall := 300; -smallints := ( - new array(ZZ) len possmall - negsmall + 1 do for i from negsmall to possmall do ( - x := newZZmutable(); - set(x,i); - provide moveToZZandclear(x))); - -export toInteger(i:int):ZZ := ( - if i >= negsmall && i <= possmall then smallints.(i-negsmall) - else ( - x := newZZmutable(); - set(x,i); - moveToZZandclear(x))); - -export toInteger(i:uint):ZZ := ( - if i <= uint(possmall) then smallints.(int(i)-negsmall) - else ( - x := newZZmutable(); - set(x,i); - moveToZZandclear(x))); - -export zeroZZ := toInteger(0); - -export oneZZ := toInteger(1); - -export minusoneZZ := toInteger(-1); - -export zeroZZcell := ZZcell(zeroZZ); - -export oneZZcell := ZZcell( oneZZ); - -export minusoneZZcell := ZZcell( minusoneZZ); - -export toInteger(i:ushort):ZZ := toInteger(int(i)); - -export toInteger(i:ulong):ZZ := ( - if i <= ulong(possmall) then smallints.(int(i)-negsmall) - else ( - x := newZZmutable(); - set(x,i); - moveToZZandclear(x))); - -export toInteger(i:long):ZZ := ( - if i >= long(negsmall) && i <= long(possmall) then smallints.(int(i)-negsmall) - else ( - x := newZZmutable(); - set(x,i); - moveToZZandclear(x))); - --- ints are at least 16 bits, so cast 8- and 16-bit fixed-width ints to int -export toInteger(i:int8_t ):ZZ := toInteger(int(i)); -export toInteger(i:uint8_t ):ZZ := toInteger(uint(i)); -export toInteger(i:int16_t ):ZZ := toInteger(int(i)); -export toInteger(i:uint16_t):ZZ := toInteger(uint(i)); --- longs are at least 32 bits, so cast 32-bit fixed-width ints to long -export toInteger(i:int32_t ):ZZ := toInteger(long(i)); -export toInteger(i:uint32_t):ZZ := toInteger(ulong(i)); - -export toInteger(s:charstar, base:int):ZZorNull := ( - x := newZZmutable(); - if set(x, s, base) == 0 - then ZZorNull(moveToZZandclear(x)) - else ( - clear(x); - ZZorNull(null()))); - -neg(x:ZZmutable, y:ZZ) ::= Ccode( void, "mpz_neg(", x, ",", y, ")" ); - -export - (x:ZZ) : ZZ := ( - w := newZZmutable(); - neg(w,x); - moveToZZandclear(w)); - -export toInteger(i:int64_t):ZZ := ( - if i >= int64_t(negsmall) && i <= int64_t(possmall) then ( - smallints.(int(i) - negsmall)) - else if Ccode(bool, "sizeof(long) >= 8") then toInteger(long(i)) - else ( - isneg := i < int64_t(0); - absi := if isneg then -i else i; - x := newZZmutable(); - Ccode(void, "mpz_import(", x, ", 1, 1, 8, 0, 0, &", absi, ")"); - if isneg then -moveToZZandclear(x) - else moveToZZandclear(x))); -export toInteger(i:uint64_t):ZZ := ( - if i <= uint64_t(possmall) then smallints.(int(i) - negsmall) - else if Ccode(bool, "sizeof(long) >= 8") then toInteger(ulong(i)) - else ( - x := newZZmutable(); - Ccode(void, "mpz_import(", x, ", 1, 1, 8, 0, 0, &", i, ")"); - moveToZZandclear(x))); -export toInteger(i:hash_t):ZZ := toInteger(uint64_t(i)); - -abs(x:ZZmutable, y:ZZ) ::= Ccode( void, "mpz_abs(", x, ",", y, ")" ); - -export abs(x:ZZ) : ZZ := ( - if isNegative0(x) then ( - w := newZZmutable(); - abs(w,x); - moveToZZandclear(w)) - else x - ); -add(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_add(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) + (y:ZZ) : ZZ := ( - w := newZZmutable(); - add(w,x,y); - moveToZZandclear(w)); -add(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_add_ui(", x, ",", y, ",", z, ")" ); -sub(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_sub(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) - (y:ZZ) : ZZ := ( - w := newZZmutable(); - sub(w,x,y); - moveToZZandclear(w)); -compare(x:ZZ, y:ZZ) ::= Ccode( int, "mpz_cmp(", x, ",", y, ")" ); - -export (x:ZZ) === (y:ZZ) : bool := compare(x,y) == 0; - -export (x:ZZ) > (y:ZZ) : bool := compare(x,y) > 0; - -export (x:ZZ) < (y:ZZ) : bool := compare(x,y) < 0; - -export (x:ZZ) >= (y:ZZ) : bool := compare(x,y) >= 0; - -export (x:ZZ) <= (y:ZZ) : bool := compare(x,y) <= 0; -compare(x:ZZ, y:long) ::= Ccode( int, "mpz_cmp_si(", x, ",", y, ")" ); - -export (x:ZZ) > (y:int) : bool := compare(x,long(y)) > 0; - -export (x:ZZ) >= (y:int) : bool := compare(x,long(y)) >= 0; - -export (x:ZZ) === (y:int) : bool := compare(x,long(y)) == 0; - -export (x:ZZcell) === (y:int) : bool := compare(x.v,long(y)) == 0; - -export (x:ZZ) < (y:int) : bool := compare(x,long(y)) < 0; - -export (x:ZZ) <= (y:int) : bool := compare(x,long(y)) <= 0; - -export (x:int) < (y:ZZ) : bool := y > x; - -export (x:int) > (y:ZZ) : bool := y < x; - -export (x:int) <= (y:ZZ) : bool := y >= x; - -export (x:int) >= (y:ZZ) : bool := y <= x; - -export (x:int) === (y:ZZ) : bool := y === x; -sub(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_sub_ui(", x, ",", y, ",", z, ")" ); -mul(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_mul(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) * (y:ZZ) : ZZ := ( - w := newZZmutable(); - mul(w,x,y); - moveToZZandclear(w)); -mul(x:ZZmutable, y:ZZ, z:int) ::= Ccode( void, "mpz_mul_si(", x, ",", y, ",", z, ")" ); -mul(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_mul_ui(", x, ",", y, ",", z, ")" ); -pow(x:ZZmutable, y:ZZ, n:ulong) ::= Ccode( void, "mpz_pow_ui(", x, ",", y, ",", n, ")" ); - -export (x:ZZ) ^ (n:ulong) : ZZ := ( - w := newZZmutable(); - pow(w,x,n); - moveToZZandclear(w)); - -cdiv(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_cdiv_q(", x, ",", y, ",", z, ")" ); -fdiv(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_fdiv_q(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) // (y:ZZ) : ZZ := ( - w := newZZmutable(); - if isPositive0(y) then fdiv(w,x,y) else cdiv(w,x,y); - moveToZZandclear(w)); - -fmod(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_fdiv_r(", x, ",", y, ",", z, ")" ); -cmod(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_cdiv_r(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) % (y:ZZ) : ZZ := ( - w := newZZmutable(); - if isPositive0(y) then fmod(w,x,y) else cmod(w,x,y); - moveToZZandclear(w)); - -fdiv(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_fdiv_q_ui(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) // (y:ulong) : ZZ := ( - w := newZZmutable(); - fdiv(w,x,y); - moveToZZandclear(w)); - -export (x:ZZ) // (y:ushort) : ZZ := x // ulong(y); - -fmod(y:ZZ, z:ulong) ::= Ccode( ulong, "mpz_fdiv_ui(", y, ",", z, ")" ); - -export (x:ZZ) % (y:ulong) : ulong := fmod(x,y); - -export (x:ZZ) % (y:ushort) : ushort := ushort(x % ulong(y)); - -export nextPrime(x:ZZ):ZZ := ( - w := newZZmutable(); - Ccode(void, "mpz_nextprime(", w, ", ", x, ")"); - moveToZZandclear(w)); - -gcd(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_gcd(", x, ",", y, ",", z, ")" ); - -export gcd(x:ZZ,y:ZZ):ZZ := ( - w := newZZmutable(); - gcd(w,x,y); - moveToZZandclear(w)); - -mul_2exp(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_mul_2exp(", x, ",", y, ",", z, ")" ); - -leftshift(x:ZZ,n:ulong):ZZ := ( - w := newZZmutable(); - mul_2exp(w,x,n); - moveToZZandclear(w)); - -tdiv_q_2exp(x:ZZmutable, y:ZZ, z:ulong) ::= Ccode( void, "mpz_tdiv_q_2exp(", x, ",", y, ",", z, ")" ); - -rightshift(x:ZZ,n:ulong):ZZ := ( - w := newZZmutable(); - tdiv_q_2exp(w,x,n); - moveToZZandclear(w)); - -export (x:ZZ) << (n:int) : ZZ := ( - if n == 0 then x else if n > 0 then leftshift(x,ulong(n)) else rightshift(x,ulong(-n)) - ); - -export (x:ZZ) >> (n:int) : ZZ := ( - if n == 0 then x else if n > 0 then rightshift(x,ulong(n)) else leftshift(x,ulong(-n)) - ); - -and(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_and(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) & (y:ZZ) : ZZ := ( - w := newZZmutable(); - and(w,x,y); - moveToZZandclear(w)); - -ior(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_ior(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) | (y:ZZ) : ZZ := ( - w := newZZmutable(); - ior(w,x,y); - moveToZZandclear(w)); - -xor(x:ZZmutable, y:ZZ, z:ZZ) ::= Ccode( void, "mpz_xor(", x, ",", y, ",", z, ")" ); - -export (x:ZZ) ^^ (y:ZZ) : ZZ := ( - w := newZZmutable(); - xor(w,x,y); - moveToZZandclear(w)); - -not(x:ZZmutable, y:ZZ) ::= Ccode(void, "mpz_com(", x, ",", y, ")"); - -export not(y:ZZ) : ZZ := ( - x := newZZmutable(); - not(x, y); - moveToZZandclear(x)); - -toCstring(x:ZZ, base:int) ::= getstr(charstarOrNull(null()), base, x); - -export tostring(x:ZZ, base:int):string := ( - cstr := toCstring(x, base); - ret := tostring(cstr); - Ccode(void,"mp_free_str(", cstr, ")"); - ret); -export tostring(x:ZZ):string := tostring(x, 10); - -export (x:int) + (y:ZZ) : ZZ := toInteger(x) + y; - -export (x:ZZ) + (y:int) : ZZ := x + toInteger(y); - -export (x:ulong) + (y:ZZ) : ZZ := toInteger(x) + y; - -export (x:ZZ) + (y:ulong) : ZZ := x + toInteger(y); - -export (x:int) - (y:ZZ) : ZZ := toInteger(x) - y; - -export (x:ZZ) - (y:int) : ZZ := x - toInteger(y); - -export (x:int) * (y:ZZ) : ZZ := toInteger(x) * y; - -export (x:ZZ) * (y:int) : ZZ := x * toInteger(y); - -export (x:ulong) * (y:ZZ) : ZZ := toInteger(x) * y; - -export (x:ZZ) * (y:ulong) : ZZ := x * toInteger(y); - -export (x:int) ^ (y:ulong) : ZZ := toInteger(x) ^ y; - - - --- Integers and doubles - -get_d(x:ZZ) ::= Ccode( double, "mpz_get_d(", x, ")" ); - -export toDouble(x:ZZ):double := get_d(x); - -export toDouble(x:ZZcell):double := get_d(x.v); - -export (x:double) + (y:ZZ) : double := x + toDouble(y); - -export (x:ZZ) + (y:double) : double := toDouble(x) + y; - -export (x:double) - (y:ZZ) : double := x - toDouble(y); - -export (x:ZZ) - (y:double) : double := toDouble(x) - y; - -export (x:double) * (y:ZZ) : double := x * toDouble(y); - -export (x:ZZ) * (y:double) : double := toDouble(x) * y; - -export (x:double) / (y:ZZ) : double := x / toDouble(y); - -export (x:ZZ) / (y:double) : double := toDouble(x) / y; - -export (x:double) ^ (n:ZZ) : double := pow(x,toDouble(n)); - -export (x:ZZ) > (y:double) : bool := toDouble(x) > y; - -export (x:ZZ) < (y:double) : bool := toDouble(x) < y; - -export (x:ZZ) >= (y:double) : bool := toDouble(x) >= y; - -export (x:ZZ) <= (y:double) : bool := toDouble(x) <= y; - -export (x:double) < (y:ZZ) : bool := x < toDouble(y); - -export (x:double) > (y:ZZ) : bool := x > toDouble(y); - -export (x:double) <= (y:ZZ) : bool := x <= toDouble(y); - -export (x:double) >= (y:ZZ) : bool := x >= toDouble(y); - -log(x:double) ::= Ccode(double, "log(", x, ")" ); -logtwo := log(2.); -bigint := 2147483647.; -- 2^31-1 - -(x:double) << (n:int) ::= ldexp(x, n); -(x:double) >> (n:int) ::= ldexp(x,-n); - ------------------------------------------------------------------------------ --- rationals ------------------------------------------------------------------------------ - --- TO DO : this is inefficient -- we could just grab the numerator without copying its limbs -export numerator(x:QQ):ZZ := ( - w := newZZmutable(); - Ccode( void, "mpq_get_num(", w, ",", x, ")" ); - moveToZZandclear(w)); - --- TO DO : this is inefficient -- we could just grab the denominator without copying its limbs -export denominator(x:QQ):ZZ := ( - w := newZZmutable(); - Ccode( void, "mpq_get_den(", w, ",", x, ")" ); - moveToZZandclear(w)); - -export numeratorRef (x:QQ) ::= Ccode( ZZ, "mpq_numref(", x, ")"); - -export denominatorRef(x:QQ) ::= Ccode( ZZ, "mpq_denref(", x, ")"); - -export numeratorRef (x:QQmutable) ::= Ccode( ZZmutable, "mpq_numref(", x, ")"); - -export denominatorRef(x:QQmutable) ::= Ccode( ZZmutable, "mpq_denref(", x, ")"); - -export hash(x:QQ):hash_t := hash(numeratorRef(x))+1299841*hash(denominatorRef(x)); - -export sign(x:QQ):int := Ccode(int, "mpq_sgn(",x,")"); -isZero0 (x:QQ):bool := 0 == sign(x); -isNegative0(x:QQ):bool := -1 == sign(x); - -export isZero (x:QQ):bool := isZero0(x); -export isNegative(x:QQ):bool := isNegative0(x); - -export newQQCanonical(i:ZZ,j:ZZ):QQ := ( - -- assume canonical: gcd(i,j)=1, j>0, and j==1 if i==0 - Ccode(void, " - mpq_ptr z = (mpq_ptr) getmem(sizeof(__mpq_struct)); - memcpy(&z->_mp_num,",i,",sizeof(__mpz_struct)); - memcpy(&z->_mp_den,",j,",sizeof(__mpz_struct))" - ); - Ccode(QQ,"z")); - -moveToQQ(y:QQmutable):QQ := newQQCanonical(moveToZZ(numeratorRef(y)),moveToZZ(denominatorRef(y))); - -export moveToQQandclear(z:QQmutable):QQ := ( - w := moveToQQ(z); - clear(z); - w); - -export newQQ(i:ZZ,j:ZZ):QQ := ( - x := newQQmutable(); - set( numeratorRef(x),i); - set(denominatorRef(x),j); - Ccode(void, "mpq_canonicalize(",x,")"); - moveToQQandclear(x) - ); - --- integers and rationals - -export toRational(x:ZZ):QQ := newQQCanonical(x,oneZZ); - -export toRational(n:int):QQ := toRational(toInteger(n)); - -export toRational(n:ulong):QQ := toRational(toInteger(n)); - -export floor(x:QQ):ZZ := numeratorRef(x)//denominatorRef(x); - -export (x:QQ) + (y:QQ) : QQ := ( - z := newQQmutable(); - Ccode( void, "mpq_add(", z, ",", x, ",", y, ")" ); - moveToQQandclear(z)); - -export - (y:QQ) : QQ := ( - z := newQQmutable(); - Ccode( void, "mpq_neg(", z, ",", y, ")" ); - moveToQQandclear(z)); - -export abs(x:QQ) : QQ := if isNegative0(x) then -x else x; - -export inv(y:QQ) : QQ := ( -- reciprocal - z := newQQmutable(); - Ccode( void, "mpq_inv(", z, ",", y, ")" ); - moveToQQandclear(z)); - -export (x:QQ) - (y:QQ) : QQ := ( - z := newQQmutable(); - Ccode( void, "mpq_sub(", z, ",", x, ",", y, ")" ); - moveToQQandclear(z)); - -export (x:QQ) * (y:QQ) : QQ := ( - z := newQQmutable(); - Ccode( void, "mpq_mul(", z, ",", x, ",", y, ")" ); - moveToQQandclear(z)); - -export (x:QQ) / (y:QQ) : QQ := ( - z := newQQmutable(); - Ccode( void, "mpq_div(", z, ",", x, ",", y, ")" ); - moveToQQandclear(z)); - -export (x:QQ) === (y:QQ) : bool := Ccode( bool, "mpq_equal(", x, ",", y, ")"); - -export (x:QQ) + (y:ZZ ) : QQ := x + toRational(y); - -export (x:QQ) + (y:int ) : QQ := x + toRational(y); - -export (x:ZZ ) + (y:QQ) : QQ := toRational(x) + y; - -export (x:int ) + (y:QQ) : QQ := toRational(x) + y; - -export (x:QQ) - (y:ZZ ) : QQ := x - toRational(y); - -export (x:QQ) - (y:int ) : QQ := x - toRational(y); - -export (x:ZZ ) - (y:QQ) : QQ := toRational(x) - y; - -export (x:int ) - (y:QQ) : QQ := toRational(x) - y; - -export (x:QQ) * (y:ZZ ) : QQ := x * toRational(y); - -export (x:QQ) * (y:int ) : QQ := x * toRational(y); - -export (x:ZZ ) * (y:QQ) : QQ := toRational(x) * y; - -export (x:int ) * (y:QQ) : QQ := toRational(x) * y; - -export (x:ZZ ) / (y:ZZ ) : QQ := toRational(x)/toRational(y); - -export (x:QQ) / (y:ZZ ) : QQ := x / toRational(y); - -export (x:QQ) / (y:int ) : QQ := x / toRational(y); - -export (x:ZZ ) / (y:QQ) : QQ := toRational(x) / y; - -export (x:int ) / (y:QQ) : QQ := toRational(x) / y; - - -export tostring(x:QQ):string := tostring(numeratorRef(x)) + '/' + tostring(denominatorRef(x)); - - -export (x:QQ) === (y:ZZ) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; - -export (x:QQ) === (y:int) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; - -export (y:ZZ) === (x:QQ) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; - -export (y:int) === (x:QQ) : bool := denominatorRef(x) === 1 && numeratorRef(x) === y; - -compare(x:QQ, y:QQ) ::= Ccode( int, - "mpq_cmp(", x, ",", y, ")" ); -compare(x:QQ, y:ulong) ::= Ccode( int, "mpq_cmp_ui(", x, ",", y, ",1)"); -compare(x:QQ, y: long) ::= Ccode( int, "mpq_cmp_si(", x, ",", y, ",1)"); -compare(x:QQ, y: int) ::= Ccode( int, "mpq_cmp_si(", x, ",(long)", y, ",1)"); - -export (x:QQ) < (y:QQ) : bool := compare(x,y) < 0; - -export (x:QQ) >= (y:QQ) : bool := compare(x,y) >= 0; - -export (x:QQ) > (y:QQ) : bool := compare(x,y) > 0; - -export (x:QQ) <= (y:QQ) : bool := compare(x,y) <= 0; - -export (x:ZZ) < (y:QQ) : bool := toRational(x) < y; - -export (x:ZZ) <= (y:QQ) : bool := toRational(x) <= y; - -export (x:ZZ) > (y:QQ) : bool := toRational(x) > y; - -export (x:ZZ) >= (y:QQ) : bool := toRational(x) >= y; - -export (x:QQ) < (y:ZZ) : bool := x < toRational(y); - -export (x:QQ) <= (y:ZZ) : bool := x <= toRational(y); - -export (x:QQ) > (y:ZZ) : bool := x > toRational(y); - -export (x:QQ) >= (y:ZZ) : bool := x >= toRational(y); - -export (x:QQ) < (y:int) : bool := compare(x,y) < 0; - -export (x:QQ) >= (y:int) : bool := compare(x,y) >= 0; - -export (x:QQ) > (y:int) : bool := compare(x,y) > 0; - -export (x:QQ) <= (y:int) : bool := compare(x,y) <= 0; - -export (x:int) < (y:QQ) : bool := y > x; - -export (x:int) <= (y:QQ) : bool := y >= x; - -export (x:int) > (y:QQ) : bool := y < x; - -export (x:int) >= (y:QQ) : bool := y <= x; - --- double and rationals - -export toDouble(x:QQ):double := Ccode( double, "mpq_get_d(", x, ")" ); - -export (x:double) + (y:QQ) : double := x + toDouble(y); - -export (x:double) - (y:QQ) : double := x - toDouble(y); - -export (x:double) * (y:QQ) : double := x * toDouble(y); - -export (x:double) / (y:QQ) : double := x / toDouble(y); - -export (x:QQ) + (y:double) : double := toDouble(x) + y; - -export (x:QQ) - (y:double) : double := toDouble(x) - y; - -export (x:QQ) * (y:double) : double := toDouble(x) * y; - -export (x:QQ) / (y:double) : double := toDouble(x) / y; - -export (x:double) < (y:QQ) : bool := x * denominatorRef(y) < numeratorRef(y); - -export (x:double) <= (y:QQ) : bool := x * denominatorRef(y) <= numeratorRef(y); - -export (x:double) > (y:QQ) : bool := x * denominatorRef(y) > numeratorRef(y); - -export (x:double) >= (y:QQ) : bool := x * denominatorRef(y) >= numeratorRef(y); - -export (x:QQ) < (y:double) : bool := numeratorRef(x) < y * denominatorRef(x); - -export (x:QQ) <= (y:double) : bool := numeratorRef(x) <= y * denominatorRef(x); - -export (x:QQ) > (y:double) : bool := numeratorRef(x) > y * denominatorRef(x); - -export (x:QQ) >= (y:double) : bool := numeratorRef(x) >= y * denominatorRef(x); - ------------------------------------------------------------------------------ --- big reals ------------------------------------------------------------------------------ - -export realPart(z:CC):RR := z.re; - -export imaginaryPart(z:CC):RR := z.im; - -export realPart(z:CCi):RRi := z.re; - -export imaginaryPart(z:CCi):RRi := z.im; - --- warning: these routines just check the sign bit, and don't verify finiteness! -export sign(x:RR):int := Ccode(int, "mpfr_sgn(", x, ")"); -isPositive0(x:RR) ::= 1 == sign(x); -isNegative0(x:RR) ::= -1 == sign(x); -isZero0 (x:RR) ::= 0 == sign(x); - -isPositive0(x:RRi) ::= 0 < Ccode(int, "mpfi_is_strictly_pos(", x, ")"); -isNegative0(x:RRi) ::= 0 < Ccode(int, "mpfi_is_strictly_neg(", x, ")"); -isZero0 (x:RRi) ::= 0 < Ccode(int, "mpfi_is_zero(", x, ")"); -contains0 (x:RRi) ::= 0 < Ccode(int, "mpfi_has_zero(", x, ")"); - -flagged0() ::= 0 != Ccode( int, "mpfr_erangeflag_p()" ); -setflag0() ::= Ccode( void, "mpfr_set_erangeflag()" ); -isfinite0(x:RR) ::=Ccode(bool,"mpfr_number_p(",x,")"); -isfinite0(x:RRmutable) ::=Ccode(bool,"mpfr_number_p(",x,")"); -isfinite0(x:RRi) ::=Ccode(bool,"mpfi_bounded_p(",x,")"); -isfinite0(x:RRimutable) ::=Ccode(bool,"mpfi_bounded_p(",x,")"); -isinf0 (x:RR) ::= Ccode(bool,"mpfr_inf_p(",x,")"); -isinf0 (x:RRi) ::= Ccode(bool,"mpfi_inf_p(",x,")"); -isnan0 (x:RR) ::= Ccode(bool,"mpfr_nan_p(",x,")"); -isnan0 (x:RRi) ::= Ccode(bool,"mpfi_nan_p(",x,")"); -sign0(x:RR) ::= 0 != Ccode(int,"mpfr_signbit(",x,")"); -sign0(x:RRi) ::= 0 != Ccode(int,"mpfi_is_strictly_neg(",x,")"); -export isEmpty(x:RRi):bool := Ccode(bool,"mpfi_is_empty(",x,")"); - -exponent0(x:RR) ::= Ccode(long,"(long)mpfr_get_exp(",x,")"); -- sometimes int, sometimes long, see gmp.h for type mp_exp_t -exponent0(x:RRi) ::= max(exponent0(rightRR(x)),exponent0(leftRR(x))); -sizeinbase0(x:ZZ,b:int) ::= Ccode( int, "mpz_sizeinbase(", x, ",", b, ")" ); - --- warning: these routines just check the sign bit, and don't verify finiteness! -export isPositive(x:RR):bool := isPositive0(x); -export isPositive(x:RRi):bool := isPositive0(x); - -export isNegative(x:RR):bool := isNegative0(x); -export isNegative(x:RRi):bool := isNegative0(x); - -export isZero (x:RR):bool := isZero0(x) && isfinite0(x); -export isZero (x:RRi):bool := isZero0(x) && isfinite0(x); - -export isZero (x:CC):bool := isZero0(x.re) && isfinite0(x.re) && isZero0(x.im) && isfinite0(x.im); -export isZero (x:CCi):bool := isZero0(x.re) && isfinite0(x.re) && isZero0(x.im) && isfinite0(x.im); - -export defaultPrecision := ulong(53); -- should 53 be computed? - -export minExponent := Ccode(long,"(long)mpfr_get_emin()-1"); - -export maxExponent := Ccode(long,"(long)mpfr_get_emax()"); - -export exponent(x:ZZ):long := if isZero0(x) then minExponent else long(sizeinbase0(x,2)); - -export exponent(x:RR):long := if isZero0(x) && isfinite0(x) then minExponent else if isfinite0(x) then exponent0(x) else maxExponent; -export exponent(x:RRi):long := if isZero0(x) && isfinite0(x) then minExponent else if isfinite0(x) then exponent0(x) else maxExponent; - -export exponent(x:CC):long := max(exponent(x.re),exponent(x.im)); -export exponent(x:CCi):long := max(exponent(x.re),exponent(x.im)); - -export newCCmutable(prec:ulong):CCmutable := CCmutable(newRRmutable(prec),newRRmutable(prec)); -export newCCimutable(prec:ulong):CCimutable := CCimutable(newRRimutable(prec),newRRimutable(prec)); - -export moveToCC(y:CCmutable):CC := CC(moveToRR(y.re), moveToRR(y.im)); - -export moveToCCandclear(z:CCmutable):CC := ( - w := moveToCC(z); - clear(z); - w); - -export moveToCCi(y:CCimutable):CCi := CCi(moveToRRi(y.re),moveToRRi(y.im)); - -export moveToCCiandclear(z:CCimutable):CCi := ( - w := moveToCCi(z); - clear(z); - w); - -precision0(x:RR) ::= Ccode(ulong,"(unsigned long)mpfr_get_prec(", x, ")"); - -precision0(x:RRi) ::= Ccode(ulong,"(unsigned long)mpfi_get_prec(", x, ")"); - -precision0(x:CC) ::= Ccode(ulong,"(unsigned long)mpfr_get_prec(", x, ")"); - -precision0(x:CCi) ::= Ccode(ulong,"(unsigned long)mpfi_get_prec(", x, ")"); - -export precision(x:RR):ulong := precision0(x); - -export precision(x:RRi):ulong := precision0(x); - -export precision(x:CC):ulong := precision0(x.re); - -export precision(x:CCi):ulong := precision0(x.re); - -export toRR(x:RR,prec:ulong):RR := ( - if precision0(x) == prec then return x; - z := newRRmutable(prec); - Ccode( void, "mpfr_set(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export toRRi(x:RRi,prec:ulong):RRi := ( - if precision0(x) == prec then return x; - z := newRRimutable(prec); - Ccode( void, "mpfi_set(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export toRR(s:string,prec:ulong):RR := ( - z := newRRmutable(prec); - Ccode( void, "mpfr_set_str(", z,", (char *)", s, "->array,", "10,", "MPFR_RNDN", ")" ); - moveToRRandclear(z)); - -export toRRi(s:string,prec:ulong):RRi := ( - z := newRRimutable(prec); - Ccode( void, "mpfi_set_str(", z,", (char *)", s, "->array,", "10", ")" ); - moveToRRiandclear(z)); - -export toRR(x:QQ,prec:ulong):RR := ( - z := newRRmutable(prec); - Ccode( void, "mpfr_set_q(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export toRRi(x:QQ,prec:ulong):RRi := ( - z := newRRimutable(prec); - Ccode( void, "mpfi_set_q(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export toRR(x:QQ):RR := toRR(x,defaultPrecision); - -export toRRi(x:QQ):RRi := toRRi(x,defaultPrecision); - -export toRR(x:ZZ,prec:ulong):RR := ( - z := newRRmutable(prec); - Ccode( void, "mpfr_set_z(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export toRRi(x:ZZ,prec:ulong):RRi := ( - z := newRRimutable(prec); - Ccode( void, "mpfi_set_z(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export toRR(x:ZZ):RR := toRR(x,defaultPrecision); - -export toRRi(x:ZZ):RRi := toRRi(x,defaultPrecision); - -export toRR(n:int,prec:ulong):RR := ( - x := newRRmutable(prec); - Ccode( void, "mpfr_set_si(", x, ",(long)", n, ", MPFR_RNDN)" ); - moveToRRandclear(x)); - -export toRRi(n:int,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfi_set_si(", x, ",(long)", n, ")" ); - moveToRRiandclear(x)); - -export toRR(n:ulong,prec:ulong):RR := ( - x := newRRmutable(prec); - Ccode( void, "mpfr_set_ui(", x, ",(unsigned long)", n, ", MPFR_RNDN)" ); - moveToRRandclear(x)); - -export toRRi(n:ulong,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfi_set_ui(", x, ",(unsigned long)", n, ")" ); - moveToRRiandclear(x)); - -export toRR(n:float, prec:ulong):RR := ( - x := newRRmutable(prec); - Ccode(void, "mpfr_set_flt(", x, ", ", n, ", MPFR_RNDN)"); - moveToRRandclear(x)); - -export toRR(n:double,prec:ulong):RR := ( - x := newRRmutable(prec); - Ccode( void, "mpfr_set_d(", x, ",", n, ", MPFR_RNDN)" ); - moveToRRandclear(x)); - -export toRRi(n:double,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfi_set_d(", x, ",", n, ")" ); - moveToRRiandclear(x)); - -export toRR(n:double):RR := toRR(n,defaultPrecision); - -export toRRi(n:double):RRi := toRRi(n,defaultPrecision); - -export toRRi(n:RR,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode(void, "mpfi_set_fr(", x, ",", n, ")" ); - moveToRRiandclear(x)); - -export toRRi(n:RR):RRi := toRRi(n,precision(n)); - -export toRRi(a:ZZ,b:ZZ,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set_z( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set_z( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:ZZ,b:ZZ):RRi := toRRi(a,b,defaultPrecision); - -export toRRi(a:ZZ,b:QQ,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set_z( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set_q( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:ZZ, b:QQ):RRi := toRRi(a,b,defaultPrecision); - -export toRRi(a:ZZ,b:RR,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set_z( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:ZZ, b:RR):RRi := toRRi(a,b,precision(b)); - -export toRRi(a:QQ,b:ZZ,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set_q( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set_z( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:QQ,b:ZZ):RRi := toRRi(a,b,defaultPrecision); - -export toRRi(a:QQ,b:QQ,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set_q( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set_q( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:QQ, b:QQ):RRi := toRRi(a,b,defaultPrecision); - -export toRRi(a:QQ,b:RR,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set_q( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:QQ, b:RR):RRi := toRRi(a,b,precision(b)); - -export toRRi(a:RR,b:ZZ,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set_z( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:RR,b:ZZ):RRi := toRRi(a,b,precision(a)); - -export toRRi(a:RR,b:QQ,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set_q( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:RR, b:QQ):RRi := toRRi(a,b,precision(a)); - -export toRRi(a:RR,b:RR,prec:ulong):RRi := ( - x := newRRimutable(prec); - Ccode( void, "mpfr_set( &", x, "->left," , a, ",MPFR_RNDD)"); - Ccode( void, "mpfr_set( &", x, "->right," , b, ",MPFR_RNDU)"); - moveToRRiandclear(x)); - -export toRRi(a:RR, b:RR):RRi := toRRi(a,b,min(precision(a),precision(b))); - -export midpointRR(x:RRi):RR := ( - z := newRRmutable(precision0(x)); - Ccode( RR, "mpfi_mid(",z, ",", x, ")"); - moveToRRandclear(z)); - -export midpointRR(x:RRi,prec:ulong):RR := ( - z := newRRmutable(prec); - Ccode( RR, "mpfi_mid(",z, ",", x, ")"); - moveToRRandclear(z)); - -export widthRR(x:RRi):RR := ( - z := newRRmutable(precision0(x)); - Ccode( RR, "mpfi_diam_abs(",z, ",", x, ")"); - moveToRRandclear(z)); - -export infinityRR(prec:ulong,sign:int):RR := ( - x := newRRmutable(prec); - Ccode(void, "mpfr_set_inf(",x,",",sign,")"); - moveToRRandclear(x)); - -export infinityRR(prec:ulong):RR := infinityRR(prec,1); - -export infinityRRi(prec:ulong,sign:int):RRi := toRRi(infinityRR(prec,sign)); -export infinityRRi(prec:ulong):RRi := toRRi(infinityRR(prec)); - -export nanRR(prec:ulong):RR := ( - x := newRRmutable(prec); - Ccode(void, "mpfr_set_nan(",x,")"); - moveToRRandclear(x)); - -export nanRRi(prec:ulong):RRi := toRRi(nanRR(prec)); - -export toCC(x:RR,y:RR):CC := ( - if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRR(prec); CC(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRR(prec,1); CC(z,z)) - else if precision0(x) == precision0(y) then CC(x,y) - else if precision0(x) < precision0(y) then CC(x,toRR(y,precision0(x))) - else CC(toRR(x,precision0(y)),y) - ); - -export toCCi(x:RR,y:RR):CCi := ( - if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) - else if precision0(x) == precision0(y) then CCi(toRRi(x),toRRi(y)) - else if precision0(x) < precision0(y) then CCi(toRRi(x),toRRi(y,precision0(x))) - else CCi(toRRi(x,precision0(y)),toRRi(y)) - ); - -export toCCi(x:RRi,y:RR):CCi := ( - if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) - else if precision0(x) == precision0(y) then CCi(x,toRRi(y)) - else if precision0(x) < precision0(y) then CCi(x,toRRi(y,precision0(x))) - else CCi(toRRi(x,precision0(y)),toRRi(y)) - ); - -export toCCi(x:RR,y:RRi):CCi := ( - if ( isnan0(x) || isnan0(y) ) then (prec := precision0(x); z := nanRRi(prec); CCi(z,z)) - else if ( isinf0(x) || isinf0(y) ) then (prec := precision0(x); z := infinityRRi(prec,1); CCi(z,z)) - else if precision0(x) == precision0(y) then CCi(toRRi(x),y) - else if precision0(x) < precision0(y) then CCi(toRRi(x),toRRi(y,precision0(x))) - else CCi(toRRi(x,precision0(y)),y) - ); - -export infinityCC(prec:ulong):CC := (x := infinityRR(prec,1); toCC(x,x)); - -export infinityCCi(prec:ulong):CCi := (x := infinityRR(prec,1); toCCi(x,x)); - -export nanCC(prec:ulong):CC := (x := nanRR(prec); toCC(x,x)); - -export nanCCi(prec:ulong):CCi := (x := nanRR(prec); toCCi(x,x)); - -export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); - -export toCCi(x:RRi):CCi := CCi(x,toRRi(0,precision0(x))); - -export toCCi(x:RR):CCi := CCi(toRRi(x),toRRi(0,precision0(x))); - -export toCC(x:int,y:RR):CC := CC(toRR(x,precision0(y)),y); - -export toCCi(x:int,y:RRi):CCi := CCi(toRRi(x,precision0(y)),y); - -export toCCi(x:int,y:RR):CCi := CCi(toRRi(x,precision0(y)),toRRi(y)); - -export toCC(x:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); - -export toCCi(x:RRi,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); - -export toCCi(x:RR,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); - -export toCC(x:CC,prec:ulong):CC := ( - if precision0(x.re) == prec then x - else CC(toRR(x.re,prec),toRR(x.im,prec))); - -export toCCi(x:CCi,prec:ulong):CCi := ( - if precision0(x.re) == prec then x - else CCi(toRRi(x.re,prec),toRRi(x.im,prec))); - -export toCCi(x:CC,prec:ulong):CCi := ( - if precision0(x.re) == prec then CCi(toRRi(x.re,prec),toRRi(x.im,prec)) - else CCi(toRRi(x.re,prec),toRRi(x.im,prec))); - -export toCC(x:RR,y:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); - -export toCC(x:QQ,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); - -export toCCi(x:QQ,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); - -export toCC(x:ZZ,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); - -export toCCi(x:ZZ,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); - -export toCC(x:QQ):CC := toCC(x,defaultPrecision); - -export toCCi(x:QQ):CCi := toCCi(x,defaultPrecision); - -export toCC(x:ZZ):CC := toCC(x,defaultPrecision); - -export toCCi(x:ZZ):CCi := toCCi(x,defaultPrecision); - -export toCCi(x:CC):CCi := toCCi(x,defaultPrecision); - -export toCC(x:int,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); - -export toCCi(x:int,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); - -export toCC(x:int,y:int,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); - -export toCCi(x:int,y:int,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(y,prec)); - -export toCC(x:ulong,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); - -export toCCi(x:ulong,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); - -export toCC(x:double,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); - -export toCCi(x:double,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); - -export toCC(x:double,y:double,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); - -export toCCi(x:double,y:double,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(y,prec)); - -export toCCi(a:RRi,b:RRi,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); - -export toCCi(a:RRi,b:RRi):CCi := toCCi(a,b,min(precision(a),precision(b))); - -export toCCi(a:RR,b:RRi,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); - -export toCCi(a:RRi,b:RR,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); - -export toCCi(a:RR,b:RR,prec:ulong):CCi := (CCi(toRRi(a,prec),toRRi(b,prec))); - -export toFloat(x:RR):float := Ccode(float, "mpfr_get_flt(", x, ", MPFR_RNDN)"); -export toFloat(x:RRi):float := toFloat(midpointRR(x)); -export toFloat(x:RRcell):float := toFloat(x.v); -export toFloat(x:RRicell):float := toFloat(x.v); - -export toDouble(x:RR):double := Ccode( double, "mpfr_get_d(", x, ", MPFR_RNDN)" ); - -export toDouble(x:RRi):double := toDouble(midpointRR(x)); - -export toDouble(x:RRcell):double := Ccode( double, "mpfr_get_d(", x.v, ", MPFR_RNDN)" ); - -export toDouble(x:RRicell):double := toDouble(midpointRR(x.v)); - -export flagged():bool := flagged0(); - -export isfinite(x:RR):bool := isfinite0(x); - -export isfinite(x:RRi):bool := isfinite0(x); - -export isinf(x:RR):bool := isinf0(x); - -export isinf(x:RRi):bool := isinf0(x); - -export isnan(x:RR):bool := isnan0(x); - -export isnan(x:RRi):bool := isnan0(x); - -export isfinite(x:CC):bool := isfinite0(x.re) && isfinite0(x.im); - -export isfinite(x:CCi):bool := isfinite0(x.re) && isfinite0(x.im); - -export isinf(x:CC):bool := isinf0(x.re) && !isnan0(x.im) || isinf0(x.im) && !isnan0(x.re); - -export isinf(x:CCi):bool := isinf0(x.re) && !isnan0(x.im) || isinf0(x.im) && !isnan0(x.re); - -export isnan(x:CC):bool := isnan0(x.re) || isnan0(x.im); - -export isnan(x:CCi):bool := isnan0(x.re) || isnan0(x.im); - -export (x:RR) === (y:RR):bool := ( -- weak equality - Ccode( void, "mpfr_clear_flags()" ); - 0 != Ccode( int, "mpfr_equal_p(", x, ",", y, ")" ) - && !flagged0() - ); - -export (x:RRi) === (y:RRi):bool := ( -- weak equality - Ccode( void, "mpfr_clear_flags()" ); -- No equivalent in mpfi - leftRR(x) === leftRR(y) && rightRR(x) === rightRR(y) && !flagged0() -- equality is not defined in mpfi - ); - -export strictequality(x:RR,y:RR):bool := ( - Ccode( void, "mpfr_clear_flags()" ); - 0 != Ccode( int, "mpfr_equal_p(", x, ",", y, ")" ) - && !flagged0() - && sign0(x) == sign0(y) - && precision0(x) == precision0(y) - ); - -export strictequality(x:RRi,y:RRi):bool := ( - Ccode( void, "mpfr_clear_flags()" ); -- No equivalent in mpfi - leftRR(x) === leftRR(y) - && rightRR(x) === rightRR(y) - && !flagged0() - && sign0(x) == sign0(y) - && precision0(x) == precision0(y) - ); - -compare0(x:RR, y:RR) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp(", x, ",", y, "))" ); - -compare0(x:RRi, y:RRi) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(x:RR, y:RR):int := compare0(x,y); -- use flagged(), too! -export (x:RR) > (y:RR) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RR) < (y:RR) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RR) >= (y:RR) : bool := compare0(x,y) >= 0 && !flagged0(); - -export (x:RR) <= (y:RR) : bool := compare0(x,y) <= 0 && !flagged0(); - -export compare(x:RRi, y:RRi):int := compare0(x,y); -- use flagged(), too! -export (x:RRi) > (y:RRi) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RRi) < (y:RRi) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RRi) >= (y:RRi) : bool := (compare0(x,y)>0 || (leftRR(x) == rightRR(y))) && !flagged0(); - -export (x:RRi) <= (y:RRi) : bool := (compare0(x,y)<0 || (rightRR(x) == leftRR(y))) && !flagged0(); - -compare0(x:RR, y:long) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_si(", x, ",", y, "))" ); - -compare0(x:RRi, y:long) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_si(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -compare0(x:RR, y:int ) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_si(", x, ",(long)", y, "))" ); - -compare0(x:RRi, y:int ) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_si(", x, ",(long)", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(x:RR, y:long):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_si(", x, ",", y, "))" ); - -export compare(y:long, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_si(", x, ",", y, "))" ); - -export compare(x:RRi, y:long):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_si(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(y:long, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_si(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export (x:RR) > (y:int) : bool := compare0(x,long(y)) > 0 && !flagged0(); - -export (x:RRi) > (y:int) : bool := compare0(x,long(y)) > 0 && !flagged0(); - -export (x:RR) >= (y:int) : bool := compare0(x,long(y)) >= 0 && !flagged0(); - -export (x:RR) === (y:int) : bool := compare0(x,long(y)) == 0 && !flagged0(); - -export (x:RRi) === (y:int) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export (x:RRi) >= (y:int) : bool := ((compare0(x,long(y)) > 0) || (leftRR(x) === y)) && !flagged0(); - -export (x:RR) < (y:int) : bool := compare0(x,long(y)) < 0 && !flagged0(); - -export (x:RRi) < (y:int) : bool := compare0(x,long(y)) < 0 && !flagged0(); - -export (x:RR) <= (y:int) : bool := compare0(x,long(y)) <= 0 && !flagged0(); - -export (x:RRi) <= (y:int) : bool := (compare0(x,long(y)) < 0 || rightRR(x) === y) && !flagged0(); - -export (x:CC) === (y:int) : bool := x.re === y && x.im === 0; - -export (x:CCi) === (y:int) : bool := x.re === y && x.im === 0; - -compare0(x:RR, y:double) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_d(", x, ",", y, "))" ); - -export compare(x:RR, y:double):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_d(", x, ",", y, "))" ); - -export compare(y:double, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_d(", x, ",", y, "))" ); - -compare0(x:RRi, y:double) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_d(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(x:RRi, y:double):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_d(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(y:double, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_d(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export (x:RR) > (y:double) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RRi) > (y:double) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RR) >= (y:double) : bool := compare0(x,y) >= 0 && !flagged0(); - -export (x:RR) === (y:double) : bool := compare0(x,y) == 0 && !flagged0(); - -export (x:RRi) === (y:double) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export (x:RRi) >= (y:double) : bool := ((compare0(x,y) > 0) || (leftRR(x) === y)) && !flagged0(); - -export (x:RR) < (y:double) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RRi) < (y:double) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RR) <= (y:double) : bool := compare0(x,y) <= 0 && !flagged0(); - -export (x:RRi) <= (y:double) : bool := ((compare0(x,y) < 0) || (rightRR(x) === y)) && !flagged0(); - -compare0(x:RR, y:ZZ) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_z(", x, ",", y, "))" ); - -export compare(x:RR, y:ZZ):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_z(", x, ",", y, "))" ); - -export compare(y:ZZ, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_z(", x, ",", y, "))" ); - -compare0(x:RRi, y:ZZ) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_z(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(x:RRi, y:ZZ):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_z(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(y:ZZ, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_z(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export (x:RR) > (y:ZZ) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RRi) > (y:ZZ) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RR) >= (y:ZZ) : bool := compare0(x,y) >= 0 && !flagged0(); - -export (x:RR) === (y:ZZ) : bool := compare0(x,y) == 0 && !flagged0(); - -export (x:RRi) === (y:ZZ) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export (y:ZZ) === (x:RR) : bool := compare0(x,y) == 0 && !flagged0(); - -export (y:ZZ) === (x:RRi) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export (x:RRi) >= (y:ZZ) : bool := ((compare0(x,y) > 0) || (leftRR(x) === y)) && !flagged0(); - -export (x:RR) < (y:ZZ) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RRi) < (y:ZZ) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RR) <= (y:ZZ) : bool := compare0(x,y) <= 0 && !flagged0(); - -export (x:RRi) <= (y:ZZ) : bool := ((compare0(x,y) < 0) || (rightRR(x) === y)) && !flagged0(); - -compare0(x:RR, y:QQ) ::= Ccode( int, "(mpfr_clear_flags(),mpfr_cmp_q(", x, ",", y, "))" ); - -export compare(x:RR, y:QQ):int := Ccode( int, "(mpfr_clear_flags(), mpfr_cmp_q(", x, ",", y, "))" ); - -export compare(y:QQ, x:RR):int := Ccode( int, "(mpfr_clear_flags(),-mpfr_cmp_q(", x, ",", y, "))" ); - -compare0(x:RRi, y:QQ) ::= Ccode( int, "(mpfr_clear_flags(),mpfi_cmp_q(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(x:RRi, y:QQ):int := Ccode( int, "(mpfr_clear_flags(), mpfi_cmp_q(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export compare(y:QQ, x:RRi):int := Ccode( int, "(mpfr_clear_flags(),-mpfi_cmp_q(", x, ",", y, "))" ); -- No equivalent for clear in mpfi. -- returns 0 when x and y overlap, different behavior than mpfr - -export (x:RR) > (y:QQ) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RRi) > (y:QQ) : bool := compare0(x,y) > 0 && !flagged0(); - -export (x:RR) >= (y:QQ) : bool := compare0(x,y) >= 0 && !flagged0(); - -export (x:RR) === (y:QQ) : bool := compare0(x,y) == 0 && !flagged0(); - -export (x:RRi) === (y:QQ) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export (y:QQ) === (x:RR) : bool := compare0(x,y) == 0 && !flagged0(); - -export (y:QQ) === (x:RRi) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export (x:RRi) >= (y:QQ) : bool := ((compare0(x,y) > 0) || (leftRR(x) === y)) && !flagged0(); - -export (x:RR) < (y:QQ) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RRi) < (y:QQ) : bool := compare0(x,y) < 0 && !flagged0(); - -export (x:RR) <= (y:QQ) : bool := compare0(x,y) <= 0 && !flagged0(); - -export (x:RRi) <= (y:QQ) : bool := ((compare0(x,y) < 0) || (rightRR(x) === y)) && !flagged0(); - -export (x:RRi) === (y:RR) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export (y:RR) === (x:RRi) : bool := rightRR(x) === y && leftRR(x) === y && !flagged0(); - -export contains (y:ZZ, x:RRi):bool := Ccode(int,"mpfi_is_inside_z(",y,",",x,")") > 0; - -export contains (y:QQ, x:RRi):bool := Ccode(int,"mpfi_is_inside_q(",y,",",x,")") > 0; - -export contains (y:RR, x:RRi):bool := Ccode(int,"mpfi_is_inside_fr(",y,",",x,")") > 0; - -export contains (y:RRi, x:RRi):bool := Ccode(int,"mpfi_is_inside(",y,",",x,")") > 0; - -export intersectRRi (x:RRi, y:RRi):RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_intersect(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export intersectRRi (x:RRi, y:RRi, prec:ulong):RRi := ( - z := newRRimutable(prec); - Ccode( void, "mpfi_intersect(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export hash(x:RR):hash_t := hash_t(precision0(x)) + Ccode(hash_t, - "mpfr_hash(", -- see gmp_aux.c for this function - x, - ")" - ); - -export hash(x:RRi):hash_t := hash_t(precision0(x)) + Ccode(hash_t, - "mpfi_hash(", -- Added for MPFI - x, - ")" - ); -- End added for MPFI - -export hash(x:CC):hash_t := 123 + hash(x.re) + 111 * hash(x.im); - -export (x:RR) + (y:RR) : RR := ( - z := newRRmutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfr_add(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) + (y:RRi) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_add(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) + (y:int) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_add_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); -export (x:int) + (y:RR) : RR := (y + x); - -export (x:RRi) + (y:int) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_add_si(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) + (y:ZZ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_add_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) + (y:ZZ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_add_z(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) + (y:QQ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_add_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) + (y:QQ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_add_q(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RRi) + (y:RR) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_add_fr(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export - (y:RR) : RR := ( - z := newRRmutable(precision0(y)); - Ccode( void, "mpfr_neg(", z, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export - (y:RRi) : RRi := ( - z := newRRimutable(precision0(y)); - Ccode( void, "mpfi_neg(", z, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) - (y:RR) : RR := ( - z := newRRmutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfr_sub(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) - (y:RRi) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_sub(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) - (y:int) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sub_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (y:int) - (x:RR) : RR := -(x-y); - -export (x:RRi) - (y:int) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sub_si(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (y:int) - (x:RRi) : RRi := -(x-y); - -export (x:RR) - (y:ZZ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sub_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) - (y:ZZ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sub_z(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) - (y:QQ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sub_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) - (y:QQ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sub_q(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RRi) - (y:RR) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_sub_fr(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export abs(x:RR) : RR := if isNegative0(x) then -x else x; - -export abs(x:RRi) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_abs(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export (x:RR) * (y:RR) : RR := ( - z := newRRmutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfr_mul(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) * (y:RRi) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_mul(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) * (y:ZZ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_mul_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) * (y:ZZ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_mul_z(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (y:ZZ) * (x:RR) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_mul_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (y:ZZ) * (x:RRi) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_mul_z(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) * (y:int) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_mul_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) * (y:int) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_mul_si(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (y:int) * (x:RR) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_mul_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (y:int) * (x:RRi) : RRi := x*y; - -export (x:RR) * (y:QQ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_mul_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) * (y:QQ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_mul_q(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RRi) * (y:RR) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_mul_fr(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) / (y:RR) : RR := ( - z := newRRmutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfr_div(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) / (y:RRi) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_div(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (x:RR) / (y:long) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_div_si(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RR) / (y:int) : RR := x / long(y); - -export (x:RRi) / (y:long) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_div_si(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (y:long) / (x:RRi) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_si_div(", z, ",", y, ",", x, ")" ); - moveToRRiandclear(z)); - -export (x:RRi) / (y:int) : RRi := x / long(y); - -export (y:int) / (x:RRi) : RRi := long(y) / x; - -export (x:RR) / (y:ZZ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_div_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) / (y:ZZ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_div_z(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (y:ZZ) / (x:RRi) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_z_div(", z, ",", y, ",", x, ")" ); - moveToRRiandclear(z)); - -export (x:RR) / (y:QQ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_div_q(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) / (y:QQ) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_div_q(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (y:QQ) / (x:RRi) : RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_q_div(", z, ",", y, ",", x, ")" ); - moveToRRiandclear(z)); - -export (x:RRi) / (y:RR) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_div_fr(", z, ",", x, ",", y, ")" ); - moveToRRiandclear(z)); - -export (y:RR) / (x:RRi) : RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_fr_div(", z, ",", y, ",", x, ")" ); - moveToRRiandclear(z)); - -export sqrt(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sqrt(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export sqrt(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sqrt(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export (x:RR) ^ (n:long) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_pow_si(", z, ",", x, ",", n, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) ^ (n:long) : RRi := ( - if (n == long(0)) then return toRRi(1,precision0(x)); - - left := newRRmutable(precision0(x)); - right := newRRmutable(precision0(x)); - extra := newRRmutable(precision0(x)); - - upper := newRRmutable(precision0(x)); - lower := newRRmutable(precision0(x)); - - if contains0(x) then Ccode(void, "mpfr_set_si(", extra, ",0, MPFR_RNDN)") - else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); - - Ccode( void, "mpfr_pow_si(", left, ",", leftRR(x), ",", n, ", MPFR_RNDU)" ); - Ccode( void, "mpfr_pow_si(", right, ",", rightRR(x), ",", n, ", MPFR_RNDU)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); - - if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); - - Ccode( void, "mpfr_pow_si(", left, ",", leftRR(x), ",", n, ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow_si(", right, ",", rightRR(x), ",", n, ", MPFR_RNDD)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); - - clear(left); - clear(right); - clear(extra); - - toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); - -export (x:RR) ^ (n:ulong) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_pow_ui(", z, ",", x, ",", n, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) ^ (n:ulong) : RRi := ( - if (n == ulong(0)) then return toRRi(1,precision0(x)); - - left := newRRmutable(precision0(x)); - right := newRRmutable(precision0(x)); - extra := newRRmutable(precision0(x)); - - upper := newRRmutable(precision0(x)); - lower := newRRmutable(precision0(x)); - - if contains0(x) then Ccode(void, "mpfr_set_ui(", extra, ",0, MPFR_RNDN)") - else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); - - Ccode( void, "mpfr_pow_ui(", left, ",", leftRR(x), ",", n, ", MPFR_RNDU)" ); - Ccode( void, "mpfr_pow_ui(", right, ",", rightRR(x), ",", n, ", MPFR_RNDU)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); - - if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); - - Ccode( void, "mpfr_pow_ui(", left, ",", leftRR(x), ",", n, ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow_ui(", right, ",", rightRR(x), ",", n, ", MPFR_RNDD)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); - - clear(left); - clear(right); - clear(extra); - - toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); - -export pow10(n:ulong,prec:ulong):RR := ( - z := newRRmutable(prec); - Ccode( void, "mpfr_ui_pow_ui(", z, ",", ulong(10), ",", n, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export pow10RRi(n:ulong,prec:ulong):RRi := ( - left := newRRmutable(prec); - right := newRRmutable(prec); - Ccode( void, "mpfr_ui_pow_ui(", left, ",", ulong(10), ",", n, ", MPFR_RNDD)" ); - Ccode( void, "mpfr_ui_pow_ui(", right, ",", ulong(10), ",", n, ", MPFR_RNDU)" ); - toRRi(moveToRRandclear(left),moveToRRandclear(right))); - -export pow10(n:long,prec:ulong):RR := ( - if n < long(0) - then (pow10(ulong(-n),prec))^long(-1) - else pow10(ulong(n),prec)); - -export pow10RRi(n:long,prec:ulong):RRi := ( - if n < long(0) - then (pow10RRi(ulong(-n),prec))^long(-1) - else pow10RRi(ulong(n),prec)); - -export pow10(n:int,prec:ulong):RR := pow10(long(n),prec); - -export pow10RRi(n:int,prec:ulong):RRi := pow10RRi(long(n),prec); - -export (n:ulong) ^ (x:RR) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_ui_pow(", z, ",", n, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (n:ulong) ^ (x:RRi) : RRi := ( - if (n == ulong(1)) then return toRRi(1,precision0(x)); - - left := newRRmutable(precision0(x)); - right := newRRmutable(precision0(x)); - - if (n > ulong(1)) then ( - Ccode( void, "mpfr_ui_pow(", left, ",", n, ",", leftRR(x), ", MPFR_RNDD)" ); - Ccode( void, "mpfr_ui_pow(", right, ",", n, ",", rightRR(x), ", MPFR_RNDU)" )) - else ( - Ccode( void, "mpfr_ui_pow(", left, ",", n, ",", rightRR(x), ", MPFR_RNDD)" ); - Ccode( void, "mpfr_ui_pow(", right, ",", n, ",", leftRR(x), ", MPFR_RNDU)" )); - - toRRi(moveToRRandclear(left),moveToRRandclear(right))); - -export (x:RR) ^ (y:ZZ) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_pow_z(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) ^ (y:ZZ) : RRi := ( - if (isZero0(y)) then return toRRi(1,precision0(x)); - - left := newRRmutable(precision0(x)); - right := newRRmutable(precision0(x)); - extra := newRRmutable(precision0(x)); - - upper := newRRmutable(precision0(x)); - lower := newRRmutable(precision0(x)); - - if contains0(x) then Ccode(void, "mpfr_set_ui(", extra, ",0, MPFR_RNDN)") - else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); - - Ccode( void, "mpfr_pow_z(", left, ",", leftRR(x), ",", y, ", MPFR_RNDU)" ); - Ccode( void, "mpfr_pow_z(", right, ",", rightRR(x), ",", y, ", MPFR_RNDU)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); - - if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); - - Ccode( void, "mpfr_pow_z(", left, ",", leftRR(x), ",", y, ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow_z(", right, ",", rightRR(x), ",", y, ", MPFR_RNDD)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); - - clear(left); - clear(right); - clear(extra); - - toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); - -export (x:RR) ^ (y:RR) : RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_pow(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (y:RR) ^ (x:RRi) : RRi := ( - -- Needs y >= 0 - if (y == toRR(1,precision0(y))) then return toRRi(1,min(precision0(x),precision0(y))); - - left := newRRmutable(min(precision0(x),precision0(y))); - right := newRRmutable(min(precision0(x),precision0(y))); - - if (y > toRR(1,precision0(y))) then ( - Ccode( void, "mpfr_pow(", left, ",", y, ",", leftRR(x), ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow(", right, ",", y, ",", rightRR(x), ", MPFR_RNDU)" )) - else ( - Ccode( void, "mpfr_pow(", left, ",", y, ",", rightRR(x), ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow(", right, ",", y, ",", leftRR(x), ", MPFR_RNDU)" )); - - toRRi(moveToRRandclear(left),moveToRRandclear(right))); - -export (x:RRi) ^ (y:RR) : RRi := ( - if (y == toRR(0,precision0(y))) then return toRRi(1,min(precision0(x),precision0(y))); - - left := newRRmutable(min(precision0(x),precision0(y))); - right := newRRmutable(min(precision0(x),precision0(y))); - extra := newRRmutable(min(precision0(x),precision0(y))); - - upper := newRRmutable(min(precision0(x),precision0(y))); - lower := newRRmutable(min(precision0(x),precision0(y))); - - if contains0(x) then Ccode(void, "mpfr_set_ui(", extra, ",0, MPFR_RNDN)") - else Ccode( void, "mpfr_set_inf(", extra, ",-1)" ); - - Ccode( void, "mpfr_pow(", left, ",", leftRR(x), ",", y, ", MPFR_RNDU)" ); - Ccode( void, "mpfr_pow(", right, ",", rightRR(x), ",", y, ", MPFR_RNDU)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") > 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", left, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") > 0) - then Ccode(void, "mpfr_set(", upper, ",", right, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", upper, ",", extra, ", MPFR_RNDU)")); - - if !contains0(x) then Ccode( void, "mpfr_set_inf(", extra, ",1)" ); - - Ccode( void, "mpfr_pow(", left, ",", leftRR(x), ",", y, ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow(", right, ",", rightRR(x), ",", y, ", MPFR_RNDD)" ); - - if (Ccode(int, "mpfr_cmp(", left, ",", right, ")") < 0) - then (if (Ccode(int, "mpfr_cmp(", left, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", left, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")) - else (if (Ccode(int, "mpfr_cmp(", right, ",", extra, ")") < 0) - then Ccode(void, "mpfr_set(", lower, ",", right, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", lower, ",", extra, ", MPFR_RNDD)")); - - clear(left); - clear(right); - clear(extra); - - toRRi(moveToRRandclear(lower),moveToRRandclear(upper))); - -export (y:RRi) ^ (x:RRi) : RRi := ( - -- Assumes that y >= 0 --- if (y == toRRi(1,precision0(y))) then return toRRi(1,min(precision0(x),precision0(y))); - - left := newRRmutable(min(precision0(x),precision0(y))); - right := newRRmutable(min(precision0(x),precision0(y))); - - upperright := newRRmutable(min(precision0(x),precision0(y))); - upperleft := newRRmutable(min(precision0(x),precision0(y))); - lowerright := newRRmutable(min(precision0(x),precision0(y))); - lowerleft := newRRmutable(min(precision0(x),precision0(y))); - - Ccode( void, "mpfr_pow(", upperleft, ",", leftRR(y), ",", rightRR(x), ", MPFR_RNDU)" ); - Ccode( void, "mpfr_pow(", upperright, ",", rightRR(y), ",", rightRR(x), ", MPFR_RNDU)" ); - Ccode( void, "mpfr_pow(", lowerleft, ",", leftRR(y), ",", leftRR(x), ", MPFR_RNDU)" ); - Ccode( void, "mpfr_pow(", lowerright, ",", rightRR(y), ",", leftRR(x), ", MPFR_RNDU)" ); - - if (Ccode(int, "mpfr_cmp(", upperleft, ",", upperright, ")") > 0) then ( - if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") > 0) then ( - if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerleft, ")") > 0) - then Ccode(void, "mpfr_set(", right, ",", upperleft, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", right, ",", lowerleft, ", MPFR_RNDU)")) - else ( - if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerright, ")") > 0) - then Ccode(void, "mpfr_set(", right, ",", upperleft, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", right, ",", lowerright, ", MPFR_RNDU)"))) - else ( - if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") > 0) then ( - if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerleft, ")") > 0) - then Ccode(void, "mpfr_set(", right, ",", upperright, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", right, ",", lowerleft, ", MPFR_RNDU)")) - else ( - if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerright, ")") > 0) - then Ccode(void, "mpfr_set(", right, ",", upperright, ", MPFR_RNDU)") - else Ccode(void, "mpfr_set(", right, ",", lowerright, ", MPFR_RNDU)"))); - - Ccode( void, "mpfr_pow(", upperleft, ",", leftRR(y), ",", rightRR(x), ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow(", upperright, ",", rightRR(y), ",", rightRR(x), ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow(", lowerleft, ",", leftRR(y), ",", leftRR(x), ", MPFR_RNDD)" ); - Ccode( void, "mpfr_pow(", lowerright, ",", rightRR(y), ",", leftRR(x), ", MPFR_RNDD)" ); - - if (Ccode(int, "mpfr_cmp(", upperleft, ",", upperright, ")") < 0) then ( - if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") < 0) then ( - if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerleft, ")") < 0) - then Ccode(void, "mpfr_set(", left, ",", upperleft, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", left, ",", lowerleft, ", MPFR_RNDD)")) - else ( - if (Ccode(int, "mpfr_cmp(", upperleft, ",", lowerright, ")") < 0) - then Ccode(void, "mpfr_set(", left, ",", upperleft, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", left, ",", lowerright, ", MPFR_RNDD)"))) - else ( - if (Ccode(int, "mpfr_cmp(", lowerleft, ",", lowerright, ")") < 0) then ( - if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerleft, ")") < 0) - then Ccode(void, "mpfr_set(", left, ",", upperright, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", left, ",", lowerleft, ", MPFR_RNDD)")) - else ( - if (Ccode(int, "mpfr_cmp(", upperright, ",", lowerright, ")") < 0) - then Ccode(void, "mpfr_set(", left, ",", upperright, ", MPFR_RNDD)") - else Ccode(void, "mpfr_set(", left, ",", lowerright, ", MPFR_RNDD)"))); - - clear(upperleft); - clear(lowerleft); - clear(upperright); - clear(lowerright); - - toRRi(moveToRRandclear(left),moveToRRandclear(right))); - -export floor(x:RR) : ZZ := ( - if !isfinite0(x) then return zeroZZ; -- nothing else to do! - w := newZZmutable(); - Ccode( void, "mpfr_get_z(", w, ",", x, ", MPFR_RNDD)" ); - moveToZZandclear(w)); - -export floor(x:RRi) : ZZ := floor(leftRR(x)); - -export ceil(x:RR) : ZZ := ( - if !isfinite0(x) then return zeroZZ; -- nothing else to do! - w := newZZmutable(); - Ccode( void, "mpfr_get_z(", w, ",", x, ", MPFR_RNDU)" ); - moveToZZandclear(w)); - -export ceil(x:RRi) : ZZ := ceil(rightRR(x)); - -export round(x:RR) : ZZ := ( - if !isfinite0(x) then return zeroZZ; -- nothing else to do! - w := newZZmutable(); - Ccode( void, "mpfr_get_z(", w, ",", x, ", MPFR_RNDN)" ); - moveToZZandclear(w)); - -export round(x:RRi) : ZZ := ( - if !isfinite0(x) then return zeroZZ; -- nothing else to do! - w := newRRmutable(precision0(x)); - Ccode( void, "mpfi_get_fr(", w, ",", x, ")" ); - if !isfinite0(w) then return zeroZZ; -- nothing else to do! - y := newZZmutable(); - Ccode( void, "mpfr_get_z(", y, ",", w, ", MPFR_RNDN)" ); - clear(w); - moveToZZandclear(y)); - -export (x:RR) << (n:long) : RR := ( - if n == long(0) then return x; - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_mul_2si(", z, ",", x, ",", n, ",MPFR_RNDN)" ); - moveToRRandclear(z)); - -export (x:RRi) << (n:long) : RRi := ( - if n == long(0) then return x; - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_mul_2si(", z, ",", x, ",", n, ")" ); - moveToRRiandclear(z)); - -export (x:RR) >> (n:long) : RR := x << -n; - -export (x:RRi) >> (n:long) : RRi := x << -n; - -export (x:RR) << (n:int) : RR := x << long(n); - -export (x:RRi) << (n:int) : RRi := x << long(n); - -export (x:RR) >> (n:int) : RR := x << long(-n); - -export (x:RRi) >> (n:int) : RRi := x << long(-n); - --- complex arithmetic - -export (x:CC) + (y:CC) : CC := toCC(x.re+y.re, x.im+y.im); - -export (x:CCi) + (y:CCi) : CCi := toCCi(x.re+y.re, x.im+y.im); - -export (x:CC) - (y:CC) : CC := toCC(x.re-y.re, x.im-y.im); - -export (x:CCi) - (y:CCi) : CCi := toCCi(x.re-y.re, x.im-y.im); - -export (x:RR) - (y:CC) : CC := toCC(x-y.re,-y.im); - -export (x:int) - (y:CC) : CC := toCC(x-y.re,-y.im); - -export (x:int) - (y:CCi) : CCi := toCCi(x-y.re,-y.im); - -export (x:CC) - (y:int) : CC := toCC(x.re-y,x.im); - -export (x:CC) - (y:RR) : CC := toCC(x.re-y,x.im); - -export (x:CC) + (y:RR) : CC := toCC(x.re+y,x.im); - -export (x:RR) + (y:CC) : CC := toCC(x+y.re,y.im); - -export (x:int) + (y:CC) : CC := toCC(x+y.re,y.im); - -export -(y:CC) : CC := toCC(-y.re,-y.im); - -export -(y:CCi) : CCi := toCCi(-y.re,-y.im); - -export (x:CC) * (y:RR) : CC := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) - then toCC(x.re*y, x.im*y) - else if isnan(x) || isnan(y) then nanCC(min(precision(x),precision(y))) - else infinityCC(min(precision(x),precision(y)))); - -export (x:CC) * (y:RRi) : CCi := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) - then toCCi(y*x.re, y*x.im) - else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) - else infinityCCi(min(precision(x),precision(y)))); - -export (x:CCi) * (y:RRi) : CCi := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) - then toCCi(x.re*y, x.im*y) - else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) - else infinityCCi(min(precision(x),precision(y)))); - -export (x:CCi) * (y:RR) : CCi := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite0(y) - then toCCi(x.re*y, x.im*y) - else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) - else infinityCCi(min(precision(x),precision(y)))); - -export (y:RR) * (x:CC) : CC := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) - then toCC(x.re*y, x.im*y) - else if isnan(x) || isnan(y) then nanCC(min(precision(x),precision(y))) - else infinityCC(min(precision(x),precision(y)))); - -export (y:RRi) * (x:CC) : CCi := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) - then toCCi(y*x.re, y*x.im) - else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) - else infinityCCi(min(precision(x),precision(y)))); - -export (y:RRi) * (x:CCi) : CCi := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) - then toCCi(x.re*y, x.im*y) - else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) - else infinityCCi(min(precision(x),precision(y)))); - -export (y:RR) * (x:CCi) : CCi := ( - if isfinite0(x.re) && isfinite0(x.im) && isfinite(y) - then toCCi(x.re*y, x.im*y) - else if isnan(x) || isnan(y) then nanCCi(min(precision(x),precision(y))) - else infinityCCi(min(precision(x),precision(y)))); - -export (y:int) * (x:CC) : CC := ( - if isinf(x) && y != 0 - then infinityCC(precision(x)) - else toCC(x.re*y, x.im*y)); - -export (x:CC) * (y:ZZ) : CC := ( - if isinf(x) && !isZero(y) - then infinityCC(precision(x)) - else toCC(x.re*y, x.im*y)); - -export (x:CCi) * (y:ZZ) : CCi := ( - if isinf(x) && !isZero(y) - then infinityCCi(precision(x)) - else toCCi(x.re*y, x.im*y)); - -export (y:ZZ) * (x:CC) : CC := ( - if isinf(x) && !isZero(y) - then infinityCC(precision(x)) - else toCC(x.re*y, x.im*y)); - -export (y:ZZ) * (x:CCi) : CCi := ( - if isinf(x) && !isZero(y) - then infinityCCi(precision(x)) - else toCCi(x.re*y, x.im*y)); - -export (x:CC) * (y:CC) : CC := ( - if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) - then infinityCC(min(precision(x),precision(y))) - else toCC(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); - -export (x:CC) * (y:CCi) : CCi := ( - if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) - then infinityCCi(min(precision(x),precision(y))) - else toCCi(y.re*x.re-y.im*x.im, y.re*x.im+y.im*x.re)); - -export (x:CCi) * (y:CC) : CCi := ( - if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) - then infinityCCi(min(precision(x),precision(y))) - else toCCi(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); - -export (x:CCi) * (y:CCi) : CCi := ( - if isinf(x) && !isZero(y) && !isnan(y) || isinf(y) && !isZero(x) && !isnan(x) - then infinityCCi(min(precision(x),precision(y))) - else toCCi(x.re*y.re-x.im*y.im, x.im*y.re+x.re*y.im)); - -export (x:CC) / (y:RR) : CC := ( - if isZero(y) && !isnan(x) && !isZero(x) - then infinityCC(min(precision(x),precision(y))) - else toCC(x.re/y, x.im/y)); - -export (x:CC) / (y:int) : CC := ( - if y == 0 && !isnan(x) && !isZero(x) - then infinityCC(precision(x)) - else toCC(x.re/y, x.im/y)); - -export conj(x:CC):CC := toCC(x.re,-x.im); - -export norm2(x:CC):RR := x.re*x.re + x.im*x.im; - -export norm2(x:CCi):RRi := x.re*x.re + x.im*x.im; - -export (x:CC) << (n:long) : CC := if n == long(0) then x else CC(x.re<> (n:long) : CCi := if n == long(0) then x else CCi(x.re>>n,x.im>>n); - -export (x:CC) >> (n:long) : CC := if n == long(0) then x else CC(x.re>>n,x.im>>n); - -export (x:CC) << (n:int) : CC := if n == 0 then x else CC(x.re<> (n:int) : CC := if n == 0 then x else CC(x.re>>n,x.im>>n); - -export inverse(z:CC):CC := ( - if isfinite(z) then - if isZero0(z.re) && isZero0(z.im) then infinityCC(precision0(z.re)) - else ( - expon := exponent(z); - if expon > 10000 || expon < -10000 then z = z >> expon else expon = long(0); - n2 := norm2(z); - toCC((z.re/n2) >> expon, -(z.im/n2) >> expon)) - else if isinf(z) then toCC(0,0,precision(z)) - else nanCC(precision(z))); - -export inverse(z:CCi):CCi := ( - if isfinite(z) then - if isZero0(z.re) && isZero0(z.im) then infinityCCi(precision0(z.re)) - else ( - expon := exponent(z); - if expon > 10000 || expon < -10000 then z = z >> expon else expon = long(0); - n2 := norm2(z); - toCCi((z.re/n2) >> expon, -(z.im/n2) >> expon)) - else if isinf(z) then toCCi(0,0,precision(z)) - else nanCCi(precision(z))); - -export (x:CC) / (y:CC) : CC := x * inverse(y); - -export (x:CCi) / (y:CC) : CCi := x * inverse(y); - -export (x:CCi) / (y:CCi) : CCi := toCCi((x.re*y.re+x.im*y.im)/(y.re*y.re+y.im*y.im),(x.im*y.re-x.re*y.im)/(y.re*y.re+y.im*y.im)); - -export (x:RR) / (y:CC) : CC := x * inverse(y); - -export (x:RRi) / (y:CC) : CCi := x * inverse(y); - -export (x:ZZ) / (y:CC) : CC := x * inverse(y); - -export (x:int) / (y:CC) : CC := x * inverse(y); - -export strictequality(x:CC,y:CC):bool := strictequality(x.re,y.re) && strictequality(x.im,y.im); - -export strictequality(x:CCi,y:CCi):bool := strictequality(x.re,y.re) && strictequality(x.im,y.im); - -export (x:CC) === (y:CC) : bool := x.re === y.re && x.im === y.im; - -export (x:CCi) === (y:CCi) : bool := x.re === y.re && x.im === y.im; - -export (x:CCi) === (y:CC) : bool := x.re === y.re && x.im === y.im; - -export (x:CC) === (y:CCi) : bool := x.re === y.re && x.im === y.im; - -export (x:CC) === (y:RR) : bool := x.re === y && x.im === 0; - -export (x:CCi) === (y:RRi) : bool := x.re === y && x.im === 0; - -export (x:CCi) === (y:RR) : bool := x.re === y && x.im === 0; - -export (x:RR) === (y:CC) : bool := x === y.re && y.im === 0; - -export (x:RRi) === (y:CCi) : bool := x === y.re && y.im === 0; - -export (x:RR) === (y:CCi) : bool := x === y.re && y.im === 0; - -export (x:CC) === (y:ZZ) : bool := x.re === y && x.im === 0; - -export (x:CCi) === (y:ZZ) : bool := x.re === y && x.im === 0; - -export (x:ZZ) === (y:CC) : bool := x === y.re && y.im === 0; - -export (x:ZZ) === (y:CCi) : bool := x === y.re && y.im === 0; - -export (x:CC) === (y:QQ) : bool := x.re === y && x.im === 0; - -export (x:CCi) === (y:QQ) : bool := x.re === y && x.im === 0; - -export (x:QQ) === (y:CC) : bool := x === y.re && y.im === 0; - -export (x:QQ) === (y:CCi) : bool := x === y.re && y.im === 0; - -export compare(x:CC,y:CC):int := ( - if ( isinf(x.re) || isinf(y.re) || isinf(x.im) || isinf(y.im) ) then ( - setflag0(); - return 0; - ); - r := compare(x.re,y.re); - if flagged() || r != 0 then r - else compare(x.im,y.im)); - -export compare(x:CC,y:RR):int := ( - if ( isinf(x.re) || isinf(x.im) || isinf(y) ) then ( - setflag0(); - return 0; - ); - r := compare(x.re,y); - if flagged() || r != 0 then r - else compare0(x.im,0)); - -export compare(x:RR,y:CC):int := ( - if ( isinf(x) || isinf(y.re) || isinf(y.im) ) then ( - setflag0(); - return 0; - ); - r := compare(x,y.re); - if flagged() || r != 0 then r - else -compare0(y.im,0)); - -export compare(x:CC,y:ZZ):int := ( - if ( isinf(x.re) || isinf(x.im) ) then ( - setflag0(); - return 0; - ); - r := compare(x.re,y); - if flagged() || r != 0 then r - else compare0(x.im,0)); - -export compare(x:ZZ,y:CC):int := ( - if ( isinf(y.re) || isinf(y.im) ) then ( - setflag0(); - return 0; - ); - r := compare(x,y.re); - if flagged() || r != 0 then r - else -compare0(y.im,0)); - -export compare(x:CC,y:QQ):int := ( - if ( isinf(x.re) || isinf(x.im) ) then ( - setflag0(); - return 0; - ); - r := compare(x.re,y); - if flagged() || r != 0 then r - else compare0(x.im,0)); - -export compare(x:QQ,y:CC):int := ( - if ( isinf(y.re) || isinf(y.im) ) then ( - setflag0(); - return 0; - ); - r := compare(x,y.re); - if flagged() || r != 0 then r - else -compare0(y.im,0)); - -export abs(x:CC):RR := ( - z := newRRmutable(precision(x)); - Ccode( void, "mpfr_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); - moveToRRandclear(z)); - ---export abs(x:CCi):RRi := ( --- z := newRRimutable(precision(x)); --- Ccode( void, "mpfi_hypot(", z, ",", x.re, ",", x.im, ",MPFR_RNDN)" ); --- moveToRRiandclear(z)); - -header "#include "; - -export sqrt(x:CC):CC := ( - z := newCCmutable(precision(x)); - Ccode( void, "mpfc_sqrt(", z, ",", x, ")" ); -- see ../e/complex.c - moveToCCandclear(z)); - --- real transcendental functions - -export pi(prec:ulong):RR := ( - z := newRRmutable(prec); - Ccode( void, "mpfr_const_pi(", z, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export piRRi(prec:ulong):RRi := ( - z := newRRimutable(prec); - Ccode( void, "mpfi_const_pi(", z, ")" ); - moveToRRiandclear(z)); - -export eRRi(prec:ulong):RRi := ( - z := newRRimutable(prec); - Ccode( void, "mpfi_const_euler(", z, ")" ); - moveToRRiandclear(z)); - -export cRRi(prec:ulong):RRi := ( - z := newRRimutable(prec); - Ccode( void, "mpfi_const_catalan(", z, ")" ); - moveToRRiandclear(z)); - -export exp(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_exp(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export exp(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_exp(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export log(x:RR):RR := ( -- works only if x>0 - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_log(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export log(x:RRi):RRi := ( -- works only if x>0 - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_log(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export log(b:RR,x:RR):RR := ( -- works only if x>0 and b>0 - if precision0(b) < precision0(x) then x = toRR(x,precision0(b)) - else if precision0(b) > precision0(x) then b = toRR(b,precision0(x)); - log(x)/log(b)); - -export log(b:RRi,x:RRi):RRi := ( -- works only if x>0 and b>0 - if precision0(b) < precision0(x) then x = toRRi(x,precision0(b)) - else if precision0(b) > precision0(x) then b = toRRi(b,precision0(x)); - log(x)/log(b)); - -export sin(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sin(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export sin(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sin(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export cos(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_cos(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export cos(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_cos(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export tan(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_tan(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export tan(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_tan(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export asin(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_asin(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export asin(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_asin(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export acos(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_acos(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export acos(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_acos(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export atan(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_atan(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export atan(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_atan(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export atan2(y:RR,x:RR):RR := ( - -- if isZero0(x) && isZero0(y) && isfinite0(x) && isfinite0(y) then return nanRR(min(precision0(x),precision0(y))); - z := newRRmutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfr_atan2(", z, ",", y, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export atan2(y:RRi,x:RRi):RRi := ( - z := newRRimutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfi_atan2(", z, ",", y, ",", x, ")" ); - moveToRRiandclear(z)); - -export Beta(x:RR,y:RR):RR := ( - z := newRRmutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfr_beta(", z, ",", y, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export agm(x:RR,y:RR):RR := ( - z := newRRmutable(min(precision0(x),precision0(y))); - Ccode( void, "mpfr_agm(", z, ",", x, ",", y, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export sinh(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sinh(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export sinh(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sinh(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export cosh(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_cosh(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export cosh(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_cosh(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export tanh(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_tanh(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export tanh(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_tanh(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export sec(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sec(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export sec(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sec(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export csc(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_csc(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export csc(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_csc(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export cot(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_cot(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export cot(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_cot(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export sech(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_sech(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export sech(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_sech(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export csch(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_csch(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export csch(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_csch(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export coth(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_coth(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export coth(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_coth(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export factorial(x:ulong):ZZ := ( - w := newZZmutable(); - Ccode( void, "mpz_fac_ui(", w, ",", x, ")" ); - moveToZZandclear(w)); - -export binomial(n:ZZ, k:ulong):ZZ := ( - w := newZZmutable(); - Ccode(void, "mpz_bin_ui(", w, ", ", n, ", ", k, ")"); - moveToZZandclear(w)); - -export log1p(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_log1p(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export log1p(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_log1p(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export expm1(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_expm1(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export expm1(x:RRi):RRi := ( - z := newRRimutable(precision0(x)); - Ccode( void, "mpfi_expm1(", z, ",", x, ")" ); - moveToRRiandclear(z)); - -export Gamma(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_gamma(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export Gamma(s:RR,x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_gamma_inc(", z, ",", s, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export Digamma(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_digamma(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export factorial(x:RR):RR := Gamma(x+1); - -export eint(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_eint(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); ---export lngamma(x:RR):RR := ( --- z := newRRmutable(precision0(x)); --- Ccode( void, "mpfr_lngamma(", z, ",", x, ", MPFR_RNDN)" ); --- moveToRRandclear(z)); - -export zeta(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_zeta(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export zeta(x:ulong,prec:ulong):RR := ( - z := newRRmutable(prec); - Ccode( void, "mpfr_zeta_ui(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export erf(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_erf(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export erfc(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_erfc(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export j0(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_j0(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export j1(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_j1(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export jn(n:long,x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_jn(", z, ",",n,",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export y0(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_y0(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export y1(x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_y1(", z, ",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export yn(n:long,x:RR):RR := ( - z := newRRmutable(precision0(x)); - Ccode( void, "mpfr_yn(", z, ",",n,",", x, ", MPFR_RNDN)" ); - moveToRRandclear(z)); - -export signbit(x:RR):bool := 0 != Ccode(int,"mpfr_signbit(",x,")"); - --- complex transcendental functions - -export exp(z:CC):CC := exp(z.re) * toCC(cos(z.im),sin(z.im)); - -export log(z:CC):CC := toCC(log(abs(z)),atan2(z.im,z.re)); - -export logc(x:RR):CC := ( -- works also for x<0 - if x<0 then toCC(log(-x),pi(precision0(x))) else toCC(log(x))); - -export logc(b:RR,x:RR):CC := ( -- works also for x<0 or b<0 - if precision0(b) < precision0(x) then x = toRR(x,precision0(b)) - else if precision0(b) > precision0(x) then b = toRR(b,precision0(x)); - if b<0 then ( - if x<0 then logc(x)/logc(b) else log(x)/logc(b) - ) - else if x<0 then logc(x)/log(b) else toCC(log(x)/log(b))); - -export log(b:CC,x:CC):CC := ( - if precision(b) < precision(x) then x = toCC(x,precision(b)) - else if precision(b) > precision(x) then b = toCC(b,precision(x)); - log(x)/log(b)); - -export log(b:RR,x:CC):CC := ( - if precision(b) < precision(x) then x = toCC(x,precision0(b)) - else if precision(b) > precision(x) then b = toRR(b,precision(x)); - if b<0 then log(x)/logc(b) else log(x)/log(b)); - -export log(b:CC,x:RR):CC := ( - if precision(b) < precision(x) then x = toRR(x,precision(b)) - else if precision(b) > precision(x) then b = toCC(b,precision(x)); - if x<0 then logc(x)/log(b) else log(x)/log(b)); - -export agm(x:CC,y:CC):CC := ( - if precision(y) < precision(x) then x = toCC(x,precision(y)) - else if precision(y) > precision(x) then y = toCC(y,precision(x)); - while true do ( - if !isfinite0(x.re) || !isfinite0(x.im) then return x; - if !isfinite0(y.re) || !isfinite0(y.im) then return y; - if x === 0 then return x; - if y === 0 then return y; - t := (x+y)/2; - diff := x-y; - prec := long(precision(x)); -- in practice, max prec is 2^31 - 1, so fits in an int, too. - if exponent(diff) + 3*(prec/4) < exponent(x) then return t; - u := sqrt(x*y); - x = t; - y = u; - )); - -itimes(z:CC):CC := toCC(-z.im, z.re); -mitimes(z:CC):CC := toCC(z.im, -z.re); -idiv(z:CC):CC := toCC(z.im, -z.re); -eitimes(z:CC):CC := exp(itimes(z)); -emitimes(z:CC):CC := exp(mitimes(z)); - -export cos(z:CC):CC := (eitimes(z) + emitimes(z))/2; - -export sin(z:CC):CC := idiv(eitimes(z) - emitimes(z))/2; - -export cot(z:CC):CC := cos(z)/sin(z); - -export tan(z:CC):CC := sin(z)/cos(z); - -export csc(z:CC):CC := 1/sin(z); - -export sec(z:CC):CC := 1/cos(z); - -export cosh(z:CC):CC := (exp(z) + exp(-z))/2; - -export sinh(z:CC):CC := (exp(z) - exp(-z))/2; - -export tanh(z:CC):CC := (exp(z) - exp(-z))/(exp(z) + exp(-z)); - -export coth(z:CC):CC := (exp(z) + exp(-z))/(exp(z) - exp(-z)); - -export sech(z:CC):CC := 1/cosh(z); - -export csch(z:CC):CC := 1/sinh(z); - -square(z:CC):CC := ( - if isfinite0(z.re) && isfinite0(z.im) then toCC(z.re^long(2)-z.im^long(2),2*z.re*z.im) - else if isnan0(z.re) || isnan0(z.im) then nanCC(precision0(z.re)) - else infinityCC(precision0(z.re)) - ); - -square(z:CCi):CCi := ( - if isfinite0(z.re) && isfinite0(z.im) then toCCi(z.re^long(2)-z.im^long(2),2*z.re*z.im) - else if isnan0(z.re) || isnan0(z.im) then nanCCi(precision0(z.re)) - else infinityCCi(precision0(z.re)) - ); - -export acos(z:CC):CC := idiv(log(z+itimes(sqrt(1-square(z))))); - -export asin(z:CC):CC := idiv(log(sqrt(1-square(z))+itimes(z))); - -export abs2(z:CC):RR := z.re^long(2) + z.im^long(2); - -export abs2(z:CCi):RRi := z.re^long(2) + z.im^long(2); - -export atan(x:CC):CC := ( - if isnan(x) then return x; - if isinf(x) then return toCC(atan(infinityRR(precision(x)))); - ss := abs2(x); - y2 := x.im << 1; - toCC( atan2(x.re<<1,1-ss)>>1, log((ss+1+y2)/(ss+1-y2))>>2 )); - -export (x:CC) ^ (y:CC):CC := exp(log(x)*y); - -export (x:CC) ^ (y:RR):CC := exp(log(x)*y); - -export (x:CC) ^ (y:ZZ):CC := ( - if isZero0(y) then return toCC(1,0,precision0(x.re)); - if isZero0(x.re) && isZero0(x.im) && isfinite0(x.re) && isfinite0(x.im) then return if isNegative0(y) then infinityCC(precision0(x.re)) else x; - if isinf(x) then return if isNegative0(y) then toCC(0,precision0(x.re)) else x; - if isLong(y) then ( - n := toLong(y); - if n == long(0) then return toCC(1,precision(x)); - if n == long(1) then return x; - if n == long(-1) then return inverse(x); - if n == long(2) then return square(x); - if n == long(-2) then return inverse(square(x)); - -- we could do a few more of these optimizations here... - ); - exp(log(x)*y)); - -export (x:CCi) ^ (y:ZZ):CCi := ( - if isZero0(y) then return toCCi(1,0,precision0(x.re)); - if isZero0(x.re) && isZero0(x.im) && isfinite0(x.re) && isfinite0(x.im) then return if isNegative0(y) then infinityCCi(precision0(x.re)) else x; - if isinf(x) then return if isNegative0(y) then toCCi(0,precision0(x.re)) else x; - if isLong(y) then ( - n := toLong(y); - if n == long(0) then return toCCi(1,precision(x)); - if n == long(1) then return x; - if n == long(-1) then return inverse(x); - if n == long(2) then return square(x); - if n == long(-2) then return inverse(square(x)); - -- we could do a few more of these optimizations here... - ); - if isEven(y) then return square(x^(y >> 1)) - else (return x*(x^(y-1)))); - -export (x:RR) ^ (y:CC):CC := if isNegative(x) then exp(log(toCC(x))*y) else exp(log(x)*y); - -export arrayZZ := array(ZZ); - --- Local Variables: --- compile-command: "echo \"make: Entering directory \\`$M2BUILDDIR/Macaulay2/d'\" && make -C $M2BUILDDIR/Macaulay2/d gmp.o " --- End: From 6e9a775a1d4400cfce5115f3fbf3f4240b021ec9 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Wed, 26 Nov 2025 16:31:51 -0500 Subject: [PATCH 170/691] Reverting the change of toCC to CC --- M2/Macaulay2/d/gmp.d | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/gmp.d b/M2/Macaulay2/d/gmp.d index 960bde65464..cc61147b1eb 100644 --- a/M2/Macaulay2/d/gmp.d +++ b/M2/Macaulay2/d/gmp.d @@ -1203,19 +1203,19 @@ export nanCCi(prec:ulong):CCi := (x := nanRR(prec); toCCi(x,x)); export infinityCCi(prec:ulong):CCi := (x := infinityRR(prec,1); toCCi(x,x)); -export toCC(x:RR):CC := CC(x,toRR(0,precision0(x))); +export toCC(x:RR):CC := toCC(x,toRR(0,precision0(x))); export toCCi(x:RRi):CCi := CCi(x,toRRi(0,precision0(x))); export toCCi(x:RR):CCi := CCi(toRRi(x),toRRi(0,precision0(x))); -export toCC(x:int,y:RR):CC := CC(toRR(x,precision0(y)),y); +export toCC(x:int,y:RR):CC := toCC(toRR(x,precision0(y)),y); export toCCi(x:int,y:RRi):CCi := CCi(toRRi(x,precision0(y)),y); export toCCi(x:int,y:RR):CCi := CCi(toRRi(x,precision0(y)),toRRi(y)); -export toCC(x:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); +export toCC(x:RR,prec:ulong):CC := toCC(toRR(x,prec),toRR(0,prec)); export toCCi(x:RRi,prec:ulong):CCi := CCi(toRRi(x,prec),toRRi(0,prec)); @@ -1233,7 +1233,7 @@ export toCCi(x:CC,prec:ulong):CCi := ( if precision0(x.re) == prec then CCi(toRRi(x.re,prec),toRRi(x.im,prec)) else CCi(toRRi(x.re,prec),toRRi(x.im,prec))); -export toCC(x:RR,y:RR,prec:ulong):CC := CC(toRR(x,prec),toRR(y,prec)); +export toCC(x:RR,y:RR,prec:ulong):CC := toCC(toRR(x,prec),toRR(y,prec)); export toCC(x:QQ,prec:ulong):CC := CC(toRR(x,prec),toRR(0,prec)); From 6e6a7f88f99307be1980a2fcc2ce77fef037a884 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 28 Nov 2025 08:15:41 -0500 Subject: [PATCH 171/691] Add some tests for CCi w/ special functions --- M2/Macaulay2/tests/normal/numbers.m2 | 32 +++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/tests/normal/numbers.m2 b/M2/Macaulay2/tests/normal/numbers.m2 index 803ace8193c..491b06b475e 100644 --- a/M2/Macaulay2/tests/normal/numbers.m2 +++ b/M2/Macaulay2/tests/normal/numbers.m2 @@ -943,6 +943,7 @@ assert (abs(erf ii - 1.65042575879754*ii) < 1e-14) assert small(erfc 1 - (1 - erf 1)) assert isMember(1 - erf 1, erfc interval 1) assert small abs (erfc ii - (1 - erf ii)) +assert isMember(erfc ii, erfc toCCi(0, 1)) assert small(Gamma(5, 0) - Gamma 5) assert small(Gamma(1, 5) - exp(-5)) @@ -955,6 +956,11 @@ assert small abs(Gamma ii + 0.15494982830181067 + 0.49801566811835607*ii) assert small abs(Gamma(1, ii) - 0.54030230586813977 + 0.8414709848078965*ii) assert small abs(Gamma(ii, 1) - 0.18664859155306995 - 0.087482052563195759*ii) assert small abs(Gamma(ii, ii) + 0.014824818622885686 + 0.21654902748979538*ii) +assert isMember(Gamma ii, Gamma toCCi(0, 1)) +assert isMember(Gamma(1, ii), Gamma(toCCi 1, toCCi(0, 1))) +assert isMember(Gamma(ii, 1), Gamma(toCCi(0, 1), toCCi 1)) +assert isMember(Gamma(ii, ii), Gamma(toCCi(0, 1), toCCi (0, 1))) + assert small(Gamma(1/2, 5) / Gamma(1/2) - regularizedGamma(1/2, 5)) assert(abs(5 - inverseRegularizedGamma(1/2, regularizedGamma(1/2, 5))) < 1e-12) @@ -962,13 +968,15 @@ assert small(1/5 - regularizedGamma(1/2, inverseRegularizedGamma(1/2, 1/5))) assert isMember(0.13533528323661269, regularizedGamma(1, interval 2)) assert isMember(0.13533528323661269, regularizedGamma(interval 1, 2)) assert isMember(0.13533528323661269, regularizedGamma(interval 1, interval 2)) -assert small abs(Gamma(1, ii) - 0.54030230586813977 + 0.8414709848078965*ii) -assert small abs(Gamma(ii, 1) - 0.18664859155306996 - 0.0874820525631958*ii) -assert small abs(Gamma(ii, ii) + 0.01482481862288569 + 0.2165490274897954*ii) +assert isMember(regularizedGamma(1, ii), regularizedGamma(toCCi 1, toCCi(0, 1))) +assert isMember(regularizedGamma(ii, 1), regularizedGamma(toCCi(0,1), toCCi 1)) +assert isMember(regularizedGamma(ii, ii), regularizedGamma(toCCi(0,1), toCCi(0, 1))) + assert small(Digamma 1 + EulerConstant) assert isMember(-EulerConstant, Digamma interval 1) assert small(imaginaryPart Digamma ii - (1/2 + pi/2 * coth pi)) +assert isMember(Digamma ii, Digamma toCCi(0, 1)) assert small(lngamma 0.5 - log sqrt pi) assert small(lngamma(1/2) - log sqrt pi) @@ -976,10 +984,12 @@ assert small(lngamma 4 - log 6) assert small(lngamma pi - log Gamma pi) assert isMember(log sqrt pi, lngamma interval 0.5) assert small abs(lngamma ii - log Gamma ii) +assert isMember(lngamma ii, lngamma toCCi(0, 1)) assert small(zeta(-1) + 1/12) assert isMember(-1/12, zeta interval(-1)) assert(abs zeta(1/2 + 14.1347251417347*ii) < 1e-14) +assert isMember(zeta ii, zeta toCCi(0, 1)) assert small(Beta(1, 2) - 1/2) assert isMember(1/2, Beta(1, interval 2)) @@ -988,6 +998,9 @@ assert isMember(1/2, Beta(interval 1, interval 2)) assert small abs(Beta(1, 1 + ii) - 1/2 + 1/2*ii) assert small abs(Beta(1 + ii, 1) - 1/2 + 1/2*ii) assert small abs(Beta(1 + ii, 1 + ii) + 0.211272372936533 + 0.7655283165378*ii) +assert isMember(Beta(1, 1 + ii), Beta(toCCi 1, toCCi(1, 1))) +assert isMember(Beta(1 + ii, 1), Beta(toCCi(1, 1), toCCi 1)) +assert isMember(Beta(1 + ii, 1 + ii), Beta(toCCi(1, 1), toCCi(1, 1))) assert small(regularizedBeta(1/3, 4, 1) - 1/81) assert small(regularizedBeta(1/3, 4, 5) - @@ -1009,6 +1022,13 @@ assert (abs(regularizedBeta(ii, 2 + ii, 3) + 1.87091618715686 - 1.24727745810457 assert (abs(regularizedBeta(ii, 2, 3 + ii) + 15.8472757835638 - 7.90719103740708*ii) < 1e-13) assert small abs(regularizedBeta(1/2, 2 + ii, 3 + ii) - 0.675624489980143 + 0.036930593255322*ii) assert (abs(regularizedBeta(ii, 2 + ii, 3 + ii) + 3.51460542799295 + 0.957530220804034*ii) < 1e-14) +assert isMember(regularizedBeta(ii, 2, 3), regularizedBeta(toCCi(0, 1), toCCi 2, toCCi 3)) +assert isMember(regularizedBeta(1/2, 2 + ii, 3), regularizedBeta(toCCi(1/2), toCCi(2, 1), toCCi 3)) +assert isMember(regularizedBeta(1/2, 2, 3 + ii), regularizedBeta(toCCi(1/2), toCCi 2, toCCi(3, 1))) +assert isMember(regularizedBeta(ii, 2 + ii, 3), regularizedBeta(toCCi(0, 1), toCCi(2, 1), toCCi 3)) +assert isMember(regularizedBeta(ii, 2, 3 + ii), regularizedBeta(toCCi(0, 1), toCCi 2, toCCi(3, 1))) +assert isMember(regularizedBeta(1/2, 2 + ii, 3 + ii), regularizedBeta(toCCi(1/2), toCCi(2, 1), toCCi(3, 1))) +assert isMember(regularizedBeta(ii, 2 + ii, 3 + ii), regularizedBeta(toCCi(0, 1), toCCi(2, 1), toCCi(3, 1))) -- a few values from Abrahamowitz & Stegun Table 9.1 assert ( BesselJ(0, 0) == 1 ) @@ -1025,6 +1045,9 @@ assert isMember(BesselJ(1, 2), BesselJ(interval 1, interval 2)) assert small abs (BesselJ(1, ii) - 0.565159103992485*ii) assert (abs(BesselJ(ii, 1) - 1.64102417949508 + 0.437075010213683*ii) < 1e-14) assert small abs(BesselJ(ii, ii) - .395137431337008 + 0.221175556871848*ii) +assert isMember(BesselJ(1, ii), BesselJ(toCCi 1, toCCi(0, 1))) +assert isMember(BesselJ(ii, 1), BesselJ(toCCi(0, 1), toCCi 1)) +assert isMember(BesselJ(ii, ii), BesselJ(toCCi(0, 1), toCCi(0, 1))) assert small (BesselY(1, 2) - BesselY(1.0, 2.0)) assert isMember(BesselY(1, 2), BesselY(1, interval 2)) @@ -1033,6 +1056,9 @@ assert isMember(BesselY(1, 2), BesselY(interval 1, interval 2)) assert small abs(BesselY(1, ii) + 0.565159103992484 - 0.383186043874565*ii) assert (abs(BesselY(ii, 1) + 0.476556612479964 + 1.50506915911039*ii) < 1e-14) assert small abs(BesselY(ii, ii) + 0.665181892391867 - 0.395137431337008*ii) +assert isMember(BesselY(1, ii), BesselY(toCCi 1, toCCi(0, 1))) +assert isMember(BesselY(ii, 1), BesselY(toCCi(0, 1), toCCi 1)) +assert isMember(BesselY(ii, ii), BesselY(toCCi(0, 1), toCCi(0, 1))) assert Equation(truncate 1, 1) assert Equation(truncate 1.9, 1) From 02a3ebc82857f6a05938603bffbb749750338498 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 28 Nov 2025 08:36:37 -0500 Subject: [PATCH 172/691] Fix up indentation in .d files --- M2/Macaulay2/d/actors.d | 416 +++++++++++++++++++-------------------- M2/Macaulay2/d/actors4.d | 132 +++++++------ 2 files changed, 275 insertions(+), 273 deletions(-) diff --git a/M2/Macaulay2/d/actors.d b/M2/Macaulay2/d/actors.d index 6edb399fa8a..394bd556566 100644 --- a/M2/Macaulay2/d/actors.d +++ b/M2/Macaulay2/d/actors.d @@ -16,23 +16,23 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( when lhs is x:ZZcell do ( when rhs - is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, ZZ, ZZ, ZZ - is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, ZZ, QQ, QQ - is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RR, RR - is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RRi, RRi - is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CC, CC - is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,PlusS)) + is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, ZZ, ZZ, ZZ + is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, ZZ, QQ, QQ + is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RR, RR + is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, ZZ, RRi, RRi + is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, ZZ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v)-- # typical value: symbol +, ZZ, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,PlusS)) is x:QQcell do ( when rhs - is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, QQ, ZZ, QQ - is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, QQ, QQ, QQ - is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RR, RR - is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RRi, RRi - is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CC, CC - is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CCi, CCi - is Error do rhs + is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, QQ, ZZ, QQ + is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, QQ, QQ, QQ + is y:RRcell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RR, RR + is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, QQ, RRi, RRi + is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) + y.v) -- # typical value: symbol +, QQ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) + y.v)-- # typical value: symbol +, QQ, CCi, CCi + is Error do rhs else binarymethod(lhs,rhs,PlusS)) is x:RawRingElementCell do ( when rhs @@ -45,42 +45,42 @@ export (lhs:Expr) + (rhs:Expr) : Expr := ( else binarymethod(lhs,rhs,PlusS)) is x:RRcell do ( when rhs - is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, ZZ, RR - is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, QQ, RR - is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, RR, RR - is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, RR, RRi, RRi - is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, CC, CC - is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RR, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,PlusS)) + is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, ZZ, RR + is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, QQ, RR + is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, RR, RR + is y:RRicell do toExpr(y.v + x.v) -- # typical value: symbol +, RR, RRi, RRi + is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, RR, CC, CC + is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RR, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,PlusS)) is x:RRicell do ( - when rhs - is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, ZZ, RRi - is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, QQ, RRi - is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, RR, RRi - is y:RRicell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, RRi, RRi - is y:CCcell do toExpr(toCCi(x.v) + toCCi(y.v)) -- # typical value: symbol +, RRi, CC, CCi - is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RRi, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,PlusS)) + when rhs + is y:ZZcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, ZZ, RRi + is y:QQcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, QQ, RRi + is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, RR, RRi + is y:RRicell do toExpr(x.v + y.v) -- # typical value: symbol +, RRi, RRi, RRi + is y:CCcell do toExpr(toCCi(x.v) + toCCi(y.v)) -- # typical value: symbol +, RRi, CC, CCi + is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, RRi, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,PlusS)) is x:CCcell do ( when rhs - is y:ZZcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, ZZ, CC - is y:QQcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, QQ, CC - is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, CC, RR, CC - is y:RRicell do toExpr(toCCi(x.v) + toCCi(y.v)) -- # typical value: symbol +, CC, RRi, CCi - is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, CC, CC, CC - is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, CC, CCi, CCi + is y:ZZcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, ZZ, CC + is y:QQcell do toExpr(x.v + toRR(y.v,precision(x.v.re))) -- # typical value: symbol +, CC, QQ, CC + is y:RRcell do toExpr(x.v + y.v) -- # typical value: symbol +, CC, RR, CC + is y:RRicell do toExpr(toCCi(x.v) + toCCi(y.v)) -- # typical value: symbol +, CC, RRi, CCi + is y:CCcell do toExpr(x.v + y.v) -- # typical value: symbol +, CC, CC, CC + is y:CCicell do toExpr(toCCi(x.v) + y.v) -- # typical value: symbol +, CC, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) - is x:CCicell do ( + is x:CCicell do ( when rhs - is y:ZZcell do toExpr(x.v + toCCi(y.v,precision(x.v.re))) -- # typical value: symbol +, CCi, ZZ, CCi - is y:QQcell do toExpr(x.v + toCCi(y.v,precision(x.v.re))) -- # typical value: symbol +, CCi, QQ, CCi - is y:RRcell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, RR, CCi - is y:RRicell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, RRi, CCi - is y:CCcell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, CC, CCi - is y:CCicell do toExpr(x.v + y.v) -- # typical value: symbol +, CCi, CCi, CCi + is y:ZZcell do toExpr(x.v + toCCi(y.v,precision(x.v.re))) -- # typical value: symbol +, CCi, ZZ, CCi + is y:QQcell do toExpr(x.v + toCCi(y.v,precision(x.v.re))) -- # typical value: symbol +, CCi, QQ, CCi + is y:RRcell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, RR, CCi + is y:RRicell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, RRi, CCi + is y:CCcell do toExpr(x.v + toCCi(y.v)) -- # typical value: symbol +, CCi, CC, CCi + is y:CCicell do toExpr(x.v + y.v) -- # typical value: symbol +, CCi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,PlusS)) is x:RawMatrixCell do ( @@ -127,11 +127,11 @@ plusfun1(rhs:Code):Expr := ( is Error do r is ZZcell do r -- # typical value: symbol +, ZZ, ZZ is RRcell do r -- # typical value: symbol +, RR, RR - is RRicell do r -- # typical value: symbol +, RRi, RRi + is RRicell do r -- # typical value: symbol +, RRi, RRi is CCcell do r -- # typical value: symbol +, CC, CC - is CCicell do r -- # typical value: symbol +, CCi, CCi + is CCicell do r -- # typical value: symbol +, CCi, CCi is QQcell do r -- # typical value: symbol +, QQ, QQ - is RawRingElementCell do r -- # typical value: symbol +, RawRingElement, RawRingElement + is RawRingElementCell do r -- # typical value: symbol +, RawRingElement, RawRingElement is RawMatrixCell do r -- # typical value: symbol +, RawMatrix, RawMatrix is RawMutableMatrixCell do r -- # typical value: symbol +, RawMutableMatrix, RawMutableMatrix else unarymethod(rhs,PlusS)); @@ -147,12 +147,12 @@ export - (rhs:Expr) : Expr := ( when rhs is x:ZZcell do toExpr(-x.v) -- # typical value: symbol -, ZZ, ZZ is x:RRcell do toExpr(-x.v) -- # typical value: symbol -, RR, RR - is x:RRicell do toExpr(-x.v) -- # typical value: symbol -, RRi, RRi + is x:RRicell do toExpr(-x.v) -- # typical value: symbol -, RRi, RRi is x:CCcell do toExpr(-x.v) -- # typical value: symbol -, CC, CC - is x:CCicell do toExpr(-x.v) -- # typical value: symbol -, CCi, CCi + is x:CCicell do toExpr(-x.v) -- # typical value: symbol -, CCi, CCi is x:QQcell do toExpr(-x.v) -- # typical value: symbol -, QQ, QQ is x:RawRingElementCell do toExpr(-x.p) -- # typical value: symbol -, RawRingElement, RawRingElement - is x:RawMatrixCell do ( -- # typical value: symbol -, RawMatrix, RawMatrix + is x:RawMatrixCell do ( -- # typical value: symbol -, RawMatrix, RawMatrix when -x.p is y:RawMatrix do toExpr(y) else buildErrorPacket(EngineError("polynomial minus failed")) ) is x:RawMutableMatrixCell do toExpr(-x.p) -- # typical value: symbol -, RawMutableMatrix, RawMutableMatrix @@ -168,24 +168,24 @@ export (lhs:Expr) - (rhs:Expr) : Expr := ( when lhs is x:ZZcell do ( when rhs - is y:ZZcell do toExpr(x.v - y.v) -- # typical value: symbol -, ZZ, ZZ, ZZ - is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, ZZ, QQ, QQ - is y:RRcell do toExpr(toRR(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, ZZ, RR, RR - is y:RRicell do toExpr(toRRi(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, ZZ, RRi, RRi - is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, ZZ, CC, CC - is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, ZZ, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,MinusS)) + is y:ZZcell do toExpr(x.v - y.v) -- # typical value: symbol -, ZZ, ZZ, ZZ + is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, ZZ, QQ, QQ + is y:RRcell do toExpr(toRR(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, ZZ, RR, RR + is y:RRicell do toExpr(toRRi(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, ZZ, RRi, RRi + is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, ZZ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) - y.v)-- # typical value: symbol -, ZZ, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,MinusS)) is x:QQcell do ( - when rhs - is y:ZZcell do toExpr(x.v - y.v) -- # typical value: symbol -, QQ, ZZ, QQ - is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, QQ, QQ, QQ - is y:RRcell do toExpr(toRR(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, QQ, RR, RR - is y:RRicell do toExpr(toRRi(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, QQ, RRi, RRi - is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, QQ, CC, CC - is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, QQ, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,MinusS)) + when rhs + is y:ZZcell do toExpr(x.v - y.v) -- # typical value: symbol -, QQ, ZZ, QQ + is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, QQ, QQ, QQ + is y:RRcell do toExpr(toRR(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, QQ, RR, RR + is y:RRicell do toExpr(toRRi(x.v,precision(y.v)) - y.v) -- # typical value: symbol -, QQ, RRi, RRi + is y:CCcell do toExpr(toRR(x.v,precision(y.v.re)) - y.v) -- # typical value: symbol -, QQ, CC, CC + is y:CCicell do toExpr(toCCi(x.v,precision(y.v.re)) - y.v)-- # typical value: symbol -, QQ, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,MinusS)) is x:RawRingElementCell do ( when rhs is y:RawRingElementCell do ( -- # typical value: symbol -, RawRingElement, RawRingElement, RawRingElement @@ -198,43 +198,43 @@ export (lhs:Expr) - (rhs:Expr) : Expr := ( is x:RRcell do ( when rhs is y:ZZcell do toExpr(x.v - y.v) -- # typical value: symbol -, RR, ZZ, RR - is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, RR, QQ, RR + is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, RR, QQ, RR is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, RR, RR, RR - is y:RRicell do toExpr(toRRi(x.v) - y.v) -- # typical value: symbol -, RR, RRi, RRi + is y:RRicell do toExpr(toRRi(x.v) - y.v) -- # typical value: symbol -, RR, RRi, RRi is y:CCcell do toExpr(x.v - y.v) -- # typical value: symbol -, RR, CC, CC - is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, RR, CCi, CCi + is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, RR, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,MinusS)) is x:RRicell do ( - when rhs - is y:ZZcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, ZZ, RRi - is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, QQ, RRi - is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, RR, RRi - is y:RRicell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, RRi, RRi - is y:CCcell do toExpr(toCCi(x.v) - toCCi(y.v)) -- # typical value: symbol -, RRi, CC, CCi - is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, RRi, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,MinusS)) + when rhs + is y:ZZcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, ZZ, RRi + is y:QQcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, QQ, RRi + is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, RR, RRi + is y:RRicell do toExpr(x.v - y.v) -- # typical value: symbol -, RRi, RRi, RRi + is y:CCcell do toExpr(toCCi(x.v) - toCCi(y.v)) -- # typical value: symbol -, RRi, CC, CCi + is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, RRi, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,MinusS)) is x:CCcell do ( + when rhs + is y:ZZcell do toExpr(x.v - toRR(y.v,precision(x.v.re))) -- # typical value: symbol -, CC, ZZ, CC + is y:QQcell do toExpr(x.v - toRR(y.v,precision(x.v.re))) -- # typical value: symbol -, CC, QQ, CC + is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, CC, RR, CC + is y:RRicell do toExpr(toCCi(x.v) - toCCi(y.v)) -- # typical value: symbol -, CC, RRi, CCi + is y:CCcell do toExpr(x.v - y.v) -- # typical value: symbol -, CC, CC, CC + is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, CC, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,MinusS)) + is x:CCicell do ( when rhs - is y:ZZcell do toExpr(x.v - toRR(y.v,precision(x.v.re))) -- # typical value: symbol -, CC, ZZ, CC - is y:QQcell do toExpr(x.v - toRR(y.v,precision(x.v.re))) -- # typical value: symbol -, CC, QQ, CC - is y:RRcell do toExpr(x.v - y.v) -- # typical value: symbol -, CC, RR, CC - is y:RRicell do toExpr(toCCi(x.v) - toCCi(y.v)) -- # typical value: symbol -, CC, RRi, CCi - is y:CCcell do toExpr(x.v - y.v) -- # typical value: symbol -, CC, CC, CC - is y:CCicell do toExpr(toCCi(x.v) - y.v) -- # typical value: symbol -, CC, CCi, CCi + is y:ZZcell do toExpr(x.v - toCCi(y.v,precision(x.v.re))) -- # typical value: symbol -, CCi, ZZ, CCi + is y:QQcell do toExpr(x.v - toCCi(y.v,precision(x.v.re))) -- # typical value: symbol -, CCi, QQ, CCi + is y:RRcell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, RR, CCi + is y:RRicell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, RRi, CCi + is y:CCcell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, CC, CCi + is y:CCicell do toExpr(x.v - y.v) -- # typical value: symbol -, CCi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,MinusS)) - is x:CCicell do ( - when rhs - is y:ZZcell do toExpr(x.v - toCCi(y.v,precision(x.v.re))) -- # typical value: symbol -, CCi, ZZ, CCi - is y:QQcell do toExpr(x.v - toCCi(y.v,precision(x.v.re))) -- # typical value: symbol -, CCi, QQ, CCi - is y:RRcell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, RR, CCi - is y:RRicell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, RRi, CCi - is y:CCcell do toExpr(x.v - toCCi(y.v)) -- # typical value: symbol -, CCi, CC, CCi - is y:CCicell do toExpr(x.v - y.v) -- # typical value: symbol -, CCi, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,MinusS)) is x:RawMatrixCell do ( when rhs is y:RawMatrixCell do ( -- # typical value: symbol -, RawMatrix, RawMatrix, RawMatrix @@ -292,21 +292,21 @@ export (lhs:Expr) * (rhs:Expr) : Expr := ( is x:ZZcell do ( when rhs is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, ZZ, ZZ - is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, QQ, QQ - is y:RRcell do toExpr(toRR(x.v,precision(y.v)) * y.v) -- # typical value: symbol *, ZZ, RR, RR - is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, ZZ, RRi, RRi - is y:CCcell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, CC, CC - is y:CCicell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, CCi, CCi + is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, QQ, QQ + is y:RRcell do toExpr(toRR(x.v,precision(y.v)) * y.v) -- # typical value: symbol *, ZZ, RR, RR + is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, ZZ, RRi, RRi + is y:CCcell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, CC, CC + is y:CCicell do toExpr(x.v * y.v) -- # typical value: symbol *, ZZ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) is x:QQcell do ( when rhs is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, QQ, ZZ, QQ - is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, QQ, QQ, QQ - is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, QQ, RR, RR - is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, QQ, RRi, RRi - is y:CCcell do toExpr(y.v * toRR(x.v,precision(y.v.re))) -- # typical value: symbol *, QQ, CC, CC - is y:CCicell do toExpr(y.v * toRR(x.v,precision(y.v.re))) -- # typical value: symbol *, QQ, CCi, CCi + is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, QQ, QQ, QQ + is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, QQ, RR, RR + is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, QQ, RRi, RRi + is y:CCcell do toExpr(y.v * toRR(x.v,precision(y.v.re))) -- # typical value: symbol *, QQ, CC, CC + is y:CCicell do toExpr(y.v * toRR(x.v,precision(y.v.re))) -- # typical value: symbol *, QQ, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) is x:RawRingElementCell do ( @@ -331,43 +331,43 @@ export (lhs:Expr) * (rhs:Expr) : Expr := ( is x:RRcell do ( when rhs is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, ZZ, RR - is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, QQ, RR - is y:RRcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, RR, RR - is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, RR, RRi, RRi - is y:CCcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, CC, CC - is y:CCicell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, CCi, CCi + is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, QQ, RR + is y:RRcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, RR, RR + is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, RR, RRi, RRi + is y:CCcell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, CC, CC + is y:CCicell do toExpr(x.v * y.v) -- # typical value: symbol *, RR, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) - is x:RRicell do ( - when rhs - is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, ZZ, RRi - is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, QQ, RRi - is y:RRcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, RR, RRi - is y:RRicell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, RRi, RRi - is y:CCcell do toExpr(toCCi(x.v) * y.v) -- # typical value: symbol *, RRi, CC, CCi - is y:CCicell do toExpr(toCCi(x.v) * y.v) -- # typical value: symbol *, RRi, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,StarS)) - is x:CCcell do ( + is x:RRicell do ( when rhs - is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, CC, ZZ, CC - is y:QQcell do toExpr(x.v * toRR(y.v,precision(x.v.re))) -- # typical value: symbol *, CC, QQ, CC - is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, RR, CC - is y:RRicell do toExpr(toCCi(y.v) * x.v) -- # typical value: symbol *, CC, RRi, CCi - is y:CCcell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, CC, CC - is y:CCicell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, CCi, CCi + is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, ZZ, RRi + is y:QQcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, QQ, RRi + is y:RRcell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, RR, RRi + is y:RRicell do toExpr(x.v * y.v) -- # typical value: symbol *, RRi, RRi, RRi + is y:CCcell do toExpr(toCCi(x.v) * y.v) -- # typical value: symbol *, RRi, CC, CCi + is y:CCicell do toExpr(toCCi(x.v) * y.v) -- # typical value: symbol *, RRi, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) - is x:CCicell do ( + is x:CCcell do ( when rhs - is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, CCi, ZZ, CCi - is y:QQcell do toExpr(x.v * toRR(y.v,precision(x.v.re))) -- # typical value: symbol *, CCi, QQ, CCi - is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, RR, CCi - is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, RRi, CCi - is y:CCcell do toExpr(toCCi(y.v) * x.v) -- # typical value: symbol *, CCi, CC, CCi - is y:CCicell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, CCi, CCi + is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, CC, ZZ, CC + is y:QQcell do toExpr(x.v * toRR(y.v,precision(x.v.re))) -- # typical value: symbol *, CC, QQ, CC + is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, RR, CC + is y:RRicell do toExpr(toCCi(y.v) * x.v) -- # typical value: symbol *, CC, RRi, CCi + is y:CCcell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, CC, CC + is y:CCicell do toExpr(y.v * x.v) -- # typical value: symbol *, CC, CCi, CCi is Error do rhs else binarymethod(lhs,rhs,StarS)) + is x:CCicell do ( + when rhs + is y:ZZcell do toExpr(x.v * y.v) -- # typical value: symbol *, CCi, ZZ, CCi + is y:QQcell do toExpr(x.v * toRR(y.v,precision(x.v.re))) -- # typical value: symbol *, CCi, QQ, CCi + is y:RRcell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, RR, CCi + is y:RRicell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, RRi, CCi + is y:CCcell do toExpr(toCCi(y.v) * x.v) -- # typical value: symbol *, CCi, CC, CCi + is y:CCicell do toExpr(y.v * x.v) -- # typical value: symbol *, CCi, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,StarS)) is x:RawMonomialCell do ( when rhs is y:RawMonomialCell do ( -- # typical value: symbol *, RawMonomialIdeal, RawMonomial, RawMonomial @@ -427,16 +427,16 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( if y.v === 0 then DivisionByZero() else toExpr(x.v / y.v)) - is y:QQcell do ( -- # typical value: symbol /, ZZ, QQ, QQ + is y:QQcell do ( -- # typical value: symbol /, ZZ, QQ, QQ if y.v === 0 then DivisionByZero() else toExpr(x.v / y.v)) - is y:RRcell do ( -- # typical value: symbol /, ZZ, RR, RR + is y:RRcell do ( -- # typical value: symbol /, ZZ, RR, RR toExpr(toRR(x.v,precision(y.v)) / y.v)) - is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, ZZ, RRi, RRi - is y:CCcell do ( -- # typical value: symbol /, ZZ, CC, CC + is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, ZZ, RRi, RRi + is y:CCcell do ( -- # typical value: symbol /, ZZ, CC, CC toExpr(x.v / y.v)) - is y:CCicell do ( -- # typical value: symbol /, ZZ, CCi, CCi + is y:CCicell do ( -- # typical value: symbol /, ZZ, CCi, CCi toExpr(toCCi((x.v*y.v.re)/(y.v.re^long(2)+y.v.im^long(2)),(-x.v*y.v.im)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) @@ -446,18 +446,18 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( if y.v === 0 then DivisionByZero() else toExpr(x.v / y.v)) - is y:QQcell do ( -- # typical value: symbol /, QQ, QQ, QQ + is y:QQcell do ( -- # typical value: symbol /, QQ, QQ, QQ if y.v === 0 then DivisionByZero() else toExpr(x.v / y.v)) - is y:RRcell do ( -- # typical value: symbol /, QQ, RR, RR + is y:RRcell do ( -- # typical value: symbol /, QQ, RR, RR toExpr(toRR(x.v,precision(y.v)) / y.v)) - is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, QQ, RRi, RRi - is y:CCcell do ( -- # typical value: symbol /, QQ, CC, CC + is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, QQ, RRi, RRi + is y:CCcell do ( -- # typical value: symbol /, QQ, CC, CC if y.v === 0 then DivisionByZero() else toExpr(toRR(x.v,precision(y.v.re)) / y.v)) - is y:CCicell do ( -- # typical value: symbol /, QQ, CCi, CCi - toExpr(toCCi((y.v.re*x.v)/(y.v.re^long(2)+y.v.im^long(2)),(-y.v.im*x.v)/(y.v.re^long(2)+y.v.im^long(2))))) + is y:CCicell do ( -- # typical value: symbol /, QQ, CCi, CCi + toExpr(toCCi((y.v.re*x.v)/(y.v.re^long(2)+y.v.im^long(2)),(-y.v.im*x.v)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) is x:RRcell do ( @@ -466,35 +466,35 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( if y.v === 0 then DivisionByZero() else toExpr(x.v / y.v)) - is y:QQcell do ( -- # typical value: symbol /, RR, QQ, RR + is y:QQcell do ( -- # typical value: symbol /, RR, QQ, RR if y.v === 0 then DivisionByZero() else toExpr(x.v / y.v)) - is y:RRcell do ( -- # typical value: symbol /, RR, RR, RR + is y:RRcell do ( -- # typical value: symbol /, RR, RR, RR toExpr(x.v / y.v)) - is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RR, RRi, RRi - is y:CCcell do ( -- # typical value: symbol /, RR, CC, CC + is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RR, RRi, RRi + is y:CCcell do ( -- # typical value: symbol /, RR, CC, CC toExpr(x.v / y.v)) - is y:CCicell do ( -- # typical value: symbol /, RR, CCi, CCi + is y:CCicell do ( -- # typical value: symbol /, RR, CCi, CCi toExpr(toCCi((y.v.re*x.v)/(y.v.re^long(2)+y.v.im^long(2)),(-y.v.im*x.v)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) - is x:RRicell do ( - when rhs - is y:ZZcell do ( -- # typical value: symbol /, RRi, ZZ, RRi - if y.v === 0 - then DivisionByZero() - else toExpr(x.v / y.v)) - is y:QQcell do ( -- # typical value: symbol /, RRi, QQ, RRi - if y.v === 0 - then DivisionByZero() - else toExpr(x.v / y.v)) - is y:RRcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RR, RRi - is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RRi, RRi - is y:CCcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, CC, CCi - is y:CCicell do (toExpr(toCCi((x.v*y.v.re)/(y.v.re^long(2)+y.v.im^long(2)),(-x.v*y.v.im)/(y.v.re^long(2)+y.v.im^long(2))))) -- # typical value: symbol /, RRi, CCi, CCi - is Error do rhs - else binarymethod(lhs,rhs,DivideS)) + is x:RRicell do ( + when rhs + is y:ZZcell do ( -- # typical value: symbol /, RRi, ZZ, RRi + if y.v === 0 + then DivisionByZero() + else toExpr(x.v / y.v)) + is y:QQcell do ( -- # typical value: symbol /, RRi, QQ, RRi + if y.v === 0 + then DivisionByZero() + else toExpr(x.v / y.v)) + is y:RRcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RR, RRi + is y:RRicell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, RRi, RRi + is y:CCcell do (toExpr(x.v / y.v)) -- # typical value: symbol /, RRi, CC, CCi + is y:CCicell do (toExpr(toCCi((x.v*y.v.re)/(y.v.re^long(2)+y.v.im^long(2)),(-x.v*y.v.im)/(y.v.re^long(2)+y.v.im^long(2))))) -- # typical value: symbol /, RRi, CCi, CCi + is Error do rhs + else binarymethod(lhs,rhs,DivideS)) is x:CCcell do ( when rhs is y:ZZcell do ( -- # typical value: symbol /, CC, ZZ, CC @@ -502,43 +502,43 @@ export (lhs:Expr) / (rhs:Expr) : Expr := ( then DivisionByZero() else toExpr(x.v / toRR(y.v,precision(x.v.re))) ) - is y:QQcell do ( -- # typical value: symbol /, CC, QQ, CC + is y:QQcell do ( -- # typical value: symbol /, CC, QQ, CC if y.v === 0 then DivisionByZero() else toExpr(x.v / toRR(y.v,precision(x.v.re))) ) - is y:RRcell do ( -- # typical value: symbol /, CC, RR, CC + is y:RRcell do ( -- # typical value: symbol /, CC, RR, CC toExpr(x.v / y.v)) - is y:RRicell do ( -- # typical value: symbol /, CC, RRi, CCi + is y:RRicell do ( -- # typical value: symbol /, CC, RRi, CCi toExpr(toCCi(x.v.re/y.v,x.v.im/y.v))) - is y:CCcell do ( -- # typical value: symbol /, CC, CC, CC + is y:CCcell do ( -- # typical value: symbol /, CC, CC, CC toExpr(x.v / y.v)) - is y:CCicell do ( -- # typical value: symbol /, CC, CCi, CCi + is y:CCicell do ( -- # typical value: symbol /, CC, CCi, CCi toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)+y.v.im^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) is Error do rhs else binarymethod(lhs,rhs,DivideS)) - is x:CCicell do ( - when rhs - is y:ZZcell do ( -- # typical value: symbol /, CCi, ZZ, CCi - if y.v === 0 - then DivisionByZero() - else toExpr(toCCi(x.v.re / toRR(y.v,precision(x.v.re)),x.v.im / toRR(y.v,precision(x.v.re)))) - ) - is y:QQcell do ( -- # typical value: symbol /, CCi, QQ, CCi - if y.v === 0 - then DivisionByZero() - else toExpr(toCCi(x.v.re / toRR(y.v,precision(x.v.re)),x.v.im / toRR(y.v,precision(x.v.re)))) - ) - is y:RRcell do ( -- # typical value: symbol /, CCi, RR, CCi - toExpr(toCCi(x.v.re / y.v,x.v.im/y.v))) - is y:RRicell do ( -- # typical value: symbol /, CCi, RRi, CCi - toExpr(toCCi(x.v.re / y.v,x.v.im/y.v))) - is y:CCcell do ( -- # typical value: symbol /, CCi, CC, CCi - toExpr(x.v/y.v)) - is y:CCicell do ( -- # typical value: symbol /, CCi, CCi, CCi - toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)+y.v.im^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) - is Error do rhs - else binarymethod(lhs,rhs,DivideS)) + is x:CCicell do ( + when rhs + is y:ZZcell do ( -- # typical value: symbol /, CCi, ZZ, CCi + if y.v === 0 + then DivisionByZero() + else toExpr(toCCi(x.v.re / toRR(y.v,precision(x.v.re)),x.v.im / toRR(y.v,precision(x.v.re)))) + ) + is y:QQcell do ( -- # typical value: symbol /, CCi, QQ, CCi + if y.v === 0 + then DivisionByZero() + else toExpr(toCCi(x.v.re / toRR(y.v,precision(x.v.re)),x.v.im / toRR(y.v,precision(x.v.re)))) + ) + is y:RRcell do ( -- # typical value: symbol /, CCi, RR, CCi + toExpr(toCCi(x.v.re / y.v,x.v.im/y.v))) + is y:RRicell do ( -- # typical value: symbol /, CCi, RRi, CCi + toExpr(toCCi(x.v.re / y.v,x.v.im/y.v))) + is y:CCcell do ( -- # typical value: symbol /, CCi, CC, CCi + toExpr(x.v/y.v)) + is y:CCicell do ( -- # typical value: symbol /, CCi, CCi, CCi + toExpr(toCCi((y.v.re*x.v.re+y.v.im*x.v.im)/(y.v.re^long(2)+y.v.im^long(2)),(y.v.re*x.v.im-y.v.im*x.v.re)/(y.v.re^long(2)+y.v.im^long(2))))) + is Error do rhs + else binarymethod(lhs,rhs,DivideS)) is x:RawMonomialCell do ( when rhs is y:RawMonomialCell do ( -- # typical value: symbol /, RawMonomial, RawMonomial, RawMonomial @@ -723,7 +723,7 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( ) is y:CCcell do toExpr(toRR(x.v,precision(y.v))^y.v) is y:CCicell do toExpr(toCCi(x.v,precision(y.v))^y.v) - is Error do rhs + is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:QQcell do ( when rhs @@ -756,13 +756,13 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( if isNegative(x.v) then toExpr(toCC(x.v,precision(y.v))^y.v) else toExpr(toRR(x.v,precision(y.v))^y.v)) - is y:RRicell do ( + is y:RRicell do ( if isNegative(x.v) then buildErrorPacket("negative base not implemented") else toExpr(toRR(x.v,precision(y.v))^y.v)) is y:CCcell do toExpr(toRR(x.v,precision(y.v))^y.v) is y:CCicell do toExpr(toCCi(x.v,precision(y.v))^y.v) - is Error do rhs + is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:RRcell do ( when rhs @@ -784,14 +784,14 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( then toExpr(toCC(x.v)^y.v) else toExpr(x.v^y.v) ) - is y:RRicell do ( + is y:RRicell do ( if isNegative(x.v) then buildErrorPacket("negative base not implemented") else toExpr(x.v^y.v) ) is y:CCcell do toExpr(x.v^y.v) is y:CCicell do toExpr(toCCi(x.v)^y.v) - is Error do rhs + is Error do rhs else binarymethod(lhs,rhs,PowerS)) is x:RRicell do ( when rhs @@ -810,14 +810,14 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( then toExpr(x.v^y.v) else buildErrorPacket("negative base not implemented") ) - is y:RRicell do ( + is y:RRicell do ( if x.v >= 0 then toExpr(x.v^y.v) else buildErrorPacket("negative base not implemented") ) - is y:CCcell do toExpr(toCCi(x.v)^toCCi(y.v)) - is y:CCicell do toExpr(toCCi(x.v)^y.v) - else binarymethod(lhs,rhs,PowerS)) + is y:CCcell do toExpr(toCCi(x.v)^toCCi(y.v)) + is y:CCicell do toExpr(toCCi(x.v)^y.v) + else binarymethod(lhs,rhs,PowerS)) is x:CCcell do ( when rhs is y:ZZcell do toExpr(x.v^y.v) @@ -828,9 +828,9 @@ export (lhs:Expr) ^ (rhs:Expr) : Expr := ( is y:RRcell do toExpr(x.v^y.v) is y:CCcell do toExpr(x.v^y.v) is y:CCicell do toExpr(toCCi(x.v)^y.v) - is Error do rhs + is Error do rhs else binarymethod(lhs,rhs,PowerS)) - is x:CCicell do ( + is x:CCicell do ( when rhs is y:ZZcell do toExpr(x.v^y.v) is y:QQcell do toExpr(x.v^toCCi(y.v,precision(x.v))) @@ -1336,7 +1336,7 @@ isFinite(e:Expr):Expr := ( is x:RRcell do toExpr(isfinite(x.v)) is x:RRicell do toExpr(isfinite(x.v)) is x:CCcell do toExpr(isfinite(x.v)) - is x:CCicell do toExpr(isfinite(x.v)) + is x:CCicell do toExpr(isfinite(x.v)) else WrongArg("a number") ); setupfun("isFinite0",isFinite); @@ -1349,7 +1349,7 @@ isANumber(e:Expr):Expr := ( is x:RRcell do toExpr(!isnan(x.v)) is x:RRicell do toExpr(!isnan(x.v)) is x:CCcell do toExpr(!isnan(x.v)) - is x:CCicell do toExpr(!isnan(x.v)) + is x:CCicell do toExpr(!isnan(x.v)) else WrongArg("a number") ); setupfun("isANumber",isANumber); @@ -1361,7 +1361,7 @@ isInfinite(e:Expr):Expr := ( is x:RRcell do toExpr(isinf(x.v)) is x:RRicell do toExpr(isinf(x.v)) is x:CCcell do toExpr(isinf(x.v)) - is x:CCicell do toExpr(isinf(x.v)) + is x:CCicell do toExpr(isinf(x.v)) else WrongArg("a number") ); setupfun("isInfinite",isInfinite).Protected=false; diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 24747dcc0ca..263e3882e52 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1413,71 +1413,73 @@ setupfun("toRRi",toRRi); toCCi(e:Expr):Expr := ( when e - is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) - is x:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) - is x:RRcell do toExpr(toCCi(toRRi(x.v),toRRi(0, precision(x.v)))) - is x:RRicell do toExpr(toCCi(x.v,toRRi(0, precision(x.v)))) - is x:CCcell do toExpr(toCCi(toRRi(realPart(x.v)),toRRi(imaginaryPart(x.v)))) - is x:CCicell do e - is s:Sequence do ( - if length(s) > 3 then WrongNumArgs(1,3) else - if length(s) == 2 then ( - when s.0 is x:ZZcell do ( - when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) - is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) - is y:CCicell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - is x:QQcell do ( - when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - is x:RRcell do ( - when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) - is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - is x:RRicell do ( - when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) - is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - - else when s.0 is prec:ZZcell do ( - when s.1 is x:ZZcell do ( - when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - is x:QQcell do ( - when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - is x:RRcell do ( - when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - is x:RRicell do ( - when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) - else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) - else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")) - else WrongNumArgs(1,2)) - else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")); + is x:ZZcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) + is x:QQcell do toExpr(toCCi(toRRi(x.v,defaultPrecision),toRRi(0,defaultPrecision))) + is x:RRcell do toExpr(toCCi(toRRi(x.v),toRRi(0, precision(x.v)))) + is x:RRicell do toExpr(toCCi(x.v,toRRi(0, precision(x.v)))) + is x:CCcell do toExpr(toCCi(toRRi(realPart(x.v)),toRRi(imaginaryPart(x.v)))) + is x:CCicell do e + is s:Sequence do ( + if length(s) > 3 then WrongNumArgs(1,3) else + if length(s) == 2 then ( + when s.0 + is x:ZZcell do ( + when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) + is y:CCcell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) + is y:CCicell do toExpr(toCCi(toRRi(realPart(y.v), toULong(x.v)),toRRi(imaginaryPart(y.v), toULong(x.v)))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:QQcell do ( + when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v), toRRi(y.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v, precision(y.v)),toRRi(y.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,precision(y.v)),y.v)) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRcell do ( + when s.1 is y:ZZcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) + is y:QQcell do toExpr(toCCi(toRRi(x.v),toRRi(y.v,precision(x.v)))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRicell do ( + when s.1 is y:ZZcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) + is y:QQcell do toExpr(toCCi(x.v,toRRi(y.v,precision(x.v)))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,min(precision(x.v),precision(y.v))),toRRi(y.v,min(precision(x.v),precision(y.v))))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + else ( + when s.0 + is prec:ZZcell do ( + when s.1 is x:ZZcell do ( + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:QQcell do ( + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRcell do ( + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + is x:RRicell do ( + when s.2 is y:ZZcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:QQcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRcell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + is y:RRicell do toExpr(toCCi(toRRi(x.v,toULong(prec.v)),toRRi(y.v,toULong(prec.v)),toULong(prec.v))) + else WrongArg(1,"a pair of intervals, rational, real numbers, or interval")) + else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")) + else WrongNumArgs(1,2))) + else WrongArg(1,"a pair or triple of integral, rational, or real numbers, with a precision")); setupfun("toCCi",toCCi); rightRR(e:Expr):Expr := ( From 6c8331b8ecf783e45552a06155e533a0d5f1f344 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 25 Nov 2025 22:24:46 -0500 Subject: [PATCH 173/691] Bump flint to 3.4.0 [ci skip] --- M2/libraries/flint/Makefile.in | 2 +- M2/submodules/flint | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/libraries/flint/Makefile.in b/M2/libraries/flint/Makefile.in index 7709246b611..e1e054c249b 100644 --- a/M2/libraries/flint/Makefile.in +++ b/M2/libraries/flint/Makefile.in @@ -2,7 +2,7 @@ SUBMODULE = true # LIBNAME = flint2 HOMEPAGE = http://flintlib.org URL = https://github.com/flintlib/flint -VERSION = 3.3.1 +VERSION = 3.4.0 # PATCHFILE = @abs_srcdir@/patch-$(VERSION) PARALLEL = yes diff --git a/M2/submodules/flint b/M2/submodules/flint index 17950040404..2b0788802ab 160000 --- a/M2/submodules/flint +++ b/M2/submodules/flint @@ -1 +1 @@ -Subproject commit 17950040404e6ed797a4becd8a866fb3f62b5c5e +Subproject commit 2b0788802abf62ec29d8e4a8f917993606e517e0 From c5c3cf03ad893072c6095796d42e51bfd26928c3 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 26 Nov 2025 06:21:01 -0500 Subject: [PATCH 174/691] Bump 4ti2 to 1.6.14 [ci skip] --- M2/cmake/build-libraries.cmake | 4 ++-- M2/libraries/4ti2/Makefile.in | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/M2/cmake/build-libraries.cmake b/M2/cmake/build-libraries.cmake index 6d9d3bdfeea..f14b294c376 100644 --- a/M2/cmake/build-libraries.cmake +++ b/M2/cmake/build-libraries.cmake @@ -772,8 +772,8 @@ set(4ti2_PROGRAMS qsolve rays walk zbasis zsolve hilbert graver ppi genmodel gensymm output) list(TRANSFORM 4ti2_PROGRAMS PREPEND ${M2_HOST_PREFIX}/bin/ OUTPUT_VARIABLE 4ti2_PROGRAMS) ExternalProject_Add(build-4ti2 - URL https://github.com/4ti2/4ti2/releases/download/Release_1_6_13/4ti2-1.6.13.tar.gz - URL_HASH SHA256=f59e1ea5563d2188b0e8ff61a8584845a899e3e54a570305f6f99b26c9b1e6b5 + URL https://github.com/4ti2/4ti2/releases/download/Release_1_6_14/4ti2-1.6.14.tar.gz + URL_HASH SHA256=1bc340173f93ca4abd30ea962118bd5057fdedf7e79c71d2a0c4cc9569f8b0b1 PREFIX libraries/4ti2 SOURCE_DIR libraries/4ti2/build DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/BUILD/tarfiles diff --git a/M2/libraries/4ti2/Makefile.in b/M2/libraries/4ti2/Makefile.in index 27171dbd039..34402399959 100644 --- a/M2/libraries/4ti2/Makefile.in +++ b/M2/libraries/4ti2/Makefile.in @@ -1,11 +1,10 @@ -# temporary beta testing version -VERSION = 1.6.13 +VERSION = 1.6.14 TARDIR = 4ti2-$(VERSION) # PATCHFILE = @abs_srcdir@/patch-$(VERSION) PRECONFIGURE = autoreconf -vif -VERSION_ = $(shell echo $(VERSION) | sed 's/\./_/g') +VERSION_ = $(subst .,_,$(VERSION)) URL = https://github.com/4ti2/4ti2/releases/download/Release_$(VERSION_) ifeq (@ENABLE_STRIP@,yes) From e6a47233b02810d818fa8a96f01e658569021ebe Mon Sep 17 00:00:00 2001 From: Jazengm Date: Sun, 30 Nov 2025 22:21:30 -0800 Subject: [PATCH 175/691] Fixed Documentation of 'InverseSystems' and 'inverseSystem' from InverseSystems --- M2/Macaulay2/packages/InverseSystems.m2 | 50 ++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/M2/Macaulay2/packages/InverseSystems.m2 b/M2/Macaulay2/packages/InverseSystems.m2 index b44a71a894c..85fc15d17bf 100644 --- a/M2/Macaulay2/packages/InverseSystems.m2 +++ b/M2/Macaulay2/packages/InverseSystems.m2 @@ -379,7 +379,7 @@ Description Method: To represent finitely generated S-submodule of $D'$ as an S-module we use the map of modules S/(x_1^d,\dots, x_n^d) -> D' sending $x^a$ to - contract(x^a, product(n, j-> x_i^{d-1})), and its inverse, + contract(x^a, product(1 .. n, i -> x_i^(d-1))), and its inverse, which is of course defined only on divided monomials of small degree. Caveat @@ -470,14 +470,14 @@ Usage M1 = inverseSystem I Inputs M:Matrix - if r rows, then represents a submodule of D'^r + if $r$ rows, then represents a submodule of $D'^r$ M:RingElement I:Ideal Outputs I1:Ideal - if r=1 + if $r=1$ I1:Module - submodule of S^r + submodule of $S^r$ M1:Matrix Description Text @@ -485,27 +485,27 @@ Description ideals and modules. For that application see @TO Gorenstein@. - Let S = k[x_1..x_n] be a standard graded polynomial ring, - and let D be its dual, the divided power algebra, - regarded as an S-module. Let M be an rxm matrix of polynomials, - and let I be an ideal of S. + Let $S = k[x_1,\ldots,x_n]$ be a standard graded polynomial ring, + and let $D$ be its dual, the divided power algebra, + regarded as an $S$-module. Let $M$ be an $r \times m$ matrix of polynomials, + and let $I$ be an ideal of $S$. - From a submodule of D^r to a submodule of S^r (or to an ideal, if r=1): + From a submodule of $D^r$ to a submodule of $S^r$ (or to an ideal, if $r=1$): - We think of the columns of M as generators of an S-submodule MM of D^r, + We think of the columns of M as generators of an $S$-submodule MM of $D^r$, and - inverseSystem M returns the annihilator of MM in S^r = Hom_{graded}(D^r,k). + inverseSystem M returns the annihilator of MM in $S^r = \mathrm{Hom}_{\text{graded}}(D^r,k)$. In the default behavior a monomial $x^a$ in an entry of the matrix M is taken to represent - $a!x^(a) \in D'$, where, - $a = (a_1,\dots,a_n)$ then $a! = a_1!*\dots*a_n!$. Use + $a!x^{(a)} \in D'$, where, + $a = (a_1,\dots,a_n)$ then $a! = a_1!\times\dots\times a_n!$. Use inverseSystem(M, DividedPowers => false) - to make the monomials of entries of M represent the dual basis of the monomial basis of S, - that is, the divided powers of the generators of D as an algebra. + to make the monomials of entries of M represent the dual basis of the monomial basis of $S$, + that is, the divided powers of the generators of $D$ as an algebra. - From an ideal of S to a submodule of D: + From an ideal of $S$ to a submodule of $D$: If $I$ is an ideal of $S$, homogeneous or not, we regard $I$ as an ideal of the localization $S'$ of $S$ at $(x_1,\dots,x_n)$. If $S'/I$ is of @@ -517,22 +517,22 @@ Description M1 = inverseSystem(I, DividedPowers => false) - each return a 1 x m matrix whose entries are + each return a $1 \times m$ matrix whose entries are the minimal generators of the annihilator of $I$ in $D$. In the matrix $M$ a term $x^a$ is to be interpreted as - $a! x^(a)$, while in the matrix $M'$ it is interpreted - as $x^(a)$. Of course the first computation is only + $a! x^{(a)}$, while in the matrix $M'$ it is interpreted + as $x^{(a)}$. Of course the first computation is only valid if all the powers of variables appearing in the generators of $I$ are < char k. To make these computations it is necessary to represent some sufficiently - large finitely generated S-submodule of $D$ (this will automatically be + large finitely generated $S$-submodule of $D$ (this will automatically be an $S'$-submodule. To do this we use the map of modules - D-> S/(x_1^d,\dots, x_n^d) sending $x^{(a)}$ to - contract(x^a, product(n, j-> x_i^{d-1})), defined only when the variables - in $x^{(a)}$ appear only with powers < d. + $D\to S/(x_1^d,\dots, x_n^d)$ sending $x^{(a)}$ to + contract(x^a, product(1 .. n, i -> x_i^(d-1))), defined only when the variables + in $x^{(a)}$ appear only with powers < $d$. Example setRandomSeed 0 @@ -565,10 +565,10 @@ Caveat it should not be used in the default mode unless the characteristic is greater than the highest degree to which a variable appears. - To make $x^a$ represent $x^(a)$, + To make $x^a$ represent $x^{(a)}$, for example in small characteristics use - inverseSystem(Matrix, DividedPowers=>false) + inverseSystem(Matrix, DividedPowers=>true) (which was the default behavior of the old script "fromDual"). From 298315bfebd2d4686dd3c607cde68836e26b82ba Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 1 Dec 2025 17:49:48 -0500 Subject: [PATCH 176/691] Remove unused RRb/CCb top-level classes --- M2/Macaulay2/d/classes.dd | 2 -- M2/Macaulay2/d/expr.d | 2 -- 2 files changed, 4 deletions(-) diff --git a/M2/Macaulay2/d/classes.dd b/M2/Macaulay2/d/classes.dd index 32eaf7fa10b..2a361177b0d 100644 --- a/M2/Macaulay2/d/classes.dd +++ b/M2/Macaulay2/d/classes.dd @@ -22,11 +22,9 @@ setupconst("QQ",Expr(QQClass)); setupconst("RingFamily",Expr(ringFamilyClass)); setupconst("InexactFieldFamily",Expr(inexactNumberTypeClass)); setupconst("RRi",Expr(RRiClass)); -setupconst("RRb",Expr(RRbClass)); setupconst("RR",Expr(RRClass)); setupconst("CC",Expr(CCClass)); setupconst("CCi",Expr(CCiClass)); -setupconst("CCb",Expr(CCbClass)); setupconst("RingElement",Expr(ringElementClass)); setupconst("Number",Expr(numberClass)); setupconst("InexactNumber",Expr(inexactNumberClass)); diff --git a/M2/Macaulay2/d/expr.d b/M2/Macaulay2/d/expr.d index 111b1409ebf..4313c97aaa2 100644 --- a/M2/Macaulay2/d/expr.d +++ b/M2/Macaulay2/d/expr.d @@ -356,8 +356,6 @@ export pointerClass := newbasictype(); export atomicIntClass := newbasictype(); export pseudocodeClosureClass := newtypeof(pseudocodeClass); export CCiClass := newbignumbertype(); -export RRbClass := newbignumbertype(); -export CCbClass := newbignumbertype(); -- all new types, dictionaries, and classes go just above this line, if possible, so hash codes don't change gratuitously! From 1038144d27f582798dc8de6de3c26ea6ab223484 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 2 Dec 2025 12:30:49 -0500 Subject: [PATCH 177/691] Added upperLeft, lowerLeft, upperRight, lowerRight for CCi --- M2/Macaulay2/e/aring-CCi.hpp | 2 +- M2/Macaulay2/m2/exports.m2 | 4 ++++ M2/Macaulay2/m2/methods.m2 | 1 + M2/Macaulay2/m2/reals.m2 | 24 ++++++++++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/e/aring-CCi.hpp b/M2/Macaulay2/e/aring-CCi.hpp index 2053c28ab27..70aa5752f08 100644 --- a/M2/Macaulay2/e/aring-CCi.hpp +++ b/M2/Macaulay2/e/aring-CCi.hpp @@ -45,7 +45,7 @@ class ARingCCi : public SimpleARing double d2 = mpfr_get_d(&(a.re.right), MPFR_RNDN); double d3 = mpfr_get_d(&(a.im.left), MPFR_RNDN); double d4 = mpfr_get_d(&(a.im.right), MPFR_RNDN); - double d = 12347. * d1 + 865800. * d2 + 72158. * d3 + 86429. * d4; + double d = 12347. * d1 + 865800. * d2 + 72158. * d3 + 86429. * d4; return static_cast(d); } diff --git a/M2/Macaulay2/m2/exports.m2 b/M2/Macaulay2/m2/exports.m2 index 63c5b914885..d8143d2e17d 100644 --- a/M2/Macaulay2/m2/exports.m2 +++ b/M2/Macaulay2/m2/exports.m2 @@ -894,6 +894,8 @@ export { "log1p", "lookup", "lookupCount", + "lowerLeft", + "lowerRight", "makeDirectory", "makeDocumentTag", "makePackageIndex", @@ -1244,6 +1246,8 @@ export { "unique", "unsequence", "unstack", + "upperLeft", + "upperRight", "urlEncode", "use", "userSymbols", diff --git a/M2/Macaulay2/m2/methods.m2 b/M2/Macaulay2/m2/methods.m2 index 75037deefdb..b1f5b3069f1 100644 --- a/M2/Macaulay2/m2/methods.m2 +++ b/M2/Macaulay2/m2/methods.m2 @@ -276,6 +276,7 @@ setupMethods((), { coefficients, monomials, size, sum, product, nullhomotopy, module, raw, content, leadTerm, leadCoefficient, leadMonomial, components, assign, realPart, imaginaryPart, conjugate, + lowerLeft, lowerRight, upperLeft, upperRight, relations, inverse, numeric, numericInterval, floor, ceiling, round, degree, multidegree, presentation, dismiss, precision, norm, clean, fraction, part, diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 298e3602c13..27d8b579334 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -274,6 +274,30 @@ imaginaryPart QQ := imaginaryPart InexactNumber := imaginaryPart0 imaginaryPart Number := imaginaryPart0 @@ numeric +lowerLeft ZZ := +lowerLeft QQ := +lowerLeft RR := identity +lowerLeft RRi := left +lowerLeft CCi := z -> (left realPart z) + (left imaginaryPart z)*ii + +lowerRight ZZ := +lowerRight QQ := +lowerRight RR := identity +lowerRight RRi := right +lowerRight CCi := z -> (right realPart z) + (left imaginaryPart z)*ii + +upperLeft ZZ := +upperLeft QQ := +upperLeft RR := identity +upperLeft RRi := left +upperLeft CCi := z -> (left realPart z) + (right imaginaryPart z)*ii + +upperRight ZZ := +upperRight QQ := +upperRight RR := identity +upperRight RRi := right +upperRight CCi := z -> (right realPart z) + (right imaginaryPart z)*ii + conjugate CC := z -> toCC(precision z, realPart z, - imaginaryPart z) conjugate CCi := z -> toCCi(precision z, realPart z, - imaginaryPart z) conjugate Constant := conjugate @@ numeric From d5a423c64bb1ae1a571930bd92d3546f281cbc32 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 2 Dec 2025 12:31:31 -0500 Subject: [PATCH 178/691] Added upperLeft, lowerLeft, upperRight, lowerRight for CCi --- M2/Macaulay2/m2/reals.m2 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 27d8b579334..ed411e1862e 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -276,25 +276,29 @@ imaginaryPart Number := imaginaryPart0 @@ numeric lowerLeft ZZ := lowerLeft QQ := -lowerLeft RR := identity +lowerLeft RR := +lowerLeft CC := identity lowerLeft RRi := left lowerLeft CCi := z -> (left realPart z) + (left imaginaryPart z)*ii lowerRight ZZ := lowerRight QQ := -lowerRight RR := identity +lowerRight RR := +lowerRight CC := identity lowerRight RRi := right lowerRight CCi := z -> (right realPart z) + (left imaginaryPart z)*ii upperLeft ZZ := upperLeft QQ := -upperLeft RR := identity +upperLeft RR := +upperLeft CC := identity upperLeft RRi := left upperLeft CCi := z -> (left realPart z) + (right imaginaryPart z)*ii upperRight ZZ := upperRight QQ := -upperRight RR := identity +upperRight RR := +upperRight CC := identity upperRight RRi := right upperRight CCi := z -> (right realPart z) + (right imaginaryPart z)*ii From 05d5aa5d835700b92e9a4ff8a51ad3fe6facc1e4 Mon Sep 17 00:00:00 2001 From: Michael Burr Date: Tue, 2 Dec 2025 12:38:25 -0500 Subject: [PATCH 179/691] Simplifying lowerLeft, etc. --- M2/Macaulay2/m2/reals.m2 | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index ed411e1862e..4a1c62cdfd8 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -274,31 +274,19 @@ imaginaryPart QQ := imaginaryPart InexactNumber := imaginaryPart0 imaginaryPart Number := imaginaryPart0 @@ numeric -lowerLeft ZZ := -lowerLeft QQ := -lowerLeft RR := -lowerLeft CC := identity +lowerLeft Number := identity lowerLeft RRi := left lowerLeft CCi := z -> (left realPart z) + (left imaginaryPart z)*ii -lowerRight ZZ := -lowerRight QQ := -lowerRight RR := -lowerRight CC := identity +lowerRight Number := identity lowerRight RRi := right lowerRight CCi := z -> (right realPart z) + (left imaginaryPart z)*ii -upperLeft ZZ := -upperLeft QQ := -upperLeft RR := -upperLeft CC := identity +upperLeft Number := identity upperLeft RRi := left upperLeft CCi := z -> (left realPart z) + (right imaginaryPart z)*ii -upperRight ZZ := -upperRight QQ := -upperRight RR := -upperRight CC := identity +upperRight Number := identity upperRight RRi := right upperRight CCi := z -> (right realPart z) + (right imaginaryPart z)*ii From 551367d1462e86a116bc7fc4357db28d41a28588 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 18 Nov 2025 12:09:25 -0500 Subject: [PATCH 180/691] Update testbot dockerfile Two changes: * bookworm -> trixie (released 8/25) * Use new M2 Debian repo [ci skip] --- M2/BUILD/docker/testbot/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/BUILD/docker/testbot/Dockerfile b/M2/BUILD/docker/testbot/Dockerfile index 1d0a0592b26..d5d1ee4ae83 100644 --- a/M2/BUILD/docker/testbot/Dockerfile +++ b/M2/BUILD/docker/testbot/Dockerfile @@ -1,16 +1,16 @@ # Time usage: <5min # Net usage: <200MB -# Disk usage: <800MB +# Disk usage: <850MB -FROM debian:bookworm +FROM debian:trixie LABEL org.opencontainers.image.source=https://github.com/Macaulay2/M2 # Setup the system -RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates debian-keyring git && apt-get clean +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates wget git && apt-get clean # Install Macaulay2 -RUN echo "deb [signed-by=/usr/share/keyrings/debian-keyring.gpg] https://people.debian.org/~dtorrance/debian bookworm/" >> /etc/apt/sources.list && apt-get update && apt-get install -y --no-install-recommends macaulay2 4ti2 cohomcalg coinor-csdp gfan nauty normaliz topcom msolve && apt-get clean +RUN wget -O /etc/apt/sources.list.d/macaulay2.sources https://macaulay2.com/Repositories/Debian/trixie/macaulay2.sources && apt-get update && apt-get install -y --no-install-recommends macaulay2 4ti2 cohomcalg coinor-csdp gfan nauty normaliz topcom msolve && apt-get clean # Add non-root user for using Macaulay2 RUN useradd -G sudo -g root -u 1000 -m macaulay && echo "macaulay ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers From 4b969bfd521c27f299ac52ed69810971f037d3af Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 4 Dec 2025 11:28:37 -0500 Subject: [PATCH 181/691] Make midpoint a method --- M2/Macaulay2/d/actors4.d | 2 +- M2/Macaulay2/m2/intervals.m2 | 4 ++++ M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 263e3882e52..701c9ddab7a 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1506,7 +1506,7 @@ midpoint0(e:Expr):Expr := ( is x:RRicell do toExpr(midpointRR(x.v)) is x:CCicell do toExpr(toCC(midpointRR(realPart(x.v)),midpointRR(imaginaryPart(x.v)))) else WrongArg("an interval or ball")); -setupfun("midpoint",midpoint0); +setupfun("midpoint0",midpoint0); isEmptyRRi(e:Expr):Expr := ( when e diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 46eb07f80ec..7eb36700903 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -120,5 +120,9 @@ CC ? CCi := (x, y) -> toCCi x ? y isEmpty RRi := Boolean => isEmptyRRi isEmpty CCi := x -> isEmptyRRi realPart x or isEmptyRRi imaginaryPart x +midpoint = method() +midpoint Number := identity +midpoint RRi := midpoint CCi := midpoint0 + toExternalString RRi := x -> "interval" | toExternalString (left x, right x) toExternalString CCi := x -> "interval" | toExternalString (left realPart x+(left imaginaryPart x)*ii,right realPart x+(right imaginaryPart x)*ii) diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index 4b0890242e1..e01c7a57e82 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -44,7 +44,10 @@ SeeAlso doc /// Key - midpoint + midpoint + (midpoint, CCi) + (midpoint, Number) + (midpoint, RRi) Headline midpoint of an interval Usage From db394f1afdcdc5e7fe64fd65d6b67e6906c6da31 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 4 Dec 2025 11:50:23 -0500 Subject: [PATCH 182/691] Add midpoint for matrices and polynomials --- M2/Macaulay2/m2/intervals.m2 | 10 ++++++++++ M2/Macaulay2/m2/matrix.m2 | 2 ++ .../packages/Macaulay2Doc/doc_intervals.m2 | 15 +++++++++++++++ M2/Macaulay2/tests/normal/RRi.m2 | 8 ++++++++ 4 files changed, 35 insertions(+) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 7eb36700903..741195d3d13 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -123,6 +123,16 @@ isEmpty CCi := x -> isEmptyRRi realPart x or isEmptyRRi imaginaryPart x midpoint = method() midpoint Number := identity midpoint RRi := midpoint CCi := midpoint0 +midpoint RingElement := f -> ( + R := ring f; + kk := coefficientRing R; + S := R.cache#"midpoint ring" ??= ( + if instance(kk, RealIntervalField) + then RR_(precision kk) monoid R + else if instance(kk, ComplexIntervalField) + then CC_(precision kk) monoid R + else R); + sum(listForm f, (m, c) -> midpoint c * product(#m, i -> S_i^(m#i)))) toExternalString RRi := x -> "interval" | toExternalString (left x, right x) toExternalString CCi := x -> "interval" | toExternalString (left realPart x+(left imaginaryPart x)*ii,right realPart x+(right imaginaryPart x)*ii) diff --git a/M2/Macaulay2/m2/matrix.m2 b/M2/Macaulay2/m2/matrix.m2 index 1eb4b71a385..f39ebde2ee6 100644 --- a/M2/Macaulay2/m2/matrix.m2 +++ b/M2/Macaulay2/m2/matrix.m2 @@ -781,6 +781,8 @@ leadComponent = method() leadComponent Matrix := List => m -> nonnull for c to numColumns m - 1 list position(numRows m, r -> m_(r,c) != 0, Reverse => true) leadComponent Vector := ZZ => v -> try first leadComponent matrix v else null +midpoint Matrix := f -> matrix apply(entries f, row -> midpoint \ row) + -- Local Variables: -- compile-command: "make -C $M2BUILDDIR/Macaulay2/m2 " -- End: diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index e01c7a57e82..d534cab002f 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -46,8 +46,10 @@ doc /// Key midpoint (midpoint, CCi) + (midpoint, Matrix) (midpoint, Number) (midpoint, RRi) + (midpoint, RingElement) Headline midpoint of an interval Usage @@ -68,6 +70,19 @@ Description Example interval(2 + 3*ii, 4 + 7*ii) midpoint oo + Text + The midpoint of a matrix is the matrix containing the midpoints of + its entries. + Example + A = matrix{{interval(1,3), interval(3,5)}, {interval(5,7), interval(7,9)}} + midpoint A + Text + The midpoint of a polynomial is obtained by taking the midpoints of the + coefficients. + Example + R = RRi[x,y,z] + f = interval(1,3)*x + interval(3,5)*y + interval(5,7)*z + midpoint f SeeAlso left right diff --git a/M2/Macaulay2/tests/normal/RRi.m2 b/M2/Macaulay2/tests/normal/RRi.m2 index 34bee329d5e..cefa3295808 100644 --- a/M2/Macaulay2/tests/normal/RRi.m2 +++ b/M2/Macaulay2/tests/normal/RRi.m2 @@ -119,6 +119,14 @@ assert isSubset(K^2,K*K) assert not isSubset(K*K,K^2) assert isSubset(toCCi(interval(-14,17),interval(-10,24)),L*K) +A = matrix{{interval(1,3), interval(3,5)}, {interval(5,7), interval(7,9)}} +assert(midpoint A == matrix(RR, {{2, 4}, {6, 8}})) + +R = RRi[x,y,z] +f = interval(1,3)*x + interval(3,5)*y + interval(5,7)*z +use ring midpoint f +assert(midpoint f == 2*x + 4*y + 6*z) + --- TO FIX: --------------------------------------------- -* From acf0f3b49caa64787e228f3e4964908abc94f227 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 4 Dec 2025 06:07:30 -0500 Subject: [PATCH 183/691] Bump msolve to 0.9.3 [ci skip] --- M2/cmake/build-libraries.cmake | 4 ++-- M2/libraries/msolve/Makefile.in | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/M2/cmake/build-libraries.cmake b/M2/cmake/build-libraries.cmake index f14b294c376..cdb32caa9a0 100644 --- a/M2/cmake/build-libraries.cmake +++ b/M2/cmake/build-libraries.cmake @@ -486,8 +486,8 @@ endif() # https://github.com/algebraic-solving/msolve ExternalProject_Add(build-msolve - URL https://github.com/algebraic-solving/msolve/archive/refs/tags/v0.9.2.tar.gz - URL_HASH SHA256=9ba8b290fee048e49615015c43a7a1f2c05ac7e7fb277a964105d51c082f7d9f + URL https://github.com/algebraic-solving/msolve/archive/refs/tags/v0.9.3.tar.gz + URL_HASH SHA256=2e46b88b38abbe4e4937ef5fc4a90a006d1ff933ffa7563287b5d756de3bcf6e PREFIX libraries/msolve SOURCE_DIR libraries/msolve/build DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/BUILD/tarfiles diff --git a/M2/libraries/msolve/Makefile.in b/M2/libraries/msolve/Makefile.in index 715d8cb1648..a44b80e956b 100644 --- a/M2/libraries/msolve/Makefile.in +++ b/M2/libraries/msolve/Makefile.in @@ -1,5 +1,5 @@ HOMEPAGE = https://msolve.lip6.fr/ -VERSION = 0.9.2 +VERSION = 0.9.3 URL = https://github.com/algebraic-solving/msolve/archive/refs/tags TARFILE = v$(VERSION).tar.gz LICENSEFILES = README.md COPYING From 7bc615620985a275311f3bae116747fcfac63596 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 5 Dec 2025 09:45:00 -0500 Subject: [PATCH 184/691] Fix midpoint for tower rings Add helper methods for the "midpoint" of a ring (which is the ring where the midpoints of polynomials lie). --- M2/Macaulay2/m2/intervals.m2 | 18 +++++++++--------- M2/Macaulay2/m2/polyrings.m2 | 5 +++++ .../packages/Macaulay2Doc/doc_intervals.m2 | 3 +++ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 741195d3d13..744ac3f6a18 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -123,16 +123,16 @@ isEmpty CCi := x -> isEmptyRRi realPart x or isEmptyRRi imaginaryPart x midpoint = method() midpoint Number := identity midpoint RRi := midpoint CCi := midpoint0 + +midpoint Ring := R -> ( + if instance(R, RealIntervalField) then RR_(precision R) + else if instance(R, ComplexIntervalField) then CC_(precision R) + else R) + midpoint RingElement := f -> ( - R := ring f; - kk := coefficientRing R; - S := R.cache#"midpoint ring" ??= ( - if instance(kk, RealIntervalField) - then RR_(precision kk) monoid R - else if instance(kk, ComplexIntervalField) - then CC_(precision kk) monoid R - else R); - sum(listForm f, (m, c) -> midpoint c * product(#m, i -> S_i^(m#i)))) + R := midpoint ring f; + if R === ring f then f + else sum(listForm f, (m, c) -> midpoint c * product(#m, i -> R_i^(m#i)))) toExternalString RRi := x -> "interval" | toExternalString (left x, right x) toExternalString CCi := x -> "interval" | toExternalString (left realPart x+(left imaginaryPart x)*ii,right realPart x+(right imaginaryPart x)*ii) diff --git a/M2/Macaulay2/m2/polyrings.m2 b/M2/Macaulay2/m2/polyrings.m2 index e4cf369ab9c..c8cf9394399 100644 --- a/M2/Macaulay2/m2/polyrings.m2 +++ b/M2/Macaulay2/m2/polyrings.m2 @@ -287,6 +287,11 @@ selectVariables(List,PolynomialRing) := (v,R) -> ( antipode = method(); antipode RingElement := (f) -> new ring f from rawAntipode raw f; +midpoint PolynomialRing := R -> R.cache.midpoint ??= ( + S := midpoint coefficientRing R; + if S === coefficientRing R then R + else S monoid R) + -- Local Variables: -- compile-command: "make -C $M2BUILDDIR/Macaulay2/m2 " -- End: diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index d534cab002f..a912baf81f9 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -42,6 +42,9 @@ SeeAlso diameter /// +-- helper methods not intended to be called by the user +undocumented {(midpoint, Ring), (midpoint, PolynomialRing)} + doc /// Key midpoint From cc5033d19fc5d63a876a862dca10c62fa2889056 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 5 Dec 2025 10:03:13 -0500 Subject: [PATCH 185/691] Add promoters from RRi and CCi to quotient rings --- M2/Macaulay2/e/polyquotient.hpp | 12 ++++++++++++ M2/Macaulay2/tests/normal/RRi.m2 | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/M2/Macaulay2/e/polyquotient.hpp b/M2/Macaulay2/e/polyquotient.hpp index 1bc73869912..90d39abf60d 100644 --- a/M2/Macaulay2/e/polyquotient.hpp +++ b/M2/Macaulay2/e/polyquotient.hpp @@ -75,6 +75,18 @@ class PolyRingQuotient : public PolyRingFlat normal_form(result); return ret; } + virtual bool from_Interval(gmp_RRi a, ring_elem &result) const + { + bool ret = numerR_->from_Interval(a, result); + normal_form(result); + return ret; + } + virtual bool from_ComplexInterval(gmp_CCi a, ring_elem &result) const + { + bool ret = numerR_->from_ComplexInterval(a, result); + normal_form(result); + return ret; + } virtual bool from_double(double a, ring_elem &result) const { bool ret = numerR_->from_double(a, result); diff --git a/M2/Macaulay2/tests/normal/RRi.m2 b/M2/Macaulay2/tests/normal/RRi.m2 index cefa3295808..6608e5c4010 100644 --- a/M2/Macaulay2/tests/normal/RRi.m2 +++ b/M2/Macaulay2/tests/normal/RRi.m2 @@ -127,6 +127,13 @@ f = interval(1,3)*x + interval(3,5)*y + interval(5,7)*z use ring midpoint f assert(midpoint f == 2*x + 4*y + 6*z) +R = RRi[x]/x^2 +assert(promote(toRRi 2, R) == 2) + +R = CCi[x]/x^2 +assert(promote(toRRi 2, R) == 2) +assert(promote(toCCi 2, R) == 2) + --- TO FIX: --------------------------------------------- -* From f122273dedcb815730e277e3bb0299d02bd13bc4 Mon Sep 17 00:00:00 2001 From: pzinn Date: Wed, 3 Dec 2025 13:39:45 +1100 Subject: [PATCH 186/691] better WebApp mode support for Python --- M2/Macaulay2/packages/Python.m2 | 19 +++- M2/Macaulay2/packages/Python/m2web_backend.py | 99 +++++++++++++++++++ 2 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 M2/Macaulay2/packages/Python/m2web_backend.py diff --git a/M2/Macaulay2/packages/Python.m2 b/M2/Macaulay2/packages/Python.m2 index 5171591a143..8e97fa29e62 100644 --- a/M2/Macaulay2/packages/Python.m2 +++ b/M2/Macaulay2/packages/Python.m2 @@ -146,13 +146,14 @@ pythonInitialize(ZZ#"Python executable" = executable) pythonHelp = Command (() -> builtins@@help()) -expression PythonObject := expression @@ pythonUnicodeAsUTF8 @@ pythonObjectStr -toString PythonObject := toString @@ expression -net PythonObject := net @@ expression -texMath PythonObject := texMath @@ expression +toString PythonObject := pythonUnicodeAsUTF8 @@ pythonObjectStr +net PythonObject := net @@ toString +texMath PythonObject := texMath @@ toString +hypertext PythonObject := x -> SAMP { toString x, "class" => "language-python" } +html PythonObject := html @@ hypertext describe PythonObject := x -> Describe FunctionApplication(pythonValue, - expression x@@"__repr__"()) + toString x@@"__repr__"()) toExternalString PythonObject := toExternalFormat @@ describe typename = x -> ( @@ -609,6 +610,14 @@ installNumPyMethods = () -> ( load "Python/doc.m2" +-- if in WebAppp mode, let's also import matplotlib and change the backend +if topLevelMode === WebApp then try ( + sys@@"path"@@append Python#"auxiliary files"; + mpl := pythonImportImportModule "matplotlib"; + mpl@@use "module://m2web_backend"; +) + + TEST /// ----------- -- value -- diff --git a/M2/Macaulay2/packages/Python/m2web_backend.py b/M2/Macaulay2/packages/Python/m2web_backend.py new file mode 100644 index 00000000000..490e7464584 --- /dev/null +++ b/M2/Macaulay2/packages/Python/m2web_backend.py @@ -0,0 +1,99 @@ +import io +import sys +import base64 + +# Compatibility import for different Matplotlib versions +try: + from matplotlib.backend_bases import FigureManagerBase, FigureCanvasBase +except ImportError: + from matplotlib.backends.backend_bases import FigureManagerBase, FigureCanvasBase + +from matplotlib.backends.backend_agg import FigureCanvasAgg +from matplotlib.backends.backend_svg import FigureCanvasSVG + +ASCII_START = chr(17) # DC1 +ASCII_END = chr(18) # DC2 + +# GLOBAL CONFIGURABLE OPTION +# Valid values: "png", "svg" +output_format = "svg" # default + + +def _emit_html(html): + sys.stdout.buffer.write((ASCII_START + html + ASCII_END).encode("utf-8")) + sys.stdout.buffer.flush() + + +class FigureCanvas(FigureCanvasBase): + """ + Thin wrapper that delegates to either Agg or SVG canvas depending + on the chosen output_format. + """ + + def print_m2web(self, figure): + global output_format + + buf = io.BytesIO() + + # Always create a fresh underlying renderer + if output_format == "svg": + real = FigureCanvasSVG(figure) + real.draw() + real.print_svg(buf) + svg = buf.getvalue().decode("utf-8") + html = f"
{svg}
" + _emit_html(html) + + else: # PNG + real = FigureCanvasAgg(figure) + real.draw() + real.print_png(buf) + data = base64.b64encode(buf.getvalue()).decode("ascii") + html = f'' + _emit_html(html) + + +class FigureManager(FigureManagerBase): + pass + + +def show(): + """ + Replacement for pyplot.show(): render + emit all figures. + """ + import matplotlib._pylab_helpers as helpers + for manager in helpers.Gcf.get_all_fig_managers(): + canvas = manager.canvas + canvas.draw() + canvas.print_m2web(canvas.figure) + + +# --- Backend registration hook --- +# Matplotlib expects FigureCanvas to be an actual real renderer subclass. +# We dynamically build wrapper instances here. + +def new_figure_manager(num, *args, **kwargs): + from matplotlib.figure import Figure + + # Matplotlib may pass a custom figure class + FigureClass = kwargs.pop("FigureClass", Figure) + + # Case 1: pyplot already created the Figure instance + if args and isinstance(args[0], Figure): + figure = args[0] + + else: + # Case 2: backend must construct the figure + figure = FigureClass(*args, **kwargs) + + # Choose actual underlying renderer (Agg or SVG) + if output_format == "svg": + real_canvas = FigureCanvasSVG(figure) + else: + real_canvas = FigureCanvasAgg(figure) + + # Wrapper canvas + canvas = FigureCanvas(figure) + + manager = FigureManager(canvas, num) + return manager From ddc6914acfffcb87f1c8a45afb412772e2f0e75c Mon Sep 17 00:00:00 2001 From: pzinn Date: Wed, 3 Dec 2025 14:23:18 +1100 Subject: [PATCH 187/691] Python doc fixes --- M2/Macaulay2/packages/Python/doc/string.m2 | 1 - M2/Macaulay2/packages/Python/doc/tutorials.m2 | 119 ++++-------------- 2 files changed, 22 insertions(+), 98 deletions(-) diff --git a/M2/Macaulay2/packages/Python/doc/string.m2 b/M2/Macaulay2/packages/Python/doc/string.m2 index bf630ad772f..30bd680db86 100644 --- a/M2/Macaulay2/packages/Python/doc/string.m2 +++ b/M2/Macaulay2/packages/Python/doc/string.m2 @@ -1,7 +1,6 @@ doc /// Key (toString, PythonObject) - (expression, PythonObject) (net, PythonObject) (texMath, PythonObject) Headline diff --git a/M2/Macaulay2/packages/Python/doc/tutorials.m2 b/M2/Macaulay2/packages/Python/doc/tutorials.m2 index 0dbdd973bb8..2fb87919cc8 100644 --- a/M2/Macaulay2/packages/Python/doc/tutorials.m2 +++ b/M2/Macaulay2/packages/Python/doc/tutorials.m2 @@ -130,28 +130,6 @@ doc /// installNumPyMethods /// --* code for canned example - -pycode = get(Python#"auxiliary files" | "doc/matplotlib-example.py") -pythonRunScript pycode - -matplotlib = PythonContext "import matplotlib.pyplot as plt" -matplotlib "import numpy as np" -matplotlib "fig = plt.figure()" -matplotlib "ax = fig.add_subplot(projection='3d')" -matplotlib "t = np.linspace(-10, 10, 100)" -matplotlib "ax.plot(t, t**2, t**3)" -matplotlib "plt.show()" - -plt = import "matplotlib.pyplot" -np = import "numpy" -fig = plt@@figure() -ax = fig@@"add_subplot"(projection => "3d") -t = np@@linspace(-10, 10, 100); -ax@@plot(t, t^2, t^3) -plt@@show() - -*- doc /// Key @@ -173,51 +151,22 @@ doc /// way is with the @TO pythonRunScript@ method. For this example, we have our code saved as a .py file. - CannedExample - i1 : pycode = get(Python#"auxiliary files" | "doc/matplotlib-example.py") - - o1 = import matplotlib.pyplot as plt - import numpy as np - - fig = plt.figure() - ax = fig.add_subplot(projection='3d') - t = np.linspace(-10, 10, 100) - ax.plot(t, t**2, t**3) - plt.show() - - - i2 : pythonRunScript pycode + Example + pycode = get(Python#"auxiliary files" | "doc/matplotlib-example.py") + pythonRunScript pycode Text @HEADER2 "Using a PythonContext"@ @TO PythonContext@ objects allow us to run Python code one line at a time, just like working in the Python REPL. - CannedExample - i3 : matplotlib = PythonContext "import matplotlib.pyplot as plt" - - o3 = matplotlib - - o3 : PythonContext - - i4 : matplotlib "import numpy as np" - - i5 : matplotlib "fig = plt.figure()" - - i6 : matplotlib "ax = fig.add_subplot(projection='3d')" - - i7 : matplotlib "t = np.linspace(-10, 10, 100)" - - i8 : matplotlib "ax.plot(t, t**2, t**3)" - - o8 = [] - - o8 : PythonObject of class list - - i9 : matplotlib "plt.show()" - - o9 = None - - o9 : PythonObject of class NoneType + Example + matplotlib = PythonContext "import matplotlib.pyplot as plt" + matplotlib "import numpy as np" + matplotlib "fig = plt.figure()" + matplotlib "ax = fig.add_subplot(projection='3d')" + matplotlib "t = np.linspace(-10, 10, 100)" + matplotlib "ax.plot(t, t**2, t**3)" + matplotlib "plt.show()" Text @HEADER2 "Using PythonObjects directly"@ @@ -227,19 +176,9 @@ doc /// First, we import the necessary modules using @TO import@. Note that we can essentially replace the Python @CODE "import foo as bar"@ with @CODE "bar = import \"foo\""@. - CannedExample - i10 : plt = import "matplotlib.pyplot" - - o10 = - - o10 : PythonObject of class module - - i11 : np = import "numpy" - - o11 = - - o11 : PythonObject of class module + Example + plt = import "matplotlib.pyplot" + np = import "numpy" Text Next, we begin to create the various Python objects needed for our plot. @@ -249,34 +188,20 @@ doc /// (see @TO (symbol \@\@, PythonObject, Thing)@). We need to be careful for attributes that include underscores. They must given as strings, i.e., delimited using quotes. - CannedExample - i12 : fig = plt@@figure() - - o12 = Figure(640x480) - - o12 : PythonObject of class matplotlib.figure.Figure - - i13 : ax = fig@@"add_subplot"(projection => "3d") - - o13 = Axes3DSubplot(0.125,0.11;0.775x0.77) - - o13 : PythonObject of class matplotlib.axes._subplots.Axes3DSubplot - - i14 : t = np@@linspace(-10, 10, 100); + Example + fig = plt@@figure() + ax = fig@@"add_subplot"(projection => "3d") + t = np@@linspace(-10, 10, 100); Text Now we construct the twisted cubic. Note that even though Python itself uses @CODE "**"@ for exponentiation, we may use @TO symbol ^@ for consistency with the rest of Macaulay2. - CannedExample - i15 : ax@@plot(t, t^2, t^3) - - o15 = [] - - o15 : PythonObject of class list + Example + ax@@plot(t, t^2, t^3) Text Finally, we show our plot. - CannedExample - i16 : plt@@show() + Example + plt@@show() Text All three of the above methods should have resulted in a window appearing containing the following image. From e6dddc24dfad8e47b357e00234e045f56e5e7b35 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Wed, 3 Dec 2025 09:58:39 -0500 Subject: [PATCH 188/691] Use cached example for matplotlib tutorial --- M2/Macaulay2/packages/Python.m2 | 3 +- ...ptwisted_spcubic_spwith_sp__Matplotlib.out | 139 ++++++++++++++++++ 2 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 M2/Macaulay2/packages/Python/examples/___Python_sptutorial_co_spplotting_spthe_sptwisted_spcubic_spwith_sp__Matplotlib.out diff --git a/M2/Macaulay2/packages/Python.m2 b/M2/Macaulay2/packages/Python.m2 index 8e97fa29e62..214f13d6bb2 100644 --- a/M2/Macaulay2/packages/Python.m2 +++ b/M2/Macaulay2/packages/Python.m2 @@ -17,7 +17,8 @@ newPackage("Python", Keywords => {"Interfaces"}, PackageImports => {"Text"}, AuxiliaryFiles => true, - OptionalComponentsPresent => Core#"private dictionary"#?"pythonTrue" + OptionalComponentsPresent => Core#"private dictionary"#?"pythonTrue", + UseCachedExampleOutput => true, ) --------------- diff --git a/M2/Macaulay2/packages/Python/examples/___Python_sptutorial_co_spplotting_spthe_sptwisted_spcubic_spwith_sp__Matplotlib.out b/M2/Macaulay2/packages/Python/examples/___Python_sptutorial_co_spplotting_spthe_sptwisted_spcubic_spwith_sp__Matplotlib.out new file mode 100644 index 00000000000..69636658a11 --- /dev/null +++ b/M2/Macaulay2/packages/Python/examples/___Python_sptutorial_co_spplotting_spthe_sptwisted_spcubic_spwith_sp__Matplotlib.out @@ -0,0 +1,139 @@ +-- -*- M2-comint -*- hash: 9426046357703022608 + +i1 : pycode = get(Python#"auxiliary files" | "doc/matplotlib-example.py") + +o1 = import matplotlib.pyplot as plt + import numpy as np + + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + t = np.linspace(-10, 10, 100) + ax.plot(t, t**2, t**3) + plt.show() + + +i2 : pythonRunScript pycode + +o2 = {'plt': , 'np': + -8.78787879, -8.58585859, + -7.97979798, -7.77777778, + -7.17171717, -6.96969697, + -6.36363636, -6.16161616, + -5.55555556, -5.35353535, + -4.74747475, -4.54545455, + -3.93939394, -3.73737374, + -3.13131313, -2.92929293, + -2.32323232, -2.12121212, + -1.51515152, -1.31313131, + -0.70707071, -0.50505051, + 0.1010101 , 0.3030303 , + 0.90909091, 1.11111111, + 1.71717172, 1.91919192, + 2.52525253, 2.72727273, + 3.33333333, 3.53535354, + 4.14141414, 4.34343434, + 4.94949495, 5.15151515, + 5.75757576, 5.95959596, + 6.56565657, 6.76767677, + 7.37373737, 7.57575758, + 8.18181818, 8.38383838, + 8.98989899, 9.19191919, + 9.7979798 , 10. ])} + , 'fig':
, 'ax': , + 't': array([-10. , -9.7979798 , -9.5959596 , -9.39393939, + +o2 : PythonObject of class dict + +i3 : matplotlib = PythonContext "import matplotlib.pyplot as plt" + +o3 = matplotlib + +o3 : PythonContext + +i4 : matplotlib "import numpy as np" + +i5 : matplotlib "fig = plt.figure()" + +i6 : matplotlib "ax = fig.add_subplot(projection='3d')" + +i7 : matplotlib "t = np.linspace(-10, 10, 100)" + +i8 : matplotlib "ax.plot(t, t**2, t**3)" + +o8 = [] + +o8 : PythonObject of class list + +i9 : matplotlib "plt.show()" + +o9 = None + +o9 : PythonObject of class NoneType + +i10 : plt = import "matplotlib.pyplot" + +o10 = + +o10 : PythonObject of class module + +i11 : np = import "numpy" + +o11 = + +o11 : PythonObject of class module + +i12 : fig = plt@@figure() + +o12 = Figure(640x480) + +o12 : PythonObject of class matplotlib.figure.Figure + +i13 : ax = fig@@"add_subplot"(projection => "3d") + +o13 = Axes3DSubplot(0.125,0.11;0.775x0.77) + +o13 : PythonObject of class matplotlib.axes._subplots.Axes3DSubplot + +i14 : t = np@@linspace(-10, 10, 100); + +i15 : ax@@plot(t, t^2, t^3) + +o15 = [] + +o15 : PythonObject of class list + +i16 : plt@@show() + +o16 = None + +o16 : PythonObject of class NoneType + +i17 : From ed40e028f16fba41eb0233c2616a2a13bf953c94 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 5 Dec 2025 06:32:27 -0500 Subject: [PATCH 189/691] Simplify printing of matrix expressions We don't store the entries of zero matrices any more, so there's no reason to check if all the entries are zero. Instead, check for the existence of a "zero" key. --- M2/Macaulay2/m2/expressions.m2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/m2/expressions.m2 b/M2/Macaulay2/m2/expressions.m2 index b7cf129f53d..25fc1e7ff27 100644 --- a/M2/Macaulay2/m2/expressions.m2 +++ b/M2/Macaulay2/m2/expressions.m2 @@ -933,8 +933,8 @@ toCompactString Divide := x -> toCompactParen x#0 | "/" | toCompactParen x#1 net MatrixExpression := x -> ( (opts,m) := matrixOpts x; + if opts.zero =!= null then return "0"; blk := opts.Blocks =!= null; -- whether to display blocks - if all(m,r->all(r,i->class i===ZeroExpression)) then return "0"; net1 := if compactMatrixForm then toCompactString else net; vbox0 := if opts.Degrees === null then 0 else 1; (hbox,vbox) := if blk then (drop(accumulate(plus,0,opts.Blocks#0),-1),prepend(vbox0,accumulate(plus,vbox0,opts.Blocks#1))) else (false,{vbox0,vbox0+#m#0}); @@ -1135,7 +1135,7 @@ texMath Table := m -> ( texMath MatrixExpression := x -> ( (opts,m) := matrixOpts x; - if all(m,r->all(r,i->class i===ZeroExpression)) then return "0"; + if opts.zero =!= null then return "0"; blk := opts.Blocks =!= null; -- whether to display blocks if blk then ( j := 0; h := 0; ); m = applyTable(m,texMath); From 78b9cd9890929c32fda3e23f42ae9c2b3a009f18 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 8 Dec 2025 17:12:28 -0500 Subject: [PATCH 190/691] Use arb for log1p(CC) and expm1(CC) Previously, we were just adding/subtracting 1 first, and thus losing precision for small inputs. --- M2/Macaulay2/d/actors3.d | 4 ++-- M2/Macaulay2/d/ballarith.d | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index f35f726b812..e67e874e2f3 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -860,7 +860,7 @@ log1p(e:Expr):Expr := ( when e is x:RRcell do toExpr(log1p(x.v)) -- # typical value: log1p, RR, RR is x:RRicell do toExpr(log1p(x.v)) -- # typical value: log1p, RRi, RRi - is x:CCcell do toExpr(log(1 + x.v)) -- # typical value: log1p, CC, CC + is x:CCcell do toExpr(log1p(x.v)) -- # typical value: log1p, CC, CC is x:CCicell do toExpr(log1p(x.v)) -- # typical value: log1p, CCi, CCi else WrongArgRRorCC() ); @@ -869,7 +869,7 @@ expm1(e:Expr):Expr := ( when e is x:RRcell do toExpr(expm1(x.v)) -- # typical value: expm1, RR, RR is x:RRicell do toExpr(expm1(x.v)) -- # typical value: expm1, RRi, RRi - is x:CCcell do toExpr(exp(x.v) - 1) -- # typical value: expm1, CC, CC + is x:CCcell do toExpr(expm1(x.v)) -- # typical value: expm1, CC, CC is x:CCicell do toExpr(expm1(x.v)) -- # typical value: expm1, CCi, CCi else WrongArgRRorCC() ); diff --git a/M2/Macaulay2/d/ballarith.d b/M2/Macaulay2/d/ballarith.d index 972e63ebdef..69d52ac9bd7 100644 --- a/M2/Macaulay2/d/ballarith.d +++ b/M2/Macaulay2/d/ballarith.d @@ -334,6 +334,13 @@ export asin(z:CCi):CCi := ( clear(w); moveToCCiandclear(r, precision(z))); +export log1p(z:CC):CC := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_log1p(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCandclear(r, precision(z))); + export log1p(z:CCi):CCi := ( w := toCCb(z); r := newCCb(); @@ -341,6 +348,13 @@ export log1p(z:CCi):CCi := ( clear(w); moveToCCiandclear(r, precision(z))); +export expm1(z:CC):CC := ( + w := toCCb(z); + r := newCCb(); + Ccode(void, "acb_expm1(", r, ", ", w, ", ", precision(z), ")"); + clear(w); + moveToCCandclear(r, precision(z))); + export expm1(z:CCi):CCi := ( w := toCCb(z); r := newCCb(); From 88b60505aff975f4eb1dcc3e79f112a052989d3a Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 8 Dec 2025 17:06:00 -0500 Subject: [PATCH 191/691] Use InexactNumber for special function methods This way, we don't have to worry about storing them as methods for all four different InexactNumber types. --- M2/Macaulay2/d/actors3.d | 574 ++++++++++-------- M2/Macaulay2/m2/typicalvalues.m2 | 22 +- .../Macaulay2Doc/functions/Beta-doc.m2 | 82 +-- .../Macaulay2Doc/functions/Gamma-doc.m2 | 39 +- .../Macaulay2Doc/functions/atan-doc.m2 | 5 +- .../Macaulay2Doc/functions/cos-doc.m2 | 2 +- .../Macaulay2Doc/functions/erf-doc.m2 | 10 +- .../Macaulay2Doc/functions/sin-doc.m2 | 2 +- .../Macaulay2Doc/functions/sinh-doc.m2 | 2 +- .../Macaulay2Doc/functions/tan-doc.m2 | 2 +- .../Macaulay2Doc/functions/tanh-doc.m2 | 2 +- .../packages/Macaulay2Doc/operators.m2 | 31 +- .../Macaulay2Doc/ov_analytic_functions.m2 | 51 +- 13 files changed, 348 insertions(+), 476 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index e67e874e2f3..8f96aac0d61 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -743,43 +743,47 @@ setup(StarS,starfun,timesfun); sin(e:Expr):Expr := ( when e - is x:CCcell do toExpr(sin(x.v)) -- # typical value: sin, CC, CC - is x:CCicell do toExpr(sin(x.v)) -- # typical value: sin, CCi, CCi - is x:RRcell do toExpr(sin(x.v)) -- # typical value: sin, RR, RR - is x:RRicell do toExpr(sin(x.v)) -- # typical value: sin, RRi, RRi + -- # typical value: sin, InexactNumber, InexactNumber + is x:CCcell do toExpr(sin(x.v)) + is x:CCicell do toExpr(sin(x.v)) + is x:RRcell do toExpr(sin(x.v)) + is x:RRicell do toExpr(sin(x.v)) else WrongArgRRorCC() ); setupfun("sin",sin).Protected=false; cos(e:Expr):Expr := ( when e - is x:CCcell do toExpr(cos(x.v)) -- # typical value: cos, CC, CC - is x:CCicell do toExpr(cos(x.v)) -- # typical value: cos, CCi, CCi - is x:RRcell do toExpr(cos(x.v)) -- # typical value: cos, RR, RR - is x:RRicell do toExpr(cos(x.v)) -- # typical value: cos, RRi, RRi + -- # typical value: cos, InexactNumber, InexactNumber + is x:CCcell do toExpr(cos(x.v)) + is x:CCicell do toExpr(cos(x.v)) + is x:RRcell do toExpr(cos(x.v)) + is x:RRicell do toExpr(cos(x.v)) else WrongArgRRorCC() ); setupfun("cos",cos).Protected=false; tan(e:Expr):Expr := ( when e - is x:CCcell do toExpr(tan(x.v)) -- # typical value: tan, CC, CC - is x:CCicell do toExpr(tan(x.v)) -- # typical value: tan, CCi, CCi - is x:RRcell do toExpr(tan(x.v)) -- # typical value: tan, RR, RR - is x:RRicell do toExpr(tan(x.v)) -- # typical value: tan, RRi, RRi + -- # typical value: tan, InexactNumber, InexactNumber + is x:CCcell do toExpr(tan(x.v)) + is x:CCicell do toExpr(tan(x.v)) + is x:RRcell do toExpr(tan(x.v)) + is x:RRicell do toExpr(tan(x.v)) else WrongArgRRorCC() ); setupfun("tan",tan).Protected=false; acos(e:Expr):Expr := ( when e - is x:CCcell do toExpr(acos(x.v)) -- # typical value: acos, CC, CC - is x:CCicell do toExpr(acos(x.v)) -- # typical value: acos, CCi, CCi + -- # typical value: acos, InexactNumber, InexactNumber + is x:CCcell do toExpr(acos(x.v)) + is x:CCicell do toExpr(acos(x.v)) is x:RRcell do ( if x.v > 1 || x.v < -1 then toExpr(acos(toCC(x.v))) - else toExpr(acos(x.v)) -- # typical value: acos, RR, RR + else toExpr(acos(x.v)) ) is x:RRicell do ( if x.v <= 1 && x.v >= -1 - then toExpr(acos(x.v)) -- # typical value: acos, RRi, RRi + then toExpr(acos(x.v)) else toExpr(acos(toCCi(x.v))) ) else WrongArgRRorCC() @@ -787,70 +791,77 @@ acos(e:Expr):Expr := ( setupfun("acos",acos).Protected=false; sec(e:Expr):Expr := ( when e - is x:CCcell do toExpr(sec(x.v)) -- # typical value: sec, CC, CC - is x:CCicell do toExpr(sec(x.v)) -- # typical value: sec, CCi, CCi - is x:RRcell do toExpr(sec(x.v)) -- # typical value: sec, RR, RR - is x:RRicell do toExpr(sec(x.v)) -- # typical value: sec, RRi, RRi + -- # typical value: sec, InexactNumber, InexactNumber + is x:CCcell do toExpr(sec(x.v)) + is x:CCicell do toExpr(sec(x.v)) + is x:RRcell do toExpr(sec(x.v)) + is x:RRicell do toExpr(sec(x.v)) else WrongArgRRorCC() ); setupfun("sec",sec).Protected=false; csc(e:Expr):Expr := ( when e - is x:CCcell do toExpr(csc(x.v)) -- # typical value: csc, CC, CC - is x:CCicell do toExpr(csc(x.v)) -- # typical value: csc, CCi, CCi - is x:RRcell do toExpr(csc(x.v)) -- # typical value: csc, RR, RR - is x:RRicell do toExpr(csc(x.v)) -- # typical value: csc, RRi, RRi + -- # typical value: csc, InexactNumber, InexactNumber + is x:CCcell do toExpr(csc(x.v)) + is x:CCicell do toExpr(csc(x.v)) + is x:RRcell do toExpr(csc(x.v)) + is x:RRicell do toExpr(csc(x.v)) else WrongArgRRorCC() ); setupfun("csc",csc).Protected=false; cot(e:Expr):Expr := ( when e - is x:CCcell do toExpr(cot(x.v)) -- # typical value: cot, CC, CC - is x:CCicell do toExpr(cot(x.v)) -- # typical value: cot, CCi, CCi - is x:RRcell do toExpr(cot(x.v)) -- # typical value: cot, RR, RR - is x:RRicell do toExpr(cot(x.v)) -- # typical value: cot, RRi, RRi + -- # typical value: cot, InexactNumber, InexactNumber + is x:CCcell do toExpr(cot(x.v)) + is x:CCicell do toExpr(cot(x.v)) + is x:RRcell do toExpr(cot(x.v)) + is x:RRicell do toExpr(cot(x.v)) else WrongArgRRorCC() ); setupfun("cot",cot).Protected=false; sech(e:Expr):Expr := ( when e - is x:CCcell do toExpr(sech(x.v)) -- # typical value: sech, CC, CC - is x:CCicell do toExpr(sech(x.v)) -- # typical value: sech, CCi, CCi - is x:RRcell do toExpr(sech(x.v)) -- # typical value: sech, RR, RR - is x:RRicell do toExpr(sech(x.v)) -- # typical value: sech, RRi, RRi + -- # typical value: sech, InexactNumber, InexactNumber + is x:CCcell do toExpr(sech(x.v)) + is x:CCicell do toExpr(sech(x.v)) + is x:RRcell do toExpr(sech(x.v)) + is x:RRicell do toExpr(sech(x.v)) else WrongArgRRorCC() ); setupfun("sech",sech).Protected=false; csch(e:Expr):Expr := ( when e - is x:CCcell do toExpr(csch(x.v)) -- # typical value: csch, CC, CC - is x:CCicell do toExpr(csch(x.v)) -- # typical value: csch, CCi, CCi - is x:RRcell do toExpr(csch(x.v)) -- # typical value: csch, RR, RR - is x:RRicell do toExpr(csch(x.v)) -- # typical value: csch, RRi, RRi + -- # typical value: csch, InexactNumber, InexactNumber + is x:CCcell do toExpr(csch(x.v)) + is x:CCicell do toExpr(csch(x.v)) + is x:RRcell do toExpr(csch(x.v)) + is x:RRicell do toExpr(csch(x.v)) else WrongArgRRorCC() ); setupfun("csch",csch).Protected=false; coth(e:Expr):Expr := ( when e - is x:CCcell do toExpr(coth(x.v)) -- # typical value: coth, CC, CC - is x:CCicell do toExpr(coth(x.v)) -- # typical value: coth, CCi, CCi - is x:RRcell do toExpr(coth(x.v)) -- # typical value: coth, RR, RR - is x:RRicell do toExpr(coth(x.v)) -- # typical value: coth, RRi, RRi + -- # typical value: coth, InexactNumber, InexactNumber + is x:CCcell do toExpr(coth(x.v)) + is x:CCicell do toExpr(coth(x.v)) + is x:RRcell do toExpr(coth(x.v)) + is x:RRicell do toExpr(coth(x.v)) else WrongArgRRorCC() ); setupfun("coth",coth).Protected=false; asin(e:Expr):Expr := ( when e - is x:CCcell do toExpr(asin(x.v)) -- # typical value: asin, CC, CC - is x:CCicell do toExpr(asin(x.v)) -- # typical value: asin, CCi, CCi + -- # typical value: asin, InexactNumber, InexactNumber + is x:CCcell do toExpr(asin(x.v)) + is x:CCicell do toExpr(asin(x.v)) is x:RRcell do ( if x.v > 1 || x.v < -1 then toExpr(asin(toCC(x.v))) - else toExpr(asin(x.v)) -- # typical value: asin, RR, RR + else toExpr(asin(x.v)) ) is x:RRicell do ( if x.v <= 1 && x.v >= -1 - then toExpr(asin(x.v)) -- # typical value: asin, RRi, RRi + then toExpr(asin(x.v)) else toExpr(asin(toCCi(x.v))) ) else WrongArgRRorCC() @@ -858,68 +869,73 @@ asin(e:Expr):Expr := ( setupfun("asin",asin).Protected=false; log1p(e:Expr):Expr := ( when e - is x:RRcell do toExpr(log1p(x.v)) -- # typical value: log1p, RR, RR - is x:RRicell do toExpr(log1p(x.v)) -- # typical value: log1p, RRi, RRi - is x:CCcell do toExpr(log1p(x.v)) -- # typical value: log1p, CC, CC - is x:CCicell do toExpr(log1p(x.v)) -- # typical value: log1p, CCi, CCi + -- # typical value: log1p, InexactNumber, InexactNumber + is x:RRcell do toExpr(log1p(x.v)) + is x:RRicell do toExpr(log1p(x.v)) + is x:CCcell do toExpr(log1p(x.v)) + is x:CCicell do toExpr(log1p(x.v)) else WrongArgRRorCC() ); setupfun("log1p",log1p).Protected=false; expm1(e:Expr):Expr := ( when e - is x:RRcell do toExpr(expm1(x.v)) -- # typical value: expm1, RR, RR - is x:RRicell do toExpr(expm1(x.v)) -- # typical value: expm1, RRi, RRi - is x:CCcell do toExpr(expm1(x.v)) -- # typical value: expm1, CC, CC - is x:CCicell do toExpr(expm1(x.v)) -- # typical value: expm1, CCi, CCi + -- # typical value: expm1, InexactNumber, InexactNumber + is x:RRcell do toExpr(expm1(x.v)) + is x:RRicell do toExpr(expm1(x.v)) + is x:CCcell do toExpr(expm1(x.v)) + is x:CCicell do toExpr(expm1(x.v)) else WrongArgRRorCC() ); setupfun("expm1",expm1).Protected=false; eint(e:Expr):Expr := ( when e - is x:RRcell do toExpr(eint(x.v)) -- # typical value: eint, RR, RR - is x:RRicell do toExpr(eint(x.v)) -- # typical value: eint, RRi, RRi - is x:CCcell do toExpr(eint(x.v)) -- # typical value: eint, CC, CC - is x:CCicell do toExpr(eint(x.v)) -- # typical value: eint, CCi, CCi + -- # typical value: eint, InexactNumber, InexactNumber + is x:RRcell do toExpr(eint(x.v)) + is x:RRicell do toExpr(eint(x.v)) + is x:CCcell do toExpr(eint(x.v)) + is x:CCicell do toExpr(eint(x.v)) else WrongArgRRorCC() ); setupfun("eint",eint).Protected=false; Gamma(e:Expr):Expr := ( when e - is x:RRcell do toExpr(Gamma(x.v)) -- # typical value: Gamma, RR, RR - is x:RRicell do toExpr(Gamma(x.v)) -- # typical value: Gamma, RRi, RRi - is x:CCcell do toExpr(Gamma(x.v)) -- # typical value: Gamma, CC, CC - is x:CCicell do toExpr(Gamma(x.v)) -- # typical value: Gamma, CCi, CCi + -- # typical value: Gamma, InexactNumber, InexactNumber + is x:RRcell do toExpr(Gamma(x.v)) + is x:RRicell do toExpr(Gamma(x.v)) + is x:CCcell do toExpr(Gamma(x.v)) + is x:CCicell do toExpr(Gamma(x.v)) is a:Sequence do if length(a) != 2 then WrongNumArgs(1,2) else ( when a.0 + -- # typical value: Gamma, InexactNumber, InexactNumber, InexactNumber is s:RRcell do ( when a.1 - is x:RRcell do toExpr(Gamma( s.v , x.v)) -- # typical value: Gamma, RR, RR, RR - is x:RRicell do toExpr(Gamma(toRRi(s.v), x.v)) -- # typical value: Gamma, RR, RRi, RRi - is x:CCcell do toExpr(Gamma( toCC(s.v), x.v)) -- # typical value: Gamma, RR, CC, CC - is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) -- # typical value: Gamma, RR, CCi, CCi + is x:RRcell do toExpr(Gamma( s.v , x.v)) + is x:RRicell do toExpr(Gamma(toRRi(s.v), x.v)) + is x:CCcell do toExpr(Gamma( toCC(s.v), x.v)) + is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) else WrongArgRRorCC(2)) is s:RRicell do ( when a.1 - is x:RRcell do toExpr(Gamma( s.v, toRRi(x.v))) -- # typical value: Gamma, RRi, RR, RRi - is x:RRicell do toExpr(Gamma( s.v, x.v )) -- # typical value: Gamma, RRi, RRi, RRi - is x:CCcell do toExpr(Gamma(toCCi(s.v),toCCi(x.v))) -- # typical value: Gamma, RRi, CC, CCi - is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) -- # typical value: Gamma, RRi, CCi, CCi + is x:RRcell do toExpr(Gamma( s.v, toRRi(x.v))) + is x:RRicell do toExpr(Gamma( s.v, x.v )) + is x:CCcell do toExpr(Gamma(toCCi(s.v),toCCi(x.v))) + is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) else WrongArgRRorCC(2)) is s:CCcell do ( when a.1 - is x:RRcell do toExpr(Gamma( s.v, toCC(x.v))) -- # typical value: Gamma, CC, RR, CC - is x:RRicell do toExpr(Gamma(toCCi(s.v),toCCi(x.v))) -- # typical value: Gamma, CC, RRi, CCi - is x:CCcell do toExpr(Gamma( s.v, x.v)) -- # typical value: Gamma, CC, CC, CC - is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) -- # typical value: Gamma, CC, CCi, CCi + is x:RRcell do toExpr(Gamma( s.v, toCC(x.v))) + is x:RRicell do toExpr(Gamma(toCCi(s.v),toCCi(x.v))) + is x:CCcell do toExpr(Gamma( s.v, x.v)) + is x:CCicell do toExpr(Gamma(toCCi(s.v), x.v)) else WrongArgRRorCC(2)) is s:CCicell do ( when a.1 - is x:RRcell do toExpr(Gamma(s.v, toCCi(x.v))) -- # typical value: Gamma, CCi, RR, CCi - is x:RRicell do toExpr(Gamma(s.v, toCCi(x.v))) -- # typical value: Gamma, CCi, RRi, CCi - is x:CCcell do toExpr(Gamma(s.v, toCCi(x.v))) -- # typical value: Gamma, CCi, CC, CCi - is x:CCicell do toExpr(Gamma(s.v, x.v)) -- # typical value: Gamma, CCi, CCi, CCi + is x:RRcell do toExpr(Gamma(s.v, toCCi(x.v))) + is x:RRicell do toExpr(Gamma(s.v, toCCi(x.v))) + is x:CCcell do toExpr(Gamma(s.v, toCCi(x.v))) + is x:CCicell do toExpr(Gamma(s.v, x.v)) else WrongArgRRorCC(2)) else WrongArgRRorCC(2)) else WrongArgRRorCC() @@ -931,44 +947,46 @@ regularizedGamma(e:Expr):Expr := ( if length(a) != 2 then WrongNumArgs(2) else ( when a.0 + -- # typical value: regularizedGamma, InexactNumber, InexactNumber, InexactNumber is s:RRcell do ( when a.1 is x:RRcell do toExpr( - midpointRR(regularizedGamma(toRRi(s.v), toRRi(x.v)))) -- # typical value: regularizedGamma, RR, RR, RR - is x:RRicell do toExpr(regularizedGamma(toRRi(s.v), x.v)) -- # typical value: regularizedGamma, RR, RRi, RRi - is x:CCcell do toExpr(regularizedGamma(toCC(s.v), x.v)) -- # typical value: regularizedGamma, RR, CC, CC - is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) -- # typical value: regularizedGamma, RR, CCi, CCi + midpointRR(regularizedGamma(toRRi(s.v), toRRi(x.v)))) + is x:RRicell do toExpr(regularizedGamma(toRRi(s.v), x.v)) + is x:CCcell do toExpr(regularizedGamma(toCC(s.v), x.v)) + is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) else WrongArgRRorCC(2)) is s:RRicell do ( when a.1 - is x:RRcell do toExpr(regularizedGamma(s.v, toRRi(x.v))) -- # typical value: regularizedGamma, RRi, RR, RRi - is x:RRicell do toExpr(regularizedGamma(s.v, x.v)) -- # typical value: regularizedGamma, RRi, RRi, RRi - is x:CCcell do toExpr(regularizedGamma(toCCi(s.v), toCCi(x.v))) -- # typical value: regularizedGamma, RRi, CC, CCi - is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) -- # typical value: regularizedGamma, RRi, CCi, CCi + is x:RRcell do toExpr(regularizedGamma(s.v, toRRi(x.v))) + is x:RRicell do toExpr(regularizedGamma(s.v, x.v)) + is x:CCcell do toExpr(regularizedGamma(toCCi(s.v), toCCi(x.v))) + is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) else WrongArgRRorRRi(2)) is s:CCcell do ( when a.1 - is x:RRcell do toExpr(regularizedGamma(s.v, toCC(x.v))) -- # typical value: regularizedGamma, CC, RR, CC - is x:RRicell do toExpr(regularizedGamma(toCCi(s.v), toCCi(x.v))) -- # typical value: regularizedGamma, CC, RRi, CCi - is x:CCcell do toExpr(regularizedGamma(s.v, x.v)) -- # typical value: regularizedGamma, CC, CC, CC - is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) -- # typical value: regularizedGamma, CC, CCi, CCi + is x:RRcell do toExpr(regularizedGamma(s.v, toCC(x.v))) + is x:RRicell do toExpr(regularizedGamma(toCCi(s.v), toCCi(x.v))) + is x:CCcell do toExpr(regularizedGamma(s.v, x.v)) + is x:CCicell do toExpr(regularizedGamma(toCCi(s.v), x.v)) else WrongArgRRorCC(2)) is s:CCicell do ( when a.1 - is x:RRcell do toExpr(regularizedGamma(s.v, toCCi(x.v))) -- # typical value: regularizedGamma, CCi, RR, CCi - is x:RRicell do toExpr(regularizedGamma(s.v, toCCi(x.v))) -- # typical value: regularizedGamma, CCi, RRi, CCi - is x:CCcell do toExpr(regularizedGamma(s.v, toCCi(x.v))) -- # typical value: regularizedGamma, CCi, CC, CCi - is x:CCicell do toExpr(regularizedGamma(s.v, x.v)) -- # typical value: regularizedGamma, CCi, CCi, CCi + is x:RRcell do toExpr(regularizedGamma(s.v, toCCi(x.v))) + is x:RRicell do toExpr(regularizedGamma(s.v, toCCi(x.v))) + is x:CCcell do toExpr(regularizedGamma(s.v, toCCi(x.v))) + is x:CCicell do toExpr(regularizedGamma(s.v, x.v)) else WrongArgRRorCC(2)) else WrongArgRRorCC(2))) else WrongNumArgs(2)); setupfun("regularizedGamma",regularizedGamma).Protected=false; Digamma(e:Expr):Expr := ( when e - is x:RRcell do toExpr(Digamma(x.v)) -- # typical value: Digamma, RR, RR - is x:RRicell do toExpr(Digamma(x.v)) -- # typical value: Digamma, RRi, RRi - is x:CCcell do toExpr(Digamma(x.v)) -- # typical value: Digamma, CC, CC - is x:CCicell do toExpr(Digamma(x.v)) -- # typical value: Digamma, CCi, CCi + -- # typical value: Digamma, InexactNumber, InexactNumber + is x:RRcell do toExpr(Digamma(x.v)) + is x:RRicell do toExpr(Digamma(x.v)) + is x:CCcell do toExpr(Digamma(x.v)) + is x:CCicell do toExpr(Digamma(x.v)) else WrongArgRRorCC() ); setupfun("Digamma",Digamma).Protected=false; @@ -979,37 +997,41 @@ export lgamma(x:RR):Expr := ( Expr(Sequence(toExpr(moveToRR(z)),toExpr(i)))); lgamma(e:Expr):Expr := ( when e - is x:RRcell do lgamma(x.v) -- # typical value: lgamma, RR, RR - is x:RRicell do toExpr(lgamma(x.v)) -- # typical value: lgamma, RRi, RRi - is x:CCcell do toExpr(lgamma(x.v)) -- # typical value: lgamma, CC, CC - is x:CCicell do toExpr(lgamma(x.v)) -- # typical value: lgamma, CCi, CCi + -- # typical value: lgamma, InexactNumber, InexactNumber + is x:RRcell do lgamma(x.v) + is x:RRicell do toExpr(lgamma(x.v)) + is x:CCcell do toExpr(lgamma(x.v)) + is x:CCicell do toExpr(lgamma(x.v)) else WrongArgRRorCC() ); setupfun("lgamma",lgamma); zeta(e:Expr):Expr := ( when e - is x:RRcell do toExpr(zeta(x.v)) -- # typical value: zeta, RR, RR - is x:RRicell do toExpr(zeta(x.v)) -- # typical value: zeta, RRi, RRi - is x:CCcell do toExpr(zeta(x.v)) -- # typical value: zeta, CC, CC - is x:CCicell do toExpr(zeta(x.v)) -- # typical value: zeta, CCi, CCi + -- # typical value: zeta, InexactNumber, InexactNumber + is x:RRcell do toExpr(zeta(x.v)) + is x:RRicell do toExpr(zeta(x.v)) + is x:CCcell do toExpr(zeta(x.v)) + is x:CCicell do toExpr(zeta(x.v)) else WrongArgRRorCC() ); setupfun("zeta",zeta).Protected=false; erf(e:Expr):Expr := ( when e - is x:RRcell do toExpr(erf(x.v)) -- # typical value: erf, RR, RR - is x:RRicell do toExpr(erf(x.v)) -- # typical value: erf, RRi, RRi - is x:CCcell do toExpr(erf(x.v)) -- # typical value: erf, CC, CC - is x:CCicell do toExpr(erf(x.v)) -- # typical value: erf, CCi, CCi + -- # typical value: erf, InexactNumber, InexactNumber + is x:RRcell do toExpr(erf(x.v)) + is x:RRicell do toExpr(erf(x.v)) + is x:CCcell do toExpr(erf(x.v)) + is x:CCicell do toExpr(erf(x.v)) else WrongArgRRorCC() ); setupfun("erf",erf).Protected=false; erfc(e:Expr):Expr := ( when e - is x:RRcell do toExpr(erfc(x.v)) -- # typical value: erfc, RR, RR - is x:RRicell do toExpr(erfc(x.v)) -- # typical value: erfc, RRi, RRi - is x:CCcell do toExpr(erfc(x.v)) -- # typical value: erfc, CC, CC - is x:CCicell do toExpr(erfc(x.v)) -- # typical value: erfc, CCi, CCi + -- # typical value: erfc, InexactNumber, InexactNumber + is x:RRcell do toExpr(erfc(x.v)) + is x:RRicell do toExpr(erfc(x.v)) + is x:CCcell do toExpr(erfc(x.v)) + is x:CCicell do toExpr(erfc(x.v)) else WrongArgRRorCC() ); setupfun("erfc",erfc).Protected=false; @@ -1131,24 +1153,26 @@ BesselY(e:Expr):Expr := ( setupfun("BesselY",BesselY).Protected=false; atan2(yy:Expr,xx:Expr):Expr := ( when yy + -- # typical value: atan2, InexactNumber, InexactNumber, InexactNumber is y:RRcell do ( when xx - is x:RRcell do toExpr(atan2(y.v,x.v)) -- # typical value: atan2, RR, RR, RR - is x:RRicell do toExpr(atan2(toRRi(y.v),x.v)) -- # typical value: atan2, RR, RRi, RRi + is x:RRcell do toExpr(atan2(y.v,x.v)) + is x:RRicell do toExpr(atan2(toRRi(y.v),x.v)) else WrongArgRRorRRi(1)) is y:RRicell do ( when xx - is x:RRcell do toExpr(atan2(y.v,toRRi(x.v))) -- # typical value: atan2, RRi, RR, RRi - is x:RRicell do toExpr(atan2(y.v,x.v)) -- # typical value: atan2, RRi, RRi, RRi + is x:RRcell do toExpr(atan2(y.v,toRRi(x.v))) + is x:RRicell do toExpr(atan2(y.v,x.v)) else WrongArgRRorRRi(1)) else WrongArgRRorRRi(2) ); atan(e:Expr):Expr := ( when e - is x:CCcell do toExpr(atan(x.v)) -- # typical value: atan, CC, CC - is x:CCicell do toExpr(atan(x.v)) -- # typical value: atan, CCi, CCi - is x:RRcell do toExpr(atan(x.v)) -- # typical value: atan, RR, RR - is x:RRicell do toExpr(atan(x.v)) -- # typical value: atan, RRi, RRi + -- # typical value: atan, InexactNumber, InexactNumber + is x:CCcell do toExpr(atan(x.v)) + is x:CCicell do toExpr(atan(x.v)) + is x:RRcell do toExpr(atan(x.v)) + is x:RRicell do toExpr(atan(x.v)) else WrongArgRRorCC() ); setupfun("atan",atan).Protected=false; @@ -1160,33 +1184,34 @@ setupfun("atan2",atan2).Protected=false; Beta(yy:Expr,xx:Expr):Expr := ( when yy + -- # typical value: Beta, InexactNumber, InexactNumber, InexactNumber is y:RRcell do ( when xx - is x:RRcell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, RR, RR, RR - is x:RRicell do toExpr(Beta(toRRi(y.v), x.v)) -- # typical value: Beta, RR, RRi, RRi - is x:CCcell do toExpr(Beta(toCC(y.v), x.v)) -- # typical value: Beta, RR, CC, CC - is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) -- # typical value: Beta, RR, CCi, CCi + is x:RRcell do toExpr(Beta(y.v, x.v)) + is x:RRicell do toExpr(Beta(toRRi(y.v), x.v)) + is x:CCcell do toExpr(Beta(toCC(y.v), x.v)) + is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) else WrongArgRRorCC(2)) is y:RRicell do ( when xx - is x:RRcell do toExpr(Beta(y.v, toRRi(x.v))) -- # typical value: Beta, RRi, RR, RRi - is x:RRicell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, RRi, RRi, RRi - is x:CCcell do toExpr(Beta(toCCi(y.v), toCCi(x.v))) -- # typical value: Beta, RRi, CC, CCi - is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) -- # typical value: Beta, RRi, CCi, CCi + is x:RRcell do toExpr(Beta(y.v, toRRi(x.v))) + is x:RRicell do toExpr(Beta(y.v, x.v)) + is x:CCcell do toExpr(Beta(toCCi(y.v), toCCi(x.v))) + is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) else WrongArgRRorRRi(2)) is y:CCcell do ( when xx - is x:RRcell do toExpr(Beta(y.v, toCC(x.v))) -- # typical value: Beta, CC, RR, CC - is x:RRicell do toExpr(Beta(toCCi(y.v), toCCi(x.v))) -- # typical value: Beta, CC, RRi, CCi - is x:CCcell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, CC, CC, CC - is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) -- # typical value: Beta, CC, CCi, CCi + is x:RRcell do toExpr(Beta(y.v, toCC(x.v))) + is x:RRicell do toExpr(Beta(toCCi(y.v), toCCi(x.v))) + is x:CCcell do toExpr(Beta(y.v, x.v)) + is x:CCicell do toExpr(Beta(toCCi(y.v), x.v)) else WrongArgRRorCC(2)) is y:CCicell do ( when xx - is x:RRcell do toExpr(Beta(y.v, toCCi(x.v))) -- # typical value: Beta, CCi, RR, CCi - is x:RRicell do toExpr(Beta(y.v, toCCi(x.v))) -- # typical value: Beta, CCi, RRi, CCi - is x:CCcell do toExpr(Beta(y.v, toCCi(x.v))) -- # typical value: Beta, CCi, CC, CCi - is x:CCicell do toExpr(Beta(y.v, x.v)) -- # typical value: Beta, CCi, CCi, CCi + is x:RRcell do toExpr(Beta(y.v, toCCi(x.v))) + is x:RRicell do toExpr(Beta(y.v, toCCi(x.v))) + is x:CCcell do toExpr(Beta(y.v, toCCi(x.v))) + is x:CCicell do toExpr(Beta(y.v, x.v)) else WrongArgRRorCC(2)) else WrongArgRRorCC(1) ); @@ -1200,127 +1225,128 @@ regularizedBeta(xx:Expr,yy:Expr,zz:Expr):Expr := ( when xx is x:RRcell do ( when yy + -- # typical value: regularizedBeta, InexactNumber, InexactNumber, InexactNumber, InexactNumber is y:RRcell do ( when zz is z:RRcell do toExpr( - midpointRR(regularizedBeta(toRRi(x.v), toRRi(y.v), toRRi(z.v)))) -- # typical value: regularizedBeta, RR, RR, RR, RR - is z:RRicell do toExpr(regularizedBeta(toRRi(x.v), toRRi(y.v), z.v)) -- # typical value: regularizedBeta, RR, RR, RRi, RRi - is z:CCcell do toExpr(regularizedBeta(toCC(x.v), toCC(y.v), z.v)) -- # typical value: regularizedBeta, RR, RR, CC, CC - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RR, RR, CCi, CCi + midpointRR(regularizedBeta(toRRi(x.v), toRRi(y.v), toRRi(z.v)))) + is z:RRicell do toExpr(regularizedBeta(toRRi(x.v), toRRi(y.v), z.v)) + is z:CCcell do toExpr(regularizedBeta(toCC(x.v), toCC(y.v), z.v)) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:RRicell do ( when zz - is z:RRcell do toExpr(regularizedBeta(toRRi(x.v), y.v, toRRi(z.v))) -- # typical value: regularizedBeta, RR, RRi, RR, RRi - is z:RRicell do toExpr(regularizedBeta(toRRi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RR, RRi, RRi, RRi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RR, RRi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RR, RRi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(toRRi(x.v), y.v, toRRi(z.v))) + is z:RRicell do toExpr(regularizedBeta(toRRi(x.v), y.v, z.v)) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorRRi(3)) is y:CCcell do ( when zz - is z:RRcell do toExpr(regularizedBeta(toCC(x.v), y.v, toCC(z.v))) -- # typical value: regularizedBeta, RR, CC, RR, CC - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RR, CC, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(toCC(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RR, CC, CC, CC - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RR, CC, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(toCC(x.v), y.v, toCC(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(toCC(x.v), y.v, z.v)) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:CCicell do ( when zz - is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RR, CCi, RR, CCi - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RR, CCi, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RR, CCi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RR, CCi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) else WrongArgRRorCC(3)) else WrongArgRRorCC(2)) is x:RRicell do ( when yy is y:RRcell do ( when zz - is z:RRcell do toExpr(regularizedBeta(x.v, toRRi(y.v), toRRi(z.v))) -- # typical value: regularizedBeta, RRi, RR, RR, RRi - is z:RRicell do toExpr(regularizedBeta(x.v, toRRi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, RR, RRi, RRi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, RR, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, RR, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(x.v, toRRi(y.v), toRRi(z.v))) + is z:RRicell do toExpr(regularizedBeta(x.v, toRRi(y.v), z.v)) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:RRicell do ( when zz - is z:RRcell do toExpr(regularizedBeta((x.v), y.v, toRRi(z.v))) -- # typical value: regularizedBeta, RRi, RRi, RR, RRi - is z:RRicell do toExpr(regularizedBeta(x.v, y.v, z.v)) -- # typical value: regularizedBeta, RRi, RRi, RRi, RRi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, RRi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, RRi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta((x.v), y.v, toRRi(z.v))) + is z:RRicell do toExpr(regularizedBeta(x.v, y.v, z.v)) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:CCcell do ( when zz - is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CC, RR, CCi - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CC, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CC, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, RRi, CC, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:CCicell do ( when zz - is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CCi, RR, CCi - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CCi, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, RRi, CCi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, RRi, CCi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) else WrongArgRRorCC(3)) else WrongArgRRorCC(2)) is x:CCcell do ( when yy is y:RRcell do ( when zz - is z:RRcell do toExpr(regularizedBeta(x.v, toCC(y.v), toCC(z.v))) -- # typical value: regularizedBeta, CC, RR, RR, CC - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RR, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(x.v, toCC(y.v), z.v)) -- # typical value: regularizedBeta, CC, RR, CC, CC - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CC, RR, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(x.v, toCC(y.v), toCC(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(x.v, toCC(y.v), z.v)) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:RRicell do ( when zz - is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RRi, RR, CCi - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RRi, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, RRi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CC, RRi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:CCcell do ( when zz - is z:RRcell do toExpr(regularizedBeta(x.v, y.v, toCC(z.v))) -- # typical value: regularizedBeta, CC, CC, RR, CC - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CC, CC, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(x.v, y.v, z.v)) -- # typical value: regularizedBeta, CC, CC, CC, CC - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CC, CC, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(x.v, y.v, toCC(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(x.v, y.v, z.v)) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:CCicell do ( when zz - is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CC, CCi, RR, CCi - is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CC, CCi, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CC, CCi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) -- # typical value: regularizedBeta, CC, CCi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(toCCi(x.v), y.v, toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(toCCi(x.v), y.v, z.v)) else WrongArgRRorCC(3)) else WrongArgRRorCC(2)) is x:CCicell do ( when yy is y:RRcell do ( when zz - is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RR, RR, CCi - is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RR, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RR, CC, CCi - is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CCi, RR, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:RRicell do ( when zz - is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RRi, RR, CCi - is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RRi, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, RRi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CCi, RRi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:CCcell do ( when zz - is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CC, RR, CCi - is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CC, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CC, CC, CCi - is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) -- # typical value: regularizedBeta, CCi, CC, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(x.v, toCCi(y.v), toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(x.v, toCCi(y.v), z.v)) else WrongArgRRorCC(3)) is y:CCicell do ( when zz - is z:RRcell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CCi, RR, CCi - is z:RRicell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CCi, RRi, CCi - is z:CCcell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) -- # typical value: regularizedBeta, CCi, CCi, CC, CCi - is z:CCicell do toExpr(regularizedBeta(x.v, y.v, z.v)) -- # typical value: regularizedBeta, CCi, CCi, CCi, CCi + is z:RRcell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) + is z:RRicell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) + is z:CCcell do toExpr(regularizedBeta(x.v, y.v, toCCi(z.v))) + is z:CCicell do toExpr(regularizedBeta(x.v, y.v, z.v)) else WrongArgRRorCC(3)) else WrongArgRRorCC(2)) else WrongArgRRorCC(1)); @@ -1332,37 +1358,41 @@ setupfun("regularizedBeta",regularizedBeta).Protected=false; cosh(e:Expr):Expr := ( when e - is x:CCcell do toExpr(cosh(x.v)) -- # typical value: cosh, CC, CC - is x:CCicell do toExpr(cosh(x.v)) -- # typical value: cosh, CCi, CCi - is x:RRcell do toExpr(cosh(x.v)) -- # typical value: cosh, RR, RR - is x:RRicell do toExpr(cosh(x.v)) -- # typical value: cosh, RRi, RRi + -- # typical value: cosh, InexactNumber, InexactNumber + is x:CCcell do toExpr(cosh(x.v)) + is x:CCicell do toExpr(cosh(x.v)) + is x:RRcell do toExpr(cosh(x.v)) + is x:RRicell do toExpr(cosh(x.v)) else WrongArgRRorCC() ); setupfun("cosh",cosh).Protected=false; sinh(e:Expr):Expr := ( when e - is x:CCcell do toExpr(sinh(x.v)) -- # typical value: sinh, CC, CC - is x:CCicell do toExpr(sinh(x.v)) -- # typical value: sinh, CCi, CCi - is x:RRcell do toExpr(sinh(x.v)) -- # typical value: sinh, RR, RR - is x:RRicell do toExpr(sinh(x.v)) -- # typical value: sinh, RRi, RRi + -- # typical value: sinh, InexactNumber, InexactNumber + is x:CCcell do toExpr(sinh(x.v)) + is x:CCicell do toExpr(sinh(x.v)) + is x:RRcell do toExpr(sinh(x.v)) + is x:RRicell do toExpr(sinh(x.v)) else WrongArgRRorCC() ); setupfun("sinh",sinh).Protected=false; tanh(e:Expr):Expr := ( when e - is x:CCcell do toExpr(tanh(x.v)) -- # typical value: tanh, CC, CC - is x:CCicell do toExpr(tanh(x.v)) -- # typical value: tanh, CCi, CCi - is x:RRcell do toExpr(tanh(x.v)) -- # typical value: tanh, RR, RR - is x:RRicell do toExpr(tanh(x.v)) -- # typical value: tanh, RRi, RRi + -- # typical value: tanh, InexactNumber, InexactNumber + is x:CCcell do toExpr(tanh(x.v)) + is x:CCicell do toExpr(tanh(x.v)) + is x:RRcell do toExpr(tanh(x.v)) + is x:RRicell do toExpr(tanh(x.v)) else WrongArgRRorCC() ); setupfun("tanh",tanh).Protected=false; exp(e:Expr):Expr := ( when e - is x:CCcell do toExpr(exp(x.v)) -- # typical value: exp, CC, CC - is x:CCicell do toExpr(exp(x.v)) -- # typical value: exp, CCi, CCi - is x:RRcell do toExpr(exp(x.v)) -- # typical value: exp, RR, RR - is x:RRicell do toExpr(exp(x.v)) -- # typical value: exp, RRi, RRi + -- # typical value: exp, InexactNumber, InexactNumber + is x:CCcell do toExpr(exp(x.v)) + is x:CCicell do toExpr(exp(x.v)) + is x:RRcell do toExpr(exp(x.v)) + is x:RRicell do toExpr(exp(x.v)) else WrongArgRRorCC() ); setupfun("exp",exp).Protected=false; @@ -1370,52 +1400,54 @@ log(e:Expr):Expr := ( when e is a:Sequence do if length(a) != 2 then WrongNumArgs(1,2) else ( + -- # typical value: log, InexactNumber, InexactNumber, InexactNumber when a.0 is b:RRcell do ( when a.1 - is x:CCcell do toExpr(log(b.v,x.v)) -- # typical value: log, RR, CC, CC - is x:CCicell do toExpr(log(toCCi(b.v), x.v)) -- # typical value: log, RR, CCi, CCi - is x:RRcell do ( -- # typical value: log, RR, RR, CC - if b.v>0 && x.v>0 then toExpr(log(b.v,x.v)) else toExpr(logc(b.v,x.v)) + is x:CCcell do toExpr(log(b.v,x.v)) + is x:CCicell do toExpr(log(toCCi(b.v), x.v)) + is x:RRcell do ( + if b.v>0 && x.v>0 then toExpr(log(b.v,x.v)) else toExpr(logc(b.v,x.v)) ) - is x:RRicell do ( -- # typical value: log, RR, RRi, RRi - if b.v>0 && x.v>=0 then toExpr(log(toRRi(b.v,precision(b.v)),x.v)) - else toExpr(log(toCCi(b.v), toCCi(x.v))) + is x:RRicell do ( + if b.v>0 && x.v>=0 then toExpr(log(toRRi(b.v,precision(b.v)),x.v)) + else toExpr(log(toCCi(b.v), toCCi(x.v))) ) else WrongArgRRorCC(1)) - is b:RRicell do ( + is b:RRicell do ( when a.1 - is x:CCcell do toExpr(log(toCCi(b.v), toCCi(x.v))) -- #typical value: log, RRi, CC, CCi - is x:CCicell do toExpr(log(toCCi(b.v), x.v)) -- # typical value: log, RRi, CCi, CCi - is x:RRcell do ( -- # typical value: log, RRi, RR, RRi - if b.v>0 && x.v>=0 then toExpr(log(b.v,toRRi(x.v,precision(x.v)))) + is x:CCcell do toExpr(log(toCCi(b.v), toCCi(x.v))) + is x:CCicell do toExpr(log(toCCi(b.v), x.v)) + is x:RRcell do ( + if b.v>0 && x.v>=0 then toExpr(log(b.v,toRRi(x.v,precision(x.v)))) else toExpr(log(toCCi(b.v), toCCi(x.v))) - ) - is x:RRicell do ( -- # typical value: log, RRi, RRi, RRi - if b.v>0 && x.v>=0 then toExpr(log(b.v,x.v)) + ) + is x:RRicell do ( + if b.v>0 && x.v>=0 then toExpr(log(b.v,x.v)) else toExpr(log(toCCi(b.v), toCCi(x.v))) ) else WrongArgRRorRRi(2)) - is b:CCcell do ( - when a.1 - is x:CCcell do toExpr(log(b.v, x.v)) -- # typical value: log, CC, CC, CC - is x:CCicell do toExpr(log(toCCi(b.v), x.v)) -- # typical value: log, CC, CCi, CCi - is x:RRcell do toExpr(log(b.v, x.v)) -- # typical value: log, CC, RR, CC - is x:RRicell do toExpr(log(toCCi(b.v), toCCi(x.v))) -- # typical value: log, CC, RRi, CCi - else WrongArgRRorCC(2)) - is b:CCicell do ( - when a.1 - is x:CCcell do toExpr(log(b.v, toCCi(x.v))) -- # typical value: log, CCi, CC, CCi - is x:CCicell do toExpr(log(b.v, x.v)) -- # typical value: log, CCi, CCi, CCi - is x:RRcell do toExpr(log(b.v, toCCi(x.v))) -- # typical value: log, CCi, RR, CCi - is x:RRicell do toExpr(log(b.v, toCCi(x.v))) -- # typical value: log, CCi, RRi, CCi - else WrongArgRRorCC(2)) - else WrongArgRRorCC(1)) - is x:CCcell do toExpr(log(x.v)) -- # typical value: log, CC, CC - is x:CCicell do toExpr(log(x.v)) -- # typical value: log, CCi, CCi - is x:RRcell do if isNegative(x.v) then toExpr(logc(x.v)) else toExpr(log(x.v)) -- # typical value: log, RR, RR + is b:CCcell do ( + when a.1 + is x:CCcell do toExpr(log(b.v, x.v)) + is x:CCicell do toExpr(log(toCCi(b.v), x.v)) + is x:RRcell do toExpr(log(b.v, x.v)) + is x:RRicell do toExpr(log(toCCi(b.v), toCCi(x.v))) + else WrongArgRRorCC(2)) + is b:CCicell do ( + when a.1 + is x:CCcell do toExpr(log(b.v, toCCi(x.v))) + is x:CCicell do toExpr(log(b.v, x.v)) + is x:RRcell do toExpr(log(b.v, toCCi(x.v))) + is x:RRicell do toExpr(log(b.v, toCCi(x.v))) + else WrongArgRRorCC(2)) + else WrongArgRRorCC(1)) + -- # typical value: log, InexactNumber, InexactNumber + is x:CCcell do toExpr(log(x.v)) + is x:CCicell do toExpr(log(x.v)) + is x:RRcell do if isNegative(x.v) then toExpr(logc(x.v)) else toExpr(log(x.v)) is x:RRicell do ( - if x.v >= 0 then toExpr(log(x.v)) -- # typical value: log, RRi, RRi + if x.v >= 0 then toExpr(log(x.v)) else toExpr(log(toCCi(x.v)))) else WrongArgRRorCC() ); @@ -1425,33 +1457,34 @@ agm(e:Expr):Expr := ( is a:Sequence do if length(a) != 2 then WrongNumArgs(2) else ( when a.0 + -- # typical value: agm, InexactNumber, InexactNumber, InexactNumber is x:CCcell do ( when a.1 - is y:CCcell do toExpr(agm(x.v,y.v)) -- # typical value: agm, CC, CC, CC - is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) -- # typical value: agm, CC, CCi, CCi - is y:RRcell do toExpr(agm(x.v,toCC(y.v))) -- # typical value: agm, CC, RR, CC - is y:RRicell do toExpr(agm(toCCi(x.v),toCCi(y.v))) -- # typical value: agm, CC, RRi, CCi + is y:CCcell do toExpr(agm(x.v,y.v)) + is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) + is y:RRcell do toExpr(agm(x.v,toCC(y.v))) + is y:RRicell do toExpr(agm(toCCi(x.v),toCCi(y.v))) else WrongArgRRorCC(2)) is x:CCicell do ( when a.1 - is y:CCcell do toExpr(agm(x.v,toCCi(y.v))) -- # typical value: agm, CCi, CC, CCi - is y:CCicell do toExpr(agm(x.v, y.v)) -- # typical value: agm, CCi, CCi, CCi - is y:RRcell do toExpr(agm(x.v,toCCi(y.v))) -- # typical value: agm, CCi, RR, CCi - is y:RRicell do toExpr(agm(x.v, toCCi(y.v))) -- # typical value: agm, CCi, RRi, CCi + is y:CCcell do toExpr(agm(x.v,toCCi(y.v))) + is y:CCicell do toExpr(agm(x.v, y.v)) + is y:RRcell do toExpr(agm(x.v,toCCi(y.v))) + is y:RRicell do toExpr(agm(x.v, toCCi(y.v))) else WrongArgRRorCC(2)) is x:RRcell do ( when a.1 - is y:CCcell do toExpr(agm(toCC(x.v),y.v)) -- # typical value: agm, RR, CC, CC - is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) -- # typical value: agm, RR, CCi, CCi - is y:RRcell do toExpr(agm(x.v,y.v)) -- # typical value: agm, RR, RR, RR - is y:RRicell do toExpr(agm(toRRi(x.v), y.v)) -- # typical value: agm, RR, RRi, RRi + is y:CCcell do toExpr(agm(toCC(x.v),y.v)) + is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) + is y:RRcell do toExpr(agm(x.v,y.v)) + is y:RRicell do toExpr(agm(toRRi(x.v), y.v)) else WrongArgRRorCC(2)) is x:RRicell do ( when a.1 - is y:CCcell do toExpr(agm(toCCi(x.v),toCCi(y.v))) -- # typical value: agm, RRi, CC, CCi - is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) -- # typical value: agm, RRi, CCi, CCi - is y:RRcell do toExpr(agm(x.v,toRRi(y.v))) -- # typical value: agm, RRi, RR, RRi - is y:RRicell do toExpr(agm(x.v, y.v)) -- # typical value: agm, RRi, RRi, RRi + is y:CCcell do toExpr(agm(toCCi(x.v),toCCi(y.v))) + is y:CCicell do toExpr(agm(toCCi(x.v), y.v)) + is y:RRcell do toExpr(agm(x.v,toRRi(y.v))) + is y:RRicell do toExpr(agm(x.v, y.v)) else WrongArgRRorCC(2)) else WrongArgRRorCC(1)) else WrongNumArgs(2) @@ -1510,18 +1543,19 @@ header "#include "; sqrt(a:Expr):Expr := ( when a + -- # typical value: sqrt, InexactNumber, InexactNumber is x:RRcell do ( if x.v < 0 then toExpr(toCC(0,sqrt(-x.v))) - else toExpr(sqrt(x.v)) -- # typical value: sqrt, RR, CC + else toExpr(sqrt(x.v)) ) is x:RRicell do ( if leftRR(x.v) >= 0 - then toExpr(sqrt(x.v)) -- # typical value: sqrt, RRi, RRi + then toExpr(sqrt(x.v)) else buildErrorPacket("Not implemented") ) - is x:CCcell do toExpr(sqrt(x.v)) -- # typical value: sqrt, CC, CC - is x:CCicell do toExpr(sqrt(x.v)) -- # typical value: sqrt, CCi, CCi + is x:CCcell do toExpr(sqrt(x.v)) + is x:CCicell do toExpr(sqrt(x.v)) is Error do a else WrongArgRRorCC()); setupfun("sqrt",sqrt).Protected=false; diff --git a/M2/Macaulay2/m2/typicalvalues.m2 b/M2/Macaulay2/m2/typicalvalues.m2 index 76256290af4..3ea8d586d35 100644 --- a/M2/Macaulay2/m2/typicalvalues.m2 +++ b/M2/Macaulay2/m2/typicalvalues.m2 @@ -152,35 +152,35 @@ typval = x -> ( f := redefs#f'; args := drop(drop(x,-1),1); installMethod append(prepend(f,args),last x => f'); - if args === sequence RR then variants#(f,Number) = f' @@ numeric + if args === sequence InexactNumber then variants#(f,Number) = f' @@ numeric else if #args === 2 then ( - if args#0 === RR then variants#(f,Number,args#1) = (x,y) -> f'(numeric_(precision y) x,y); - if args#1 === RR then variants#(f,args#0,Number) = (x,y) -> f'(x,numeric_(precision x) y); - if args === (RR,RR) then variants#(f,Number,Number) = (x,y) -> f'(numeric x,numeric y); -- phew + if args#0 === InexactNumber then variants#(f,Number,args#1) = (x,y) -> f'(numeric_(precision y) x,y); + if args#1 === InexactNumber then variants#(f,args#0,Number) = (x,y) -> f'(x,numeric_(precision x) y); + if args === (InexactNumber,InexactNumber) then variants#(f,Number,Number) = (x,y) -> f'(numeric x,numeric y); -- phew ) else if #args === 3 then ( - if args#0 === RR then + if args#0 === InexactNumber then variants#(f, Number, args#1, args#2) = (x,y,z) -> f'(numeric(min(precision y, precision z), x), y, z); - if args#1 === RR then + if args#1 === InexactNumber then variants#(f, args#0, Number, args#2) = (x,y,z) -> f'(x, numeric(min(precision x, precision z), y), z); - if args#2 === RR then + if args#2 === InexactNumber then variants#(f, args#0, args#1, Number) = (x,y,z) -> f'(x, y, numeric(min(precision x, precision y), z)); - if args#0 === RR and args#1 === RR then + if args#0 === InexactNumber and args#1 === InexactNumber then variants#(f, Number, Number, args#2) = (x,y,z) -> f'(numeric_(precision z) x, numeric_(precision z) y, z); - if args#0 === RR and args#2 === RR then + if args#0 === InexactNumber and args#2 === InexactNumber then variants#(f, Number, args#1, Number) = (x,y,z) -> f'(numeric_(precision y) x, y, numeric_(precision y) z); - if args#1 === RR and args#2 === RR then + if args#1 === InexactNumber and args#2 === InexactNumber then variants#(f, args#0, Number, Number) = (x,y,z) -> f'(x, numeric_(precision x) y, numeric_(precision x) z); - if args === (RR, RR, RR) then + if args === (InexactNumber, InexactNumber, InexactNumber) then variants#(f, Number, Number, Number) = (x,y,z) -> f'(numeric x, numeric y, numeric z); ); diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 index b053287ef7b..9cd5b854eae 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 @@ -1,22 +1,7 @@ doc /// Key Beta - (Beta,CC,CC) - (Beta,CC,CCi) - (Beta,CC,RR) - (Beta,CC,RRi) - (Beta,CCi,CC) - (Beta,CCi,CCi) - (Beta,CCi,RR) - (Beta,CCi,RRi) - (Beta,RR,CC) - (Beta,RR,CCi) - (Beta,RR,RR) - (Beta,RR,RRi) - (Beta,RRi,CC) - (Beta,RRi,CCi) - (Beta,RRi,RR) - (Beta,RRi,RRi) + (Beta,InexactNumber,InexactNumber) Headline Beta function Usage @@ -40,70 +25,7 @@ doc /// doc /// Key regularizedBeta - (regularizedBeta,CC,CC,CC) - (regularizedBeta,CC,CC,CCi) - (regularizedBeta,CC,CC,RR) - (regularizedBeta,CC,CC,RRi) - (regularizedBeta,CC,CCi,CC) - (regularizedBeta,CC,CCi,CCi) - (regularizedBeta,CC,CCi,RR) - (regularizedBeta,CC,CCi,RRi) - (regularizedBeta,CC,RR,CC) - (regularizedBeta,CC,RR,CCi) - (regularizedBeta,CC,RR,RR) - (regularizedBeta,CC,RR,RRi) - (regularizedBeta,CC,RRi,CC) - (regularizedBeta,CC,RRi,CCi) - (regularizedBeta,CC,RRi,RR) - (regularizedBeta,CC,RRi,RRi) - (regularizedBeta,CCi,CC,CC) - (regularizedBeta,CCi,CC,CCi) - (regularizedBeta,CCi,CC,RR) - (regularizedBeta,CCi,CC,RRi) - (regularizedBeta,CCi,CCi,CC) - (regularizedBeta,CCi,CCi,CCi) - (regularizedBeta,CCi,CCi,RR) - (regularizedBeta,CCi,CCi,RRi) - (regularizedBeta,CCi,RR,CC) - (regularizedBeta,CCi,RR,CCi) - (regularizedBeta,CCi,RR,RR) - (regularizedBeta,CCi,RR,RRi) - (regularizedBeta,CCi,RRi,CC) - (regularizedBeta,CCi,RRi,CCi) - (regularizedBeta,CCi,RRi,RR) - (regularizedBeta,CCi,RRi,RRi) - (regularizedBeta,RR,CC,CC) - (regularizedBeta,RR,CC,CCi) - (regularizedBeta,RR,CC,RR) - (regularizedBeta,RR,CC,RRi) - (regularizedBeta,RR,CCi,CC) - (regularizedBeta,RR,CCi,CCi) - (regularizedBeta,RR,CCi,RR) - (regularizedBeta,RR,CCi,RRi) - (regularizedBeta,RR,RR,CC) - (regularizedBeta,RR,RR,CCi) - (regularizedBeta,RR,RR,RR) - (regularizedBeta,RR,RR,RRi) - (regularizedBeta,RR,RRi,CC) - (regularizedBeta,RR,RRi,CCi) - (regularizedBeta,RR,RRi,RR) - (regularizedBeta,RR,RRi,RRi) - (regularizedBeta,RRi,CC,CC) - (regularizedBeta,RRi,CC,CCi) - (regularizedBeta,RRi,CC,RR) - (regularizedBeta,RRi,CC,RRi) - (regularizedBeta,RRi,CCi,CC) - (regularizedBeta,RRi,CCi,CCi) - (regularizedBeta,RRi,CCi,RR) - (regularizedBeta,RRi,CCi,RRi) - (regularizedBeta,RRi,RR,CC) - (regularizedBeta,RRi,RR,CCi) - (regularizedBeta,RRi,RR,RR) - (regularizedBeta,RRi,RR,RRi) - (regularizedBeta,RRi,RRi,CC) - (regularizedBeta,RRi,RRi,CCi) - (regularizedBeta,RRi,RRi,RR) - (regularizedBeta,RRi,RRi,RRi) + (regularizedBeta,InexactNumber,InexactNumber,InexactNumber) Headline regularized beta function Usage diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 index cc38d9ff44b..a5f62b68da7 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 @@ -1,26 +1,8 @@ doc /// Key Gamma - (Gamma,CC) - (Gamma,CC,CC) - (Gamma,CC,RR) - (Gamma,CC,RRi) - (Gamma,RR) - (Gamma,RR,CC) - (Gamma,RR,RR) - (Gamma,RR,RRi) - (Gamma,RRi) - (Gamma,RRi,CC) - (Gamma,RRi,RR) - (Gamma,RRi,RRi) - (Gamma,CC,CCi) - (Gamma,CCi) - (Gamma,CCi,CC) - (Gamma,CCi,CCi) - (Gamma,CCi,RR) - (Gamma,CCi,RRi) - (Gamma,RR,CCi) - (Gamma,RRi,CCi) + (Gamma,InexactNumber) + (Gamma,InexactNumber,InexactNumber) Headline Gamma function Usage @@ -51,22 +33,7 @@ doc /// doc /// Key regularizedGamma - (regularizedGamma,CC,CC) - (regularizedGamma,CC,CCi) - (regularizedGamma,CC,RR) - (regularizedGamma,CC,RRi) - (regularizedGamma,CCi,CC) - (regularizedGamma,CCi,CCi) - (regularizedGamma,CCi,RR) - (regularizedGamma,CCi,RRi) - (regularizedGamma,RR,CC) - (regularizedGamma,RR,CCi) - (regularizedGamma,RR,RR) - (regularizedGamma,RR,RRi) - (regularizedGamma,RRi,CC) - (regularizedGamma,RRi,CCi) - (regularizedGamma,RRi,RR) - (regularizedGamma,RRi,RRi) + (regularizedGamma,InexactNumber,InexactNumber) Headline upper regularized gamma function Usage diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 index 4e496e102b8..dd21f4fbb1c 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/atan-doc.m2 @@ -3,8 +3,7 @@ --- notes: document { - Key => {atan2,(atan2,RR,RR),(atan2, RRi, RRi), - (atan2,RR,RRi), (atan2,RRi,RR) + Key => {atan2,(atan2,InexactNumber,InexactNumber) }, Headline => "compute an angle of a certain triangle", Usage => "atan2(y,x)\natan2(y,I)\natan2(J,x)\natan2(J,I)", @@ -22,7 +21,7 @@ document { } document { - Key => {atan,(atan,RR),(atan,CC),(atan, RRi),(atan,CCi)}, + Key => {atan,(atan,InexactNumber)}, Headline => "compute the arctangent of a number", Usage => "atan x\natan I", Inputs => { "x" => RR, "I" => RRi}, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 index eb4a9366f99..46b97cb3ea7 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/cos-doc.m2 @@ -3,7 +3,7 @@ --- notes: document { - Key => {cos, (cos,CC),(cos,CCi),(cos,RR),(cos, RRi)}, + Key => {cos, (cos,InexactNumber)}, Headline => "compute the cosine", Usage => "cos x\ncos I", Inputs => { "x" => RR,"I"=>RRi}, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 index f14c70e6380..1a8e58548db 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 @@ -1,10 +1,7 @@ doc /// Key erf - (erf,CC) - (erf,CCi) - (erf,RR) - (erf,RRi) + (erf,InexactNumber) Headline error function Usage @@ -27,10 +24,7 @@ doc /// doc /// Key erfc - (erfc,CC) - (erfc,CCi) - (erfc,RR) - (erfc,RRi) + (erfc,InexactNumber) Headline complementary error function Usage diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 index 04e40aaa4c5..1fe5825e654 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/sin-doc.m2 @@ -3,7 +3,7 @@ --- notes: Is the comment about being used as an example still relevant? document { - Key => {sin,(sin,CC),(sin,CCi),(sin,RR),(sin, RRi)}, + Key => {sin,(sin,InexactNumber)}, -- this node is used as an example in the documentation node Inputs and Outputs. Headline => "compute the sine", Usage => "sin x\nsin I", diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 index 6521a58078f..cefa1766c1a 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/sinh-doc.m2 @@ -3,7 +3,7 @@ --- notes: include example? document { - Key => {sinh,(sinh,CC),(sinh,RR),(sinh, RRi),(sinh,CCi)}, + Key => {sinh,(sinh,InexactNumber)}, Headline => "compute the hyperbolic sine", Usage => "sinh x\nsinh I", Inputs => { diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 index 16874e74e5a..3eaa63ff556 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/tan-doc.m2 @@ -3,7 +3,7 @@ --- notes: document { - Key => {tan,(tan,CC),(tan,CCi),(tan,RR), (tan,RRi)}, + Key => {tan,(tan,InexactNumber)}, Headline => "compute the tangent", Usage => "tan x\ntan I", Inputs => { diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 index 2a17014a024..3305f26edd4 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/tanh-doc.m2 @@ -3,7 +3,7 @@ --- notes: include example? document { - Key => {tanh, (tanh,CC),(tanh,RR),(tanh, RRi),(tanh,CCi)}, + Key => {tanh, (tanh,InexactNumber)}, Headline => "compute the hyperbolic tangent", Usage => "tanh x\ntanh I", Inputs => { diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 index 7baacd1dfbd..f8387c36477 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators.m2 @@ -77,10 +77,7 @@ document { doc /// Key exp - (exp, RR) - (exp, CC) - (exp, RRi) - (exp, CCi) + (exp, InexactNumber) Headline exponential function Usage @@ -105,25 +102,8 @@ doc /// doc /// Key log - (log, RR) - (log,CC) - (log,CC,CC) - (log,CC,CCi) - (log,CC,RR) - (log,CC,RRi) - (log,CCi) - (log,CCi,CC) - (log,CCi,CCi) - (log,CCi,RR) - (log,CCi,RRi) - (log,RR,CCi) - (log,RR,RR) - (log,RR,RRi) - (log,RRi) - (log,RRi,CCi) - (log,RRi,RR) - (log,RRi,RRi) - (log,RR,CC) + (log,InexactNumber) + (log,InexactNumber,InexactNumber) Headline logarithm function Usage @@ -163,10 +143,7 @@ doc /// doc /// Key sqrt - (sqrt, RR) - (sqrt, CC) - (sqrt, RRi) - (sqrt, CCi) + (sqrt, InexactNumber) Headline square root function Usage diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 index 510561b8249..0287d35460c 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_analytic_functions.m2 @@ -152,10 +152,7 @@ document { Key => {CatalanConstant}, doc /// Key log1p - (log1p,CC) - (log1p,CCi) - (log1p,RR) - (log1p,RRi) + (log1p,InexactNumber) Headline logarithm of 1+x Usage @@ -180,10 +177,7 @@ doc /// doc /// Key expm1 - (expm1,CC) - (expm1,CCi) - (expm1,RR) - (expm1,RRi) + (expm1,InexactNumber) Headline exponential minus 1 Usage @@ -205,7 +199,7 @@ doc /// expm1 interval(1+2*ii,3+4*ii) /// -document { Key => {eint,(eint, RR),(eint,CC),(eint,RRi),(eint,CCi)}, +document { Key => {eint,(eint, InexactNumber)}, Usage => "eint x", Headline => "exponential integral", Inputs => { "x" }, @@ -219,7 +213,7 @@ document { Key => {eint,(eint, RR),(eint,CC),(eint,RRi),(eint,CCi)}, PARA {"See ", wikipedia "Exponential integral", "."} } -document { Key => {Digamma,(Digamma, RR),(Digamma,CC),(Digamma,RRi),(Digamma,CCi)}, +document { Key => {Digamma,(Digamma, InexactNumber)}, Usage => "Digamma x", Headline => "Digamma function", Inputs => { "x" }, @@ -234,7 +228,7 @@ document { Key => {Digamma,(Digamma, RR),(Digamma,CC),(Digamma,RRi),(Digamma,CCi SeeAlso => {Gamma} } -document { Key => {zeta,(zeta, RR),(zeta,CC),(zeta,RRi),(zeta,CCi)}, +document { Key => {zeta,(zeta, InexactNumber)}, Usage => "zeta x", Headline => "Riemann zeta function", Inputs => { "x" }, @@ -250,7 +244,7 @@ document { Key => {zeta,(zeta, RR),(zeta,CC),(zeta,RRi),(zeta,CCi)}, document { --- author(s): L. Gold, Dan Grayson - Key => {acos,(acos,RR),(acos,CC),(acos, RRi),(acos,CCi)}, + Key => {acos,(acos, InexactNumber)}, Headline => "arccosine", Usage => "acos x\nacos I", Inputs => { "x" => RR, "x" => CC, "I" => RRi, "I" => CCi }, @@ -266,7 +260,7 @@ document { document { --- author(s): L. Gold, Dan Grayson - Key => {asin,(asin,RR),(asin,CC),(asin, RRi),(asin,CCi)}, + Key => {asin,(asin,InexactNumber)}, Headline => "arcsine", Usage => "asin x\nasin I", Inputs => { "x" => RR, "x" => CC, "I" => RRi, "I" => CCi }, @@ -283,7 +277,7 @@ document { document { --- author(s): L. Gold - Key => {cosh, (cosh,RR),(cosh,CC),(cosh,RRi),(cosh,CCi)}, + Key => {cosh, (cosh,InexactNumber)}, Headline => "compute the hyperbolic cosine", Usage => "cosh x\ncosh I", Inputs => { "x"=>RR, "x"=>CC, "I"=>RRi, "I"=>CCi}, @@ -321,7 +315,7 @@ document { PARA {"See ", wikipedia "Hyperbolic function", "."} } -document { Key => {sec,(sec,CC),(sec, RR),(sec, RRi),(sec,CCi)}, +document { Key => {sec,(sec,InexactNumber)}, Usage => "sec x\nsec I", Headline => "secant", Inputs => { "x" => RR, "x" => CC, "I" => RRi, "I" => CCi }, @@ -335,7 +329,7 @@ document { Key => {sec,(sec,CC),(sec, RR),(sec, RRi),(sec,CCi)}, PARA {"See ", wikipedia "Trigonometric function", "."} } -document { Key => {csc,(csc,CC),(csc, RR),(csc,RRi),(csc,CCi)}, +document { Key => {csc,(csc,InexactNumber)}, Usage => "csc x\ncsc I", Headline => "cosecant", Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, @@ -349,7 +343,7 @@ document { Key => {csc,(csc,CC),(csc, RR),(csc,RRi),(csc,CCi)}, PARA {"See ", wikipedia "Trigonometric function", "."} } -document { Key => {cot,(cot, RR),(cot,CC),(cot,RRi),(cot,CCi)}, +document { Key => {cot,(cot, InexactNumber)}, Usage => "cot x\ncot I", Headline => "cotangent", Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, @@ -363,7 +357,7 @@ document { Key => {cot,(cot, RR),(cot,CC),(cot,RRi),(cot,CCi)}, PARA {"See ", wikipedia "Trigonometric function", "."} } -document { Key => {sech,(sech,CC),(sech, RR),(sech, RRi),(sech,CCi)}, +document { Key => {sech,(sech,InexactNumber)}, Usage => "sech x\nsech I", Headline => "hyperbolic secant", Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, @@ -377,7 +371,7 @@ document { Key => {sech,(sech,CC),(sech, RR),(sech, RRi),(sech,CCi)}, PARA {"See ", wikipedia "Hyperbolic function", "."} } -document { Key => {csch,(csch,CC),(csch, RR),(csch,RRi),(csch,CCi)}, +document { Key => {csch,(csch,InexactNumber)}, Usage => "csch x\ncsch I", Headline => "hyperbolic cosecant", Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, @@ -391,7 +385,7 @@ document { Key => {csch,(csch,CC),(csch, RR),(csch,RRi),(csch,CCi)}, PARA {"See ", wikipedia "Hyperbolic function", "."} } -document { Key => {coth,(coth,CC),(coth, RR),(coth,RRi),(coth,CCi)}, +document { Key => {coth,(coth,InexactNumber)}, Usage => "coth x\ncoth I", Headline => "hyperbolic cotangent", Inputs => { "x"=>RR, "x" => CC, "I"=>RRi, "I"=>CCi }, @@ -443,22 +437,7 @@ document { Key => {BesselY,(BesselY, ZZ, Number),(BesselY,Number,Number)}, document { Key => { agm, - (agm, RR, RR), - (agm,CC,CC), - (agm,CC,CCi), - (agm,CC,RR), - (agm,CC,RRi), - (agm,CCi,CC), - (agm,CCi,CCi), - (agm,CCi,RR), - (agm,CCi,RRi), - (agm,RR,CC), - (agm,RR,CCi), - (agm,RR,RRi), - (agm,RRi,CC), - (agm,RRi,CCi), - (agm,RRi,RR), - (agm,RRi,RRi)}, + (agm,InexactNumber,InexactNumber)}, Usage => "agm(x,y)", Inputs => { "x" => "a number", "y" => "a number" }, Outputs => { {"the arithmetic-geometric mean of ", TT "x", " and ", TT "y"}}, From c84f069ece097e8c890f57ac8898fb4a0cf2654e Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 8 Dec 2025 17:40:02 -0500 Subject: [PATCH 192/691] Add sqrt for negative RRi (returns CCi) --- M2/Macaulay2/d/actors3.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 8f96aac0d61..2bb505ba366 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -1552,7 +1552,7 @@ sqrt(a:Expr):Expr := ( is x:RRicell do ( if leftRR(x.v) >= 0 then toExpr(sqrt(x.v)) - else buildErrorPacket("Not implemented") + else toExpr(sqrt(toCCi(x.v))) ) is x:CCcell do toExpr(sqrt(x.v)) is x:CCicell do toExpr(sqrt(x.v)) From 1e7565025cb4e2acb9ff52e459be1cccba6e32c8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 8 Dec 2025 19:16:24 -0500 Subject: [PATCH 193/691] Also use InexactNumber for inverse functions from Boost Not quite correct since they're only defined for RR, but this way the Number methods will get defined in typicalvalues.m2. --- M2/Macaulay2/d/boostmath.dd | 4 ++-- M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 | 2 +- M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/boostmath.dd b/M2/Macaulay2/d/boostmath.dd index 08335f2b5c7..b8a61c11079 100644 --- a/M2/Macaulay2/d/boostmath.dd +++ b/M2/Macaulay2/d/boostmath.dd @@ -34,7 +34,7 @@ handleBoostError(x:RRorNull):Expr:= is null do buildErrorPacket("Boost Math Toolkit error") is y:RR do toExpr(y); --- # typical value: inverseRegularizedGamma, RR, RR, RR +-- # typical value: inverseRegularizedGamma, InexactNumber, InexactNumber, InexactNumber inverseRegularizedGamma(a:RR,q:RR):RRorNull:= ( prec := min(precision(a), precision(q)); Ccode(returns, "BOOST_MATH_CALL(gamma_q_inv, ", prec, ", RR_TO_BOOST(", a, @@ -49,7 +49,7 @@ inverseRegularizedGamma(e:Expr):Expr := else WrongNumArgs(2); setupfun("inverseRegularizedGamma",inverseRegularizedGamma).Protected=false; --- # typical value: inverseRegularizedBeta, RR, RR, RR, RR +-- # typical value: inverseRegularizedBeta, InexactNumber, InexactNumber, InexactNumber, InexactNumber inverseRegularizedBeta(p:RR,a:RR,b:RR):RRorNull:= ( prec := min(precision(p), min(precision(a), precision(b))); Ccode(returns, "BOOST_MATH_CALL(ibeta_inv, ", prec, ", RR_TO_BOOST(", a, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 index 9cd5b854eae..124c704a351 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Beta-doc.m2 @@ -51,7 +51,7 @@ doc /// doc /// Key inverseRegularizedBeta - (inverseRegularizedBeta,RR,RR,RR) + (inverseRegularizedBeta,InexactNumber,InexactNumber,InexactNumber) Headline inverse of the regularized beta function Usage diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 index a5f62b68da7..97cc30ba6df 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/Gamma-doc.m2 @@ -58,7 +58,7 @@ doc /// doc /// Key inverseRegularizedGamma - (inverseRegularizedGamma,RR,RR) + (inverseRegularizedGamma,InexactNumber,InexactNumber) Headline inverse of the upper regularized gamma function Usage From b56cf4e870b5076c4e9eb67a7ceeb20e06d9bb3d Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 8 Dec 2025 22:02:00 -0500 Subject: [PATCH 194/691] Fix log1p(CC) test now that we use arb --- M2/Macaulay2/tests/normal/complex.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/tests/normal/complex.m2 b/M2/Macaulay2/tests/normal/complex.m2 index e6cf0f77f9b..9d27c18e589 100644 --- a/M2/Macaulay2/tests/normal/complex.m2 +++ b/M2/Macaulay2/tests/normal/complex.m2 @@ -167,5 +167,5 @@ b = sqrt(a) assert(abs(b^2-a) < 1e-14) assert(b >= 0) -assert(log1p ii == log(1 + ii)) +assert(abs(log1p ii - log(1 + ii)) < 1e-14) assert(expm1 ii == exp ii - 1) From 43f4fa1749f31a349fce8e0b6cdcf5ae5e62deb1 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 9 Dec 2025 05:55:31 -0500 Subject: [PATCH 195/691] Also use InexactNumber for inverseErf --- M2/Macaulay2/d/actors3.d | 5 +++-- M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/d/actors3.d b/M2/Macaulay2/d/actors3.d index 2bb505ba366..094d6c2a086 100644 --- a/M2/Macaulay2/d/actors3.d +++ b/M2/Macaulay2/d/actors3.d @@ -1037,8 +1037,9 @@ erfc(e:Expr):Expr := ( setupfun("erfc",erfc).Protected=false; inverseErf(e:Expr):Expr := ( when e - is x:RRcell do toExpr(midpointRR(inverseErf(toRRi(x.v)))) -- # typical value: inverseErf, RR, RR - is x:RRicell do toExpr(inverseErf(x.v)) -- # typical value: inverseErf, RRi, RRi + -- # typical value: inverseErf, InexactNumber, InexactNumber + is x:RRcell do toExpr(midpointRR(inverseErf(toRRi(x.v)))) + is x:RRicell do toExpr(inverseErf(x.v)) else WrongArgRRorRRi()); setupfun("inverseErf",inverseErf).Protected=false; BesselJ(n:long,x:RR):RR := ( diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 index 1a8e58548db..19a4aa30b7f 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/erf-doc.m2 @@ -47,8 +47,7 @@ doc /// doc /// Key inverseErf - (inverseErf,RR) - (inverseErf,RRi) + (inverseErf,InexactNumber) Headline inverse error function Usage From e2674fd837ddeda3bdfff870360981abc19d6028 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 2 Dec 2025 16:24:26 -0500 Subject: [PATCH 196/691] Use an atomic hash counter Previously, it was thread-local, which meant that mutable objects created in threads might not be "younger" than older objects created in other threads. --- M2/Macaulay2/d/expr.d | 15 ++++----------- M2/Macaulay2/tests/normal/threads.m2 | 4 ++++ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/M2/Macaulay2/d/expr.d b/M2/Macaulay2/d/expr.d index 7958fd5a315..23e0b0762f1 100644 --- a/M2/Macaulay2/d/expr.d +++ b/M2/Macaulay2/d/expr.d @@ -22,20 +22,13 @@ threadLocal export recursionDepth := 0; --Maximum function depth before triggering errors threadLocal export recursionLimit := 300; - -threadCounter := 0; -threadLocal HashCounter := ( - threadCounter = threadCounter + 1; - hash_t(1000000 + 3 + (threadCounter-1) * 10000 )); --- give 32-bit machines enough space to store a 64-bit hash code --- TODO: instead, allow 64-bit entries in the array of thread local variables -threadLocal HashCounterExtraBits := 0; +header "_Atomic uint64_t HashCounter = 1000004;"; export nextHash():hash_t := ( - if HashCounter == Ccode(hash_t, "18446744073709551615ull") -- check for integer overflow + currentHash := Ccode(hash_t, "atomic_load(&HashCounter)"); + if currentHash == Ccode(hash_t, "18446744073709551615ull") -- check for integer overflow then Ccode(void, " fprintf(stderr, \" *** hash code serial number counter overflow (too many mutable objects created)\\n\"); abort(); "); - HashCounter = HashCounter + 1; - HashCounter); + Ccode(hash_t, "atomic_fetch_add(&HashCounter, 1)")); ------------------------------------------------------------ -- hash codes for mutable objects that don't use nextHash -- diff --git a/M2/Macaulay2/tests/normal/threads.m2 b/M2/Macaulay2/tests/normal/threads.m2 index c8b2122efb1..bf6416667a6 100644 --- a/M2/Macaulay2/tests/normal/threads.m2 +++ b/M2/Macaulay2/tests/normal/threads.m2 @@ -87,6 +87,10 @@ assert Equation(getIOThreadMode f, 2) removeFile fn +-- issue #3358 +Foo = taskResult schedule(() -> new Type of HashTable) +assert BinaryOperation(symbol ===, youngest(Foo, Matrix), Foo) + -- Local Variables: -- compile-command: "make -C $M2BUILDDIR/Macaulay2/packages/Macaulay2Doc/test threads.out" -- End: From 4c9c42252dcc32f86837597e6c7353eb3acad639 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 8 Dec 2025 22:20:18 -0500 Subject: [PATCH 197/691] Bump tbb to 2022.3.0 [ci skip] --- M2/libraries/tbb/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/libraries/tbb/Makefile.in b/M2/libraries/tbb/Makefile.in index ff3c49e4092..378fd965ac6 100644 --- a/M2/libraries/tbb/Makefile.in +++ b/M2/libraries/tbb/Makefile.in @@ -1,5 +1,5 @@ HOMEPAGE = https://oneapi-src.github.io/oneTBB/ -VERSION = 2022.0.0 +VERSION = 2022.3.0 URL = https://github.com/uxlfoundation/oneTBB/archive/refs/tags TARDIR = oneTBB-$(VERSION) TARFILE = v$(VERSION).tar.gz From c198a17c8b00e247493072fbaaa90c085e1e04d2 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 8 Dec 2025 22:28:49 -0500 Subject: [PATCH 198/691] Bump gc to 8.2.10 [ci skip] --- M2/libraries/gc/Makefile.in | 2 +- M2/submodules/bdwgc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/M2/libraries/gc/Makefile.in b/M2/libraries/gc/Makefile.in index 2d02cffd43a..1b3868a9c91 100644 --- a/M2/libraries/gc/Makefile.in +++ b/M2/libraries/gc/Makefile.in @@ -3,7 +3,7 @@ SUBMODULE = true LIBNAME = bdwgc URL = https://github.com/ivmai/bdwgc.git GITURL = https://github.com/ivmai/bdwgc/ -VERSION = 8.2.8 +VERSION = 8.2.10 LICENSEFILES = README.QUICK # PATCHFILE = @abs_srcdir@/patch-$(VERSION) PRECONFIGURE = ./autogen.sh diff --git a/M2/submodules/bdwgc b/M2/submodules/bdwgc index ee59af3722e..2955e33aba7 160000 --- a/M2/submodules/bdwgc +++ b/M2/submodules/bdwgc @@ -1 +1 @@ -Subproject commit ee59af3722e56de8404de6cd0c21c2493cc4d855 +Subproject commit 2955e33aba7467d4777aa985637620f909cc2a14 From e028e5325d4401d6ffc2773332fc5990b938edaa Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 12 Dec 2025 07:50:08 -0500 Subject: [PATCH 199/691] Don't allow midpoints in quotient rings --- M2/Macaulay2/m2/quotring.m2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/M2/Macaulay2/m2/quotring.m2 b/M2/Macaulay2/m2/quotring.m2 index 16675829f80..fb14113233e 100644 --- a/M2/Macaulay2/m2/quotring.m2 +++ b/M2/Macaulay2/m2/quotring.m2 @@ -353,6 +353,11 @@ getPrimeWithRootOfUnity(ZZ,ZZ) := opt-> (n,r1) -> ( (p,r2) ); +-- the "midpoint" of a polynomial in a quotient ring isn't well-defined +-- what if it's R/I, but I has generators with intervals as coefficients? +midpoint QuotientRing := R -> ( + if isFinitePrimeField R then R else error "not well-defined") + -- Local Variables: -- compile-command: "make -C $M2BUILDDIR/Macaulay2/m2 " -- End: From 4ebd2b10d176b659bf11902b69288c5aac8a4815 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 12 Dec 2025 07:59:10 -0500 Subject: [PATCH 200/691] Add lowerLeft, etc for matrices and polynomials left and right commented for now as they're not methods --- M2/Macaulay2/m2/intervals.m2 | 14 +++++++++++--- M2/Macaulay2/m2/matrix.m2 | 8 +++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 744ac3f6a18..314e061fcfb 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -129,10 +129,18 @@ midpoint Ring := R -> ( else if instance(R, ComplexIntervalField) then CC_(precision R) else R) -midpoint RingElement := f -> ( - R := midpoint ring f; +intervalPolyHelper := (func, f) -> ( + R := midpoing ring f; if R === ring f then f - else sum(listForm f, (m, c) -> midpoint c * product(#m, i -> R_i^(m#i)))) + else sum(listForm f, (m, c) -> func c * product(#m, i -> R_i^(m#i)))) + +midpoint RingElement := f -> intervalPolyHelper(midpoint, f) +-- left RingElement := f -> intervalPolyHelper(left, f) +-- right RingElement := f -> intervalPolyHelper(right, f) +lowerLeft RingElement := f -> intervalPolyHelper(lowerLeft, f) +lowerRight RingElement := f -> intervalPolyHelper(lowerRight, f) +upperLeft RingElement := f -> intervalPolyHelper(upperLeft, f) +upperRight RingElement := f -> intervalPolyHelper(upperRight, f) toExternalString RRi := x -> "interval" | toExternalString (left x, right x) toExternalString CCi := x -> "interval" | toExternalString (left realPart x+(left imaginaryPart x)*ii,right realPart x+(right imaginaryPart x)*ii) diff --git a/M2/Macaulay2/m2/matrix.m2 b/M2/Macaulay2/m2/matrix.m2 index f39ebde2ee6..855ab7abc20 100644 --- a/M2/Macaulay2/m2/matrix.m2 +++ b/M2/Macaulay2/m2/matrix.m2 @@ -781,7 +781,13 @@ leadComponent = method() leadComponent Matrix := List => m -> nonnull for c to numColumns m - 1 list position(numRows m, r -> m_(r,c) != 0, Reverse => true) leadComponent Vector := ZZ => v -> try first leadComponent matrix v else null -midpoint Matrix := f -> matrix apply(entries f, row -> midpoint \ row) +midpoint Matrix := f -> matrix apply(entries f, row -> midpoint \ row) +-- left Matrix := f -> matrix apply(entries f, row -> left \ row) +-- right Matrix := f -> matrix apply(entries f, row -> right \ row) +lowerLeft Matrix := f -> matrix apply(entries f, row -> lowerLeft \ row) +lowerRight Matrix := f -> matrix apply(entries f, row -> lowerRight \ row) +upperLeft Matrix := f -> matrix apply(entries f, row -> upperLeft \ row) +upperRight Matrix := f -> matrix apply(entries f, row -> upperRight \ row) -- Local Variables: -- compile-command: "make -C $M2BUILDDIR/Macaulay2/m2 " From 9b3c8eb8b49e9dca300200e8c9f1c58fe3057fb4 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 12 Dec 2025 09:19:17 -0500 Subject: [PATCH 201/691] Fix typo --- M2/Macaulay2/m2/intervals.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index 314e061fcfb..d589ee8b143 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -130,7 +130,7 @@ midpoint Ring := R -> ( else R) intervalPolyHelper := (func, f) -> ( - R := midpoing ring f; + R := midpoint ring f; if R === ring f then f else sum(listForm f, (m, c) -> func c * product(#m, i -> R_i^(m#i)))) From d69100214da4e98e949c49226eae650c54b6f1c9 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 12 Dec 2025 12:41:09 -0500 Subject: [PATCH 202/691] Make "left" and "right" methods --- M2/Macaulay2/d/actors4.d | 14 +++++++------- M2/Macaulay2/m2/intervals.m2 | 4 ++-- M2/Macaulay2/m2/matrix.m2 | 4 ++-- M2/Macaulay2/m2/methods.m2 | 2 +- M2/Macaulay2/m2/reals.m2 | 8 ++++++++ .../packages/Macaulay2Doc/doc_intervals.m2 | 14 ++++++++++++-- 6 files changed, 32 insertions(+), 14 deletions(-) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 701c9ddab7a..493c244e514 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1486,34 +1486,34 @@ rightRR(e:Expr):Expr := ( when e is x:RRicell do toExpr(rightRR(x.v)) else WrongArg("an interval")); -setupfun("right",rightRR); - +setupfun("right0",rightRR); + leftRR(e:Expr):Expr := ( when e is x:RRicell do toExpr(leftRR(x.v)) else WrongArg("an interval")); -setupfun("left",leftRR); - +setupfun("left0",leftRR); + width0(e:Expr):Expr := ( when e is x:RRicell do toExpr(widthRR(x.v)) is x:CCicell do toExpr(sqrt(widthRR(realPart(x.v))*widthRR(realPart(x.v))+widthRR(imaginaryPart(x.v))*widthRR(imaginaryPart(x.v)))) else WrongArg("an interval or complex interval or ball")); setupfun("diameter",width0).Protected = false; - + midpoint0(e:Expr):Expr := ( when e is x:RRicell do toExpr(midpointRR(x.v)) is x:CCicell do toExpr(toCC(midpointRR(realPart(x.v)),midpointRR(imaginaryPart(x.v)))) else WrongArg("an interval or ball")); setupfun("midpoint0",midpoint0); - + isEmptyRRi(e:Expr):Expr := ( when e is x:RRicell do toExpr(isEmpty(x.v)) else WrongArg("an interval")); setupfun("isEmptyRRi",isEmptyRRi); - + subsetRRi(e:Expr):Expr := ( when e is s:Sequence do ( if length(s) > 3 then WrongNumArgs(1,3) else diff --git a/M2/Macaulay2/m2/intervals.m2 b/M2/Macaulay2/m2/intervals.m2 index d589ee8b143..accca66ba3d 100644 --- a/M2/Macaulay2/m2/intervals.m2 +++ b/M2/Macaulay2/m2/intervals.m2 @@ -135,8 +135,8 @@ intervalPolyHelper := (func, f) -> ( else sum(listForm f, (m, c) -> func c * product(#m, i -> R_i^(m#i)))) midpoint RingElement := f -> intervalPolyHelper(midpoint, f) --- left RingElement := f -> intervalPolyHelper(left, f) --- right RingElement := f -> intervalPolyHelper(right, f) +left RingElement := f -> intervalPolyHelper(left, f) +right RingElement := f -> intervalPolyHelper(right, f) lowerLeft RingElement := f -> intervalPolyHelper(lowerLeft, f) lowerRight RingElement := f -> intervalPolyHelper(lowerRight, f) upperLeft RingElement := f -> intervalPolyHelper(upperLeft, f) diff --git a/M2/Macaulay2/m2/matrix.m2 b/M2/Macaulay2/m2/matrix.m2 index 855ab7abc20..ca2ce3e97d2 100644 --- a/M2/Macaulay2/m2/matrix.m2 +++ b/M2/Macaulay2/m2/matrix.m2 @@ -782,8 +782,8 @@ leadComponent Matrix := List => m -> nonnull for c to numColumns m - 1 list posi leadComponent Vector := ZZ => v -> try first leadComponent matrix v else null midpoint Matrix := f -> matrix apply(entries f, row -> midpoint \ row) --- left Matrix := f -> matrix apply(entries f, row -> left \ row) --- right Matrix := f -> matrix apply(entries f, row -> right \ row) +left Matrix := f -> matrix apply(entries f, row -> left \ row) +right Matrix := f -> matrix apply(entries f, row -> right \ row) lowerLeft Matrix := f -> matrix apply(entries f, row -> lowerLeft \ row) lowerRight Matrix := f -> matrix apply(entries f, row -> lowerRight \ row) upperLeft Matrix := f -> matrix apply(entries f, row -> upperLeft \ row) diff --git a/M2/Macaulay2/m2/methods.m2 b/M2/Macaulay2/m2/methods.m2 index b1f5b3069f1..0d613f1f0eb 100644 --- a/M2/Macaulay2/m2/methods.m2 +++ b/M2/Macaulay2/m2/methods.m2 @@ -276,7 +276,7 @@ setupMethods((), { coefficients, monomials, size, sum, product, nullhomotopy, module, raw, content, leadTerm, leadCoefficient, leadMonomial, components, assign, realPart, imaginaryPart, conjugate, - lowerLeft, lowerRight, upperLeft, upperRight, + left, right, lowerLeft, lowerRight, upperLeft, upperRight, relations, inverse, numeric, numericInterval, floor, ceiling, round, degree, multidegree, presentation, dismiss, precision, norm, clean, fraction, part, diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index 4a1c62cdfd8..a74aa26ffbd 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -274,6 +274,14 @@ imaginaryPart QQ := imaginaryPart InexactNumber := imaginaryPart0 imaginaryPart Number := imaginaryPart0 @@ numeric +left Number := identity +left RRi := left0 +left CCi := x -> error "use lowerLeft or upperLeft" + +right Number := identity +right RRi := right0 +right CCi := x -> error "use lowerRight or upperRight" + lowerLeft Number := identity lowerLeft RRi := left lowerLeft CCi := z -> (left realPart z) + (left imaginaryPart z)*ii diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index a912baf81f9..b0d12e8a1e3 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -1,6 +1,11 @@ doc /// Key - left + left + (left, CCi) + (left, Matrix) + (left, Number) + (left, RRi) + (left, RingElement) Headline left endpoint of an interval Usage @@ -22,7 +27,12 @@ doc /// doc /// Key - right + right + (right, CCi) + (right, Matrix) + (right, Number) + (right, RRi) + (right, RingElement) Headline right endpoint of an interval Usage From bfa071dffbe60996ca644b43af4f7930af621f8c Mon Sep 17 00:00:00 2001 From: Jay Yang Date: Mon, 8 Dec 2025 00:09:27 -0600 Subject: [PATCH 203/691] Bump Eigen to versions 3.4.0 through 5.0.0 Eigen changed how their versioning works, so the new version is version 5.0.0. They still use Eigen3 as the name in cmake it seems. --- M2/cmake/check-libraries.cmake | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/M2/cmake/check-libraries.cmake b/M2/cmake/check-libraries.cmake index c06b88aaa90..d6cd3859a01 100644 --- a/M2/cmake/check-libraries.cmake +++ b/M2/cmake/check-libraries.cmake @@ -127,7 +127,13 @@ find_package(GMP 6.0.0 REQUIRED) # givaro prime field and algebraic computations (needs gmp) # fflas_ffpack Finite Field Linear Algebra Routines (needs gmp, givaro + LAPACK) -find_package(Eigen3 3.3.0 PATHS ${M2_HOST_PREFIX}) +find_package(Eigen3 3.4...5.0 PATHS ${M2_HOST_PREFIX}) +# FindEigen3 doesn't set EIGEN3_FOUND, and instead we should check +# if the target Eigen3::Eigen is defined, so we set EIGEN3_FOUND +# for compatibility with the rest of the build code +if(TARGET Eigen3::Eigen) + set(EIGEN3_FOUND TRUE) +endif (TARGET Eigen3::Eigen) find_package(BDWGC 7.6.4) find_package(MPFR 4.0.1) find_package(MPFI 1.5.1) From b65baabe004ae8a97c606dd8da12ce473204a03c Mon Sep 17 00:00:00 2001 From: Jay Yang Date: Mon, 8 Dec 2025 00:41:14 -0600 Subject: [PATCH 204/691] Add eigen3 to target_link_libraries of M2-interpreter to fix a compile issue --- M2/Macaulay2/d/CMakeLists.txt | 5 +++++ M2/cmake/check-libraries.cmake | 17 ++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/M2/Macaulay2/d/CMakeLists.txt b/M2/Macaulay2/d/CMakeLists.txt index 56df496c6e2..988ecac134f 100644 --- a/M2/Macaulay2/d/CMakeLists.txt +++ b/M2/Macaulay2/d/CMakeLists.txt @@ -151,6 +151,11 @@ target_link_libraries(M2-interpreter PRIVATE M2-supervisor $<$:TBB::tbb> $<$:FFI::ffi>) +if(EIGEN3_FOUND) + #version.d is using an Eigen header it can't find without this line + target_link_libraries(M2-interpreter PRIVATE Eigen3::Eigen) +endif() + # TODO: c.f. https://github.com/Macaulay2/M2/issues/2682 if(NOT APPLE) target_link_libraries(M2-interpreter PRIVATE quadmath) diff --git a/M2/cmake/check-libraries.cmake b/M2/cmake/check-libraries.cmake index d6cd3859a01..0ba20b5f275 100644 --- a/M2/cmake/check-libraries.cmake +++ b/M2/cmake/check-libraries.cmake @@ -127,13 +127,16 @@ find_package(GMP 6.0.0 REQUIRED) # givaro prime field and algebraic computations (needs gmp) # fflas_ffpack Finite Field Linear Algebra Routines (needs gmp, givaro + LAPACK) -find_package(Eigen3 3.4...5.0 PATHS ${M2_HOST_PREFIX}) -# FindEigen3 doesn't set EIGEN3_FOUND, and instead we should check -# if the target Eigen3::Eigen is defined, so we set EIGEN3_FOUND -# for compatibility with the rest of the build code -if(TARGET Eigen3::Eigen) - set(EIGEN3_FOUND TRUE) -endif (TARGET Eigen3::Eigen) +find_package(Eigen3 3.4.0 PATHS ${M2_HOST_PREFIX}) +if(NOT EIGEN3_FOUND) + find_package(Eigen3 3.4.1...5.0 PATHS ${M2_HOST_PREFIX}) + # FindEigen3 doesn't set EIGEN3_FOUND, and instead we should check + # if the target Eigen3::Eigen is defined, so we set EIGEN3_FOUND + # for compatibility with the rest of the build code + if(TARGET Eigen3::Eigen) + set(EIGEN3_FOUND TRUE) + endif() +endif() find_package(BDWGC 7.6.4) find_package(MPFR 4.0.1) find_package(MPFI 1.5.1) From 587ce35a1105b63824a51abbb684b6115d05ca71 Mon Sep 17 00:00:00 2001 From: Jay Yang Date: Mon, 8 Dec 2025 11:36:21 -0600 Subject: [PATCH 205/691] Add Eigen include directories to the M2-interpreter target in a more idiomatic way --- M2/Macaulay2/d/CMakeLists.txt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/M2/Macaulay2/d/CMakeLists.txt b/M2/Macaulay2/d/CMakeLists.txt index 988ecac134f..76f674c9205 100644 --- a/M2/Macaulay2/d/CMakeLists.txt +++ b/M2/Macaulay2/d/CMakeLists.txt @@ -151,11 +151,6 @@ target_link_libraries(M2-interpreter PRIVATE M2-supervisor $<$:TBB::tbb> $<$:FFI::ffi>) -if(EIGEN3_FOUND) - #version.d is using an Eigen header it can't find without this line - target_link_libraries(M2-interpreter PRIVATE Eigen3::Eigen) -endif() - # TODO: c.f. https://github.com/Macaulay2/M2/issues/2682 if(NOT APPLE) target_link_libraries(M2-interpreter PRIVATE quadmath) @@ -171,10 +166,10 @@ target_include_directories(M2-interpreter $ $ $ + $> # for libraries that the interpreter needs $ $ - $ $ $<$:$> PRIVATE From c0705230f052179714c19f2b90daf4bafc9839cb Mon Sep 17 00:00:00 2001 From: Jay Yang Date: Mon, 8 Dec 2025 11:57:50 -0600 Subject: [PATCH 206/691] Add a comment before the call to find_package(Eigen3 ...) and fix configuration issues when Eigen isn't installed --- M2/Macaulay2/d/CMakeLists.txt | 5 ++++- M2/cmake/check-libraries.cmake | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/CMakeLists.txt b/M2/Macaulay2/d/CMakeLists.txt index 76f674c9205..212c41b2394 100644 --- a/M2/Macaulay2/d/CMakeLists.txt +++ b/M2/Macaulay2/d/CMakeLists.txt @@ -166,7 +166,6 @@ target_include_directories(M2-interpreter $ $ $ - $> # for libraries that the interpreter needs $ $ @@ -194,6 +193,10 @@ foreach(LIB IN LISTS LIBRARIES_LIST) endif() endforeach() +if(TARGET Eigen3::Eigen) + target_include_directories(M2-interpreter PUBLIC $>) +endif() + foreach(LIB IN LISTS LIBRARY_LIST) if(${LIB}_FOUND) target_link_libraries(M2-interpreter PUBLIC ${${LIB}_LIBRARY}) diff --git a/M2/cmake/check-libraries.cmake b/M2/cmake/check-libraries.cmake index 0ba20b5f275..0459264281f 100644 --- a/M2/cmake/check-libraries.cmake +++ b/M2/cmake/check-libraries.cmake @@ -127,6 +127,10 @@ find_package(GMP 6.0.0 REQUIRED) # givaro prime field and algebraic computations (needs gmp) # fflas_ffpack Finite Field Linear Algebra Routines (needs gmp, givaro + LAPACK) +# Prior to 3.4.1, find_package for Eigen3 doesn't support version ranges +# but Ubuntu only has 3.4.0 right now, so we should support it +# For Eigen 5.0 and later, the way the version checking is setup, specifying +# a version of 3.4.0 or similar won't find version 5.0 find_package(Eigen3 3.4.0 PATHS ${M2_HOST_PREFIX}) if(NOT EIGEN3_FOUND) find_package(Eigen3 3.4.1...5.0 PATHS ${M2_HOST_PREFIX}) From 01a11fc09d6170b9d2d94a311921a1e23fe9d8b0 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sun, 14 Dec 2025 07:33:17 -0500 Subject: [PATCH 207/691] Don't install .gitignore files in package directories --- M2/Macaulay2/m2/installPackage.m2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/m2/installPackage.m2 b/M2/Macaulay2/m2/installPackage.m2 index 1a6066fadfc..539fe0e7c0a 100644 --- a/M2/Macaulay2/m2/installPackage.m2 +++ b/M2/Macaulay2/m2/installPackage.m2 @@ -719,7 +719,7 @@ installPackage Package := opts -> pkg -> ( verboseLog("copying auxiliary source files from ", auxiliaryFilesDirectory); makeDirectory(installPrefix | srcDirectory); copyDirectory(auxiliaryFilesDirectory, installPrefix | srcDirectory, - Exclude => {"^CVS$", "^\\.svn$", "Makefile"}, + Exclude => {"^CVS$", "^\\.svn$", "Makefile", "^\\.gitignore$"}, UpdateOnly => true, Verbose => opts.Verbose or debugLevel > 0)) else if pkgopts.AuxiliaryFiles From 9a5cab5f2ecef03792071eb773f84479af9b2dad Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 12 Dec 2025 06:58:00 -0500 Subject: [PATCH 208/691] Bump msolve to 0.9.4 [ci skip] --- M2/cmake/build-libraries.cmake | 4 ++-- M2/libraries/msolve/Makefile.in | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/M2/cmake/build-libraries.cmake b/M2/cmake/build-libraries.cmake index cdb32caa9a0..60477f014c2 100644 --- a/M2/cmake/build-libraries.cmake +++ b/M2/cmake/build-libraries.cmake @@ -486,8 +486,8 @@ endif() # https://github.com/algebraic-solving/msolve ExternalProject_Add(build-msolve - URL https://github.com/algebraic-solving/msolve/archive/refs/tags/v0.9.3.tar.gz - URL_HASH SHA256=2e46b88b38abbe4e4937ef5fc4a90a006d1ff933ffa7563287b5d756de3bcf6e + URL https://github.com/algebraic-solving/msolve/archive/refs/tags/v0.9.4.tar.gz + URL_HASH SHA256=02572df81596ff1d06b5d841e3fa7652f7d7976ef021c80728bcf0b08824e30c PREFIX libraries/msolve SOURCE_DIR libraries/msolve/build DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/BUILD/tarfiles diff --git a/M2/libraries/msolve/Makefile.in b/M2/libraries/msolve/Makefile.in index a44b80e956b..3844618048f 100644 --- a/M2/libraries/msolve/Makefile.in +++ b/M2/libraries/msolve/Makefile.in @@ -1,5 +1,5 @@ HOMEPAGE = https://msolve.lip6.fr/ -VERSION = 0.9.3 +VERSION = 0.9.4 URL = https://github.com/algebraic-solving/msolve/archive/refs/tags TARFILE = v$(VERSION).tar.gz LICENSEFILES = README.md COPYING From 90266abf8c5e20d4ca2fbf1a73353fcd439340b5 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sun, 14 Dec 2025 17:24:18 -0500 Subject: [PATCH 209/691] Replace deprecated xmlGcMemsetup with xmlMemSetup --- M2/Macaulay2/d/xml-c.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/xml-c.c b/M2/Macaulay2/d/xml-c.c index d2c780cdc83..4c79831e5d4 100644 --- a/M2/Macaulay2/d/xml-c.c +++ b/M2/Macaulay2/d/xml-c.c @@ -18,7 +18,10 @@ static char *copystring(const char *s) { static void initxml() __attribute__ ((constructor)); static void initxml() { - xmlGcMemSetup(freemem,(void *(*)(size_t))getmem,(void *(*)(size_t))getmem_atomic,(void *(*)(void *,size_t))getmoremem1,copystring); + xmlMemSetup((xmlFreeFunc) freemem, + (xmlMallocFunc) getmem, + (xmlReallocFunc) getmoremem1, + (xmlStrdupFunc) copystring); } From 22c324429f3dc4067ad466e29c6082f1d3389dea Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sun, 14 Dec 2025 17:24:36 -0500 Subject: [PATCH 210/691] Use xmlOutputBuffer instead of deprecated xmlBuffer Also make M2_stringn accept a constcharstar instead of a charstar to avoid compiler warnings. --- M2/Macaulay2/d/M2.d | 2 +- M2/Macaulay2/d/xml-c.c | 15 +++++++++++---- M2/Macaulay2/e/unit-tests/M2-replacement.c | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/M2/Macaulay2/d/M2.d b/M2/Macaulay2/d/M2.d index b916b65dff8..cc1b56a0626 100644 --- a/M2/Macaulay2/d/M2.d +++ b/M2/Macaulay2/d/M2.d @@ -54,7 +54,7 @@ export tocharstar(s:string):charstar := tocharstarn(s, length(s)); export tocharstarOrNull(s:string):charstarOrNull := ( if length(s) == 0 then charstarOrNull(null()) else charstarOrNull(tocharstar(s))); -export tostringn(s:charstar,n:int):string := Ccode(returns, " +export tostringn(s:constcharstar,n:int):string := Ccode(returns, " M2_string p = (M2_string)getmem_atomic(sizeofarray(p,n)); p->len = n; memcpy(p->array,s,n); diff --git a/M2/Macaulay2/d/xml-c.c b/M2/Macaulay2/d/xml-c.c index 4c79831e5d4..a32ca7e305c 100644 --- a/M2/Macaulay2/d/xml-c.c +++ b/M2/Macaulay2/d/xml-c.c @@ -70,10 +70,17 @@ xmlNode *xml_AddText(xmlNode *parent, M2_string content){ M2_string xml_toString(xmlNode *n) { M2_string s; - xmlBuffer *buf = xmlBufferCreate(); - int len = xmlNodeDump(buf,NULL,n,2,1); - s = M2_tostringn((char*)buf->content,len); - xmlBufferFree(buf); + xmlOutputBuffer *buf; + const xmlChar* content; + int len; + + buf = xmlAllocOutputBuffer(NULL); + xmlNodeDumpOutput(buf, n->doc, n, 2, 1, NULL); + content = xmlOutputBufferGetContent(buf); + len = xmlOutputBufferGetSize(buf); + s = M2_tostringn((const char *)content, len); + xmlOutputBufferClose(buf); + return s; } diff --git a/M2/Macaulay2/e/unit-tests/M2-replacement.c b/M2/Macaulay2/e/unit-tests/M2-replacement.c index 6c612c9a661..3d997808f44 100644 --- a/M2/Macaulay2/e/unit-tests/M2-replacement.c +++ b/M2/Macaulay2/e/unit-tests/M2-replacement.c @@ -39,7 +39,7 @@ M2_string M2_tostring(M2_constcharstarOrNull s) //GC_CHECK_CLOBBER(p); return p; } -M2_string M2_tostringn(char *s, int n) +M2_string M2_tostringn(const char *s, int n) { M2_string p = (M2_string)getmem_atomic(sizeofarray(p,n)); p->len = n; From e6c5824e552e68695e8f7f00ffe9feff24aa0a78 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 15 Dec 2025 13:15:46 -0500 Subject: [PATCH 211/691] Preserve grading when calling midpoint(Matrix), etc. --- M2/Macaulay2/m2/matrix.m2 | 27 ++++++++++++++----- .../packages/Macaulay2Doc/doc_intervals.m2 | 3 ++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/M2/Macaulay2/m2/matrix.m2 b/M2/Macaulay2/m2/matrix.m2 index ca2ce3e97d2..e9041febca1 100644 --- a/M2/Macaulay2/m2/matrix.m2 +++ b/M2/Macaulay2/m2/matrix.m2 @@ -781,13 +781,26 @@ leadComponent = method() leadComponent Matrix := List => m -> nonnull for c to numColumns m - 1 list position(numRows m, r -> m_(r,c) != 0, Reverse => true) leadComponent Vector := ZZ => v -> try first leadComponent matrix v else null -midpoint Matrix := f -> matrix apply(entries f, row -> midpoint \ row) -left Matrix := f -> matrix apply(entries f, row -> left \ row) -right Matrix := f -> matrix apply(entries f, row -> right \ row) -lowerLeft Matrix := f -> matrix apply(entries f, row -> lowerLeft \ row) -lowerRight Matrix := f -> matrix apply(entries f, row -> lowerRight \ row) -upperLeft Matrix := f -> matrix apply(entries f, row -> upperLeft \ row) -upperRight Matrix := f -> matrix apply(entries f, row -> upperRight \ row) +midpoint Module := M -> M.cache.midpoint ??= ( + R := midpoint ring M; + if R === ring M then M + else ( + if not isFreeModule M then error "expected a free module"; + R^(-degrees M))) + +intervalMatrixHelper := (func, f) -> ( + M := midpoint target f; + N := midpoint source f; + if M === target f and N === source f then f + else map(M, N, apply(entries f, row -> func \ row))) + +midpoint Matrix := f -> intervalMatrixHelper(midpoint, f) +left Matrix := f -> intervalMatrixHelper(left, f) +right Matrix := f -> intervalMatrixHelper(right, f) +lowerLeft Matrix := f -> intervalMatrixHelper(lowerLeft, f) +lowerRight Matrix := f -> intervalMatrixHelper(lowerRight, f) +upperLeft Matrix := f -> intervalMatrixHelper(upperLeft, f) +upperRight Matrix := f -> intervalMatrixHelper(upperRight, f) -- Local Variables: -- compile-command: "make -C $M2BUILDDIR/Macaulay2/m2 " diff --git a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 index b0d12e8a1e3..2bdc4d44efc 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/doc_intervals.m2 @@ -53,7 +53,8 @@ SeeAlso /// -- helper methods not intended to be called by the user -undocumented {(midpoint, Ring), (midpoint, PolynomialRing)} +undocumented {(midpoint, Ring), (midpoint, PolynomialRing), + (midpoint, QuotientRing), (midpoint, Module)} doc /// Key From ea2cc0b7a406cc8af772733f5ba55e1211563463 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 15 Dec 2025 18:51:25 -0500 Subject: [PATCH 212/691] Add random(RRi) --- M2/Macaulay2/d/interface.dd | 6 ++++++ M2/Macaulay2/e/aring-RRi.hpp | 9 +-------- M2/Macaulay2/e/interface/random.cpp | 24 ++++++++++++++++++++++++ M2/Macaulay2/e/interface/random.h | 5 +++++ M2/Macaulay2/m2/reals.m2 | 1 + 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/M2/Macaulay2/d/interface.dd b/M2/Macaulay2/d/interface.dd index ba5a4761b23..6138311bb79 100644 --- a/M2/Macaulay2/d/interface.dd +++ b/M2/Macaulay2/d/interface.dd @@ -87,6 +87,12 @@ export rawRandomCC(e:Expr):Expr := ( else toExpr(Ccode(CC, "rawRandomCC(", toULong(prec.v), ")")) else WrongArgZZ()); setupfun("rawRandomCC",rawRandomCC); +export rawRandomRRi(e:Expr):Expr := ( + when e + is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallUInteger() + else toExpr(Ccode(RRi, "rawRandomRRi(", toULong(prec.v), ")")) + else WrongArgZZ()); +setupfun("rawRandomRRi", rawRandomRRi); ----------------------------------------------------------------------------- -- monomials diff --git a/M2/Macaulay2/e/aring-RRi.hpp b/M2/Macaulay2/e/aring-RRi.hpp index 7cf4b79f0d2..76cfdab0c2f 100644 --- a/M2/Macaulay2/e/aring-RRi.hpp +++ b/M2/Macaulay2/e/aring-RRi.hpp @@ -327,14 +327,7 @@ class ARingRRi : public SimpleARing /* rewrite this (in rand.cpp or just copy over?) */ void random(ElementType &result) const // redo? { - mpfr_t val; - mpfr_init2(val, mPrecision); - randomMpfr(val); - mpfi_set_fr(&result,val); - - randomMpfr(val); - mpfi_put_fr(&result,val); - mpfr_clear(val); + rawSetRandomRRi(&result); } /* Needs to be redone. */ diff --git a/M2/Macaulay2/e/interface/random.cpp b/M2/Macaulay2/e/interface/random.cpp index 6a12c64611f..ea84700ed47 100644 --- a/M2/Macaulay2/e/interface/random.cpp +++ b/M2/Macaulay2/e/interface/random.cpp @@ -255,6 +255,30 @@ double randomDouble() return result; } +void rawSetRandomRRi(mpfi_ptr result) +{ + mpfr_t val; + + mpfr_init2(val, mpfi_get_prec(result)); + randomMpfr(val); + mpfi_set_fr(result,val); + randomMpfr(val); + mpfi_put_fr(result,val); + mpfr_clear(val); +} + +gmp_RRi rawRandomRRi(unsigned long precision) +{ + mpfi_ptr result; + + result = getmemstructtype(mpfi_ptr); + mpfi_init2(result, precision); + rawSetRandomRRi(result); + + return moveTo_gmpRRi(result); +} + + int system_randomint() { #if 0 diff --git a/M2/Macaulay2/e/interface/random.h b/M2/Macaulay2/e/interface/random.h index 11d8fd02ab4..c683ac19167 100644 --- a/M2/Macaulay2/e/interface/random.h +++ b/M2/Macaulay2/e/interface/random.h @@ -58,6 +58,11 @@ gmp_CC rawRandomCC(unsigned long prec); void randomMpfr(mpfr_t result); +gmp_RRi rawRandomRRi(unsigned long prec); +void rawSetRandomRRi(mpfi_ptr result); +/* returns an interval with the given precision containing two random + * variates from the uniform distribution on [0, 1] */ + double randomDouble(); int system_randomint(); diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index a74aa26ffbd..d5bb0f10785 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -322,6 +322,7 @@ random RR := RR => opts -> x -> x * rawRandomRRUniform precision x random(RR,RR) := opts -> (x,y) -> x + random(y-x) RR'.random = opts -> R -> rawRandomRRUniform R.precision CC'.random = opts -> C -> rawRandomCC C.precision +RRi'.random = opts -> R -> rawRandomRRi R.precision random RingFamily := opts -> R -> random(default R,opts) random QQ := QQ => opts -> x -> rawFareyApproximation( From 354c3de93de9ae522f7345720d7fd260d7563fe6 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Mon, 15 Dec 2025 22:16:11 -0500 Subject: [PATCH 213/691] Add random(CCi) --- M2/Macaulay2/d/interface.dd | 6 ++++++ M2/Macaulay2/e/interface/random.cpp | 8 ++++++++ M2/Macaulay2/e/interface/random.h | 5 +++++ M2/Macaulay2/m2/reals.m2 | 1 + 4 files changed, 20 insertions(+) diff --git a/M2/Macaulay2/d/interface.dd b/M2/Macaulay2/d/interface.dd index 6138311bb79..d76a6512b9d 100644 --- a/M2/Macaulay2/d/interface.dd +++ b/M2/Macaulay2/d/interface.dd @@ -93,6 +93,12 @@ export rawRandomRRi(e:Expr):Expr := ( else toExpr(Ccode(RRi, "rawRandomRRi(", toULong(prec.v), ")")) else WrongArgZZ()); setupfun("rawRandomRRi", rawRandomRRi); +export rawRandomCCi(e:Expr):Expr := ( + when e + is prec:ZZcell do if !isULong(prec.v) then WrongArgSmallUInteger() + else toExpr(Ccode(CCi, "rawRandomCCi(", toULong(prec.v), ")")) + else WrongArgZZ()); +setupfun("rawRandomCCi", rawRandomCCi); ----------------------------------------------------------------------------- -- monomials diff --git a/M2/Macaulay2/e/interface/random.cpp b/M2/Macaulay2/e/interface/random.cpp index ea84700ed47..c0620c1cf87 100644 --- a/M2/Macaulay2/e/interface/random.cpp +++ b/M2/Macaulay2/e/interface/random.cpp @@ -278,6 +278,14 @@ gmp_RRi rawRandomRRi(unsigned long precision) return moveTo_gmpRRi(result); } +gmp_CCi rawRandomCCi(unsigned long precision) +{ + gmp_CCimutable result = getmemstructtype(gmp_CCimutable); + result->re = const_cast(rawRandomRRi(precision)); + result->im = const_cast(rawRandomRRi(precision)); + return reinterpret_cast(result); +} + int system_randomint() { diff --git a/M2/Macaulay2/e/interface/random.h b/M2/Macaulay2/e/interface/random.h index c683ac19167..bf862070c6b 100644 --- a/M2/Macaulay2/e/interface/random.h +++ b/M2/Macaulay2/e/interface/random.h @@ -63,6 +63,11 @@ void rawSetRandomRRi(mpfi_ptr result); /* returns an interval with the given precision containing two random * variates from the uniform distribution on [0, 1] */ +gmp_CCi rawRandomCCi(unsigned long prec); +/* returns a complex interval with the given precision whose real and imaginary + * parts each contain two random variates from the uniform distribution on + * [0, 1] */ + double randomDouble(); int system_randomint(); diff --git a/M2/Macaulay2/m2/reals.m2 b/M2/Macaulay2/m2/reals.m2 index d5bb0f10785..c2b8721699a 100644 --- a/M2/Macaulay2/m2/reals.m2 +++ b/M2/Macaulay2/m2/reals.m2 @@ -323,6 +323,7 @@ random(RR,RR) := opts -> (x,y) -> x + random(y-x) RR'.random = opts -> R -> rawRandomRRUniform R.precision CC'.random = opts -> C -> rawRandomCC C.precision RRi'.random = opts -> R -> rawRandomRRi R.precision +CCi'.random = opts -> C -> rawRandomCCi C.precision random RingFamily := opts -> R -> random(default R,opts) random QQ := QQ => opts -> x -> rawFareyApproximation( From 753165fbdaf9f2086f34ec0c97f98b1150f854ad Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sun, 21 Dec 2025 13:58:05 -0500 Subject: [PATCH 214/691] Fix robust printing of subclasses of String Both "net" (which calls "separate") and "format" were broken because the associated compiled functions didn't deal with the SpecialExpr case, which is what we have when String is subclassed. --- M2/Macaulay2/d/actors4.d | 1 + M2/Macaulay2/d/regex.dd | 2 ++ M2/Macaulay2/tests/normal/strings.m2 | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/M2/Macaulay2/d/actors4.d b/M2/Macaulay2/d/actors4.d index 15a7fcc38bb..ebb9f806d74 100644 --- a/M2/Macaulay2/d/actors4.d +++ b/M2/Macaulay2/d/actors4.d @@ -1095,6 +1095,7 @@ setupfun("connectionCount", connectionCount); format(e:Expr):Expr := ( when e is s:stringCell do toExpr("\"" + present(s.v) + "\"") + is s:SpecialExpr do format(s.e) is ZZcell do e is QQcell do e is RRcell do format(Expr(Sequence(e))) diff --git a/M2/Macaulay2/d/regex.dd b/M2/Macaulay2/d/regex.dd index 7cb553f1ed5..be118f1e7e4 100644 --- a/M2/Macaulay2/d/regex.dd +++ b/M2/Macaulay2/d/regex.dd @@ -230,6 +230,8 @@ regexSeparate(e:Expr):Expr := ( toExpr(r)) else WrongArgZZ(4) else WrongArgZZ(3) + -- for subclasses of string + is text:SpecialExpr do regexSeparate(Expr(Sequence(s.0, text.e, s.2, s.3))) else WrongArgString(2) else WrongArgString(1)) else WrongNumArgs(1,4)) diff --git a/M2/Macaulay2/tests/normal/strings.m2 b/M2/Macaulay2/tests/normal/strings.m2 index a11ed638bb4..dcafaa6c874 100644 --- a/M2/Macaulay2/tests/normal/strings.m2 +++ b/M2/Macaulay2/tests/normal/strings.m2 @@ -84,3 +84,8 @@ assert Equation(format(ascii(0..31) | "\"\\"), ///"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r/// | ///\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017/// | ///\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f\"\\"///) + +-- subclasses (issue #4069) +T = new SelfInitializingType of String +assert Equation(net T "foo", "foo") +assert Equation(format T "foo", "\"foo\"") From b9c73893a1d17aacbc977b01c46d051c827f27d8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 1 Jan 2026 11:01:38 -0500 Subject: [PATCH 215/691] Bump latest copyright year to 2026 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 798fa431584..5b162fcdeea 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ determined by `check`, in the latest version of Macaulay2. ### Copyright -Copyright (C) 1993-2025 [The Macaulay2 Authors]( +Copyright (C) 1993-2026 [The Macaulay2 Authors]( https://github.com/Macaulay2/M2/wiki/The-Macaulay2-Authors) This program is free software; you can redistribute it and/or modify From af8fa1fbc0dbea03f4b58944cc786c0c3c6bb8d4 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Thu, 1 Jan 2026 11:02:59 -0500 Subject: [PATCH 216/691] Update FSF address in README Physical address no longer exists. [ci skip] --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 5b162fcdeea..26e953b5924 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +with this program; if not, see https://www.gnu.org/licenses/. Macaulay2 binaries are licensed under GPL-3.0 due to linking with LGPL-3.0 libraries (FLINT, MPFR). See https://www.gnu.org/licenses/gpl-faq.html#AllCompatibility From bbdb8e6f6b65d60b1aadb21814cd6aad6ddb39f8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 19 Dec 2025 09:08:18 -0500 Subject: [PATCH 217/691] Update three.js in Visualize package to 0.182.0 Big change is Geometry -> BufferGeometry and CubeGeometry -> BoxGeometry. --- M2/Macaulay2/packages/Visualize.m2 | 7 +- .../fa-solid-900.0ae4e6254fc19607c79e.woff2 | Bin 113260 -> 0 bytes .../fa-solid-900.8ae0d37556ff1e685de2.woff2 | Bin 0 -> 113152 bytes .../packages/Visualize/js/visCommon.js | 2 +- .../packages/Visualize/js/visDigraph2d.js | 2 +- .../packages/Visualize/js/visGraph2d.js | 2 +- .../packages/Visualize/js/visIdeal2d.js | 2 +- .../packages/Visualize/js/visIdeal3d.js | 2 +- .../Visualize/js/visIdeal3d.js.LICENSE.txt | 6 +- .../packages/Visualize/js/visPoset.js | 2 +- .../Visualize/js/visSimplicialComplex2d.js | 2 +- .../packages/Visualize/package-lock.json | 1881 +++++++++++++++++ M2/Macaulay2/packages/Visualize/package.json | 2 +- .../packages/Visualize/src/visIdeal3d.js | 46 +- 14 files changed, 1911 insertions(+), 45 deletions(-) delete mode 100644 M2/Macaulay2/packages/Visualize/fonts/fa-solid-900.0ae4e6254fc19607c79e.woff2 create mode 100644 M2/Macaulay2/packages/Visualize/fonts/fa-solid-900.8ae0d37556ff1e685de2.woff2 create mode 100644 M2/Macaulay2/packages/Visualize/package-lock.json diff --git a/M2/Macaulay2/packages/Visualize.m2 b/M2/Macaulay2/packages/Visualize.m2 index b95e57fa985..4539e27d180 100644 --- a/M2/Macaulay2/packages/Visualize.m2 +++ b/M2/Macaulay2/packages/Visualize.m2 @@ -18,8 +18,8 @@ newPackage( "Visualize", - Version => "1.8", - Date => "October 27, 2025", + Version => "1.9", + Date => "December 19, 2025", Authors => { {Name => "Brett Barwick", Email => "bbarwick@uscupstate.edu", HomePage => "http://faculty.uscupstate.edu/bbarwick/"}, {Name => "Thomas Enkosky", Email => "tomenk@bu.edu", HomePage => "http://math.bu.edu/people/tomenk/"}, @@ -68,6 +68,9 @@ export { -* +1.9 (2025-12-19, M2 1.26.05) +* bump three.js to 0.182.0 and update 3d ideal code + 1.8 (2025-10-27, M2 1.25.11) * use webpack to bundle most of the javascript libraries * bootstrap 3 -> bootstrap 5 diff --git a/M2/Macaulay2/packages/Visualize/fonts/fa-solid-900.0ae4e6254fc19607c79e.woff2 b/M2/Macaulay2/packages/Visualize/fonts/fa-solid-900.0ae4e6254fc19607c79e.woff2 deleted file mode 100644 index a8ec7c0680996df85f267015288695fa04218fc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113260 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

;chMGNtQX7BwzxTo9ZPoT_>&Uj+b8J` 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

{})IQs7PWypp>^u_v9 z*x}57xJw65ZWm)lz~m(Wa8}6jzw$uwC1dT2lz*N^M(+CitiupOx3Dz~&Dr@usd;A% zlWLAUrvt34q_L;uWf{HdJ6)w`UZEu7g@a8cJ(XwJ%gR| zyORyy%qdfP|>!T^^mP4WZ{3E*CG zedKw*Z&}8%T+^E7SvZ$z4L+2c&&7HI4&@m-{8Mc1lNld7jtUuimKRZy9+r{Lrx^}!WzwQX{>g_fOkS@BofB1eT*FmTLME23@ zq@x(52d5%-;@+>Gdq$@ibhvSt5}pyOiMq}sbp?N`9}J4}94(4h`ej0Rkf3(YRmtA^ z)%?s);w%qGZ3HN}GyGw0bv$26&QYV#3_5HR z;q-~6cfgSbIJd&<45?E%HAbflP^I8X59c{La+tzl*+mt$sd$5zE8WE`x;PS8E{`vW zRpmyPTwcSfBY1rl%u|T*Xlx9HkH}l<;v3fUWT;usNjY|W$BPQdPLHUQPeC|NKd_Tp zCVItc0yp<)J!2F7QvO;_>Jn>lM}gHVBLLOw>P+9I}z6D;zoOPx9hOZq+&NEVYD^Wzw>IQKEq%= zue2gL8UjA4Z*a9PgHs1uTd?P{E4~4y%vE~=P%`^4D1I0}O?TqZ!f!7AKox~AT?suo zaZUZQ@`W#e5C~s>q!0hW#Wce=Zg$H9<64^e8#>cq8Fh}>nu8Ryc5)a}+aL(!y8U_r zauC-jIEFp%E+MWXf5KcQSzCaaqDdlNyZ(~L#aE-gJfA$!ddipC~SPS;HQjX_=wzgF05U>tg9aZ>8Guyz^z)$whlIjHnA}qN~MKJ4h-Dg7Ny8R118vmy%Pv%Mq(+D z8^%BC*?qHH9`G&c9}VrwnRn9*)(II4D13%>`$sOx>cX3m5`6iUK~UmxFzpJrUyZ>tZ3jHY zOy${Y-ei#+Yc1^Im-dd3&e-~#3%-<*L7%2T{!m({C0Sc5vAkyILh+A&!)oW&;LRV{ z_~eN$stVqE0AA~;i{pGl745n97RLppDUwvF zH0i!nZ*S4Bt-fJj&yZ$?gSrgz?BT;a4oaX+%?c3x)kLRK9saXviFjvRVZncYaQ zdGaLzNWZ!(y<4xe?(%5Yx%py~v0WtJ$|9pXY~6%H2_@=ns1ftG(xwiQ@8HX1@n0Mf zo+dIu7DpGDbUGCk-O-_Qk}O=GVrKmH+Jy=EdAz#U=XZVWsT9kjM0W}c8Qlq)KxO6p z!a#333vO0;diRwBUgu8>)|5DjL|6;h`;ScOD4>2&L8!P+9y(D#Gg%0DJ!II7O(Spz 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 literal 0 HcmV?d00001 diff --git a/M2/Macaulay2/packages/Visualize/js/visCommon.js b/M2/Macaulay2/packages/Visualize/js/visCommon.js index 85ed808f17f..60e3cabeb5a 100644 --- a/M2/Macaulay2/packages/Visualize/js/visCommon.js +++ b/M2/Macaulay2/packages/Visualize/js/visCommon.js @@ -1,2 +1,2 @@ /*! For license information please see visCommon.js.LICENSE.txt */ -(()=>{var n={311:n=>{"use strict";n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27none%27 stroke=%27%23212529%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3e%3cpath d=%27m2 5 6 6 6-6%27/%3e%3c/svg%3e"},540:n=>{"use strict";n.exports=function(n){var t=document.createElement("style");return n.setAttributes(t,n.attributes),n.insert(t,n.options),t}},644:n=>{"use strict";n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%23fff%27%3e%3cpath d=%27M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0%27/%3e%3c/svg%3e"},750:(n,t,e)=>{var r=e(3124),a=e(4160);void 0===a.noUiSlider&&(a.noUiSlider=r),n.exports=r},1113:n=>{"use strict";n.exports=function(n,t){if(t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}},1261:(n,t,e)=>{"use strict";e.d(t,{A:()=>Y});var r=e(1601),a=e.n(r),o=e(6314),i=e.n(o),s=e(4417),l=e.n(s),f=new URL(e(5531),e.b),d=new URL(e(7115),e.b),c=new URL(e(5419),e.b),p=new URL(e(3385),e.b),b=new URL(e(4274),e.b),m=new URL(e(7154),e.b),g=new URL(e(5782),e.b),u=new URL(e(4718),e.b),h=new URL(e(8734),e.b),v=new URL(e(8661),e.b),x=new URL(e(5372),e.b),w=new URL(e(2247),e.b),y=new URL(e(6366),e.b),k=new URL(e(311),e.b),z=new URL(e(1451),e.b),S=new URL(e(4914),e.b),j=new URL(e(5967),e.b),A=new URL(e(644),e.b),E=new URL(e(1368),e.b),C=i()(a()),T=l()(f),N=l()(d),D=l()(c),q=l()(p),L=l()(b),P=l()(m),R=l()(g),U=l()(u),M=l()(h),O=l()(v),_=l()(x),B=l()(w),F=l()(y),H=l()(k),$=l()(z),I=l()(S),V=l()(j),G=l()(A),W=l()(E);C.push([n.id,`@charset "UTF-8";/*!\n * Bootstrap v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;line-height:inherit;font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale(1)}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-weight:300;line-height:1.2;font-size:calc(1.625rem + 4.5vw)}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-weight:300;line-height:1.2;font-size:calc(1.575rem + 3.9vw)}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-weight:300;line-height:1.2;font-size:calc(1.525rem + 3.3vw)}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-weight:300;line-height:1.2;font-size:calc(1.475rem + 2.7vw)}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-weight:300;line-height:1.2;font-size:calc(1.425rem + 2.1vw)}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-weight:300;line-height:1.2;font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url(${T});display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url(${N})}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url(${D})}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url(${q})}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url(${L})}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url(${P});width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url(${R})}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url(${U})}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url(${M})}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;max-width:100%;height:100%;padding:1rem .75rem;overflow:hidden;color:rgba(var(--bs-body-color-rgb),.65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem;padding-left:.75rem}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>textarea:focus~label::after,.form-floating>textarea:not(:placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>textarea:disabled~label::after{background-color:var(--bs-secondary-bg)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(-1 * var(--bs-border-width));border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url(${O});background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url(${O});padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url(${_});background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url(${_});padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(-1 * var(--bs-border-width))}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(-1 * var(--bs-border-width))}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-grow:1;flex-basis:0;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url(${B});--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url(${F})}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url(${F})}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)>.card-header,.card-group>.card:not(:last-child)>.card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child)>.card-footer,.card-group>.card:not(:last-child)>.card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)>.card-header,.card-group>.card:not(:first-child)>.card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child)>.card-footer,.card-group>.card:not(:first-child)>.card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url(${H});--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url(${$});--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url(${I});--bs-accordion-btn-active-icon:url(${I})}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):focus,.list-group-item-action:not(.active):hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:not(.active):active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url(${V});--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;filter:var(--bs-btn-close-filter);border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}:root,[data-bs-theme=light]{--bs-btn-close-filter: }[data-bs-theme=dark]{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color:var(--bs-body-color);--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transform:translate(0,-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--bs-modal-header-padding-y));margin-right:calc(-.5 * var(--bs-modal-header-padding-x));margin-bottom:calc(-.5 * var(--bs-modal-header-padding-y));margin-left:auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;filter:var(--bs-carousel-control-icon-filter);border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url(${G})}.carousel-control-next-icon{background-image:url(${W})}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:var(--bs-carousel-indicator-active-bg);background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:var(--bs-carousel-caption-color);text-align:center}.carousel-dark{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}:root,[data-bs-theme=light]{--bs-carousel-indicator-active-bg:#fff;--bs-carousel-caption-color:#fff;--bs-carousel-control-icon-filter: }[data-bs-theme=dark]{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}.spinner-border,.spinner-grow{display:inline-block;flex-shrink:0;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}`,""]);const Y=C},1368:n=>{"use strict";n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%23fff%27%3e%3cpath d=%27M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708%27/%3e%3c/svg%3e"},1451:n=>{"use strict";n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27none%27 stroke=%27%23052c65%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3e%3cpath d=%27m2 5 6 6 6-6%27/%3e%3c/svg%3e"},1601:n=>{"use strict";n.exports=function(n){return n[1]}},2105:function(n,t,e){n.exports=function(n,t){"use strict";return class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(n){return n=this._mergeConfigObj(n),n=this._configAfterMerge(n),this._typeCheckConfig(n),n}_configAfterMerge(n){return n}_mergeConfigObj(e,r){const a=t.isElement(r)?n.getDataAttribute(r,"config"):{};return{...this.constructor.Default,..."object"==typeof a?a:{},...t.isElement(r)?n.getDataAttributes(r):{},..."object"==typeof e?e:{}}}_typeCheckConfig(n,e=this.constructor.DefaultType){for(const[r,a]of Object.entries(e)){const e=n[r],o=t.isElement(e)?"element":t.toType(e);if(!new RegExp(a).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${r}" provided type "${o}" but expected type "${a}".`)}}}}(e(2333),e(4035))},2247:n=>{"use strict";n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 30 30%27%3e%3cpath stroke=%27rgba%2833, 37, 41, 0.75%29%27 stroke-linecap=%27round%27 stroke-miterlimit=%2710%27 stroke-width=%272%27 d=%27M4 7h22M4 15h22M4 23h22%27/%3e%3c/svg%3e"},2333:function(n){n.exports=function(){"use strict";function n(n){if("true"===n)return!0;if("false"===n)return!1;if(n===Number(n).toString())return Number(n);if(""===n||"null"===n)return null;if("string"!=typeof n)return n;try{return JSON.parse(decodeURIComponent(n))}catch(t){return n}}function t(n){return n.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}return{setDataAttribute(n,e,r){n.setAttribute(`data-bs-${t(e)}`,r)},removeDataAttribute(n,e){n.removeAttribute(`data-bs-${t(e)}`)},getDataAttributes(t){if(!t)return{};const e={},r=Object.keys(t.dataset).filter(n=>n.startsWith("bs")&&!n.startsWith("bsConfig"));for(const a of r){let r=a.replace(/^bs/,"");r=r.charAt(0).toLowerCase()+r.slice(1),e[r]=n(t.dataset[a])}return e},getDataAttribute:(e,r)=>n(e.getAttribute(`data-bs-${t(r)}`))}}()},2685:(n,t,e)=>{"use strict";e.d(t,{A:()=>p});var r=e(1601),a=e.n(r),o=e(6314),i=e.n(o),s=e(4417),l=e.n(s),f=new URL(e(3369),e.b),d=i()(a()),c=l()(f);d.push([n.id,`/*!\n * Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2025 Fonticons, Inc.\n */\n:root, :host {\n --fa-family-classic: "Font Awesome 7 Free";\n --fa-font-solid: normal 900 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url(${c});\n}\n.fas {\n --fa-family: var(--fa-family-classic);\n --fa-style: 900;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-solid {\n --fa-style: 900;\n}`,""]);const p=d},3124:function(n,t){!function(n){"use strict";function t(n){return"object"==typeof n&&"function"==typeof n.to}function e(n){n.parentElement.removeChild(n)}function r(n){return null!=n}function a(n){n.preventDefault()}function o(n){return"number"==typeof n&&!isNaN(n)&&isFinite(n)}function i(n,t,e){e>0&&(d(n,t),setTimeout(function(){c(n,t)},e))}function s(n){return Math.max(Math.min(n,100),0)}function l(n){return Array.isArray(n)?n:[n]}function f(n){var t=(n=String(n)).split(".");return t.length>1?t[1].length:0}function d(n,t){n.classList&&!/\s/.test(t)?n.classList.add(t):n.className+=" "+t}function c(n,t){n.classList&&!/\s/.test(t)?n.classList.remove(t):n.className=n.className.replace(new RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," ")}function p(n){var t=void 0!==window.pageXOffset,e="CSS1Compat"===(n.compatMode||"");return{x:t?window.pageXOffset:e?n.documentElement.scrollLeft:n.body.scrollLeft,y:t?window.pageYOffset:e?n.documentElement.scrollTop:n.body.scrollTop}}function b(n,t){return 100/(t-n)}function m(n,t,e){return 100*t/(n[e+1]-n[e])}function g(n,t){for(var e=1;n>=t[e];)e+=1;return e}function u(n,t,e){if(e>=n.slice(-1)[0])return 100;var r=g(e,n),a=n[r-1],o=n[r],i=t[r-1],s=t[r];return i+function(n,t){return m(n,n[0]<0?t+Math.abs(n[0]):t-n[0],0)}([a,o],e)/b(i,s)}function h(n,t,e,r){if(100===r)return r;var a=g(r,n),o=n[a-1],i=n[a];return e?r-o>(i-o)/2?i:o:t[a-1]?n[a-1]+function(n,t){return Math.round(n/t)*t}(r-n[a-1],t[a-1]):r}var v,x;n.PipsMode=void 0,(x=n.PipsMode||(n.PipsMode={})).Range="range",x.Steps="steps",x.Positions="positions",x.Count="count",x.Values="values",n.PipsType=void 0,(v=n.PipsType||(n.PipsType={}))[v.None=-1]="None",v[v.NoValue=0]="NoValue",v[v.LargeValue=1]="LargeValue",v[v.SmallValue=2]="SmallValue";var w=function(){function n(n,t,e){var r;this.xPct=[],this.xVal=[],this.xSteps=[],this.xNumSteps=[],this.xHighestCompleteStep=[],this.xSteps=[e||!1],this.xNumSteps=[!1],this.snap=t;var a=[];for(Object.keys(n).forEach(function(t){a.push([l(n[t]),t])}),a.sort(function(n,t){return n[0][0]-t[0][0]}),r=0;rthis.xPct[a+1];)a++;else n===this.xPct[this.xPct.length-1]&&(a=this.xPct.length-2);e||n!==this.xPct[a+1]||a++,null===t&&(t=[]);var o=1,i=t[a],s=0,l=0,f=0,d=0;for(r=e?(n-this.xPct[a])/(this.xPct[a+1]-this.xPct[a]):(this.xPct[a+1]-n)/(this.xPct[a+1]-this.xPct[a]);i>0;)s=this.xPct[a+1+d]-this.xPct[a+d],t[a+d]*o+100-100*r>100?(l=s*r,o=(i-100*r)/t[a+d],r=1):(l=t[a+d]*s/100*o,o=0),e?(f-=l,this.xPct.length+d>=1&&d--):(f+=l,this.xPct.length-d>=1&&d++),i=t[a+d]*o;return n+f},n.prototype.toStepping=function(n){return u(this.xVal,this.xPct,n)},n.prototype.fromStepping=function(n){return function(n,t,e){if(e>=100)return n.slice(-1)[0];var r=g(e,t),a=n[r-1],o=n[r],i=t[r-1];return function(n,t){return t*(n[1]-n[0])/100+n[0]}([a,o],(e-i)*b(i,t[r]))}(this.xVal,this.xPct,n)},n.prototype.getStep=function(n){return h(this.xPct,this.xSteps,this.snap,n)},n.prototype.getDefaultStep=function(n,t,e){var r=g(n,this.xPct);return(100===n||t&&n===this.xPct[r-1])&&(r=Math.max(r-1,1)),(this.xVal[r]-this.xVal[r-1])/e},n.prototype.getNearbySteps=function(n){var t=g(n,this.xPct);return{stepBefore:{startValue:this.xVal[t-2],step:this.xNumSteps[t-2],highestStep:this.xHighestCompleteStep[t-2]},thisStep:{startValue:this.xVal[t-1],step:this.xNumSteps[t-1],highestStep:this.xHighestCompleteStep[t-1]},stepAfter:{startValue:this.xVal[t],step:this.xNumSteps[t],highestStep:this.xHighestCompleteStep[t]}}},n.prototype.countStepDecimals=function(){var n=this.xNumSteps.map(f);return Math.max.apply(null,n)},n.prototype.hasNoSize=function(){return this.xVal[0]===this.xVal[this.xVal.length-1]},n.prototype.convert=function(n){return this.getStep(this.toStepping(n))},n.prototype.handleEntryPoint=function(n,t){var e;if(!o(e="min"===n?0:"max"===n?100:parseFloat(n))||!o(t[0]))throw new Error("noUiSlider: 'range' value isn't numeric.");this.xPct.push(e),this.xVal.push(t[0]);var r=Number(t[1]);e?this.xSteps.push(!isNaN(r)&&r):isNaN(r)||(this.xSteps[0]=r),this.xHighestCompleteStep.push(0)},n.prototype.handleStepPoint=function(n,t){if(t)if(this.xVal[n]!==this.xVal[n+1]){this.xSteps[n]=m([this.xVal[n],this.xVal[n+1]],t,0)/b(this.xPct[n],this.xPct[n+1]);var e=(this.xVal[n+1]-this.xVal[n])/this.xNumSteps[n],r=Math.ceil(Number(e.toFixed(3))-1),a=this.xVal[n]+this.xNumSteps[n]*r;this.xHighestCompleteStep[n]=a}else this.xSteps[n]=this.xHighestCompleteStep[n]=this.xVal[n]},n}(),y={to:function(n){return void 0===n?"":n.toFixed(2)},from:Number},k={target:"target",base:"base",origin:"origin",handle:"handle",handleLower:"handle-lower",handleUpper:"handle-upper",touchArea:"touch-area",horizontal:"horizontal",vertical:"vertical",background:"background",connect:"connect",connects:"connects",ltr:"ltr",rtl:"rtl",textDirectionLtr:"txt-dir-ltr",textDirectionRtl:"txt-dir-rtl",draggable:"draggable",drag:"state-drag",tap:"state-tap",active:"active",tooltip:"tooltip",pips:"pips",pipsHorizontal:"pips-horizontal",pipsVertical:"pips-vertical",marker:"marker",markerHorizontal:"marker-horizontal",markerVertical:"marker-vertical",markerNormal:"marker-normal",markerLarge:"marker-large",markerSub:"marker-sub",value:"value",valueHorizontal:"value-horizontal",valueVertical:"value-vertical",valueNormal:"value-normal",valueLarge:"value-large",valueSub:"value-sub"},z=".__tooltips",S=".__aria";function j(n,t){if(!o(t))throw new Error("noUiSlider: 'step' is not numeric.");n.singleStep=t}function A(n,t){if(!o(t))throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");n.keyboardPageMultiplier=t}function E(n,t){if(!o(t))throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");n.keyboardMultiplier=t}function C(n,t){if(!o(t))throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");n.keyboardDefaultStep=t}function T(n,t){if("object"!=typeof t||Array.isArray(t))throw new Error("noUiSlider: 'range' is not an object.");if(void 0===t.min||void 0===t.max)throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");n.spectrum=new w(t,n.snap||!1,n.singleStep)}function N(n,t){if(t=l(t),!Array.isArray(t)||!t.length)throw new Error("noUiSlider: 'start' option is incorrect.");n.handles=t.length,n.start=t}function D(n,t){if("boolean"!=typeof t)throw new Error("noUiSlider: 'snap' option must be a boolean.");n.snap=t}function q(n,t){if("boolean"!=typeof t)throw new Error("noUiSlider: 'animate' option must be a boolean.");n.animate=t}function L(n,t){if("number"!=typeof t)throw new Error("noUiSlider: 'animationDuration' option must be a number.");n.animationDuration=t}function P(n,t){var e,r=[!1];if("lower"===t?t=[!0,!1]:"upper"===t&&(t=[!1,!0]),!0===t||!1===t){for(e=1;e1)throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.")}}function _(n,t){switch(t){case"ltr":n.dir=0;break;case"rtl":n.dir=1;break;default:throw new Error("noUiSlider: 'direction' option was not recognized.")}}function B(n,t){if("string"!=typeof t)throw new Error("noUiSlider: 'behaviour' must be a string containing options.");var e=t.indexOf("tap")>=0,r=t.indexOf("drag")>=0,a=t.indexOf("fixed")>=0,o=t.indexOf("snap")>=0,i=t.indexOf("hover")>=0,s=t.indexOf("unconstrained")>=0,l=t.indexOf("invert-connects")>=0,f=t.indexOf("drag-all")>=0,d=t.indexOf("smooth-steps")>=0;if(a){if(2!==n.handles)throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");U(n,n.start[1]-n.start[0])}if(l&&2!==n.handles)throw new Error("noUiSlider: 'invert-connects' behaviour must be used with 2 handles");if(s&&(n.margin||n.limit))throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");n.events={tap:e||o,drag:r,dragAll:f,smoothSteps:d,fixed:a,snap:o,hover:i,unconstrained:s,invertConnects:l}}function F(n,e){if(!1!==e)if(!0===e||t(e)){n.tooltips=[];for(var r=0;r= 2) required for mode 'count'.");for(var e=t.values-1,r=100/e,a=[];e--;)a[e]=e*r;return a.push(100),V(a,t.stepped)}return t.mode===n.PipsMode.Positions?V(t.values,t.stepped):t.mode===n.PipsMode.Values?t.stepped?t.values.map(function(n){return j.fromStepping(j.getStep(j.toStepping(n)))}):t.values:[]}(t),o={},i=j.xVal[0],s=j.xVal[j.xVal.length-1],l=!1,f=!1,d=0;return(r=a.slice().sort(function(n,t){return n-t}),a=r.filter(function(n){return!this[n]&&(this[n]=!0)},{}))[0]!==i&&(a.unshift(i),l=!0),a[a.length-1]!==s&&(a.push(s),f=!0),a.forEach(function(r,i){var s,c,p,b,m,g,u,h,v,x,w=r,y=a[i+1],k=t.mode===n.PipsMode.Steps;for(k&&(s=j.xNumSteps[i]),s||(s=y-w),void 0===y&&(y=w),s=Math.max(s,1e-7),c=w;c<=y;c=e(c,s)){for(h=(m=(b=j.toStepping(c))-d)/(t.density||1),x=m/(v=Math.round(h)),p=1;p<=v;p+=1)o[(g=d+p*x).toFixed(5)]=[j.fromStepping(g),0];u=a.indexOf(c)>-1?n.PipsType.LargeValue:k?n.PipsType.SmallValue:n.PipsType.NoValue,!i&&l&&c!==y&&(u=0),c===y&&f||(o[b.toFixed(5)]=[c,u]),d=b}}),o}function W(t,e,r){var a,i,s=q.createElement("div"),l=((a={})[n.PipsType.None]="",a[n.PipsType.NoValue]=o.cssClasses.valueNormal,a[n.PipsType.LargeValue]=o.cssClasses.valueLarge,a[n.PipsType.SmallValue]=o.cssClasses.valueSub,a),f=((i={})[n.PipsType.None]="",i[n.PipsType.NoValue]=o.cssClasses.markerNormal,i[n.PipsType.LargeValue]=o.cssClasses.markerLarge,i[n.PipsType.SmallValue]=o.cssClasses.markerSub,i),c=[o.cssClasses.valueHorizontal,o.cssClasses.valueVertical],p=[o.cssClasses.markerHorizontal,o.cssClasses.markerVertical];function b(n,t){var e=t===o.cssClasses.value,r=e?l:f;return t+" "+(e?c:p)[o.ort]+" "+r[n]}return d(s,o.cssClasses.pips),d(s,0===o.ort?o.cssClasses.pipsHorizontal:o.cssClasses.pipsVertical),Object.keys(t).forEach(function(a){!function(t,a,i){if((i=e?e(a,i):i)!==n.PipsType.None){var l=M(s,!1);l.className=b(i,o.cssClasses.marker),l.style[o.style]=t+"%",i>n.PipsType.NoValue&&((l=M(s,!1)).className=b(i,o.cssClasses.value),l.setAttribute("data-value",String(a)),l.style[o.style]=t+"%",l.innerHTML=String(r.to(a)))}}(a,t[a][0],t[a][1])}),s}function Y(){h&&(e(h),h=null)}function Q(n){Y();var t=G(n),e=n.filter,r=n.format||{to:function(n){return String(Math.round(n))}};return h=k.appendChild(W(t,e,r))}function J(){var n=b.getBoundingClientRect(),t="offset"+["Width","Height"][o.ort];return 0===o.ort?n.width||b[t]:n.height||b[t]}function K(n,t,e,r){var a=function(a){var i,s,l=function(n,t,e){var r=0===n.type.indexOf("touch"),a=0===n.type.indexOf("mouse"),o=0===n.type.indexOf("pointer"),i=0,s=0;if(0===n.type.indexOf("MSPointer")&&(o=!0),"mousedown"===n.type&&!n.buttons&&!n.touches)return!1;if(r){var l=function(t){var r=t.target;return r===e||e.contains(r)||n.composed&&n.composedPath().shift()===e};if("touchstart"===n.type){var f=Array.prototype.filter.call(n.touches,l);if(f.length>1)return!1;i=f[0].pageX,s=f[0].pageY}else{var d=Array.prototype.find.call(n.changedTouches,l);if(!d)return!1;i=d.pageX,s=d.pageY}}return t=t||p(q),(a||o)&&(i=n.clientX+t.x,s=n.clientY+t.y),n.pageOffset=t,n.points=[i,s],n.cursor=a||o,n}(a,r.pageOffset,r.target||t);return!!l&&!(F()&&!r.doNotReject)&&(i=k,s=o.cssClasses.tap,!((i.classList?i.classList.contains(s):new RegExp("\\b"+s+"\\b").test(i.className))&&!r.doNotReject))&&!(n===w.start&&void 0!==l.buttons&&l.buttons>1)&&(!r.hover||!l.buttons)&&(y||l.preventDefault(),l.calcPoint=l.points[o.ort],void e(l,r))},i=[];return n.split(" ").forEach(function(n){t.addEventListener(n,a,!!y&&{passive:!0}),i.push([n,a])}),i}function Z(n){var t,e,r,a,i,l,f=100*(n-(t=b,e=o.ort,r=t.getBoundingClientRect(),a=t.ownerDocument,i=a.documentElement,l=p(a),/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)&&(l.x=0),e?r.top+l.y-i.clientTop:r.left+l.x-i.clientLeft))/J();return f=s(f),o.dir?100-f:f}function nn(n,t){"mouseout"===n.type&&"HTML"===n.target.nodeName&&null===n.relatedTarget&&en(n,t)}function tn(n,t){if(-1===navigator.appVersion.indexOf("MSIE 9")&&0===n.buttons&&0!==t.buttonsProperty)return en(n,t);var e=(o.dir?-1:1)*(n.calcPoint-t.startCalcPoint);bn(e>0,100*e/t.baseSize,t.locations,t.handleNumbers,t.connect)}function en(n,t){t.handle&&(c(t.handle,o.cssClasses.active),T-=1),t.listeners.forEach(function(n){L.removeEventListener(n[0],n[1])}),0===T&&(c(k,o.cssClasses.drag),un(),n.cursor&&(R.style.cursor="",R.removeEventListener("selectstart",a))),o.events.smoothSteps&&(t.handleNumbers.forEach(function(n){hn(n,E[n],!0,!0,!1,!1)}),t.handleNumbers.forEach(function(n){dn("update",n)})),t.handleNumbers.forEach(function(n){dn("change",n),dn("set",n),dn("end",n)})}function rn(n,t){if(!t.handleNumbers.some(H)){var e;1===t.handleNumbers.length&&(e=g[t.handleNumbers[0]].children[0],T+=1,d(e,o.cssClasses.active)),n.stopPropagation();var r=[],i=K(w.move,L,tn,{target:n.target,handle:e,connect:t.connect,listeners:r,startCalcPoint:n.calcPoint,baseSize:J(),pageOffset:n.pageOffset,handleNumbers:t.handleNumbers,buttonsProperty:n.buttons,locations:E.slice()}),s=K(w.end,L,en,{target:n.target,handle:e,listeners:r,doNotReject:!0,handleNumbers:t.handleNumbers}),l=K("mouseout",L,nn,{target:n.target,handle:e,listeners:r,doNotReject:!0,handleNumbers:t.handleNumbers});r.push.apply(r,i.concat(s,l)),n.cursor&&(R.style.cursor=getComputedStyle(n.target).cursor,g.length>1&&d(k,o.cssClasses.drag),R.addEventListener("selectstart",a,!1)),t.handleNumbers.forEach(function(n){dn("start",n)})}}function an(n){n.stopPropagation();var t=Z(n.calcPoint),e=function(n){var t=100,e=!1;return g.forEach(function(r,a){if(!H(a)){var o=E[a],i=Math.abs(o-n);(io||100===i&&100===t)&&(e=a,t=i)}}),e}(t);!1!==e&&(o.events.snap||i(k,o.cssClasses.tap,o.animationDuration),hn(e,t,!0,!0),un(),dn("slide",e,!0),dn("update",e,!0),o.events.snap?rn(n,{handleNumbers:[e]}):(dn("change",e,!0),dn("set",e,!0)))}function on(n){var t=Z(n.calcPoint),e=j.getStep(t),r=j.fromStepping(e);Object.keys(N).forEach(function(n){"hover"===n.split(".")[0]&&N[n].forEach(function(n){n.call(Sn,r)})})}function sn(n){n.fixed||g.forEach(function(n,t){K(w.start,n.children[0],rn,{handleNumbers:[t]})}),n.tap&&K(w.start,b,an,{}),n.hover&&K(w.move,b,on,{hover:!0}),n.drag&&u.forEach(function(t,e){if(!1!==t&&0!==e&&e!==u.length-1){var r=g[e-1],a=g[e],i=[t],s=[r,a],l=[e-1,e];d(t,o.cssClasses.draggable),n.fixed&&(i.push(r.children[0]),i.push(a.children[0])),n.dragAll&&(s=g,l=C),i.forEach(function(n){K(w.start,n,rn,{handles:s,handleNumbers:l,connect:t})})}})}function ln(n,t){N[n]=N[n]||[],N[n].push(t),"update"===n.split(".")[0]&&g.forEach(function(n,t){dn("update",t)})}function fn(n){var t=n&&n.split(".")[0],e=t?n.substring(t.length):n;Object.keys(N).forEach(function(n){var r=n.split(".")[0],a=n.substring(r.length);t&&t!==r||e&&e!==a||function(n){return n===S||n===z}(a)&&e!==a||delete N[n]})}function dn(n,t,e){Object.keys(N).forEach(function(r){var a=r.split(".")[0];n===a&&N[r].forEach(function(n){n.call(Sn,A.map(o.format.to),t,A.slice(),e||!1,E.slice(),Sn)})})}function cn(n,t,e,r,a,i,l){var f;return g.length>1&&!o.events.unconstrained&&(r&&t>0&&(f=j.getAbsoluteDistance(n[t-1],o.margin,!1),e=Math.max(e,f)),a&&t1&&o.limit&&(r&&t>0&&(f=j.getAbsoluteDistance(n[t-1],o.limit,!1),e=Math.min(e,f)),a&&t1?r.forEach(function(n,e){var r=cn(i,n,i[n]+t,f[e],d[e],!1,l);!1===r?t=0:(t=r-i[n],i[n]=r)}):f=d=[!0];var c=!1;r.forEach(function(n,r){c=hn(n,e[n]+t,f[r],d[r],!1,l)||c}),c&&(r.forEach(function(n){dn("update",n),dn("slide",n)}),null!=a&&dn("drag",s))}function mn(n,t){return o.dir?100-n-t:n}function gn(n,t){E[n]=t,A[n]=j.fromStepping(t);var e="translate("+pn(mn(t,0)-U+"%","0")+")";if(g[n].style[o.transformRule]=e,o.events.invertConnects&&E.length>1){var r=E.every(function(n,t,e){return 0===t||n>=e[t-1]});if(D!==!r)return D=!D,P(o,o.connect.map(function(n){return!n})),void zn()}vn(n),vn(n+1),D&&(vn(n-1),vn(n+2))}function un(){C.forEach(function(n){var t=E[n]>50?-1:1,e=3+(g.length+t*n);g[n].style.zIndex=String(e)})}function hn(n,t,e,r,a,o){return a||(t=cn(E,n,t,e,r,!1,o)),!1!==t&&(gn(n,t),!0)}function vn(n){if(u[n]){var t=E.slice();D&&t.sort(function(n,t){return n-t});var e=0,r=100;0!==n&&(e=t[n-1]),n!==u.length-1&&(r=t[n]);var a=r-e,i="translate("+pn(mn(e,a)+"%","0")+")",s="scale("+pn(a/100,"1")+")";u[n].style[o.transformRule]=i+" "+s}}function xn(n,t){return null===n||!1===n||void 0===n?E[t]:("number"==typeof n&&(n=String(n)),!1!==(n=o.format.from(n))&&(n=j.toStepping(n)),!1===n||isNaN(n)?E[t]:n)}function wn(n,t,e){var r=l(n),a=void 0===E[0];t=void 0===t||t,o.animate&&!a&&i(k,o.cssClasses.tap,o.animationDuration),C.forEach(function(n){hn(n,xn(r[n],n),!0,!1,e)});var s=1===C.length?0:1;if(a&&j.hasNoSize()&&(e=!0,E[0]=0,C.length>1)){var f=100/(C.length-1);C.forEach(function(n){E[n]=n*f})}for(;se.stepAfter.startValue&&(a=e.stepAfter.startValue-r),i=r>e.thisStep.startValue?e.thisStep.step:!1!==e.stepBefore.step&&r-e.stepBefore.highestStep,100===t?a=null:0===t&&(i=null);var s=j.countStepDecimals();return null!==a&&!1!==a&&(a=Number(a.toFixed(s))),null!==i&&!1!==i&&(i=Number(i.toFixed(s))),[i,a]}function zn(){for(;m.firstChild;)m.removeChild(m.firstChild);for(var n=0;n<=o.handles;n++)u[n]=_(m,o.connect[n]),vn(n);sn({drag:o.events.drag,fixed:!0})}d(x=k,o.cssClasses.target),0===o.dir?d(x,o.cssClasses.ltr):d(x,o.cssClasses.rtl),0===o.ort?d(x,o.cssClasses.horizontal):d(x,o.cssClasses.vertical),d(x,"rtl"===getComputedStyle(x).direction?o.cssClasses.textDirectionRtl:o.cssClasses.textDirectionLtr),b=M(x,o.cssClasses.base),function(n,t){m=M(t,o.cssClasses.connects),g=[],(u=[]).push(_(m,n[0]));for(var e=0;e=0&&n{"use strict";n.exports=e.p+"../fonts/fa-solid-900.0ae4e6254fc19607c79e.woff2"},3385:n=>{"use strict";n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%272%27 fill=%27%23fff%27/%3e%3c/svg%3e"},4035:function(n,t){!function(n){"use strict";const t="transitionend",e=n=>(n&&window.CSS&&window.CSS.escape&&(n=n.replace(/#([^\s"#']+)/g,(n,t)=>`#${CSS.escape(t)}`)),n),r=n=>{if(!n)return 0;let{transitionDuration:t,transitionDelay:e}=window.getComputedStyle(n);const r=Number.parseFloat(t),a=Number.parseFloat(e);return r||a?(t=t.split(",")[0],e=e.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(e))):0},a=n=>{n.dispatchEvent(new Event(t))},o=n=>!(!n||"object"!=typeof n)&&(void 0!==n.jquery&&(n=n[0]),void 0!==n.nodeType),i=n=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof n.getRootNode){const t=n.getRootNode();return t instanceof ShadowRoot?t:null}return n instanceof ShadowRoot?n:n.parentNode?i(n.parentNode):null},s=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,l=[],f=n=>{"loading"===document.readyState?(l.length||document.addEventListener("DOMContentLoaded",()=>{for(const n of l)n()}),l.push(n)):n()},d=(n,t=[],e=n)=>"function"==typeof n?n.call(...t):e;n.defineJQueryPlugin=n=>{f(()=>{const t=s();if(t){const e=n.NAME,r=t.fn[e];t.fn[e]=n.jQueryInterface,t.fn[e].Constructor=n,t.fn[e].noConflict=()=>(t.fn[e]=r,n.jQueryInterface)}})},n.execute=d,n.executeAfterTransition=(n,e,o=!0)=>{if(!o)return void d(n);const i=r(e)+5;let s=!1;const l=({target:r})=>{r===e&&(s=!0,e.removeEventListener(t,l),d(n))};e.addEventListener(t,l),setTimeout(()=>{s||a(e)},i)},n.findShadowRoot=i,n.getElement=n=>o(n)?n.jquery?n[0]:n:"string"==typeof n&&n.length>0?document.querySelector(e(n)):null,n.getNextActiveElement=(n,t,e,r)=>{const a=n.length;let o=n.indexOf(t);return-1===o?!e&&r?n[a-1]:n[0]:(o+=e?1:-1,r&&(o=(o+a)%a),n[Math.max(0,Math.min(o,a-1))])},n.getTransitionDurationFromElement=r,n.getUID=n=>{do{n+=Math.floor(1e6*Math.random())}while(document.getElementById(n));return n},n.getjQuery=s,n.isDisabled=n=>!n||n.nodeType!==Node.ELEMENT_NODE||!!n.classList.contains("disabled")||(void 0!==n.disabled?n.disabled:n.hasAttribute("disabled")&&"false"!==n.getAttribute("disabled")),n.isElement=o,n.isRTL=()=>"rtl"===document.documentElement.dir,n.isVisible=n=>{if(!o(n)||0===n.getClientRects().length)return!1;const t="visible"===getComputedStyle(n).getPropertyValue("visibility"),e=n.closest("details:not([open])");if(!e)return t;if(e!==n){const t=n.closest("summary");if(t&&t.parentNode!==e)return!1;if(null===t)return!1}return t},n.noop=()=>{},n.onDOMContentLoaded=f,n.parseSelector=e,n.reflow=n=>{n.offsetHeight},n.toType=n=>null==n?`${n}`:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),n.triggerTransitionEnd=a,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})}(t)},4064:(n,t,e)=>{"use strict";e.d(t,{A:()=>s});var r=e(1601),a=e.n(r),o=e(6314),i=e.n(o)()(a());i.push([n.id,'/*!\n * Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2025 Fonticons, Inc.\n */\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fas,\n.far,\n.fab,\n.fa {\n --_fa-family: var(--fa-family, var(--fa-style-family, "Font Awesome 7 Free"));\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n display: var(--fa-display, inline-block);\n font-family: var(--_fa-family);\n font-feature-settings: normal;\n font-style: normal;\n font-synthesis: none;\n font-variant: normal;\n font-weight: var(--fa-style, 900);\n line-height: 1;\n text-align: center;\n text-rendering: auto;\n width: var(--fa-width, 1.25em);\n}\n\n:is(.fas,\n.far,\n.fab,\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fa)::before {\n content: var(--fa)/"";\n}\n\n@supports not (content: ""/"") {\n :is(.fas,\n .far,\n .fab,\n .fa-solid,\n .fa-regular,\n .fa-brands,\n .fa-classic,\n .fa)::before {\n content: var(--fa);\n }\n}\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-2xs {\n font-size: calc(10 / 16 * 1em); /* converts a 10px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 10 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 10 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-xs {\n font-size: calc(12 / 16 * 1em); /* converts a 12px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 12 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 12 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-sm {\n font-size: calc(14 / 16 * 1em); /* converts a 14px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 14 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 14 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-lg {\n font-size: calc(20 / 16 * 1em); /* converts a 20px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 20 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 20 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-xl {\n font-size: calc(24 / 16 * 1em); /* converts a 24px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 24 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 24 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-2xl {\n font-size: calc(32 / 16 * 1em); /* converts a 32px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 32 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 32 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-width-auto {\n --fa-width: auto;\n}\n\n.fa-fw,\n.fa-width-fixed {\n --fa-width: 1.25em;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-inline-start: var(--fa-li-margin, 2.5em);\n padding-inline-start: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n inset-inline-start: calc(-1 * var(--fa-li-width, 2em));\n position: absolute;\n text-align: center;\n width: var(--fa-li-width, 2em);\n line-height: inherit;\n}\n\n/* Heads Up: Bordered Icons will not be supported in the future!\n - This feature will be deprecated in the next major release of Font Awesome (v8)!\n - You may continue to use it in this version *v7), but it will not be supported in Font Awesome v8.\n*/\n/* Notes:\n* --@{v.$css-prefix}-border-width = 1/16 by default (to render as ~1px based on a 16px default font-size)\n* --@{v.$css-prefix}-border-padding =\n ** 3/16 for vertical padding (to give ~2px of vertical whitespace around an icon considering it\'s vertical alignment)\n ** 4/16 for horizontal padding (to give ~4px of horizontal whitespace around an icon)\n*/\n.fa-border {\n border-color: var(--fa-border-color, #eee);\n border-radius: var(--fa-border-radius, 0.1em);\n border-style: var(--fa-border-style, solid);\n border-width: var(--fa-border-width, 0.0625em);\n box-sizing: var(--fa-border-box-sizing, content-box);\n padding: var(--fa-border-padding, 0.1875em 0.25em);\n}\n\n.fa-pull-left,\n.fa-pull-start {\n float: inline-start;\n margin-inline-end: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-pull-right,\n.fa-pull-end {\n float: inline-end;\n margin-inline-start: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-beat {\n animation-name: fa-beat;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-bounce {\n animation-name: fa-bounce;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n}\n\n.fa-fade {\n animation-name: fa-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n}\n\n.fa-beat-fade {\n animation-name: fa-beat-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n}\n\n.fa-flip {\n animation-name: fa-flip;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-shake {\n animation-name: fa-shake;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin {\n animation-name: fa-spin;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-reverse {\n --fa-animation-direction: reverse;\n}\n\n.fa-pulse,\n.fa-spin-pulse {\n animation-name: fa-spin;\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, steps(8));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fa-beat,\n .fa-bounce,\n .fa-fade,\n .fa-beat-fade,\n .fa-flip,\n .fa-pulse,\n .fa-shake,\n .fa-spin,\n .fa-spin-pulse {\n animation: none !important;\n transition: none !important;\n }\n}\n@keyframes fa-beat {\n 0%, 90% {\n transform: scale(1);\n }\n 45% {\n transform: scale(var(--fa-beat-scale, 1.25));\n }\n}\n@keyframes fa-bounce {\n 0% {\n transform: scale(1, 1) translateY(0);\n }\n 10% {\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n }\n 30% {\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n }\n 50% {\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n }\n 57% {\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n }\n 64% {\n transform: scale(1, 1) translateY(0);\n }\n 100% {\n transform: scale(1, 1) translateY(0);\n }\n}\n@keyframes fa-fade {\n 50% {\n opacity: var(--fa-fade-opacity, 0.4);\n }\n}\n@keyframes fa-beat-fade {\n 0%, 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n transform: scale(var(--fa-beat-fade-scale, 1.125));\n }\n}\n@keyframes fa-flip {\n 50% {\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\n }\n}\n@keyframes fa-shake {\n 0% {\n transform: rotate(-15deg);\n }\n 4% {\n transform: rotate(15deg);\n }\n 8%, 24% {\n transform: rotate(-18deg);\n }\n 12%, 28% {\n transform: rotate(18deg);\n }\n 16% {\n transform: rotate(-22deg);\n }\n 20% {\n transform: rotate(22deg);\n }\n 32% {\n transform: rotate(-12deg);\n }\n 36% {\n transform: rotate(12deg);\n }\n 40%, 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.fa-rotate-90 {\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n transform: scale(1, -1);\n}\n\n.fa-flip-both,\n.fa-flip-horizontal.fa-flip-vertical {\n transform: scale(-1, -1);\n}\n\n.fa-rotate-by {\n transform: rotate(var(--fa-rotate-angle, 0));\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n --fa-width: 100%;\n inset: 0;\n position: absolute;\n text-align: center;\n width: var(--fa-width);\n z-index: var(--fa-stack-z-index, auto);\n}\n\n.fa-stack-1x {\n line-height: inherit;\n}\n\n.fa-stack-2x {\n font-size: 2em;\n}\n\n.fa-inverse {\n color: var(--fa-inverse, #fff);\n}\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n\n.fa-0 {\n --fa: "\\30 ";\n}\n\n.fa-1 {\n --fa: "\\31 ";\n}\n\n.fa-2 {\n --fa: "\\32 ";\n}\n\n.fa-3 {\n --fa: "\\33 ";\n}\n\n.fa-4 {\n --fa: "\\34 ";\n}\n\n.fa-5 {\n --fa: "\\35 ";\n}\n\n.fa-6 {\n --fa: "\\36 ";\n}\n\n.fa-7 {\n --fa: "\\37 ";\n}\n\n.fa-8 {\n --fa: "\\38 ";\n}\n\n.fa-9 {\n --fa: "\\39 ";\n}\n\n.fa-exclamation {\n --fa: "\\!";\n}\n\n.fa-hashtag {\n --fa: "\\#";\n}\n\n.fa-dollar-sign {\n --fa: "\\$";\n}\n\n.fa-dollar {\n --fa: "\\$";\n}\n\n.fa-usd {\n --fa: "\\$";\n}\n\n.fa-percent {\n --fa: "\\%";\n}\n\n.fa-percentage {\n --fa: "\\%";\n}\n\n.fa-asterisk {\n --fa: "\\*";\n}\n\n.fa-plus {\n --fa: "\\+";\n}\n\n.fa-add {\n --fa: "\\+";\n}\n\n.fa-less-than {\n --fa: "\\<";\n}\n\n.fa-equals {\n --fa: "\\=";\n}\n\n.fa-greater-than {\n --fa: "\\>";\n}\n\n.fa-question {\n --fa: "\\?";\n}\n\n.fa-at {\n --fa: "\\@";\n}\n\n.fa-a {\n --fa: "A";\n}\n\n.fa-b {\n --fa: "B";\n}\n\n.fa-c {\n --fa: "C";\n}\n\n.fa-d {\n --fa: "D";\n}\n\n.fa-e {\n --fa: "E";\n}\n\n.fa-f {\n --fa: "F";\n}\n\n.fa-g {\n --fa: "G";\n}\n\n.fa-h {\n --fa: "H";\n}\n\n.fa-i {\n --fa: "I";\n}\n\n.fa-j {\n --fa: "J";\n}\n\n.fa-k {\n --fa: "K";\n}\n\n.fa-l {\n --fa: "L";\n}\n\n.fa-m {\n --fa: "M";\n}\n\n.fa-n {\n --fa: "N";\n}\n\n.fa-o {\n --fa: "O";\n}\n\n.fa-p {\n --fa: "P";\n}\n\n.fa-q {\n --fa: "Q";\n}\n\n.fa-r {\n --fa: "R";\n}\n\n.fa-s {\n --fa: "S";\n}\n\n.fa-t {\n --fa: "T";\n}\n\n.fa-u {\n --fa: "U";\n}\n\n.fa-v {\n --fa: "V";\n}\n\n.fa-w {\n --fa: "W";\n}\n\n.fa-x {\n --fa: "X";\n}\n\n.fa-y {\n --fa: "Y";\n}\n\n.fa-z {\n --fa: "Z";\n}\n\n.fa-faucet {\n --fa: "\\e005";\n}\n\n.fa-faucet-drip {\n --fa: "\\e006";\n}\n\n.fa-house-chimney-window {\n --fa: "\\e00d";\n}\n\n.fa-house-signal {\n --fa: "\\e012";\n}\n\n.fa-temperature-arrow-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-arrow-up {\n --fa: "\\e040";\n}\n\n.fa-temperature-up {\n --fa: "\\e040";\n}\n\n.fa-trailer {\n --fa: "\\e041";\n}\n\n.fa-bacteria {\n --fa: "\\e059";\n}\n\n.fa-bacterium {\n --fa: "\\e05a";\n}\n\n.fa-box-tissue {\n --fa: "\\e05b";\n}\n\n.fa-hand-holding-medical {\n --fa: "\\e05c";\n}\n\n.fa-hand-sparkles {\n --fa: "\\e05d";\n}\n\n.fa-hands-bubbles {\n --fa: "\\e05e";\n}\n\n.fa-hands-wash {\n --fa: "\\e05e";\n}\n\n.fa-handshake-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-alt-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-simple-slash {\n --fa: "\\e060";\n}\n\n.fa-head-side-cough {\n --fa: "\\e061";\n}\n\n.fa-head-side-cough-slash {\n --fa: "\\e062";\n}\n\n.fa-head-side-mask {\n --fa: "\\e063";\n}\n\n.fa-head-side-virus {\n --fa: "\\e064";\n}\n\n.fa-house-chimney-user {\n --fa: "\\e065";\n}\n\n.fa-house-laptop {\n --fa: "\\e066";\n}\n\n.fa-laptop-house {\n --fa: "\\e066";\n}\n\n.fa-lungs-virus {\n --fa: "\\e067";\n}\n\n.fa-people-arrows {\n --fa: "\\e068";\n}\n\n.fa-people-arrows-left-right {\n --fa: "\\e068";\n}\n\n.fa-plane-slash {\n --fa: "\\e069";\n}\n\n.fa-pump-medical {\n --fa: "\\e06a";\n}\n\n.fa-pump-soap {\n --fa: "\\e06b";\n}\n\n.fa-shield-virus {\n --fa: "\\e06c";\n}\n\n.fa-sink {\n --fa: "\\e06d";\n}\n\n.fa-soap {\n --fa: "\\e06e";\n}\n\n.fa-stopwatch-20 {\n --fa: "\\e06f";\n}\n\n.fa-shop-slash {\n --fa: "\\e070";\n}\n\n.fa-store-alt-slash {\n --fa: "\\e070";\n}\n\n.fa-store-slash {\n --fa: "\\e071";\n}\n\n.fa-toilet-paper-slash {\n --fa: "\\e072";\n}\n\n.fa-users-slash {\n --fa: "\\e073";\n}\n\n.fa-virus {\n --fa: "\\e074";\n}\n\n.fa-virus-slash {\n --fa: "\\e075";\n}\n\n.fa-viruses {\n --fa: "\\e076";\n}\n\n.fa-vest {\n --fa: "\\e085";\n}\n\n.fa-vest-patches {\n --fa: "\\e086";\n}\n\n.fa-arrow-trend-down {\n --fa: "\\e097";\n}\n\n.fa-arrow-trend-up {\n --fa: "\\e098";\n}\n\n.fa-arrow-up-from-bracket {\n --fa: "\\e09a";\n}\n\n.fa-austral-sign {\n --fa: "\\e0a9";\n}\n\n.fa-baht-sign {\n --fa: "\\e0ac";\n}\n\n.fa-bitcoin-sign {\n --fa: "\\e0b4";\n}\n\n.fa-bolt-lightning {\n --fa: "\\e0b7";\n}\n\n.fa-book-bookmark {\n --fa: "\\e0bb";\n}\n\n.fa-camera-rotate {\n --fa: "\\e0d8";\n}\n\n.fa-cedi-sign {\n --fa: "\\e0df";\n}\n\n.fa-chart-column {\n --fa: "\\e0e3";\n}\n\n.fa-chart-gantt {\n --fa: "\\e0e4";\n}\n\n.fa-clapperboard {\n --fa: "\\e131";\n}\n\n.fa-clover {\n --fa: "\\e139";\n}\n\n.fa-code-compare {\n --fa: "\\e13a";\n}\n\n.fa-code-fork {\n --fa: "\\e13b";\n}\n\n.fa-code-pull-request {\n --fa: "\\e13c";\n}\n\n.fa-colon-sign {\n --fa: "\\e140";\n}\n\n.fa-cruzeiro-sign {\n --fa: "\\e152";\n}\n\n.fa-display {\n --fa: "\\e163";\n}\n\n.fa-dong-sign {\n --fa: "\\e169";\n}\n\n.fa-elevator {\n --fa: "\\e16d";\n}\n\n.fa-filter-circle-xmark {\n --fa: "\\e17b";\n}\n\n.fa-florin-sign {\n --fa: "\\e184";\n}\n\n.fa-folder-closed {\n --fa: "\\e185";\n}\n\n.fa-franc-sign {\n --fa: "\\e18f";\n}\n\n.fa-guarani-sign {\n --fa: "\\e19a";\n}\n\n.fa-gun {\n --fa: "\\e19b";\n}\n\n.fa-hands-clapping {\n --fa: "\\e1a8";\n}\n\n.fa-house-user {\n --fa: "\\e1b0";\n}\n\n.fa-home-user {\n --fa: "\\e1b0";\n}\n\n.fa-indian-rupee-sign {\n --fa: "\\e1bc";\n}\n\n.fa-indian-rupee {\n --fa: "\\e1bc";\n}\n\n.fa-inr {\n --fa: "\\e1bc";\n}\n\n.fa-kip-sign {\n --fa: "\\e1c4";\n}\n\n.fa-lari-sign {\n --fa: "\\e1c8";\n}\n\n.fa-litecoin-sign {\n --fa: "\\e1d3";\n}\n\n.fa-manat-sign {\n --fa: "\\e1d5";\n}\n\n.fa-mask-face {\n --fa: "\\e1d7";\n}\n\n.fa-mill-sign {\n --fa: "\\e1ed";\n}\n\n.fa-money-bills {\n --fa: "\\e1f3";\n}\n\n.fa-naira-sign {\n --fa: "\\e1f6";\n}\n\n.fa-notdef {\n --fa: "\\e1fe";\n}\n\n.fa-panorama {\n --fa: "\\e209";\n}\n\n.fa-peseta-sign {\n --fa: "\\e221";\n}\n\n.fa-peso-sign {\n --fa: "\\e222";\n}\n\n.fa-plane-up {\n --fa: "\\e22d";\n}\n\n.fa-rupiah-sign {\n --fa: "\\e23d";\n}\n\n.fa-stairs {\n --fa: "\\e289";\n}\n\n.fa-timeline {\n --fa: "\\e29c";\n}\n\n.fa-truck-front {\n --fa: "\\e2b7";\n}\n\n.fa-turkish-lira-sign {\n --fa: "\\e2bb";\n}\n\n.fa-try {\n --fa: "\\e2bb";\n}\n\n.fa-turkish-lira {\n --fa: "\\e2bb";\n}\n\n.fa-vault {\n --fa: "\\e2c5";\n}\n\n.fa-wand-magic-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-magic-wand-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-wheat-awn {\n --fa: "\\e2cd";\n}\n\n.fa-wheat-alt {\n --fa: "\\e2cd";\n}\n\n.fa-wheelchair-move {\n --fa: "\\e2ce";\n}\n\n.fa-wheelchair-alt {\n --fa: "\\e2ce";\n}\n\n.fa-bangladeshi-taka-sign {\n --fa: "\\e2e6";\n}\n\n.fa-bowl-rice {\n --fa: "\\e2eb";\n}\n\n.fa-person-pregnant {\n --fa: "\\e31e";\n}\n\n.fa-house-chimney {\n --fa: "\\e3af";\n}\n\n.fa-home-lg {\n --fa: "\\e3af";\n}\n\n.fa-house-crack {\n --fa: "\\e3b1";\n}\n\n.fa-house-medical {\n --fa: "\\e3b2";\n}\n\n.fa-cent-sign {\n --fa: "\\e3f5";\n}\n\n.fa-plus-minus {\n --fa: "\\e43c";\n}\n\n.fa-sailboat {\n --fa: "\\e445";\n}\n\n.fa-section {\n --fa: "\\e447";\n}\n\n.fa-shrimp {\n --fa: "\\e448";\n}\n\n.fa-brazilian-real-sign {\n --fa: "\\e46c";\n}\n\n.fa-chart-simple {\n --fa: "\\e473";\n}\n\n.fa-diagram-next {\n --fa: "\\e476";\n}\n\n.fa-diagram-predecessor {\n --fa: "\\e477";\n}\n\n.fa-diagram-successor {\n --fa: "\\e47a";\n}\n\n.fa-earth-oceania {\n --fa: "\\e47b";\n}\n\n.fa-globe-oceania {\n --fa: "\\e47b";\n}\n\n.fa-bug-slash {\n --fa: "\\e490";\n}\n\n.fa-file-circle-plus {\n --fa: "\\e494";\n}\n\n.fa-shop-lock {\n --fa: "\\e4a5";\n}\n\n.fa-virus-covid {\n --fa: "\\e4a8";\n}\n\n.fa-virus-covid-slash {\n --fa: "\\e4a9";\n}\n\n.fa-anchor-circle-check {\n --fa: "\\e4aa";\n}\n\n.fa-anchor-circle-exclamation {\n --fa: "\\e4ab";\n}\n\n.fa-anchor-circle-xmark {\n --fa: "\\e4ac";\n}\n\n.fa-anchor-lock {\n --fa: "\\e4ad";\n}\n\n.fa-arrow-down-up-across-line {\n --fa: "\\e4af";\n}\n\n.fa-arrow-down-up-lock {\n --fa: "\\e4b0";\n}\n\n.fa-arrow-right-to-city {\n --fa: "\\e4b3";\n}\n\n.fa-arrow-up-from-ground-water {\n --fa: "\\e4b5";\n}\n\n.fa-arrow-up-from-water-pump {\n --fa: "\\e4b6";\n}\n\n.fa-arrow-up-right-dots {\n --fa: "\\e4b7";\n}\n\n.fa-arrows-down-to-line {\n --fa: "\\e4b8";\n}\n\n.fa-arrows-down-to-people {\n --fa: "\\e4b9";\n}\n\n.fa-arrows-left-right-to-line {\n --fa: "\\e4ba";\n}\n\n.fa-arrows-spin {\n --fa: "\\e4bb";\n}\n\n.fa-arrows-split-up-and-left {\n --fa: "\\e4bc";\n}\n\n.fa-arrows-to-circle {\n --fa: "\\e4bd";\n}\n\n.fa-arrows-to-dot {\n --fa: "\\e4be";\n}\n\n.fa-arrows-to-eye {\n --fa: "\\e4bf";\n}\n\n.fa-arrows-turn-right {\n --fa: "\\e4c0";\n}\n\n.fa-arrows-turn-to-dots {\n --fa: "\\e4c1";\n}\n\n.fa-arrows-up-to-line {\n --fa: "\\e4c2";\n}\n\n.fa-bore-hole {\n --fa: "\\e4c3";\n}\n\n.fa-bottle-droplet {\n --fa: "\\e4c4";\n}\n\n.fa-bottle-water {\n --fa: "\\e4c5";\n}\n\n.fa-bowl-food {\n --fa: "\\e4c6";\n}\n\n.fa-boxes-packing {\n --fa: "\\e4c7";\n}\n\n.fa-bridge {\n --fa: "\\e4c8";\n}\n\n.fa-bridge-circle-check {\n --fa: "\\e4c9";\n}\n\n.fa-bridge-circle-exclamation {\n --fa: "\\e4ca";\n}\n\n.fa-bridge-circle-xmark {\n --fa: "\\e4cb";\n}\n\n.fa-bridge-lock {\n --fa: "\\e4cc";\n}\n\n.fa-bridge-water {\n --fa: "\\e4ce";\n}\n\n.fa-bucket {\n --fa: "\\e4cf";\n}\n\n.fa-bugs {\n --fa: "\\e4d0";\n}\n\n.fa-building-circle-arrow-right {\n --fa: "\\e4d1";\n}\n\n.fa-building-circle-check {\n --fa: "\\e4d2";\n}\n\n.fa-building-circle-exclamation {\n --fa: "\\e4d3";\n}\n\n.fa-building-circle-xmark {\n --fa: "\\e4d4";\n}\n\n.fa-building-flag {\n --fa: "\\e4d5";\n}\n\n.fa-building-lock {\n --fa: "\\e4d6";\n}\n\n.fa-building-ngo {\n --fa: "\\e4d7";\n}\n\n.fa-building-shield {\n --fa: "\\e4d8";\n}\n\n.fa-building-un {\n --fa: "\\e4d9";\n}\n\n.fa-building-user {\n --fa: "\\e4da";\n}\n\n.fa-building-wheat {\n --fa: "\\e4db";\n}\n\n.fa-burst {\n --fa: "\\e4dc";\n}\n\n.fa-car-on {\n --fa: "\\e4dd";\n}\n\n.fa-car-tunnel {\n --fa: "\\e4de";\n}\n\n.fa-child-combatant {\n --fa: "\\e4e0";\n}\n\n.fa-child-rifle {\n --fa: "\\e4e0";\n}\n\n.fa-children {\n --fa: "\\e4e1";\n}\n\n.fa-circle-nodes {\n --fa: "\\e4e2";\n}\n\n.fa-clipboard-question {\n --fa: "\\e4e3";\n}\n\n.fa-cloud-showers-water {\n --fa: "\\e4e4";\n}\n\n.fa-computer {\n --fa: "\\e4e5";\n}\n\n.fa-cubes-stacked {\n --fa: "\\e4e6";\n}\n\n.fa-envelope-circle-check {\n --fa: "\\e4e8";\n}\n\n.fa-explosion {\n --fa: "\\e4e9";\n}\n\n.fa-ferry {\n --fa: "\\e4ea";\n}\n\n.fa-file-circle-exclamation {\n --fa: "\\e4eb";\n}\n\n.fa-file-circle-minus {\n --fa: "\\e4ed";\n}\n\n.fa-file-circle-question {\n --fa: "\\e4ef";\n}\n\n.fa-file-shield {\n --fa: "\\e4f0";\n}\n\n.fa-fire-burner {\n --fa: "\\e4f1";\n}\n\n.fa-fish-fins {\n --fa: "\\e4f2";\n}\n\n.fa-flask-vial {\n --fa: "\\e4f3";\n}\n\n.fa-glass-water {\n --fa: "\\e4f4";\n}\n\n.fa-glass-water-droplet {\n --fa: "\\e4f5";\n}\n\n.fa-group-arrows-rotate {\n --fa: "\\e4f6";\n}\n\n.fa-hand-holding-hand {\n --fa: "\\e4f7";\n}\n\n.fa-handcuffs {\n --fa: "\\e4f8";\n}\n\n.fa-hands-bound {\n --fa: "\\e4f9";\n}\n\n.fa-hands-holding-child {\n --fa: "\\e4fa";\n}\n\n.fa-hands-holding-circle {\n --fa: "\\e4fb";\n}\n\n.fa-heart-circle-bolt {\n --fa: "\\e4fc";\n}\n\n.fa-heart-circle-check {\n --fa: "\\e4fd";\n}\n\n.fa-heart-circle-exclamation {\n --fa: "\\e4fe";\n}\n\n.fa-heart-circle-minus {\n --fa: "\\e4ff";\n}\n\n.fa-heart-circle-plus {\n --fa: "\\e500";\n}\n\n.fa-heart-circle-xmark {\n --fa: "\\e501";\n}\n\n.fa-helicopter-symbol {\n --fa: "\\e502";\n}\n\n.fa-helmet-un {\n --fa: "\\e503";\n}\n\n.fa-hill-avalanche {\n --fa: "\\e507";\n}\n\n.fa-hill-rockslide {\n --fa: "\\e508";\n}\n\n.fa-house-circle-check {\n --fa: "\\e509";\n}\n\n.fa-house-circle-exclamation {\n --fa: "\\e50a";\n}\n\n.fa-house-circle-xmark {\n --fa: "\\e50b";\n}\n\n.fa-house-fire {\n --fa: "\\e50c";\n}\n\n.fa-house-flag {\n --fa: "\\e50d";\n}\n\n.fa-house-flood-water {\n --fa: "\\e50e";\n}\n\n.fa-house-flood-water-circle-arrow-right {\n --fa: "\\e50f";\n}\n\n.fa-house-lock {\n --fa: "\\e510";\n}\n\n.fa-house-medical-circle-check {\n --fa: "\\e511";\n}\n\n.fa-house-medical-circle-exclamation {\n --fa: "\\e512";\n}\n\n.fa-house-medical-circle-xmark {\n --fa: "\\e513";\n}\n\n.fa-house-medical-flag {\n --fa: "\\e514";\n}\n\n.fa-house-tsunami {\n --fa: "\\e515";\n}\n\n.fa-jar {\n --fa: "\\e516";\n}\n\n.fa-jar-wheat {\n --fa: "\\e517";\n}\n\n.fa-jet-fighter-up {\n --fa: "\\e518";\n}\n\n.fa-jug-detergent {\n --fa: "\\e519";\n}\n\n.fa-kitchen-set {\n --fa: "\\e51a";\n}\n\n.fa-land-mine-on {\n --fa: "\\e51b";\n}\n\n.fa-landmark-flag {\n --fa: "\\e51c";\n}\n\n.fa-laptop-file {\n --fa: "\\e51d";\n}\n\n.fa-lines-leaning {\n --fa: "\\e51e";\n}\n\n.fa-location-pin-lock {\n --fa: "\\e51f";\n}\n\n.fa-locust {\n --fa: "\\e520";\n}\n\n.fa-magnifying-glass-arrow-right {\n --fa: "\\e521";\n}\n\n.fa-magnifying-glass-chart {\n --fa: "\\e522";\n}\n\n.fa-mars-and-venus-burst {\n --fa: "\\e523";\n}\n\n.fa-mask-ventilator {\n --fa: "\\e524";\n}\n\n.fa-mattress-pillow {\n --fa: "\\e525";\n}\n\n.fa-mobile-retro {\n --fa: "\\e527";\n}\n\n.fa-money-bill-transfer {\n --fa: "\\e528";\n}\n\n.fa-money-bill-trend-up {\n --fa: "\\e529";\n}\n\n.fa-money-bill-wheat {\n --fa: "\\e52a";\n}\n\n.fa-mosquito {\n --fa: "\\e52b";\n}\n\n.fa-mosquito-net {\n --fa: "\\e52c";\n}\n\n.fa-mound {\n --fa: "\\e52d";\n}\n\n.fa-mountain-city {\n --fa: "\\e52e";\n}\n\n.fa-mountain-sun {\n --fa: "\\e52f";\n}\n\n.fa-oil-well {\n --fa: "\\e532";\n}\n\n.fa-people-group {\n --fa: "\\e533";\n}\n\n.fa-people-line {\n --fa: "\\e534";\n}\n\n.fa-people-pulling {\n --fa: "\\e535";\n}\n\n.fa-people-robbery {\n --fa: "\\e536";\n}\n\n.fa-people-roof {\n --fa: "\\e537";\n}\n\n.fa-person-arrow-down-to-line {\n --fa: "\\e538";\n}\n\n.fa-person-arrow-up-from-line {\n --fa: "\\e539";\n}\n\n.fa-person-breastfeeding {\n --fa: "\\e53a";\n}\n\n.fa-person-burst {\n --fa: "\\e53b";\n}\n\n.fa-person-cane {\n --fa: "\\e53c";\n}\n\n.fa-person-chalkboard {\n --fa: "\\e53d";\n}\n\n.fa-person-circle-check {\n --fa: "\\e53e";\n}\n\n.fa-person-circle-exclamation {\n --fa: "\\e53f";\n}\n\n.fa-person-circle-minus {\n --fa: "\\e540";\n}\n\n.fa-person-circle-plus {\n --fa: "\\e541";\n}\n\n.fa-person-circle-question {\n --fa: "\\e542";\n}\n\n.fa-person-circle-xmark {\n --fa: "\\e543";\n}\n\n.fa-person-dress-burst {\n --fa: "\\e544";\n}\n\n.fa-person-drowning {\n --fa: "\\e545";\n}\n\n.fa-person-falling {\n --fa: "\\e546";\n}\n\n.fa-person-falling-burst {\n --fa: "\\e547";\n}\n\n.fa-person-half-dress {\n --fa: "\\e548";\n}\n\n.fa-person-harassing {\n --fa: "\\e549";\n}\n\n.fa-person-military-pointing {\n --fa: "\\e54a";\n}\n\n.fa-person-military-rifle {\n --fa: "\\e54b";\n}\n\n.fa-person-military-to-person {\n --fa: "\\e54c";\n}\n\n.fa-person-rays {\n --fa: "\\e54d";\n}\n\n.fa-person-rifle {\n --fa: "\\e54e";\n}\n\n.fa-person-shelter {\n --fa: "\\e54f";\n}\n\n.fa-person-walking-arrow-loop-left {\n --fa: "\\e551";\n}\n\n.fa-person-walking-arrow-right {\n --fa: "\\e552";\n}\n\n.fa-person-walking-dashed-line-arrow-right {\n --fa: "\\e553";\n}\n\n.fa-person-walking-luggage {\n --fa: "\\e554";\n}\n\n.fa-plane-circle-check {\n --fa: "\\e555";\n}\n\n.fa-plane-circle-exclamation {\n --fa: "\\e556";\n}\n\n.fa-plane-circle-xmark {\n --fa: "\\e557";\n}\n\n.fa-plane-lock {\n --fa: "\\e558";\n}\n\n.fa-plate-wheat {\n --fa: "\\e55a";\n}\n\n.fa-plug-circle-bolt {\n --fa: "\\e55b";\n}\n\n.fa-plug-circle-check {\n --fa: "\\e55c";\n}\n\n.fa-plug-circle-exclamation {\n --fa: "\\e55d";\n}\n\n.fa-plug-circle-minus {\n --fa: "\\e55e";\n}\n\n.fa-plug-circle-plus {\n --fa: "\\e55f";\n}\n\n.fa-plug-circle-xmark {\n --fa: "\\e560";\n}\n\n.fa-ranking-star {\n --fa: "\\e561";\n}\n\n.fa-road-barrier {\n --fa: "\\e562";\n}\n\n.fa-road-bridge {\n --fa: "\\e563";\n}\n\n.fa-road-circle-check {\n --fa: "\\e564";\n}\n\n.fa-road-circle-exclamation {\n --fa: "\\e565";\n}\n\n.fa-road-circle-xmark {\n --fa: "\\e566";\n}\n\n.fa-road-lock {\n --fa: "\\e567";\n}\n\n.fa-road-spikes {\n --fa: "\\e568";\n}\n\n.fa-rug {\n --fa: "\\e569";\n}\n\n.fa-sack-xmark {\n --fa: "\\e56a";\n}\n\n.fa-school-circle-check {\n --fa: "\\e56b";\n}\n\n.fa-school-circle-exclamation {\n --fa: "\\e56c";\n}\n\n.fa-school-circle-xmark {\n --fa: "\\e56d";\n}\n\n.fa-school-flag {\n --fa: "\\e56e";\n}\n\n.fa-school-lock {\n --fa: "\\e56f";\n}\n\n.fa-sheet-plastic {\n --fa: "\\e571";\n}\n\n.fa-shield-cat {\n --fa: "\\e572";\n}\n\n.fa-shield-dog {\n --fa: "\\e573";\n}\n\n.fa-shield-heart {\n --fa: "\\e574";\n}\n\n.fa-square-nfi {\n --fa: "\\e576";\n}\n\n.fa-square-person-confined {\n --fa: "\\e577";\n}\n\n.fa-square-virus {\n --fa: "\\e578";\n}\n\n.fa-staff-snake {\n --fa: "\\e579";\n}\n\n.fa-rod-asclepius {\n --fa: "\\e579";\n}\n\n.fa-rod-snake {\n --fa: "\\e579";\n}\n\n.fa-staff-aesculapius {\n --fa: "\\e579";\n}\n\n.fa-sun-plant-wilt {\n --fa: "\\e57a";\n}\n\n.fa-tarp {\n --fa: "\\e57b";\n}\n\n.fa-tarp-droplet {\n --fa: "\\e57c";\n}\n\n.fa-tent {\n --fa: "\\e57d";\n}\n\n.fa-tent-arrow-down-to-line {\n --fa: "\\e57e";\n}\n\n.fa-tent-arrow-left-right {\n --fa: "\\e57f";\n}\n\n.fa-tent-arrow-turn-left {\n --fa: "\\e580";\n}\n\n.fa-tent-arrows-down {\n --fa: "\\e581";\n}\n\n.fa-tents {\n --fa: "\\e582";\n}\n\n.fa-toilet-portable {\n --fa: "\\e583";\n}\n\n.fa-toilets-portable {\n --fa: "\\e584";\n}\n\n.fa-tower-cell {\n --fa: "\\e585";\n}\n\n.fa-tower-observation {\n --fa: "\\e586";\n}\n\n.fa-tree-city {\n --fa: "\\e587";\n}\n\n.fa-trowel {\n --fa: "\\e589";\n}\n\n.fa-trowel-bricks {\n --fa: "\\e58a";\n}\n\n.fa-truck-arrow-right {\n --fa: "\\e58b";\n}\n\n.fa-truck-droplet {\n --fa: "\\e58c";\n}\n\n.fa-truck-field {\n --fa: "\\e58d";\n}\n\n.fa-truck-field-un {\n --fa: "\\e58e";\n}\n\n.fa-truck-plane {\n --fa: "\\e58f";\n}\n\n.fa-users-between-lines {\n --fa: "\\e591";\n}\n\n.fa-users-line {\n --fa: "\\e592";\n}\n\n.fa-users-rays {\n --fa: "\\e593";\n}\n\n.fa-users-rectangle {\n --fa: "\\e594";\n}\n\n.fa-users-viewfinder {\n --fa: "\\e595";\n}\n\n.fa-vial-circle-check {\n --fa: "\\e596";\n}\n\n.fa-vial-virus {\n --fa: "\\e597";\n}\n\n.fa-wheat-awn-circle-exclamation {\n --fa: "\\e598";\n}\n\n.fa-worm {\n --fa: "\\e599";\n}\n\n.fa-xmarks-lines {\n --fa: "\\e59a";\n}\n\n.fa-child-dress {\n --fa: "\\e59c";\n}\n\n.fa-child-reaching {\n --fa: "\\e59d";\n}\n\n.fa-file-circle-check {\n --fa: "\\e5a0";\n}\n\n.fa-file-circle-xmark {\n --fa: "\\e5a1";\n}\n\n.fa-person-through-window {\n --fa: "\\e5a9";\n}\n\n.fa-plant-wilt {\n --fa: "\\e5aa";\n}\n\n.fa-stapler {\n --fa: "\\e5af";\n}\n\n.fa-train-tram {\n --fa: "\\e5b4";\n}\n\n.fa-table-cells-column-lock {\n --fa: "\\e678";\n}\n\n.fa-table-cells-row-lock {\n --fa: "\\e67a";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-thumbtack-slash {\n --fa: "\\e68f";\n}\n\n.fa-thumb-tack-slash {\n --fa: "\\e68f";\n}\n\n.fa-table-cells-row-unlock {\n --fa: "\\e691";\n}\n\n.fa-chart-diagram {\n --fa: "\\e695";\n}\n\n.fa-comment-nodes {\n --fa: "\\e696";\n}\n\n.fa-file-fragment {\n --fa: "\\e697";\n}\n\n.fa-file-half-dashed {\n --fa: "\\e698";\n}\n\n.fa-hexagon-nodes {\n --fa: "\\e699";\n}\n\n.fa-hexagon-nodes-bolt {\n --fa: "\\e69a";\n}\n\n.fa-square-binary {\n --fa: "\\e69b";\n}\n\n.fa-pentagon {\n --fa: "\\e790";\n}\n\n.fa-non-binary {\n --fa: "\\e807";\n}\n\n.fa-spiral {\n --fa: "\\e80a";\n}\n\n.fa-mobile-vibrate {\n --fa: "\\e816";\n}\n\n.fa-single-quote-left {\n --fa: "\\e81b";\n}\n\n.fa-single-quote-right {\n --fa: "\\e81c";\n}\n\n.fa-bus-side {\n --fa: "\\e81d";\n}\n\n.fa-septagon {\n --fa: "\\e820";\n}\n\n.fa-heptagon {\n --fa: "\\e820";\n}\n\n.fa-martini-glass-empty {\n --fa: "\\f000";\n}\n\n.fa-glass-martini {\n --fa: "\\f000";\n}\n\n.fa-music {\n --fa: "\\f001";\n}\n\n.fa-magnifying-glass {\n --fa: "\\f002";\n}\n\n.fa-search {\n --fa: "\\f002";\n}\n\n.fa-heart {\n --fa: "\\f004";\n}\n\n.fa-star {\n --fa: "\\f005";\n}\n\n.fa-user {\n --fa: "\\f007";\n}\n\n.fa-user-alt {\n --fa: "\\f007";\n}\n\n.fa-user-large {\n --fa: "\\f007";\n}\n\n.fa-film {\n --fa: "\\f008";\n}\n\n.fa-film-alt {\n --fa: "\\f008";\n}\n\n.fa-film-simple {\n --fa: "\\f008";\n}\n\n.fa-table-cells-large {\n --fa: "\\f009";\n}\n\n.fa-th-large {\n --fa: "\\f009";\n}\n\n.fa-table-cells {\n --fa: "\\f00a";\n}\n\n.fa-th {\n --fa: "\\f00a";\n}\n\n.fa-table-list {\n --fa: "\\f00b";\n}\n\n.fa-th-list {\n --fa: "\\f00b";\n}\n\n.fa-check {\n --fa: "\\f00c";\n}\n\n.fa-xmark {\n --fa: "\\f00d";\n}\n\n.fa-close {\n --fa: "\\f00d";\n}\n\n.fa-multiply {\n --fa: "\\f00d";\n}\n\n.fa-remove {\n --fa: "\\f00d";\n}\n\n.fa-times {\n --fa: "\\f00d";\n}\n\n.fa-magnifying-glass-plus {\n --fa: "\\f00e";\n}\n\n.fa-search-plus {\n --fa: "\\f00e";\n}\n\n.fa-magnifying-glass-minus {\n --fa: "\\f010";\n}\n\n.fa-search-minus {\n --fa: "\\f010";\n}\n\n.fa-power-off {\n --fa: "\\f011";\n}\n\n.fa-signal {\n --fa: "\\f012";\n}\n\n.fa-signal-5 {\n --fa: "\\f012";\n}\n\n.fa-signal-perfect {\n --fa: "\\f012";\n}\n\n.fa-gear {\n --fa: "\\f013";\n}\n\n.fa-cog {\n --fa: "\\f013";\n}\n\n.fa-house {\n --fa: "\\f015";\n}\n\n.fa-home {\n --fa: "\\f015";\n}\n\n.fa-home-alt {\n --fa: "\\f015";\n}\n\n.fa-home-lg-alt {\n --fa: "\\f015";\n}\n\n.fa-clock {\n --fa: "\\f017";\n}\n\n.fa-clock-four {\n --fa: "\\f017";\n}\n\n.fa-road {\n --fa: "\\f018";\n}\n\n.fa-download {\n --fa: "\\f019";\n}\n\n.fa-inbox {\n --fa: "\\f01c";\n}\n\n.fa-arrow-rotate-right {\n --fa: "\\f01e";\n}\n\n.fa-arrow-right-rotate {\n --fa: "\\f01e";\n}\n\n.fa-arrow-rotate-forward {\n --fa: "\\f01e";\n}\n\n.fa-redo {\n --fa: "\\f01e";\n}\n\n.fa-arrows-rotate {\n --fa: "\\f021";\n}\n\n.fa-refresh {\n --fa: "\\f021";\n}\n\n.fa-sync {\n --fa: "\\f021";\n}\n\n.fa-rectangle-list {\n --fa: "\\f022";\n}\n\n.fa-list-alt {\n --fa: "\\f022";\n}\n\n.fa-lock {\n --fa: "\\f023";\n}\n\n.fa-flag {\n --fa: "\\f024";\n}\n\n.fa-headphones {\n --fa: "\\f025";\n}\n\n.fa-headphones-alt {\n --fa: "\\f025";\n}\n\n.fa-headphones-simple {\n --fa: "\\f025";\n}\n\n.fa-volume-off {\n --fa: "\\f026";\n}\n\n.fa-volume-low {\n --fa: "\\f027";\n}\n\n.fa-volume-down {\n --fa: "\\f027";\n}\n\n.fa-volume-high {\n --fa: "\\f028";\n}\n\n.fa-volume-up {\n --fa: "\\f028";\n}\n\n.fa-qrcode {\n --fa: "\\f029";\n}\n\n.fa-barcode {\n --fa: "\\f02a";\n}\n\n.fa-tag {\n --fa: "\\f02b";\n}\n\n.fa-tags {\n --fa: "\\f02c";\n}\n\n.fa-book {\n --fa: "\\f02d";\n}\n\n.fa-bookmark {\n --fa: "\\f02e";\n}\n\n.fa-print {\n --fa: "\\f02f";\n}\n\n.fa-camera {\n --fa: "\\f030";\n}\n\n.fa-camera-alt {\n --fa: "\\f030";\n}\n\n.fa-font {\n --fa: "\\f031";\n}\n\n.fa-bold {\n --fa: "\\f032";\n}\n\n.fa-italic {\n --fa: "\\f033";\n}\n\n.fa-text-height {\n --fa: "\\f034";\n}\n\n.fa-text-width {\n --fa: "\\f035";\n}\n\n.fa-align-left {\n --fa: "\\f036";\n}\n\n.fa-align-center {\n --fa: "\\f037";\n}\n\n.fa-align-right {\n --fa: "\\f038";\n}\n\n.fa-align-justify {\n --fa: "\\f039";\n}\n\n.fa-list {\n --fa: "\\f03a";\n}\n\n.fa-list-squares {\n --fa: "\\f03a";\n}\n\n.fa-outdent {\n --fa: "\\f03b";\n}\n\n.fa-dedent {\n --fa: "\\f03b";\n}\n\n.fa-indent {\n --fa: "\\f03c";\n}\n\n.fa-video {\n --fa: "\\f03d";\n}\n\n.fa-video-camera {\n --fa: "\\f03d";\n}\n\n.fa-image {\n --fa: "\\f03e";\n}\n\n.fa-location-pin {\n --fa: "\\f041";\n}\n\n.fa-map-marker {\n --fa: "\\f041";\n}\n\n.fa-circle-half-stroke {\n --fa: "\\f042";\n}\n\n.fa-adjust {\n --fa: "\\f042";\n}\n\n.fa-droplet {\n --fa: "\\f043";\n}\n\n.fa-tint {\n --fa: "\\f043";\n}\n\n.fa-pen-to-square {\n --fa: "\\f044";\n}\n\n.fa-edit {\n --fa: "\\f044";\n}\n\n.fa-arrows-up-down-left-right {\n --fa: "\\f047";\n}\n\n.fa-arrows {\n --fa: "\\f047";\n}\n\n.fa-backward-step {\n --fa: "\\f048";\n}\n\n.fa-step-backward {\n --fa: "\\f048";\n}\n\n.fa-backward-fast {\n --fa: "\\f049";\n}\n\n.fa-fast-backward {\n --fa: "\\f049";\n}\n\n.fa-backward {\n --fa: "\\f04a";\n}\n\n.fa-play {\n --fa: "\\f04b";\n}\n\n.fa-pause {\n --fa: "\\f04c";\n}\n\n.fa-stop {\n --fa: "\\f04d";\n}\n\n.fa-forward {\n --fa: "\\f04e";\n}\n\n.fa-forward-fast {\n --fa: "\\f050";\n}\n\n.fa-fast-forward {\n --fa: "\\f050";\n}\n\n.fa-forward-step {\n --fa: "\\f051";\n}\n\n.fa-step-forward {\n --fa: "\\f051";\n}\n\n.fa-eject {\n --fa: "\\f052";\n}\n\n.fa-chevron-left {\n --fa: "\\f053";\n}\n\n.fa-chevron-right {\n --fa: "\\f054";\n}\n\n.fa-circle-plus {\n --fa: "\\f055";\n}\n\n.fa-plus-circle {\n --fa: "\\f055";\n}\n\n.fa-circle-minus {\n --fa: "\\f056";\n}\n\n.fa-minus-circle {\n --fa: "\\f056";\n}\n\n.fa-circle-xmark {\n --fa: "\\f057";\n}\n\n.fa-times-circle {\n --fa: "\\f057";\n}\n\n.fa-xmark-circle {\n --fa: "\\f057";\n}\n\n.fa-circle-check {\n --fa: "\\f058";\n}\n\n.fa-check-circle {\n --fa: "\\f058";\n}\n\n.fa-circle-question {\n --fa: "\\f059";\n}\n\n.fa-question-circle {\n --fa: "\\f059";\n}\n\n.fa-circle-info {\n --fa: "\\f05a";\n}\n\n.fa-info-circle {\n --fa: "\\f05a";\n}\n\n.fa-crosshairs {\n --fa: "\\f05b";\n}\n\n.fa-ban {\n --fa: "\\f05e";\n}\n\n.fa-cancel {\n --fa: "\\f05e";\n}\n\n.fa-arrow-left {\n --fa: "\\f060";\n}\n\n.fa-arrow-right {\n --fa: "\\f061";\n}\n\n.fa-arrow-up {\n --fa: "\\f062";\n}\n\n.fa-arrow-down {\n --fa: "\\f063";\n}\n\n.fa-share {\n --fa: "\\f064";\n}\n\n.fa-mail-forward {\n --fa: "\\f064";\n}\n\n.fa-expand {\n --fa: "\\f065";\n}\n\n.fa-compress {\n --fa: "\\f066";\n}\n\n.fa-minus {\n --fa: "\\f068";\n}\n\n.fa-subtract {\n --fa: "\\f068";\n}\n\n.fa-circle-exclamation {\n --fa: "\\f06a";\n}\n\n.fa-exclamation-circle {\n --fa: "\\f06a";\n}\n\n.fa-gift {\n --fa: "\\f06b";\n}\n\n.fa-leaf {\n --fa: "\\f06c";\n}\n\n.fa-fire {\n --fa: "\\f06d";\n}\n\n.fa-eye {\n --fa: "\\f06e";\n}\n\n.fa-eye-slash {\n --fa: "\\f070";\n}\n\n.fa-triangle-exclamation {\n --fa: "\\f071";\n}\n\n.fa-exclamation-triangle {\n --fa: "\\f071";\n}\n\n.fa-warning {\n --fa: "\\f071";\n}\n\n.fa-plane {\n --fa: "\\f072";\n}\n\n.fa-calendar-days {\n --fa: "\\f073";\n}\n\n.fa-calendar-alt {\n --fa: "\\f073";\n}\n\n.fa-shuffle {\n --fa: "\\f074";\n}\n\n.fa-random {\n --fa: "\\f074";\n}\n\n.fa-comment {\n --fa: "\\f075";\n}\n\n.fa-magnet {\n --fa: "\\f076";\n}\n\n.fa-chevron-up {\n --fa: "\\f077";\n}\n\n.fa-chevron-down {\n --fa: "\\f078";\n}\n\n.fa-retweet {\n --fa: "\\f079";\n}\n\n.fa-cart-shopping {\n --fa: "\\f07a";\n}\n\n.fa-shopping-cart {\n --fa: "\\f07a";\n}\n\n.fa-folder {\n --fa: "\\f07b";\n}\n\n.fa-folder-blank {\n --fa: "\\f07b";\n}\n\n.fa-folder-open {\n --fa: "\\f07c";\n}\n\n.fa-arrows-up-down {\n --fa: "\\f07d";\n}\n\n.fa-arrows-v {\n --fa: "\\f07d";\n}\n\n.fa-arrows-left-right {\n --fa: "\\f07e";\n}\n\n.fa-arrows-h {\n --fa: "\\f07e";\n}\n\n.fa-chart-bar {\n --fa: "\\f080";\n}\n\n.fa-bar-chart {\n --fa: "\\f080";\n}\n\n.fa-camera-retro {\n --fa: "\\f083";\n}\n\n.fa-key {\n --fa: "\\f084";\n}\n\n.fa-gears {\n --fa: "\\f085";\n}\n\n.fa-cogs {\n --fa: "\\f085";\n}\n\n.fa-comments {\n --fa: "\\f086";\n}\n\n.fa-star-half {\n --fa: "\\f089";\n}\n\n.fa-arrow-right-from-bracket {\n --fa: "\\f08b";\n}\n\n.fa-sign-out {\n --fa: "\\f08b";\n}\n\n.fa-thumbtack {\n --fa: "\\f08d";\n}\n\n.fa-thumb-tack {\n --fa: "\\f08d";\n}\n\n.fa-arrow-up-right-from-square {\n --fa: "\\f08e";\n}\n\n.fa-external-link {\n --fa: "\\f08e";\n}\n\n.fa-arrow-right-to-bracket {\n --fa: "\\f090";\n}\n\n.fa-sign-in {\n --fa: "\\f090";\n}\n\n.fa-trophy {\n --fa: "\\f091";\n}\n\n.fa-upload {\n --fa: "\\f093";\n}\n\n.fa-lemon {\n --fa: "\\f094";\n}\n\n.fa-phone {\n --fa: "\\f095";\n}\n\n.fa-square-phone {\n --fa: "\\f098";\n}\n\n.fa-phone-square {\n --fa: "\\f098";\n}\n\n.fa-unlock {\n --fa: "\\f09c";\n}\n\n.fa-credit-card {\n --fa: "\\f09d";\n}\n\n.fa-credit-card-alt {\n --fa: "\\f09d";\n}\n\n.fa-rss {\n --fa: "\\f09e";\n}\n\n.fa-feed {\n --fa: "\\f09e";\n}\n\n.fa-hard-drive {\n --fa: "\\f0a0";\n}\n\n.fa-hdd {\n --fa: "\\f0a0";\n}\n\n.fa-bullhorn {\n --fa: "\\f0a1";\n}\n\n.fa-certificate {\n --fa: "\\f0a3";\n}\n\n.fa-hand-point-right {\n --fa: "\\f0a4";\n}\n\n.fa-hand-point-left {\n --fa: "\\f0a5";\n}\n\n.fa-hand-point-up {\n --fa: "\\f0a6";\n}\n\n.fa-hand-point-down {\n --fa: "\\f0a7";\n}\n\n.fa-circle-arrow-left {\n --fa: "\\f0a8";\n}\n\n.fa-arrow-circle-left {\n --fa: "\\f0a8";\n}\n\n.fa-circle-arrow-right {\n --fa: "\\f0a9";\n}\n\n.fa-arrow-circle-right {\n --fa: "\\f0a9";\n}\n\n.fa-circle-arrow-up {\n --fa: "\\f0aa";\n}\n\n.fa-arrow-circle-up {\n --fa: "\\f0aa";\n}\n\n.fa-circle-arrow-down {\n --fa: "\\f0ab";\n}\n\n.fa-arrow-circle-down {\n --fa: "\\f0ab";\n}\n\n.fa-globe {\n --fa: "\\f0ac";\n}\n\n.fa-wrench {\n --fa: "\\f0ad";\n}\n\n.fa-list-check {\n --fa: "\\f0ae";\n}\n\n.fa-tasks {\n --fa: "\\f0ae";\n}\n\n.fa-filter {\n --fa: "\\f0b0";\n}\n\n.fa-briefcase {\n --fa: "\\f0b1";\n}\n\n.fa-up-down-left-right {\n --fa: "\\f0b2";\n}\n\n.fa-arrows-alt {\n --fa: "\\f0b2";\n}\n\n.fa-users {\n --fa: "\\f0c0";\n}\n\n.fa-link {\n --fa: "\\f0c1";\n}\n\n.fa-chain {\n --fa: "\\f0c1";\n}\n\n.fa-cloud {\n --fa: "\\f0c2";\n}\n\n.fa-flask {\n --fa: "\\f0c3";\n}\n\n.fa-scissors {\n --fa: "\\f0c4";\n}\n\n.fa-cut {\n --fa: "\\f0c4";\n}\n\n.fa-copy {\n --fa: "\\f0c5";\n}\n\n.fa-paperclip {\n --fa: "\\f0c6";\n}\n\n.fa-floppy-disk {\n --fa: "\\f0c7";\n}\n\n.fa-save {\n --fa: "\\f0c7";\n}\n\n.fa-square {\n --fa: "\\f0c8";\n}\n\n.fa-bars {\n --fa: "\\f0c9";\n}\n\n.fa-navicon {\n --fa: "\\f0c9";\n}\n\n.fa-list-ul {\n --fa: "\\f0ca";\n}\n\n.fa-list-dots {\n --fa: "\\f0ca";\n}\n\n.fa-list-ol {\n --fa: "\\f0cb";\n}\n\n.fa-list-1-2 {\n --fa: "\\f0cb";\n}\n\n.fa-list-numeric {\n --fa: "\\f0cb";\n}\n\n.fa-strikethrough {\n --fa: "\\f0cc";\n}\n\n.fa-underline {\n --fa: "\\f0cd";\n}\n\n.fa-table {\n --fa: "\\f0ce";\n}\n\n.fa-wand-magic {\n --fa: "\\f0d0";\n}\n\n.fa-magic {\n --fa: "\\f0d0";\n}\n\n.fa-truck {\n --fa: "\\f0d1";\n}\n\n.fa-money-bill {\n --fa: "\\f0d6";\n}\n\n.fa-caret-down {\n --fa: "\\f0d7";\n}\n\n.fa-caret-up {\n --fa: "\\f0d8";\n}\n\n.fa-caret-left {\n --fa: "\\f0d9";\n}\n\n.fa-caret-right {\n --fa: "\\f0da";\n}\n\n.fa-table-columns {\n --fa: "\\f0db";\n}\n\n.fa-columns {\n --fa: "\\f0db";\n}\n\n.fa-sort {\n --fa: "\\f0dc";\n}\n\n.fa-unsorted {\n --fa: "\\f0dc";\n}\n\n.fa-sort-down {\n --fa: "\\f0dd";\n}\n\n.fa-sort-desc {\n --fa: "\\f0dd";\n}\n\n.fa-sort-up {\n --fa: "\\f0de";\n}\n\n.fa-sort-asc {\n --fa: "\\f0de";\n}\n\n.fa-envelope {\n --fa: "\\f0e0";\n}\n\n.fa-arrow-rotate-left {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-left-rotate {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-back {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-backward {\n --fa: "\\f0e2";\n}\n\n.fa-undo {\n --fa: "\\f0e2";\n}\n\n.fa-gavel {\n --fa: "\\f0e3";\n}\n\n.fa-legal {\n --fa: "\\f0e3";\n}\n\n.fa-bolt {\n --fa: "\\f0e7";\n}\n\n.fa-zap {\n --fa: "\\f0e7";\n}\n\n.fa-sitemap {\n --fa: "\\f0e8";\n}\n\n.fa-umbrella {\n --fa: "\\f0e9";\n}\n\n.fa-paste {\n --fa: "\\f0ea";\n}\n\n.fa-file-clipboard {\n --fa: "\\f0ea";\n}\n\n.fa-lightbulb {\n --fa: "\\f0eb";\n}\n\n.fa-arrow-right-arrow-left {\n --fa: "\\f0ec";\n}\n\n.fa-exchange {\n --fa: "\\f0ec";\n}\n\n.fa-cloud-arrow-down {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download-alt {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-arrow-up {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload-alt {\n --fa: "\\f0ee";\n}\n\n.fa-user-doctor {\n --fa: "\\f0f0";\n}\n\n.fa-user-md {\n --fa: "\\f0f0";\n}\n\n.fa-stethoscope {\n --fa: "\\f0f1";\n}\n\n.fa-suitcase {\n --fa: "\\f0f2";\n}\n\n.fa-bell {\n --fa: "\\f0f3";\n}\n\n.fa-mug-saucer {\n --fa: "\\f0f4";\n}\n\n.fa-coffee {\n --fa: "\\f0f4";\n}\n\n.fa-hospital {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-alt {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-wide {\n --fa: "\\f0f8";\n}\n\n.fa-truck-medical {\n --fa: "\\f0f9";\n}\n\n.fa-ambulance {\n --fa: "\\f0f9";\n}\n\n.fa-suitcase-medical {\n --fa: "\\f0fa";\n}\n\n.fa-medkit {\n --fa: "\\f0fa";\n}\n\n.fa-jet-fighter {\n --fa: "\\f0fb";\n}\n\n.fa-fighter-jet {\n --fa: "\\f0fb";\n}\n\n.fa-beer-mug-empty {\n --fa: "\\f0fc";\n}\n\n.fa-beer {\n --fa: "\\f0fc";\n}\n\n.fa-square-h {\n --fa: "\\f0fd";\n}\n\n.fa-h-square {\n --fa: "\\f0fd";\n}\n\n.fa-square-plus {\n --fa: "\\f0fe";\n}\n\n.fa-plus-square {\n --fa: "\\f0fe";\n}\n\n.fa-angles-left {\n --fa: "\\f100";\n}\n\n.fa-angle-double-left {\n --fa: "\\f100";\n}\n\n.fa-angles-right {\n --fa: "\\f101";\n}\n\n.fa-angle-double-right {\n --fa: "\\f101";\n}\n\n.fa-angles-up {\n --fa: "\\f102";\n}\n\n.fa-angle-double-up {\n --fa: "\\f102";\n}\n\n.fa-angles-down {\n --fa: "\\f103";\n}\n\n.fa-angle-double-down {\n --fa: "\\f103";\n}\n\n.fa-angle-left {\n --fa: "\\f104";\n}\n\n.fa-angle-right {\n --fa: "\\f105";\n}\n\n.fa-angle-up {\n --fa: "\\f106";\n}\n\n.fa-angle-down {\n --fa: "\\f107";\n}\n\n.fa-laptop {\n --fa: "\\f109";\n}\n\n.fa-tablet-button {\n --fa: "\\f10a";\n}\n\n.fa-mobile-button {\n --fa: "\\f10b";\n}\n\n.fa-quote-left {\n --fa: "\\f10d";\n}\n\n.fa-quote-left-alt {\n --fa: "\\f10d";\n}\n\n.fa-quote-right {\n --fa: "\\f10e";\n}\n\n.fa-quote-right-alt {\n --fa: "\\f10e";\n}\n\n.fa-spinner {\n --fa: "\\f110";\n}\n\n.fa-circle {\n --fa: "\\f111";\n}\n\n.fa-face-smile {\n --fa: "\\f118";\n}\n\n.fa-smile {\n --fa: "\\f118";\n}\n\n.fa-face-frown {\n --fa: "\\f119";\n}\n\n.fa-frown {\n --fa: "\\f119";\n}\n\n.fa-face-meh {\n --fa: "\\f11a";\n}\n\n.fa-meh {\n --fa: "\\f11a";\n}\n\n.fa-gamepad {\n --fa: "\\f11b";\n}\n\n.fa-keyboard {\n --fa: "\\f11c";\n}\n\n.fa-flag-checkered {\n --fa: "\\f11e";\n}\n\n.fa-terminal {\n --fa: "\\f120";\n}\n\n.fa-code {\n --fa: "\\f121";\n}\n\n.fa-reply-all {\n --fa: "\\f122";\n}\n\n.fa-mail-reply-all {\n --fa: "\\f122";\n}\n\n.fa-location-arrow {\n --fa: "\\f124";\n}\n\n.fa-crop {\n --fa: "\\f125";\n}\n\n.fa-code-branch {\n --fa: "\\f126";\n}\n\n.fa-link-slash {\n --fa: "\\f127";\n}\n\n.fa-chain-broken {\n --fa: "\\f127";\n}\n\n.fa-chain-slash {\n --fa: "\\f127";\n}\n\n.fa-unlink {\n --fa: "\\f127";\n}\n\n.fa-info {\n --fa: "\\f129";\n}\n\n.fa-superscript {\n --fa: "\\f12b";\n}\n\n.fa-subscript {\n --fa: "\\f12c";\n}\n\n.fa-eraser {\n --fa: "\\f12d";\n}\n\n.fa-puzzle-piece {\n --fa: "\\f12e";\n}\n\n.fa-microphone {\n --fa: "\\f130";\n}\n\n.fa-microphone-slash {\n --fa: "\\f131";\n}\n\n.fa-shield {\n --fa: "\\f132";\n}\n\n.fa-shield-blank {\n --fa: "\\f132";\n}\n\n.fa-calendar {\n --fa: "\\f133";\n}\n\n.fa-fire-extinguisher {\n --fa: "\\f134";\n}\n\n.fa-rocket {\n --fa: "\\f135";\n}\n\n.fa-circle-chevron-left {\n --fa: "\\f137";\n}\n\n.fa-chevron-circle-left {\n --fa: "\\f137";\n}\n\n.fa-circle-chevron-right {\n --fa: "\\f138";\n}\n\n.fa-chevron-circle-right {\n --fa: "\\f138";\n}\n\n.fa-circle-chevron-up {\n --fa: "\\f139";\n}\n\n.fa-chevron-circle-up {\n --fa: "\\f139";\n}\n\n.fa-circle-chevron-down {\n --fa: "\\f13a";\n}\n\n.fa-chevron-circle-down {\n --fa: "\\f13a";\n}\n\n.fa-anchor {\n --fa: "\\f13d";\n}\n\n.fa-unlock-keyhole {\n --fa: "\\f13e";\n}\n\n.fa-unlock-alt {\n --fa: "\\f13e";\n}\n\n.fa-bullseye {\n --fa: "\\f140";\n}\n\n.fa-ellipsis {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-h {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-vertical {\n --fa: "\\f142";\n}\n\n.fa-ellipsis-v {\n --fa: "\\f142";\n}\n\n.fa-square-rss {\n --fa: "\\f143";\n}\n\n.fa-rss-square {\n --fa: "\\f143";\n}\n\n.fa-circle-play {\n --fa: "\\f144";\n}\n\n.fa-play-circle {\n --fa: "\\f144";\n}\n\n.fa-ticket {\n --fa: "\\f145";\n}\n\n.fa-square-minus {\n --fa: "\\f146";\n}\n\n.fa-minus-square {\n --fa: "\\f146";\n}\n\n.fa-arrow-turn-up {\n --fa: "\\f148";\n}\n\n.fa-level-up {\n --fa: "\\f148";\n}\n\n.fa-arrow-turn-down {\n --fa: "\\f149";\n}\n\n.fa-level-down {\n --fa: "\\f149";\n}\n\n.fa-square-check {\n --fa: "\\f14a";\n}\n\n.fa-check-square {\n --fa: "\\f14a";\n}\n\n.fa-square-pen {\n --fa: "\\f14b";\n}\n\n.fa-pen-square {\n --fa: "\\f14b";\n}\n\n.fa-pencil-square {\n --fa: "\\f14b";\n}\n\n.fa-square-arrow-up-right {\n --fa: "\\f14c";\n}\n\n.fa-external-link-square {\n --fa: "\\f14c";\n}\n\n.fa-share-from-square {\n --fa: "\\f14d";\n}\n\n.fa-share-square {\n --fa: "\\f14d";\n}\n\n.fa-compass {\n --fa: "\\f14e";\n}\n\n.fa-square-caret-down {\n --fa: "\\f150";\n}\n\n.fa-caret-square-down {\n --fa: "\\f150";\n}\n\n.fa-square-caret-up {\n --fa: "\\f151";\n}\n\n.fa-caret-square-up {\n --fa: "\\f151";\n}\n\n.fa-square-caret-right {\n --fa: "\\f152";\n}\n\n.fa-caret-square-right {\n --fa: "\\f152";\n}\n\n.fa-euro-sign {\n --fa: "\\f153";\n}\n\n.fa-eur {\n --fa: "\\f153";\n}\n\n.fa-euro {\n --fa: "\\f153";\n}\n\n.fa-sterling-sign {\n --fa: "\\f154";\n}\n\n.fa-gbp {\n --fa: "\\f154";\n}\n\n.fa-pound-sign {\n --fa: "\\f154";\n}\n\n.fa-rupee-sign {\n --fa: "\\f156";\n}\n\n.fa-rupee {\n --fa: "\\f156";\n}\n\n.fa-yen-sign {\n --fa: "\\f157";\n}\n\n.fa-cny {\n --fa: "\\f157";\n}\n\n.fa-jpy {\n --fa: "\\f157";\n}\n\n.fa-rmb {\n --fa: "\\f157";\n}\n\n.fa-yen {\n --fa: "\\f157";\n}\n\n.fa-ruble-sign {\n --fa: "\\f158";\n}\n\n.fa-rouble {\n --fa: "\\f158";\n}\n\n.fa-rub {\n --fa: "\\f158";\n}\n\n.fa-ruble {\n --fa: "\\f158";\n}\n\n.fa-won-sign {\n --fa: "\\f159";\n}\n\n.fa-krw {\n --fa: "\\f159";\n}\n\n.fa-won {\n --fa: "\\f159";\n}\n\n.fa-file {\n --fa: "\\f15b";\n}\n\n.fa-file-lines {\n --fa: "\\f15c";\n}\n\n.fa-file-alt {\n --fa: "\\f15c";\n}\n\n.fa-file-text {\n --fa: "\\f15c";\n}\n\n.fa-arrow-down-a-z {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-asc {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-down {\n --fa: "\\f15d";\n}\n\n.fa-arrow-up-a-z {\n --fa: "\\f15e";\n}\n\n.fa-sort-alpha-up {\n --fa: "\\f15e";\n}\n\n.fa-arrow-down-wide-short {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-asc {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-down {\n --fa: "\\f160";\n}\n\n.fa-arrow-up-wide-short {\n --fa: "\\f161";\n}\n\n.fa-sort-amount-up {\n --fa: "\\f161";\n}\n\n.fa-arrow-down-1-9 {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-asc {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-down {\n --fa: "\\f162";\n}\n\n.fa-arrow-up-1-9 {\n --fa: "\\f163";\n}\n\n.fa-sort-numeric-up {\n --fa: "\\f163";\n}\n\n.fa-thumbs-up {\n --fa: "\\f164";\n}\n\n.fa-thumbs-down {\n --fa: "\\f165";\n}\n\n.fa-arrow-down-long {\n --fa: "\\f175";\n}\n\n.fa-long-arrow-down {\n --fa: "\\f175";\n}\n\n.fa-arrow-up-long {\n --fa: "\\f176";\n}\n\n.fa-long-arrow-up {\n --fa: "\\f176";\n}\n\n.fa-arrow-left-long {\n --fa: "\\f177";\n}\n\n.fa-long-arrow-left {\n --fa: "\\f177";\n}\n\n.fa-arrow-right-long {\n --fa: "\\f178";\n}\n\n.fa-long-arrow-right {\n --fa: "\\f178";\n}\n\n.fa-person-dress {\n --fa: "\\f182";\n}\n\n.fa-female {\n --fa: "\\f182";\n}\n\n.fa-person {\n --fa: "\\f183";\n}\n\n.fa-male {\n --fa: "\\f183";\n}\n\n.fa-sun {\n --fa: "\\f185";\n}\n\n.fa-moon {\n --fa: "\\f186";\n}\n\n.fa-box-archive {\n --fa: "\\f187";\n}\n\n.fa-archive {\n --fa: "\\f187";\n}\n\n.fa-bug {\n --fa: "\\f188";\n}\n\n.fa-square-caret-left {\n --fa: "\\f191";\n}\n\n.fa-caret-square-left {\n --fa: "\\f191";\n}\n\n.fa-circle-dot {\n --fa: "\\f192";\n}\n\n.fa-dot-circle {\n --fa: "\\f192";\n}\n\n.fa-wheelchair {\n --fa: "\\f193";\n}\n\n.fa-lira-sign {\n --fa: "\\f195";\n}\n\n.fa-shuttle-space {\n --fa: "\\f197";\n}\n\n.fa-space-shuttle {\n --fa: "\\f197";\n}\n\n.fa-square-envelope {\n --fa: "\\f199";\n}\n\n.fa-envelope-square {\n --fa: "\\f199";\n}\n\n.fa-building-columns {\n --fa: "\\f19c";\n}\n\n.fa-bank {\n --fa: "\\f19c";\n}\n\n.fa-institution {\n --fa: "\\f19c";\n}\n\n.fa-museum {\n --fa: "\\f19c";\n}\n\n.fa-university {\n --fa: "\\f19c";\n}\n\n.fa-graduation-cap {\n --fa: "\\f19d";\n}\n\n.fa-mortar-board {\n --fa: "\\f19d";\n}\n\n.fa-language {\n --fa: "\\f1ab";\n}\n\n.fa-fax {\n --fa: "\\f1ac";\n}\n\n.fa-building {\n --fa: "\\f1ad";\n}\n\n.fa-child {\n --fa: "\\f1ae";\n}\n\n.fa-paw {\n --fa: "\\f1b0";\n}\n\n.fa-cube {\n --fa: "\\f1b2";\n}\n\n.fa-cubes {\n --fa: "\\f1b3";\n}\n\n.fa-recycle {\n --fa: "\\f1b8";\n}\n\n.fa-car {\n --fa: "\\f1b9";\n}\n\n.fa-automobile {\n --fa: "\\f1b9";\n}\n\n.fa-taxi {\n --fa: "\\f1ba";\n}\n\n.fa-cab {\n --fa: "\\f1ba";\n}\n\n.fa-tree {\n --fa: "\\f1bb";\n}\n\n.fa-database {\n --fa: "\\f1c0";\n}\n\n.fa-file-pdf {\n --fa: "\\f1c1";\n}\n\n.fa-file-word {\n --fa: "\\f1c2";\n}\n\n.fa-file-excel {\n --fa: "\\f1c3";\n}\n\n.fa-file-powerpoint {\n --fa: "\\f1c4";\n}\n\n.fa-file-image {\n --fa: "\\f1c5";\n}\n\n.fa-file-zipper {\n --fa: "\\f1c6";\n}\n\n.fa-file-archive {\n --fa: "\\f1c6";\n}\n\n.fa-file-audio {\n --fa: "\\f1c7";\n}\n\n.fa-file-video {\n --fa: "\\f1c8";\n}\n\n.fa-file-code {\n --fa: "\\f1c9";\n}\n\n.fa-life-ring {\n --fa: "\\f1cd";\n}\n\n.fa-circle-notch {\n --fa: "\\f1ce";\n}\n\n.fa-paper-plane {\n --fa: "\\f1d8";\n}\n\n.fa-clock-rotate-left {\n --fa: "\\f1da";\n}\n\n.fa-history {\n --fa: "\\f1da";\n}\n\n.fa-heading {\n --fa: "\\f1dc";\n}\n\n.fa-header {\n --fa: "\\f1dc";\n}\n\n.fa-paragraph {\n --fa: "\\f1dd";\n}\n\n.fa-sliders {\n --fa: "\\f1de";\n}\n\n.fa-sliders-h {\n --fa: "\\f1de";\n}\n\n.fa-share-nodes {\n --fa: "\\f1e0";\n}\n\n.fa-share-alt {\n --fa: "\\f1e0";\n}\n\n.fa-square-share-nodes {\n --fa: "\\f1e1";\n}\n\n.fa-share-alt-square {\n --fa: "\\f1e1";\n}\n\n.fa-bomb {\n --fa: "\\f1e2";\n}\n\n.fa-futbol {\n --fa: "\\f1e3";\n}\n\n.fa-futbol-ball {\n --fa: "\\f1e3";\n}\n\n.fa-soccer-ball {\n --fa: "\\f1e3";\n}\n\n.fa-tty {\n --fa: "\\f1e4";\n}\n\n.fa-teletype {\n --fa: "\\f1e4";\n}\n\n.fa-binoculars {\n --fa: "\\f1e5";\n}\n\n.fa-plug {\n --fa: "\\f1e6";\n}\n\n.fa-newspaper {\n --fa: "\\f1ea";\n}\n\n.fa-wifi {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-3 {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-strong {\n --fa: "\\f1eb";\n}\n\n.fa-calculator {\n --fa: "\\f1ec";\n}\n\n.fa-bell-slash {\n --fa: "\\f1f6";\n}\n\n.fa-trash {\n --fa: "\\f1f8";\n}\n\n.fa-copyright {\n --fa: "\\f1f9";\n}\n\n.fa-eye-dropper {\n --fa: "\\f1fb";\n}\n\n.fa-eye-dropper-empty {\n --fa: "\\f1fb";\n}\n\n.fa-eyedropper {\n --fa: "\\f1fb";\n}\n\n.fa-paintbrush {\n --fa: "\\f1fc";\n}\n\n.fa-paint-brush {\n --fa: "\\f1fc";\n}\n\n.fa-cake-candles {\n --fa: "\\f1fd";\n}\n\n.fa-birthday-cake {\n --fa: "\\f1fd";\n}\n\n.fa-cake {\n --fa: "\\f1fd";\n}\n\n.fa-chart-area {\n --fa: "\\f1fe";\n}\n\n.fa-area-chart {\n --fa: "\\f1fe";\n}\n\n.fa-chart-pie {\n --fa: "\\f200";\n}\n\n.fa-pie-chart {\n --fa: "\\f200";\n}\n\n.fa-chart-line {\n --fa: "\\f201";\n}\n\n.fa-line-chart {\n --fa: "\\f201";\n}\n\n.fa-toggle-off {\n --fa: "\\f204";\n}\n\n.fa-toggle-on {\n --fa: "\\f205";\n}\n\n.fa-bicycle {\n --fa: "\\f206";\n}\n\n.fa-bus {\n --fa: "\\f207";\n}\n\n.fa-closed-captioning {\n --fa: "\\f20a";\n}\n\n.fa-shekel-sign {\n --fa: "\\f20b";\n}\n\n.fa-ils {\n --fa: "\\f20b";\n}\n\n.fa-shekel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel-sign {\n --fa: "\\f20b";\n}\n\n.fa-cart-plus {\n --fa: "\\f217";\n}\n\n.fa-cart-arrow-down {\n --fa: "\\f218";\n}\n\n.fa-diamond {\n --fa: "\\f219";\n}\n\n.fa-ship {\n --fa: "\\f21a";\n}\n\n.fa-user-secret {\n --fa: "\\f21b";\n}\n\n.fa-motorcycle {\n --fa: "\\f21c";\n}\n\n.fa-street-view {\n --fa: "\\f21d";\n}\n\n.fa-heart-pulse {\n --fa: "\\f21e";\n}\n\n.fa-heartbeat {\n --fa: "\\f21e";\n}\n\n.fa-venus {\n --fa: "\\f221";\n}\n\n.fa-mars {\n --fa: "\\f222";\n}\n\n.fa-mercury {\n --fa: "\\f223";\n}\n\n.fa-mars-and-venus {\n --fa: "\\f224";\n}\n\n.fa-transgender {\n --fa: "\\f225";\n}\n\n.fa-transgender-alt {\n --fa: "\\f225";\n}\n\n.fa-venus-double {\n --fa: "\\f226";\n}\n\n.fa-mars-double {\n --fa: "\\f227";\n}\n\n.fa-venus-mars {\n --fa: "\\f228";\n}\n\n.fa-mars-stroke {\n --fa: "\\f229";\n}\n\n.fa-mars-stroke-up {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-v {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-right {\n --fa: "\\f22b";\n}\n\n.fa-mars-stroke-h {\n --fa: "\\f22b";\n}\n\n.fa-neuter {\n --fa: "\\f22c";\n}\n\n.fa-genderless {\n --fa: "\\f22d";\n}\n\n.fa-server {\n --fa: "\\f233";\n}\n\n.fa-user-plus {\n --fa: "\\f234";\n}\n\n.fa-user-xmark {\n --fa: "\\f235";\n}\n\n.fa-user-times {\n --fa: "\\f235";\n}\n\n.fa-bed {\n --fa: "\\f236";\n}\n\n.fa-train {\n --fa: "\\f238";\n}\n\n.fa-train-subway {\n --fa: "\\f239";\n}\n\n.fa-subway {\n --fa: "\\f239";\n}\n\n.fa-battery-full {\n --fa: "\\f240";\n}\n\n.fa-battery {\n --fa: "\\f240";\n}\n\n.fa-battery-5 {\n --fa: "\\f240";\n}\n\n.fa-battery-three-quarters {\n --fa: "\\f241";\n}\n\n.fa-battery-4 {\n --fa: "\\f241";\n}\n\n.fa-battery-half {\n --fa: "\\f242";\n}\n\n.fa-battery-3 {\n --fa: "\\f242";\n}\n\n.fa-battery-quarter {\n --fa: "\\f243";\n}\n\n.fa-battery-2 {\n --fa: "\\f243";\n}\n\n.fa-battery-empty {\n --fa: "\\f244";\n}\n\n.fa-battery-0 {\n --fa: "\\f244";\n}\n\n.fa-arrow-pointer {\n --fa: "\\f245";\n}\n\n.fa-mouse-pointer {\n --fa: "\\f245";\n}\n\n.fa-i-cursor {\n --fa: "\\f246";\n}\n\n.fa-object-group {\n --fa: "\\f247";\n}\n\n.fa-object-ungroup {\n --fa: "\\f248";\n}\n\n.fa-note-sticky {\n --fa: "\\f249";\n}\n\n.fa-sticky-note {\n --fa: "\\f249";\n}\n\n.fa-clone {\n --fa: "\\f24d";\n}\n\n.fa-scale-balanced {\n --fa: "\\f24e";\n}\n\n.fa-balance-scale {\n --fa: "\\f24e";\n}\n\n.fa-hourglass-start {\n --fa: "\\f251";\n}\n\n.fa-hourglass-1 {\n --fa: "\\f251";\n}\n\n.fa-hourglass-half {\n --fa: "\\f252";\n}\n\n.fa-hourglass-2 {\n --fa: "\\f252";\n}\n\n.fa-hourglass-end {\n --fa: "\\f253";\n}\n\n.fa-hourglass-3 {\n --fa: "\\f253";\n}\n\n.fa-hourglass {\n --fa: "\\f254";\n}\n\n.fa-hourglass-empty {\n --fa: "\\f254";\n}\n\n.fa-hand-back-fist {\n --fa: "\\f255";\n}\n\n.fa-hand-rock {\n --fa: "\\f255";\n}\n\n.fa-hand {\n --fa: "\\f256";\n}\n\n.fa-hand-paper {\n --fa: "\\f256";\n}\n\n.fa-hand-scissors {\n --fa: "\\f257";\n}\n\n.fa-hand-lizard {\n --fa: "\\f258";\n}\n\n.fa-hand-spock {\n --fa: "\\f259";\n}\n\n.fa-hand-pointer {\n --fa: "\\f25a";\n}\n\n.fa-hand-peace {\n --fa: "\\f25b";\n}\n\n.fa-trademark {\n --fa: "\\f25c";\n}\n\n.fa-registered {\n --fa: "\\f25d";\n}\n\n.fa-tv {\n --fa: "\\f26c";\n}\n\n.fa-television {\n --fa: "\\f26c";\n}\n\n.fa-tv-alt {\n --fa: "\\f26c";\n}\n\n.fa-calendar-plus {\n --fa: "\\f271";\n}\n\n.fa-calendar-minus {\n --fa: "\\f272";\n}\n\n.fa-calendar-xmark {\n --fa: "\\f273";\n}\n\n.fa-calendar-times {\n --fa: "\\f273";\n}\n\n.fa-calendar-check {\n --fa: "\\f274";\n}\n\n.fa-industry {\n --fa: "\\f275";\n}\n\n.fa-map-pin {\n --fa: "\\f276";\n}\n\n.fa-signs-post {\n --fa: "\\f277";\n}\n\n.fa-map-signs {\n --fa: "\\f277";\n}\n\n.fa-map {\n --fa: "\\f279";\n}\n\n.fa-message {\n --fa: "\\f27a";\n}\n\n.fa-comment-alt {\n --fa: "\\f27a";\n}\n\n.fa-circle-pause {\n --fa: "\\f28b";\n}\n\n.fa-pause-circle {\n --fa: "\\f28b";\n}\n\n.fa-circle-stop {\n --fa: "\\f28d";\n}\n\n.fa-stop-circle {\n --fa: "\\f28d";\n}\n\n.fa-bag-shopping {\n --fa: "\\f290";\n}\n\n.fa-shopping-bag {\n --fa: "\\f290";\n}\n\n.fa-basket-shopping {\n --fa: "\\f291";\n}\n\n.fa-shopping-basket {\n --fa: "\\f291";\n}\n\n.fa-universal-access {\n --fa: "\\f29a";\n}\n\n.fa-person-walking-with-cane {\n --fa: "\\f29d";\n}\n\n.fa-blind {\n --fa: "\\f29d";\n}\n\n.fa-audio-description {\n --fa: "\\f29e";\n}\n\n.fa-phone-volume {\n --fa: "\\f2a0";\n}\n\n.fa-volume-control-phone {\n --fa: "\\f2a0";\n}\n\n.fa-braille {\n --fa: "\\f2a1";\n}\n\n.fa-ear-listen {\n --fa: "\\f2a2";\n}\n\n.fa-assistive-listening-systems {\n --fa: "\\f2a2";\n}\n\n.fa-hands-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-hands-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-ear-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deafness {\n --fa: "\\f2a4";\n}\n\n.fa-hard-of-hearing {\n --fa: "\\f2a4";\n}\n\n.fa-hands {\n --fa: "\\f2a7";\n}\n\n.fa-sign-language {\n --fa: "\\f2a7";\n}\n\n.fa-signing {\n --fa: "\\f2a7";\n}\n\n.fa-eye-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-handshake {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-alt {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-simple {\n --fa: "\\f2b5";\n}\n\n.fa-envelope-open {\n --fa: "\\f2b6";\n}\n\n.fa-address-book {\n --fa: "\\f2b9";\n}\n\n.fa-contact-book {\n --fa: "\\f2b9";\n}\n\n.fa-address-card {\n --fa: "\\f2bb";\n}\n\n.fa-contact-card {\n --fa: "\\f2bb";\n}\n\n.fa-vcard {\n --fa: "\\f2bb";\n}\n\n.fa-circle-user {\n --fa: "\\f2bd";\n}\n\n.fa-user-circle {\n --fa: "\\f2bd";\n}\n\n.fa-id-badge {\n --fa: "\\f2c1";\n}\n\n.fa-id-card {\n --fa: "\\f2c2";\n}\n\n.fa-drivers-license {\n --fa: "\\f2c2";\n}\n\n.fa-temperature-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-empty {\n --fa: "\\f2cb";\n}\n\n.fa-temperature-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-empty {\n --fa: "\\f2cb";\n}\n\n.fa-shower {\n --fa: "\\f2cc";\n}\n\n.fa-bath {\n --fa: "\\f2cd";\n}\n\n.fa-bathtub {\n --fa: "\\f2cd";\n}\n\n.fa-podcast {\n --fa: "\\f2ce";\n}\n\n.fa-window-maximize {\n --fa: "\\f2d0";\n}\n\n.fa-window-minimize {\n --fa: "\\f2d1";\n}\n\n.fa-window-restore {\n --fa: "\\f2d2";\n}\n\n.fa-square-xmark {\n --fa: "\\f2d3";\n}\n\n.fa-times-square {\n --fa: "\\f2d3";\n}\n\n.fa-xmark-square {\n --fa: "\\f2d3";\n}\n\n.fa-microchip {\n --fa: "\\f2db";\n}\n\n.fa-snowflake {\n --fa: "\\f2dc";\n}\n\n.fa-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensil-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensils {\n --fa: "\\f2e7";\n}\n\n.fa-cutlery {\n --fa: "\\f2e7";\n}\n\n.fa-rotate-left {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-back {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-backward {\n --fa: "\\f2ea";\n}\n\n.fa-undo-alt {\n --fa: "\\f2ea";\n}\n\n.fa-trash-can {\n --fa: "\\f2ed";\n}\n\n.fa-trash-alt {\n --fa: "\\f2ed";\n}\n\n.fa-rotate {\n --fa: "\\f2f1";\n}\n\n.fa-sync-alt {\n --fa: "\\f2f1";\n}\n\n.fa-stopwatch {\n --fa: "\\f2f2";\n}\n\n.fa-right-from-bracket {\n --fa: "\\f2f5";\n}\n\n.fa-sign-out-alt {\n --fa: "\\f2f5";\n}\n\n.fa-right-to-bracket {\n --fa: "\\f2f6";\n}\n\n.fa-sign-in-alt {\n --fa: "\\f2f6";\n}\n\n.fa-rotate-right {\n --fa: "\\f2f9";\n}\n\n.fa-redo-alt {\n --fa: "\\f2f9";\n}\n\n.fa-rotate-forward {\n --fa: "\\f2f9";\n}\n\n.fa-poo {\n --fa: "\\f2fe";\n}\n\n.fa-images {\n --fa: "\\f302";\n}\n\n.fa-pencil {\n --fa: "\\f303";\n}\n\n.fa-pencil-alt {\n --fa: "\\f303";\n}\n\n.fa-pen {\n --fa: "\\f304";\n}\n\n.fa-pen-clip {\n --fa: "\\f305";\n}\n\n.fa-pen-alt {\n --fa: "\\f305";\n}\n\n.fa-octagon {\n --fa: "\\f306";\n}\n\n.fa-down-long {\n --fa: "\\f309";\n}\n\n.fa-long-arrow-alt-down {\n --fa: "\\f309";\n}\n\n.fa-left-long {\n --fa: "\\f30a";\n}\n\n.fa-long-arrow-alt-left {\n --fa: "\\f30a";\n}\n\n.fa-right-long {\n --fa: "\\f30b";\n}\n\n.fa-long-arrow-alt-right {\n --fa: "\\f30b";\n}\n\n.fa-up-long {\n --fa: "\\f30c";\n}\n\n.fa-long-arrow-alt-up {\n --fa: "\\f30c";\n}\n\n.fa-hexagon {\n --fa: "\\f312";\n}\n\n.fa-file-pen {\n --fa: "\\f31c";\n}\n\n.fa-file-edit {\n --fa: "\\f31c";\n}\n\n.fa-maximize {\n --fa: "\\f31e";\n}\n\n.fa-expand-arrows-alt {\n --fa: "\\f31e";\n}\n\n.fa-clipboard {\n --fa: "\\f328";\n}\n\n.fa-left-right {\n --fa: "\\f337";\n}\n\n.fa-arrows-alt-h {\n --fa: "\\f337";\n}\n\n.fa-up-down {\n --fa: "\\f338";\n}\n\n.fa-arrows-alt-v {\n --fa: "\\f338";\n}\n\n.fa-alarm-clock {\n --fa: "\\f34e";\n}\n\n.fa-circle-down {\n --fa: "\\f358";\n}\n\n.fa-arrow-alt-circle-down {\n --fa: "\\f358";\n}\n\n.fa-circle-left {\n --fa: "\\f359";\n}\n\n.fa-arrow-alt-circle-left {\n --fa: "\\f359";\n}\n\n.fa-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-arrow-alt-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-arrow-alt-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-up-right-from-square {\n --fa: "\\f35d";\n}\n\n.fa-external-link-alt {\n --fa: "\\f35d";\n}\n\n.fa-square-up-right {\n --fa: "\\f360";\n}\n\n.fa-external-link-square-alt {\n --fa: "\\f360";\n}\n\n.fa-right-left {\n --fa: "\\f362";\n}\n\n.fa-exchange-alt {\n --fa: "\\f362";\n}\n\n.fa-repeat {\n --fa: "\\f363";\n}\n\n.fa-code-commit {\n --fa: "\\f386";\n}\n\n.fa-code-merge {\n --fa: "\\f387";\n}\n\n.fa-desktop {\n --fa: "\\f390";\n}\n\n.fa-desktop-alt {\n --fa: "\\f390";\n}\n\n.fa-gem {\n --fa: "\\f3a5";\n}\n\n.fa-turn-down {\n --fa: "\\f3be";\n}\n\n.fa-level-down-alt {\n --fa: "\\f3be";\n}\n\n.fa-turn-up {\n --fa: "\\f3bf";\n}\n\n.fa-level-up-alt {\n --fa: "\\f3bf";\n}\n\n.fa-lock-open {\n --fa: "\\f3c1";\n}\n\n.fa-location-dot {\n --fa: "\\f3c5";\n}\n\n.fa-map-marker-alt {\n --fa: "\\f3c5";\n}\n\n.fa-microphone-lines {\n --fa: "\\f3c9";\n}\n\n.fa-microphone-alt {\n --fa: "\\f3c9";\n}\n\n.fa-mobile-screen-button {\n --fa: "\\f3cd";\n}\n\n.fa-mobile-alt {\n --fa: "\\f3cd";\n}\n\n.fa-mobile {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-android {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-phone {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-screen {\n --fa: "\\f3cf";\n}\n\n.fa-mobile-android-alt {\n --fa: "\\f3cf";\n}\n\n.fa-money-bill-1 {\n --fa: "\\f3d1";\n}\n\n.fa-money-bill-alt {\n --fa: "\\f3d1";\n}\n\n.fa-phone-slash {\n --fa: "\\f3dd";\n}\n\n.fa-image-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-reply {\n --fa: "\\f3e5";\n}\n\n.fa-mail-reply {\n --fa: "\\f3e5";\n}\n\n.fa-shield-halved {\n --fa: "\\f3ed";\n}\n\n.fa-shield-alt {\n --fa: "\\f3ed";\n}\n\n.fa-tablet-screen-button {\n --fa: "\\f3fa";\n}\n\n.fa-tablet-alt {\n --fa: "\\f3fa";\n}\n\n.fa-tablet {\n --fa: "\\f3fb";\n}\n\n.fa-tablet-android {\n --fa: "\\f3fb";\n}\n\n.fa-ticket-simple {\n --fa: "\\f3ff";\n}\n\n.fa-ticket-alt {\n --fa: "\\f3ff";\n}\n\n.fa-rectangle-xmark {\n --fa: "\\f410";\n}\n\n.fa-rectangle-times {\n --fa: "\\f410";\n}\n\n.fa-times-rectangle {\n --fa: "\\f410";\n}\n\n.fa-window-close {\n --fa: "\\f410";\n}\n\n.fa-down-left-and-up-right-to-center {\n --fa: "\\f422";\n}\n\n.fa-compress-alt {\n --fa: "\\f422";\n}\n\n.fa-up-right-and-down-left-from-center {\n --fa: "\\f424";\n}\n\n.fa-expand-alt {\n --fa: "\\f424";\n}\n\n.fa-baseball-bat-ball {\n --fa: "\\f432";\n}\n\n.fa-baseball {\n --fa: "\\f433";\n}\n\n.fa-baseball-ball {\n --fa: "\\f433";\n}\n\n.fa-basketball {\n --fa: "\\f434";\n}\n\n.fa-basketball-ball {\n --fa: "\\f434";\n}\n\n.fa-bowling-ball {\n --fa: "\\f436";\n}\n\n.fa-chess {\n --fa: "\\f439";\n}\n\n.fa-chess-bishop {\n --fa: "\\f43a";\n}\n\n.fa-chess-board {\n --fa: "\\f43c";\n}\n\n.fa-chess-king {\n --fa: "\\f43f";\n}\n\n.fa-chess-knight {\n --fa: "\\f441";\n}\n\n.fa-chess-pawn {\n --fa: "\\f443";\n}\n\n.fa-chess-queen {\n --fa: "\\f445";\n}\n\n.fa-chess-rook {\n --fa: "\\f447";\n}\n\n.fa-dumbbell {\n --fa: "\\f44b";\n}\n\n.fa-football {\n --fa: "\\f44e";\n}\n\n.fa-football-ball {\n --fa: "\\f44e";\n}\n\n.fa-golf-ball-tee {\n --fa: "\\f450";\n}\n\n.fa-golf-ball {\n --fa: "\\f450";\n}\n\n.fa-hockey-puck {\n --fa: "\\f453";\n}\n\n.fa-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-quidditch {\n --fa: "\\f458";\n}\n\n.fa-quidditch-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-square-full {\n --fa: "\\f45c";\n}\n\n.fa-table-tennis-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-ping-pong-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-table-tennis {\n --fa: "\\f45d";\n}\n\n.fa-volleyball {\n --fa: "\\f45f";\n}\n\n.fa-volleyball-ball {\n --fa: "\\f45f";\n}\n\n.fa-hand-dots {\n --fa: "\\f461";\n}\n\n.fa-allergies {\n --fa: "\\f461";\n}\n\n.fa-bandage {\n --fa: "\\f462";\n}\n\n.fa-band-aid {\n --fa: "\\f462";\n}\n\n.fa-box {\n --fa: "\\f466";\n}\n\n.fa-boxes-stacked {\n --fa: "\\f468";\n}\n\n.fa-boxes {\n --fa: "\\f468";\n}\n\n.fa-boxes-alt {\n --fa: "\\f468";\n}\n\n.fa-briefcase-medical {\n --fa: "\\f469";\n}\n\n.fa-fire-flame-simple {\n --fa: "\\f46a";\n}\n\n.fa-burn {\n --fa: "\\f46a";\n}\n\n.fa-capsules {\n --fa: "\\f46b";\n}\n\n.fa-clipboard-check {\n --fa: "\\f46c";\n}\n\n.fa-clipboard-list {\n --fa: "\\f46d";\n}\n\n.fa-person-dots-from-line {\n --fa: "\\f470";\n}\n\n.fa-diagnoses {\n --fa: "\\f470";\n}\n\n.fa-dna {\n --fa: "\\f471";\n}\n\n.fa-dolly {\n --fa: "\\f472";\n}\n\n.fa-dolly-box {\n --fa: "\\f472";\n}\n\n.fa-cart-flatbed {\n --fa: "\\f474";\n}\n\n.fa-dolly-flatbed {\n --fa: "\\f474";\n}\n\n.fa-file-medical {\n --fa: "\\f477";\n}\n\n.fa-file-waveform {\n --fa: "\\f478";\n}\n\n.fa-file-medical-alt {\n --fa: "\\f478";\n}\n\n.fa-kit-medical {\n --fa: "\\f479";\n}\n\n.fa-first-aid {\n --fa: "\\f479";\n}\n\n.fa-circle-h {\n --fa: "\\f47e";\n}\n\n.fa-hospital-symbol {\n --fa: "\\f47e";\n}\n\n.fa-id-card-clip {\n --fa: "\\f47f";\n}\n\n.fa-id-card-alt {\n --fa: "\\f47f";\n}\n\n.fa-notes-medical {\n --fa: "\\f481";\n}\n\n.fa-pallet {\n --fa: "\\f482";\n}\n\n.fa-pills {\n --fa: "\\f484";\n}\n\n.fa-prescription-bottle {\n --fa: "\\f485";\n}\n\n.fa-prescription-bottle-medical {\n --fa: "\\f486";\n}\n\n.fa-prescription-bottle-alt {\n --fa: "\\f486";\n}\n\n.fa-bed-pulse {\n --fa: "\\f487";\n}\n\n.fa-procedures {\n --fa: "\\f487";\n}\n\n.fa-truck-fast {\n --fa: "\\f48b";\n}\n\n.fa-shipping-fast {\n --fa: "\\f48b";\n}\n\n.fa-smoking {\n --fa: "\\f48d";\n}\n\n.fa-syringe {\n --fa: "\\f48e";\n}\n\n.fa-tablets {\n --fa: "\\f490";\n}\n\n.fa-thermometer {\n --fa: "\\f491";\n}\n\n.fa-vial {\n --fa: "\\f492";\n}\n\n.fa-vials {\n --fa: "\\f493";\n}\n\n.fa-warehouse {\n --fa: "\\f494";\n}\n\n.fa-weight-scale {\n --fa: "\\f496";\n}\n\n.fa-weight {\n --fa: "\\f496";\n}\n\n.fa-x-ray {\n --fa: "\\f497";\n}\n\n.fa-box-open {\n --fa: "\\f49e";\n}\n\n.fa-comment-dots {\n --fa: "\\f4ad";\n}\n\n.fa-commenting {\n --fa: "\\f4ad";\n}\n\n.fa-comment-slash {\n --fa: "\\f4b3";\n}\n\n.fa-couch {\n --fa: "\\f4b8";\n}\n\n.fa-circle-dollar-to-slot {\n --fa: "\\f4b9";\n}\n\n.fa-donate {\n --fa: "\\f4b9";\n}\n\n.fa-dove {\n --fa: "\\f4ba";\n}\n\n.fa-hand-holding {\n --fa: "\\f4bd";\n}\n\n.fa-hand-holding-heart {\n --fa: "\\f4be";\n}\n\n.fa-hand-holding-dollar {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-usd {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-droplet {\n --fa: "\\f4c1";\n}\n\n.fa-hand-holding-water {\n --fa: "\\f4c1";\n}\n\n.fa-hands-holding {\n --fa: "\\f4c2";\n}\n\n.fa-handshake-angle {\n --fa: "\\f4c4";\n}\n\n.fa-hands-helping {\n --fa: "\\f4c4";\n}\n\n.fa-parachute-box {\n --fa: "\\f4cd";\n}\n\n.fa-people-carry-box {\n --fa: "\\f4ce";\n}\n\n.fa-people-carry {\n --fa: "\\f4ce";\n}\n\n.fa-piggy-bank {\n --fa: "\\f4d3";\n}\n\n.fa-ribbon {\n --fa: "\\f4d6";\n}\n\n.fa-route {\n --fa: "\\f4d7";\n}\n\n.fa-seedling {\n --fa: "\\f4d8";\n}\n\n.fa-sprout {\n --fa: "\\f4d8";\n}\n\n.fa-sign-hanging {\n --fa: "\\f4d9";\n}\n\n.fa-sign {\n --fa: "\\f4d9";\n}\n\n.fa-face-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-tape {\n --fa: "\\f4db";\n}\n\n.fa-truck-ramp-box {\n --fa: "\\f4de";\n}\n\n.fa-truck-loading {\n --fa: "\\f4de";\n}\n\n.fa-truck-moving {\n --fa: "\\f4df";\n}\n\n.fa-video-slash {\n --fa: "\\f4e2";\n}\n\n.fa-wine-glass {\n --fa: "\\f4e3";\n}\n\n.fa-user-astronaut {\n --fa: "\\f4fb";\n}\n\n.fa-user-check {\n --fa: "\\f4fc";\n}\n\n.fa-user-clock {\n --fa: "\\f4fd";\n}\n\n.fa-user-gear {\n --fa: "\\f4fe";\n}\n\n.fa-user-cog {\n --fa: "\\f4fe";\n}\n\n.fa-user-pen {\n --fa: "\\f4ff";\n}\n\n.fa-user-edit {\n --fa: "\\f4ff";\n}\n\n.fa-user-group {\n --fa: "\\f500";\n}\n\n.fa-user-friends {\n --fa: "\\f500";\n}\n\n.fa-user-graduate {\n --fa: "\\f501";\n}\n\n.fa-user-lock {\n --fa: "\\f502";\n}\n\n.fa-user-minus {\n --fa: "\\f503";\n}\n\n.fa-user-ninja {\n --fa: "\\f504";\n}\n\n.fa-user-shield {\n --fa: "\\f505";\n}\n\n.fa-user-slash {\n --fa: "\\f506";\n}\n\n.fa-user-alt-slash {\n --fa: "\\f506";\n}\n\n.fa-user-large-slash {\n --fa: "\\f506";\n}\n\n.fa-user-tag {\n --fa: "\\f507";\n}\n\n.fa-user-tie {\n --fa: "\\f508";\n}\n\n.fa-users-gear {\n --fa: "\\f509";\n}\n\n.fa-users-cog {\n --fa: "\\f509";\n}\n\n.fa-scale-unbalanced {\n --fa: "\\f515";\n}\n\n.fa-balance-scale-left {\n --fa: "\\f515";\n}\n\n.fa-scale-unbalanced-flip {\n --fa: "\\f516";\n}\n\n.fa-balance-scale-right {\n --fa: "\\f516";\n}\n\n.fa-blender {\n --fa: "\\f517";\n}\n\n.fa-book-open {\n --fa: "\\f518";\n}\n\n.fa-tower-broadcast {\n --fa: "\\f519";\n}\n\n.fa-broadcast-tower {\n --fa: "\\f519";\n}\n\n.fa-broom {\n --fa: "\\f51a";\n}\n\n.fa-chalkboard {\n --fa: "\\f51b";\n}\n\n.fa-blackboard {\n --fa: "\\f51b";\n}\n\n.fa-chalkboard-user {\n --fa: "\\f51c";\n}\n\n.fa-chalkboard-teacher {\n --fa: "\\f51c";\n}\n\n.fa-church {\n --fa: "\\f51d";\n}\n\n.fa-coins {\n --fa: "\\f51e";\n}\n\n.fa-compact-disc {\n --fa: "\\f51f";\n}\n\n.fa-crow {\n --fa: "\\f520";\n}\n\n.fa-crown {\n --fa: "\\f521";\n}\n\n.fa-dice {\n --fa: "\\f522";\n}\n\n.fa-dice-five {\n --fa: "\\f523";\n}\n\n.fa-dice-four {\n --fa: "\\f524";\n}\n\n.fa-dice-one {\n --fa: "\\f525";\n}\n\n.fa-dice-six {\n --fa: "\\f526";\n}\n\n.fa-dice-three {\n --fa: "\\f527";\n}\n\n.fa-dice-two {\n --fa: "\\f528";\n}\n\n.fa-divide {\n --fa: "\\f529";\n}\n\n.fa-door-closed {\n --fa: "\\f52a";\n}\n\n.fa-door-open {\n --fa: "\\f52b";\n}\n\n.fa-feather {\n --fa: "\\f52d";\n}\n\n.fa-frog {\n --fa: "\\f52e";\n}\n\n.fa-gas-pump {\n --fa: "\\f52f";\n}\n\n.fa-glasses {\n --fa: "\\f530";\n}\n\n.fa-greater-than-equal {\n --fa: "\\f532";\n}\n\n.fa-helicopter {\n --fa: "\\f533";\n}\n\n.fa-infinity {\n --fa: "\\f534";\n}\n\n.fa-kiwi-bird {\n --fa: "\\f535";\n}\n\n.fa-less-than-equal {\n --fa: "\\f537";\n}\n\n.fa-memory {\n --fa: "\\f538";\n}\n\n.fa-microphone-lines-slash {\n --fa: "\\f539";\n}\n\n.fa-microphone-alt-slash {\n --fa: "\\f539";\n}\n\n.fa-money-bill-wave {\n --fa: "\\f53a";\n}\n\n.fa-money-bill-1-wave {\n --fa: "\\f53b";\n}\n\n.fa-money-bill-wave-alt {\n --fa: "\\f53b";\n}\n\n.fa-money-check {\n --fa: "\\f53c";\n}\n\n.fa-money-check-dollar {\n --fa: "\\f53d";\n}\n\n.fa-money-check-alt {\n --fa: "\\f53d";\n}\n\n.fa-not-equal {\n --fa: "\\f53e";\n}\n\n.fa-palette {\n --fa: "\\f53f";\n}\n\n.fa-square-parking {\n --fa: "\\f540";\n}\n\n.fa-parking {\n --fa: "\\f540";\n}\n\n.fa-diagram-project {\n --fa: "\\f542";\n}\n\n.fa-project-diagram {\n --fa: "\\f542";\n}\n\n.fa-receipt {\n --fa: "\\f543";\n}\n\n.fa-robot {\n --fa: "\\f544";\n}\n\n.fa-ruler {\n --fa: "\\f545";\n}\n\n.fa-ruler-combined {\n --fa: "\\f546";\n}\n\n.fa-ruler-horizontal {\n --fa: "\\f547";\n}\n\n.fa-ruler-vertical {\n --fa: "\\f548";\n}\n\n.fa-school {\n --fa: "\\f549";\n}\n\n.fa-screwdriver {\n --fa: "\\f54a";\n}\n\n.fa-shoe-prints {\n --fa: "\\f54b";\n}\n\n.fa-skull {\n --fa: "\\f54c";\n}\n\n.fa-ban-smoking {\n --fa: "\\f54d";\n}\n\n.fa-smoking-ban {\n --fa: "\\f54d";\n}\n\n.fa-store {\n --fa: "\\f54e";\n}\n\n.fa-shop {\n --fa: "\\f54f";\n}\n\n.fa-store-alt {\n --fa: "\\f54f";\n}\n\n.fa-bars-staggered {\n --fa: "\\f550";\n}\n\n.fa-reorder {\n --fa: "\\f550";\n}\n\n.fa-stream {\n --fa: "\\f550";\n}\n\n.fa-stroopwafel {\n --fa: "\\f551";\n}\n\n.fa-toolbox {\n --fa: "\\f552";\n}\n\n.fa-shirt {\n --fa: "\\f553";\n}\n\n.fa-t-shirt {\n --fa: "\\f553";\n}\n\n.fa-tshirt {\n --fa: "\\f553";\n}\n\n.fa-person-walking {\n --fa: "\\f554";\n}\n\n.fa-walking {\n --fa: "\\f554";\n}\n\n.fa-wallet {\n --fa: "\\f555";\n}\n\n.fa-face-angry {\n --fa: "\\f556";\n}\n\n.fa-angry {\n --fa: "\\f556";\n}\n\n.fa-archway {\n --fa: "\\f557";\n}\n\n.fa-book-atlas {\n --fa: "\\f558";\n}\n\n.fa-atlas {\n --fa: "\\f558";\n}\n\n.fa-award {\n --fa: "\\f559";\n}\n\n.fa-delete-left {\n --fa: "\\f55a";\n}\n\n.fa-backspace {\n --fa: "\\f55a";\n}\n\n.fa-bezier-curve {\n --fa: "\\f55b";\n}\n\n.fa-bong {\n --fa: "\\f55c";\n}\n\n.fa-brush {\n --fa: "\\f55d";\n}\n\n.fa-bus-simple {\n --fa: "\\f55e";\n}\n\n.fa-bus-alt {\n --fa: "\\f55e";\n}\n\n.fa-cannabis {\n --fa: "\\f55f";\n}\n\n.fa-check-double {\n --fa: "\\f560";\n}\n\n.fa-martini-glass-citrus {\n --fa: "\\f561";\n}\n\n.fa-cocktail {\n --fa: "\\f561";\n}\n\n.fa-bell-concierge {\n --fa: "\\f562";\n}\n\n.fa-concierge-bell {\n --fa: "\\f562";\n}\n\n.fa-cookie {\n --fa: "\\f563";\n}\n\n.fa-cookie-bite {\n --fa: "\\f564";\n}\n\n.fa-crop-simple {\n --fa: "\\f565";\n}\n\n.fa-crop-alt {\n --fa: "\\f565";\n}\n\n.fa-tachograph-digital {\n --fa: "\\f566";\n}\n\n.fa-digital-tachograph {\n --fa: "\\f566";\n}\n\n.fa-face-dizzy {\n --fa: "\\f567";\n}\n\n.fa-dizzy {\n --fa: "\\f567";\n}\n\n.fa-compass-drafting {\n --fa: "\\f568";\n}\n\n.fa-drafting-compass {\n --fa: "\\f568";\n}\n\n.fa-drum {\n --fa: "\\f569";\n}\n\n.fa-drum-steelpan {\n --fa: "\\f56a";\n}\n\n.fa-feather-pointed {\n --fa: "\\f56b";\n}\n\n.fa-feather-alt {\n --fa: "\\f56b";\n}\n\n.fa-file-contract {\n --fa: "\\f56c";\n}\n\n.fa-file-arrow-down {\n --fa: "\\f56d";\n}\n\n.fa-file-download {\n --fa: "\\f56d";\n}\n\n.fa-file-export {\n --fa: "\\f56e";\n}\n\n.fa-arrow-right-from-file {\n --fa: "\\f56e";\n}\n\n.fa-file-import {\n --fa: "\\f56f";\n}\n\n.fa-arrow-right-to-file {\n --fa: "\\f56f";\n}\n\n.fa-file-invoice {\n --fa: "\\f570";\n}\n\n.fa-file-invoice-dollar {\n --fa: "\\f571";\n}\n\n.fa-file-prescription {\n --fa: "\\f572";\n}\n\n.fa-file-signature {\n --fa: "\\f573";\n}\n\n.fa-file-arrow-up {\n --fa: "\\f574";\n}\n\n.fa-file-upload {\n --fa: "\\f574";\n}\n\n.fa-fill {\n --fa: "\\f575";\n}\n\n.fa-fill-drip {\n --fa: "\\f576";\n}\n\n.fa-fingerprint {\n --fa: "\\f577";\n}\n\n.fa-fish {\n --fa: "\\f578";\n}\n\n.fa-face-flushed {\n --fa: "\\f579";\n}\n\n.fa-flushed {\n --fa: "\\f579";\n}\n\n.fa-face-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-martini-glass {\n --fa: "\\f57b";\n}\n\n.fa-glass-martini-alt {\n --fa: "\\f57b";\n}\n\n.fa-earth-africa {\n --fa: "\\f57c";\n}\n\n.fa-globe-africa {\n --fa: "\\f57c";\n}\n\n.fa-earth-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth {\n --fa: "\\f57d";\n}\n\n.fa-earth-america {\n --fa: "\\f57d";\n}\n\n.fa-globe-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth-asia {\n --fa: "\\f57e";\n}\n\n.fa-globe-asia {\n --fa: "\\f57e";\n}\n\n.fa-face-grimace {\n --fa: "\\f57f";\n}\n\n.fa-grimace {\n --fa: "\\f57f";\n}\n\n.fa-face-grin {\n --fa: "\\f580";\n}\n\n.fa-grin {\n --fa: "\\f580";\n}\n\n.fa-face-grin-wide {\n --fa: "\\f581";\n}\n\n.fa-grin-alt {\n --fa: "\\f581";\n}\n\n.fa-face-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-face-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-face-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-face-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-face-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-face-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-face-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-face-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-face-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-face-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-face-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grip {\n --fa: "\\f58d";\n}\n\n.fa-grid-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-vertical {\n --fa: "\\f58e";\n}\n\n.fa-grid-vertical {\n --fa: "\\f58e";\n}\n\n.fa-headset {\n --fa: "\\f590";\n}\n\n.fa-highlighter {\n --fa: "\\f591";\n}\n\n.fa-hot-tub-person {\n --fa: "\\f593";\n}\n\n.fa-hot-tub {\n --fa: "\\f593";\n}\n\n.fa-hotel {\n --fa: "\\f594";\n}\n\n.fa-joint {\n --fa: "\\f595";\n}\n\n.fa-face-kiss {\n --fa: "\\f596";\n}\n\n.fa-kiss {\n --fa: "\\f596";\n}\n\n.fa-face-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-face-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-face-laugh {\n --fa: "\\f599";\n}\n\n.fa-laugh {\n --fa: "\\f599";\n}\n\n.fa-face-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-face-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-face-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-cart-flatbed-suitcase {\n --fa: "\\f59d";\n}\n\n.fa-luggage-cart {\n --fa: "\\f59d";\n}\n\n.fa-map-location {\n --fa: "\\f59f";\n}\n\n.fa-map-marked {\n --fa: "\\f59f";\n}\n\n.fa-map-location-dot {\n --fa: "\\f5a0";\n}\n\n.fa-map-marked-alt {\n --fa: "\\f5a0";\n}\n\n.fa-marker {\n --fa: "\\f5a1";\n}\n\n.fa-medal {\n --fa: "\\f5a2";\n}\n\n.fa-face-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-face-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-meh-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-monument {\n --fa: "\\f5a6";\n}\n\n.fa-mortar-pestle {\n --fa: "\\f5a7";\n}\n\n.fa-paint-roller {\n --fa: "\\f5aa";\n}\n\n.fa-passport {\n --fa: "\\f5ab";\n}\n\n.fa-pen-fancy {\n --fa: "\\f5ac";\n}\n\n.fa-pen-nib {\n --fa: "\\f5ad";\n}\n\n.fa-pen-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-pencil-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-plane-arrival {\n --fa: "\\f5af";\n}\n\n.fa-plane-departure {\n --fa: "\\f5b0";\n}\n\n.fa-prescription {\n --fa: "\\f5b1";\n}\n\n.fa-face-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-face-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-van-shuttle {\n --fa: "\\f5b6";\n}\n\n.fa-shuttle-van {\n --fa: "\\f5b6";\n}\n\n.fa-signature {\n --fa: "\\f5b7";\n}\n\n.fa-face-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-solar-panel {\n --fa: "\\f5ba";\n}\n\n.fa-spa {\n --fa: "\\f5bb";\n}\n\n.fa-splotch {\n --fa: "\\f5bc";\n}\n\n.fa-spray-can {\n --fa: "\\f5bd";\n}\n\n.fa-stamp {\n --fa: "\\f5bf";\n}\n\n.fa-star-half-stroke {\n --fa: "\\f5c0";\n}\n\n.fa-star-half-alt {\n --fa: "\\f5c0";\n}\n\n.fa-suitcase-rolling {\n --fa: "\\f5c1";\n}\n\n.fa-face-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-swatchbook {\n --fa: "\\f5c3";\n}\n\n.fa-person-swimming {\n --fa: "\\f5c4";\n}\n\n.fa-swimmer {\n --fa: "\\f5c4";\n}\n\n.fa-water-ladder {\n --fa: "\\f5c5";\n}\n\n.fa-ladder-water {\n --fa: "\\f5c5";\n}\n\n.fa-swimming-pool {\n --fa: "\\f5c5";\n}\n\n.fa-droplet-slash {\n --fa: "\\f5c7";\n}\n\n.fa-tint-slash {\n --fa: "\\f5c7";\n}\n\n.fa-face-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tooth {\n --fa: "\\f5c9";\n}\n\n.fa-umbrella-beach {\n --fa: "\\f5ca";\n}\n\n.fa-weight-hanging {\n --fa: "\\f5cd";\n}\n\n.fa-wine-glass-empty {\n --fa: "\\f5ce";\n}\n\n.fa-wine-glass-alt {\n --fa: "\\f5ce";\n}\n\n.fa-spray-can-sparkles {\n --fa: "\\f5d0";\n}\n\n.fa-air-freshener {\n --fa: "\\f5d0";\n}\n\n.fa-apple-whole {\n --fa: "\\f5d1";\n}\n\n.fa-apple-alt {\n --fa: "\\f5d1";\n}\n\n.fa-atom {\n --fa: "\\f5d2";\n}\n\n.fa-bone {\n --fa: "\\f5d7";\n}\n\n.fa-book-open-reader {\n --fa: "\\f5da";\n}\n\n.fa-book-reader {\n --fa: "\\f5da";\n}\n\n.fa-brain {\n --fa: "\\f5dc";\n}\n\n.fa-car-rear {\n --fa: "\\f5de";\n}\n\n.fa-car-alt {\n --fa: "\\f5de";\n}\n\n.fa-car-battery {\n --fa: "\\f5df";\n}\n\n.fa-battery-car {\n --fa: "\\f5df";\n}\n\n.fa-car-burst {\n --fa: "\\f5e1";\n}\n\n.fa-car-crash {\n --fa: "\\f5e1";\n}\n\n.fa-car-side {\n --fa: "\\f5e4";\n}\n\n.fa-charging-station {\n --fa: "\\f5e7";\n}\n\n.fa-diamond-turn-right {\n --fa: "\\f5eb";\n}\n\n.fa-directions {\n --fa: "\\f5eb";\n}\n\n.fa-draw-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-vector-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-laptop-code {\n --fa: "\\f5fc";\n}\n\n.fa-layer-group {\n --fa: "\\f5fd";\n}\n\n.fa-location-crosshairs {\n --fa: "\\f601";\n}\n\n.fa-location {\n --fa: "\\f601";\n}\n\n.fa-lungs {\n --fa: "\\f604";\n}\n\n.fa-microscope {\n --fa: "\\f610";\n}\n\n.fa-oil-can {\n --fa: "\\f613";\n}\n\n.fa-poop {\n --fa: "\\f619";\n}\n\n.fa-shapes {\n --fa: "\\f61f";\n}\n\n.fa-triangle-circle-square {\n --fa: "\\f61f";\n}\n\n.fa-star-of-life {\n --fa: "\\f621";\n}\n\n.fa-gauge {\n --fa: "\\f624";\n}\n\n.fa-dashboard {\n --fa: "\\f624";\n}\n\n.fa-gauge-med {\n --fa: "\\f624";\n}\n\n.fa-tachometer-alt-average {\n --fa: "\\f624";\n}\n\n.fa-gauge-high {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt-fast {\n --fa: "\\f625";\n}\n\n.fa-gauge-simple {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-med {\n --fa: "\\f629";\n}\n\n.fa-tachometer-average {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-high {\n --fa: "\\f62a";\n}\n\n.fa-tachometer {\n --fa: "\\f62a";\n}\n\n.fa-tachometer-fast {\n --fa: "\\f62a";\n}\n\n.fa-teeth {\n --fa: "\\f62e";\n}\n\n.fa-teeth-open {\n --fa: "\\f62f";\n}\n\n.fa-masks-theater {\n --fa: "\\f630";\n}\n\n.fa-theater-masks {\n --fa: "\\f630";\n}\n\n.fa-traffic-light {\n --fa: "\\f637";\n}\n\n.fa-truck-monster {\n --fa: "\\f63b";\n}\n\n.fa-truck-pickup {\n --fa: "\\f63c";\n}\n\n.fa-rectangle-ad {\n --fa: "\\f641";\n}\n\n.fa-ad {\n --fa: "\\f641";\n}\n\n.fa-ankh {\n --fa: "\\f644";\n}\n\n.fa-book-bible {\n --fa: "\\f647";\n}\n\n.fa-bible {\n --fa: "\\f647";\n}\n\n.fa-business-time {\n --fa: "\\f64a";\n}\n\n.fa-briefcase-clock {\n --fa: "\\f64a";\n}\n\n.fa-city {\n --fa: "\\f64f";\n}\n\n.fa-comment-dollar {\n --fa: "\\f651";\n}\n\n.fa-comments-dollar {\n --fa: "\\f653";\n}\n\n.fa-cross {\n --fa: "\\f654";\n}\n\n.fa-dharmachakra {\n --fa: "\\f655";\n}\n\n.fa-envelope-open-text {\n --fa: "\\f658";\n}\n\n.fa-folder-minus {\n --fa: "\\f65d";\n}\n\n.fa-folder-plus {\n --fa: "\\f65e";\n}\n\n.fa-filter-circle-dollar {\n --fa: "\\f662";\n}\n\n.fa-funnel-dollar {\n --fa: "\\f662";\n}\n\n.fa-gopuram {\n --fa: "\\f664";\n}\n\n.fa-hamsa {\n --fa: "\\f665";\n}\n\n.fa-bahai {\n --fa: "\\f666";\n}\n\n.fa-haykal {\n --fa: "\\f666";\n}\n\n.fa-jedi {\n --fa: "\\f669";\n}\n\n.fa-book-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-kaaba {\n --fa: "\\f66b";\n}\n\n.fa-khanda {\n --fa: "\\f66d";\n}\n\n.fa-landmark {\n --fa: "\\f66f";\n}\n\n.fa-envelopes-bulk {\n --fa: "\\f674";\n}\n\n.fa-mail-bulk {\n --fa: "\\f674";\n}\n\n.fa-menorah {\n --fa: "\\f676";\n}\n\n.fa-mosque {\n --fa: "\\f678";\n}\n\n.fa-om {\n --fa: "\\f679";\n}\n\n.fa-spaghetti-monster-flying {\n --fa: "\\f67b";\n}\n\n.fa-pastafarianism {\n --fa: "\\f67b";\n}\n\n.fa-peace {\n --fa: "\\f67c";\n}\n\n.fa-place-of-worship {\n --fa: "\\f67f";\n}\n\n.fa-square-poll-vertical {\n --fa: "\\f681";\n}\n\n.fa-poll {\n --fa: "\\f681";\n}\n\n.fa-square-poll-horizontal {\n --fa: "\\f682";\n}\n\n.fa-poll-h {\n --fa: "\\f682";\n}\n\n.fa-person-praying {\n --fa: "\\f683";\n}\n\n.fa-pray {\n --fa: "\\f683";\n}\n\n.fa-hands-praying {\n --fa: "\\f684";\n}\n\n.fa-praying-hands {\n --fa: "\\f684";\n}\n\n.fa-book-quran {\n --fa: "\\f687";\n}\n\n.fa-quran {\n --fa: "\\f687";\n}\n\n.fa-magnifying-glass-dollar {\n --fa: "\\f688";\n}\n\n.fa-search-dollar {\n --fa: "\\f688";\n}\n\n.fa-magnifying-glass-location {\n --fa: "\\f689";\n}\n\n.fa-search-location {\n --fa: "\\f689";\n}\n\n.fa-socks {\n --fa: "\\f696";\n}\n\n.fa-square-root-variable {\n --fa: "\\f698";\n}\n\n.fa-square-root-alt {\n --fa: "\\f698";\n}\n\n.fa-star-and-crescent {\n --fa: "\\f699";\n}\n\n.fa-star-of-david {\n --fa: "\\f69a";\n}\n\n.fa-synagogue {\n --fa: "\\f69b";\n}\n\n.fa-scroll-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torii-gate {\n --fa: "\\f6a1";\n}\n\n.fa-vihara {\n --fa: "\\f6a7";\n}\n\n.fa-volume-xmark {\n --fa: "\\f6a9";\n}\n\n.fa-volume-mute {\n --fa: "\\f6a9";\n}\n\n.fa-volume-times {\n --fa: "\\f6a9";\n}\n\n.fa-yin-yang {\n --fa: "\\f6ad";\n}\n\n.fa-blender-phone {\n --fa: "\\f6b6";\n}\n\n.fa-book-skull {\n --fa: "\\f6b7";\n}\n\n.fa-book-dead {\n --fa: "\\f6b7";\n}\n\n.fa-campground {\n --fa: "\\f6bb";\n}\n\n.fa-cat {\n --fa: "\\f6be";\n}\n\n.fa-chair {\n --fa: "\\f6c0";\n}\n\n.fa-cloud-moon {\n --fa: "\\f6c3";\n}\n\n.fa-cloud-sun {\n --fa: "\\f6c4";\n}\n\n.fa-cow {\n --fa: "\\f6c8";\n}\n\n.fa-dice-d20 {\n --fa: "\\f6cf";\n}\n\n.fa-dice-d6 {\n --fa: "\\f6d1";\n}\n\n.fa-dog {\n --fa: "\\f6d3";\n}\n\n.fa-dragon {\n --fa: "\\f6d5";\n}\n\n.fa-drumstick-bite {\n --fa: "\\f6d7";\n}\n\n.fa-dungeon {\n --fa: "\\f6d9";\n}\n\n.fa-file-csv {\n --fa: "\\f6dd";\n}\n\n.fa-hand-fist {\n --fa: "\\f6de";\n}\n\n.fa-fist-raised {\n --fa: "\\f6de";\n}\n\n.fa-ghost {\n --fa: "\\f6e2";\n}\n\n.fa-hammer {\n --fa: "\\f6e3";\n}\n\n.fa-hanukiah {\n --fa: "\\f6e6";\n}\n\n.fa-hat-wizard {\n --fa: "\\f6e8";\n}\n\n.fa-person-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hippo {\n --fa: "\\f6ed";\n}\n\n.fa-horse {\n --fa: "\\f6f0";\n}\n\n.fa-house-chimney-crack {\n --fa: "\\f6f1";\n}\n\n.fa-house-damage {\n --fa: "\\f6f1";\n}\n\n.fa-hryvnia-sign {\n --fa: "\\f6f2";\n}\n\n.fa-hryvnia {\n --fa: "\\f6f2";\n}\n\n.fa-mask {\n --fa: "\\f6fa";\n}\n\n.fa-mountain {\n --fa: "\\f6fc";\n}\n\n.fa-network-wired {\n --fa: "\\f6ff";\n}\n\n.fa-otter {\n --fa: "\\f700";\n}\n\n.fa-ring {\n --fa: "\\f70b";\n}\n\n.fa-person-running {\n --fa: "\\f70c";\n}\n\n.fa-running {\n --fa: "\\f70c";\n}\n\n.fa-scroll {\n --fa: "\\f70e";\n}\n\n.fa-skull-crossbones {\n --fa: "\\f714";\n}\n\n.fa-slash {\n --fa: "\\f715";\n}\n\n.fa-spider {\n --fa: "\\f717";\n}\n\n.fa-toilet-paper {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-alt {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-blank {\n --fa: "\\f71e";\n}\n\n.fa-tractor {\n --fa: "\\f722";\n}\n\n.fa-user-injured {\n --fa: "\\f728";\n}\n\n.fa-vr-cardboard {\n --fa: "\\f729";\n}\n\n.fa-wand-sparkles {\n --fa: "\\f72b";\n}\n\n.fa-wind {\n --fa: "\\f72e";\n}\n\n.fa-wine-bottle {\n --fa: "\\f72f";\n}\n\n.fa-cloud-meatball {\n --fa: "\\f73b";\n}\n\n.fa-cloud-moon-rain {\n --fa: "\\f73c";\n}\n\n.fa-cloud-rain {\n --fa: "\\f73d";\n}\n\n.fa-cloud-showers-heavy {\n --fa: "\\f740";\n}\n\n.fa-cloud-sun-rain {\n --fa: "\\f743";\n}\n\n.fa-democrat {\n --fa: "\\f747";\n}\n\n.fa-flag-usa {\n --fa: "\\f74d";\n}\n\n.fa-hurricane {\n --fa: "\\f751";\n}\n\n.fa-landmark-dome {\n --fa: "\\f752";\n}\n\n.fa-landmark-alt {\n --fa: "\\f752";\n}\n\n.fa-meteor {\n --fa: "\\f753";\n}\n\n.fa-person-booth {\n --fa: "\\f756";\n}\n\n.fa-poo-storm {\n --fa: "\\f75a";\n}\n\n.fa-poo-bolt {\n --fa: "\\f75a";\n}\n\n.fa-rainbow {\n --fa: "\\f75b";\n}\n\n.fa-republican {\n --fa: "\\f75e";\n}\n\n.fa-smog {\n --fa: "\\f75f";\n}\n\n.fa-temperature-high {\n --fa: "\\f769";\n}\n\n.fa-temperature-low {\n --fa: "\\f76b";\n}\n\n.fa-cloud-bolt {\n --fa: "\\f76c";\n}\n\n.fa-thunderstorm {\n --fa: "\\f76c";\n}\n\n.fa-tornado {\n --fa: "\\f76f";\n}\n\n.fa-volcano {\n --fa: "\\f770";\n}\n\n.fa-check-to-slot {\n --fa: "\\f772";\n}\n\n.fa-vote-yea {\n --fa: "\\f772";\n}\n\n.fa-water {\n --fa: "\\f773";\n}\n\n.fa-baby {\n --fa: "\\f77c";\n}\n\n.fa-baby-carriage {\n --fa: "\\f77d";\n}\n\n.fa-carriage-baby {\n --fa: "\\f77d";\n}\n\n.fa-biohazard {\n --fa: "\\f780";\n}\n\n.fa-blog {\n --fa: "\\f781";\n}\n\n.fa-calendar-day {\n --fa: "\\f783";\n}\n\n.fa-calendar-week {\n --fa: "\\f784";\n}\n\n.fa-candy-cane {\n --fa: "\\f786";\n}\n\n.fa-carrot {\n --fa: "\\f787";\n}\n\n.fa-cash-register {\n --fa: "\\f788";\n}\n\n.fa-minimize {\n --fa: "\\f78c";\n}\n\n.fa-compress-arrows-alt {\n --fa: "\\f78c";\n}\n\n.fa-dumpster {\n --fa: "\\f793";\n}\n\n.fa-dumpster-fire {\n --fa: "\\f794";\n}\n\n.fa-ethernet {\n --fa: "\\f796";\n}\n\n.fa-gifts {\n --fa: "\\f79c";\n}\n\n.fa-champagne-glasses {\n --fa: "\\f79f";\n}\n\n.fa-glass-cheers {\n --fa: "\\f79f";\n}\n\n.fa-whiskey-glass {\n --fa: "\\f7a0";\n}\n\n.fa-glass-whiskey {\n --fa: "\\f7a0";\n}\n\n.fa-earth-europe {\n --fa: "\\f7a2";\n}\n\n.fa-globe-europe {\n --fa: "\\f7a2";\n}\n\n.fa-grip-lines {\n --fa: "\\f7a4";\n}\n\n.fa-grip-lines-vertical {\n --fa: "\\f7a5";\n}\n\n.fa-guitar {\n --fa: "\\f7a6";\n}\n\n.fa-heart-crack {\n --fa: "\\f7a9";\n}\n\n.fa-heart-broken {\n --fa: "\\f7a9";\n}\n\n.fa-holly-berry {\n --fa: "\\f7aa";\n}\n\n.fa-horse-head {\n --fa: "\\f7ab";\n}\n\n.fa-icicles {\n --fa: "\\f7ad";\n}\n\n.fa-igloo {\n --fa: "\\f7ae";\n}\n\n.fa-mitten {\n --fa: "\\f7b5";\n}\n\n.fa-mug-hot {\n --fa: "\\f7b6";\n}\n\n.fa-radiation {\n --fa: "\\f7b9";\n}\n\n.fa-circle-radiation {\n --fa: "\\f7ba";\n}\n\n.fa-radiation-alt {\n --fa: "\\f7ba";\n}\n\n.fa-restroom {\n --fa: "\\f7bd";\n}\n\n.fa-satellite {\n --fa: "\\f7bf";\n}\n\n.fa-satellite-dish {\n --fa: "\\f7c0";\n}\n\n.fa-sd-card {\n --fa: "\\f7c2";\n}\n\n.fa-sim-card {\n --fa: "\\f7c4";\n}\n\n.fa-person-skating {\n --fa: "\\f7c5";\n}\n\n.fa-skating {\n --fa: "\\f7c5";\n}\n\n.fa-person-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-person-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-sleigh {\n --fa: "\\f7cc";\n}\n\n.fa-comment-sms {\n --fa: "\\f7cd";\n}\n\n.fa-sms {\n --fa: "\\f7cd";\n}\n\n.fa-person-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowman {\n --fa: "\\f7d0";\n}\n\n.fa-snowplow {\n --fa: "\\f7d2";\n}\n\n.fa-tenge-sign {\n --fa: "\\f7d7";\n}\n\n.fa-tenge {\n --fa: "\\f7d7";\n}\n\n.fa-toilet {\n --fa: "\\f7d8";\n}\n\n.fa-screwdriver-wrench {\n --fa: "\\f7d9";\n}\n\n.fa-tools {\n --fa: "\\f7d9";\n}\n\n.fa-cable-car {\n --fa: "\\f7da";\n}\n\n.fa-tram {\n --fa: "\\f7da";\n}\n\n.fa-fire-flame-curved {\n --fa: "\\f7e4";\n}\n\n.fa-fire-alt {\n --fa: "\\f7e4";\n}\n\n.fa-bacon {\n --fa: "\\f7e5";\n}\n\n.fa-book-medical {\n --fa: "\\f7e6";\n}\n\n.fa-bread-slice {\n --fa: "\\f7ec";\n}\n\n.fa-cheese {\n --fa: "\\f7ef";\n}\n\n.fa-house-chimney-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clinic-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clipboard-user {\n --fa: "\\f7f3";\n}\n\n.fa-comment-medical {\n --fa: "\\f7f5";\n}\n\n.fa-crutch {\n --fa: "\\f7f7";\n}\n\n.fa-disease {\n --fa: "\\f7fa";\n}\n\n.fa-egg {\n --fa: "\\f7fb";\n}\n\n.fa-folder-tree {\n --fa: "\\f802";\n}\n\n.fa-burger {\n --fa: "\\f805";\n}\n\n.fa-hamburger {\n --fa: "\\f805";\n}\n\n.fa-hand-middle-finger {\n --fa: "\\f806";\n}\n\n.fa-helmet-safety {\n --fa: "\\f807";\n}\n\n.fa-hard-hat {\n --fa: "\\f807";\n}\n\n.fa-hat-hard {\n --fa: "\\f807";\n}\n\n.fa-hospital-user {\n --fa: "\\f80d";\n}\n\n.fa-hotdog {\n --fa: "\\f80f";\n}\n\n.fa-ice-cream {\n --fa: "\\f810";\n}\n\n.fa-laptop-medical {\n --fa: "\\f812";\n}\n\n.fa-pager {\n --fa: "\\f815";\n}\n\n.fa-pepper-hot {\n --fa: "\\f816";\n}\n\n.fa-pizza-slice {\n --fa: "\\f818";\n}\n\n.fa-sack-dollar {\n --fa: "\\f81d";\n}\n\n.fa-book-tanakh {\n --fa: "\\f827";\n}\n\n.fa-tanakh {\n --fa: "\\f827";\n}\n\n.fa-bars-progress {\n --fa: "\\f828";\n}\n\n.fa-tasks-alt {\n --fa: "\\f828";\n}\n\n.fa-trash-arrow-up {\n --fa: "\\f829";\n}\n\n.fa-trash-restore {\n --fa: "\\f829";\n}\n\n.fa-trash-can-arrow-up {\n --fa: "\\f82a";\n}\n\n.fa-trash-restore-alt {\n --fa: "\\f82a";\n}\n\n.fa-user-nurse {\n --fa: "\\f82f";\n}\n\n.fa-wave-square {\n --fa: "\\f83e";\n}\n\n.fa-person-biking {\n --fa: "\\f84a";\n}\n\n.fa-biking {\n --fa: "\\f84a";\n}\n\n.fa-border-all {\n --fa: "\\f84c";\n}\n\n.fa-border-none {\n --fa: "\\f850";\n}\n\n.fa-border-top-left {\n --fa: "\\f853";\n}\n\n.fa-border-style {\n --fa: "\\f853";\n}\n\n.fa-person-digging {\n --fa: "\\f85e";\n}\n\n.fa-digging {\n --fa: "\\f85e";\n}\n\n.fa-fan {\n --fa: "\\f863";\n}\n\n.fa-icons {\n --fa: "\\f86d";\n}\n\n.fa-heart-music-camera-bolt {\n --fa: "\\f86d";\n}\n\n.fa-phone-flip {\n --fa: "\\f879";\n}\n\n.fa-phone-alt {\n --fa: "\\f879";\n}\n\n.fa-square-phone-flip {\n --fa: "\\f87b";\n}\n\n.fa-phone-square-alt {\n --fa: "\\f87b";\n}\n\n.fa-photo-film {\n --fa: "\\f87c";\n}\n\n.fa-photo-video {\n --fa: "\\f87c";\n}\n\n.fa-text-slash {\n --fa: "\\f87d";\n}\n\n.fa-remove-format {\n --fa: "\\f87d";\n}\n\n.fa-arrow-down-z-a {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-desc {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-down-alt {\n --fa: "\\f881";\n}\n\n.fa-arrow-up-z-a {\n --fa: "\\f882";\n}\n\n.fa-sort-alpha-up-alt {\n --fa: "\\f882";\n}\n\n.fa-arrow-down-short-wide {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-desc {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-down-alt {\n --fa: "\\f884";\n}\n\n.fa-arrow-up-short-wide {\n --fa: "\\f885";\n}\n\n.fa-sort-amount-up-alt {\n --fa: "\\f885";\n}\n\n.fa-arrow-down-9-1 {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-desc {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-down-alt {\n --fa: "\\f886";\n}\n\n.fa-arrow-up-9-1 {\n --fa: "\\f887";\n}\n\n.fa-sort-numeric-up-alt {\n --fa: "\\f887";\n}\n\n.fa-spell-check {\n --fa: "\\f891";\n}\n\n.fa-voicemail {\n --fa: "\\f897";\n}\n\n.fa-hat-cowboy {\n --fa: "\\f8c0";\n}\n\n.fa-hat-cowboy-side {\n --fa: "\\f8c1";\n}\n\n.fa-computer-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-radio {\n --fa: "\\f8d7";\n}\n\n.fa-record-vinyl {\n --fa: "\\f8d9";\n}\n\n.fa-walkie-talkie {\n --fa: "\\f8ef";\n}\n\n.fa-caravan {\n --fa: "\\f8ff";\n}\n',""]);const s=i},4160:(n,t,e)=>{"use strict";n.exports=function(){if("object"==typeof globalThis)return globalThis;var n;try{n=this||new Function("return this")()}catch(n){if("object"==typeof window)return window;if("object"==typeof self)return self;if(void 0!==e.g)return e.g}return n}()},4274:n=>{"use strict";n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 20 20%27%3e%3cpath fill=%27none%27 stroke=%27%23fff%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27 stroke-width=%273%27 d=%27M6 10h8%27/%3e%3c/svg%3e"},4417:n=>{"use strict";n.exports=function(n,t){return t||(t={}),n?(n=String(n.__esModule?n.default:n),/^['"].*['"]$/.test(n)&&(n=n.slice(1,-1)),t.hash&&(n+=t.hash),/["'() \t\n]|(%20)/.test(n)||t.needQuotes?'"'.concat(n.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):n):n}},4493:(n,t,e)=>{var r=e(4692),a=e(4160);void 0===a.$&&(a.$=r),void 0===a.jQuery&&(a.jQuery=r),n.exports=r},4692:function(n,t){var e;!function(t,e){"use strict";"object"==typeof n.exports?n.exports=t.document?e(t,!0):function(n){if(!n.document)throw new Error("jQuery requires a window with a document");return e(n)}:e(t)}("undefined"!=typeof window?window:this,function(r,a){"use strict";var o=[],i=Object.getPrototypeOf,s=o.slice,l=o.flat?function(n){return o.flat.call(n)}:function(n){return o.concat.apply([],n)},f=o.push,d=o.indexOf,c={},p=c.toString,b=c.hasOwnProperty,m=b.toString,g=m.call(Object),u={},h=function(n){return"function"==typeof n&&"number"!=typeof n.nodeType&&"function"!=typeof n.item},v=function(n){return null!=n&&n===n.window},x=r.document,w={type:!0,src:!0,nonce:!0,noModule:!0};function y(n,t,e){var r,a,o=(e=e||x).createElement("script");if(o.text=n,t)for(r in w)(a=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,a);e.head.appendChild(o).parentNode.removeChild(o)}function k(n){return null==n?n+"":"object"==typeof n||"function"==typeof n?c[p.call(n)]||"object":typeof n}var z="3.7.1",S=/HTML$/i,j=function(n,t){return new j.fn.init(n,t)};function A(n){var t=!!n&&"length"in n&&n.length,e=k(n);return!h(n)&&!v(n)&&("array"===e||0===t||"number"==typeof t&&t>0&&t-1 in n)}function E(n,t){return n.nodeName&&n.nodeName.toLowerCase()===t.toLowerCase()}j.fn=j.prototype={jquery:z,constructor:j,length:0,toArray:function(){return s.call(this)},get:function(n){return null==n?s.call(this):n<0?this[n+this.length]:this[n]},pushStack:function(n){var t=j.merge(this.constructor(),n);return t.prevObject=this,t},each:function(n){return j.each(this,n)},map:function(n){return this.pushStack(j.map(this,function(t,e){return n.call(t,e,t)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,function(n,t){return(t+1)%2}))},odd:function(){return this.pushStack(j.grep(this,function(n,t){return t%2}))},eq:function(n){var t=this.length,e=+n+(n<0?t:0);return this.pushStack(e>=0&&e+~]|"+D+")"+D+"*"),F=new RegExp(D+"|>"),H=new RegExp(M),$=new RegExp("^"+L+"$"),I={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+D+"*(even|odd|(([+-]|)(\\d*)n|)"+D+"*(?:([+-]|)"+D+"*(\\d+)|))"+D+"*\\)|)","i"),bool:new RegExp("^(?:"+A+")$","i"),needsContext:new RegExp("^"+D+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+D+"*((?:-\\d)?\\d*)"+D+"*\\)|)(?=[^-]|$)","i")},V=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,W=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Y=/[+~]/,X=new RegExp("\\\\[\\da-fA-F]{1,6}"+D+"?|\\\\([^\\r\\n\\f])","g"),Q=function(n,t){var e="0x"+n.slice(1)-65536;return t||(e<0?String.fromCharCode(e+65536):String.fromCharCode(e>>10|55296,1023&e|56320))},J=function(){fn()},K=bn(function(n){return!0===n.disabled&&E(n,"fieldset")},{dir:"parentNode",next:"legend"});try{g.apply(o=s.call(R.childNodes),R.childNodes),o[R.childNodes.length].nodeType}catch(n){g={apply:function(n,t){U.apply(n,s.call(t))},call:function(n){U.apply(n,s.call(arguments,1))}}}function Z(n,t,e,r){var a,o,i,s,f,d,b,m=t&&t.ownerDocument,v=t?t.nodeType:9;if(e=e||[],"string"!=typeof n||!n||1!==v&&9!==v&&11!==v)return e;if(!r&&(fn(t),t=t||l,c)){if(11!==v&&(f=W.exec(n)))if(a=f[1]){if(9===v){if(!(i=t.getElementById(a)))return e;if(i.id===a)return g.call(e,i),e}else if(m&&(i=m.getElementById(a))&&Z.contains(t,i)&&i.id===a)return g.call(e,i),e}else{if(f[2])return g.apply(e,t.getElementsByTagName(n)),e;if((a=f[3])&&t.getElementsByClassName)return g.apply(e,t.getElementsByClassName(a)),e}if(!(z[n+" "]||p&&p.test(n))){if(b=n,m=t,1===v&&(F.test(n)||B.test(n))){for((m=Y.test(n)&&ln(t.parentNode)||t)==t&&u.scope||((s=t.getAttribute("id"))?s=j.escapeSelector(s):t.setAttribute("id",s=h)),o=(d=cn(n)).length;o--;)d[o]=(s?"#"+s:":scope")+" "+pn(d[o]);b=d.join(",")}try{return g.apply(e,m.querySelectorAll(b)),e}catch(t){z(n,!0)}finally{s===h&&t.removeAttribute("id")}}}return xn(n.replace(q,"$1"),t,e,r)}function nn(){var n=[];return function e(r,a){return n.push(r+" ")>t.cacheLength&&delete e[n.shift()],e[r+" "]=a}}function tn(n){return n[h]=!0,n}function en(n){var t=l.createElement("fieldset");try{return!!n(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function rn(n){return function(t){return E(t,"input")&&t.type===n}}function an(n){return function(t){return(E(t,"input")||E(t,"button"))&&t.type===n}}function on(n){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===n:t.disabled===n:t.isDisabled===n||t.isDisabled!==!n&&K(t)===n:t.disabled===n:"label"in t&&t.disabled===n}}function sn(n){return tn(function(t){return t=+t,tn(function(e,r){for(var a,o=n([],e.length,t),i=o.length;i--;)e[a=o[i]]&&(e[a]=!(r[a]=e[a]))})})}function ln(n){return n&&void 0!==n.getElementsByTagName&&n}function fn(n){var e,r=n?n.ownerDocument||n:R;return r!=l&&9===r.nodeType&&r.documentElement?(f=(l=r).documentElement,c=!j.isXMLDoc(l),m=f.matches||f.webkitMatchesSelector||f.msMatchesSelector,f.msMatchesSelector&&R!=l&&(e=l.defaultView)&&e.top!==e&&e.addEventListener("unload",J),u.getById=en(function(n){return f.appendChild(n).id=j.expando,!l.getElementsByName||!l.getElementsByName(j.expando).length}),u.disconnectedMatch=en(function(n){return m.call(n,"*")}),u.scope=en(function(){return l.querySelectorAll(":scope")}),u.cssHas=en(function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(n){return!0}}),u.getById?(t.filter.ID=function(n){var t=n.replace(X,Q);return function(n){return n.getAttribute("id")===t}},t.find.ID=function(n,t){if(void 0!==t.getElementById&&c){var e=t.getElementById(n);return e?[e]:[]}}):(t.filter.ID=function(n){var t=n.replace(X,Q);return function(n){var e=void 0!==n.getAttributeNode&&n.getAttributeNode("id");return e&&e.value===t}},t.find.ID=function(n,t){if(void 0!==t.getElementById&&c){var e,r,a,o=t.getElementById(n);if(o){if((e=o.getAttributeNode("id"))&&e.value===n)return[o];for(a=t.getElementsByName(n),r=0;o=a[r++];)if((e=o.getAttributeNode("id"))&&e.value===n)return[o]}return[]}}),t.find.TAG=function(n,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(n):t.querySelectorAll(n)},t.find.CLASS=function(n,t){if(void 0!==t.getElementsByClassName&&c)return t.getElementsByClassName(n)},p=[],en(function(n){var t;f.appendChild(n).innerHTML="",n.querySelectorAll("[selected]").length||p.push("\\["+D+"*(?:value|"+A+")"),n.querySelectorAll("[id~="+h+"-]").length||p.push("~="),n.querySelectorAll("a#"+h+"+*").length||p.push(".#.+[+~]"),n.querySelectorAll(":checked").length||p.push(":checked"),(t=l.createElement("input")).setAttribute("type","hidden"),n.appendChild(t).setAttribute("name","D"),f.appendChild(n).disabled=!0,2!==n.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=l.createElement("input")).setAttribute("name",""),n.appendChild(t),n.querySelectorAll("[name='']").length||p.push("\\["+D+"*name"+D+"*="+D+"*(?:''|\"\")")}),u.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),S=function(n,t){if(n===t)return i=!0,0;var e=!n.compareDocumentPosition-!t.compareDocumentPosition;return e||(1&(e=(n.ownerDocument||n)==(t.ownerDocument||t)?n.compareDocumentPosition(t):1)||!u.sortDetached&&t.compareDocumentPosition(n)===e?n===l||n.ownerDocument==R&&Z.contains(R,n)?-1:t===l||t.ownerDocument==R&&Z.contains(R,t)?1:a?d.call(a,n)-d.call(a,t):0:4&e?-1:1)},l):l}for(n in Z.matches=function(n,t){return Z(n,null,null,t)},Z.matchesSelector=function(n,t){if(fn(n),c&&!z[t+" "]&&(!p||!p.test(t)))try{var e=m.call(n,t);if(e||u.disconnectedMatch||n.document&&11!==n.document.nodeType)return e}catch(n){z(t,!0)}return Z(t,l,null,[n]).length>0},Z.contains=function(n,t){return(n.ownerDocument||n)!=l&&fn(n),j.contains(n,t)},Z.attr=function(n,e){(n.ownerDocument||n)!=l&&fn(n);var r=t.attrHandle[e.toLowerCase()],a=r&&b.call(t.attrHandle,e.toLowerCase())?r(n,e,!c):void 0;return void 0!==a?a:n.getAttribute(e)},Z.error=function(n){throw new Error("Syntax error, unrecognized expression: "+n)},j.uniqueSort=function(n){var t,e=[],r=0,o=0;if(i=!u.sortStable,a=!u.sortStable&&s.call(n,0),T.call(n,S),i){for(;t=n[o++];)t===n[o]&&(r=e.push(o));for(;r--;)N.call(n,e[r],1)}return a=null,n},j.fn.uniqueSort=function(){return this.pushStack(j.uniqueSort(s.apply(this)))},t=j.expr={cacheLength:50,createPseudo:tn,match:I,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(n){return n[1]=n[1].replace(X,Q),n[3]=(n[3]||n[4]||n[5]||"").replace(X,Q),"~="===n[2]&&(n[3]=" "+n[3]+" "),n.slice(0,4)},CHILD:function(n){return n[1]=n[1].toLowerCase(),"nth"===n[1].slice(0,3)?(n[3]||Z.error(n[0]),n[4]=+(n[4]?n[5]+(n[6]||1):2*("even"===n[3]||"odd"===n[3])),n[5]=+(n[7]+n[8]||"odd"===n[3])):n[3]&&Z.error(n[0]),n},PSEUDO:function(n){var t,e=!n[6]&&n[2];return I.CHILD.test(n[0])?null:(n[3]?n[2]=n[4]||n[5]||"":e&&H.test(e)&&(t=cn(e,!0))&&(t=e.indexOf(")",e.length-t)-e.length)&&(n[0]=n[0].slice(0,t),n[2]=e.slice(0,t)),n.slice(0,3))}},filter:{TAG:function(n){var t=n.replace(X,Q).toLowerCase();return"*"===n?function(){return!0}:function(n){return E(n,t)}},CLASS:function(n){var t=w[n+" "];return t||(t=new RegExp("(^|"+D+")"+n+"("+D+"|$)"))&&w(n,function(n){return t.test("string"==typeof n.className&&n.className||void 0!==n.getAttribute&&n.getAttribute("class")||"")})},ATTR:function(n,t,e){return function(r){var a=Z.attr(r,n);return null==a?"!="===t:!t||(a+="","="===t?a===e:"!="===t?a!==e:"^="===t?e&&0===a.indexOf(e):"*="===t?e&&a.indexOf(e)>-1:"$="===t?e&&a.slice(-e.length)===e:"~="===t?(" "+a.replace(O," ")+" ").indexOf(e)>-1:"|="===t&&(a===e||a.slice(0,e.length+1)===e+"-"))}},CHILD:function(n,t,e,r,a){var o="nth"!==n.slice(0,3),i="last"!==n.slice(-4),s="of-type"===t;return 1===r&&0===a?function(n){return!!n.parentNode}:function(t,e,l){var f,d,c,p,b,m=o!==i?"nextSibling":"previousSibling",g=t.parentNode,u=s&&t.nodeName.toLowerCase(),x=!l&&!s,w=!1;if(g){if(o){for(;m;){for(c=t;c=c[m];)if(s?E(c,u):1===c.nodeType)return!1;b=m="only"===n&&!b&&"nextSibling"}return!0}if(b=[i?g.firstChild:g.lastChild],i&&x){for(w=(p=(f=(d=g[h]||(g[h]={}))[n]||[])[0]===v&&f[1])&&f[2],c=p&&g.childNodes[p];c=++p&&c&&c[m]||(w=p=0)||b.pop();)if(1===c.nodeType&&++w&&c===t){d[n]=[v,p,w];break}}else if(x&&(w=p=(f=(d=t[h]||(t[h]={}))[n]||[])[0]===v&&f[1]),!1===w)for(;(c=++p&&c&&c[m]||(w=p=0)||b.pop())&&(!(s?E(c,u):1===c.nodeType)||!++w||(x&&((d=c[h]||(c[h]={}))[n]=[v,w]),c!==t)););return(w-=a)===r||w%r===0&&w/r>=0}}},PSEUDO:function(n,e){var r,a=t.pseudos[n]||t.setFilters[n.toLowerCase()]||Z.error("unsupported pseudo: "+n);return a[h]?a(e):a.length>1?(r=[n,n,"",e],t.setFilters.hasOwnProperty(n.toLowerCase())?tn(function(n,t){for(var r,o=a(n,e),i=o.length;i--;)n[r=d.call(n,o[i])]=!(t[r]=o[i])}):function(n){return a(n,0,r)}):a}},pseudos:{not:tn(function(n){var t=[],e=[],r=vn(n.replace(q,"$1"));return r[h]?tn(function(n,t,e,a){for(var o,i=r(n,null,a,[]),s=n.length;s--;)(o=i[s])&&(n[s]=!(t[s]=o))}):function(n,a,o){return t[0]=n,r(t,null,o,e),t[0]=null,!e.pop()}}),has:tn(function(n){return function(t){return Z(n,t).length>0}}),contains:tn(function(n){return n=n.replace(X,Q),function(t){return(t.textContent||j.text(t)).indexOf(n)>-1}}),lang:tn(function(n){return $.test(n||"")||Z.error("unsupported lang: "+n),n=n.replace(X,Q).toLowerCase(),function(t){var e;do{if(e=c?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(e=e.toLowerCase())===n||0===e.indexOf(n+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(n){var t=r.location&&r.location.hash;return t&&t.slice(1)===n.id},root:function(n){return n===f},focus:function(n){return n===function(){try{return l.activeElement}catch(n){}}()&&l.hasFocus()&&!!(n.type||n.href||~n.tabIndex)},enabled:on(!1),disabled:on(!0),checked:function(n){return E(n,"input")&&!!n.checked||E(n,"option")&&!!n.selected},selected:function(n){return n.parentNode&&n.parentNode.selectedIndex,!0===n.selected},empty:function(n){for(n=n.firstChild;n;n=n.nextSibling)if(n.nodeType<6)return!1;return!0},parent:function(n){return!t.pseudos.empty(n)},header:function(n){return G.test(n.nodeName)},input:function(n){return V.test(n.nodeName)},button:function(n){return E(n,"input")&&"button"===n.type||E(n,"button")},text:function(n){var t;return E(n,"input")&&"text"===n.type&&(null==(t=n.getAttribute("type"))||"text"===t.toLowerCase())},first:sn(function(){return[0]}),last:sn(function(n,t){return[t-1]}),eq:sn(function(n,t,e){return[e<0?e+t:e]}),even:sn(function(n,t){for(var e=0;et?t:e;--r>=0;)n.push(r);return n}),gt:sn(function(n,t,e){for(var r=e<0?e+t:e;++r1?function(t,e,r){for(var a=n.length;a--;)if(!n[a](t,e,r))return!1;return!0}:n[0]}function gn(n,t,e,r,a){for(var o,i=[],s=0,l=n.length,f=null!=t;s-1&&(o[f]=!(i[f]=p))}}else b=gn(b===i?b.splice(h,b.length):b),a?a(null,i,b,l):g.apply(i,b)})}function hn(n){for(var r,a,o,i=n.length,s=t.relative[n[0].type],l=s||t.relative[" "],f=s?1:0,c=bn(function(n){return n===r},l,!0),p=bn(function(n){return d.call(r,n)>-1},l,!0),b=[function(n,t,a){var o=!s&&(a||t!=e)||((r=t).nodeType?c(n,t,a):p(n,t,a));return r=null,o}];f1&&mn(b),f>1&&pn(n.slice(0,f-1).concat({value:" "===n[f-2].type?"*":""})).replace(q,"$1"),a,f0,o=n.length>0,i=function(i,s,f,d,p){var b,m,u,h=0,x="0",w=i&&[],y=[],k=e,z=i||o&&t.find.TAG("*",p),S=v+=null==k?1:Math.random()||.1,A=z.length;for(p&&(e=s==l||s||p);x!==A&&null!=(b=z[x]);x++){if(o&&b){for(m=0,s||b.ownerDocument==l||(fn(b),f=!c);u=n[m++];)if(u(b,s||l,f)){g.call(d,b);break}p&&(v=S)}a&&((b=!u&&b)&&h--,i&&w.push(b))}if(h+=x,a&&x!==h){for(m=0;u=r[m++];)u(w,y,s,f);if(i){if(h>0)for(;x--;)w[x]||y[x]||(y[x]=C.call(d));y=gn(y)}g.apply(d,y),p&&!i&&y.length>0&&h+r.length>1&&j.uniqueSort(d)}return p&&(v=S,e=k),w};return a?tn(i):i}(i,o)),s.selector=n}return s}function xn(n,e,r,a){var o,i,s,l,f,d="function"==typeof n&&n,p=!a&&cn(n=d.selector||n);if(r=r||[],1===p.length){if((i=p[0]=p[0].slice(0)).length>2&&"ID"===(s=i[0]).type&&9===e.nodeType&&c&&t.relative[i[1].type]){if(!(e=(t.find.ID(s.matches[0].replace(X,Q),e)||[])[0]))return r;d&&(e=e.parentNode),n=n.slice(i.shift().value.length)}for(o=I.needsContext.test(n)?0:i.length;o--&&(s=i[o],!t.relative[l=s.type]);)if((f=t.find[l])&&(a=f(s.matches[0].replace(X,Q),Y.test(i[0].type)&&ln(e.parentNode)||e))){if(i.splice(o,1),!(n=a.length&&pn(i)))return g.apply(r,a),r;break}}return(d||vn(n,p))(a,e,!c,r,!e||Y.test(n)&&ln(e.parentNode)||e),r}dn.prototype=t.filters=t.pseudos,t.setFilters=new dn,u.sortStable=h.split("").sort(S).join("")===h,fn(),u.sortDetached=en(function(n){return 1&n.compareDocumentPosition(l.createElement("fieldset"))}),j.find=Z,j.expr[":"]=j.expr.pseudos,j.unique=j.uniqueSort,Z.compile=vn,Z.select=xn,Z.setDocument=fn,Z.tokenize=cn,Z.escape=j.escapeSelector,Z.getText=j.text,Z.isXML=j.isXMLDoc,Z.selectors=j.expr,Z.support=j.support,Z.uniqueSort=j.uniqueSort}();var M=function(n,t,e){for(var r=[],a=void 0!==e;(n=n[t])&&9!==n.nodeType;)if(1===n.nodeType){if(a&&j(n).is(e))break;r.push(n)}return r},O=function(n,t){for(var e=[];n;n=n.nextSibling)1===n.nodeType&&n!==t&&e.push(n);return e},_=j.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(n,t,e){return h(t)?j.grep(n,function(n,r){return!!t.call(n,r,n)!==e}):t.nodeType?j.grep(n,function(n){return n===t!==e}):"string"!=typeof t?j.grep(n,function(n){return d.call(t,n)>-1!==e}):j.filter(t,n,e)}j.filter=function(n,t,e){var r=t[0];return e&&(n=":not("+n+")"),1===t.length&&1===r.nodeType?j.find.matchesSelector(r,n)?[r]:[]:j.find.matches(n,j.grep(t,function(n){return 1===n.nodeType}))},j.fn.extend({find:function(n){var t,e,r=this.length,a=this;if("string"!=typeof n)return this.pushStack(j(n).filter(function(){for(t=0;t1?j.uniqueSort(e):e},filter:function(n){return this.pushStack(F(this,n||[],!1))},not:function(n){return this.pushStack(F(this,n||[],!0))},is:function(n){return!!F(this,"string"==typeof n&&_.test(n)?j(n):n||[],!1).length}});var H,$=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(n,t,e){var r,a;if(!n)return this;if(e=e||H,"string"==typeof n){if(!(r="<"===n[0]&&">"===n[n.length-1]&&n.length>=3?[null,n,null]:$.exec(n))||!r[1]&&t)return!t||t.jquery?(t||e).find(n):this.constructor(t).find(n);if(r[1]){if(t=t instanceof j?t[0]:t,j.merge(this,j.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:x,!0)),B.test(r[1])&&j.isPlainObject(t))for(r in t)h(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(a=x.getElementById(r[2]))&&(this[0]=a,this.length=1),this}return n.nodeType?(this[0]=n,this.length=1,this):h(n)?void 0!==e.ready?e.ready(n):n(j):j.makeArray(n,this)}).prototype=j.fn,H=j(x);var I=/^(?:parents|prev(?:Until|All))/,V={children:!0,contents:!0,next:!0,prev:!0};function G(n,t){for(;(n=n[t])&&1!==n.nodeType;);return n}j.fn.extend({has:function(n){var t=j(n,this),e=t.length;return this.filter(function(){for(var n=0;n-1:1===e.nodeType&&j.find.matchesSelector(e,n))){o.push(e);break}return this.pushStack(o.length>1?j.uniqueSort(o):o)},index:function(n){return n?"string"==typeof n?d.call(j(n),this[0]):d.call(this,n.jquery?n[0]:n):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(n,t){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(n,t))))},addBack:function(n){return this.add(null==n?this.prevObject:this.prevObject.filter(n))}}),j.each({parent:function(n){var t=n.parentNode;return t&&11!==t.nodeType?t:null},parents:function(n){return M(n,"parentNode")},parentsUntil:function(n,t,e){return M(n,"parentNode",e)},next:function(n){return G(n,"nextSibling")},prev:function(n){return G(n,"previousSibling")},nextAll:function(n){return M(n,"nextSibling")},prevAll:function(n){return M(n,"previousSibling")},nextUntil:function(n,t,e){return M(n,"nextSibling",e)},prevUntil:function(n,t,e){return M(n,"previousSibling",e)},siblings:function(n){return O((n.parentNode||{}).firstChild,n)},children:function(n){return O(n.firstChild)},contents:function(n){return null!=n.contentDocument&&i(n.contentDocument)?n.contentDocument:(E(n,"template")&&(n=n.content||n),j.merge([],n.childNodes))}},function(n,t){j.fn[n]=function(e,r){var a=j.map(this,t,e);return"Until"!==n.slice(-5)&&(r=e),r&&"string"==typeof r&&(a=j.filter(r,a)),this.length>1&&(V[n]||j.uniqueSort(a),I.test(n)&&a.reverse()),this.pushStack(a)}});var W=/[^\x20\t\r\n\f]+/g;function Y(n){return n}function X(n){throw n}function Q(n,t,e,r){var a;try{n&&h(a=n.promise)?a.call(n).done(t).fail(e):n&&h(a=n.then)?a.call(n,t,e):t.apply(void 0,[n].slice(r))}catch(n){e.apply(void 0,[n])}}j.Callbacks=function(n){n="string"==typeof n?function(n){var t={};return j.each(n.match(W)||[],function(n,e){t[e]=!0}),t}(n):j.extend({},n);var t,e,r,a,o=[],i=[],s=-1,l=function(){for(a=a||n.once,r=t=!0;i.length;s=-1)for(e=i.shift();++s-1;)o.splice(e,1),e<=s&&s--}),this},has:function(n){return n?j.inArray(n,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return a=i=[],o=e="",this},disabled:function(){return!o},lock:function(){return a=i=[],e||t||(o=e=""),this},locked:function(){return!!a},fireWith:function(n,e){return a||(e=[n,(e=e||[]).slice?e.slice():e],i.push(e),t||l()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!r}};return f},j.extend({Deferred:function(n){var t=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],e="pending",a={state:function(){return e},always:function(){return o.done(arguments).fail(arguments),this},catch:function(n){return a.then(null,n)},pipe:function(){var n=arguments;return j.Deferred(function(e){j.each(t,function(t,r){var a=h(n[r[4]])&&n[r[4]];o[r[1]](function(){var n=a&&a.apply(this,arguments);n&&h(n.promise)?n.promise().progress(e.notify).done(e.resolve).fail(e.reject):e[r[0]+"With"](this,a?[n]:arguments)})}),n=null}).promise()},then:function(n,e,a){var o=0;function i(n,t,e,a){return function(){var s=this,l=arguments,f=function(){var r,f;if(!(n=o&&(e!==X&&(s=void 0,l=[r]),t.rejectWith(s,l))}};n?d():(j.Deferred.getErrorHook?d.error=j.Deferred.getErrorHook():j.Deferred.getStackHook&&(d.error=j.Deferred.getStackHook()),r.setTimeout(d))}}return j.Deferred(function(r){t[0][3].add(i(0,r,h(a)?a:Y,r.notifyWith)),t[1][3].add(i(0,r,h(n)?n:Y)),t[2][3].add(i(0,r,h(e)?e:X))}).promise()},promise:function(n){return null!=n?j.extend(n,a):a}},o={};return j.each(t,function(n,r){var i=r[2],s=r[5];a[r[1]]=i.add,s&&i.add(function(){e=s},t[3-n][2].disable,t[3-n][3].disable,t[0][2].lock,t[0][3].lock),i.add(r[3].fire),o[r[0]]=function(){return o[r[0]+"With"](this===o?void 0:this,arguments),this},o[r[0]+"With"]=i.fireWith}),a.promise(o),n&&n.call(o,o),o},when:function(n){var t=arguments.length,e=t,r=Array(e),a=s.call(arguments),o=j.Deferred(),i=function(n){return function(e){r[n]=this,a[n]=arguments.length>1?s.call(arguments):e,--t||o.resolveWith(r,a)}};if(t<=1&&(Q(n,o.done(i(e)).resolve,o.reject,!t),"pending"===o.state()||h(a[e]&&a[e].then)))return o.then();for(;e--;)Q(a[e],i(e),o.reject);return o.promise()}});var J=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(n,t){r.console&&r.console.warn&&n&&J.test(n.name)&&r.console.warn("jQuery.Deferred exception: "+n.message,n.stack,t)},j.readyException=function(n){r.setTimeout(function(){throw n})};var K=j.Deferred();function Z(){x.removeEventListener("DOMContentLoaded",Z),r.removeEventListener("load",Z),j.ready()}j.fn.ready=function(n){return K.then(n).catch(function(n){j.readyException(n)}),this},j.extend({isReady:!1,readyWait:1,ready:function(n){(!0===n?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==n&&--j.readyWait>0||K.resolveWith(x,[j]))}}),j.ready.then=K.then,"complete"===x.readyState||"loading"!==x.readyState&&!x.documentElement.doScroll?r.setTimeout(j.ready):(x.addEventListener("DOMContentLoaded",Z),r.addEventListener("load",Z));var nn=function(n,t,e,r,a,o,i){var s=0,l=n.length,f=null==e;if("object"===k(e))for(s in a=!0,e)nn(n,t,s,e[s],!0,o,i);else if(void 0!==r&&(a=!0,h(r)||(i=!0),f&&(i?(t.call(n,r),t=null):(f=t,t=function(n,t,e){return f.call(j(n),e)})),t))for(;s1,null,!0)},removeData:function(n){return this.each(function(){fn.remove(this,n)})}}),j.extend({queue:function(n,t,e){var r;if(n)return t=(t||"fx")+"queue",r=ln.get(n,t),e&&(!r||Array.isArray(e)?r=ln.access(n,t,j.makeArray(e)):r.push(e)),r||[]},dequeue:function(n,t){t=t||"fx";var e=j.queue(n,t),r=e.length,a=e.shift(),o=j._queueHooks(n,t);"inprogress"===a&&(a=e.shift(),r--),a&&("fx"===t&&e.unshift("inprogress"),delete o.stop,a.call(n,function(){j.dequeue(n,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(n,t){var e=t+"queueHooks";return ln.get(n,e)||ln.access(n,e,{empty:j.Callbacks("once memory").add(function(){ln.remove(n,[t+"queue",e])})})}}),j.fn.extend({queue:function(n,t){var e=2;return"string"!=typeof n&&(t=n,n="fx",e--),arguments.length\x20\t\r\n\f]*)/i,Cn=/^$|^module$|\/(?:java|ecma)script/i;Sn=x.createDocumentFragment().appendChild(x.createElement("div")),(jn=x.createElement("input")).setAttribute("type","radio"),jn.setAttribute("checked","checked"),jn.setAttribute("name","t"),Sn.appendChild(jn),u.checkClone=Sn.cloneNode(!0).cloneNode(!0).lastChild.checked,Sn.innerHTML="",u.noCloneChecked=!!Sn.cloneNode(!0).lastChild.defaultValue,Sn.innerHTML="",u.option=!!Sn.lastChild;var Tn={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Nn(n,t){var e;return e=void 0!==n.getElementsByTagName?n.getElementsByTagName(t||"*"):void 0!==n.querySelectorAll?n.querySelectorAll(t||"*"):[],void 0===t||t&&E(n,t)?j.merge([n],e):e}function Dn(n,t){for(var e=0,r=n.length;e",""]);var qn=/<|&#?\w+;/;function Ln(n,t,e,r,a){for(var o,i,s,l,f,d,c=t.createDocumentFragment(),p=[],b=0,m=n.length;b-1)a&&a.push(o);else if(f=hn(o),i=Nn(c.appendChild(o),"script"),f&&Dn(i),e)for(d=0;o=i[d++];)Cn.test(o.type||"")&&e.push(o);return c}var Pn=/^([^.]*)(?:\.(.+)|)/;function Rn(){return!0}function Un(){return!1}function Mn(n,t,e,r,a,o){var i,s;if("object"==typeof t){for(s in"string"!=typeof e&&(r=r||e,e=void 0),t)Mn(n,s,e,r,t[s],o);return n}if(null==r&&null==a?(a=e,r=e=void 0):null==a&&("string"==typeof e?(a=r,r=void 0):(a=r,r=e,e=void 0)),!1===a)a=Un;else if(!a)return n;return 1===o&&(i=a,a=function(n){return j().off(n),i.apply(this,arguments)},a.guid=i.guid||(i.guid=j.guid++)),n.each(function(){j.event.add(this,t,a,r,e)})}function On(n,t,e){e?(ln.set(n,t,!1),j.event.add(n,t,{namespace:!1,handler:function(n){var e,r=ln.get(this,t);if(1&n.isTrigger&&this[t]){if(r)(j.event.special[t]||{}).delegateType&&n.stopPropagation();else if(r=s.call(arguments),ln.set(this,t,r),this[t](),e=ln.get(this,t),ln.set(this,t,!1),r!==e)return n.stopImmediatePropagation(),n.preventDefault(),e}else r&&(ln.set(this,t,j.event.trigger(r[0],r.slice(1),this)),n.stopPropagation(),n.isImmediatePropagationStopped=Rn)}})):void 0===ln.get(n,t)&&j.event.add(n,t,Rn)}j.event={global:{},add:function(n,t,e,r,a){var o,i,s,l,f,d,c,p,b,m,g,u=ln.get(n);if(on(n))for(e.handler&&(e=(o=e).handler,a=o.selector),a&&j.find.matchesSelector(un,a),e.guid||(e.guid=j.guid++),(l=u.events)||(l=u.events=Object.create(null)),(i=u.handle)||(i=u.handle=function(t){return void 0!==j&&j.event.triggered!==t.type?j.event.dispatch.apply(n,arguments):void 0}),f=(t=(t||"").match(W)||[""]).length;f--;)b=g=(s=Pn.exec(t[f])||[])[1],m=(s[2]||"").split(".").sort(),b&&(c=j.event.special[b]||{},b=(a?c.delegateType:c.bindType)||b,c=j.event.special[b]||{},d=j.extend({type:b,origType:g,data:r,handler:e,guid:e.guid,selector:a,needsContext:a&&j.expr.match.needsContext.test(a),namespace:m.join(".")},o),(p=l[b])||((p=l[b]=[]).delegateCount=0,c.setup&&!1!==c.setup.call(n,r,m,i)||n.addEventListener&&n.addEventListener(b,i)),c.add&&(c.add.call(n,d),d.handler.guid||(d.handler.guid=e.guid)),a?p.splice(p.delegateCount++,0,d):p.push(d),j.event.global[b]=!0)},remove:function(n,t,e,r,a){var o,i,s,l,f,d,c,p,b,m,g,u=ln.hasData(n)&&ln.get(n);if(u&&(l=u.events)){for(f=(t=(t||"").match(W)||[""]).length;f--;)if(b=g=(s=Pn.exec(t[f])||[])[1],m=(s[2]||"").split(".").sort(),b){for(c=j.event.special[b]||{},p=l[b=(r?c.delegateType:c.bindType)||b]||[],s=s[2]&&new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=o=p.length;o--;)d=p[o],!a&&g!==d.origType||e&&e.guid!==d.guid||s&&!s.test(d.namespace)||r&&r!==d.selector&&("**"!==r||!d.selector)||(p.splice(o,1),d.selector&&p.delegateCount--,c.remove&&c.remove.call(n,d));i&&!p.length&&(c.teardown&&!1!==c.teardown.call(n,m,u.handle)||j.removeEvent(n,b,u.handle),delete l[b])}else for(b in l)j.event.remove(n,b+t[f],e,r,!0);j.isEmptyObject(l)&&ln.remove(n,"handle events")}},dispatch:function(n){var t,e,r,a,o,i,s=new Array(arguments.length),l=j.event.fix(n),f=(ln.get(this,"events")||Object.create(null))[l.type]||[],d=j.event.special[l.type]||{};for(s[0]=l,t=1;t=1))for(;f!==this;f=f.parentNode||this)if(1===f.nodeType&&("click"!==n.type||!0!==f.disabled)){for(o=[],i={},e=0;e-1:j.find(a,this,null,[f]).length),i[a]&&o.push(r);o.length&&s.push({elem:f,handlers:o})}return f=this,l\s*$/g;function Hn(n,t){return E(n,"table")&&E(11!==t.nodeType?t:t.firstChild,"tr")&&j(n).children("tbody")[0]||n}function $n(n){return n.type=(null!==n.getAttribute("type"))+"/"+n.type,n}function In(n){return"true/"===(n.type||"").slice(0,5)?n.type=n.type.slice(5):n.removeAttribute("type"),n}function Vn(n,t){var e,r,a,o,i,s;if(1===t.nodeType){if(ln.hasData(n)&&(s=ln.get(n).events))for(a in ln.remove(t,"handle events"),s)for(e=0,r=s[a].length;e1&&"string"==typeof m&&!u.checkClone&&Bn.test(m))return n.each(function(a){var o=n.eq(a);g&&(t[0]=m.call(this,a,o.html())),Wn(o,t,e,r)});if(p&&(o=(a=Ln(t,n[0].ownerDocument,!1,n,r)).firstChild,1===a.childNodes.length&&(a=o),o||r)){for(s=(i=j.map(Nn(a,"script"),$n)).length;c0&&Dn(i,!l&&Nn(n,"script")),s},cleanData:function(n){for(var t,e,r,a=j.event.special,o=0;void 0!==(e=n[o]);o++)if(on(e)){if(t=e[ln.expando]){if(t.events)for(r in t.events)a[r]?j.event.remove(e,r):j.removeEvent(e,r,t.handle);e[ln.expando]=void 0}e[fn.expando]&&(e[fn.expando]=void 0)}}}),j.fn.extend({detach:function(n){return Yn(this,n,!0)},remove:function(n){return Yn(this,n)},text:function(n){return nn(this,function(n){return void 0===n?j.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=n)})},null,n,arguments.length)},append:function(){return Wn(this,arguments,function(n){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Hn(this,n).appendChild(n)})},prepend:function(){return Wn(this,arguments,function(n){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Hn(this,n);t.insertBefore(n,t.firstChild)}})},before:function(){return Wn(this,arguments,function(n){this.parentNode&&this.parentNode.insertBefore(n,this)})},after:function(){return Wn(this,arguments,function(n){this.parentNode&&this.parentNode.insertBefore(n,this.nextSibling)})},empty:function(){for(var n,t=0;null!=(n=this[t]);t++)1===n.nodeType&&(j.cleanData(Nn(n,!1)),n.textContent="");return this},clone:function(n,t){return n=null!=n&&n,t=null==t?n:t,this.map(function(){return j.clone(this,n,t)})},html:function(n){return nn(this,function(n){var t=this[0]||{},e=0,r=this.length;if(void 0===n&&1===t.nodeType)return t.innerHTML;if("string"==typeof n&&!_n.test(n)&&!Tn[(En.exec(n)||["",""])[1].toLowerCase()]){n=j.htmlPrefilter(n);try{for(;e=0&&(l+=Math.max(0,Math.ceil(n["offset"+t[0].toUpperCase()+t.slice(1)]-o-l-s-.5))||0),l+f}function ct(n,t,e){var r=Jn(n),a=(!u.boxSizingReliable()||e)&&"border-box"===j.css(n,"boxSizing",!1,r),o=a,i=nt(n,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Xn.test(i)){if(!e)return i;i="auto"}return(!u.boxSizingReliable()&&a||!u.reliableTrDimensions()&&E(n,"tr")||"auto"===i||!parseFloat(i)&&"inline"===j.css(n,"display",!1,r))&&n.getClientRects().length&&(a="border-box"===j.css(n,"boxSizing",!1,r),(o=s in n)&&(i=n[s])),(i=parseFloat(i)||0)+dt(n,t,e||(a?"border":"content"),o,r,i)+"px"}function pt(n,t,e,r,a){return new pt.prototype.init(n,t,e,r,a)}j.extend({cssHooks:{opacity:{get:function(n,t){if(t){var e=nt(n,"opacity");return""===e?"1":e}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(n,t,e,r){if(n&&3!==n.nodeType&&8!==n.nodeType&&n.style){var a,o,i,s=an(t),l=Qn.test(t),f=n.style;if(l||(t=ot(s)),i=j.cssHooks[t]||j.cssHooks[s],void 0===e)return i&&"get"in i&&void 0!==(a=i.get(n,!1,r))?a:f[t];"string"==(o=typeof e)&&(a=mn.exec(e))&&a[1]&&(e=wn(n,t,a),o="number"),null!=e&&e==e&&("number"!==o||l||(e+=a&&a[3]||(j.cssNumber[s]?"":"px")),u.clearCloneStyle||""!==e||0!==t.indexOf("background")||(f[t]="inherit"),i&&"set"in i&&void 0===(e=i.set(n,e,r))||(l?f.setProperty(t,e):f[t]=e))}},css:function(n,t,e,r){var a,o,i,s=an(t);return Qn.test(t)||(t=ot(s)),(i=j.cssHooks[t]||j.cssHooks[s])&&"get"in i&&(a=i.get(n,!0,e)),void 0===a&&(a=nt(n,t,r)),"normal"===a&&t in lt&&(a=lt[t]),""===e||e?(o=parseFloat(a),!0===e||isFinite(o)?o||0:a):a}}),j.each(["height","width"],function(n,t){j.cssHooks[t]={get:function(n,e,r){if(e)return!it.test(j.css(n,"display"))||n.getClientRects().length&&n.getBoundingClientRect().width?ct(n,t,r):Kn(n,st,function(){return ct(n,t,r)})},set:function(n,e,r){var a,o=Jn(n),i=!u.scrollboxSize()&&"absolute"===o.position,s=(i||r)&&"border-box"===j.css(n,"boxSizing",!1,o),l=r?dt(n,t,r,s,o):0;return s&&i&&(l-=Math.ceil(n["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-dt(n,t,"border",!1,o)-.5)),l&&(a=mn.exec(e))&&"px"!==(a[3]||"px")&&(n.style[t]=e,e=j.css(n,t)),ft(0,e,l)}}}),j.cssHooks.marginLeft=tt(u.reliableMarginLeft,function(n,t){if(t)return(parseFloat(nt(n,"marginLeft"))||n.getBoundingClientRect().left-Kn(n,{marginLeft:0},function(){return n.getBoundingClientRect().left}))+"px"}),j.each({margin:"",padding:"",border:"Width"},function(n,t){j.cssHooks[n+t]={expand:function(e){for(var r=0,a={},o="string"==typeof e?e.split(" "):[e];r<4;r++)a[n+gn[r]+t]=o[r]||o[r-2]||o[0];return a}},"margin"!==n&&(j.cssHooks[n+t].set=ft)}),j.fn.extend({css:function(n,t){return nn(this,function(n,t,e){var r,a,o={},i=0;if(Array.isArray(t)){for(r=Jn(n),a=t.length;i1)}}),j.Tween=pt,pt.prototype={constructor:pt,init:function(n,t,e,r,a,o){this.elem=n,this.prop=e,this.easing=a||j.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(j.cssNumber[e]?"":"px")},cur:function(){var n=pt.propHooks[this.prop];return n&&n.get?n.get(this):pt.propHooks._default.get(this)},run:function(n){var t,e=pt.propHooks[this.prop];return this.options.duration?this.pos=t=j.easing[this.easing](n,this.options.duration*n,0,1,this.options.duration):this.pos=t=n,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),e&&e.set?e.set(this):pt.propHooks._default.set(this),this}},pt.prototype.init.prototype=pt.prototype,pt.propHooks={_default:{get:function(n){var t;return 1!==n.elem.nodeType||null!=n.elem[n.prop]&&null==n.elem.style[n.prop]?n.elem[n.prop]:(t=j.css(n.elem,n.prop,""))&&"auto"!==t?t:0},set:function(n){j.fx.step[n.prop]?j.fx.step[n.prop](n):1!==n.elem.nodeType||!j.cssHooks[n.prop]&&null==n.elem.style[ot(n.prop)]?n.elem[n.prop]=n.now:j.style(n.elem,n.prop,n.now+n.unit)}}},pt.propHooks.scrollTop=pt.propHooks.scrollLeft={set:function(n){n.elem.nodeType&&n.elem.parentNode&&(n.elem[n.prop]=n.now)}},j.easing={linear:function(n){return n},swing:function(n){return.5-Math.cos(n*Math.PI)/2},_default:"swing"},j.fx=pt.prototype.init,j.fx.step={};var bt,mt,gt=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function ht(){mt&&(!1===x.hidden&&r.requestAnimationFrame?r.requestAnimationFrame(ht):r.setTimeout(ht,j.fx.interval),j.fx.tick())}function vt(){return r.setTimeout(function(){bt=void 0}),bt=Date.now()}function xt(n,t){var e,r=0,a={height:n};for(t=t?1:0;r<4;r+=2-t)a["margin"+(e=gn[r])]=a["padding"+e]=n;return t&&(a.opacity=a.width=n),a}function wt(n,t,e){for(var r,a=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,i=a.length;o1)},removeAttr:function(n){return this.each(function(){j.removeAttr(this,n)})}}),j.extend({attr:function(n,t,e){var r,a,o=n.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===n.getAttribute?j.prop(n,t,e):(1===o&&j.isXMLDoc(n)||(a=j.attrHooks[t.toLowerCase()]||(j.expr.match.bool.test(t)?kt:void 0)),void 0!==e?null===e?void j.removeAttr(n,t):a&&"set"in a&&void 0!==(r=a.set(n,e,t))?r:(n.setAttribute(t,e+""),e):a&&"get"in a&&null!==(r=a.get(n,t))?r:null==(r=j.find.attr(n,t))?void 0:r)},attrHooks:{type:{set:function(n,t){if(!u.radioValue&&"radio"===t&&E(n,"input")){var e=n.value;return n.setAttribute("type",t),e&&(n.value=e),t}}}},removeAttr:function(n,t){var e,r=0,a=t&&t.match(W);if(a&&1===n.nodeType)for(;e=a[r++];)n.removeAttribute(e)}}),kt={set:function(n,t,e){return!1===t?j.removeAttr(n,e):n.setAttribute(e,e),e}},j.each(j.expr.match.bool.source.match(/\w+/g),function(n,t){var e=zt[t]||j.find.attr;zt[t]=function(n,t,r){var a,o,i=t.toLowerCase();return r||(o=zt[i],zt[i]=a,a=null!=e(n,t,r)?i:null,zt[i]=o),a}});var St=/^(?:input|select|textarea|button)$/i,jt=/^(?:a|area)$/i;function At(n){return(n.match(W)||[]).join(" ")}function Et(n){return n.getAttribute&&n.getAttribute("class")||""}function Ct(n){return Array.isArray(n)?n:"string"==typeof n&&n.match(W)||[]}j.fn.extend({prop:function(n,t){return nn(this,j.prop,n,t,arguments.length>1)},removeProp:function(n){return this.each(function(){delete this[j.propFix[n]||n]})}}),j.extend({prop:function(n,t,e){var r,a,o=n.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&j.isXMLDoc(n)||(t=j.propFix[t]||t,a=j.propHooks[t]),void 0!==e?a&&"set"in a&&void 0!==(r=a.set(n,e,t))?r:n[t]=e:a&&"get"in a&&null!==(r=a.get(n,t))?r:n[t]},propHooks:{tabIndex:{get:function(n){var t=j.find.attr(n,"tabindex");return t?parseInt(t,10):St.test(n.nodeName)||jt.test(n.nodeName)&&n.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),u.optSelected||(j.propHooks.selected={get:function(n){var t=n.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(n){var t=n.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){j.propFix[this.toLowerCase()]=this}),j.fn.extend({addClass:function(n){var t,e,r,a,o,i;return h(n)?this.each(function(t){j(this).addClass(n.call(this,t,Et(this)))}):(t=Ct(n)).length?this.each(function(){if(r=Et(this),e=1===this.nodeType&&" "+At(r)+" "){for(o=0;o-1;)e=e.replace(" "+a+" "," ");i=At(e),r!==i&&this.setAttribute("class",i)}}):this:this.attr("class","")},toggleClass:function(n,t){var e,r,a,o,i=typeof n,s="string"===i||Array.isArray(n);return h(n)?this.each(function(e){j(this).toggleClass(n.call(this,e,Et(this),t),t)}):"boolean"==typeof t&&s?t?this.addClass(n):this.removeClass(n):(e=Ct(n),this.each(function(){if(s)for(o=j(this),a=0;a-1)return!0;return!1}});var Tt=/\r/g;j.fn.extend({val:function(n){var t,e,r,a=this[0];return arguments.length?(r=h(n),this.each(function(e){var a;1===this.nodeType&&(null==(a=r?n.call(this,e,j(this).val()):n)?a="":"number"==typeof a?a+="":Array.isArray(a)&&(a=j.map(a,function(n){return null==n?"":n+""})),(t=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,a,"value")||(this.value=a))})):a?(t=j.valHooks[a.type]||j.valHooks[a.nodeName.toLowerCase()])&&"get"in t&&void 0!==(e=t.get(a,"value"))?e:"string"==typeof(e=a.value)?e.replace(Tt,""):null==e?"":e:void 0}}),j.extend({valHooks:{option:{get:function(n){var t=j.find.attr(n,"value");return null!=t?t:At(j.text(n))}},select:{get:function(n){var t,e,r,a=n.options,o=n.selectedIndex,i="select-one"===n.type,s=i?null:[],l=i?o+1:a.length;for(r=o<0?l:i?o:0;r-1)&&(e=!0);return e||(n.selectedIndex=-1),o}}}}),j.each(["radio","checkbox"],function(){j.valHooks[this]={set:function(n,t){if(Array.isArray(t))return n.checked=j.inArray(j(n).val(),t)>-1}},u.checkOn||(j.valHooks[this].get=function(n){return null===n.getAttribute("value")?"on":n.value})});var Nt=r.location,Dt={guid:Date.now()},qt=/\?/;j.parseXML=function(n){var t,e;if(!n||"string"!=typeof n)return null;try{t=(new r.DOMParser).parseFromString(n,"text/xml")}catch(n){}return e=t&&t.getElementsByTagName("parsererror")[0],t&&!e||j.error("Invalid XML: "+(e?j.map(e.childNodes,function(n){return n.textContent}).join("\n"):n)),t};var Lt=/^(?:focusinfocus|focusoutblur)$/,Pt=function(n){n.stopPropagation()};j.extend(j.event,{trigger:function(n,t,e,a){var o,i,s,l,f,d,c,p,m=[e||x],g=b.call(n,"type")?n.type:n,u=b.call(n,"namespace")?n.namespace.split("."):[];if(i=p=s=e=e||x,3!==e.nodeType&&8!==e.nodeType&&!Lt.test(g+j.event.triggered)&&(g.indexOf(".")>-1&&(u=g.split("."),g=u.shift(),u.sort()),f=g.indexOf(":")<0&&"on"+g,(n=n[j.expando]?n:new j.Event(g,"object"==typeof n&&n)).isTrigger=a?2:3,n.namespace=u.join("."),n.rnamespace=n.namespace?new RegExp("(^|\\.)"+u.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=void 0,n.target||(n.target=e),t=null==t?[n]:j.makeArray(t,[n]),c=j.event.special[g]||{},a||!c.trigger||!1!==c.trigger.apply(e,t))){if(!a&&!c.noBubble&&!v(e)){for(l=c.delegateType||g,Lt.test(l+g)||(i=i.parentNode);i;i=i.parentNode)m.push(i),s=i;s===(e.ownerDocument||x)&&m.push(s.defaultView||s.parentWindow||r)}for(o=0;(i=m[o++])&&!n.isPropagationStopped();)p=i,n.type=o>1?l:c.bindType||g,(d=(ln.get(i,"events")||Object.create(null))[n.type]&&ln.get(i,"handle"))&&d.apply(i,t),(d=f&&i[f])&&d.apply&&on(i)&&(n.result=d.apply(i,t),!1===n.result&&n.preventDefault());return n.type=g,a||n.isDefaultPrevented()||c._default&&!1!==c._default.apply(m.pop(),t)||!on(e)||f&&h(e[g])&&!v(e)&&((s=e[f])&&(e[f]=null),j.event.triggered=g,n.isPropagationStopped()&&p.addEventListener(g,Pt),e[g](),n.isPropagationStopped()&&p.removeEventListener(g,Pt),j.event.triggered=void 0,s&&(e[f]=s)),n.result}},simulate:function(n,t,e){var r=j.extend(new j.Event,e,{type:n,isSimulated:!0});j.event.trigger(r,null,t)}}),j.fn.extend({trigger:function(n,t){return this.each(function(){j.event.trigger(n,t,this)})},triggerHandler:function(n,t){var e=this[0];if(e)return j.event.trigger(n,t,e,!0)}});var Rt=/\[\]$/,Ut=/\r?\n/g,Mt=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function _t(n,t,e,r){var a;if(Array.isArray(t))j.each(t,function(t,a){e||Rt.test(n)?r(n,a):_t(n+"["+("object"==typeof a&&null!=a?t:"")+"]",a,e,r)});else if(e||"object"!==k(t))r(n,t);else for(a in t)_t(n+"["+a+"]",t[a],e,r)}j.param=function(n,t){var e,r=[],a=function(n,t){var e=h(t)?t():t;r[r.length]=encodeURIComponent(n)+"="+encodeURIComponent(null==e?"":e)};if(null==n)return"";if(Array.isArray(n)||n.jquery&&!j.isPlainObject(n))j.each(n,function(){a(this.name,this.value)});else for(e in n)_t(e,n[e],t,a);return r.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var n=j.prop(this,"elements");return n?j.makeArray(n):this}).filter(function(){var n=this.type;return this.name&&!j(this).is(":disabled")&&Ot.test(this.nodeName)&&!Mt.test(n)&&(this.checked||!An.test(n))}).map(function(n,t){var e=j(this).val();return null==e?null:Array.isArray(e)?j.map(e,function(n){return{name:t.name,value:n.replace(Ut,"\r\n")}}):{name:t.name,value:e.replace(Ut,"\r\n")}}).get()}});var Bt=/%20/g,Ft=/#.*$/,Ht=/([?&])_=[^&]*/,$t=/^(.*?):[ \t]*([^\r\n]*)$/gm,It=/^(?:GET|HEAD)$/,Vt=/^\/\//,Gt={},Wt={},Yt="*/".concat("*"),Xt=x.createElement("a");function Qt(n){return function(t,e){"string"!=typeof t&&(e=t,t="*");var r,a=0,o=t.toLowerCase().match(W)||[];if(h(e))for(;r=o[a++];)"+"===r[0]?(r=r.slice(1)||"*",(n[r]=n[r]||[]).unshift(e)):(n[r]=n[r]||[]).push(e)}}function Jt(n,t,e,r){var a={},o=n===Wt;function i(s){var l;return a[s]=!0,j.each(n[s]||[],function(n,s){var f=s(t,e,r);return"string"!=typeof f||o||a[f]?o?!(l=f):void 0:(t.dataTypes.unshift(f),i(f),!1)}),l}return i(t.dataTypes[0])||!a["*"]&&i("*")}function Kt(n,t){var e,r,a=j.ajaxSettings.flatOptions||{};for(e in t)void 0!==t[e]&&((a[e]?n:r||(r={}))[e]=t[e]);return r&&j.extend(!0,n,r),n}Xt.href=Nt.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Nt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Nt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Yt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(n,t){return t?Kt(Kt(n,j.ajaxSettings),t):Kt(j.ajaxSettings,n)},ajaxPrefilter:Qt(Gt),ajaxTransport:Qt(Wt),ajax:function(n,t){"object"==typeof n&&(t=n,n=void 0),t=t||{};var e,a,o,i,s,l,f,d,c,p,b=j.ajaxSetup({},t),m=b.context||b,g=b.context&&(m.nodeType||m.jquery)?j(m):j.event,u=j.Deferred(),h=j.Callbacks("once memory"),v=b.statusCode||{},w={},y={},k="canceled",z={readyState:0,getResponseHeader:function(n){var t;if(f){if(!i)for(i={};t=$t.exec(o);)i[t[1].toLowerCase()+" "]=(i[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=i[n.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return f?o:null},setRequestHeader:function(n,t){return null==f&&(n=y[n.toLowerCase()]=y[n.toLowerCase()]||n,w[n]=t),this},overrideMimeType:function(n){return null==f&&(b.mimeType=n),this},statusCode:function(n){var t;if(n)if(f)z.always(n[z.status]);else for(t in n)v[t]=[v[t],n[t]];return this},abort:function(n){var t=n||k;return e&&e.abort(t),S(0,t),this}};if(u.promise(z),b.url=((n||b.url||Nt.href)+"").replace(Vt,Nt.protocol+"//"),b.type=t.method||t.type||b.method||b.type,b.dataTypes=(b.dataType||"*").toLowerCase().match(W)||[""],null==b.crossDomain){l=x.createElement("a");try{l.href=b.url,l.href=l.href,b.crossDomain=Xt.protocol+"//"+Xt.host!=l.protocol+"//"+l.host}catch(n){b.crossDomain=!0}}if(b.data&&b.processData&&"string"!=typeof b.data&&(b.data=j.param(b.data,b.traditional)),Jt(Gt,b,t,z),f)return z;for(c in(d=j.event&&b.global)&&0===j.active++&&j.event.trigger("ajaxStart"),b.type=b.type.toUpperCase(),b.hasContent=!It.test(b.type),a=b.url.replace(Ft,""),b.hasContent?b.data&&b.processData&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&(b.data=b.data.replace(Bt,"+")):(p=b.url.slice(a.length),b.data&&(b.processData||"string"==typeof b.data)&&(a+=(qt.test(a)?"&":"?")+b.data,delete b.data),!1===b.cache&&(a=a.replace(Ht,"$1"),p=(qt.test(a)?"&":"?")+"_="+Dt.guid+++p),b.url=a+p),b.ifModified&&(j.lastModified[a]&&z.setRequestHeader("If-Modified-Since",j.lastModified[a]),j.etag[a]&&z.setRequestHeader("If-None-Match",j.etag[a])),(b.data&&b.hasContent&&!1!==b.contentType||t.contentType)&&z.setRequestHeader("Content-Type",b.contentType),z.setRequestHeader("Accept",b.dataTypes[0]&&b.accepts[b.dataTypes[0]]?b.accepts[b.dataTypes[0]]+("*"!==b.dataTypes[0]?", "+Yt+"; q=0.01":""):b.accepts["*"]),b.headers)z.setRequestHeader(c,b.headers[c]);if(b.beforeSend&&(!1===b.beforeSend.call(m,z,b)||f))return z.abort();if(k="abort",h.add(b.complete),z.done(b.success),z.fail(b.error),e=Jt(Wt,b,t,z)){if(z.readyState=1,d&&g.trigger("ajaxSend",[z,b]),f)return z;b.async&&b.timeout>0&&(s=r.setTimeout(function(){z.abort("timeout")},b.timeout));try{f=!1,e.send(w,S)}catch(n){if(f)throw n;S(-1,n)}}else S(-1,"No Transport");function S(n,t,i,l){var c,p,x,w,y,k=t;f||(f=!0,s&&r.clearTimeout(s),e=void 0,o=l||"",z.readyState=n>0?4:0,c=n>=200&&n<300||304===n,i&&(w=function(n,t,e){for(var r,a,o,i,s=n.contents,l=n.dataTypes;"*"===l[0];)l.shift(),void 0===r&&(r=n.mimeType||t.getResponseHeader("Content-Type"));if(r)for(a in s)if(s[a]&&s[a].test(r)){l.unshift(a);break}if(l[0]in e)o=l[0];else{for(a in e){if(!l[0]||n.converters[a+" "+l[0]]){o=a;break}i||(i=a)}o=o||i}if(o)return o!==l[0]&&l.unshift(o),e[o]}(b,z,i)),!c&&j.inArray("script",b.dataTypes)>-1&&j.inArray("json",b.dataTypes)<0&&(b.converters["text script"]=function(){}),w=function(n,t,e,r){var a,o,i,s,l,f={},d=n.dataTypes.slice();if(d[1])for(i in n.converters)f[i.toLowerCase()]=n.converters[i];for(o=d.shift();o;)if(n.responseFields[o]&&(e[n.responseFields[o]]=t),!l&&r&&n.dataFilter&&(t=n.dataFilter(t,n.dataType)),l=o,o=d.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(!(i=f[l+" "+o]||f["* "+o]))for(a in f)if((s=a.split(" "))[1]===o&&(i=f[l+" "+s[0]]||f["* "+s[0]])){!0===i?i=f[a]:!0!==f[a]&&(o=s[0],d.unshift(s[1]));break}if(!0!==i)if(i&&n.throws)t=i(t);else try{t=i(t)}catch(n){return{state:"parsererror",error:i?n:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}(b,w,z,c),c?(b.ifModified&&((y=z.getResponseHeader("Last-Modified"))&&(j.lastModified[a]=y),(y=z.getResponseHeader("etag"))&&(j.etag[a]=y)),204===n||"HEAD"===b.type?k="nocontent":304===n?k="notmodified":(k=w.state,p=w.data,c=!(x=w.error))):(x=k,!n&&k||(k="error",n<0&&(n=0))),z.status=n,z.statusText=(t||k)+"",c?u.resolveWith(m,[p,k,z]):u.rejectWith(m,[z,k,x]),z.statusCode(v),v=void 0,d&&g.trigger(c?"ajaxSuccess":"ajaxError",[z,b,c?p:x]),h.fireWith(m,[z,k]),d&&(g.trigger("ajaxComplete",[z,b]),--j.active||j.event.trigger("ajaxStop")))}return z},getJSON:function(n,t,e){return j.get(n,t,e,"json")},getScript:function(n,t){return j.get(n,void 0,t,"script")}}),j.each(["get","post"],function(n,t){j[t]=function(n,e,r,a){return h(e)&&(a=a||r,r=e,e=void 0),j.ajax(j.extend({url:n,type:t,dataType:a,data:e,success:r},j.isPlainObject(n)&&n))}}),j.ajaxPrefilter(function(n){var t;for(t in n.headers)"content-type"===t.toLowerCase()&&(n.contentType=n.headers[t]||"")}),j._evalUrl=function(n,t,e){return j.ajax({url:n,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(n){j.globalEval(n,t,e)}})},j.fn.extend({wrapAll:function(n){var t;return this[0]&&(h(n)&&(n=n.call(this[0])),t=j(n,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var n=this;n.firstElementChild;)n=n.firstElementChild;return n}).append(this)),this},wrapInner:function(n){return h(n)?this.each(function(t){j(this).wrapInner(n.call(this,t))}):this.each(function(){var t=j(this),e=t.contents();e.length?e.wrapAll(n):t.append(n)})},wrap:function(n){var t=h(n);return this.each(function(e){j(this).wrapAll(t?n.call(this,e):n)})},unwrap:function(n){return this.parent(n).not("body").each(function(){j(this).replaceWith(this.childNodes)}),this}}),j.expr.pseudos.hidden=function(n){return!j.expr.pseudos.visible(n)},j.expr.pseudos.visible=function(n){return!!(n.offsetWidth||n.offsetHeight||n.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new r.XMLHttpRequest}catch(n){}};var Zt={0:200,1223:204},ne=j.ajaxSettings.xhr();u.cors=!!ne&&"withCredentials"in ne,u.ajax=ne=!!ne,j.ajaxTransport(function(n){var t,e;if(u.cors||ne&&!n.crossDomain)return{send:function(a,o){var i,s=n.xhr();if(s.open(n.type,n.url,n.async,n.username,n.password),n.xhrFields)for(i in n.xhrFields)s[i]=n.xhrFields[i];for(i in n.mimeType&&s.overrideMimeType&&s.overrideMimeType(n.mimeType),n.crossDomain||a["X-Requested-With"]||(a["X-Requested-With"]="XMLHttpRequest"),a)s.setRequestHeader(i,a[i]);t=function(n){return function(){t&&(t=e=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===n?s.abort():"error"===n?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Zt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),e=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=e:s.onreadystatechange=function(){4===s.readyState&&r.setTimeout(function(){t&&e()})},t=t("abort");try{s.send(n.hasContent&&n.data||null)}catch(n){if(t)throw n}},abort:function(){t&&t()}}}),j.ajaxPrefilter(function(n){n.crossDomain&&(n.contents.script=!1)}),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(n){return j.globalEval(n),n}}}),j.ajaxPrefilter("script",function(n){void 0===n.cache&&(n.cache=!1),n.crossDomain&&(n.type="GET")}),j.ajaxTransport("script",function(n){var t,e;if(n.crossDomain||n.scriptAttrs)return{send:function(r,a){t=j(" - diff --git a/M2/Macaulay2/packages/Visualize/graph-example.html b/M2/Macaulay2/packages/Visualize/graph-example.html index cfd1ce715e6..e35101241f1 100644 --- a/M2/Macaulay2/packages/Visualize/graph-example.html +++ b/M2/Macaulay2/packages/Visualize/graph-example.html @@ -3,7 +3,6 @@ Macaulay2: Graph Visualization - - diff --git a/M2/Macaulay2/packages/Visualize/ideal2d-example.html b/M2/Macaulay2/packages/Visualize/ideal2d-example.html index 1773ab198d5..ff865f1c1f1 100644 --- a/M2/Macaulay2/packages/Visualize/ideal2d-example.html +++ b/M2/Macaulay2/packages/Visualize/ideal2d-example.html @@ -3,7 +3,6 @@ VisIdeal2D -