Package cc.redberry.rings.io
Class Coder<Element,Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>>
- java.lang.Object
-
- cc.redberry.rings.io.Coder<Element,Term,Poly>
-
- Type Parameters:
Element
- type of resulting elementsTerm
- underlying polynomial termsPoly
- underlying multivariate polynomials
- All Implemented Interfaces:
IParser<Element>
,IStringifier<Element>
,Serializable
public class Coder<Element,Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>> extends Object implements IParser<Element>, IStringifier<Element>, Serializable
High-level parser and stringifier of ring elements. Uses shunting-yard algorithm for parsing.- Since:
- 2.4
- See Also:
- Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface cc.redberry.rings.io.IStringifier
IStringifier.SimpleStringifier<E>
-
-
Field Summary
Fields Modifier and Type Field Description protected Ring<Element>
baseRing
the base ringprotected Map<Element,String>
bindings
toString bindingsprotected Map<String,Element>
eVariables
map variableName -> Element (if it is a polynomial variable)protected MultivariateRing<Poly>
polyRing
auxiliary polynomial ringprotected SerializableFunction<Poly,Element>
polyToElement
convert polynomial to base ring elementsprotected Map<String,Integer>
pVariables
map variableName -> variableIndex (if it is a polynomial variable)protected Map<Ring<?>,Coder<?,?,?>>
subcoders
inner coders-
Fields inherited from interface cc.redberry.rings.io.IStringifier
DUMMY
-
-
Method Summary
Modifier and Type Method Description Coder<Element,Term,Poly>
bind(String var, Element el)
Add string -> element mappingCoder<Element,Term,Poly>
bindAlias(String var, Element el)
Add string -> element mappingCoder<Element,Term,Poly>
bindPolynomialVariable(String var, int index)
Add string -> element mappingElement
decode(String string)
Decode element from its string representation (#parse)String
encode(Element element)
Encode element to its string representation (#stringify)Map<Element,String>
getBindings()
Map of bindings<Oth> Coder<Oth,?,?>
map(Ring<Oth> ring, Function<Element,Oth> func)
Maps this coder to a given type via mapperfunc
which just applies to each parsed element as well as to bindings (forIStringifier.stringify(Object)
).static <E> Coder<E,?,?>
mkCoder(Ring<E> ring)
Create coder for generic ringstatic <E> Coder<E,?,?>
mkCoder(Ring<E> ring, Map<String,E> variables)
Create coder for generic ringsstatic <Element,Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>>
Coder<Element,Term,Poly>mkCoder(Ring<Element> baseRing, Map<String,Element> eVariables, MultivariateRing<Poly> polyRing, Map<String,Poly> pVariables, SerializableFunction<Poly,Element> polyToElement)
static <Term extends AMonomial<Term>,mPoly extends AMultivariatePolynomial<Term,mPoly>,sPoly extends IUnivariatePolynomial<sPoly>>
Coder<mPoly,?,?>mkMultipleExtensionCoder(MultipleFieldExtension<Term,mPoly,sPoly> field, String... variables)
Create coder for multiple field extensionstatic <Term extends AMonomial<Term>,mPoly extends AMultivariatePolynomial<Term,mPoly>,sPoly extends IUnivariatePolynomial<sPoly>>
Coder<mPoly,?,?>mkMultipleExtensionCoder(MultipleFieldExtension<Term,mPoly,sPoly> field, Map<String,mPoly> variables)
Create coder for multiple field extensionstatic <E> Coder<MultivariatePolynomial<E>,Monomial<E>,MultivariatePolynomial<E>>
mkMultivariateCoder(MultivariateRing<MultivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, String... variables)
Create parser for multivariate polynomial ringsstatic <E> Coder<MultivariatePolynomial<E>,Monomial<E>,MultivariatePolynomial<E>>
mkMultivariateCoder(MultivariateRing<MultivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, Map<String,MultivariatePolynomial<E>> variables)
Create coder for multivariate polynomial ringsstatic <Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>>
Coder<Poly,Term,Poly>mkMultivariateCoder(MultivariateRing<Poly> ring, String... variables)
Create coder for multivariate polynomial ringsstatic <Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>>
Coder<Poly,Term,Poly>mkMultivariateCoder(MultivariateRing<Poly> ring, Map<String,Poly> variables)
Create coder for multivariate polynomial ringsstatic <E,I>
Coder<E,?,?>mkNestedCoder(Ring<E> ring, Map<String,E> variables, Coder<I,?,?> innerCoder, SerializableFunction<I,E> imageFunc)
Create coder for nested rings (e.g.static <Poly extends IPolynomial<Poly>>
Coder<Poly,?,?>mkPolynomialCoder(IPolynomialRing<Poly> ring, String... variables)
Create coder for generic polynomial ringsstatic <E> Coder<Rational<E>,?,?>
mkRationalsCoder(Rationals<E> ring, Coder<E,?,?> elementsCoder)
Create coder for rational elementsstatic <E> Coder<UnivariatePolynomial<E>,?,?>
mkUnivariateCoder(IPolynomialRing<UnivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, String variable)
Create coder for univariate polynomial ringsstatic <E> Coder<UnivariatePolynomial<E>,?,?>
mkUnivariateCoder(IPolynomialRing<UnivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, Map<String,UnivariatePolynomial<E>> variables)
Create coder for univariate polynomial ringsstatic <Poly extends IUnivariatePolynomial<Poly>>
Coder<Poly,?,?>mkUnivariateCoder(IPolynomialRing<Poly> ring, String variable)
Create coder for univariate polynomial ringsstatic <Poly extends IUnivariatePolynomial<Poly>>
Coder<Poly,?,?>mkUnivariateCoder(IPolynomialRing<Poly> ring, Map<String,Poly> variables)
Create coder for univariate polynomial ringsElement
parse(Tokenizer tokenizer)
Parse stream of tokens into ring elementElement
parse(String string)
Parse string<K> IStringifier<K>
substringifier(Ring<K> ring)
Get stringifier for the specified ring of some underlying elements, should never give null (use dummy() for absent stringifier)Coder<Element,Term,Poly>
withEncoder(Coder<?,?,?> subencoder)
Add stringifier of inner elements-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface cc.redberry.rings.io.IStringifier
getBinding, getBinding, stringify, stringify
-
-
-
-
Field Detail
-
eVariables
protected final Map<String,Element> eVariables
map variableName -> Element (if it is a polynomial variable)
-
polyRing
protected final MultivariateRing<Poly extends AMultivariatePolynomial<Term,Poly>> polyRing
auxiliary polynomial ring
-
pVariables
protected final Map<String,Integer> pVariables
map variableName -> variableIndex (if it is a polynomial variable)
-
polyToElement
protected final SerializableFunction<Poly extends AMultivariatePolynomial<Term,Poly>,Element> polyToElement
convert polynomial to base ring elements
-
-
Method Detail
-
bindAlias
public Coder<Element,Term,Poly> bindAlias(String var, Element el)
Add string -> element mapping
-
bindPolynomialVariable
public Coder<Element,Term,Poly> bindPolynomialVariable(String var, int index)
Add string -> element mapping
-
withEncoder
public Coder<Element,Term,Poly> withEncoder(Coder<?,?,?> subencoder)
Add stringifier of inner elements
-
substringifier
public <K> IStringifier<K> substringifier(Ring<K> ring)
Description copied from interface:IStringifier
Get stringifier for the specified ring of some underlying elements, should never give null (use dummy() for absent stringifier)- Specified by:
substringifier
in interfaceIStringifier<Element>
-
getBindings
public Map<Element,String> getBindings()
Description copied from interface:IStringifier
Map of bindings- Specified by:
getBindings
in interfaceIStringifier<Element>
-
encode
public String encode(Element element)
Encode element to its string representation (#stringify)
-
map
public <Oth> Coder<Oth,?,?> map(Ring<Oth> ring, Function<Element,Oth> func)
Maps this coder to a given type via mapperfunc
which just applies to each parsed element as well as to bindings (forIStringifier.stringify(Object)
).
-
mkCoder
public static <Element,Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>> Coder<Element,Term,Poly> mkCoder(Ring<Element> baseRing, Map<String,Element> eVariables, MultivariateRing<Poly> polyRing, Map<String,Poly> pVariables, SerializableFunction<Poly,Element> polyToElement)
- Parameters:
baseRing
- the base ringeVariables
- variables bindings (variableString -> base ring element)polyRing
- auxiliary polynomial ring, to manage intermediate polynomial expressionspVariables
- polynomial variables bindings (variableString -> polyRing variable index)polyToElement
- convert from auxiliary polynomials to basering
-
mkCoder
public static <E> Coder<E,?,?> mkCoder(Ring<E> ring)
Create coder for generic ring- Parameters:
ring
- the ring
-
mkCoder
public static <E> Coder<E,?,?> mkCoder(Ring<E> ring, Map<String,E> variables)
Create coder for generic rings- Parameters:
ring
- the ringvariables
- map string_variable -> ring_element
-
mkPolynomialCoder
public static <Poly extends IPolynomial<Poly>> Coder<Poly,?,?> mkPolynomialCoder(IPolynomialRing<Poly> ring, String... variables)
Create coder for generic polynomial rings- Parameters:
ring
- the ringvariables
- variables
-
mkMultipleExtensionCoder
public static <Term extends AMonomial<Term>,mPoly extends AMultivariatePolynomial<Term,mPoly>,sPoly extends IUnivariatePolynomial<sPoly>> Coder<mPoly,?,?> mkMultipleExtensionCoder(MultipleFieldExtension<Term,mPoly,sPoly> field, String... variables)
Create coder for multiple field extension- Parameters:
field
- multiple field extensionvariables
- string representation of generators
-
mkMultipleExtensionCoder
public static <Term extends AMonomial<Term>,mPoly extends AMultivariatePolynomial<Term,mPoly>,sPoly extends IUnivariatePolynomial<sPoly>> Coder<mPoly,?,?> mkMultipleExtensionCoder(MultipleFieldExtension<Term,mPoly,sPoly> field, Map<String,mPoly> variables)
Create coder for multiple field extension- Parameters:
field
- multiple field extensionvariables
- map generator_string -> generator_as_ring_element
-
mkMultivariateCoder
public static <Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>> Coder<Poly,Term,Poly> mkMultivariateCoder(MultivariateRing<Poly> ring, Map<String,Poly> variables)
Create coder for multivariate polynomial rings- Parameters:
ring
- the ringvariables
- map string_variable -> ring_element
-
mkMultivariateCoder
public static <Term extends AMonomial<Term>,Poly extends AMultivariatePolynomial<Term,Poly>> Coder<Poly,Term,Poly> mkMultivariateCoder(MultivariateRing<Poly> ring, String... variables)
Create coder for multivariate polynomial rings- Parameters:
ring
- the ringvariables
- polynomial variables
-
mkMultivariateCoder
public static <E> Coder<MultivariatePolynomial<E>,Monomial<E>,MultivariatePolynomial<E>> mkMultivariateCoder(MultivariateRing<MultivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, Map<String,MultivariatePolynomial<E>> variables)
Create coder for multivariate polynomial rings- Parameters:
ring
- the ringcfCoder
- coder for coefficient ring elementsvariables
- map string_variable -> ring_element
-
mkMultivariateCoder
public static <E> Coder<MultivariatePolynomial<E>,Monomial<E>,MultivariatePolynomial<E>> mkMultivariateCoder(MultivariateRing<MultivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, String... variables)
Create parser for multivariate polynomial rings- Parameters:
ring
- the ringcfCoder
- coder of coefficient ring elementsvariables
- polynomial variables
-
mkUnivariateCoder
public static <Poly extends IUnivariatePolynomial<Poly>> Coder<Poly,?,?> mkUnivariateCoder(IPolynomialRing<Poly> ring, Map<String,Poly> variables)
Create coder for univariate polynomial rings- Parameters:
ring
- the ringvariables
- map string_variable -> ring_element
-
mkUnivariateCoder
public static <Poly extends IUnivariatePolynomial<Poly>> Coder<Poly,?,?> mkUnivariateCoder(IPolynomialRing<Poly> ring, String variable)
Create coder for univariate polynomial rings- Parameters:
ring
- the ringvariable
- variable string
-
mkUnivariateCoder
public static <E> Coder<UnivariatePolynomial<E>,?,?> mkUnivariateCoder(IPolynomialRing<UnivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, Map<String,UnivariatePolynomial<E>> variables)
Create coder for univariate polynomial rings- Parameters:
ring
- the ringcfCoder
- coder of coefficient ring elementsvariables
- map string_variable -> ring_element
-
mkUnivariateCoder
public static <E> Coder<UnivariatePolynomial<E>,?,?> mkUnivariateCoder(IPolynomialRing<UnivariatePolynomial<E>> ring, Coder<E,?,?> cfCoder, String variable)
Create coder for univariate polynomial rings- Parameters:
ring
- the ringcfCoder
- coder of coefficient ring elementsvariable
- string variable
-
mkRationalsCoder
public static <E> Coder<Rational<E>,?,?> mkRationalsCoder(Rationals<E> ring, Coder<E,?,?> elementsCoder)
Create coder for rational elements
-
mkNestedCoder
public static <E,I> Coder<E,?,?> mkNestedCoder(Ring<E> ring, Map<String,E> variables, Coder<I,?,?> innerCoder, SerializableFunction<I,E> imageFunc)
Create coder for nested rings (e.g. fractions over polynomials etc).Example:
// GF(17, 3) as polynomials over "t" FiniteField
gf = Rings.GF(17, 3); // parser of univariate polynomials over "t" from GF(17, 3) Coder gfParser = Coder.mkUnivariateCoder(gf, mkVars(gf, "t")); // ring GF(17, 3)[x, y, z] MultivariateRing > polyRing = Rings.MultivariateRing(3, gf); // parser of multivariate polynomials over GF(17, 3) Coder , ?, ?> polyParser = Coder.mkMultivariateCoder(polyRing, gfParser, "x", "y", "z"); // field Frac(GF(17, 3)[x, y, z]) Rationals > fracRing = Rings.Frac(polyRing); // parser of elements in Frac(GF(17, 3)[x, y, z]) Coder >, ?, ?> fracParser = Coder.mkNestedCoder( fracRing, // the frac field new HashMap<>(), // variables (no any) polyParser, // parser of multivariate polynomials p -> new Rational<>(polyRing, p) // convert from polys to fractions ); - Parameters:
ring
- the ringvariables
- map string_variable -> ring_elementinnerCoder
- coder for underlying ring elementsimageFunc
- mapping from @{code I} to @{code E}
-
-