To solve the optimization problem described, we first need to identify the decision variables, objective function, and constraints.

- **Decision Variables**: Let \(R\) be the number of road bikes produced and \(M\) be the number of mountain bikes produced.
- **Objective Function**: The profit from producing \(R\) road bikes and \(M\) mountain bikes is given by \(70R + 100M\), since each road bike generates a profit of $70 and each mountain bike generates a profit of $100. The objective is to maximize this profit function.
- **Constraints**:
  - **Grinder Constraint**: Each road bike requires 3 hours on the grinder, and each mountain bike requires 5 hours. Given that the grinder can only be used for a maximum of 12 hours per day, we have \(3R + 5M \leq 12\).
  - **Polisher Constraint**: Each road bike requires 2 hours on the polisher, and each mountain bike requires 2.5 hours. With the polisher limited to 12 hours of use per day, we get \(2R + 2.5M \leq 12\).
  - **Non-Negativity Constraints**: Since the number of bikes produced cannot be negative, we have \(R \geq 0\) and \(M \geq 0\).

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

```python
from gurobipy import *

# Create a new model
m = Model("Bike_Factory")

# Decision Variables
R = m.addVar(vtype=GRB.CONTINUOUS, name="Road_Bikes", lb=0)
M = m.addVar(vtype=GRB.CONTINUOUS, name="Mountain_Bikes", lb=0)

# Objective Function: Maximize profit
m.setObjective(70*R + 100*M, GRB.MAXIMIZE)

# Constraints
m.addConstr(3*R + 5*M <= 12, "Grinder_Constraint")
m.addConstr(2*R + 2.5*M <= 12, "Polisher_Constraint")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of Road Bikes: {R.x}")
    print(f"Number of Mountain Bikes: {M.x}")
    print(f"Maximum Profit: ${70*R.x + 100*M.x:.2f}")
else:
    print("No optimal solution found")
```