To solve the given optimization problem, we need to maximize the profit from selling oval and rectangular rocks, subject to the constraints of available washing and polishing time. Let's denote the number of oval rocks as `x` and the number of rectangular rocks as `y`.

The objective function (profit) can be represented as:
- Profit per oval rock: $7
- Profit per rectangular rock: $9
So, the total profit is: `7x + 9y`

Constraints:
1. Washing time constraint:
   - Oval rocks require 10 minutes of washing each.
   - Rectangular rocks require 15 minutes of washing each.
   - Total available washing time: 2000 minutes.
   Therefore, the constraint can be written as: `10x + 15y <= 2000`

2. Polishing time constraint:
   - Both oval and rectangular rocks require 12 minutes of polishing each.
   - Total available polishing time: 2500 minutes.
   So, the polishing constraint is: `12x + 12y <= 2500`

3. Non-negativity constraints (since we cannot produce a negative number of rocks):
   - `x >= 0`
   - `y >= 0`

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Rock_Collection")

# Define the variables
x = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="oval_rocks")
y = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="rectangular_rocks")

# Set the objective function: Maximize profit
m.setObjective(7*x + 9*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(10*x + 15*y <= 2000, "washing_time")
m.addConstr(12*x + 12*y <= 2500, "polishing_time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Oval rocks: {x.x}")
    print(f"Rectangular rocks: {y.x}")
    print(f"Total profit: ${7*x.x + 9*y.x:.2f}")
else:
    print("No optimal solution found")
```