solvers: cover the sequential linear solver on a large model

Add ResourceDepletion.fods, an original 100-period depletable-resource
model. It maximizes the sum over periods of discount^t times
(2*sqrt(extraction) minus a cost that rises as the stock falls,
cost*extraction/stock), choosing the extraction path B10:B109. The stock
column cascades, so each period's choice changes every later period, and
the remaining-stock column must stay non-negative throughout. The
starting path scores about 29.36 and the best known optimum, found with
an external gradient solver, is about 63.78.

The swarm solver cannot handle a model of this dimension and returns no
solution. The sequential linear solver loads it, stays feasible, and
improves the objective, which is what the test checks. The time limit is
kept short and only progress is checked, so the test does not depend on
machine speed.

Also raise the iteration cap in the solver from a fixed small number to
a high safety limit, so the time budget and the convergence test decide
when to stop. Smaller models still stop on convergence well before the
limit, so their behaviour is unchanged.

Signed-off-by: Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>
Change-Id: I4102c2ccb921888881179b23e305d652ceca86c3
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/4660
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
(cherry picked from commit 06e03222b6a4e58d07df409d3f86deb263e444a2)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208340
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Jenkins
This commit is contained in:
Tomaž Vajngerl
2026-07-21 16:23:52 +02:00
committed by Xisco Fauli
parent d5e094de9b
commit 17d713fdd4
3 changed files with 191 additions and 1 deletions
@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?>
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.spreadsheet">
<office:body>
<office:spreadsheet>
<table:table table:name="Sheet1">
<table:table-column table:number-columns-repeated="5"/>
<table:table-row><table:table-cell office:value-type="string"><text:p>periods</text:p></table:table-cell><table:table-cell office:value-type="float" office:value="100"/></table:table-row>
<table:table-row><table:table-cell office:value-type="string"><text:p>rate</text:p></table:table-cell><table:table-cell office:value-type="float" office:value="0.05"/></table:table-row>
<table:table-row><table:table-cell office:value-type="string"><text:p>stock</text:p></table:table-cell><table:table-cell office:value-type="float" office:value="100"/></table:table-row>
<table:table-row><table:table-cell office:value-type="string"><text:p>discount</text:p></table:table-cell><table:table-cell table:formula="of:=1/(1+[.B2])" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="string"><text:p>cost</text:p></table:table-cell><table:table-cell office:value-type="float" office:value="1"/></table:table-row>
<table:table-row><table:table-cell table:number-columns-repeated="2"/></table:table-row>
<table:table-row><table:table-cell office:value-type="string"><text:p>objective</text:p></table:table-cell><table:table-cell table:formula="of:=SUM([.D10:.D109])" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell table:number-columns-repeated="2"/></table:table-row>
<table:table-row><table:table-cell office:value-type="string"><text:p>t</text:p></table:table-cell><table:table-cell office:value-type="string"><text:p>extract</text:p></table:table-cell><table:table-cell office:value-type="string"><text:p>stock</text:p></table:table-cell><table:table-cell office:value-type="string"><text:p>utility</text:p></table:table-cell><table:table-cell office:value-type="string"><text:p>remaining</text:p></table:table-cell></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="0"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.B3]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C10]&lt;=0;0;[.B4]^[.A10]*(2*SQRT([.B10])-[.B5]*[.B10]/[.C10]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C10]-[.B10]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="1"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E10]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C11]&lt;=0;0;[.B4]^[.A11]*(2*SQRT([.B11])-[.B5]*[.B11]/[.C11]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C11]-[.B11]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="2"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E11]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C12]&lt;=0;0;[.B4]^[.A12]*(2*SQRT([.B12])-[.B5]*[.B12]/[.C12]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C12]-[.B12]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="3"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E12]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C13]&lt;=0;0;[.B4]^[.A13]*(2*SQRT([.B13])-[.B5]*[.B13]/[.C13]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C13]-[.B13]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="4"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E13]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C14]&lt;=0;0;[.B4]^[.A14]*(2*SQRT([.B14])-[.B5]*[.B14]/[.C14]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C14]-[.B14]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="5"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E14]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C15]&lt;=0;0;[.B4]^[.A15]*(2*SQRT([.B15])-[.B5]*[.B15]/[.C15]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C15]-[.B15]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="6"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E15]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C16]&lt;=0;0;[.B4]^[.A16]*(2*SQRT([.B16])-[.B5]*[.B16]/[.C16]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C16]-[.B16]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="7"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E16]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C17]&lt;=0;0;[.B4]^[.A17]*(2*SQRT([.B17])-[.B5]*[.B17]/[.C17]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C17]-[.B17]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="8"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E17]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C18]&lt;=0;0;[.B4]^[.A18]*(2*SQRT([.B18])-[.B5]*[.B18]/[.C18]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C18]-[.B18]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="9"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E18]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C19]&lt;=0;0;[.B4]^[.A19]*(2*SQRT([.B19])-[.B5]*[.B19]/[.C19]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C19]-[.B19]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="10"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E19]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C20]&lt;=0;0;[.B4]^[.A20]*(2*SQRT([.B20])-[.B5]*[.B20]/[.C20]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C20]-[.B20]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="11"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E20]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C21]&lt;=0;0;[.B4]^[.A21]*(2*SQRT([.B21])-[.B5]*[.B21]/[.C21]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C21]-[.B21]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="12"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E21]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C22]&lt;=0;0;[.B4]^[.A22]*(2*SQRT([.B22])-[.B5]*[.B22]/[.C22]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C22]-[.B22]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="13"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E22]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C23]&lt;=0;0;[.B4]^[.A23]*(2*SQRT([.B23])-[.B5]*[.B23]/[.C23]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C23]-[.B23]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="14"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E23]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C24]&lt;=0;0;[.B4]^[.A24]*(2*SQRT([.B24])-[.B5]*[.B24]/[.C24]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C24]-[.B24]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="15"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E24]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C25]&lt;=0;0;[.B4]^[.A25]*(2*SQRT([.B25])-[.B5]*[.B25]/[.C25]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C25]-[.B25]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="16"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E25]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C26]&lt;=0;0;[.B4]^[.A26]*(2*SQRT([.B26])-[.B5]*[.B26]/[.C26]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C26]-[.B26]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="17"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E26]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C27]&lt;=0;0;[.B4]^[.A27]*(2*SQRT([.B27])-[.B5]*[.B27]/[.C27]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C27]-[.B27]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="18"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E27]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C28]&lt;=0;0;[.B4]^[.A28]*(2*SQRT([.B28])-[.B5]*[.B28]/[.C28]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C28]-[.B28]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="19"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E28]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C29]&lt;=0;0;[.B4]^[.A29]*(2*SQRT([.B29])-[.B5]*[.B29]/[.C29]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C29]-[.B29]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="20"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E29]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C30]&lt;=0;0;[.B4]^[.A30]*(2*SQRT([.B30])-[.B5]*[.B30]/[.C30]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C30]-[.B30]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="21"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E30]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C31]&lt;=0;0;[.B4]^[.A31]*(2*SQRT([.B31])-[.B5]*[.B31]/[.C31]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C31]-[.B31]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="22"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E31]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C32]&lt;=0;0;[.B4]^[.A32]*(2*SQRT([.B32])-[.B5]*[.B32]/[.C32]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C32]-[.B32]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="23"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E32]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C33]&lt;=0;0;[.B4]^[.A33]*(2*SQRT([.B33])-[.B5]*[.B33]/[.C33]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C33]-[.B33]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="24"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E33]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C34]&lt;=0;0;[.B4]^[.A34]*(2*SQRT([.B34])-[.B5]*[.B34]/[.C34]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C34]-[.B34]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="25"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E34]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C35]&lt;=0;0;[.B4]^[.A35]*(2*SQRT([.B35])-[.B5]*[.B35]/[.C35]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C35]-[.B35]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="26"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E35]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C36]&lt;=0;0;[.B4]^[.A36]*(2*SQRT([.B36])-[.B5]*[.B36]/[.C36]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C36]-[.B36]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="27"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E36]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C37]&lt;=0;0;[.B4]^[.A37]*(2*SQRT([.B37])-[.B5]*[.B37]/[.C37]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C37]-[.B37]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="28"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E37]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C38]&lt;=0;0;[.B4]^[.A38]*(2*SQRT([.B38])-[.B5]*[.B38]/[.C38]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C38]-[.B38]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="29"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E38]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C39]&lt;=0;0;[.B4]^[.A39]*(2*SQRT([.B39])-[.B5]*[.B39]/[.C39]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C39]-[.B39]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="30"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E39]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C40]&lt;=0;0;[.B4]^[.A40]*(2*SQRT([.B40])-[.B5]*[.B40]/[.C40]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C40]-[.B40]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="31"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E40]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C41]&lt;=0;0;[.B4]^[.A41]*(2*SQRT([.B41])-[.B5]*[.B41]/[.C41]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C41]-[.B41]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="32"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E41]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C42]&lt;=0;0;[.B4]^[.A42]*(2*SQRT([.B42])-[.B5]*[.B42]/[.C42]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C42]-[.B42]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="33"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E42]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C43]&lt;=0;0;[.B4]^[.A43]*(2*SQRT([.B43])-[.B5]*[.B43]/[.C43]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C43]-[.B43]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="34"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E43]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C44]&lt;=0;0;[.B4]^[.A44]*(2*SQRT([.B44])-[.B5]*[.B44]/[.C44]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C44]-[.B44]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="35"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E44]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C45]&lt;=0;0;[.B4]^[.A45]*(2*SQRT([.B45])-[.B5]*[.B45]/[.C45]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C45]-[.B45]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="36"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E45]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C46]&lt;=0;0;[.B4]^[.A46]*(2*SQRT([.B46])-[.B5]*[.B46]/[.C46]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C46]-[.B46]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="37"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E46]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C47]&lt;=0;0;[.B4]^[.A47]*(2*SQRT([.B47])-[.B5]*[.B47]/[.C47]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C47]-[.B47]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="38"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E47]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C48]&lt;=0;0;[.B4]^[.A48]*(2*SQRT([.B48])-[.B5]*[.B48]/[.C48]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C48]-[.B48]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="39"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E48]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C49]&lt;=0;0;[.B4]^[.A49]*(2*SQRT([.B49])-[.B5]*[.B49]/[.C49]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C49]-[.B49]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="40"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E49]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C50]&lt;=0;0;[.B4]^[.A50]*(2*SQRT([.B50])-[.B5]*[.B50]/[.C50]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C50]-[.B50]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="41"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E50]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C51]&lt;=0;0;[.B4]^[.A51]*(2*SQRT([.B51])-[.B5]*[.B51]/[.C51]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C51]-[.B51]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="42"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E51]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C52]&lt;=0;0;[.B4]^[.A52]*(2*SQRT([.B52])-[.B5]*[.B52]/[.C52]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C52]-[.B52]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="43"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E52]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C53]&lt;=0;0;[.B4]^[.A53]*(2*SQRT([.B53])-[.B5]*[.B53]/[.C53]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C53]-[.B53]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="44"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E53]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C54]&lt;=0;0;[.B4]^[.A54]*(2*SQRT([.B54])-[.B5]*[.B54]/[.C54]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C54]-[.B54]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="45"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E54]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C55]&lt;=0;0;[.B4]^[.A55]*(2*SQRT([.B55])-[.B5]*[.B55]/[.C55]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C55]-[.B55]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="46"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E55]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C56]&lt;=0;0;[.B4]^[.A56]*(2*SQRT([.B56])-[.B5]*[.B56]/[.C56]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C56]-[.B56]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="47"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E56]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C57]&lt;=0;0;[.B4]^[.A57]*(2*SQRT([.B57])-[.B5]*[.B57]/[.C57]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C57]-[.B57]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="48"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E57]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C58]&lt;=0;0;[.B4]^[.A58]*(2*SQRT([.B58])-[.B5]*[.B58]/[.C58]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C58]-[.B58]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="49"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E58]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C59]&lt;=0;0;[.B4]^[.A59]*(2*SQRT([.B59])-[.B5]*[.B59]/[.C59]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C59]-[.B59]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="50"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E59]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C60]&lt;=0;0;[.B4]^[.A60]*(2*SQRT([.B60])-[.B5]*[.B60]/[.C60]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C60]-[.B60]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="51"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E60]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C61]&lt;=0;0;[.B4]^[.A61]*(2*SQRT([.B61])-[.B5]*[.B61]/[.C61]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C61]-[.B61]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="52"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E61]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C62]&lt;=0;0;[.B4]^[.A62]*(2*SQRT([.B62])-[.B5]*[.B62]/[.C62]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C62]-[.B62]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="53"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E62]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C63]&lt;=0;0;[.B4]^[.A63]*(2*SQRT([.B63])-[.B5]*[.B63]/[.C63]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C63]-[.B63]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="54"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E63]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C64]&lt;=0;0;[.B4]^[.A64]*(2*SQRT([.B64])-[.B5]*[.B64]/[.C64]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C64]-[.B64]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="55"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E64]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C65]&lt;=0;0;[.B4]^[.A65]*(2*SQRT([.B65])-[.B5]*[.B65]/[.C65]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C65]-[.B65]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="56"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E65]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C66]&lt;=0;0;[.B4]^[.A66]*(2*SQRT([.B66])-[.B5]*[.B66]/[.C66]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C66]-[.B66]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="57"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E66]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C67]&lt;=0;0;[.B4]^[.A67]*(2*SQRT([.B67])-[.B5]*[.B67]/[.C67]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C67]-[.B67]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="58"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E67]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C68]&lt;=0;0;[.B4]^[.A68]*(2*SQRT([.B68])-[.B5]*[.B68]/[.C68]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C68]-[.B68]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="59"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E68]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C69]&lt;=0;0;[.B4]^[.A69]*(2*SQRT([.B69])-[.B5]*[.B69]/[.C69]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C69]-[.B69]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="60"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E69]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C70]&lt;=0;0;[.B4]^[.A70]*(2*SQRT([.B70])-[.B5]*[.B70]/[.C70]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C70]-[.B70]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="61"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E70]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C71]&lt;=0;0;[.B4]^[.A71]*(2*SQRT([.B71])-[.B5]*[.B71]/[.C71]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C71]-[.B71]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="62"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E71]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C72]&lt;=0;0;[.B4]^[.A72]*(2*SQRT([.B72])-[.B5]*[.B72]/[.C72]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C72]-[.B72]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="63"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E72]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C73]&lt;=0;0;[.B4]^[.A73]*(2*SQRT([.B73])-[.B5]*[.B73]/[.C73]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C73]-[.B73]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="64"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E73]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C74]&lt;=0;0;[.B4]^[.A74]*(2*SQRT([.B74])-[.B5]*[.B74]/[.C74]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C74]-[.B74]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="65"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E74]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C75]&lt;=0;0;[.B4]^[.A75]*(2*SQRT([.B75])-[.B5]*[.B75]/[.C75]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C75]-[.B75]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="66"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E75]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C76]&lt;=0;0;[.B4]^[.A76]*(2*SQRT([.B76])-[.B5]*[.B76]/[.C76]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C76]-[.B76]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="67"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E76]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C77]&lt;=0;0;[.B4]^[.A77]*(2*SQRT([.B77])-[.B5]*[.B77]/[.C77]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C77]-[.B77]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="68"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E77]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C78]&lt;=0;0;[.B4]^[.A78]*(2*SQRT([.B78])-[.B5]*[.B78]/[.C78]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C78]-[.B78]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="69"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E78]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C79]&lt;=0;0;[.B4]^[.A79]*(2*SQRT([.B79])-[.B5]*[.B79]/[.C79]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C79]-[.B79]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="70"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E79]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C80]&lt;=0;0;[.B4]^[.A80]*(2*SQRT([.B80])-[.B5]*[.B80]/[.C80]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C80]-[.B80]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="71"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E80]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C81]&lt;=0;0;[.B4]^[.A81]*(2*SQRT([.B81])-[.B5]*[.B81]/[.C81]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C81]-[.B81]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="72"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E81]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C82]&lt;=0;0;[.B4]^[.A82]*(2*SQRT([.B82])-[.B5]*[.B82]/[.C82]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C82]-[.B82]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="73"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E82]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C83]&lt;=0;0;[.B4]^[.A83]*(2*SQRT([.B83])-[.B5]*[.B83]/[.C83]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C83]-[.B83]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="74"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E83]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C84]&lt;=0;0;[.B4]^[.A84]*(2*SQRT([.B84])-[.B5]*[.B84]/[.C84]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C84]-[.B84]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="75"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E84]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C85]&lt;=0;0;[.B4]^[.A85]*(2*SQRT([.B85])-[.B5]*[.B85]/[.C85]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C85]-[.B85]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="76"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E85]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C86]&lt;=0;0;[.B4]^[.A86]*(2*SQRT([.B86])-[.B5]*[.B86]/[.C86]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C86]-[.B86]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="77"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E86]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C87]&lt;=0;0;[.B4]^[.A87]*(2*SQRT([.B87])-[.B5]*[.B87]/[.C87]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C87]-[.B87]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="78"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E87]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C88]&lt;=0;0;[.B4]^[.A88]*(2*SQRT([.B88])-[.B5]*[.B88]/[.C88]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C88]-[.B88]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="79"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E88]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C89]&lt;=0;0;[.B4]^[.A89]*(2*SQRT([.B89])-[.B5]*[.B89]/[.C89]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C89]-[.B89]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="80"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E89]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C90]&lt;=0;0;[.B4]^[.A90]*(2*SQRT([.B90])-[.B5]*[.B90]/[.C90]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C90]-[.B90]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="81"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E90]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C91]&lt;=0;0;[.B4]^[.A91]*(2*SQRT([.B91])-[.B5]*[.B91]/[.C91]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C91]-[.B91]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="82"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E91]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C92]&lt;=0;0;[.B4]^[.A92]*(2*SQRT([.B92])-[.B5]*[.B92]/[.C92]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C92]-[.B92]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="83"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E92]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C93]&lt;=0;0;[.B4]^[.A93]*(2*SQRT([.B93])-[.B5]*[.B93]/[.C93]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C93]-[.B93]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="84"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E93]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C94]&lt;=0;0;[.B4]^[.A94]*(2*SQRT([.B94])-[.B5]*[.B94]/[.C94]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C94]-[.B94]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="85"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E94]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C95]&lt;=0;0;[.B4]^[.A95]*(2*SQRT([.B95])-[.B5]*[.B95]/[.C95]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C95]-[.B95]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="86"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E95]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C96]&lt;=0;0;[.B4]^[.A96]*(2*SQRT([.B96])-[.B5]*[.B96]/[.C96]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C96]-[.B96]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="87"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E96]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C97]&lt;=0;0;[.B4]^[.A97]*(2*SQRT([.B97])-[.B5]*[.B97]/[.C97]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C97]-[.B97]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="88"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E97]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C98]&lt;=0;0;[.B4]^[.A98]*(2*SQRT([.B98])-[.B5]*[.B98]/[.C98]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C98]-[.B98]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="89"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E98]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C99]&lt;=0;0;[.B4]^[.A99]*(2*SQRT([.B99])-[.B5]*[.B99]/[.C99]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C99]-[.B99]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="90"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E99]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C100]&lt;=0;0;[.B4]^[.A100]*(2*SQRT([.B100])-[.B5]*[.B100]/[.C100]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C100]-[.B100]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="91"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E100]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C101]&lt;=0;0;[.B4]^[.A101]*(2*SQRT([.B101])-[.B5]*[.B101]/[.C101]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C101]-[.B101]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="92"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E101]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C102]&lt;=0;0;[.B4]^[.A102]*(2*SQRT([.B102])-[.B5]*[.B102]/[.C102]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C102]-[.B102]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="93"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E102]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C103]&lt;=0;0;[.B4]^[.A103]*(2*SQRT([.B103])-[.B5]*[.B103]/[.C103]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C103]-[.B103]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="94"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E103]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C104]&lt;=0;0;[.B4]^[.A104]*(2*SQRT([.B104])-[.B5]*[.B104]/[.C104]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C104]-[.B104]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="95"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E104]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C105]&lt;=0;0;[.B4]^[.A105]*(2*SQRT([.B105])-[.B5]*[.B105]/[.C105]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C105]-[.B105]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="96"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E105]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C106]&lt;=0;0;[.B4]^[.A106]*(2*SQRT([.B106])-[.B5]*[.B106]/[.C106]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C106]-[.B106]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="97"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E106]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C107]&lt;=0;0;[.B4]^[.A107]*(2*SQRT([.B107])-[.B5]*[.B107]/[.C107]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C107]-[.B107]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="98"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E107]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C108]&lt;=0;0;[.B4]^[.A108]*(2*SQRT([.B108])-[.B5]*[.B108]/[.C108]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C108]-[.B108]" office:value-type="float" office:value="0"/></table:table-row>
<table:table-row><table:table-cell office:value-type="float" office:value="99"/><table:table-cell office:value-type="float" office:value="0.5"/><table:table-cell table:formula="of:=[.E108]" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=IF([.C109]&lt;=0;0;[.B4]^[.A109]*(2*SQRT([.B109])-[.B5]*[.B109]/[.C109]))" office:value-type="float" office:value="0"/><table:table-cell table:formula="of:=[.C109]-[.B109]" office:value-type="float" office:value="0"/></table:table-row>
</table:table>
</office:spreadsheet>
</office:body>
</office:document>
+69
View File
@@ -16,7 +16,10 @@
#include <com/sun/star/sheet/XSpreadsheet.hpp>
#include <com/sun/star/container/XIndexAccess.hpp>
#include <com/sun/star/table/XCell.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <test/bootstrapfixture.hxx>
#include <vector>
using namespace css;
@@ -31,6 +34,7 @@ class LpSolverTest: public test::BootstrapFixture
void testSLPSolver();
void testSLPSolverNonlinear();
void testSLPSolverNonlinearConstraint();
void testSLPSolverLargeModel();
#endif
#ifdef ENABLE_COINMP
@@ -47,6 +51,7 @@ public:
CPPUNIT_TEST(testSLPSolver);
CPPUNIT_TEST(testSLPSolverNonlinear);
CPPUNIT_TEST(testSLPSolverNonlinearConstraint);
CPPUNIT_TEST(testSLPSolverLargeModel);
#endif
CPPUNIT_TEST_SUITE_END();
};
@@ -170,6 +175,70 @@ void LpSolverTest::testSLPSolverNonlinearConstraint()
}
#endif
#ifdef ENABLE_COINMP
// A large model (100-period resource depletion) that the swarm solver cannot
// handle at all. This guards that the sequential linear solver loads it, stays
// feasible, and improves the objective. Full convergence needs faster sampling
// than is in place today, so the time limit is short and only progress is
// checked.
void LpSolverTest::testSLPSolverLargeModel()
{
OUString aUrl
= m_directories.getURLFromSrc(u"/sc/qa/unit/data/solver/ResourceDepletion.fods"_ustr);
uno::Reference<frame::XDesktop2> xLoader = frame::Desktop::create(m_xContext);
uno::Reference<lang::XComponent> xComponent(xLoader->loadComponentFromURL(
aUrl, u"_blank"_ustr, 0, uno::Sequence<css::beans::PropertyValue>()));
uno::Reference<sheet::XSpreadsheetDocument> xDocument(xComponent, uno::UNO_QUERY_THROW);
uno::Reference<container::XIndexAccess> xSheets(xDocument->getSheets(), uno::UNO_QUERY_THROW);
uno::Reference<sheet::XSpreadsheet> xSheet(xSheets->getByIndex(0), uno::UNO_QUERY_THROW);
const table::CellAddress aObjective(0, 1, 6); // B7
// objective value at the document's starting extraction path
double fInitialObjective = xSheet->getCellByPosition(1, 6)->getValue();
std::vector<table::CellAddress> aVariableList;
std::vector<sheet::SolverConstraint> aConstraintList;
for (sal_Int32 nRow = 9; nRow < 109; ++nRow) // rows 10..109
{
aVariableList.push_back(table::CellAddress(0, 1, nRow)); // B: extraction
aConstraintList.push_back({ table::CellAddress(0, 1, nRow),
sheet::SolverConstraintOperator_GREATER_EQUAL, uno::Any(0.0) });
// E: stock remaining after this period must not go negative
aConstraintList.push_back({ table::CellAddress(0, 4, nRow),
sheet::SolverConstraintOperator_GREATER_EQUAL, uno::Any(0.0) });
}
uno::Sequence<table::CellAddress> aVariables(aVariableList.data(), aVariableList.size());
uno::Sequence<sheet::SolverConstraint> aConstraints(aConstraintList.data(),
aConstraintList.size());
uno::Reference<sheet::XSolver> xSolver(
m_xContext->getServiceManager()->createInstanceWithContext(
u"com.sun.star.comp.Calc.SLPSolver"_ustr, m_xContext),
uno::UNO_QUERY_THROW);
uno::Reference<beans::XPropertySet> xProperties(xSolver, uno::UNO_QUERY_THROW);
xProperties->setPropertyValue(u"Timeout"_ustr, uno::Any(sal_Int32(10)));
xSolver->setDocument(xDocument);
xSolver->setObjective(aObjective);
xSolver->setVariables(aVariables);
xSolver->setConstraints(aConstraints);
xSolver->setMaximize(true);
xSolver->solve();
CPPUNIT_ASSERT(xSolver->getSuccess());
uno::Sequence<double> aSolution = xSolver->getSolution();
CPPUNIT_ASSERT_EQUAL(aVariables.getLength(), aSolution.getLength());
for (sal_Int32 i = 0; i < aSolution.getLength(); ++i)
xSheet->getCellByPosition(1, 9 + i)->setValue(aSolution[i]);
double fObjective = xSheet->getCellByPosition(1, 6)->getValue();
CPPUNIT_ASSERT_MESSAGE("the solver must improve the objective on the large model",
fObjective > fInitialObjective);
xComponent->dispose();
}
#endif
#ifdef ENABLE_COINMP
void LpSolverTest::testSolver(OUString const & rName)
{
+3 -1
View File
@@ -365,7 +365,9 @@ void SAL_CALL SLPSolver::solve()
constexpr double fStepTolerance = 1.0e-7;
constexpr double fMinPredictedReduction = 1.0e-12;
constexpr double fDefaultTimeout = 100.0;
constexpr sal_Int32 nMaxIterations = 200;
// High safety limit only. The time budget and the convergence test below
// are what normally end the loop, so a large model is not cut off early.
constexpr sal_Int32 nMaxIterations = 100000;
double fTrust = fInitialTrust;
double fMerit = meritAt(aX, fPenalty);