```json
{
  "sym_variables": [
    ("x0", "milligrams of vitamin B3"),
    ("x1", "milligrams of vitamin B9"),
    ("x2", "milligrams of vitamin B5"),
    ("x3", "milligrams of vitamin B7")
  ],
  "objective_function": "7*x0 + 6*x1 + 9*x2 + 8*x3",
  "constraints": [
    "1*x0 + 14*x3 >= 32",
    "11*x1 + 14*x3 >= 17",
    "10*x2 + 14*x3 >= 40",
    "1*x0 + 11*x1 >= 44",
    "11*x1 + 10*x2 >= 19",
    "1*x0 + 11*x1 + 10*x2 + 14*x3 >= 19",
    "16*x1 + 12*x3 >= 26",
    "11*x0 + 12*x2 >= 43",
    "16*x1 + 12*x2 >= 51",
    "11*x0 + 12*x3 >= 52",
    "11*x0 + 16*x1 + 12*x2 >= 35",
    "11*x0 + 16*x1 + 12*x2 + 12*x3 >= 35",
    "-1*x0 + 8*x1 >= 0",
    "-5*x2 + 1*x3 >= 0",
    "-8*x1 + 6*x3 >= 0",
    "11*x1 + 14*x3 <= 147",
    "1*x0 + 11*x1 <= 191",
    "1*x0 + 14*x3 <= 102",
    "10*x2 + 14*x3 <= 160",
    "1*x0 + 10*x2 <= 92",
    "1*x0 + 10*x2 + 14*x3 <= 185",
    "11*x0 + 16*x1 <= 230",
    "16*x1 + 12*x2 <= 144",
    "16*x1 + 12*x3 <= 227",
    "11*x0 + 12*x3 <= 151",
    "x0 >= 0",
    "x1 >= 0",
    "x2 >= 0",
    "x3 >= 0"

  ]
}
```

```python
import gurobipy as gp

try:
    # Create a new model
    m = gp.Model("vitamin_optimization")

    # Create variables
    vitamin_b3 = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="vitamin_b3")
    vitamin_b9 = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="vitamin_b9")
    vitamin_b5 = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="vitamin_b5")
    vitamin_b7 = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="vitamin_b7")


    # Set objective function
    m.setObjective(7*vitamin_b3 + 6*vitamin_b9 + 9*vitamin_b5 + 8*vitamin_b7, gp.GRB.MINIMIZE)

    # Add constraints
    m.addConstr(1*vitamin_b3 + 14*vitamin_b7 >= 32)
    m.addConstr(11*vitamin_b9 + 14*vitamin_b7 >= 17)
    m.addConstr(10*vitamin_b5 + 14*vitamin_b7 >= 40)
    m.addConstr(1*vitamin_b3 + 11*vitamin_b9 >= 44)
    m.addConstr(11*vitamin_b9 + 10*vitamin_b5 >= 19)
    m.addConstr(1*vitamin_b3 + 11*vitamin_b9 + 10*vitamin_b5 + 14*vitamin_b7 >= 19)
    m.addConstr(16*vitamin_b9 + 12*vitamin_b7 >= 26)
    m.addConstr(11*vitamin_b3 + 12*vitamin_b5 >= 43)
    m.addConstr(16*vitamin_b9 + 12*vitamin_b5 >= 51)
    m.addConstr(11*vitamin_b3 + 12*vitamin_b7 >= 52)
    m.addConstr(11*vitamin_b3 + 16*vitamin_b9 + 12*vitamin_b5 >= 35)
    m.addConstr(11*vitamin_b3 + 16*vitamin_b9 + 12*vitamin_b5 + 12*vitamin_b7 >= 35)
    m.addConstr(-1*vitamin_b3 + 8*vitamin_b9 >= 0)
    m.addConstr(-5*vitamin_b5 + 1*vitamin_b7 >= 0)
    m.addConstr(-8*vitamin_b9 + 6*vitamin_b7 >= 0)
    m.addConstr(11*vitamin_b9 + 14*vitamin_b7 <= 147)
    m.addConstr(1*vitamin_b3 + 11*vitamin_b9 <= 191)
    m.addConstr(1*vitamin_b3 + 14*vitamin_b7 <= 102)
    m.addConstr(10*vitamin_b5 + 14*vitamin_b7 <= 160)
    m.addConstr(1*vitamin_b3 + 10*vitamin_b5 <= 92)
    m.addConstr(1*vitamin_b3 + 10*vitamin_b5 + 14*vitamin_b7 <= 185)
    m.addConstr(11*vitamin_b3 + 16*vitamin_b9 <= 230)
    m.addConstr(16*vitamin_b9 + 12*vitamin_b5 <= 144)
    m.addConstr(16*vitamin_b9 + 12*vitamin_b7 <= 227)
    m.addConstr(11*vitamin_b3 + 12*vitamin_b7 <= 151)


    # Optimize model
    m.optimize()

    if m.status == gp.GRB.OPTIMAL:
        print('Obj: %g' % m.objVal)
        for v in m.getVars():
            print('%s %g' % (v.varName, v.x))
    elif m.status == gp.GRB.INFEASIBLE:
        print('Model is infeasible')
    else:
        print('Optimization ended with status %d' % m.status)


except gp.GurobiError as e:
    print('Error code ' + str(e.errno) + ": " + str(e))

except AttributeError:
    print('Encountered an attribute error')
```