## Problem Description and Formulation

The bakery's goal is to maximize profit by determining the optimal number of regular donuts (x1) and jelly filled donuts (x2) to produce daily. The profit per regular donut is $2, and the profit per jelly filled donut is $4. There are constraints on demand and production capacity:

- Demand for regular donuts is at most 100.
- Demand for jelly filled donuts is at most 75.
- Total production capacity is at most 120 donuts.

## Mathematical Formulation

The problem can be formulated as a linear programming problem:

Maximize: 2x1 + 4x2

Subject to:
- x1 ≤ 100 (demand constraint for regular donuts)
- x2 ≤ 75 (demand constraint for jelly filled donuts)
- x1 + x2 ≤ 120 (production capacity constraint)
- x1 ≥ 0 (non-negativity constraint for regular donuts)
- x2 ≥ 0 (non-negativity constraint for jelly filled donuts)

## Gurobi Code

```python
import gurobi

def solve_bakery_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    x1 = model.addVar(lb=0, name="regular_donuts")
    x2 = model.addVar(lb=0, name="jelly_filled_donuts")

    # Objective function: Maximize profit
    model.setObjective(2*x1 + 4*x2, gurobi.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(x1 <= 100, name="demand_regular")
    model.addConstr(x2 <= 75, name="demand_jelly_filled")
    model.addConstr(x1 + x2 <= 120, name="production_capacity")

    # Optimize model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal production levels:")
        print(f"Regular donuts: {x1.varValue}")
        print(f"Jelly filled donuts: {x2.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_bakery_problem()
```