## Problem Description and Symbolic Representation

The problem can be broken down into the following symbolic representation:

### Variables:
- $x_1$: Units of Piano A to stock daily
- $x_2$: Units of Piano B to stock daily

### Objective Function:
The objective is to minimize the total cost incurred from stocking Piano A and Piano B. The cost for each unit of Piano A is $12, and for each unit of Piano B is $4. Therefore, the objective function can be represented as:
\[ \text{Minimize:} \quad 12x_1 + 4x_2 \]

### Constraints:
1. **Budget Constraint:** The cost to purchase each unit of Piano A is $20, and for Piano B is $15, with a maximum daily budget of $450.
\[ 20x_1 + 15x_2 \leq 450 \]
2. **Customer Attraction Constraint:** To attract at least 250 customers, with Piano A attracting 25 customers per unit and Piano B attracting 10 customers per unit.
\[ 25x_1 + 10x_2 \geq 250 \]
3. **Non-Negativity Constraint:** The units of pianos to stock cannot be negative.
\[ x_1 \geq 0, x_2 \geq 0 \]

## Symbolic Representation in JSON Format
```json
{
    'sym_variables': [('x1', 'Units of Piano A'), ('x2', 'Units of Piano B')],
    'objective_function': '12*x1 + 4*x2',
    'constraints': [
        '20*x1 + 15*x2 <= 450',
        '25*x1 + 10*x2 >= 250',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python
```python
import gurobi

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

    # Define variables
    x1 = model.addVar(name="x1", lb=0, vtype=gurobi.GRB.CONTINUOUS)  # Units of Piano A
    x2 = model.addVar(name="x2", lb=0, vtype=gurobi.GRB.CONTINUOUS)  # Units of Piano B

    # Objective function: Minimize 12x1 + 4x2
    model.setObjective(12 * x1 + 4 * x2, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(20 * x1 + 15 * x2 <= 450, name="budget_constraint")
    model.addConstr(25 * x1 + 10 * x2 >= 250, name="customer_constraint")

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Units of Piano A: {x1.varValue}")
        print(f"Units of Piano B: {x2.varValue}")
        print(f"Objective: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_piano_problem()
```