CompiledTensorEvaluator
Symbolica documentation for getting started, symbolic expressions, numerical evaluation, pattern matching, and APIs in Python and Rust.
CompiledTensorEvaluator
class CompiledTensorEvaluatorA tensor evaluator compiled into a loaded native library.
Create this object with TensorEvaluator.compile. Its input ordering, output shape, and real/complex evaluation rules match TensorEvaluator. Compilation requires a C++ compiler and writes source and library files.
Examples
from symbolica import S
from symbolica.community.tensor import Tensor, TensorName, Representation
x = S("x")
values = Tensor.dense(TensorName.vector("eval_v")(Representation.euc(2)), [x, x**2])
evaluator = values.evaluator({}, {}, [x], iterations=1, n_cores=1)
from tempfile import TemporaryDirectory
directory = TemporaryDirectory()
compiled = evaluator.compile("eval", directory.name + "/eval.cpp", directory.name + "/eval", inline_asm="none")
compiled.evaluate([[2.0]])[0][1]
4.0
directory.cleanup()Attributes
| Name | Description |
|---|---|
input_size |
Number of values required in each evaluation row. |
output_shape |
Logical component shape of each result tensor. |
parameters |
Symbolic inputs in the required evaluation order. |
supports_real |
Whether a real-valued evaluation path is available. |
input_size
CompiledTensorEvaluator.input_size: builtins.intNumber of values required in each evaluation row.
Returns
intLength of parameters.
Examples
from symbolica import S
from symbolica.community.tensor import Tensor, TensorName, Representation
x = S("x")
values = Tensor.dense(TensorName.vector("eval_v")(Representation.euc(2)), [x, x**2])
evaluator = values.evaluator({}, {}, [x], iterations=1, n_cores=1)
from tempfile import TemporaryDirectory
directory = TemporaryDirectory()
compiled = evaluator.compile("eval", directory.name + "/eval.cpp", directory.name + "/eval", inline_asm="none")
compiled.input_size
1
directory.cleanup()output_shape
CompiledTensorEvaluator.output_shape: tuple[int, ...]Logical component shape of each result tensor.
Returns
tuple of intShape excluding the batch dimension.
Examples
from symbolica import S
from symbolica.community.tensor import Tensor, TensorName, Representation
x = S("x")
values = Tensor.dense(TensorName.vector("eval_v")(Representation.euc(2)), [x, x**2])
evaluator = values.evaluator({}, {}, [x], iterations=1, n_cores=1)
from tempfile import TemporaryDirectory
directory = TemporaryDirectory()
compiled = evaluator.compile("eval", directory.name + "/eval.cpp", directory.name + "/eval", inline_asm="none")
compiled.output_shape
(2,)
directory.cleanup()parameters
CompiledTensorEvaluator.parameters: builtins.list[Expression]Symbolic inputs in the required evaluation order.
Returns
list of ExpressionOne entry for each value in an input row.
Examples
from symbolica import S
from symbolica.community.tensor import Tensor, TensorName, Representation
x = S("x")
values = Tensor.dense(TensorName.vector("eval_v")(Representation.euc(2)), [x, x**2])
evaluator = values.evaluator({}, {}, [x], iterations=1, n_cores=1)
from tempfile import TemporaryDirectory
directory = TemporaryDirectory()
compiled = evaluator.compile("eval", directory.name + "/eval.cpp", directory.name + "/eval", inline_asm="none")
compiled.parameters == [x]
True
directory.cleanup()supports_real
CompiledTensorEvaluator.supports_real: builtins.boolWhether a real-valued evaluation path is available.
Returns
boolFalse when the formulas contain complex coefficients; use evaluate_complex in that case.
Examples
from symbolica import S
from symbolica.community.tensor import Tensor, TensorName, Representation
x = S("x")
values = Tensor.dense(TensorName.vector("eval_v")(Representation.euc(2)), [x, x**2])
evaluator = values.evaluator({}, {}, [x], iterations=1, n_cores=1)
from tempfile import TemporaryDirectory
directory = TemporaryDirectory()
compiled = evaluator.compile("eval", directory.name + "/eval.cpp", directory.name + "/eval", inline_asm="none")
compiled.supports_real
True
directory.cleanup()Methods
| Name | Description |
|---|---|
__repr__ |
Return a description of the tensor layout and available numerical kernels. |
evaluate |
Evaluate a batch of real input rows. |
evaluate_complex |
Evaluate a batch of complex input rows. |
__repr__
CompiledTensorEvaluator.__repr__() -> builtins.strReturn a description of the tensor layout and available numerical kernels.
Examples
from symbolica.community import tensor as sp
from symbolica import E, S
r = sp.Representation.euc(2)
A = sp.TensorName("docs::A")(r, r)
x = S("docs::x")
tensor = sp.Tensor.dense(A, [x, E("0"), E("0"), x + 1])
evaluator = tensor.evaluator({}, {}, [x], iterations=1, n_cores=1)
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
folder = Path(directory)
compiled = evaluator.compile("docs_eval", str(folder / "eval.cpp"), str(folder / "eval.so"), inline_asm="none", optimization_level=0)
results = compiled.evaluate([[2.0], [3.0]])
text = repr(compiled)evaluate
CompiledTensorEvaluator.evaluate(inputs: typing.Sequence[typing.Sequence[builtins.float]]) -> builtins.list[Tensor]Evaluate a batch of real input rows.
Parameters
inputs(sequence of sequences of float) One row per evaluation, with input_size entries in parameters order.
Returns
list of TensorOne real component tensor per input row, each with output_shape.
Raises
ValueError: A row has the wrong size, or the formulas contain complex coefficients. Use evaluate_complex for those formulas.
Examples
from symbolica import S
from symbolica.community.tensor import Tensor, TensorName, Representation
x = S("x")
values = Tensor.dense(TensorName.vector("eval_v")(Representation.euc(2)), [x, x**2])
evaluator = values.evaluator({}, {}, [x], iterations=1, n_cores=1)
from tempfile import TemporaryDirectory
directory = TemporaryDirectory()
compiled = evaluator.compile("eval", directory.name + "/eval.cpp", directory.name + "/eval", inline_asm="none")
compiled.evaluate([[2.0]])[0][1]
4.0
directory.cleanup()evaluate_complex
CompiledTensorEvaluator.evaluate_complex(inputs: typing.Sequence[typing.Sequence[builtins.complex]]) -> builtins.list[Tensor]Evaluate a batch of complex input rows.
Parameters
inputs(sequence of sequences of complex) One row per evaluation, with input_size entries in parameters order.
Returns
list of TensorOne complex component tensor per input row, each with output_shape.
Raises
ValueError: A row has the wrong size.
Examples
from symbolica import S
from symbolica.community.tensor import Tensor, TensorName, Representation
x = S("x")
values = Tensor.dense(TensorName.vector("eval_v")(Representation.euc(2)), [x, x**2])
evaluator = values.evaluator({}, {}, [x], iterations=1, n_cores=1)
from tempfile import TemporaryDirectory
directory = TemporaryDirectory()
compiled = evaluator.compile("eval", directory.name + "/eval.cpp", directory.name + "/eval", inline_asm="none")
compiled.evaluate_complex([[2.0]])[0][1]
(4+0j)
directory.cleanup()