All tensors in the system are reduced to the general form. For example:
if there are several numerical factors in the product they will be
multiplied and only one resulting numerical factor will be in the
resulting product. To maintain this reduced form of expressions, specific
infrastructure for tensor creation is provided. All creations of tensors
are performed using this infrastructure and explicit tensor creation
is architecturally forbidden for the user. Tensor creation infrastructure
consists of two functionally redundant but optimized for different usage
strategies interfaces: TensorBuilder
and
TensorFactory
. In fact TensorBuilder and TensorFactory for one
particular tensor will produce exactly the same result for the same input
sub-tensor sequence.
This class determines the common interface for tensor builders. Objects
of this type are produced by
cc.redberry.core.tensor.Tensor#getBuilder()method, or can be directly created using constructors.
Main contract for the builder infrastructure could be expressed
in the following code:
Tensor tensor = ....;
TensorBuilder builder = tensor.getBuilder();
for(Tensor t: tensor)
builder.put(t);
assert TensorUtils.compare(builder.build(),tensor);
So, using a builder of any tensor you can rebuild it into the
equivalent tensor.
The main goal of the builders infrastructure is reduction of all
tensors in the program to some general form. So, result of tensor
creation by the builder can be very different from simple sequential
concatenation of tensors passed to put()
method,
even the type of resulting tensor could be different form the
original one. Here are several examples:
Example 1
TensorBuilder builder = new ProductBuilder(); //builder of product
builder.put(Tensors.parse("2"));
builder.put(Tensors.parse("3"));
builder.put(Tensors.parse("a"));
assert TensorUtils.equals(builder.build(),Tensors.parse("6*a"));
Example 2
Tensor tensor = Tensors.parse("b*a");
TensorBuilder builder = tensor.getBuilder(); //builder of product
builder.put(Tensors.parse("2"));
builder.put(Tensors.parse("1/2"));
builder.put(Tensors.parse("a+q"));
assert TensorUtils.equals(builder.build(),Tensors.parse("a+q")); //Resulting tensor class is Sum
There is a mimic infrastructure for tensor creation in the system,
see
TensorFactory for more information.
For general tensor creation use factory methods in
Tensorsclass.