[{"data":1,"prerenderedAt":1585},["ShallowReactive",2],{"dev-\u002Fdeveloper\u002Fdocs\u002Fquickstart":3},{"id":4,"title":5,"body":6,"description":1576,"extension":1577,"faq":1578,"meta":1579,"navigation":280,"noindex":1580,"path":1581,"seo":1582,"stem":1583,"__hash__":1584},"content\u002Fdeveloper\u002Fdocs\u002Fquickstart.md","Quickstart — solve your first model",{"type":7,"value":8,"toc":1565},"minimark",[9,14,40,45,57,61,64,164,168,175,196,215,219,230,1379,1383,1386,1455,1459,1475,1479,1487,1492,1496,1530,1534,1541,1561],[10,11,13],"h1",{"id":12},"solve-your-first-model","Solve your first model",[15,16,17,18,22,23,26,27,30,31,34,35,39],"p",{},"Quicopt is a solver for hard optimization problems. This page takes you from an\nempty directory to a solved model in ",[19,20,21],"strong",{},"four steps",": sign up, install, set your\nkey, run an example. Pick your language below; the choice carries over to every\npage of the docs. In Python you build the model in a standard front-end\n(",[19,24,25],{},"OR-Tools MathOpt"," or ",[19,28,29],{},"Pyomo","), in Julia in ",[19,32,33],{},"JuMP",", and in R and Ruby with\nthe client's own model, then hand it to a single ",[36,37,38],"code",{},"solve"," call.",[41,42,44],"h2",{"id":43},"step-1-sign-up","Step 1 — Sign up",[15,46,47,52,53,56],{},[48,49,51],"a",{"href":50},"\u002Fsignup","Create a free account"," with your email address. We send you your API\nkey by email; it starts with ",[36,54,55],{},"qo_",".",[41,58,60],{"id":59},"step-2-install","Step 2 — Install",[15,62,63],{},"There is no license file to install and no endpoint to configure; the client is\none package.",[65,66,67,102,124,144],"lang-tabs",{},[68,69,71,78],"template",{"v-slot:python":70},"",[15,72,73,74,77],{},"Install it with the front-end you model in. The examples on this page use\nOR-Tools MathOpt; for Pyomo install ",[36,75,76],{},"quicopt[pyomo]"," instead.",[79,80,84],"pre",{"className":81,"code":82,"language":83,"meta":70,"style":70},"language-bash shiki shiki-themes github-dark","pip install \"quicopt[mathopt]\"\n","bash",[36,85,86],{"__ignoreMap":70},[87,88,91,95,99],"span",{"class":89,"line":90},"line",1,[87,92,94],{"class":93},"svObZ","pip",[87,96,98],{"class":97},"sU2Wk"," install",[87,100,101],{"class":97}," \"quicopt[mathopt]\"\n",[68,103,104,107],{"v-slot:julia":70},[15,105,106],{},"The client is in Julia's General registry; add JuMP alongside it.",[79,108,110],{"className":81,"code":109,"language":83,"meta":70,"style":70},"julia -e 'using Pkg; Pkg.add([\"QuicoptClient\", \"JuMP\"])'\n",[36,111,112],{"__ignoreMap":70},[87,113,114,117,121],{"class":89,"line":90},[87,115,116],{"class":93},"julia",[87,118,120],{"class":119},"sDLfK"," -e",[87,122,123],{"class":97}," 'using Pkg; Pkg.add([\"QuicoptClient\", \"JuMP\"])'\n",[68,125,126,129],{"v-slot:r":70},[15,127,128],{},"The package comes from r-universe; the CRAN mirror supplies its dependencies.",[79,130,132],{"className":81,"code":131,"language":83,"meta":70,"style":70},"Rscript -e 'install.packages(\"quicopt\", repos = c(\"https:\u002F\u002Fquicopt.r-universe.dev\", \"https:\u002F\u002Fcloud.r-project.org\"))'\n",[36,133,134],{"__ignoreMap":70},[87,135,136,139,141],{"class":89,"line":90},[87,137,138],{"class":93},"Rscript",[87,140,120],{"class":119},[87,142,143],{"class":97}," 'install.packages(\"quicopt\", repos = c(\"https:\u002F\u002Fquicopt.r-universe.dev\", \"https:\u002F\u002Fcloud.r-project.org\"))'\n",[68,145,146,149],{"v-slot:ruby":70},[15,147,148],{},"Needs Ruby 3.2 or newer.",[79,150,152],{"className":81,"code":151,"language":83,"meta":70,"style":70},"gem install quicopt\n",[36,153,154],{"__ignoreMap":70},[87,155,156,159,161],{"class":89,"line":90},[87,157,158],{"class":93},"gem",[87,160,98],{"class":97},[87,162,163],{"class":97}," quicopt\n",[41,165,167],{"id":166},"step-3-set-your-api-key","Step 3 — Set your API key",[15,169,170,171,174],{},"The client reads your key from the environment variable ",[36,172,173],{},"QUICOPT_API_KEY",", so it\nnever has to appear in your code:",[79,176,178],{"className":81,"code":177,"language":83,"meta":70,"style":70},"export QUICOPT_API_KEY=qo_your_key_here\n",[36,179,180],{"__ignoreMap":70},[87,181,182,186,190,193],{"class":89,"line":90},[87,183,185],{"class":184},"snl16","export",[87,187,189],{"class":188},"s95oV"," QUICOPT_API_KEY",[87,191,192],{"class":184},"=",[87,194,195],{"class":188},"qo_your_key_here\n",[15,197,198,199,202,203,206,207,210,211,56],{},"On Windows (PowerShell) that is ",[36,200,201],{},"$env:QUICOPT_API_KEY = \"qo_your_key_here\"",". To\nkeep the key across sessions, add the line to your shell profile; in R you can\nput ",[36,204,205],{},"QUICOPT_API_KEY=qo_your_key_here"," into your ",[36,208,209],{},".Renviron"," instead. You can\nalso pass the key in code, but then it ends up wherever your code goes; see\n",[48,212,214],{"href":213},"\u002Fdeveloper\u002Fdocs\u002Fkeys","API keys",[41,216,218],{"id":217},"step-4-run-an-example","Step 4 — Run an example",[15,220,221,222,225,226,229],{},"A ready-to-run script that solves a small ",[19,223,224],{},"QUBO",": four binary variables, a\nreward for each and a penalty for each adjacent pair on a cycle. Save it and run\nit. In Python there is a small ",[19,227,228],{},"MILP"," as well; each slide shows the model and\nexactly what prints:",[65,231,232,799,1026,1301],{},[68,233,234],{"v-slot:python":70},[235,236,237,580],"try-examples",{},[238,239,241,575],"try-example",{"file":240,"label":224},"qubo.py",[79,242,246],{"className":243,"code":244,"filename":240,"language":245,"meta":70,"style":70},"language-python shiki shiki-themes github-dark","from ortools.math_opt.python import mathopt\nfrom quicopt import Client\n\n# A QUBO: 4 binary variables, a quadratic objective, no constraints.\nmodel = mathopt.Model(name=\"qubo\")\nx = [model.add_binary_variable(name=f\"x{i}\") for i in range(4)]\n\n# Reward each variable; penalise adjacent pairs on the 4-cycle 0-1-2-3-0.\n# Distinct linear weights break the symmetry, so the optimum is unique.\nmodel.minimize(\n    -(1.0 * x[0] + 0.7 * x[1] + 1.3 * x[2] + 0.5 * x[3])\n    + 2.0 * (x[0] * x[1] + x[1] * x[2] + x[2] * x[3] + x[0] * x[3])\n)\n\nclient = Client()\nresult = client.solve(model)\nprint(result.display)\n","python",[36,247,248,262,275,282,289,312,369,374,380,386,392,459,534,539,544,555,566],{"__ignoreMap":70},[87,249,250,253,256,259],{"class":89,"line":90},[87,251,252],{"class":184},"from",[87,254,255],{"class":188}," ortools.math_opt.python ",[87,257,258],{"class":184},"import",[87,260,261],{"class":188}," mathopt\n",[87,263,265,267,270,272],{"class":89,"line":264},2,[87,266,252],{"class":184},[87,268,269],{"class":188}," quicopt ",[87,271,258],{"class":184},[87,273,274],{"class":188}," Client\n",[87,276,278],{"class":89,"line":277},3,[87,279,281],{"emptyLinePlaceholder":280},true,"\n",[87,283,285],{"class":89,"line":284},4,[87,286,288],{"class":287},"sAwPA","# A QUBO: 4 binary variables, a quadratic objective, no constraints.\n",[87,290,292,295,297,300,304,306,309],{"class":89,"line":291},5,[87,293,294],{"class":188},"model ",[87,296,192],{"class":184},[87,298,299],{"class":188}," mathopt.Model(",[87,301,303],{"class":302},"s9osk","name",[87,305,192],{"class":184},[87,307,308],{"class":97},"\"qubo\"",[87,310,311],{"class":188},")\n",[87,313,315,318,320,323,325,327,330,333,336,339,342,345,348,351,354,357,360,363,366],{"class":89,"line":314},6,[87,316,317],{"class":188},"x ",[87,319,192],{"class":184},[87,321,322],{"class":188}," [model.add_binary_variable(",[87,324,303],{"class":302},[87,326,192],{"class":184},[87,328,329],{"class":184},"f",[87,331,332],{"class":97},"\"x",[87,334,335],{"class":119},"{",[87,337,338],{"class":188},"i",[87,340,341],{"class":119},"}",[87,343,344],{"class":97},"\"",[87,346,347],{"class":188},") ",[87,349,350],{"class":184},"for",[87,352,353],{"class":188}," i ",[87,355,356],{"class":184},"in",[87,358,359],{"class":119}," range",[87,361,362],{"class":188},"(",[87,364,365],{"class":119},"4",[87,367,368],{"class":188},")]\n",[87,370,372],{"class":89,"line":371},7,[87,373,281],{"emptyLinePlaceholder":280},[87,375,377],{"class":89,"line":376},8,[87,378,379],{"class":287},"# Reward each variable; penalise adjacent pairs on the 4-cycle 0-1-2-3-0.\n",[87,381,383],{"class":89,"line":382},9,[87,384,385],{"class":287},"# Distinct linear weights break the symmetry, so the optimum is unique.\n",[87,387,389],{"class":89,"line":388},10,[87,390,391],{"class":188},"model.minimize(\n",[87,393,395,398,400,403,406,409,412,415,418,421,423,425,428,430,432,435,437,439,442,444,446,449,451,453,456],{"class":89,"line":394},11,[87,396,397],{"class":184},"    -",[87,399,362],{"class":188},[87,401,402],{"class":119},"1.0",[87,404,405],{"class":184}," *",[87,407,408],{"class":188}," x[",[87,410,411],{"class":119},"0",[87,413,414],{"class":188},"] ",[87,416,417],{"class":184},"+",[87,419,420],{"class":119}," 0.7",[87,422,405],{"class":184},[87,424,408],{"class":188},[87,426,427],{"class":119},"1",[87,429,414],{"class":188},[87,431,417],{"class":184},[87,433,434],{"class":119}," 1.3",[87,436,405],{"class":184},[87,438,408],{"class":188},[87,440,441],{"class":119},"2",[87,443,414],{"class":188},[87,445,417],{"class":184},[87,447,448],{"class":119}," 0.5",[87,450,405],{"class":184},[87,452,408],{"class":188},[87,454,455],{"class":119},"3",[87,457,458],{"class":188},"])\n",[87,460,462,465,468,470,473,475,477,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532],{"class":89,"line":461},12,[87,463,464],{"class":184},"    +",[87,466,467],{"class":119}," 2.0",[87,469,405],{"class":184},[87,471,472],{"class":188}," (x[",[87,474,411],{"class":119},[87,476,414],{"class":188},[87,478,479],{"class":184},"*",[87,481,408],{"class":188},[87,483,427],{"class":119},[87,485,414],{"class":188},[87,487,417],{"class":184},[87,489,408],{"class":188},[87,491,427],{"class":119},[87,493,414],{"class":188},[87,495,479],{"class":184},[87,497,408],{"class":188},[87,499,441],{"class":119},[87,501,414],{"class":188},[87,503,417],{"class":184},[87,505,408],{"class":188},[87,507,441],{"class":119},[87,509,414],{"class":188},[87,511,479],{"class":184},[87,513,408],{"class":188},[87,515,455],{"class":119},[87,517,414],{"class":188},[87,519,417],{"class":184},[87,521,408],{"class":188},[87,523,411],{"class":119},[87,525,414],{"class":188},[87,527,479],{"class":184},[87,529,408],{"class":188},[87,531,455],{"class":119},[87,533,458],{"class":188},[87,535,537],{"class":89,"line":536},13,[87,538,311],{"class":188},[87,540,542],{"class":89,"line":541},14,[87,543,281],{"emptyLinePlaceholder":280},[87,545,547,550,552],{"class":89,"line":546},15,[87,548,549],{"class":188},"client ",[87,551,192],{"class":184},[87,553,554],{"class":188}," Client()\n",[87,556,558,561,563],{"class":89,"line":557},16,[87,559,560],{"class":188},"result ",[87,562,192],{"class":184},[87,564,565],{"class":188}," client.solve(model)\n",[87,567,569,572],{"class":89,"line":568},17,[87,570,571],{"class":119},"print",[87,573,574],{"class":188},"(result.display)\n",[576,577],"term-result",{":rows":578,"cmd":579},"[\"├── shots\",\"│   ├── 1 · primal   -2.3    0.0s  ◀ best\",\"│   ├── 2 · primal   -2.3    0.0s\",\"│   ├── 3 · primal   -2.3   1.72s\",\"│   ├── 4 · primal   -2.3    2.0s\",\"│   └── 5 · primal   -2.3    2.0s\",\"├── status:     heuristic\",\"├── feasible:   n\u002Fa\",\"├── objective:  -2.3\",\"├── x:          x0=1, x1=0, x2=1, x3=0  (4 variables)\",\"└── solve_time: 2.002 s\"]","$ python qubo.py",[238,581,583,795],{"file":582,"label":228},"milp.py",[79,584,586],{"className":243,"code":585,"filename":582,"language":245,"meta":70,"style":70},"from ortools.math_opt.python import mathopt\nfrom quicopt import Client\n\n# A tiny mixed-integer model: one continuous and one integer variable.\nmodel = mathopt.Model(name=\"milp\")\nx = model.add_variable(lb=0.0, name=\"x\")\ny = model.add_integer_variable(lb=0.0, ub=10.0, name=\"y\")\nmodel.add_linear_constraint(x + 2 * y \u003C= 14)\nmodel.add_linear_constraint(3 * x - y >= 0)\nmodel.maximize(3 * x + 4 * y)\n\nclient = Client()\nresult = client.solve(model)\nprint(result.display)\n",[36,587,588,598,608,612,617,634,663,700,723,748,769,773,781,789],{"__ignoreMap":70},[87,589,590,592,594,596],{"class":89,"line":90},[87,591,252],{"class":184},[87,593,255],{"class":188},[87,595,258],{"class":184},[87,597,261],{"class":188},[87,599,600,602,604,606],{"class":89,"line":264},[87,601,252],{"class":184},[87,603,269],{"class":188},[87,605,258],{"class":184},[87,607,274],{"class":188},[87,609,610],{"class":89,"line":277},[87,611,281],{"emptyLinePlaceholder":280},[87,613,614],{"class":89,"line":284},[87,615,616],{"class":287},"# A tiny mixed-integer model: one continuous and one integer variable.\n",[87,618,619,621,623,625,627,629,632],{"class":89,"line":291},[87,620,294],{"class":188},[87,622,192],{"class":184},[87,624,299],{"class":188},[87,626,303],{"class":302},[87,628,192],{"class":184},[87,630,631],{"class":97},"\"milp\"",[87,633,311],{"class":188},[87,635,636,638,640,643,646,648,651,654,656,658,661],{"class":89,"line":314},[87,637,317],{"class":188},[87,639,192],{"class":184},[87,641,642],{"class":188}," model.add_variable(",[87,644,645],{"class":302},"lb",[87,647,192],{"class":184},[87,649,650],{"class":119},"0.0",[87,652,653],{"class":188},", ",[87,655,303],{"class":302},[87,657,192],{"class":184},[87,659,660],{"class":97},"\"x\"",[87,662,311],{"class":188},[87,664,665,668,670,673,675,677,679,681,684,686,689,691,693,695,698],{"class":89,"line":371},[87,666,667],{"class":188},"y ",[87,669,192],{"class":184},[87,671,672],{"class":188}," model.add_integer_variable(",[87,674,645],{"class":302},[87,676,192],{"class":184},[87,678,650],{"class":119},[87,680,653],{"class":188},[87,682,683],{"class":302},"ub",[87,685,192],{"class":184},[87,687,688],{"class":119},"10.0",[87,690,653],{"class":188},[87,692,303],{"class":302},[87,694,192],{"class":184},[87,696,697],{"class":97},"\"y\"",[87,699,311],{"class":188},[87,701,702,705,707,710,712,715,718,721],{"class":89,"line":376},[87,703,704],{"class":188},"model.add_linear_constraint(x ",[87,706,417],{"class":184},[87,708,709],{"class":119}," 2",[87,711,405],{"class":184},[87,713,714],{"class":188}," y ",[87,716,717],{"class":184},"\u003C=",[87,719,720],{"class":119}," 14",[87,722,311],{"class":188},[87,724,725,728,730,732,735,738,740,743,746],{"class":89,"line":382},[87,726,727],{"class":188},"model.add_linear_constraint(",[87,729,455],{"class":119},[87,731,405],{"class":184},[87,733,734],{"class":188}," x ",[87,736,737],{"class":184},"-",[87,739,714],{"class":188},[87,741,742],{"class":184},">=",[87,744,745],{"class":119}," 0",[87,747,311],{"class":188},[87,749,750,753,755,757,759,761,764,766],{"class":89,"line":388},[87,751,752],{"class":188},"model.maximize(",[87,754,455],{"class":119},[87,756,405],{"class":184},[87,758,734],{"class":188},[87,760,417],{"class":184},[87,762,763],{"class":119}," 4",[87,765,405],{"class":184},[87,767,768],{"class":188}," y)\n",[87,770,771],{"class":89,"line":394},[87,772,281],{"emptyLinePlaceholder":280},[87,774,775,777,779],{"class":89,"line":461},[87,776,549],{"class":188},[87,778,192],{"class":184},[87,780,554],{"class":188},[87,782,783,785,787],{"class":89,"line":536},[87,784,560],{"class":188},[87,786,192],{"class":184},[87,788,565],{"class":188},[87,790,791,793],{"class":89,"line":541},[87,792,571],{"class":119},[87,794,574],{"class":188},[576,796],{":rows":797,"cmd":798},"[\"├── shots\",\"│   ├── 1 · primal-dual · global   42    0.0s  ◀ best\",\"│   ├── 2 · primal-dual · global   42   0.01s\",\"│   └── 3 · primal                 32   0.01s\",\"├── status:     optimal\",\"├── feasible:   true\",\"├── objective:  42.0\",\"├── x:          x=14, y=0  (2 variables)\",\"└── solve_time: 0.0104 s\"]","$ python milp.py",[68,800,801],{"v-slot:julia":70},[79,802,806],{"className":803,"code":804,"filename":805,"language":116,"meta":70,"style":70},"language-julia shiki shiki-themes github-dark","using QuicoptClient, JuMP\n\n# A QUBO: 4 binary variables, a quadratic objective, no constraints.\nmodel = Model()\n@variable(model, x[1:4], Bin)\n\n# Reward each variable; penalise adjacent pairs on the 4-cycle 1-2-3-4-1.\n@objective(model, Min,\n    2.0 * (x[1] * x[2] + x[2] * x[3] + x[3] * x[4] + x[1] * x[4])\n    - (1.0 * x[1] + 0.7 * x[2] + 1.3 * x[3] + 0.5 * x[4]))\n\nresult = solve(model)   # reads QUICOPT_API_KEY\nprintln(result.objective)\n","qubo.jl",[36,807,808,816,820,824,836,854,858,863,871,940,994,998,1013],{"__ignoreMap":70},[87,809,810,813],{"class":89,"line":90},[87,811,812],{"class":184},"using",[87,814,815],{"class":188}," QuicoptClient, JuMP\n",[87,817,818],{"class":89,"line":264},[87,819,281],{"emptyLinePlaceholder":280},[87,821,822],{"class":89,"line":277},[87,823,288],{"class":287},[87,825,826,828,830,833],{"class":89,"line":284},[87,827,294],{"class":188},[87,829,192],{"class":184},[87,831,832],{"class":119}," Model",[87,834,835],{"class":188},"()\n",[87,837,838,841,844,846,849,851],{"class":89,"line":291},[87,839,840],{"class":119},"@variable",[87,842,843],{"class":188},"(model, x[",[87,845,427],{"class":119},[87,847,848],{"class":184},":",[87,850,365],{"class":119},[87,852,853],{"class":188},"], Bin)\n",[87,855,856],{"class":89,"line":314},[87,857,281],{"emptyLinePlaceholder":280},[87,859,860],{"class":89,"line":371},[87,861,862],{"class":287},"# Reward each variable; penalise adjacent pairs on the 4-cycle 1-2-3-4-1.\n",[87,864,865,868],{"class":89,"line":376},[87,866,867],{"class":119},"@objective",[87,869,870],{"class":188},"(model, Min,\n",[87,872,873,876,878,880,882,884,886,888,890,892,894,896,898,900,902,904,906,908,910,912,914,916,918,920,922,924,926,928,930,932,934,936,938],{"class":89,"line":382},[87,874,875],{"class":119},"    2.0",[87,877,405],{"class":184},[87,879,472],{"class":188},[87,881,427],{"class":119},[87,883,414],{"class":188},[87,885,479],{"class":184},[87,887,408],{"class":188},[87,889,441],{"class":119},[87,891,414],{"class":188},[87,893,417],{"class":184},[87,895,408],{"class":188},[87,897,441],{"class":119},[87,899,414],{"class":188},[87,901,479],{"class":184},[87,903,408],{"class":188},[87,905,455],{"class":119},[87,907,414],{"class":188},[87,909,417],{"class":184},[87,911,408],{"class":188},[87,913,455],{"class":119},[87,915,414],{"class":188},[87,917,479],{"class":184},[87,919,408],{"class":188},[87,921,365],{"class":119},[87,923,414],{"class":188},[87,925,417],{"class":184},[87,927,408],{"class":188},[87,929,427],{"class":119},[87,931,414],{"class":188},[87,933,479],{"class":184},[87,935,408],{"class":188},[87,937,365],{"class":119},[87,939,458],{"class":188},[87,941,942,944,947,949,951,953,955,957,959,961,963,965,967,969,971,973,975,977,979,981,983,985,987,989,991],{"class":89,"line":388},[87,943,397],{"class":184},[87,945,946],{"class":188}," (",[87,948,402],{"class":119},[87,950,405],{"class":184},[87,952,408],{"class":188},[87,954,427],{"class":119},[87,956,414],{"class":188},[87,958,417],{"class":184},[87,960,420],{"class":119},[87,962,405],{"class":184},[87,964,408],{"class":188},[87,966,441],{"class":119},[87,968,414],{"class":188},[87,970,417],{"class":184},[87,972,434],{"class":119},[87,974,405],{"class":184},[87,976,408],{"class":188},[87,978,455],{"class":119},[87,980,414],{"class":188},[87,982,417],{"class":184},[87,984,448],{"class":119},[87,986,405],{"class":184},[87,988,408],{"class":188},[87,990,365],{"class":119},[87,992,993],{"class":188},"]))\n",[87,995,996],{"class":89,"line":394},[87,997,281],{"emptyLinePlaceholder":280},[87,999,1000,1002,1004,1007,1010],{"class":89,"line":461},[87,1001,560],{"class":188},[87,1003,192],{"class":184},[87,1005,1006],{"class":119}," solve",[87,1008,1009],{"class":188},"(model)   ",[87,1011,1012],{"class":287},"# reads QUICOPT_API_KEY\n",[87,1014,1015,1018,1021,1023],{"class":89,"line":536},[87,1016,1017],{"class":119},"println",[87,1019,1020],{"class":188},"(result",[87,1022,56],{"class":184},[87,1024,1025],{"class":188},"objective)\n",[68,1027,1028],{"v-slot:r":70},[79,1029,1034],{"className":1030,"code":1031,"filename":1032,"language":1033,"meta":70,"style":70},"language-r shiki shiki-themes github-dark","library(quicopt)\n\n# A QUBO: 4 binary variables, a quadratic objective, no constraints.\nm \u003C- model()\nx \u003C- bin_var(m, \"x\", 4)\n\n# Reward each variable; penalise adjacent pairs on the 4-cycle 1-2-3-4-1.\nminimize(m, 2.0 * (x[1] * x[2] + x[2] * x[3] + x[3] * x[4] + x[1] * x[4]) -\n            (1.0 * x[1] + 0.7 * x[2] + 1.3 * x[3] + 0.5 * x[4]))\n\nresult \u003C- solve(m)      # reads QUICOPT_API_KEY\nprint(result$objective)\n","qubo.R","r",[36,1035,1036,1048,1052,1056,1069,1095,1099,1103,1204,1263,1267,1285],{"__ignoreMap":70},[87,1037,1038,1041,1043,1046],{"class":89,"line":90},[87,1039,1040],{"class":184},"library",[87,1042,362],{"class":188},[87,1044,1045],{"class":302},"quicopt",[87,1047,311],{"class":188},[87,1049,1050],{"class":89,"line":264},[87,1051,281],{"emptyLinePlaceholder":280},[87,1053,1054],{"class":89,"line":277},[87,1055,288],{"class":287},[87,1057,1058,1061,1064,1067],{"class":89,"line":284},[87,1059,1060],{"class":302},"m",[87,1062,1063],{"class":184}," \u003C-",[87,1065,1066],{"class":93}," model",[87,1068,835],{"class":188},[87,1070,1071,1074,1076,1079,1081,1083,1086,1089,1091,1093],{"class":89,"line":291},[87,1072,1073],{"class":302},"x",[87,1075,1063],{"class":184},[87,1077,1078],{"class":93}," bin_var",[87,1080,362],{"class":188},[87,1082,1060],{"class":302},[87,1084,1085],{"class":184},",",[87,1087,1088],{"class":97}," \"x\"",[87,1090,1085],{"class":184},[87,1092,763],{"class":119},[87,1094,311],{"class":188},[87,1096,1097],{"class":89,"line":314},[87,1098,281],{"emptyLinePlaceholder":280},[87,1100,1101],{"class":89,"line":371},[87,1102,862],{"class":287},[87,1104,1105,1108,1110,1112,1114,1116,1118,1120,1122,1125,1127,1129,1131,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1201],{"class":89,"line":376},[87,1106,1107],{"class":93},"minimize",[87,1109,362],{"class":188},[87,1111,1060],{"class":302},[87,1113,1085],{"class":184},[87,1115,467],{"class":119},[87,1117,405],{"class":184},[87,1119,946],{"class":188},[87,1121,1073],{"class":302},[87,1123,1124],{"class":188},"[",[87,1126,427],{"class":119},[87,1128,414],{"class":188},[87,1130,479],{"class":184},[87,1132,1133],{"class":302}," x",[87,1135,1124],{"class":188},[87,1137,441],{"class":119},[87,1139,414],{"class":188},[87,1141,417],{"class":184},[87,1143,1133],{"class":302},[87,1145,1124],{"class":188},[87,1147,441],{"class":119},[87,1149,414],{"class":188},[87,1151,479],{"class":184},[87,1153,1133],{"class":302},[87,1155,1124],{"class":188},[87,1157,455],{"class":119},[87,1159,414],{"class":188},[87,1161,417],{"class":184},[87,1163,1133],{"class":302},[87,1165,1124],{"class":188},[87,1167,455],{"class":119},[87,1169,414],{"class":188},[87,1171,479],{"class":184},[87,1173,1133],{"class":302},[87,1175,1124],{"class":188},[87,1177,365],{"class":119},[87,1179,414],{"class":188},[87,1181,417],{"class":184},[87,1183,1133],{"class":302},[87,1185,1124],{"class":188},[87,1187,427],{"class":119},[87,1189,414],{"class":188},[87,1191,479],{"class":184},[87,1193,1133],{"class":302},[87,1195,1124],{"class":188},[87,1197,365],{"class":119},[87,1199,1200],{"class":188},"]) ",[87,1202,1203],{"class":184},"-\n",[87,1205,1206,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261],{"class":89,"line":382},[87,1207,1208],{"class":188},"            (",[87,1210,402],{"class":119},[87,1212,405],{"class":184},[87,1214,1133],{"class":302},[87,1216,1124],{"class":188},[87,1218,427],{"class":119},[87,1220,414],{"class":188},[87,1222,417],{"class":184},[87,1224,420],{"class":119},[87,1226,405],{"class":184},[87,1228,1133],{"class":302},[87,1230,1124],{"class":188},[87,1232,441],{"class":119},[87,1234,414],{"class":188},[87,1236,417],{"class":184},[87,1238,434],{"class":119},[87,1240,405],{"class":184},[87,1242,1133],{"class":302},[87,1244,1124],{"class":188},[87,1246,455],{"class":119},[87,1248,414],{"class":188},[87,1250,417],{"class":184},[87,1252,448],{"class":119},[87,1254,405],{"class":184},[87,1256,1133],{"class":302},[87,1258,1124],{"class":188},[87,1260,365],{"class":119},[87,1262,993],{"class":188},[87,1264,1265],{"class":89,"line":388},[87,1266,281],{"emptyLinePlaceholder":280},[87,1268,1269,1272,1274,1276,1278,1280,1283],{"class":89,"line":394},[87,1270,1271],{"class":302},"result",[87,1273,1063],{"class":184},[87,1275,1006],{"class":93},[87,1277,362],{"class":188},[87,1279,1060],{"class":302},[87,1281,1282],{"class":188},")      ",[87,1284,1012],{"class":287},[87,1286,1287,1289,1291,1293,1296,1299],{"class":89,"line":461},[87,1288,571],{"class":93},[87,1290,362],{"class":188},[87,1292,1271],{"class":302},[87,1294,1295],{"class":184},"$",[87,1297,1298],{"class":302},"objective",[87,1300,311],{"class":188},[68,1302,1303],{"v-slot:ruby":70},[79,1304,1309],{"className":1305,"code":1306,"filename":1307,"language":1308,"meta":70,"style":70},"language-ruby shiki shiki-themes github-dark","require \"quicopt\"\n\n# A QUBO: 4 binary variables, a quadratic objective, no constraints.\nmodel = Quicopt::Model.new\nx = Array.new(4) { |i| model.bin_var(\"x#{i}\") }\n\n# Reward each variable; penalise adjacent pairs on the 4-cycle 0-1-2-3-0.\nmodel.minimize(\n  2.0 * (x[0] * x[1] + x[1] * x[2] + x[2] * x[3] + x[0] * x[3]) -\n  (1.0 * x[0] + 0.7 * x[1] + 1.3 * x[2] + 0.5 * x[3])\n)\n\nclient = Quicopt::Client.new   # reads QUICOPT_API_KEY\nresult = client.solve(model)\nputs result.objective\n","qubo.rb","ruby",[36,1310,1311,1316,1320,1324,1329,1334,1338,1342,1346,1351,1356,1360,1364,1369,1374],{"__ignoreMap":70},[87,1312,1313],{"class":89,"line":90},[87,1314,1315],{},"require \"quicopt\"\n",[87,1317,1318],{"class":89,"line":264},[87,1319,281],{"emptyLinePlaceholder":280},[87,1321,1322],{"class":89,"line":277},[87,1323,288],{},[87,1325,1326],{"class":89,"line":284},[87,1327,1328],{},"model = Quicopt::Model.new\n",[87,1330,1331],{"class":89,"line":291},[87,1332,1333],{},"x = Array.new(4) { |i| model.bin_var(\"x#{i}\") }\n",[87,1335,1336],{"class":89,"line":314},[87,1337,281],{"emptyLinePlaceholder":280},[87,1339,1340],{"class":89,"line":371},[87,1341,379],{},[87,1343,1344],{"class":89,"line":376},[87,1345,391],{},[87,1347,1348],{"class":89,"line":382},[87,1349,1350],{},"  2.0 * (x[0] * x[1] + x[1] * x[2] + x[2] * x[3] + x[0] * x[3]) -\n",[87,1352,1353],{"class":89,"line":388},[87,1354,1355],{},"  (1.0 * x[0] + 0.7 * x[1] + 1.3 * x[2] + 0.5 * x[3])\n",[87,1357,1358],{"class":89,"line":394},[87,1359,311],{},[87,1361,1362],{"class":89,"line":461},[87,1363,281],{"emptyLinePlaceholder":280},[87,1365,1366],{"class":89,"line":536},[87,1367,1368],{},"client = Quicopt::Client.new   # reads QUICOPT_API_KEY\n",[87,1370,1371],{"class":89,"line":541},[87,1372,1373],{},"result = client.solve(model)\n",[87,1375,1376],{"class":89,"line":546},[87,1377,1378],{},"puts result.objective\n",[41,1380,1382],{"id":1381},"step-5-understand-what-happened","Step 5 — Understand what happened",[15,1384,1385],{},"The example did three things:",[1387,1388,1389,1400,1416],"ol",{},[1390,1391,1392,1395,1396,1399],"li",{},[19,1393,1394],{},"Built a model"," — a standard MathOpt ",[36,1397,1398],{},"Model"," with variables, an objective,\nand (in the MILP) constraints. Nothing in it is Quicopt-specific; the same\ncode runs against any MathOpt-compatible solver, and a Pyomo model works the\nsame way.",[1390,1401,1402,1408,1409,1412,1413,1415],{},[19,1403,1404,1405],{},"Called ",[36,1406,1407],{},"client.solve(model)"," — ",[36,1410,1411],{},"Client()"," needs no arguments: it reads\nyour key from ",[36,1414,173],{}," and sends the model to the Quicopt service. If\nthe key is missing or wrong, the call fails with a message that says so and\nwhere to get a key.",[1390,1417,1418,1408,1421,1424,1425,1432,1433,1436,1437,1440,1441,653,1444,1446,1447,1450,1451,56],{},[19,1419,1420],{},"Printed and returned the result",[36,1422,1423],{},"result.display"," is the framed view the\nserver renders. It opens with a\n",[48,1426,1428,1431],{"href":1427},"\u002Fdeveloper\u002Fdocs\u002Fapi#the-shots-block",[36,1429,1430],{},"shots"," block",": the service takes several\nshots at your model and shows you what each one reached, with ",[36,1434,1435],{},"◀ best"," on the\none that won. Below it sit the summary lines, and the ",[36,1438,1439],{},"Result"," object carries\nthe same values as fields — ",[36,1442,1443],{},"status",[36,1445,1298],{},", and the ",[36,1448,1449],{},"solution"," keyed by\nyour variable names. Every field is described in the\n",[48,1452,1454],{"href":1453},"\u002Fdeveloper\u002Fdocs\u002Fapi","API reference",[41,1456,1458],{"id":1457},"what-you-can-solve-today","What you can solve today",[15,1460,1461,1462,1465,1466,1470,1471,1474],{},"The API currently solves ",[19,1463,1464],{},"LP, QP, MILP, MIQP, MINLP, QUBO, PUBO\u002FHUBO, and NLP","\nmodels — there is a ",[48,1467,1469],{"href":1468},"\u002Fdeveloper\u002Fexamples\u002Fby-class","runnable example for each",".\n",[19,1472,1473],{},"Black-box objectives are coming soon",";\na model outside today's classes is declined with a readable message, never a\nhalf-solved result.",[41,1476,1478],{"id":1477},"beyond-the-free-tier","Beyond the free tier",[15,1480,1481,1482,1486],{},"The free account solves models with up to 50 variables and comes with a limited\ncompute allowance. For larger models we can give you 30 days of evaluation\naccess without that limit. For regular use there are token packages, and for production planning an enterprise license; see\n",[48,1483,1485],{"href":1484},"\u002Fdeveloper\u002Fpricing","Pricing",". Questions, or real models you want to try Quicopt\non? Just ask:",[1488,1489],"contact-cta",{"sub":1490,"title":1491},"Whether something's unclear or you want to try Quicopt on your real models — tell us what you're optimizing.","Questions? Talk to us.",[41,1493,1495],{"id":1494},"where-next","Where next",[1497,1498,1499,1505,1523],"ul",{},[1390,1500,1501,1504],{},[48,1502,1503],{"href":1468},"Examples"," — a runnable model for every supported problem\nclass, including how an infeasible model comes back.",[1390,1506,1507,1509,1510,1512,1513,653,1516,1519,1520,1522],{},[48,1508,1454],{"href":1453}," — the ",[36,1511,1045],{}," Python client in full:\n",[36,1514,1515],{},"Client",[36,1517,1518],{},"solve()",", the ",[36,1521,1439],{}," fields, and the async job API.",[1390,1524,1525,1529],{},[48,1526,1528],{"href":1527},"\u002Fdeveloper\u002Fdocs\u002Fmodeling","Modeling front-ends"," — what you can express in\nPyomo and OR-Tools MathOpt.",[41,1531,1533],{"id":1532},"about-this-service","About this service",[15,1535,1536,1537,1540],{},"The free tier is provided ",[19,1538,1539],{},"as-is",", for evaluation and research only —\nwithout availability, functionality or result guarantees, and without any\nservice level. Liability is limited, to the extent permitted by law, to intent\nand gross negligence.",[15,1542,1543,1546,1547,1551,1552,1556,1557,56],{},[19,1544,1545],{},"We keep the data you send over the API for 24 months"," to improve future\nversions of our solvers; you can delete a job at any time from the client.\nPlease don't submit personal, confidential or otherwise sensitive data\ninside an optimization model — the service isn't designed for that. Full\ndetails: ",[48,1548,1550],{"href":1549},"\u002Fterms","Terms of Use"," · ",[48,1553,1555],{"href":1554},"\u002Fprivacy","Privacy Policy"," ·\n",[48,1558,1560],{"href":1559},"\u002Fimprint","Legal notice",[1562,1563,1564],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":70,"searchDepth":264,"depth":264,"links":1566},[1567,1568,1569,1570,1571,1572,1573,1574,1575],{"id":43,"depth":264,"text":44},{"id":59,"depth":264,"text":60},{"id":166,"depth":264,"text":167},{"id":217,"depth":264,"text":218},{"id":1381,"depth":264,"text":1382},{"id":1457,"depth":264,"text":1458},{"id":1477,"depth":264,"text":1478},{"id":1494,"depth":264,"text":1495},{"id":1532,"depth":264,"text":1533},"Sign up, pip install quicopt, set your API key and solve a model built in Pyomo or OR-Tools MathOpt with the Quicopt API.","md",null,{},false,"\u002Fdeveloper\u002Fdocs\u002Fquickstart",{"title":5,"description":1576},"developer\u002Fdocs\u002Fquickstart","dOZ1RFPl_Yuwof_aG1hw3BXzThcLhHyOWAxPXU6luQc",1794337678966]