Class Permutation
- java.lang.Object
-
- org.apache.calcite.util.Permutation
-
- All Implemented Interfaces:
java.lang.Iterable<IntPair>
,Mapping
,Mappings.CoreMapping
,Mappings.FunctionMapping
,Mappings.SourceMapping
,Mappings.TargetMapping
public class Permutation extends java.lang.Object implements Mapping, Mappings.TargetMapping
Represents a mapping which reorders elements in an array.
-
-
Constructor Summary
Constructors Modifier Constructor Description Permutation(int size)
Creates a permutation of a given size.Permutation(int[] targets)
Creates a permutation from an array.private
Permutation(int[] targets, int[] sources)
Creates a permutation.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
clear()
Removes all elements in the mapping.java.lang.Object
clone()
boolean
equals(java.lang.Object obj)
MappingType
getMappingType()
Returns the mapping type.int
getSource(int target)
Returns the position which maps totarget
.int
getSourceCount()
Returns the number of sources.int
getSourceOpt(int target)
int
getTarget(int source)
Returns the position thatsource
is mapped to.int
getTargetCount()
Returns the number of targets.int
getTargetOpt(int source)
Returns the target that a source maps to, or -1 if it is not mapped.int
hashCode()
void
identity()
Initializes this permutation to the identity permutation.private void
increment(int x, int[] zzz)
void
insertSource(int x)
Inserts into the sources.void
insertTarget(int x)
Inserts into the targets.Permutation
inverse()
Returns the inverse permutation.boolean
isIdentity()
Returns whether this is the identity permutation.private boolean
isValid(boolean fail)
Checks whether this permutation is valid.java.util.Iterator<IntPair>
iterator()
Returns an iterator over the elements in this mapping.Permutation
product(Permutation permutation)
Returns the product of this Permutation with a given Permutation.private void
resize(int newSize)
void
set(int source, int target)
Maps source position to target position.void
set(int source, int target, boolean allowResize)
Maps source position to target position, automatically resizing if source or target is out of bounds.void
setAll(Mapping mapping)
private void
setInternal(int source, int target)
private void
shuffleUp(int[] zz, int x)
int
size()
Returns the number of elements in this permutation.java.lang.String
toString()
Returns a string representation of this permutation.
-
-
-
Constructor Detail
-
Permutation
public Permutation(int size)
Creates a permutation of a given size.It is initialized to the identity permutation, such as "[0, 1, 2, 3]".
- Parameters:
size
- Number of elements in the permutation
-
Permutation
public Permutation(int[] targets)
Creates a permutation from an array.- Parameters:
targets
- Array of targets- Throws:
java.lang.IllegalArgumentException
- if elements of array are not uniquejava.lang.ArrayIndexOutOfBoundsException
- if elements of array are not between 0 through targets.length - 1 inclusive
-
Permutation
private Permutation(int[] targets, int[] sources)
Creates a permutation. Arrays are not copied, and are assumed to be valid permutations.
-
-
Method Detail
-
clone
public java.lang.Object clone()
- Overrides:
clone
in classjava.lang.Object
-
identity
public void identity()
Initializes this permutation to the identity permutation.
-
size
public final int size()
Returns the number of elements in this permutation.- Specified by:
size
in interfaceMapping
- Specified by:
size
in interfaceMappings.CoreMapping
-
clear
public void clear()
Description copied from interface:Mapping
Removes all elements in the mapping.
-
toString
public java.lang.String toString()
Returns a string representation of this permutation.For example, the mapping
Example mapping source target 0 2 1 0 2 1 3 3 is represented by the string "[2, 0, 1, 3]".
- Overrides:
toString
in classjava.lang.Object
-
set
public void set(int source, int target)
Maps source position to target position.To preserve the 1:1 nature of the permutation, the previous target of source becomes the new target of the previous source.
For example, given the permutation
[3, 2, 0, 1]
suppose we map position 2 to target 1. Position 2 currently has target 0, and the source of position 1 is position 3. We preserve the permutation property by mapping the previous source 3 to the previous target 0. The new permutation is
[3, 2, 1, 0].
Another example. Again starting from
[3, 2, 0, 1]
suppose we map position 2 to target 3. We map the previous source 0 to the previous target 0, which gives
[0, 2, 3, 1].
- Specified by:
set
in interfaceMappings.TargetMapping
- Parameters:
source
- Source positiontarget
- Target position- Throws:
java.lang.ArrayIndexOutOfBoundsException
- if source or target is negative or greater than or equal to the size of the permuation
-
set
public void set(int source, int target, boolean allowResize)
Maps source position to target position, automatically resizing if source or target is out of bounds.To preserve the 1:1 nature of the permutation, the previous target of source becomes the new target of the previous source.
For example, given the permutation
[3, 2, 0, 1]
suppose we map position 2 to target 1. Position 2 currently has target 0, and the source of position 1 is position 3. We preserve the permutation property by mapping the previous source 3 to the previous target 0. The new permutation is
[3, 2, 1, 0].
Another example. Again starting from
[3, 2, 0, 1]
suppose we map position 2 to target 3. We map the previous source 0 to the previous target 0, which gives
[0, 2, 3, 1].
- Parameters:
source
- Source positiontarget
- Target positionallowResize
- Whether to resize the permutation if the source or target is greater than the current capacity- Throws:
java.lang.ArrayIndexOutOfBoundsException
- if source or target is negative, or greater than or equal to the size of the permutation, andallowResize
is false
-
insertTarget
public void insertTarget(int x)
Inserts into the targets.For example, consider the permutation
Example permutation source 0 1 2 3 4 target 3 0 4 2 1 After applying
insertTarget(2)
every target 2 or higher is shifted up one.Mapping after applying insertTarget(2) source 0 1 2 3 4 5 target 4 0 5 3 1 2 Note that the array has been extended to accommodate the new target, and the previously unmapped source 5 is mapped to the unused target slot 2.
- Parameters:
x
- Ordinal of position to add to target
-
insertSource
public void insertSource(int x)
Inserts into the sources.Behavior is analogous to
insertTarget(int)
.- Parameters:
x
- Ordinal of position to add to source
-
increment
private void increment(int x, int[] zzz)
-
shuffleUp
private void shuffleUp(int[] zz, int x)
-
resize
private void resize(int newSize)
-
setInternal
private void setInternal(int source, int target)
-
inverse
public Permutation inverse()
Returns the inverse permutation.- Specified by:
inverse
in interfaceMappings.SourceMapping
- Specified by:
inverse
in interfaceMappings.TargetMapping
-
isIdentity
public boolean isIdentity()
Returns whether this is the identity permutation.- Specified by:
isIdentity
in interfaceMapping
- Specified by:
isIdentity
in interfaceMappings.SourceMapping
-
getTarget
public int getTarget(int source)
Returns the position thatsource
is mapped to.- Specified by:
getTarget
in interfaceMappings.FunctionMapping
- Specified by:
getTarget
in interfaceMappings.TargetMapping
- Parameters:
source
- source- Returns:
- target
-
getSource
public int getSource(int target)
Returns the position which maps totarget
.- Specified by:
getSource
in interfaceMappings.SourceMapping
-
isValid
private boolean isValid(boolean fail)
Checks whether this permutation is valid.- Parameters:
fail
- Whether to assert if invalid- Returns:
- Whether valid
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equals
in classjava.lang.Object
-
iterator
public java.util.Iterator<IntPair> iterator()
Description copied from interface:Mapping
Returns an iterator over the elements in this mapping.This method is optional; implementations may throw
UnsupportedOperationException
.
-
getSourceCount
public int getSourceCount()
Description copied from interface:Mapping
Returns the number of sources. Valid sources will be in the range 0 .. sourceCount.- Specified by:
getSourceCount
in interfaceMapping
- Specified by:
getSourceCount
in interfaceMappings.FunctionMapping
- Specified by:
getSourceCount
in interfaceMappings.SourceMapping
- Specified by:
getSourceCount
in interfaceMappings.TargetMapping
-
getTargetCount
public int getTargetCount()
Description copied from interface:Mapping
Returns the number of targets. Valid targets will be in the range 0 .. targetCount.- Specified by:
getTargetCount
in interfaceMapping
- Specified by:
getTargetCount
in interfaceMappings.SourceMapping
- Specified by:
getTargetCount
in interfaceMappings.TargetMapping
-
getMappingType
public MappingType getMappingType()
Description copied from interface:Mappings.CoreMapping
Returns the mapping type.- Specified by:
getMappingType
in interfaceMapping
- Specified by:
getMappingType
in interfaceMappings.CoreMapping
- Specified by:
getMappingType
in interfaceMappings.FunctionMapping
- Specified by:
getMappingType
in interfaceMappings.SourceMapping
- Returns:
- Mapping type
-
getTargetOpt
public int getTargetOpt(int source)
Description copied from interface:Mappings.FunctionMapping
Returns the target that a source maps to, or -1 if it is not mapped.- Specified by:
getTargetOpt
in interfaceMappings.FunctionMapping
- Specified by:
getTargetOpt
in interfaceMappings.SourceMapping
- Specified by:
getTargetOpt
in interfaceMappings.TargetMapping
-
getSourceOpt
public int getSourceOpt(int target)
- Specified by:
getSourceOpt
in interfaceMappings.SourceMapping
- Specified by:
getSourceOpt
in interfaceMappings.TargetMapping
-
setAll
public void setAll(Mapping mapping)
-
product
public Permutation product(Permutation permutation)
Returns the product of this Permutation with a given Permutation. Does not modify this Permutation orpermutation
.For example, perm.product(perm.inverse()) yields the identity.
-
-