<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://optalcp.com/changelog</id>
    <title>OptalCP Blog</title>
    <updated>2026-02-16T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://optalcp.com/changelog"/>
    <subtitle>OptalCP Blog</subtitle>
    <icon>https://optalcp.com/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[OptalCP 2026.2.0 Release]]></title>
        <id>https://optalcp.com/changelog/2026/02/16/release-2026.2.0</id>
        <link href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0"/>
        <updated>2026-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a drop-in replacement for IBM CP Optimizer's Python API, adds the element expression for array lookups, and includes bug fixes and API refinements.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a drop-in replacement for IBM CP Optimizer's Python API, adds the <code>element</code> expression for array lookups, and includes bug fixes and API refinements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features">New Features<a href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cp-optimizer-compatibility">CP Optimizer Compatibility<a href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0#cp-optimizer-compatibility" class="hash-link" aria-label="Direct link to CP Optimizer Compatibility" title="Direct link to CP Optimizer Compatibility" translate="no">​</a></h3>
<p>The new <a href="https://github.com/ScheduleOpt/optalcp-cpo" target="_blank" rel="noopener noreferrer" class="">optalcp-cpo</a> package is a drop-in replacement for IBM CP Optimizer's Python API. Existing <a href="https://github.com/IBMDecisionOptimization/docplex" target="_blank" rel="noopener noreferrer" class="">DOcplex CP</a> models can run on OptalCP with a single import change:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Before:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> docplex</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">model </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># After:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> optalcp_cpo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">model </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><br></div></code></pre></div></div>
<p>No other code changes are needed. The package translates DOcplex CP models to OptalCP at solve time. In our testing, <strong>14 out of 20</strong> scheduling examples from the DOcplex repository work and run faster on OptalCP. The scheduling tutorial notebook works through <strong>6 out of 7</strong> chapters.</p>
<p>This is the initial release of the compatibility layer. Not all CP Optimizer features are supported yet — see the <a href="https://github.com/ScheduleOpt/optalcp-cpo" target="_blank" rel="noopener noreferrer" class="">optalcp-cpo README</a> for the current status. We are actively working on expanding compatibility.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="element-expression">Element Expression<a href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0#element-expression" class="hash-link" aria-label="Direct link to Element Expression" title="Direct link to Element Expression" translate="no">​</a></h3>
<p>The new <code>element</code> function creates an integer expression equal to <code>array[subscript]</code>, where <code>subscript</code> is a decision variable or expression. It automatically constrains <code>subscript</code> to the valid index range.</p>
<p>In this example, we model a <strong>learning effect</strong>: the more tasks a worker completes, the faster they get. Each task's duration depends on its position in the processing sequence:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Python</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">TypeScript</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Learning effect: tasks get faster as the worker gains experience</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">durations </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">33</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">28</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tasks </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">interval_var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">length</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"Task</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">i</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token builtin">range</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">seq </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sequence_var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">no_overlap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">seq</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> task </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">enforce</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">length</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">durations</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">position</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">seq</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minimize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token builtin">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">end</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> t </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Learning effect: tasks get faster as the worker gains experience</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> durations </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">33</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">28</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tasks </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">length</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">intervalVar</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> length</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Task</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">i</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> seq </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sequenceVar</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> intervals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> tasks </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">noOverlap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">seq</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> task </span><span class="token keyword" style="color:#00009f">of</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">enforce</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">length</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">eq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">durations</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">position</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">seq</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">minimize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">end</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="api-changes">API Changes<a href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0#api-changes" class="hash-link" aria-label="Direct link to API Changes" title="Direct link to API Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="solversendsolution-is-now-synchronous"><code>Solver.sendSolution</code> is Now Synchronous<a href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0#solversendsolution-is-now-synchronous" class="hash-link" aria-label="Direct link to solversendsolution-is-now-synchronous" title="Direct link to solversendsolution-is-now-synchronous" translate="no">​</a></h3>
<p><code>Solver.sendSolution()</code> / <code>Solver.send_solution()</code> is now a synchronous method. It queues the solution for delivery and returns immediately. Remove <code>await</code> from existing calls:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Python</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">TypeScript</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Before:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_solution</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">solution</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># After:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_solution</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">solution</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Before:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sendSolution</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">solution</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// After:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sendSolution</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">solution</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="solveronsummary-removed"><code>Solver.onSummary</code> Removed<a href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0#solveronsummary-removed" class="hash-link" aria-label="Direct link to solveronsummary-removed" title="Direct link to solveronsummary-removed" translate="no">​</a></h3>
<p>The <code>onSummary</code> / <code>on_summary</code> callback and the <code>SolveSummary</code> type have been removed. Use the <code>SolveResult</code> returned by <code>solve()</code> instead — it contains the same fields:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Python</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">TypeScript</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Before:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">on_summary</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Time: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">summary</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">duration</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">:</span><span class="token string-interpolation interpolation format-spec">.2f</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">s"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Solutions: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">summary</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">nb_solutions</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">on_summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> on_summary</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">solve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># After:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">solve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Time: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">duration</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">:</span><span class="token string-interpolation interpolation format-spec">.2f</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">s"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Solutions: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">nb_solutions</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Before:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function-variable function" style="color:#d73a49">onSummary</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Time: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">summary</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation">duration</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation function" style="color:#d73a49">toFixed</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation number" style="color:#36acaa">2</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">s</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Solutions: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">summary</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation">nbSolutions</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">solve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// After:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> solver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">solve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Time: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">result</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation">duration</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation function" style="color:#d73a49">toFixed</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation number" style="color:#36acaa">2</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">s</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Solutions: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">result</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation">nbSolutions</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://optalcp.com/changelog/2026/02/16/release-2026.2.0#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<ul>
<li class=""><strong>Position expression reuse</strong>: Fixed an issue where using a <code>position()</code> expression in multiple constraints could produce incorrect results.</li>
<li class=""><strong>Python sub-expression reuse</strong>: Fixed a Python API issue where reusing a sub-expression in multiple places caused degraded performance.</li>
</ul>]]></content>
        <author>
            <name>OptalCP Team</name>
            <uri>/team</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[OptalCP 2026.1.0 Release]]></title>
        <id>https://optalcp.com/changelog/2026/01/30/release-2026.1.0</id>
        <link href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0"/>
        <updated>2026-01-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a native Python API, bringing OptalCP to a wider audience of optimization practitioners. The TypeScript API has been refined to align with the new Python interface, resulting in cleaner, more intuitive syntax across both languages.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a native Python API, bringing OptalCP to a wider audience of optimization practitioners. The TypeScript API has been refined to align with the new Python interface, resulting in cleaner, more intuitive syntax across both languages.</p>
<p>On the solver side, we've added automatic configuration through presets, making it easier to get good performance without manual parameter tuning. Decision problems now stop automatically after finding the first solution, eliminating a common source of confusion. Discrete resource constraints now support variable maximum capacity, enabling new classes of capacity planning problems.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-python-api">New Python API<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#new-python-api" class="hash-link" aria-label="Direct link to New Python API" title="Direct link to New Python API" translate="no">​</a></h3>
<p>OptalCP now has a Python API. The API is designed to be nearly identical to the TypeScript API, making it easy to switch between languages or translate examples.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> optalcp </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> cp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Model</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">interval_var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">length</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"task"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minimize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">end</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">solve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Parameters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timeLimit</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">60</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">solution</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Task ends at </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">solution</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">get_end</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">(</span><span class="token string-interpolation interpolation">task</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">)</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Key features:</p>
<ul>
<li class="">Method-based style: <code>model.solve()</code></li>
<li class="">Property accessors: <code>interval.start_min</code>, <code>interval.length_max</code></li>
<li class="">Comparison operators: <code>cumul &lt;= 10</code> and <code>5 &lt; x</code></li>
<li class="">Auto-registration of constraints and objectives</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="typescript-api-changes">TypeScript API Changes<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#typescript-api-changes" class="hash-link" aria-label="Direct link to TypeScript API Changes" title="Direct link to TypeScript API Changes" translate="no">​</a></h3>
<p>The TypeScript API has been updated to align with the new Python API. Both APIs now share nearly identical syntax. The main changes are:</p>
<ul>
<li class=""><code>model.constraint()</code> renamed to <code>model.enforce()</code> for clarity</li>
<li class=""><code>solve(model, ...)</code> replaced by <code>model.solve()</code></li>
<li class="">Functions merged into overloads: <code>model.cumulPlus()</code> is now just <code>model.plus()</code>, working for both integer and cumulative expressions</li>
<li class="">Getter/setter methods replaced with properties</li>
<li class="">And many more...</li>
</ul>
<p>Old functions remain available but are deprecated. See <a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#typescript-api-changes-detail" class="">TypeScript API Changes</a> below for the full list.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatic-solver-configuration-with-presets">Automatic Solver Configuration with Presets<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#automatic-solver-configuration-with-presets" class="hash-link" aria-label="Direct link to Automatic Solver Configuration with Presets" title="Direct link to Automatic Solver Configuration with Presets" translate="no">​</a></h3>
<p>The new <code>preset</code> parameter simplifies solver configuration by setting optimal defaults for multiple parameters at once:</p>
<ul>
<li class=""><strong>Auto</strong> (default): Automatically selects preset based on problem size</li>
<li class=""><strong>Default</strong>: Balanced configuration with maximum propagation and mixed search strategies</li>
<li class=""><strong>Large</strong>: Optimized for problems with more than 100,000 variables</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="variable-capacity-for-discrete-resources">Variable Capacity for Discrete Resources<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#variable-capacity-for-discrete-resources" class="hash-link" aria-label="Direct link to Variable Capacity for Discrete Resources" title="Direct link to Variable Capacity for Discrete Resources" translate="no">​</a></h3>
<p>Discrete resource constraints now support variable maximum capacity. Instead of a fixed integer limit, you can specify a decision variable or expression as the capacity bound:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Python</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">TypeScript</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Variable capacity based on a decision variable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">capacity </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">int_var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">min</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">max</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"capacity"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">enforce</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cumul </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> capacity</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Variable capacity based on a decision variable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> capacity </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">intVar</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> min</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"capacity"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">enforce</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cumul</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">le</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">capacity</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div></div></div>
<p>This enables modeling scenarios where resource capacity itself is a decision, such as:</p>
<ul>
<li class="">Selecting machine configurations with different capacities</li>
<li class="">Optimizing workforce allocation where team size varies</li>
<li class="">Capacity planning problems where investment decisions affect limits</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="smart-default-for-decision-problems">Smart Default for Decision Problems<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#smart-default-for-decision-problems" class="hash-link" aria-label="Direct link to Smart Default for Decision Problems" title="Direct link to Smart Default for Decision Problems" translate="no">​</a></h3>
<p>The <code>solutionLimit</code> parameter now defaults to automatic mode: decision problems (without an objective) stop after finding the first solution, while optimization problems continue searching. This eliminates the common pitfall of forgetting to set <code>solutionLimit=1</code> for satisfaction problems.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features">New Features<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="solver">Solver<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#solver" class="hash-link" aria-label="Direct link to Solver" title="Direct link to Solver" translate="no">​</a></h3>
<ul>
<li class=""><strong>Variable resource capacity</strong>: Discrete resource constraints now accept decision variables or expressions as capacity bounds</li>
<li class=""><strong>Preset parameter</strong>: One-parameter solver configuration for different problem sizes</li>
<li class=""><strong>Automatic solution limit</strong>: Smart default stops at first solution for decision problems</li>
<li class=""><strong>Deferred solution values</strong>: Performance optimization for large models</li>
<li class=""><strong>Improved logging</strong>: Parameter values now show reasons (preset, auto) and workers are grouped by configuration</li>
<li class=""><strong>solverArgs parameter</strong>: Pass custom command-line arguments to the solver subprocess</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="typescript-api-changes-detail">TypeScript API Changes (Detail)<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#typescript-api-changes-detail" class="hash-link" aria-label="Direct link to TypeScript API Changes (Detail)" title="Direct link to TypeScript API Changes (Detail)" translate="no">​</a></h2>
<p>The main goal of these changes is to align the TypeScript and Python APIs, making them nearly identical and easier to use across both languages.</p>
<p>All deprecated functions remain functional but are no longer documented. They will be removed in a future release.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary-of-changes">Summary of Changes<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#summary-of-changes" class="hash-link" aria-label="Direct link to Summary of Changes" title="Direct link to Summary of Changes" translate="no">​</a></h3>
<table><thead><tr><th>Category</th><th>Change Pattern</th></tr></thead><tbody><tr><td>Variable properties</td><td>Methods → Property accessors</td></tr><tr><td>Cumulative expressions</td><td><code>cumul</code> prefix removed</td></tr><tr><td>Step functions</td><td><code>stepFunction</code> prefix removed, clearer names</td></tr><tr><td>Interval accessors</td><td><code>Of</code> suffix removed</td></tr><tr><td>Global functions</td><td>Moved to class methods</td></tr><tr><td>Event handlers</td><td><code>on()</code> method → Property setters</td></tr><tr><td>Result properties</td><td>Renamed for clarity</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="variable-classes">Variable Classes<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#variable-classes" class="hash-link" aria-label="Direct link to Variable Classes" title="Direct link to Variable Classes" translate="no">​</a></h3>
<p>Variable properties are now accessed directly as properties instead of through getter/setter methods, making the code more concise and idiomatic.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="intvar">IntVar<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#intvar" class="hash-link" aria-label="Direct link to IntVar" title="Direct link to IntVar" translate="no">​</a></h4>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>isOptional()</code></td><td><code>optional</code> property</td></tr><tr><td><code>isPresent()</code></td><td><code>optional</code> property</td></tr><tr><td><code>isAbsent()</code></td><td><code>optional</code> property</td></tr><tr><td><code>getMin()</code></td><td><code>min</code> property</td></tr><tr><td><code>getMax()</code></td><td><code>max</code> property</td></tr><tr><td><code>makeOptional()</code></td><td><code>optional = true</code></td></tr><tr><td><code>makeAbsent()</code></td><td><code>optional = null</code></td></tr><tr><td><code>makePresent()</code></td><td><code>optional = false</code></td></tr><tr><td><code>setMin(min)</code></td><td><code>min</code> property</td></tr><tr><td><code>setMax(max)</code></td><td><code>max</code> property</td></tr><tr><td><code>setRange(min, max)</code></td><td><code>min</code> and <code>max</code> properties</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="boolvar">BoolVar<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#boolvar" class="hash-link" aria-label="Direct link to BoolVar" title="Direct link to BoolVar" translate="no">​</a></h4>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>isOptional()</code></td><td><code>optional</code> property</td></tr><tr><td><code>isPresent()</code></td><td><code>optional</code> property</td></tr><tr><td><code>isAbsent()</code></td><td><code>optional</code> property</td></tr><tr><td><code>getMin()</code></td><td><code>min</code> property</td></tr><tr><td><code>getMax()</code></td><td><code>max</code> property</td></tr><tr><td><code>makeOptional()</code></td><td><code>optional = true</code></td></tr><tr><td><code>makeAbsent()</code></td><td><code>optional = null</code></td></tr><tr><td><code>makePresent()</code></td><td><code>optional = false</code></td></tr><tr><td><code>setMin(min)</code></td><td><code>min</code> property</td></tr><tr><td><code>setMax(max)</code></td><td><code>max</code> property</td></tr><tr><td><code>setRange(min, max)</code></td><td><code>min</code> and <code>max</code> properties</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="intervalvar">IntervalVar<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#intervalvar" class="hash-link" aria-label="Direct link to IntervalVar" title="Direct link to IntervalVar" translate="no">​</a></h4>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>isOptional()</code></td><td><code>optional</code> property</td></tr><tr><td><code>isPresent()</code></td><td><code>optional</code> property</td></tr><tr><td><code>isAbsent()</code></td><td><code>optional</code> property</td></tr><tr><td><code>makeOptional()</code></td><td><code>optional = true</code></td></tr><tr><td><code>makePresent()</code></td><td><code>optional = false</code></td></tr><tr><td><code>makeAbsent()</code></td><td><code>optional = null</code></td></tr><tr><td><code>getStartMin()</code></td><td><code>startMin</code> property</td></tr><tr><td><code>getStartMax()</code></td><td><code>startMax</code> property</td></tr><tr><td><code>getEndMin()</code></td><td><code>endMin</code> property</td></tr><tr><td><code>getEndMax()</code></td><td><code>endMax</code> property</td></tr><tr><td><code>getLengthMin()</code></td><td><code>lengthMin</code> property</td></tr><tr><td><code>getLengthMax()</code></td><td><code>lengthMax</code> property</td></tr><tr><td><code>setStart(s)</code></td><td><code>startMin</code> and <code>startMax</code> properties</td></tr><tr><td><code>setStart(sMin, sMax)</code></td><td><code>startMin</code> and <code>startMax</code> properties</td></tr><tr><td><code>setStartMin(sMin)</code></td><td><code>startMin</code> property</td></tr><tr><td><code>setStartMax(sMax)</code></td><td><code>startMax</code> property</td></tr><tr><td><code>setEnd(e)</code></td><td><code>endMin</code> and <code>endMax</code> properties</td></tr><tr><td><code>setEnd(eMin, eMax)</code></td><td><code>endMin</code> and <code>endMax</code> properties</td></tr><tr><td><code>setEndMin(eMin)</code></td><td><code>endMin</code> property</td></tr><tr><td><code>setEndMax(eMax)</code></td><td><code>endMax</code> property</td></tr><tr><td><code>setLength(len)</code></td><td><code>lengthMin</code> and <code>lengthMax</code> properties</td></tr><tr><td><code>setLength(lMin, lMax)</code></td><td><code>lengthMin</code> and <code>lengthMax</code> properties</td></tr><tr><td><code>setLengthMin(lMin)</code></td><td><code>lengthMin</code> property</td></tr><tr><td><code>setLengthMax(lMax)</code></td><td><code>lengthMax</code> property</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="modelelement">ModelElement<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#modelelement" class="hash-link" aria-label="Direct link to ModelElement" title="Direct link to ModelElement" translate="no">​</a></h4>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>setName(name)</code></td><td><code>name</code> property</td></tr><tr><td><code>getName()</code></td><td><code>name</code> property</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-class">Model Class<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#model-class" class="hash-link" aria-label="Direct link to Model Class" title="Direct link to Model Class" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="naming-and-constraints">Naming and Constraints<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#naming-and-constraints" class="hash-link" aria-label="Direct link to Naming and Constraints" title="Direct link to Naming and Constraints" translate="no">​</a></h4>
<p>The <code>constraint()</code> method is renamed to <code>enforce()</code> to better convey the intent of adding a constraint to the model.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>setName(name)</code></td><td><code>name</code> property</td></tr><tr><td><code>getName()</code></td><td><code>name</code> property</td></tr><tr><td><code>constraint(constraint)</code></td><td><code>enforce(constraint)</code></td></tr><tr><td><code>intVar({ range: [a, b] })</code></td><td><code>intVar({ min: a, max: b })</code></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="interval-accessors">Interval Accessors<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#interval-accessors" class="hash-link" aria-label="Direct link to Interval Accessors" title="Direct link to Interval Accessors" translate="no">​</a></h4>
<p>The <code>Of</code> suffix is removed from interval accessor functions for cleaner syntax.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>presenceOf(interval)</code></td><td><code>presence(interval)</code></td></tr><tr><td><code>startOf(interval)</code></td><td><code>start(interval)</code></td></tr><tr><td><code>endOf(interval)</code></td><td><code>end(interval)</code></td></tr><tr><td><code>lengthOf(interval)</code></td><td><code>length(interval)</code></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cumulative-expressions">Cumulative Expressions<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#cumulative-expressions" class="hash-link" aria-label="Direct link to Cumulative Expressions" title="Direct link to Cumulative Expressions" translate="no">​</a></h4>
<p>The <code>cumul</code> prefix is removed; these functions are now overloaded with their integer counterparts (e.g., <code>plus()</code> works for both integers and cumulative expressions).</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>cumulSum(args)</code></td><td><code>sum(args)</code></td></tr><tr><td><code>cumulPlus(lhs, rhs)</code></td><td><code>plus(lhs, rhs)</code></td></tr><tr><td><code>cumulMinus(lhs, rhs)</code></td><td><code>minus(lhs, rhs)</code></td></tr><tr><td><code>cumulLe(cumul, max)</code></td><td><code>le(cumul, max)</code></td></tr><tr><td><code>cumulGe(cumul, min)</code></td><td><code>ge(cumul, min)</code></td></tr><tr><td><code>cumulNeg(arg)</code></td><td><code>neg(arg)</code></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-functions">Step Functions<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#step-functions" class="hash-link" aria-label="Direct link to Step Functions" title="Direct link to Step Functions" translate="no">​</a></h4>
<p>Step function operations are renamed to use standard mathematical terminology.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>stepFunctionSum(func, interval)</code></td><td><code>integral(func, interval)</code></td></tr><tr><td><code>stepFunctionEval(func, x)</code></td><td><code>eval(func, x)</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cumulexpr-class">CumulExpr Class<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#cumulexpr-class" class="hash-link" aria-label="Direct link to CumulExpr Class" title="Direct link to CumulExpr Class" translate="no">​</a></h3>
<p>Instance methods mirror the model-level changes, removing the <code>cumul</code> prefix.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>cumulPlus(rhs)</code></td><td><code>plus(rhs)</code></td></tr><tr><td><code>cumulMinus(rhs)</code></td><td><code>minus(rhs)</code></td></tr><tr><td><code>cumulLe(max)</code></td><td><code>le(max)</code></td></tr><tr><td><code>cumulGe(min)</code></td><td><code>ge(min)</code></td></tr><tr><td><code>cumulNeg()</code></td><td><code>neg()</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="intstepfunction-class">IntStepFunction Class<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#intstepfunction-class" class="hash-link" aria-label="Direct link to IntStepFunction Class" title="Direct link to IntStepFunction Class" translate="no">​</a></h3>
<p>Instance methods mirror the model-level changes, using standard mathematical names.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>stepFunctionSum(interval)</code></td><td><code>integral(interval)</code></td></tr><tr><td><code>stepFunctionEval(x)</code></td><td><code>eval(x)</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="solver-class">Solver Class<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#solver-class" class="hash-link" aria-label="Direct link to Solver Class" title="Direct link to Solver Class" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="event-handlers">Event Handlers<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#event-handlers" class="hash-link" aria-label="Direct link to Event Handlers" title="Direct link to Event Handlers" translate="no">​</a></h4>
<p>Event handlers are now assigned as properties instead of using the <code>on()</code> method.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>on('error', listener)</code></td><td><code>onError</code> property</td></tr><tr><td><code>on('warning', listener)</code></td><td><code>onWarning</code> property</td></tr><tr><td><code>on('log', listener)</code></td><td><code>onLog</code> property</td></tr><tr><td><code>on('solution', listener)</code></td><td><code>onSolution</code> property</td></tr><tr><td><code>on('objectiveBound', listener)</code></td><td><code>onObjectiveBound</code> property</td></tr><tr><td><code>on('lowerBound', listener)</code></td><td><code>onObjectiveBound</code> property</td></tr><tr><td><code>on('summary', listener)</code></td><td><code>onSummary</code> property</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="result-types">Result Types<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#result-types" class="hash-link" aria-label="Direct link to Result Types" title="Direct link to Result Types" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="solvesummary">SolveSummary<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#solvesummary" class="hash-link" aria-label="Direct link to SolveSummary" title="Direct link to SolveSummary" translate="no">​</a></h4>
<p>Field names are updated for consistency: <code>lowerBound</code> becomes <code>objectiveBound</code> to reflect that it applies to both minimization and maximization.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>nbWorkers</code></td><td><code>actualWorkers</code></td></tr><tr><td><code>lowerBound</code></td><td><code>objectiveBound</code></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="solveresult">SolveResult<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#solveresult" class="hash-link" aria-label="Direct link to SolveResult" title="Direct link to SolveResult" translate="no">​</a></h4>
<p>The <code>best</code> prefix is removed from field names for brevity, and <code>lowerBound</code> becomes <code>objectiveBound</code>.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>nbWorkers</code></td><td><code>actualWorkers</code></td></tr><tr><td><code>lowerBound</code></td><td><code>objectiveBound</code></td></tr><tr><td><code>bestSolution</code></td><td><code>solution</code></td></tr><tr><td><code>bestSolutionTime</code></td><td><code>solutionTime</code></td></tr><tr><td><code>bestLBTime</code></td><td><code>boundTime</code></td></tr><tr><td><code>bestSolutionValid</code></td><td><code>solutionValid</code></td></tr><tr><td><code>lowerBoundHistory</code></td><td><code>objectiveBoundHistory</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="global-functions">Global Functions<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#global-functions" class="hash-link" aria-label="Direct link to Global Functions" title="Direct link to Global Functions" translate="no">​</a></h3>
<p>Standalone functions are moved to class methods for better discoverability and a more object-oriented API.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>calcSolverPath(params)</code></td><td><code>Solver.findSolver(params)</code></td></tr><tr><td><code>solve(model, params, ...)</code></td><td><code>model.solve(params, ...)</code></td></tr><tr><td><code>problem2json(model)</code></td><td><code>model.toJSON()</code></td></tr><tr><td><code>json2problem(json)</code></td><td><code>Model.fromJSON(json)</code></td></tr><tr><td><code>problem2txt(model, ...)</code></td><td><code>model.toText(...)</code></td></tr><tr><td><code>problem2js(model, ...)</code></td><td><code>model.toJS(...)</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="parameter-parsing">Parameter Parsing<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#parameter-parsing" class="hash-link" aria-label="Direct link to Parameter Parsing" title="Direct link to Parameter Parsing" translate="no">​</a></h3>
<p>The CLI parameter parsing API has been redesigned to use an options object for better flexibility and consistency.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>parseParameters(params?, args?)</code></td><td><code>parseParameters(options?)</code></td></tr><tr><td><code>parseSomeParameters(params, args?)</code></td><td><code>parseKnownParameters(options?)</code></td></tr><tr><td><code>Parameters.version</code></td><td>Removed (use <code>--optalcpVersion</code> flag)</td></tr><tr><td><code>Parameters.usage</code></td><td><code>parseParameters({ usage: "..." })</code></td></tr></tbody></table>
<p>The new functions use an options object:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> params </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseParameters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  args</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">slice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// default</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  defaults</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> timeLimit</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// CLI overrides these</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  usage</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Usage: myapp [options]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  exitOnError</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// false to throw instead of exit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">params</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">unknown</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseKnownParameters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>The <code>--version</code> flag has been renamed to <code>--optalcpVersion</code> to print solver version information.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="type-aliases-backward-compatibility">Type Aliases (Backward Compatibility)<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#type-aliases-backward-compatibility" class="hash-link" aria-label="Direct link to Type Aliases (Backward Compatibility)" title="Direct link to Type Aliases (Backward Compatibility)" translate="no">​</a></h3>
<p>These type aliases are preserved for backward compatibility but should be migrated to the new names.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>ModelNode</code></td><td><code>ModelElement</code></td></tr><tr><td><code>ObjectiveHistoryItem</code></td><td><code>ObjectiveEntry</code></td></tr><tr><td><code>LowerBoundEvent</code></td><td><code>ObjectiveBoundEntry</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="solver-parameter-changes">Solver Parameter Changes<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#solver-parameter-changes" class="hash-link" aria-label="Direct link to Solver Parameter Changes" title="Direct link to Solver Parameter Changes" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="deprecated-backward-compatible">Deprecated (Backward Compatible)<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#deprecated-backward-compatible" class="hash-link" aria-label="Direct link to Deprecated (Backward Compatible)" title="Direct link to Deprecated (Backward Compatible)" translate="no">​</a></h4>
<p>The <code>LB</code> (lower bound) terminology is replaced with <code>Dual</code> to be consistent with optimization literature.</p>
<table><thead><tr><th>Deprecated</th><th>Replacement</th></tr></thead><tbody><tr><td><code>FDSLB</code></td><td><code>FDSDual</code></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes-no-backward-compatibility">Breaking Changes (No Backward Compatibility)<a href="https://optalcp.com/changelog/2026/01/30/release-2026.1.0#breaking-changes-no-backward-compatibility" class="hash-link" aria-label="Direct link to Breaking Changes (No Backward Compatibility)" title="Direct link to Breaking Changes (No Backward Compatibility)" translate="no">​</a></h4>
<p>These parameter renames are <strong>not backward compatible</strong>; old names will cause errors.</p>
<table><thead><tr><th>Old Name</th><th>New Name</th></tr></thead><tbody><tr><td><code>FDSLBStrategy</code></td><td><code>FDSDualStrategy</code></td></tr><tr><td><code>FDSLBResetRatings</code></td><td><code>FDSDualResetRatings</code></td></tr><tr><td><code>logOutput</code></td><td><code>printLog</code></td></tr><tr><td><code>solverPath</code></td><td><code>solver</code></td></tr><tr><td><code>stepFunctionSumPropagationLevel</code></td><td><code>integralPropagationLevel</code></td></tr></tbody></table>]]></content>
        <author>
            <name>OptalCP Team</name>
            <uri>/team</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
</feed>