/// The operation interface represents an action an instruction will perform. All
/// operation classes must be CopyConstructible.
structoperation
{
/// A unique name identifying the operation
std::stringname()const;
/// This is used to compute the resulting shape from an operation. If an
/// operation cannot be run with input shapes, then it should throw an
/// exception.
shapecompute_shape(std::vector<shape>input)const;
/**
* @brief This performs the operation's computation
*
* @param ctx This is the context created by the `target` during compilation. Implementations can use the target's `context` class rather than the `context` interface class.
* @param output This is the output shape. It is equivalent to running `compute_shape` with each `shape` of the `argument`.
* @param input This is the `argument` result from the previous instuction's computation.
* @return Return an `argument` of the result computation. The `shape` of `argument` should be the same the `output` shape.