/*
* Redberry: symbolic tensor computations.
*
* Copyright (c) 2010-2015:
* Stanislav Poslavsky
* Bolotin Dmitriy
*
* This file is part of Redberry.
*
* Redberry is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Redberry is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* 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 Redberry. If not, see .
*/
package cc.redberry.core.tensor;
/**
* 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 returned
* by one particular tensor will produce exactly the same result for the same
* input sub-tensor sequence.
This class determines the common interface
* for tensor factories. Objects of this type are produced by {@link Tensor#getFactory()}
* method.
Main contract for the factory infrastructure could be
* expressed in the following code:
*
* Tensor tensor = ....;
* TensorFactory factory = tensor.getFactory();
* Tensor createdTensor = factory.create(tensor.getRange(0, tensor.size()));
* assert TensorUtils.compare(createdTensor,tensor);
So, using a
* tensor factory of any tensor you can rebuild it into the equivalent
* tensor.
Behavior of TensorFactory is fully consistent with
* TensorBuilder, see {@link TensorBuilder} for more information. For general
* tensor creation use factory methods in {@link Tensors} class.
*
* @author Dmitry Bolotin
* @author Stanislav Poslavsky
* @see cc.redberry.core.tensor.Tensor#getBuilder()
* @see cc.redberry.core.utils.TensorUtils#equals(cc.redberry.core.tensor.Tensor,
* cc.redberry.core.tensor.Tensor)
* @see http://en.wikipedia.org/wiki/Builder_pattern
* @since 1.0
*/
public interface TensorFactory {
/**
* Creates tensor with provided array of sub-tensors.
*
* @param tensors array of sub-tensors
*
* @return created tensor
*/
Tensor create(Tensor... tensors);
}
Ads help maintain this website.