Hide navigation sidebar
Hide table of contents sidebar
Back to top
Toggle table of contents sidebar

# qp_c.c

    /* Copyright 2025, Gurobi Optimization, LLC */

    /* This example formulates and solves the following simple QP model:

         minimize    x^2 + x*y + y^2 + y*z + z^2 + 2 x
         subject to  x + 2 y + 3 z >= 4
                     x +   y       >= 1
                     x, y, z non-negative

       It solves it once as a continuous model, and once as an integer model.
    */

    #include <stdlib.h>
    #include <stdio.h>
    #include "gurobi_c.h"

    int
    main(int   argc,
         char *argv[])
    {
      GRBenv   *env   = NULL;
      GRBmodel *model = NULL;
      int       error = 0;
      double    sol[3];
      int       ind[3];
      double    val[3];
      int       qrow[5];
      int       qcol[5];
      double    qval[5];
      char      vtype[3];
      int       optimstatus;
      double    objval;

      /* Create environment */

      error = GRBloadenv(&env, "qp.log");
      if (error) goto QUIT;

      /* Create an empty model */

      error = GRBnewmodel(env, &model, "qp", 0, NULL, NULL, NULL, NULL, NULL);
      if (error) goto QUIT;

      /* Add variables */

      error = GRBaddvars(model, 3, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                         NULL);
      if (error) goto QUIT;

      /* Quadratic objective terms */

      qrow[0] = 0; qrow[1] = 0; qrow[2] = 1; qrow[3] = 1; qrow[4] = 2;
      qcol[0] = 0; qcol[1] = 1; qcol[2] = 1; qcol[3] = 2; qcol[4] = 2;
      qval[0] = 1; qval[1] = 1; qval[2] = 1; qval[3] = 1; qval[4] = 1;

      error = GRBaddqpterms(model, 5, qrow, qcol, qval);
      if (error) goto QUIT;

      /* Linear objective term */

      error = GRBsetdblattrelement(model, GRB_DBL_ATTR_OBJ, 0, 2.0);
      if (error) goto QUIT;

      /* First constraint: x + 2 y + 3 z <= 4 */

      ind[0] = 0; ind[1] = 1; ind[2] = 2;
      val[0] = 1; val[1] = 2; val[2] = 3;

      error = GRBaddconstr(model, 3, ind, val, GRB_GREATER_EQUAL, 4.0, "c0");
      if (error) goto QUIT;

      /* Second constraint: x + y >= 1 */

      ind[0] = 0; ind[1] = 1;
      val[0] = 1; val[1] = 1;

      error = GRBaddconstr(model, 2, ind, val, GRB_GREATER_EQUAL, 1.0, "c1");
      if (error) goto QUIT;

      /* Optimize model */

      error = GRBoptimize(model);
      if (error) goto QUIT;

      /* Write model to 'qp.lp' */

      error = GRBwrite(model, "qp.lp");
      if (error) goto QUIT;

      /* Capture solution information */

      error = GRBgetintattr(model, GRB_INT_ATTR_STATUS, &optimstatus);
      if (error) goto QUIT;

      error = GRBgetdblattr(model, GRB_DBL_ATTR_OBJVAL, &objval);
      if (error) goto QUIT;

      error = GRBgetdblattrarray(model, GRB_DBL_ATTR_X, 0, 3, sol);
      if (error) goto QUIT;

      printf("\nOptimization complete\n");
      if (optimstatus == GRB_OPTIMAL) {
        printf("Optimal objective: %.4e\n", objval);

        printf("  x=%.4f, y=%.4f, z=%.4f\n", sol[0], sol[1], sol[2]);
      } else if (optimstatus == GRB_INF_OR_UNBD) {
        printf("Model is infeasible or unbounded\n");
      } else {
        printf("Optimization was stopped early\n");
      }

      /* Modify variable types */

      vtype[0] = GRB_INTEGER; vtype[1] = GRB_INTEGER; vtype[2] = GRB_INTEGER;

      error = GRBsetcharattrarray(model, GRB_CHAR_ATTR_VTYPE, 0, 3, vtype);
      if (error) goto QUIT;

      /* Optimize model */

      error = GRBoptimize(model);
      if (error) goto QUIT;

      /* Write model to 'qp2.lp' */

      error = GRBwrite(model, "qp2.lp");
      if (error) goto QUIT;

      /* Capture solution information */

      error = GRBgetintattr(model, GRB_INT_ATTR_STATUS, &optimstatus);
      if (error) goto QUIT;

      error = GRBgetdblattr(model, GRB_DBL_ATTR_OBJVAL, &objval);
      if (error) goto QUIT;

      error = GRBgetdblattrarray(model, GRB_DBL_ATTR_X, 0, 3, sol);
      if (error) goto QUIT;

      printf("\nOptimization complete\n");
      if (optimstatus == GRB_OPTIMAL) {
        printf("Optimal objective: %.4e\n", objval);

        printf("  x=%.4f, y=%.4f, z=%.4f\n", sol[0], sol[1], sol[2]);
      } else if (optimstatus == GRB_INF_OR_UNBD) {
        printf("Model is infeasible or unbounded\n");
      } else {
        printf("Optimization was stopped early\n");
      }

    QUIT:

      /* Error reporting */

      if (error) {
        printf("ERROR: %s\n", GRBgeterrormsg(env));
        exit(1);
      }

      /* Free model */

      GRBfreemodel(model);

      /* Free environment */

      GRBfreeenv(env);

      return 0;
    }

Help and Feedback

Press `/` or click to search this documentation | Gurobi website | Gurobi community forum
Go to other Gurobi documentation | Gurobi download | Contact support