# Expressions: `Linear`, `Quadratic`, `Polynomial`, and `Function`
These types represent mathematical expressions in optimization problems with different degree characteristics:
- **[`Linear`](crate::Linear)**: Up to degree 1 polynomials (linear terms + constant)
- **[`Quadratic`](crate::Quadratic)**: Up to degree 2 polynomials (may contain only linear terms, no quadratic terms required)
- **[`Function`](crate::Function)**: Dynamic degree handling, can represent any polynomial degree at runtime
Use the convenience macros [`linear!`](crate::linear), [`quadratic!`](crate::quadratic), [`coeff!`](crate::coeff), and [`monomial!`](crate::monomial) for easy expression building.
```rust
use ommx::{Linear, Quadratic, Function, linear, quadratic, coeff};
// Linear expressions: 2*x1 + 3*x2 + 5 (fixed degree 1)
let linear_expr = (coeff!(2.0) * linear!(1))?;
let linear_expr = (linear_expr + (coeff!(3.0) * linear!(2))?)?;
let linear_expr = (linear_expr + coeff!(5.0))?;
// Quadratic expressions: x1*x2 + 2*x1 + 1 (up to degree 2)
let quad_expr = (coeff!(1.0) * quadratic!(1, 2))?;
let quad_expr = (quad_expr + (coeff!(2.0) * quadratic!(1))?)?;
let quad_expr = (quad_expr + coeff!(1.0))?;
assert_eq!(quad_expr.degree(), 2);
// Quadratic with only linear terms (no quadratic terms): 3*x1 + 2
let linear_only_quad = ((coeff!(3.0) * quadratic!(1))? + coeff!(2.0))?;
assert_eq!(linear_only_quad.degree(), 1);
// Functions can dynamically handle any degree
let linear_func = Function::from(linear_expr); // Degree 1
assert_eq!(linear_func.degree(), 1);
let quad_func = Function::from(quad_expr); // Degree 2
assert_eq!(quad_func.degree(), 2);
# Ok::<(), ommx::CoefficientError>(())
```
See also [`PolynomialBase`](crate::PolynomialBase) which is a base for [`Linear`](crate::Linear), [`Quadratic`](crate::Quadratic), and [`Polynomial`](crate::Polynomial).