# ComputeRequest Class

The `ComputeRequest` class represents a request sent to the OpenVector network to perform a computation. It encapsulates the operation to be performed, along with the operands required for the computation.

### Public Member Classes and Enums

#### `enum class ComputeOperationType`

Specifies the parity of the compute operation.

* **Values:**
  * `UNARY`: Operation with one operand.
  * `BINARY`: Operation with two operands.
  * `TERNARY`: Operation with three operands.

#### `enum class ComputeOperation`

Specifies the type of computation to perform.

* **Values:**
  * `DECRYPT`
  * `ADD`
  * `SUBTRACT`
  * `MULTIPLY`
  * `DIVIDE`

#### `enum class DataType`

Specifies the type of data being used.

* **Values:**
  * `SINGLE`: Single data element.
  * `TENSOR`: Tensor data.
  * `TENSOR_ID`: Reference to a tensor ID (data encryption type is ignored).

#### `enum class DataEncrytionType`

Specifies whether the data is in plaintext or ciphertext form.

* **Values:**
  * `PLAINTEXT`
  * `CIPHERTEXT`

#### `class ComputeOperationOperand`

Represents an operand in a compute operation.

**Constructors**

* **`ComputeOperationOperand(DataType data_type, DataEncrytionType encryption_type, std::string data);`**

  Creates an operand with the specified data type, encryption type, and data.

  ```cpp
  ComputeOperationOperand operand(
      ComputeRequest::DataType::SINGLE,
      ComputeRequest::DataEncrytionType::CIPHERTEXT,
      serializedData
  );
  ```

**Member Functions**

* **`DataType& data_type();`**

  Returns a reference to the data type.
* **`const DataType& data_type() const;`**

  Returns a constant reference to the data type.
* **`DataEncrytionType& encryption_type();`**

  Returns a reference to the encryption type.
* **`const DataEncrytionType& encryption_type() const;`**

  Returns a constant reference to the encryption type.
* **`std::string& data();`**

  Returns a reference to the data string.
* **`const std::string& data() const;`**

  Returns a constant reference to the data string.
* **`std::string to_string() const;`**

  Serializes the operand to a string.
* **`static ComputeOperationOperand from_string(const std::string& str);`**

  Deserializes an operand from a string.
* **`static std::vector<ComputeOperationOperand> from_string(const std::string& str, size_t num_operands);`**

  Deserializes multiple operands from a string.

#### `class ComputeOperationInstance`

Represents an instance of a compute operation, including its type and operands.

**Constructors**

* **`ComputeOperationInstance(const ComputeOperationType& operation_type, const ComputeOperation& operation, const std::vector<ComputeOperationOperand>& operands);`**

  Creates a compute operation instance.

  ```cpp
  ComputeOperationInstance operation(
      ComputeOperationType::BINARY,
      ComputeOperation::ADD,
      { operand1, operand2 }
  );
  ```

**Member Functions**

* **`ComputeOperationType& operation_type();`**

  Returns a reference to the operation type.
* **`const ComputeOperationType& operation_type() const;`**

  Returns a constant reference to the operation type.
* **`ComputeOperation& operation();`**

  Returns a reference to the operation.
* **`const ComputeOperation& operation() const;`**

  Returns a constant reference to the operation.
* **`std::vector<ComputeOperationOperand>& operands();`**

  Returns a reference to the vector of operands.
* **`const std::vector<ComputeOperationOperand>& operands() const;`**

  Returns a constant reference to the vector of operands.
* **`std::string to_string() const;`**

  Serializes the operation instance to a string.
* **`static ComputeOperationInstance from_string(const std::string& str);`**

  Deserializes an operation instance from a string.

### Constructors

#### `ComputeRequest(const ComputeOperationInstance& operation);`

Creates a compute request with the specified operation instance.

```cpp
ComputeRequest request(operationInstance);
```

### Member Functions

* **`ComputeOperationInstance& operation();`**

  Returns a reference to the compute operation instance.
* **`const ComputeOperationInstance& operation() const;`**

  Returns a constant reference to the compute operation instance.
* **`std::string to_string() const;`**

  Serializes the compute request to a string.
* **`static ComputeRequest from_string(const std::string& str);`**

  Deserializes a compute request from a string.

### Usage Example

```cpp
// Assuming cs is an instance of CryptoSystem and pk is the network public key

// Encrypt two plaintexts
PlainTextImpl pt1 = cs.make_plaintext(5.0f);
PlainTextImpl pt2 = cs.make_plaintext(7.0f);

CipherTextImpl ct1 = cs.encrypt(pk, pt1);
CipherTextImpl ct2 = cs.encrypt(pk, pt2);

// Serialize the ciphertexts
std::string serialized_ct1 = cs.serialize_ciphertext(ct1);
std::string serialized_ct2 = cs.serialize_ciphertext(ct2);

// Create operands
ComputeRequest::ComputeOperationOperand operand1(
    ComputeRequest::DataType::SINGLE,
    ComputeRequest::DataEncrytionType::CIPHERTEXT,
    serialized_ct1
);

ComputeRequest::ComputeOperationOperand operand2(
    ComputeRequest::DataType::SINGLE,
    ComputeRequest::DataEncrytionType::CIPHERTEXT,
    serialized_ct2
);

// Create compute operation instance for addition
ComputeRequest::ComputeOperationInstance operation(
    ComputeRequest::ComputeOperationType::BINARY,
    ComputeRequest::ComputeOperation::ADD,
    { operand1, operand2 }
);

// Create the compute request
ComputeRequest request(operation);

// Send the request using ClientNode
ComputeResponse* response = nullptr;
clientNode.compute(request, &response);
```

### Notes

* When creating a `ComputeRequest`, ensure that the data in operands is correctly serialized and corresponds to the expected encryption and data types.
* The `ComputeOperation` enum defines basic arithmetic operations and decryption. More operations can be added as needed.

### See Also

* [ClientNode Class](/docs/api-references/markdown.md)
* [ComputeResponse Class](/docs/api-references/computeresponse-class.md)
* [CryptoSystem Interface](/docs/api-references/editor.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://openvector.gitbook.io/docs/api-references/openapi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
