
cc.redberry.transformation.ExpandBrackets Maven / Gradle / Ivy
/*
* Redberry: symbolic tensor computations.
*
* Copyright (c) 2010-2012:
* 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.transformation;
import java.util.ArrayList;
import cc.redberry.core.tensor.Product;
import cc.redberry.core.tensor.Sum;
import cc.redberry.core.tensor.Tensor;
import cc.redberry.core.tensor.TensorIterator;
import cc.redberry.core.utils.Indicator;
/**
*
* @author Dmitry Bolotin
* @author Stanislav Poslavsky
*/
public final class ExpandBrackets implements Transformation {
public static final ExpandBrackets EXPAND_ALL = new ExpandBrackets(Indicator.FALSE_INDICATOR);
public static final ExpandBrackets EXPAND_EXCEPT_SYMBOLS = new ExpandBrackets(Indicator.SYMBOL_INDICATOR);
private final Indicator except;
public ExpandBrackets(Indicator except) {
this.except = except;
}
@Override
public Tensor transform(Tensor tensor) {
if (!(tensor instanceof Product))
return tensor;
//was required by cc.redberry-physics
if (except.is(tensor))
return tensor;
TensorIterator productIterator = tensor.iterator();
ArrayList products = new ArrayList<>();
ArrayList newProducts;
products.add(new Product());
Tensor t = null;
int oldSize, i;
Sum sum;
boolean sumsExists = false;
while (productIterator.hasNext()) {
t = productIterator.next();
if (t instanceof Sum && !except.is(t)) {
sumsExists = true;
sum = (Sum) t;
oldSize = products.size();
newProducts = new ArrayList<>(oldSize * sum.size());
i = 0;
for (Tensor sumElement : sum)
for (int j = 0; j < oldSize; ++j) {
newProducts.add((Product) products.get(j).clone());
newProducts.get(i++).add(sumElement.clone());
}
products = newProducts;
} else
for (Product product : products)
product.add(t.clone());
}
if (sumsExists)
return new Sum(products);
// return new Sum(products).clone();
return tensor;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy