<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ascend4.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WikiSysop</id>
	<title>ASCEND - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ascend4.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WikiSysop"/>
	<link rel="alternate" type="text/html" href="https://ascend4.org/Special:Contributions/WikiSysop"/>
	<updated>2026-04-28T21:46:05Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://ascend4.org/index.php?title=Category:Outdated&amp;diff=405</id>
		<title>Category:Outdated</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Category:Outdated&amp;diff=405"/>
		<updated>2010-05-17T03:08:33Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Replaced content with &amp;#039;Articles in need of an update...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Articles in need of an update...&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Notes_Ubuntu_7.10_Install&amp;diff=404</id>
		<title>Notes Ubuntu 7.10 Install</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Notes_Ubuntu_7.10_Install&amp;diff=404"/>
		<updated>2010-05-17T03:08:11Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Installing_LyX&amp;diff=403</id>
		<title>Installing LyX</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Installing_LyX&amp;diff=403"/>
		<updated>2010-05-17T03:07:51Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Debugging_ASCEND&amp;diff=402</id>
		<title>Debugging ASCEND</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Debugging_ASCEND&amp;diff=402"/>
		<updated>2010-05-17T03:07:33Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Building_a_Debian_package&amp;diff=401</id>
		<title>Building a Debian package</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Building_a_Debian_package&amp;diff=401"/>
		<updated>2010-05-17T03:07:13Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
&lt;br /&gt;
See [[dtar]].&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Building_a_Debian_package&amp;diff=400</id>
		<title>Building a Debian package</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Building_a_Debian_package&amp;diff=400"/>
		<updated>2010-05-17T03:07:04Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
See [[dtar]].&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=ASCEND_capabilities&amp;diff=399</id>
		<title>ASCEND capabilities</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=ASCEND_capabilities&amp;diff=399"/>
		<updated>2010-05-17T03:06:38Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=TclTk_Quick_Guide&amp;diff=398</id>
		<title>TclTk Quick Guide</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=TclTk_Quick_Guide&amp;diff=398"/>
		<updated>2010-05-17T03:06:16Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} {{outdated}} Category:Tutorials&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Template:Outdated&amp;diff=397</id>
		<title>Template:Outdated</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Template:Outdated&amp;diff=397"/>
		<updated>2010-05-17T03:05:47Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;&amp;#039;&amp;#039;This page contains content that has been observed to be out-of-date. You can help to update the content, or search for a page containing newer information.&amp;#039;&amp;#039; [[Category:Outdate…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;This page contains content that has been observed to be out-of-date. You can help to update the content, or search for a page containing newer information.&#039;&#039;&lt;br /&gt;
[[Category:Outdated]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Notes_Ubuntu_7.04_Install&amp;diff=396</id>
		<title>Notes Ubuntu 7.04 Install</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Notes_Ubuntu_7.04_Install&amp;diff=396"/>
		<updated>2010-05-17T03:04:54Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} {{outdated}} Category:Development&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=New_Compiler&amp;diff=395</id>
		<title>New Compiler</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=New_Compiler&amp;diff=395"/>
		<updated>2010-05-17T03:04:29Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} {{outdated}} Category:Development&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{outdated}}&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Category:ASCEND_Contributors&amp;diff=394</id>
		<title>Category:ASCEND Contributors</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Category:ASCEND_Contributors&amp;diff=394"/>
		<updated>2010-05-17T03:03:49Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Please contact us if you are missing from this list and would like to be added!&#039;&#039;&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Non-proprietary_Optimisation&amp;diff=393</id>
		<title>Non-proprietary Optimisation</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Non-proprietary_Optimisation&amp;diff=393"/>
		<updated>2010-05-17T03:02:56Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Development&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=392</id>
		<title>Survey of optimisation software</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=392"/>
		<updated>2010-05-17T03:02:35Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* List of Lists */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a survey of optimisation software that was performed as a part of our effort to identify options for a [[Non-proprietary Optimisation]] solver for ASCEND. Feel free to add any that we&#039;ve missed.&lt;br /&gt;
&lt;br /&gt;
== List of Lists ==&lt;br /&gt;
&lt;br /&gt;
* List of NLP solvers: http://www.ici.ro/camo/hnp.htm&lt;br /&gt;
* List of unconstrained optimisation solvers: http://www.ici.ro/camo/huo.htm&lt;br /&gt;
* There &#039;&#039;was&#039;&#039; a nice list at http://www.scicomp.uni-erlangen.de/SW/opt.html but the link seems to be broken at the moment.&lt;br /&gt;
* &#039;Decision tree&#039; for optimization software http://plato.asu.edu/sub/nlores.html&lt;br /&gt;
* Description of different types of optimisation problems: http://coool.mines.edu/report/node3.html&lt;br /&gt;
&lt;br /&gt;
== Free Open Source Software options ==&lt;br /&gt;
&lt;br /&gt;
* [https://projects.coin-or.org/Ipopt IPOPT] (LGPL) &#039;Interior-Point Filter Line-Search Algorithm&#039;. Possibly some problems with scaling of variables (according to RPS). can use a number of free and non-free matrix solvers; the free matrix solver in version 3.3.1 is MUMPS. See also [[IPOPT]] in this wiki.&lt;br /&gt;
* [http://trilinos.sandia.gov/packages/moocho/ MOOCHO] (GPL?) reduced sequential quadratic programming (SQP); allows the user to supply their own linear solver.&lt;br /&gt;
* [http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Minimization.html GSL &#039;multimin&#039;] (GPL) several multidimensional dense-matrix unconstrained optimisation methods including conjugate gradient methods, quasi-newton methods, steepest descent and Nelder-Mead simplex method.&lt;br /&gt;
* [http://acts.nersc.gov/opt++/index.html OPT++] (free, includes &#039;&#039;optional&#039;&#039; wrapping of non-free NPSOL). Good but dense matrices only (RPS). Superceded by MOOCHO?&lt;br /&gt;
* [http://software.sandia.gov/appspack/version5.0/index.html APPSPACK] (GPL?) &#039;asynchronous parallel generating set search&#039;, derivative-free.&lt;br /&gt;
* [http://www.eng.buffalo.edu/Research/MODEL/mdo.test.orig/CONMIN/ CONMIN] (&#039;free&#039; but where from?) &#039;two-step limited memory quasi Newton like Conjugate Gradient method with Beale restarts&#039;.&lt;br /&gt;
* [http://www.cs.sandia.gov/SGOPT/ SGOPT] (LGPL) Evolutionary and pattern-search algorithms&lt;br /&gt;
* [http://www.math.ufl.edu/~hager/ OPTPACK] (PD) &#039;a dual algorithm for constrained optimization&#039;&lt;br /&gt;
* [http://www.netlib.org/minpack/ MINPACK] (BSD-like) unconstrained&lt;br /&gt;
* [http://www.coin-or.org/Bonmin/ BonMin] (CPL) Part of the COIN-OR suite; a solver for convect MINLP problems.&lt;br /&gt;
* [https://projects.coin-or.org/Couenne Couenne] (CPL) Part of the COIN-OR suite; a solver for non-convex MINLP problems.&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ ALGENCAN] (GPL) Augmented Lagrangian plus an embedded smooth function box-constraint solver called &#039;GENCAN&#039;&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ SPG] (GPL) for smooth function with convex constraint&lt;br /&gt;
* [http://www.gerad.ca/~couturgi/NOMAD/ NOMAD] (GPL) Generalized Pattern Search (GPS) algorithms to solve nonlinear optimization problems&lt;br /&gt;
* [http://www-fp.mcs.anl.gov/otc/Tools/LBFGS-B/ LBFGS-B] (PD?) limited-memory quasi-Newton code&lt;br /&gt;
* [http://ab-initio.mit.edu/wiki/index.php/NLopt NLopt] (LGPL) wrapper for a few other FOSS codes, but also reportedly has some new implementations of certain algorithms&lt;br /&gt;
* [http://www.uni-graz.at/imawww/kuntsevich/solvopt/ SolvOpt] (PD) &#039;method of exact penalisation&#039;, based on N.Z. Shor r-algorithm&lt;br /&gt;
* [http://openopt.org/ralg ralg] (BSD) - an implementation of N.Z. Shor r-algorithm; nonlinear/nonsmooth constrained/unconstrained problems&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wrappers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.coin-or.org/NLPAPI/index.html NLPAPI] (GPL?) a generalised wrapper for NLP solvers, including support for LANCELOT.&lt;br /&gt;
* [https://projects.coin-or.org/GAMSlinks/ GAMSlinks] (GPL?) a wrapper for [https://projects.coin-or.org/ COIN-OR] solvers that allows them to be called from GAMS. This is interesting as it shows how we could implement set up ASCEND so that it can use GAMS solvers, which adapting FOSS solvers that run under GAMS much easier to adapt for use with ASCEND.&lt;br /&gt;
* [http://www.netlib.org/ampl/solvers/lancelot/ AMPL/LANCELOT] a wrapper for running LANCELOT from AMPL. Again, this provides a way for seeing how solvers that have been adapted for use in AMPL might be also be connected to from ASCEND.&lt;br /&gt;
* [http://cuter.rl.ac.uk/cuter-www/interfaces.html CUTEr] (GPL-like license) is a wrapper for a wide range of optimisation solvers, and also a testing framework.&lt;br /&gt;
* [https://projects.coin-or.org/Osi OSI] (CPL?) wrapper for quite a wide range of LP solvers, from COIN-OR.&lt;br /&gt;
* [https://projects.coin-or.org/OS OS] (CPL?) Optimisation Services, a number of interface languages and APIs for communicating between problem &#039;servers&#039; and solver &#039;clients&#039;, with support for a range of COIN-OR solvers and converters for GAMS/AMPL input files.&lt;br /&gt;
* [http://wiki.services.openoffice.org/wiki/Optimization_Solver OpenOffice.org&#039;s Solver]&lt;br /&gt;
* [http://openopt.org OpenOpt] (BSD) a general purpose optimization framework written in Python and NumPy, capable of automatic differentiation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unknown:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://coool.mines.edu/ COOOL]&lt;br /&gt;
&lt;br /&gt;
Another free list: [http://software.sandia.gov/Acro/html/Main/AcroPackages.html]&lt;br /&gt;
&lt;br /&gt;
There are some more listed in the [ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq nonlinear-programming-faq].&lt;br /&gt;
&lt;br /&gt;
== Free for non-commercial use ==&lt;br /&gt;
&lt;br /&gt;
Trust region&lt;br /&gt;
&lt;br /&gt;
* [http://www.numerical.rl.ac.uk/lancelot/blurb.html LANCELOT] (no redistribution or resale) Trust region method, adapt for bound constraints&lt;br /&gt;
&lt;br /&gt;
Active set&lt;br /&gt;
&lt;br /&gt;
* [http://www-unix.mcs.anl.gov/~more/tron/ TRON] (permission to copy and modify, but only to be used for &#039;internal research&#039; ([http://plato.asu.edu/ftp/other_software/tron_f90.tar.gz download]) active set method that uses a combination of gradient projections and a preconditioned conjugate gradient method to minimize an objective function. TRON only provides for &#039;box&#039; constraints and has no support for equality constraints, although it may be possible to add support for that by wrapping TRON around an NLA solver?&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming&lt;br /&gt;
&lt;br /&gt;
* [http://plato.la.asu.edu/donlp2.html DONLP2] (dense; free for non-commercial purposes)&lt;br /&gt;
&lt;br /&gt;
== Some proprietary alternatives ==&lt;br /&gt;
&lt;br /&gt;
Generalised reduced gradient method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.conopt.com/ CONOPT] (plus others in certain cases)&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_minos.htm MINOS] (uses GRG for linear constraints, else &#039;sparse SLC algorithm (a projected Lagrangian method, related to Robinson&#039;s method)&#039; for nonlinear constraints. Used when gradient evaluation is cheap.&lt;br /&gt;
* MS Excel [http://support.microsoft.com/kb/q214115/ Solver].&lt;br /&gt;
* GRG2&lt;br /&gt;
* LSGRG2&lt;br /&gt;
* [http://www.pinterconsulting.com/ LGO] &#039;Lipschitz Global Optimizer&#039;&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_products_snopt_desc.htm SNOPT] (sparse) Used when gradient evaluation is expensive. &#039;SNOPT employs a sparse SQP algorithm with limited-memory quasi-Newton approximations to the Hessian of Lagrangian. An augmented Lagrangian merit function promotes convergence from an arbitrary point.&#039;&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~kschittkowski/nlpqlp22.htm NLPQLP]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_npsol.htm NPSOL]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_lssol105description.htm LSSOL] (dense, &#039;two-phase (primal) quadratic programming&#039;)&lt;br /&gt;
* [http://www.princeton.edu/~rvdb/ LOQO] (free 30-day trial) &#039;LOQO is based on an infeasible, primal-dual, interior-point method applied to a sequence of quadratic approximations to the given problem&#039;&lt;br /&gt;
* [http://www.mcs.anl.gov/~leyffer/solvers.html FilterSQP]&lt;br /&gt;
&lt;br /&gt;
Active set method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_qpopt.htm QPOPT] (dense)&lt;br /&gt;
&lt;br /&gt;
Other methods:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ziena.com/knitro.htm KNITRO] (three methods: interior point direct, interior point conjugate gradient, &#039;active set&#039;)&lt;br /&gt;
* [http://www.gams.com/dd/docs/solvers/pathnlp.pdf PATHNLP]. &#039;PATHNLP solves an NLP by internally constructing the Karush-Kuhn-Tucker (KKT) system of first-order optimality conditions associated with the NLP and solving this system using the PATH solver for complementarity problems&#039;. Supposedly good for convex problems.&lt;br /&gt;
* [http://www.mosek.com/products.html MOSEK] (limited version available for download, or free student license) Interior point method plus simplex method.&lt;br /&gt;
* [http://www2.am.uni-erlangen.de/~kocvara/pennon/ PENNON] &#039;penalty method&#039;, &#039;PBM method of Ben-Tal and Zibulevsky&#039;&lt;br /&gt;
&lt;br /&gt;
Global optimisation&lt;br /&gt;
&lt;br /&gt;
* [http://www.andrew.cmu.edu/user/ns1b/baron/baron.html BARON]&lt;br /&gt;
* [http://www.ganso.com.au/index.php GANSO]&lt;br /&gt;
&lt;br /&gt;
Methods not yet checked:&lt;br /&gt;
&lt;br /&gt;
* IMSL and NAG software libraries&lt;br /&gt;
&#039;&#039;More to come&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mixed integer/nonlinear programs:&lt;br /&gt;
&lt;br /&gt;
* [http://www.gams.com/solvers/solvers.htm#DICOPT DICOPT]: MINLP&lt;br /&gt;
&lt;br /&gt;
See also [[Survey of sparse matrix software]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Miscellany]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=391</id>
		<title>Survey of optimisation software</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=391"/>
		<updated>2010-05-17T03:02:07Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Free Open Source Software options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a survey of optimisation software that was performed as a part of our effort to identify options for a [[Non-proprietary Optimisation]] solver for ASCEND. Feel free to add any that we&#039;ve missed.&lt;br /&gt;
&lt;br /&gt;
== List of Lists ==&lt;br /&gt;
&lt;br /&gt;
* List of NLP solvers: [http://www.ici.ro/camo/hnp.htm]&lt;br /&gt;
* List of unconstrained optimisation solvers: [http://www.ici.ro/camo/huo.htm]&lt;br /&gt;
* There &#039;&#039;was&#039;&#039; a nice list at [http://www.scicomp.uni-erlangen.de/SW/opt.html] but the link seems to be broken at the moment.&lt;br /&gt;
* &#039;Decision tree&#039; for optimization software [http://plato.asu.edu/sub/nlores.html]&lt;br /&gt;
* Description of different types of optimisation problems: [http://coool.mines.edu/report/node3.html]&lt;br /&gt;
&lt;br /&gt;
== Free Open Source Software options ==&lt;br /&gt;
&lt;br /&gt;
* [https://projects.coin-or.org/Ipopt IPOPT] (LGPL) &#039;Interior-Point Filter Line-Search Algorithm&#039;. Possibly some problems with scaling of variables (according to RPS). can use a number of free and non-free matrix solvers; the free matrix solver in version 3.3.1 is MUMPS. See also [[IPOPT]] in this wiki.&lt;br /&gt;
* [http://trilinos.sandia.gov/packages/moocho/ MOOCHO] (GPL?) reduced sequential quadratic programming (SQP); allows the user to supply their own linear solver.&lt;br /&gt;
* [http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Minimization.html GSL &#039;multimin&#039;] (GPL) several multidimensional dense-matrix unconstrained optimisation methods including conjugate gradient methods, quasi-newton methods, steepest descent and Nelder-Mead simplex method.&lt;br /&gt;
* [http://acts.nersc.gov/opt++/index.html OPT++] (free, includes &#039;&#039;optional&#039;&#039; wrapping of non-free NPSOL). Good but dense matrices only (RPS). Superceded by MOOCHO?&lt;br /&gt;
* [http://software.sandia.gov/appspack/version5.0/index.html APPSPACK] (GPL?) &#039;asynchronous parallel generating set search&#039;, derivative-free.&lt;br /&gt;
* [http://www.eng.buffalo.edu/Research/MODEL/mdo.test.orig/CONMIN/ CONMIN] (&#039;free&#039; but where from?) &#039;two-step limited memory quasi Newton like Conjugate Gradient method with Beale restarts&#039;.&lt;br /&gt;
* [http://www.cs.sandia.gov/SGOPT/ SGOPT] (LGPL) Evolutionary and pattern-search algorithms&lt;br /&gt;
* [http://www.math.ufl.edu/~hager/ OPTPACK] (PD) &#039;a dual algorithm for constrained optimization&#039;&lt;br /&gt;
* [http://www.netlib.org/minpack/ MINPACK] (BSD-like) unconstrained&lt;br /&gt;
* [http://www.coin-or.org/Bonmin/ BonMin] (CPL) Part of the COIN-OR suite; a solver for convect MINLP problems.&lt;br /&gt;
* [https://projects.coin-or.org/Couenne Couenne] (CPL) Part of the COIN-OR suite; a solver for non-convex MINLP problems.&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ ALGENCAN] (GPL) Augmented Lagrangian plus an embedded smooth function box-constraint solver called &#039;GENCAN&#039;&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ SPG] (GPL) for smooth function with convex constraint&lt;br /&gt;
* [http://www.gerad.ca/~couturgi/NOMAD/ NOMAD] (GPL) Generalized Pattern Search (GPS) algorithms to solve nonlinear optimization problems&lt;br /&gt;
* [http://www-fp.mcs.anl.gov/otc/Tools/LBFGS-B/ LBFGS-B] (PD?) limited-memory quasi-Newton code&lt;br /&gt;
* [http://ab-initio.mit.edu/wiki/index.php/NLopt NLopt] (LGPL) wrapper for a few other FOSS codes, but also reportedly has some new implementations of certain algorithms&lt;br /&gt;
* [http://www.uni-graz.at/imawww/kuntsevich/solvopt/ SolvOpt] (PD) &#039;method of exact penalisation&#039;, based on N.Z. Shor r-algorithm&lt;br /&gt;
* [http://openopt.org/ralg ralg] (BSD) - an implementation of N.Z. Shor r-algorithm; nonlinear/nonsmooth constrained/unconstrained problems&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wrappers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.coin-or.org/NLPAPI/index.html NLPAPI] (GPL?) a generalised wrapper for NLP solvers, including support for LANCELOT.&lt;br /&gt;
* [https://projects.coin-or.org/GAMSlinks/ GAMSlinks] (GPL?) a wrapper for [https://projects.coin-or.org/ COIN-OR] solvers that allows them to be called from GAMS. This is interesting as it shows how we could implement set up ASCEND so that it can use GAMS solvers, which adapting FOSS solvers that run under GAMS much easier to adapt for use with ASCEND.&lt;br /&gt;
* [http://www.netlib.org/ampl/solvers/lancelot/ AMPL/LANCELOT] a wrapper for running LANCELOT from AMPL. Again, this provides a way for seeing how solvers that have been adapted for use in AMPL might be also be connected to from ASCEND.&lt;br /&gt;
* [http://cuter.rl.ac.uk/cuter-www/interfaces.html CUTEr] (GPL-like license) is a wrapper for a wide range of optimisation solvers, and also a testing framework.&lt;br /&gt;
* [https://projects.coin-or.org/Osi OSI] (CPL?) wrapper for quite a wide range of LP solvers, from COIN-OR.&lt;br /&gt;
* [https://projects.coin-or.org/OS OS] (CPL?) Optimisation Services, a number of interface languages and APIs for communicating between problem &#039;servers&#039; and solver &#039;clients&#039;, with support for a range of COIN-OR solvers and converters for GAMS/AMPL input files.&lt;br /&gt;
* [http://wiki.services.openoffice.org/wiki/Optimization_Solver OpenOffice.org&#039;s Solver]&lt;br /&gt;
* [http://openopt.org OpenOpt] (BSD) a general purpose optimization framework written in Python and NumPy, capable of automatic differentiation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unknown:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://coool.mines.edu/ COOOL]&lt;br /&gt;
&lt;br /&gt;
Another free list: [http://software.sandia.gov/Acro/html/Main/AcroPackages.html]&lt;br /&gt;
&lt;br /&gt;
There are some more listed in the [ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq nonlinear-programming-faq].&lt;br /&gt;
&lt;br /&gt;
== Free for non-commercial use ==&lt;br /&gt;
&lt;br /&gt;
Trust region&lt;br /&gt;
&lt;br /&gt;
* [http://www.numerical.rl.ac.uk/lancelot/blurb.html LANCELOT] (no redistribution or resale) Trust region method, adapt for bound constraints&lt;br /&gt;
&lt;br /&gt;
Active set&lt;br /&gt;
&lt;br /&gt;
* [http://www-unix.mcs.anl.gov/~more/tron/ TRON] (permission to copy and modify, but only to be used for &#039;internal research&#039; ([http://plato.asu.edu/ftp/other_software/tron_f90.tar.gz download]) active set method that uses a combination of gradient projections and a preconditioned conjugate gradient method to minimize an objective function. TRON only provides for &#039;box&#039; constraints and has no support for equality constraints, although it may be possible to add support for that by wrapping TRON around an NLA solver?&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming&lt;br /&gt;
&lt;br /&gt;
* [http://plato.la.asu.edu/donlp2.html DONLP2] (dense; free for non-commercial purposes)&lt;br /&gt;
&lt;br /&gt;
== Some proprietary alternatives ==&lt;br /&gt;
&lt;br /&gt;
Generalised reduced gradient method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.conopt.com/ CONOPT] (plus others in certain cases)&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_minos.htm MINOS] (uses GRG for linear constraints, else &#039;sparse SLC algorithm (a projected Lagrangian method, related to Robinson&#039;s method)&#039; for nonlinear constraints. Used when gradient evaluation is cheap.&lt;br /&gt;
* MS Excel [http://support.microsoft.com/kb/q214115/ Solver].&lt;br /&gt;
* GRG2&lt;br /&gt;
* LSGRG2&lt;br /&gt;
* [http://www.pinterconsulting.com/ LGO] &#039;Lipschitz Global Optimizer&#039;&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_products_snopt_desc.htm SNOPT] (sparse) Used when gradient evaluation is expensive. &#039;SNOPT employs a sparse SQP algorithm with limited-memory quasi-Newton approximations to the Hessian of Lagrangian. An augmented Lagrangian merit function promotes convergence from an arbitrary point.&#039;&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~kschittkowski/nlpqlp22.htm NLPQLP]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_npsol.htm NPSOL]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_lssol105description.htm LSSOL] (dense, &#039;two-phase (primal) quadratic programming&#039;)&lt;br /&gt;
* [http://www.princeton.edu/~rvdb/ LOQO] (free 30-day trial) &#039;LOQO is based on an infeasible, primal-dual, interior-point method applied to a sequence of quadratic approximations to the given problem&#039;&lt;br /&gt;
* [http://www.mcs.anl.gov/~leyffer/solvers.html FilterSQP]&lt;br /&gt;
&lt;br /&gt;
Active set method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_qpopt.htm QPOPT] (dense)&lt;br /&gt;
&lt;br /&gt;
Other methods:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ziena.com/knitro.htm KNITRO] (three methods: interior point direct, interior point conjugate gradient, &#039;active set&#039;)&lt;br /&gt;
* [http://www.gams.com/dd/docs/solvers/pathnlp.pdf PATHNLP]. &#039;PATHNLP solves an NLP by internally constructing the Karush-Kuhn-Tucker (KKT) system of first-order optimality conditions associated with the NLP and solving this system using the PATH solver for complementarity problems&#039;. Supposedly good for convex problems.&lt;br /&gt;
* [http://www.mosek.com/products.html MOSEK] (limited version available for download, or free student license) Interior point method plus simplex method.&lt;br /&gt;
* [http://www2.am.uni-erlangen.de/~kocvara/pennon/ PENNON] &#039;penalty method&#039;, &#039;PBM method of Ben-Tal and Zibulevsky&#039;&lt;br /&gt;
&lt;br /&gt;
Global optimisation&lt;br /&gt;
&lt;br /&gt;
* [http://www.andrew.cmu.edu/user/ns1b/baron/baron.html BARON]&lt;br /&gt;
* [http://www.ganso.com.au/index.php GANSO]&lt;br /&gt;
&lt;br /&gt;
Methods not yet checked:&lt;br /&gt;
&lt;br /&gt;
* IMSL and NAG software libraries&lt;br /&gt;
&#039;&#039;More to come&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mixed integer/nonlinear programs:&lt;br /&gt;
&lt;br /&gt;
* [http://www.gams.com/solvers/solvers.htm#DICOPT DICOPT]: MINLP&lt;br /&gt;
&lt;br /&gt;
See also [[Survey of sparse matrix software]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Miscellany]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=390</id>
		<title>Survey of optimisation software</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=390"/>
		<updated>2010-05-17T03:01:34Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Free Open Source Software options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a survey of optimisation software that was performed as a part of our effort to identify options for a [[Non-proprietary Optimisation]] solver for ASCEND. Feel free to add any that we&#039;ve missed.&lt;br /&gt;
&lt;br /&gt;
== List of Lists ==&lt;br /&gt;
&lt;br /&gt;
* List of NLP solvers: [http://www.ici.ro/camo/hnp.htm]&lt;br /&gt;
* List of unconstrained optimisation solvers: [http://www.ici.ro/camo/huo.htm]&lt;br /&gt;
* There &#039;&#039;was&#039;&#039; a nice list at [http://www.scicomp.uni-erlangen.de/SW/opt.html] but the link seems to be broken at the moment.&lt;br /&gt;
* &#039;Decision tree&#039; for optimization software [http://plato.asu.edu/sub/nlores.html]&lt;br /&gt;
* Description of different types of optimisation problems: [http://coool.mines.edu/report/node3.html]&lt;br /&gt;
&lt;br /&gt;
== Free Open Source Software options ==&lt;br /&gt;
&lt;br /&gt;
* [https://projects.coin-or.org/Ipopt IPOPT] (LGPL) &#039;Interior-Point Filter Line-Search Algorithm&#039;. Possibly some problems with scaling of variables (according to RPS). can use a number of free and non-free matrix solvers; the free matrix solver in version 3.3.1 is MUMPS. See also [[IPOPT]] in this wiki.&lt;br /&gt;
* [http://trilinos.sandia.gov/packages/moocho/ MOOCHO] (GPL?) reduced sequential quadratic programming (SQP); allows the user to supply their own linear solver.&lt;br /&gt;
* [http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Minimization.html GSL &#039;multimin&#039;] (GPL) several multidimensional dense-matrix unconstrained optimisation methods including conjugate gradient methods, quasi-newton methods, steepest descent and Nelder-Mead simplex method.&lt;br /&gt;
* [http://acts.nersc.gov/opt++/index.html OPT++] (free, includes &#039;&#039;optional&#039;&#039; wrapping of non-free NPSOL). Good but dense matrices only (RPS). Superceded by MOOCHO?&lt;br /&gt;
* [http://software.sandia.gov/appspack/version5.0/index.html APPSPACK] (GPL?) &#039;asynchronous parallel generating set search&#039;, derivative-free.&lt;br /&gt;
* [http://www.eng.buffalo.edu/Research/MODEL/mdo.test.orig/CONMIN/ CONMIN] (&#039;free&#039; but where from?) &#039;two-step limited memory quasi Newton like Conjugate Gradient method with Beale restarts&#039;.&lt;br /&gt;
* [http://www.cs.sandia.gov/SGOPT/ SGOPT] (LGPL) Evolutionary and pattern-search algorithms&lt;br /&gt;
* [http://www.math.ufl.edu/~hager/ OPTPACK] (PD) &#039;a dual algorithm for constrained optimization&#039;&lt;br /&gt;
* [http://www.netlib.org/minpack/ MINPACK] (BSD-like) unconstrained&lt;br /&gt;
* [http://www.coin-or.org/Bonmin/ BonMin] (CPL) Part of the COIN-OR suite; a solver for convect MINLP problems.&lt;br /&gt;
* [https://projects.coin-or.org/Couenne Couenne] (CPL) Part of the COIN-OR suite; a solver for non-convex MINLP problems.&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ ALGENCAN] (GPL) Augmented Lagrangian plus an embedded smooth function box-constraint solver called &#039;GENCAN&#039;&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ SPG] (GPL) for smooth function with convex constraint&lt;br /&gt;
* [http://www.gerad.ca/~couturgi/NOMAD/ NOMAD] (GPL) Generalized Pattern Search (GPS) algorithms to solve nonlinear optimization problems&lt;br /&gt;
* [http://www-fp.mcs.anl.gov/otc/Tools/LBFGS-B/ LBFGS-B] (PD?) limited-memory quasi-Newton code&lt;br /&gt;
* [http://ab-initio.mit.edu/wiki/index.php/NLopt NLopt] (LGPL) wrapper for a few other FOSS codes, but also reportedly has some new implementations of certain algorithms&lt;br /&gt;
* [http://www.uni-graz.at/imawww/kuntsevich/solvopt/ SolvOpt] (PD) &#039;method of exact penalisation&#039;, based on N.Z. Shor r-algorithm&lt;br /&gt;
* [http://openopt.org/ralg ralg] (BSD) - an implementation of N.Z. Shor r-algorithm; nonlinear/nonsmooth constrained/unconstrained problems&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wrappers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.coin-or.org/NLPAPI/index.html NLPAPI] (GPL?) a generalised wrapper for NLP solvers, including support for LANCELOT.&lt;br /&gt;
* [https://projects.coin-or.org/GAMSlinks/ GAMSlinks] (GPL?) a wrapper for [https://projects.coin-or.org/ COIN-OR] solvers that allows them to be called from GAMS. This is interesting as it shows how we could implement set up ASCEND so that it can use GAMS solvers, which adapting FOSS solvers that run under GAMS much easier to adapt for use with ASCEND.&lt;br /&gt;
* [http://www.netlib.org/ampl/solvers/lancelot/ AMPL/LANCELOT] a wrapper for running LANCELOT from AMPL. Again, this provides a way for seeing how solvers that have been adapted for use in AMPL might be also be connected to from ASCEND.&lt;br /&gt;
* [http://cuter.rl.ac.uk/cuter-www/interfaces.html CUTEr] (GPL-like license) is a wrapper for a wide range of optimisation solvers, and also a testing framework.&lt;br /&gt;
* [https://projects.coin-or.org/Osi OSI] (CPL?) wrapper for quite a wide range of LP solvers, from COIN-OR.&lt;br /&gt;
* [https://projects.coin-or.org/OS OS&amp;lt;] (CPL?) Optimisation Services, a number of interface languages and APIs for communicating between problem &#039;servers&#039; and solver &#039;clients&#039;, with support for a range of COIN-OR solvers and converters for GAMS/AMPL input files.&lt;br /&gt;
* [http://wiki.services.openoffice.org/wiki/Optimization_Solver OpenOffice.org&#039;s Solver]&lt;br /&gt;
* [http://openopt.org OpenOpt] (BSD) a general purpose optimization framework written in Python and NumPy, capable of automatic differentiation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unknown:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://coool.mines.edu/ COOOL]&lt;br /&gt;
&lt;br /&gt;
Another free list: [http://software.sandia.gov/Acro/html/Main/AcroPackages.html]&lt;br /&gt;
&lt;br /&gt;
There are some more listed in the [ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq nonlinear-programming-faq].&lt;br /&gt;
&lt;br /&gt;
== Free for non-commercial use ==&lt;br /&gt;
&lt;br /&gt;
Trust region&lt;br /&gt;
&lt;br /&gt;
* [http://www.numerical.rl.ac.uk/lancelot/blurb.html LANCELOT] (no redistribution or resale) Trust region method, adapt for bound constraints&lt;br /&gt;
&lt;br /&gt;
Active set&lt;br /&gt;
&lt;br /&gt;
* [http://www-unix.mcs.anl.gov/~more/tron/ TRON] (permission to copy and modify, but only to be used for &#039;internal research&#039; ([http://plato.asu.edu/ftp/other_software/tron_f90.tar.gz download]) active set method that uses a combination of gradient projections and a preconditioned conjugate gradient method to minimize an objective function. TRON only provides for &#039;box&#039; constraints and has no support for equality constraints, although it may be possible to add support for that by wrapping TRON around an NLA solver?&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming&lt;br /&gt;
&lt;br /&gt;
* [http://plato.la.asu.edu/donlp2.html DONLP2] (dense; free for non-commercial purposes)&lt;br /&gt;
&lt;br /&gt;
== Some proprietary alternatives ==&lt;br /&gt;
&lt;br /&gt;
Generalised reduced gradient method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.conopt.com/ CONOPT] (plus others in certain cases)&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_minos.htm MINOS] (uses GRG for linear constraints, else &#039;sparse SLC algorithm (a projected Lagrangian method, related to Robinson&#039;s method)&#039; for nonlinear constraints. Used when gradient evaluation is cheap.&lt;br /&gt;
* MS Excel [http://support.microsoft.com/kb/q214115/ Solver].&lt;br /&gt;
* GRG2&lt;br /&gt;
* LSGRG2&lt;br /&gt;
* [http://www.pinterconsulting.com/ LGO] &#039;Lipschitz Global Optimizer&#039;&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_products_snopt_desc.htm SNOPT] (sparse) Used when gradient evaluation is expensive. &#039;SNOPT employs a sparse SQP algorithm with limited-memory quasi-Newton approximations to the Hessian of Lagrangian. An augmented Lagrangian merit function promotes convergence from an arbitrary point.&#039;&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~kschittkowski/nlpqlp22.htm NLPQLP]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_npsol.htm NPSOL]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_lssol105description.htm LSSOL] (dense, &#039;two-phase (primal) quadratic programming&#039;)&lt;br /&gt;
* [http://www.princeton.edu/~rvdb/ LOQO] (free 30-day trial) &#039;LOQO is based on an infeasible, primal-dual, interior-point method applied to a sequence of quadratic approximations to the given problem&#039;&lt;br /&gt;
* [http://www.mcs.anl.gov/~leyffer/solvers.html FilterSQP]&lt;br /&gt;
&lt;br /&gt;
Active set method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_qpopt.htm QPOPT] (dense)&lt;br /&gt;
&lt;br /&gt;
Other methods:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ziena.com/knitro.htm KNITRO] (three methods: interior point direct, interior point conjugate gradient, &#039;active set&#039;)&lt;br /&gt;
* [http://www.gams.com/dd/docs/solvers/pathnlp.pdf PATHNLP]. &#039;PATHNLP solves an NLP by internally constructing the Karush-Kuhn-Tucker (KKT) system of first-order optimality conditions associated with the NLP and solving this system using the PATH solver for complementarity problems&#039;. Supposedly good for convex problems.&lt;br /&gt;
* [http://www.mosek.com/products.html MOSEK] (limited version available for download, or free student license) Interior point method plus simplex method.&lt;br /&gt;
* [http://www2.am.uni-erlangen.de/~kocvara/pennon/ PENNON] &#039;penalty method&#039;, &#039;PBM method of Ben-Tal and Zibulevsky&#039;&lt;br /&gt;
&lt;br /&gt;
Global optimisation&lt;br /&gt;
&lt;br /&gt;
* [http://www.andrew.cmu.edu/user/ns1b/baron/baron.html BARON]&lt;br /&gt;
* [http://www.ganso.com.au/index.php GANSO]&lt;br /&gt;
&lt;br /&gt;
Methods not yet checked:&lt;br /&gt;
&lt;br /&gt;
* IMSL and NAG software libraries&lt;br /&gt;
&#039;&#039;More to come&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mixed integer/nonlinear programs:&lt;br /&gt;
&lt;br /&gt;
* [http://www.gams.com/solvers/solvers.htm#DICOPT DICOPT]: MINLP&lt;br /&gt;
&lt;br /&gt;
See also [[Survey of sparse matrix software]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Miscellany]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=389</id>
		<title>Survey of optimisation software</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=389"/>
		<updated>2010-05-17T02:59:57Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Some proprietary alternatives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a survey of optimisation software that was performed as a part of our effort to identify options for a [[Non-proprietary Optimisation]] solver for ASCEND. Feel free to add any that we&#039;ve missed.&lt;br /&gt;
&lt;br /&gt;
== List of Lists ==&lt;br /&gt;
&lt;br /&gt;
* List of NLP solvers: [http://www.ici.ro/camo/hnp.htm]&lt;br /&gt;
* List of unconstrained optimisation solvers: [http://www.ici.ro/camo/huo.htm]&lt;br /&gt;
* There &#039;&#039;was&#039;&#039; a nice list at [http://www.scicomp.uni-erlangen.de/SW/opt.html] but the link seems to be broken at the moment.&lt;br /&gt;
* &#039;Decision tree&#039; for optimization software [http://plato.asu.edu/sub/nlores.html]&lt;br /&gt;
* Description of different types of optimisation problems: [http://coool.mines.edu/report/node3.html]&lt;br /&gt;
&lt;br /&gt;
== Free Open Source Software options ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/Ipopt&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/Ipopt&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;IPOPT&amp;lt;/a&amp;gt; (LGPL) &#039;Interior-Point Filter Line-Search Algorithm&#039;. Possibly some problems with scaling of variables (according to RPS). can use a number of free and non-free matrix solvers; the free matrix solver in version 3.3.1 is MUMPS. See also [[IPOPT]] in this wiki.&lt;br /&gt;
* [http://trilinos.sandia.gov/packages/moocho/ MOOCHO] (GPL?) reduced sequential quadratic programming (SQP); allows the user to supply their own linear solver.&lt;br /&gt;
* [http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Minimization.html GSL &#039;multimin&#039;] (GPL) several multidimensional dense-matrix unconstrained optimisation methods including conjugate gradient methods, quasi-newton methods, steepest descent and Nelder-Mead simplex method.&lt;br /&gt;
* [http://acts.nersc.gov/opt++/index.html OPT++] (free, includes &#039;&#039;optional&#039;&#039; wrapping of non-free NPSOL). Good but dense matrices only (RPS). Superceded by MOOCHO?&lt;br /&gt;
* [http://software.sandia.gov/appspack/version5.0/index.html APPSPACK] (GPL?) &#039;asynchronous parallel generating set search&#039;, derivative-free.&lt;br /&gt;
* [http://www.eng.buffalo.edu/Research/MODEL/mdo.test.orig/CONMIN/ CONMIN] (&#039;free&#039; but where from?) &#039;two-step limited memory quasi Newton like Conjugate Gradient method with Beale restarts&#039;.&lt;br /&gt;
* [http://www.cs.sandia.gov/SGOPT/ SGOPT] (LGPL) Evolutionary and pattern-search algorithms&lt;br /&gt;
* [http://www.math.ufl.edu/~hager/ OPTPACK] (PD) &#039;a dual algorithm for constrained optimization&#039;&lt;br /&gt;
* [http://www.netlib.org/minpack/ MINPACK] (BSD-like) unconstrained&lt;br /&gt;
* [http://www.coin-or.org/Bonmin/ BonMin] (CPL) Part of the COIN-OR suite; a solver for convect MINLP problems.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/Couenne&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/Couenne&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;Couenne&amp;lt;/a&amp;gt; (CPL) Part of the COIN-OR suite; a solver for non-convex MINLP problems.&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ ALGENCAN] (GPL) Augmented Lagrangian plus an embedded smooth function box-constraint solver called &#039;GENCAN&#039;&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ SPG] (GPL) for smooth function with convex constraint&lt;br /&gt;
* [http://www.gerad.ca/~couturgi/NOMAD/ NOMAD] (GPL) Generalized Pattern Search (GPS) algorithms to solve nonlinear optimization problems&lt;br /&gt;
* [http://www-fp.mcs.anl.gov/otc/Tools/LBFGS-B/ LBFGS-B] (PD?) limited-memory quasi-Newton code&lt;br /&gt;
* [http://ab-initio.mit.edu/wiki/index.php/NLopt NLopt] (LGPL) wrapper for a few other FOSS codes, but also reportedly has some new implementations of certain algorithms&lt;br /&gt;
* [http://www.uni-graz.at/imawww/kuntsevich/solvopt/ SolvOpt] (PD) &#039;method of exact penalisation&#039;, based on N.Z. Shor r-algorithm&lt;br /&gt;
* [http://openopt.org/ralg ralg] (BSD) - an implementation of N.Z. Shor r-algorithm; nonlinear/nonsmooth constrained/unconstrained problems&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wrappers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.coin-or.org/NLPAPI/index.html NLPAPI] (GPL?) a generalised wrapper for NLP solvers, including support for LANCELOT.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/GAMSlinks/&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/GAMSlinks/&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;GAMSlinks&amp;lt;/a&amp;gt; (GPL?) a wrapper for &amp;lt;a href=&amp;quot;https://projects.coin-or.org/&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;COIN-OR&amp;lt;/a&amp;gt; solvers that allows them to be called from GAMS. This is interesting as it shows how we could implement set up ASCEND so that it can use GAMS solvers, which adapting FOSS solvers that run under GAMS much easier to adapt for use with ASCEND.&lt;br /&gt;
* [http://www.netlib.org/ampl/solvers/lancelot/ AMPL/LANCELOT] a wrapper for running LANCELOT from AMPL. Again, this provides a way for seeing how solvers that have been adapted for use in AMPL might be also be connected to from ASCEND.&lt;br /&gt;
* [http://cuter.rl.ac.uk/cuter-www/interfaces.html CUTEr] (GPL-like license) is a wrapper for a wide range of optimisation solvers, and also a testing framework.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/Osi&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/Osi&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;OSI&amp;lt;/a&amp;gt; (CPL?) wrapper for quite a wide range of LP solvers, from COIN-OR.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/OS&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/OS&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;OS&amp;lt;/a&amp;gt; (CPL?) Optimisation Services, a number of interface languages and APIs for communicating between problem &#039;servers&#039; and solver &#039;clients&#039;, with support for a range of COIN-OR solvers and converters for GAMS/AMPL input files.&lt;br /&gt;
* [http://wiki.services.openoffice.org/wiki/Optimization_Solver OpenOffice.org&#039;s Solver]&lt;br /&gt;
* [http://openopt.org OpenOpt] (BSD) a general purpose optimization framework written in Python and NumPy, capable of automatic differentiation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unknown:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://coool.mines.edu/ COOOL]&lt;br /&gt;
&lt;br /&gt;
Another free list: [http://software.sandia.gov/Acro/html/Main/AcroPackages.html]&lt;br /&gt;
&lt;br /&gt;
There are some more listed in the &amp;lt;a href=&amp;quot;ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;nonlinear-programming-faq&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Free for non-commercial use ==&lt;br /&gt;
&lt;br /&gt;
Trust region&lt;br /&gt;
&lt;br /&gt;
* [http://www.numerical.rl.ac.uk/lancelot/blurb.html LANCELOT] (no redistribution or resale) Trust region method, adapt for bound constraints&lt;br /&gt;
&lt;br /&gt;
Active set&lt;br /&gt;
&lt;br /&gt;
* [http://www-unix.mcs.anl.gov/~more/tron/ TRON] (permission to copy and modify, but only to be used for &#039;internal research&#039; ([http://plato.asu.edu/ftp/other_software/tron_f90.tar.gz download]) active set method that uses a combination of gradient projections and a preconditioned conjugate gradient method to minimize an objective function. TRON only provides for &#039;box&#039; constraints and has no support for equality constraints, although it may be possible to add support for that by wrapping TRON around an NLA solver?&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming&lt;br /&gt;
&lt;br /&gt;
* [http://plato.la.asu.edu/donlp2.html DONLP2] (dense; free for non-commercial purposes)&lt;br /&gt;
&lt;br /&gt;
== Some proprietary alternatives ==&lt;br /&gt;
&lt;br /&gt;
Generalised reduced gradient method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.conopt.com/ CONOPT] (plus others in certain cases)&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_minos.htm MINOS] (uses GRG for linear constraints, else &#039;sparse SLC algorithm (a projected Lagrangian method, related to Robinson&#039;s method)&#039; for nonlinear constraints. Used when gradient evaluation is cheap.&lt;br /&gt;
* MS Excel [http://support.microsoft.com/kb/q214115/ Solver].&lt;br /&gt;
* GRG2&lt;br /&gt;
* LSGRG2&lt;br /&gt;
* [http://www.pinterconsulting.com/ LGO] &#039;Lipschitz Global Optimizer&#039;&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_products_snopt_desc.htm SNOPT] (sparse) Used when gradient evaluation is expensive. &#039;SNOPT employs a sparse SQP algorithm with limited-memory quasi-Newton approximations to the Hessian of Lagrangian. An augmented Lagrangian merit function promotes convergence from an arbitrary point.&#039;&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~kschittkowski/nlpqlp22.htm NLPQLP]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_npsol.htm NPSOL]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_lssol105description.htm LSSOL] (dense, &#039;two-phase (primal) quadratic programming&#039;)&lt;br /&gt;
* [http://www.princeton.edu/~rvdb/ LOQO] (free 30-day trial) &#039;LOQO is based on an infeasible, primal-dual, interior-point method applied to a sequence of quadratic approximations to the given problem&#039;&lt;br /&gt;
* [http://www.mcs.anl.gov/~leyffer/solvers.html FilterSQP]&lt;br /&gt;
&lt;br /&gt;
Active set method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_qpopt.htm QPOPT] (dense)&lt;br /&gt;
&lt;br /&gt;
Other methods:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ziena.com/knitro.htm KNITRO] (three methods: interior point direct, interior point conjugate gradient, &#039;active set&#039;)&lt;br /&gt;
* [http://www.gams.com/dd/docs/solvers/pathnlp.pdf PATHNLP]. &#039;PATHNLP solves an NLP by internally constructing the Karush-Kuhn-Tucker (KKT) system of first-order optimality conditions associated with the NLP and solving this system using the PATH solver for complementarity problems&#039;. Supposedly good for convex problems.&lt;br /&gt;
* [http://www.mosek.com/products.html MOSEK] (limited version available for download, or free student license) Interior point method plus simplex method.&lt;br /&gt;
* [http://www2.am.uni-erlangen.de/~kocvara/pennon/ PENNON] &#039;penalty method&#039;, &#039;PBM method of Ben-Tal and Zibulevsky&#039;&lt;br /&gt;
&lt;br /&gt;
Global optimisation&lt;br /&gt;
&lt;br /&gt;
* [http://www.andrew.cmu.edu/user/ns1b/baron/baron.html BARON]&lt;br /&gt;
* [http://www.ganso.com.au/index.php GANSO]&lt;br /&gt;
&lt;br /&gt;
Methods not yet checked:&lt;br /&gt;
&lt;br /&gt;
* IMSL and NAG software libraries&lt;br /&gt;
&#039;&#039;More to come&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mixed integer/nonlinear programs:&lt;br /&gt;
&lt;br /&gt;
* [http://www.gams.com/solvers/solvers.htm#DICOPT DICOPT]: MINLP&lt;br /&gt;
&lt;br /&gt;
See also [[Survey of sparse matrix software]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Miscellany]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=388</id>
		<title>Survey of optimisation software</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Survey_of_optimisation_software&amp;diff=388"/>
		<updated>2010-05-17T02:59:42Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a survey of optimisation software that was performed as a part of our effort to identify options for a [[Non-proprietary Optimisation]] solver for ASCEND. Feel free to add any that we&#039;ve missed.&lt;br /&gt;
&lt;br /&gt;
== List of Lists ==&lt;br /&gt;
&lt;br /&gt;
* List of NLP solvers: [http://www.ici.ro/camo/hnp.htm]&lt;br /&gt;
* List of unconstrained optimisation solvers: [http://www.ici.ro/camo/huo.htm]&lt;br /&gt;
* There &#039;&#039;was&#039;&#039; a nice list at [http://www.scicomp.uni-erlangen.de/SW/opt.html] but the link seems to be broken at the moment.&lt;br /&gt;
* &#039;Decision tree&#039; for optimization software [http://plato.asu.edu/sub/nlores.html]&lt;br /&gt;
* Description of different types of optimisation problems: [http://coool.mines.edu/report/node3.html]&lt;br /&gt;
&lt;br /&gt;
== Free Open Source Software options ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/Ipopt&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/Ipopt&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;IPOPT&amp;lt;/a&amp;gt; (LGPL) &#039;Interior-Point Filter Line-Search Algorithm&#039;. Possibly some problems with scaling of variables (according to RPS). can use a number of free and non-free matrix solvers; the free matrix solver in version 3.3.1 is MUMPS. See also [[IPOPT]] in this wiki.&lt;br /&gt;
* [http://trilinos.sandia.gov/packages/moocho/ MOOCHO] (GPL?) reduced sequential quadratic programming (SQP); allows the user to supply their own linear solver.&lt;br /&gt;
* [http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Minimization.html GSL &#039;multimin&#039;] (GPL) several multidimensional dense-matrix unconstrained optimisation methods including conjugate gradient methods, quasi-newton methods, steepest descent and Nelder-Mead simplex method.&lt;br /&gt;
* [http://acts.nersc.gov/opt++/index.html OPT++] (free, includes &#039;&#039;optional&#039;&#039; wrapping of non-free NPSOL). Good but dense matrices only (RPS). Superceded by MOOCHO?&lt;br /&gt;
* [http://software.sandia.gov/appspack/version5.0/index.html APPSPACK] (GPL?) &#039;asynchronous parallel generating set search&#039;, derivative-free.&lt;br /&gt;
* [http://www.eng.buffalo.edu/Research/MODEL/mdo.test.orig/CONMIN/ CONMIN] (&#039;free&#039; but where from?) &#039;two-step limited memory quasi Newton like Conjugate Gradient method with Beale restarts&#039;.&lt;br /&gt;
* [http://www.cs.sandia.gov/SGOPT/ SGOPT] (LGPL) Evolutionary and pattern-search algorithms&lt;br /&gt;
* [http://www.math.ufl.edu/~hager/ OPTPACK] (PD) &#039;a dual algorithm for constrained optimization&#039;&lt;br /&gt;
* [http://www.netlib.org/minpack/ MINPACK] (BSD-like) unconstrained&lt;br /&gt;
* [http://www.coin-or.org/Bonmin/ BonMin] (CPL) Part of the COIN-OR suite; a solver for convect MINLP problems.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/Couenne&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/Couenne&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;Couenne&amp;lt;/a&amp;gt; (CPL) Part of the COIN-OR suite; a solver for non-convex MINLP problems.&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ ALGENCAN] (GPL) Augmented Lagrangian plus an embedded smooth function box-constraint solver called &#039;GENCAN&#039;&lt;br /&gt;
* [http://www.ime.usp.br/~egbirgin/tango/ SPG] (GPL) for smooth function with convex constraint&lt;br /&gt;
* [http://www.gerad.ca/~couturgi/NOMAD/ NOMAD] (GPL) Generalized Pattern Search (GPS) algorithms to solve nonlinear optimization problems&lt;br /&gt;
* [http://www-fp.mcs.anl.gov/otc/Tools/LBFGS-B/ LBFGS-B] (PD?) limited-memory quasi-Newton code&lt;br /&gt;
* [http://ab-initio.mit.edu/wiki/index.php/NLopt NLopt] (LGPL) wrapper for a few other FOSS codes, but also reportedly has some new implementations of certain algorithms&lt;br /&gt;
* [http://www.uni-graz.at/imawww/kuntsevich/solvopt/ SolvOpt] (PD) &#039;method of exact penalisation&#039;, based on N.Z. Shor r-algorithm&lt;br /&gt;
* [http://openopt.org/ralg ralg] (BSD) - an implementation of N.Z. Shor r-algorithm; nonlinear/nonsmooth constrained/unconstrained problems&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wrappers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.coin-or.org/NLPAPI/index.html NLPAPI] (GPL?) a generalised wrapper for NLP solvers, including support for LANCELOT.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/GAMSlinks/&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/GAMSlinks/&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;GAMSlinks&amp;lt;/a&amp;gt; (GPL?) a wrapper for &amp;lt;a href=&amp;quot;https://projects.coin-or.org/&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;COIN-OR&amp;lt;/a&amp;gt; solvers that allows them to be called from GAMS. This is interesting as it shows how we could implement set up ASCEND so that it can use GAMS solvers, which adapting FOSS solvers that run under GAMS much easier to adapt for use with ASCEND.&lt;br /&gt;
* [http://www.netlib.org/ampl/solvers/lancelot/ AMPL/LANCELOT] a wrapper for running LANCELOT from AMPL. Again, this provides a way for seeing how solvers that have been adapted for use in AMPL might be also be connected to from ASCEND.&lt;br /&gt;
* [http://cuter.rl.ac.uk/cuter-www/interfaces.html CUTEr] (GPL-like license) is a wrapper for a wide range of optimisation solvers, and also a testing framework.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/Osi&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/Osi&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;OSI&amp;lt;/a&amp;gt; (CPL?) wrapper for quite a wide range of LP solvers, from COIN-OR.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;https://projects.coin-or.org/OS&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;https://projects.coin-or.org/OS&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;OS&amp;lt;/a&amp;gt; (CPL?) Optimisation Services, a number of interface languages and APIs for communicating between problem &#039;servers&#039; and solver &#039;clients&#039;, with support for a range of COIN-OR solvers and converters for GAMS/AMPL input files.&lt;br /&gt;
* [http://wiki.services.openoffice.org/wiki/Optimization_Solver OpenOffice.org&#039;s Solver]&lt;br /&gt;
* [http://openopt.org OpenOpt] (BSD) a general purpose optimization framework written in Python and NumPy, capable of automatic differentiation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unknown:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://coool.mines.edu/ COOOL]&lt;br /&gt;
&lt;br /&gt;
Another free list: [http://software.sandia.gov/Acro/html/Main/AcroPackages.html]&lt;br /&gt;
&lt;br /&gt;
There are some more listed in the &amp;lt;a href=&amp;quot;ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq&amp;quot; class=&amp;quot;external text&amp;quot; title=&amp;quot;ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;nonlinear-programming-faq&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Free for non-commercial use ==&lt;br /&gt;
&lt;br /&gt;
Trust region&lt;br /&gt;
&lt;br /&gt;
* [http://www.numerical.rl.ac.uk/lancelot/blurb.html LANCELOT] (no redistribution or resale) Trust region method, adapt for bound constraints&lt;br /&gt;
&lt;br /&gt;
Active set&lt;br /&gt;
&lt;br /&gt;
* [http://www-unix.mcs.anl.gov/~more/tron/ TRON] (permission to copy and modify, but only to be used for &#039;internal research&#039; ([http://plato.asu.edu/ftp/other_software/tron_f90.tar.gz download]) active set method that uses a combination of gradient projections and a preconditioned conjugate gradient method to minimize an objective function. TRON only provides for &#039;box&#039; constraints and has no support for equality constraints, although it may be possible to add support for that by wrapping TRON around an NLA solver?&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming&lt;br /&gt;
&lt;br /&gt;
* [http://plato.la.asu.edu/donlp2.html DONLP2] (dense; free for non-commercial purposes)&lt;br /&gt;
&lt;br /&gt;
== Some proprietary alternatives ==&lt;br /&gt;
&lt;br /&gt;
Generalised reduced gradient method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.conopt.com/ CONOPT] (plus others in certain cases)&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_minos.htm MINOS] (uses GRG for linear constraints, else &#039;sparse SLC algorithm (a projected Lagrangian method, related to Robinson&#039;s method)&#039; for nonlinear constraints. Used when gradient evaluation is cheap.&lt;br /&gt;
* MS Excel [http://support.microsoft.com/kb/q214115/ Solver].&lt;br /&gt;
* GRG2&lt;br /&gt;
* LSGRG2&lt;br /&gt;
* [http://www.pinterconsulting.com/ LGO] &#039;Lipschitz Global Optimizer&#039;&lt;br /&gt;
&lt;br /&gt;
Sequential quadratic programming:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_products_snopt_desc.htm SNOPT] (sparse) Used when gradient evaluation is expensive. &#039;SNOPT employs a sparse SQP algorithm with limited-memory quasi-Newton approximations to the Hessian of Lagrangian. An augmented Lagrangian merit function promotes convergence from an arbitrary point.&#039;&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~kschittkowski/nlpqlp22.htm NLPQLP]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_npsol.htm NPSOL]&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_lssol105description.htm LSSOL] (dense, &#039;two-phase (primal) quadratic programming&#039;)&lt;br /&gt;
* [http://www.princeton.edu/~rvdb/ LOQO] (free 30-day trial) &#039;LOQO is based on an infeasible, primal-dual, interior-point method applied to a sequence of quadratic approximations to the given problem&#039;&lt;br /&gt;
* [http://www.mcs.anl.gov/~leyffer/solvers.html FilterSQP]&lt;br /&gt;
&lt;br /&gt;
Active set method:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbsi-sol-optimize.com/asp/sol_product_qpopt.htm QPOPT] (dense)&lt;br /&gt;
&lt;br /&gt;
Other methods:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ziena.com/knitro.htm KNITRO] (three methods: interior point direct, interior point conjugate gradient, &#039;active set&#039;)&lt;br /&gt;
* [http://www.gams.com/dd/docs/solvers/pathnlp.pdf PATHNLP]. &#039;PATHNLP solves an NLP by internally constructing the Karush-Kuhn-Tucker (KKT) system of first-order optimality conditions associated with the NLP and solving this system using the PATH solver for complementarity problems&#039;. Supposedly good for convex problems.&lt;br /&gt;
* [http://www.mosek.com/products.html MOSEK] (limited version available for download, or free student license) Interior point method plus simplex method.&lt;br /&gt;
* [http://www2.am.uni-erlangen.de/~kocvara/pennon/ PENNON] &#039;penalty method&#039;, &#039;PBM method of Ben-Tal and Zibulevsky&#039;&lt;br /&gt;
&lt;br /&gt;
Global optimisation&lt;br /&gt;
&lt;br /&gt;
* [http://www.andrew.cmu.edu/user/ns1b/baron/baron.html BARON]&lt;br /&gt;
* [http://www.ganso.com.au/index.php GANSO]&lt;br /&gt;
&lt;br /&gt;
Methods not yet checked:&lt;br /&gt;
&lt;br /&gt;
* IMSL and NAG software libraries&lt;br /&gt;
&#039;&#039;More to come&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mixed integer/nonlinear programs:&lt;br /&gt;
&lt;br /&gt;
* [http://www.gams.com/solvers/solvers.htm#DICOPT DICOPT]: MINLP&lt;br /&gt;
&lt;br /&gt;
See also [[Survey of sparse matrix software]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Scripting_ASCEND_using_Python&amp;diff=387</id>
		<title>Scripting ASCEND using Python</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Scripting_ASCEND_using_Python&amp;diff=387"/>
		<updated>2010-05-17T02:58:36Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It&#039;s possible to write scripts that &#039;drive&#039; ASCEND, using the [http://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] language. These scripts can be used for any task you can think of, with the ASCEND engine providing the core capability of loading a system of equations, getting it ready to solve, and then solving it. For example:&lt;br /&gt;
&lt;br /&gt;
* you have a model and you want to run a large number of parameter studies on it. You can write a Python script to loop through different cases and solve the model for each one and extract the results and put them into a table.&lt;br /&gt;
* you want to plot curves for thermodynamic property data, but the built-in plotting capability of ASCEND doesn&#039;t seem right for the job&lt;br /&gt;
* you want to incorporate an ASCEND model into a program with a custom GUI to make it easier for non-technical users to use it&lt;br /&gt;
* you want to write a test suite to check that a model still does what it did when you first write it, and you want to run that test suite automatically every night.&lt;br /&gt;
&lt;br /&gt;
As well as the current suppport for Python scripting of ASCEND, it&#039;s also possible to write ASCEND scripts using Tcl/Tk. See [[Category:Documentation|the user&#039;s manual]] for more information on that.&lt;br /&gt;
&lt;br /&gt;
There are two different ways of accessing the Python API for ASCEND. The first way is the more natural one, which is to simply write a standalone Python script that &#039;&#039;&#039;wraps&#039;&#039;&#039; the ASCEND engine and makes it do things. The second way is via the [[ExtPy]] mechanism, which lets you write fragments of Python that can be run &#039;&#039;&#039;embedded&#039;&#039;&#039; within the [[METHODS]] interface in the PyGTK GUI. The first is better for quick hacks, the second is better for providing reusable functionality, although it still represents code at a somewhat experimental stage.&lt;br /&gt;
&lt;br /&gt;
Currently, the best place to find examples of what can be done with the ASCEND Python API is in the code of the file {{src|test.py}} from the code repository. There is not yet any good documentation for the Python API, unfortunately.&lt;br /&gt;
&lt;br /&gt;
== Example of a standalone Python script with ASCEND ==&lt;br /&gt;
&lt;br /&gt;
Here is an example of a simple script that loads a model (namely {{src|models/johnpye/testlog10.a4c}}) and solves it, then runs the &#039;self_test&#039; method on the model, then prints out the value of a variable from the model.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;py&amp;quot;&amp;gt;#!/usr/bin/env python&lt;br /&gt;
# file &#039;example.py&#039;:&lt;br /&gt;
&lt;br /&gt;
import ascpy&lt;br /&gt;
L = ascpy.Library()&lt;br /&gt;
&lt;br /&gt;
L.load(&amp;amp;quot;johnpye/testlog10.a4c&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
T = L.findType(&amp;amp;quot;testlog10&amp;amp;quot;)&lt;br /&gt;
M = T.getSimulation(&#039;sim&#039;)&lt;br /&gt;
&lt;br /&gt;
M.solve(ascpy.Solver(&amp;amp;quot;QRSlv&amp;amp;quot;),ascpy.SolverReporter())&lt;br /&gt;
M.run(T.getMethod(&#039;self_test&#039;))&lt;br /&gt;
&lt;br /&gt;
print &amp;amp;quot;After solving, z =&amp;amp;quot;,float(M.z)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script can be run using the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sh&amp;quot;&amp;gt;PYTHONPATH=~/ascend/pygtk python example.py&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As well as stacks of debug output, this also finally outputs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------solve----------------&lt;br /&gt;
pygtk/simulation.cpp:804 (solve): Elapsed time: 0.000 (solver completed)&lt;br /&gt;
Converged&lt;br /&gt;
pygtk/simulation.cpp:889 (processVarStatus): There are 2 blocks&lt;br /&gt;
EMPTY METHOD CREATED&lt;br /&gt;
pygtk/simulation.cpp:214 (run): Running method self_test...&lt;br /&gt;
base/generic/utilities/error.c:161 (error_reporter_tree_end): TREE END&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:24:ASSERT: Assertion OK&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:25:ASSERT: Assertion OK&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:26:ASSERT: Assertion OK&lt;br /&gt;
base/generic/utilities/error.c:308 (va_error_reporter): DONE WRITING TREE&lt;br /&gt;
SUCCESS: Method &#039;self_test&#039; returned &#039;all_ok&#039; and output no errors.&lt;br /&gt;
&lt;br /&gt;
After solving, z = 2.30258509299&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With care, one can set up the model then repeatedly solve it for different variable values, etc.&lt;br /&gt;
&lt;br /&gt;
== Example of a script embedded within an ASCEND model ==&lt;br /&gt;
&lt;br /&gt;
See [[ExtPy]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Category:Documentation]]&lt;br /&gt;
[[Category:Examples]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Scripting_ASCEND_using_Python&amp;diff=386</id>
		<title>Scripting ASCEND using Python</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Scripting_ASCEND_using_Python&amp;diff=386"/>
		<updated>2010-05-17T02:58:24Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Example of a standalone Python script with ASCEND */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It&#039;s possible to write scripts that &#039;drive&#039; ASCEND, using the [http://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] language. These scripts can be used for any task you can think of, with the ASCEND engine providing the core capability of loading a system of equations, getting it ready to solve, and then solving it. For example:&lt;br /&gt;
&lt;br /&gt;
* you have a model and you want to run a large number of parameter studies on it. You can write a Python script to loop through different cases and solve the model for each one and extract the results and put them into a table.&lt;br /&gt;
* you want to plot curves for thermodynamic property data, but the built-in plotting capability of ASCEND doesn&#039;t seem right for the job&lt;br /&gt;
* you want to incorporate an ASCEND model into a program with a custom GUI to make it easier for non-technical users to use it&lt;br /&gt;
* you want to write a test suite to check that a model still does what it did when you first write it, and you want to run that test suite automatically every night.&lt;br /&gt;
&lt;br /&gt;
As well as the current suppport for Python scripting of ASCEND, it&#039;s also possible to write ASCEND scripts using Tcl/Tk. See [[Category:Documentation|the user&#039;s manual]] for more information on that.&lt;br /&gt;
&lt;br /&gt;
There are two different ways of accessing the Python API for ASCEND. The first way is the more natural one, which is to simply write a standalone Python script that &#039;&#039;&#039;wraps&#039;&#039;&#039; the ASCEND engine and makes it do things. The second way is via the [[ExtPy]] mechanism, which lets you write fragments of Python that can be run &#039;&#039;&#039;embedded&#039;&#039;&#039; within the [[METHODS]] interface in the PyGTK GUI. The first is better for quick hacks, the second is better for providing reusable functionality, although it still represents code at a somewhat experimental stage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Currently, the best place to find examples of what can be done with the ASCEND Python API is in the code of the file {{src|test.py}} from the code repository. There is not yet any good documentation for the Python API, unfortunately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example of a standalone Python script with ASCEND ==&lt;br /&gt;
&lt;br /&gt;
Here is an example of a simple script that loads a model (namely {{src|models/johnpye/testlog10.a4c}}) and solves it, then runs the &#039;self_test&#039; method on the model, then prints out the value of a variable from the model.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;py&amp;quot;&amp;gt;#!/usr/bin/env python&lt;br /&gt;
# file &#039;example.py&#039;:&lt;br /&gt;
&lt;br /&gt;
import ascpy&lt;br /&gt;
L = ascpy.Library()&lt;br /&gt;
&lt;br /&gt;
L.load(&amp;amp;quot;johnpye/testlog10.a4c&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
T = L.findType(&amp;amp;quot;testlog10&amp;amp;quot;)&lt;br /&gt;
M = T.getSimulation(&#039;sim&#039;)&lt;br /&gt;
&lt;br /&gt;
M.solve(ascpy.Solver(&amp;amp;quot;QRSlv&amp;amp;quot;),ascpy.SolverReporter())&lt;br /&gt;
M.run(T.getMethod(&#039;self_test&#039;))&lt;br /&gt;
&lt;br /&gt;
print &amp;amp;quot;After solving, z =&amp;amp;quot;,float(M.z)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script can be run using the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sh&amp;quot;&amp;gt;PYTHONPATH=~/ascend/pygtk python example.py&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As well as stacks of debug output, this also finally outputs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------solve----------------&lt;br /&gt;
pygtk/simulation.cpp:804 (solve): Elapsed time: 0.000 (solver completed)&lt;br /&gt;
Converged&lt;br /&gt;
pygtk/simulation.cpp:889 (processVarStatus): There are 2 blocks&lt;br /&gt;
EMPTY METHOD CREATED&lt;br /&gt;
pygtk/simulation.cpp:214 (run): Running method self_test...&lt;br /&gt;
base/generic/utilities/error.c:161 (error_reporter_tree_end): TREE END&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:24:ASSERT: Assertion OK&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:25:ASSERT: Assertion OK&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:26:ASSERT: Assertion OK&lt;br /&gt;
base/generic/utilities/error.c:308 (va_error_reporter): DONE WRITING TREE&lt;br /&gt;
SUCCESS: Method &#039;self_test&#039; returned &#039;all_ok&#039; and output no errors.&lt;br /&gt;
&lt;br /&gt;
After solving, z = 2.30258509299&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With care, one can set up the model then repeatedly solve it for different variable values, etc.&lt;br /&gt;
&lt;br /&gt;
== Example of a script embedded within an ASCEND model ==&lt;br /&gt;
&lt;br /&gt;
See [[ExtPy]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Category:Documentation]]&lt;br /&gt;
[[Category:Examples]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Scripting_ASCEND_using_Python&amp;diff=385</id>
		<title>Scripting ASCEND using Python</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Scripting_ASCEND_using_Python&amp;diff=385"/>
		<updated>2010-05-17T02:58:10Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Example of a standalone Python script with ASCEND */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It&#039;s possible to write scripts that &#039;drive&#039; ASCEND, using the [http://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] language. These scripts can be used for any task you can think of, with the ASCEND engine providing the core capability of loading a system of equations, getting it ready to solve, and then solving it. For example:&lt;br /&gt;
&lt;br /&gt;
* you have a model and you want to run a large number of parameter studies on it. You can write a Python script to loop through different cases and solve the model for each one and extract the results and put them into a table.&lt;br /&gt;
* you want to plot curves for thermodynamic property data, but the built-in plotting capability of ASCEND doesn&#039;t seem right for the job&lt;br /&gt;
* you want to incorporate an ASCEND model into a program with a custom GUI to make it easier for non-technical users to use it&lt;br /&gt;
* you want to write a test suite to check that a model still does what it did when you first write it, and you want to run that test suite automatically every night.&lt;br /&gt;
&lt;br /&gt;
As well as the current suppport for Python scripting of ASCEND, it&#039;s also possible to write ASCEND scripts using Tcl/Tk. See [[Category:Documentation|the user&#039;s manual]] for more information on that.&lt;br /&gt;
&lt;br /&gt;
There are two different ways of accessing the Python API for ASCEND. The first way is the more natural one, which is to simply write a standalone Python script that &#039;&#039;&#039;wraps&#039;&#039;&#039; the ASCEND engine and makes it do things. The second way is via the [[ExtPy]] mechanism, which lets you write fragments of Python that can be run &#039;&#039;&#039;embedded&#039;&#039;&#039; within the [[METHODS]] interface in the PyGTK GUI. The first is better for quick hacks, the second is better for providing reusable functionality, although it still represents code at a somewhat experimental stage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Currently, the best place to find examples of what can be done with the ASCEND Python API is in the code of the file {{src|test.py}} from the code repository. There is not yet any good documentation for the Python API, unfortunately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example of a standalone Python script with ASCEND ==&lt;br /&gt;
&lt;br /&gt;
Here is an example of a simple script that loads a model (namely {{src|models/johnpye/testlog10.a4c}}) and solves it, then runs the &#039;self_test&#039; method on the model, then prints out the value of a variable from the model.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;py&amp;quot;&amp;gt;#!/usr/bin/env python&lt;br /&gt;
# file &#039;example.py&#039;:&lt;br /&gt;
&lt;br /&gt;
import ascpy&lt;br /&gt;
L = ascpy.Library()&lt;br /&gt;
&lt;br /&gt;
L.load(&amp;amp;quot;johnpye/testlog10.a4c&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
T = L.findType(&amp;amp;quot;testlog10&amp;amp;quot;)&lt;br /&gt;
M = T.getSimulation(&#039;sim&#039;)&lt;br /&gt;
&lt;br /&gt;
M.solve(ascpy.Solver(&amp;amp;quot;QRSlv&amp;amp;quot;),ascpy.SolverReporter())&lt;br /&gt;
M.run(T.getMethod(&#039;self_test&#039;))&lt;br /&gt;
&lt;br /&gt;
print &amp;amp;quot;After solving, z =&amp;amp;quot;,float(M.z)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script can be run using the command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sh&amp;quot;&amp;gt;PYTHONPATH=~/ascend/pygtk python example.py&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As well as stacks of debug output, this also finally outputs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------solve----------------&lt;br /&gt;
pygtk/simulation.cpp:804 (solve): Elapsed time: 0.000 (solver completed)&lt;br /&gt;
Converged&lt;br /&gt;
pygtk/simulation.cpp:889 (processVarStatus): There are 2 blocks&lt;br /&gt;
EMPTY METHOD CREATED&lt;br /&gt;
pygtk/simulation.cpp:214 (run): Running method self_test...&lt;br /&gt;
base/generic/utilities/error.c:161 (error_reporter_tree_end): TREE END&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:24:ASSERT: Assertion OK&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:25:ASSERT: Assertion OK&lt;br /&gt;
SUCCESS: /home/john/ascend/models/johnpye/testlog10.a4c:26:ASSERT: Assertion OK&lt;br /&gt;
base/generic/utilities/error.c:308 (va_error_reporter): DONE WRITING TREE&lt;br /&gt;
SUCCESS: Method &#039;self_test&#039; returned &#039;all_ok&#039; and output no errors.&lt;br /&gt;
&lt;br /&gt;
After solving, z = 2.30258509299&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With care, one can set up the model then repeatedly solve it for different variable values, etc.&lt;br /&gt;
&lt;br /&gt;
== Example of a script embedded within an ASCEND model ==&lt;br /&gt;
&lt;br /&gt;
See [[ExtPy]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Category:Documentation]]&lt;br /&gt;
[[Category:Examples]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=ASCEND_overview&amp;diff=384</id>
		<title>ASCEND overview</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=ASCEND_overview&amp;diff=384"/>
		<updated>2010-05-17T02:57:40Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missingimages}}&lt;br /&gt;
&lt;br /&gt;
ASCEND is a system for &#039;&#039;&#039;solving systems of equations&#039;&#039;&#039;, aimed at engineers and scientists. It allows you to &#039;&#039;&#039;build up complex models&#039;&#039;&#039; as as systems constructed from simpler &#039;&#039;&#039;sub-models&#039;&#039;&#039;. Using ASCEND it is simple to &#039;&#039;&#039;play around&#039;&#039;&#039; with your model, examine its behaviour, and work out how it can best be solved. You can &#039;&#039;&#039;easily change which variables are fixed&#039;&#039;&#039; and which are to be solved, and you can examine the way in which the model is being solved.&lt;br /&gt;
&lt;br /&gt;
After looking through this brief introduction to what ASCEND is all about, you might want to look at the [[ASCEND history]], a more detailed list of [[ASCEND capabilities]], see some [[worked examples]], find out about [[ASCEND_Users_and_Friends|the developers]] or look at more detailed [[Category:Documentation|documentation]].&lt;br /&gt;
&lt;br /&gt;
== Example of a simple model in ASCEND ==&lt;br /&gt;
&lt;br /&gt;
In ASCEND, models are written in a special-purpose modelling language that combines declarative &#039;&#039;variables&#039;&#039; and &#039;&#039;equations&#039;&#039; with procedural &#039;&#039;methods&#039;&#039;. The following simple method calculates the mass of water in a tank:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;REQUIRE &amp;amp;quot;atoms.a4l&amp;amp;quot;;&lt;br /&gt;
&lt;br /&gt;
MODEL tank;&lt;br /&gt;
	V IS_A volume;&lt;br /&gt;
	A IS_A area;&lt;br /&gt;
&lt;br /&gt;
	h IS_A distance;&lt;br /&gt;
	d IS_A distance;&lt;br /&gt;
	area_eqn: A = 1{PI} * d^2 / 4.;&lt;br /&gt;
&lt;br /&gt;
	vol_eqn: V = A * h;&lt;br /&gt;
	rho IS_A mass_density;&lt;br /&gt;
&lt;br /&gt;
	m IS_A mass;&lt;br /&gt;
	mass_eqn: m = rho*V;&lt;br /&gt;
&lt;br /&gt;
METHODS&lt;br /&gt;
METHOD on_load;&lt;br /&gt;
	FIX d, h, rho;&lt;br /&gt;
&lt;br /&gt;
	d := 50 {cm};&lt;br /&gt;
	h := 90 {cm};&lt;br /&gt;
&lt;br /&gt;
	rho := 1000 {kg/m^3};&lt;br /&gt;
END on_load;&lt;br /&gt;
END tank;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This model declares variables and equations in the &#039;main&#039; part of the model. Then, in a method called &#039;on_load&#039;, the model specifies that the variables &amp;lt;tt&amp;gt;d&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;h&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;rho&amp;lt;/tt&amp;gt; will be &#039;fixed&#039;, and provides their values.&lt;br /&gt;
&lt;br /&gt;
This model can be loaded into ASCEND, usually just by double-clicking the file, then solved by hitting the &#039;solve&#039; button, with the following result:&lt;br /&gt;
&lt;br /&gt;
[[Image:simple-tank-example.png]]&lt;br /&gt;
&lt;br /&gt;
This is a very simple model: there is much more that ASCEND can do. For example, &#039;&#039;&#039;without editing the above model file&#039;&#039;&#039;, one can use the GUI to &#039;fix&#039; the volume and diameter of the tank and solve instead for the height, with just a couple of clicks, then resolve for a new tank volume of 200 L:&lt;br /&gt;
&lt;br /&gt;
[[Image:simple-tank2.png]]&lt;br /&gt;
&lt;br /&gt;
For models like this, ASCEND can quickly show you how it&#039;s solving the equation, using a simple graph representation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:solve-order.png]]&lt;br /&gt;
&lt;br /&gt;
Simple models like this can be useful and quite efficient ways to inspect the behaviour of simple systems of equations. They can also be useful as quick &#039;calculators&#039;: they can be loaded, the known variables typed in, and the solved results quickly seen.&lt;br /&gt;
&lt;br /&gt;
ASCEND provides a way to keep tables of &#039;observed&#039; values and plot relationships between variables:&lt;br /&gt;
&lt;br /&gt;
[[Image:observer.png]][[Image:observer-plot.png]]&lt;br /&gt;
&lt;br /&gt;
Note that ASCEND is dealing with [[units of measurement]] clearly and transparently. In ASCEND you never have to worry about &#039;getting the units right&#039; because it understands how to convert between different units like in, ft, cm, m, km for length and L, m³ etc for volume.&lt;br /&gt;
&lt;br /&gt;
To learn more about the ASCEND modelling language and how it can be used to build up models, see the [[Thin Walled Tank]] tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== More complex models ==&lt;br /&gt;
&lt;br /&gt;
Simple models like this are useful, but serious problems, especially in process engineering and mechanical engineering often involve more complex interactions, often with multiple subsystems, interconnected parts, and so on. In this case, ASCEND provides a number of [[object-oriented modelling]] capabilities, allowing more complicated models to be declared, such as this simple steam power station (Rankine cycle) simulation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;REQUIRE &amp;amp;quot;johnpye/rankine.a4c&amp;amp;quot;;&lt;br /&gt;
MODEL power_station;&lt;br /&gt;
&lt;br /&gt;
	(* sub-models *)&lt;br /&gt;
	BO IS_A boiler_simple;&lt;br /&gt;
	TU IS_A turbine_simple;&lt;br /&gt;
&lt;br /&gt;
	CO IS_A condenser_simple;&lt;br /&gt;
	PU IS_A pump_simple;&lt;br /&gt;
&lt;br /&gt;
	(* variable &#039;alias&#039; for convenience *)&lt;br /&gt;
&lt;br /&gt;
	mdot ALIASES TU.mdot;&lt;br /&gt;
&lt;br /&gt;
	(* connections *)&lt;br /&gt;
	BO.outlet, TU.inlet ARE_THE_SAME;&lt;br /&gt;
&lt;br /&gt;
	TU.outlet, CO.inlet ARE_THE_SAME;&lt;br /&gt;
	CO.outlet, PU.inlet ARE_THE_SAME;&lt;br /&gt;
&lt;br /&gt;
	PU.outlet, BO.inlet ARE_THE_SAME;&lt;br /&gt;
&lt;br /&gt;
	(* overall cycle efficiency *)&lt;br /&gt;
	eta IS_A fraction;&lt;br /&gt;
&lt;br /&gt;
	eta * (BO.Qdot_fuel - PU.Wdot) = TU.Wdot;&lt;br /&gt;
&lt;br /&gt;
METHODS&lt;br /&gt;
METHOD specify;&lt;br /&gt;
	RUN ClearAll;&lt;br /&gt;
	FIX PU.outlet.p, BO.outlet.T, PU.inlet.p, PU.inlet.h, TU.eta, PU.eta, BO.eta, mdot;&lt;br /&gt;
&lt;br /&gt;
END specify;&lt;br /&gt;
METHOD values;&lt;br /&gt;
	mdot := 900 {t/d};&lt;br /&gt;
&lt;br /&gt;
	PU.outlet.p := 2000 {psi};&lt;br /&gt;
	BO.outlet.T := 1460 {R};   BO.outlet.h := 3400 {kJ/kg};&lt;br /&gt;
&lt;br /&gt;
	PU.inlet.p := 1 {psi};     PU.inlet.h := 69.73 {btu/lbm};&lt;br /&gt;
&lt;br /&gt;
	TU.eta := 1.0;             PU.eta := 1.0;             BO.eta := 1.0;&lt;br /&gt;
&lt;br /&gt;
END values;&lt;br /&gt;
METHOD on_load;&lt;br /&gt;
	RUN specify;&lt;br /&gt;
	RUN values;&lt;br /&gt;
&lt;br /&gt;
END on_load;&lt;br /&gt;
END power_station;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This model makes use of several sub-parts such as &#039;pump_simple&#039; and so on, which are defined in another file called &#039;rankine.a4c&#039; pointed to via the [[REQUIRE]] statement. More documentation [[Category:Syntax|about the syntax]] is available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using this style of modular model, it is possible to build and test simple component models, then &#039;wire them up&#039; into more complex models. This is something that is very difficult to do with standard spreadsheet models as commonly used by engineers. With a library of standard component models at your disposal, you can get working sooner on the complex problems which you have before you.&lt;br /&gt;
&lt;br /&gt;
See [[Object-oriented modelling]] for a summary of language features that help in writing more complex models. You might also be interested in our thoughts about [[Modelling with Spreadsheets]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Solvers and integrators ==&lt;br /&gt;
&lt;br /&gt;
The basic engineering calculation being represented in the above examples is a simple &amp;quot;solve for &#039;x&#039;&amp;quot; type of problem, for which ASCEND uses its [[QRSlv]] solver. For these problems ASCEND orders the equations, then uses [http://en.wikipedia.org/wiki/Newton%27s_method Newton&#039;s method] to iteratively solve any sets of simultaneous equations present in the system. However not all engineering problems are like this. Other types of problems can also be solved using ASCEND:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Optimisation|Optimisation problems]], where an objective value must be minimised by varying a set of input variables (see [[CONOPT]], [[IPOPT]])&lt;br /&gt;
* [[ODE]] and [[DAE]] problems, where the behaviour of a time-varying system is to be studied (see [[LSODE]], [[IDA]])&lt;br /&gt;
* [[Conditional_modelling|Conditional models]], where the applicable equations depend on the value or values of other variables in the model (see [[CMSlv]])&lt;br /&gt;
&lt;br /&gt;
The ASCEND GUI allows you to load a model then select a suitable &#039;solver&#039; or &#039;integrator&#039; according to the type of problem that you have. Several solvers are already included with ASCEND, and the API allows you to write new solvers without having to dig into the innards of ASCEND.&lt;br /&gt;
&lt;br /&gt;
ASCEND can show you the model structure as &#039;viewed&#039; by the solver. For example, using [[QRSlv]], the simple Rankine-cycle model has the following lower-triangular [[incidence matrix]] structure, which indicates that no iterative solving is needed:&lt;br /&gt;
&lt;br /&gt;
[[Image:rankine-incidence.png]]&lt;br /&gt;
&lt;br /&gt;
See [[Solvers]] and [[Dynamic modelling]] for more information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Thermodynamics ==&lt;br /&gt;
&lt;br /&gt;
An area where process engineers often run into difficulty with modelling is in incorporating the thermodynamic properties of fluids in their models. ASCEND provides some simple thermodynamics capabilities, which have proven sufficient for modelling distillation and flash problems in chemical engineering, and also integrates with high-accuracy IAPWS-IF97 steam tables for use in power engineering applications.&lt;br /&gt;
&lt;br /&gt;
See [[Thermodynamics with ASCEND]], [[FPROPS]] and [[Steam properties]] for more information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extending ASCEND ==&lt;br /&gt;
&lt;br /&gt;
ASCEND can be extended in a number of ways, using [[external libraries]]. These are pieces of code that ASCEND loads on request. They can be:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[External Methods]], doing procedural stuff to models&lt;br /&gt;
* [[external relations]], adding new equations to the model, such as complex thermodynamic property relationships&lt;br /&gt;
* [[External Solvers]], that solve a model, according to the programmer&#039;s definition of &#039;solve&#039;&amp;amp;nbsp;:-)&lt;br /&gt;
* [[external Integrators]], that integrate a model (ie solve for the dynamic response of a system; solve an inital value problem)&lt;br /&gt;
&lt;br /&gt;
External libraries are normally written in C/C++, but we have implemented support for also writing external methods using Python.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Scripting and automation ==&lt;br /&gt;
&lt;br /&gt;
ASCEND exposes its user interface at several different levels: C, C++ and Python. Usefully, this means that if you have a more complicated modelling problem than can be solved with the ASCEND GUI, you can write a Python script that loads your model and solves it in various ways: effectively you can &#039;drive&#039; ASCEND however you want, automatically.&lt;br /&gt;
&lt;br /&gt;
See [[Scripting ASCEND using Python]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Development of ASCEND ==&lt;br /&gt;
&lt;br /&gt;
ASCEND does enough things to be genuinely useful for engineers, students and scientists, and has an active user group. It was first written around 1978, and has been through several re-writes over that time. Its &#039;compiler&#039; (which converts the input file into a tree structure containing variables, submodels, and equations) as well as its solvers have been the subject of several PhDs and many features in ASCEND have since been incorporated into commercial simulation programs. Development of ASCEND continues in exciting new directions however. We are working on adding new solvers as well as improving ASCEND&#039;s support for solving ODEs and DAEs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are interested in contributing to ASCEND, please see our [[Development Activities]] page and also our list of [[Student Projects]]. We have been accepted to participate in the the 2009Google Summer of Code, so you might even be able to get paid!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=MediaWiki:Sidebar&amp;diff=383</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=MediaWiki:Sidebar&amp;diff=383"/>
		<updated>2010-05-17T01:56:23Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** ASCEND overview|Overview&lt;br /&gt;
** :Category:Documentation|Documentation&lt;br /&gt;
** Screenshots|Screenshots&lt;br /&gt;
** Publications|Publications&lt;br /&gt;
** :Category:Development|Development&lt;br /&gt;
** Mailing list|Mailing list&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* tools&lt;br /&gt;
** http://ascendbugs.cheme.cmu.edu/|bug tracker&lt;br /&gt;
** [[ASCEND code repository]]|svn info&lt;br /&gt;
** http://ascendcode.cheme.cmu.edu/|browse code&lt;br /&gt;
** code docs&lt;br /&gt;
** https://sourceforge.net/export/rss2_keepsake.php?group_id=167528|newsfeed &lt;br /&gt;
** https://sourceforge.net/projects/ascend-sim/|sourceforge&lt;br /&gt;
** http://freshmeat.net/projects/ascend|freshmeat&lt;br /&gt;
** https://www.ohloh.net/p/ASCEND|ohloh&lt;br /&gt;
** https://launchpad.net/ascend|launchpad&lt;br /&gt;
** [[Miscellany]]|miscellany&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=MediaWiki:Sidebar&amp;diff=382</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=MediaWiki:Sidebar&amp;diff=382"/>
		<updated>2010-05-17T01:55:56Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** ASCEND overview|Overview&lt;br /&gt;
** [[:Category:Documentation]]|Documentation&lt;br /&gt;
** [[Screenshots]]|Screenshots&lt;br /&gt;
** [[Publications]]|Publications&lt;br /&gt;
** [[Category:Development]]|Development&lt;br /&gt;
** [[Mailing list]]|Mailing list&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* tools&lt;br /&gt;
** http://ascendbugs.cheme.cmu.edu/|bug tracker&lt;br /&gt;
** [[ASCEND code repository]]|svn info&lt;br /&gt;
** http://ascendcode.cheme.cmu.edu/|browse code&lt;br /&gt;
** code docs&lt;br /&gt;
** https://sourceforge.net/export/rss2_keepsake.php?group_id=167528|newsfeed &lt;br /&gt;
** https://sourceforge.net/projects/ascend-sim/|sourceforge&lt;br /&gt;
** http://freshmeat.net/projects/ascend|freshmeat&lt;br /&gt;
** https://www.ohloh.net/p/ASCEND|ohloh&lt;br /&gt;
** https://launchpad.net/ascend|launchpad&lt;br /&gt;
** [[Miscellany]]|miscellany&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=MediaWiki:Sidebar&amp;diff=381</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=MediaWiki:Sidebar&amp;diff=381"/>
		<updated>2010-05-17T01:55:31Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** [[ASCEND overview]]|Overview&lt;br /&gt;
** [[:Category:Documentation]]|Documentation&lt;br /&gt;
** [[Screenshots]]|Screenshots&lt;br /&gt;
** [[Publications]]|Publications&lt;br /&gt;
** [[Category:Development]]|Development&lt;br /&gt;
** [[Mailing list]]|Mailing list&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* tools&lt;br /&gt;
** http://ascendbugs.cheme.cmu.edu/|bug tracker&lt;br /&gt;
** [[ASCEND code repository]]|svn info&lt;br /&gt;
** http://ascendcode.cheme.cmu.edu/|browse code&lt;br /&gt;
** code docs&lt;br /&gt;
** https://sourceforge.net/export/rss2_keepsake.php?group_id=167528|newsfeed &lt;br /&gt;
** https://sourceforge.net/projects/ascend-sim/|sourceforge&lt;br /&gt;
** http://freshmeat.net/projects/ascend|freshmeat&lt;br /&gt;
** https://www.ohloh.net/p/ASCEND|ohloh&lt;br /&gt;
** https://launchpad.net/ascend|launchpad&lt;br /&gt;
** [[Miscellany]]|miscellany&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=John_Pye&amp;diff=328</id>
		<title>John Pye</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=John_Pye&amp;diff=328"/>
		<updated>2010-05-14T07:02:54Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Redirected page to User:Jpye&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User:Jpye]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;diff=327</id>
		<title>Controlling the solvers from within METHODS</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;diff=327"/>
		<updated>2010-05-14T07:02:39Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{task}}&lt;br /&gt;
The following new proposed syntax has been introduced into the ASCEND language in a developmental branch called slvreq, see [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/ascend/compiler/slvreq.h &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:ascend/compiler/slvreq.h].&lt;br /&gt;
&lt;br /&gt;
Support is added for three new statements relating to &#039;solver requests&#039; in the ASCEND language:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SOLVER&#039;&#039;&#039; to specify the solver that should be used.&lt;br /&gt;
* &#039;&#039;&#039;OPTION&#039;&#039;&#039; to specify values for options to be used during solving.&lt;br /&gt;
* &#039;&#039;&#039;SOLVE&#039;&#039;&#039; to actually trigger the user interface to go ahead and solve the MODEL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;MODEL mymodel;&lt;br /&gt;
    x,y IS_A solver_var;&lt;br /&gt;
&lt;br /&gt;
    y = x^2 - x*4 + 4;&lt;br /&gt;
&lt;br /&gt;
METHODS;&lt;br /&gt;
METHOD on_load;&lt;br /&gt;
    FIX y;&lt;br /&gt;
    y := 0;&lt;br /&gt;
&lt;br /&gt;
    SOLVER QRSlv;&lt;br /&gt;
    OPTION convopt &#039;RELNOM_SCALE&#039;;&lt;br /&gt;
    SOLVE;&lt;br /&gt;
END on_load;&lt;br /&gt;
&lt;br /&gt;
END mymodel;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SOLVER solvername;&lt;br /&gt;
OPTION optionname valuexpression;&lt;br /&gt;
SOLVE;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is proposed to additionally set the syntax for solving particular instances, perhaps as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SOLVER solvername WITH myinstance&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or else perhaps as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SOLVE myinstance&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both of these have implications for the GUI layer and how it organises itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
Up until now, the ASCEND language has been carefully designed to avoid polluting the model description with anything relating to actually &#039;&#039;solving&#039;&#039; models; solving was left as something that had to be externally directed, either by .a4s scripts, Python scripts, GUI clicks, or low-level C or C++ code. This has been frequently frustrating when using the PyGTK GUI, because that GUI promotes the idea of being able to just load a model and immediately solve it.&lt;br /&gt;
&lt;br /&gt;
However, many models won&#039;t just solve with a simple click of the &#039;solve&#039; button. Some models need specific solvers to be selected first, and other models will only solve if suitable values of the solver parameters are defined. Neither of these things can be done from within the modelling language, so the result is that the write-test-debug loop for model-making has required the user to either do a lot of spurious clicking to set options each time, or else to write a script to &#039;drive&#039; ASCEND with the correct settings. Neither of these are particularly user-friendly; [[John Pye]] thinks it should be possible for the user to do &#039;everything they want&#039; from within a single modelling file.&lt;br /&gt;
&lt;br /&gt;
[[Ben Allan]] has pointed out that such a goal (doing &#039;everything you want&#039; from within an .a4c file) is unreasonable, because the syntax available within [[METHOD|METHODs]] is too limited to allow anything very sophisticated, and we don&#039;t want to develop a full-blown language there. That&#039;s a fair point, but the addition of these commands is seen as being so advantageous to user experience that John Pye thought it was worth attempting, regardless.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
Implementation of this was complicated, because of the deliberate separation of concerns in ASCEND. We have the &#039;&#039;&#039;instance tree&#039;&#039;&#039; which is manipulated by [[METHOD|METHODs]], then we have a &#039;&#039;&#039;slv_system_t&#039;&#039;&#039; which is built (by &#039;&#039;&#039;system_build&#039;&#039;&#039;), and then a &#039;&#039;&#039;solver&#039;&#039;&#039; essentially just visits that slv_system_t object in order to solve the model. The solver and its associated parameters exist outside the instance tree, making it hard for a METHOD, which works within the instance tree, to access those things.&lt;br /&gt;
&lt;br /&gt;
A new pointer was added to the &amp;lt;tt&amp;gt;SimulationInstance&amp;lt;/tt&amp;gt; object, called &amp;lt;tt&amp;gt;slvreq_hooks&amp;lt;/tt&amp;gt;, allowing an ASCEND &#039;driver&#039; (GUI, command-line interface, test suite, etc) to provide hook functions (via a call to &amp;lt;tt&amp;gt;slvreq_assign_hooks&amp;lt;/tt&amp;gt;) to which the different SOLVER, OPTION and SOLVE commands could be passed. What those commands then do is left entirely up to the &#039;driver&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Whenever the SOLVER command is encountered, it eventually finds its way to a call to &amp;lt;tt&amp;gt;slvreq_set_solver&amp;lt;/tt&amp;gt;. This function locates the slvreq_hooks object in the SimulationInstance, and then, if available, runs the &amp;lt;tt&amp;gt;set_solver_fn&amp;lt;/tt&amp;gt; hook function (hopefully) earlier provided by the &#039;driver&#039;.&lt;br /&gt;
&lt;br /&gt;
The OPTION allows an expression to be provided as its argument. This expression is first evaluated, returning a &#039;value_t&#039; structure. This value is then passed to &amp;lt;tt&amp;gt;slvreq_set_option&amp;lt;/tt&amp;gt;, which then runs the &amp;lt;tt&amp;gt;set_option_fn&amp;lt;/tt&amp;gt; hook function earlier assigned, if available. &lt;br /&gt;
&lt;br /&gt;
When the SOLVE command is executed, it calls &amp;lt;tt&amp;gt;slvreq_do_solve&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;do_solve_fn&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is currently no support for solving any MODEL other than that returned from &amp;amp;lt;/tt&amp;amp;gt;GetSimulationRoot&amp;amp;lt;/tt&amp;amp;gt;. Support for this seems to be a little difficult to design.&lt;br /&gt;
&lt;br /&gt;
As mentioned above, how these functions work exactly is up to the &#039;driver&#039; to define. Some standard error codes are defined, so that the &amp;lt;tt&amp;gt;Initialize&amp;lt;/tt&amp;gt; function in [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/ascend/compiler/initialize.c &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:ascend/compiler/initialize.c] is able to make sensible error messages for the user. But otherwise, the &#039;driver&#039; gets to decide.&lt;br /&gt;
&lt;br /&gt;
In order to allow the &#039;driver&#039; to store implementation-dependent data along with the &amp;lt;tt&amp;gt;slvreq_hooks&amp;lt;/tt&amp;gt;, a &amp;lt;tt&amp;gt;user_data&amp;lt;/tt&amp;gt; pointer can be provided when the hooks are assigned. This user_data parameter is then provided back the driver whenever any of those hook functions are actually called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sample driver: test_slvreq.c==&lt;br /&gt;
&lt;br /&gt;
A sample &#039;driver&#039; implementation with support for the &amp;lt;tt&amp;gt;slvreq&amp;lt;/tt&amp;gt; functions is [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/ascend/compiler/test/test_slvreq.c &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:ascend/compiler/test/test_slvreq.c]. This implementation works as follows&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* SimulationInstance-&amp;amp;gt;slvreq_hooks points to a structure containing the simulation instance pointer together with (optionally) a &amp;lt;tt&amp;gt;slv_system_t&amp;lt;/tt&amp;gt; object, &#039;&#039;&#039;sys&#039;&#039;&#039;. If the system has been built this &#039;sys&#039; is non-NULL. Otherwise it is NULL. The system is built only once, when the first SOLVER statement is encountered.&lt;br /&gt;
* SOLVER command identifies the requested solver, calls &#039;system_build&#039; if necessary, then selects the found solver on the sys.&lt;br /&gt;
* OPTION command checks that system has been built, and searches for the requested option. If found, it sets the value, after first checking that the value provided in the METHOD matches the value type declared in the &amp;lt;tt&amp;gt;slv_parameter&amp;lt;/tt&amp;gt; structure.&lt;br /&gt;
* SOLVE runs &amp;lt;tt&amp;gt;slv_solve&amp;lt;/tt&amp;gt; on the sys, and returns error flags back as needed.&lt;br /&gt;
* The main driver is the function &amp;lt;tt&amp;gt;test_slvreq_c&amp;lt;/tt&amp;gt;. This essentially just loads a model, instantiates the instance tree, assigned the slvreq hooks, then runs the &#039;on_load&#039; method.&lt;br /&gt;
&lt;br /&gt;
==Connecting &#039;slvreq&#039; to the C++ layer==&lt;br /&gt;
&lt;br /&gt;
Connecting the &#039;slvreq&#039; mechanism to the C++ layer was a bit more complicated. A SolverHooksManager singleton was created which can be assigned with a SolverHooks object. The SolverHooks object has virtual methods for setSolver, setOption, and doSolve. This can be sub-classed according to the user interface. A C++-only test was made ([http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/pygtk/testslvreq.cpp &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:pygtk/testslvreq.cpp] to demonstrate this code in use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;int main(void){&lt;br /&gt;
&lt;br /&gt;
	SolverReporter R;&lt;br /&gt;
	SolverHooks H(R);&lt;br /&gt;
	SolverHooksManager::Instance()-&amp;amp;gt;setHooks(&amp;amp;amp;H);&lt;br /&gt;
&lt;br /&gt;
	Library L;&lt;br /&gt;
	L.load(&amp;amp;quot;test/slvreq/test1.a4c&amp;amp;quot;);&lt;br /&gt;
	Type t = L.findType(&amp;amp;quot;test1&amp;amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	Simulation S = t.getSimulation(&amp;amp;quot;S&amp;amp;quot;);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this implementation, the SolverHooks can be instantiated with a SolverReporter, so that this SolverReporter can be passed by the doSolve when it makes its call to Simulation::solve(solver,solverreporter). If no SolverReporter or SolverHooks are set, then the SolverHooksManager instantiates a default fallback implementation. To get different behaviour, one sub-classes SolverHooks and uses the setHooks call to register the solver hooks that you want, see [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/pygtk/solverhooks.h &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:pygtk/solverhooks.h]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Connecting &#039;slvreq&#039; to the Python layer==&lt;br /&gt;
&lt;br /&gt;
The &#039;slvreq&#039; functionality is connected to ASCEND&#039;s Python API using the SWIG &#039;director&#039; functionality. This allows the class SolverHooks from the C++ layer to be sub-classed in the Python layer, and the additional of Python-specific or GUI-specific stuff to be done as required.&lt;br /&gt;
&lt;br /&gt;
Here is a first sketch of how this functionality would look from Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;class PythonSolverHooks(ascpy.SolverHooks):&lt;br /&gt;
&lt;br /&gt;
  def __init__(self):&lt;br /&gt;
    self.mysolver = None&lt;br /&gt;
  def setSolver(name):&lt;br /&gt;
&lt;br /&gt;
    self.mysolver = ascpy.Solver(name)&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
  def doSolve(inst, sim):&lt;br /&gt;
    sim.solve(self.mysolver,PythonSolverReporter())&lt;br /&gt;
&lt;br /&gt;
  def setParam(*params):&lt;br /&gt;
    return ascpy.SLVREQ_NOT_IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
self.L.load(&#039;mymodelfile.a4c&#039;)&lt;br /&gt;
&lt;br /&gt;
ascpy.SolverHooksManager_Instance().setHooks(PythonSolverHooks())&lt;br /&gt;
T = self.L.findType(&#039;mymodel&#039;)&lt;br /&gt;
&lt;br /&gt;
M = T.getSimulation(&#039;sim&#039;,False)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This functionality still needs a little re-thinking. In fact, it should not be necessary to pass solver and reporter parameters during the &#039;sim.solve&#039; call, because the SolverParameters are actually stored in the &#039;sys&#039; within the &#039;Simulation&#039;, so passing in a new solver is just ambiguous and strange.&lt;br /&gt;
&lt;br /&gt;
However, this is now tested; you can see the test code in [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/test.py &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:test.py].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Problems and questions==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem:&#039;&#039;&#039; some effort was made (simlist.c) to implement support for multiple SimulationInstances per instance tree. This has never been fully realised (and the merits of this idea are not yet completely clear to me). But the the current slvreq depends crucially on the fact that, within a running METHOD, it&#039;s possible to determine what is the current SimulationInstance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question:&#039;&#039;&#039; in some modelling environments, it is possible to define &#039;subsolvers&#039;. For example, a conditional solver might be able to make use of either [[CONOPT]] or [[IPOPT]] for optimisation, so it might be necessary to provide syntax that would work for this case. Or an optimisation solver might be wrapper around a dynamic solver. Can we support that? What changes would be required?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question:&#039;&#039;&#039; is it OK to associate the hook functions with the SimulationInstance? Is there any case where this data should be stored somewhere else?&lt;br /&gt;
&lt;br /&gt;
See also [[Solver NOTES]], another proposed solution to this problem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==GUI integration==&lt;br /&gt;
{{outdated-section}}&lt;br /&gt;
&lt;br /&gt;
This syntax has not yet been incorporated into the ASCEND PyGTK or Tcl/Tk GUI. As a result it&#039;s not yet generally usable. The proposed GUI integration flow is something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GUI is started&lt;br /&gt;
* GUI loads a model&lt;br /&gt;
* GUI instantiates model&lt;br /&gt;
* GUI runs &amp;lt;tt&amp;gt;slvreq_register_hooks&amp;lt;/tt&amp;gt;&lt;br /&gt;
* libascend stores register hooks in SimulationInstance&lt;br /&gt;
* GUI requests &#039;on_load&#039; method to be run.&lt;br /&gt;
* libascend starts executing method statements&lt;br /&gt;
* libascend encounters &#039;USE&#039; statement.&lt;br /&gt;
* libascend locates SimulationInstance and find slvreq_hooks object.&lt;br /&gt;
* libascend runs slvreq_hooks-&amp;amp;gt;set_solver_fn.&lt;br /&gt;
* GUI received request to set solver&lt;br /&gt;
* GUI checks that solver is elegible for this problem&lt;br /&gt;
* GUI sets solver as requests (or writes an error message and returns error code)&lt;br /&gt;
* libascend proceeds with more method statements&lt;br /&gt;
* libascend find &#039;SET&#039; statment&lt;br /&gt;
* libascend runs slvreq_hooks-&amp;amp;gt;set_param_fn (passes string value of requested solver parameter to GUI)&lt;br /&gt;
* GUI receives reqest&lt;br /&gt;
* GUI either&lt;br /&gt;
** finds that solvername.parametername is valid, and sets the parameter (after casting it to the appropriate type)&lt;br /&gt;
** finds that solvername.parametername is not valid, and returns an error code&lt;br /&gt;
** finds that solvername.parametername is valid, and sets the parameter (after casting it to the appropriate type)&lt;br /&gt;
** finds that solvername.parametername is not valid, and returns an error code&lt;br /&gt;
* finds that solvername.parametername is valid, and sets the parameter (after casting it to the appropriate type)&lt;br /&gt;
* finds that solvername.parametername is not valid, and returns an error code&lt;br /&gt;
* libascend proceeds with more METHOD statments...&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;diff=326</id>
		<title>Controlling the solvers from within METHODS</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;diff=326"/>
		<updated>2010-05-14T07:01:10Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{task}} The following new proposed syntax has been introduced into the ASCEND language in a developmental branch called slvreq, see [http://ascendcode.cheme.cmu.edu/viewvc.cgi/c…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{task}}&lt;br /&gt;
The following new proposed syntax has been introduced into the ASCEND language in a developmental branch called slvreq, see [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/ascend/compiler/slvreq.h &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:ascend/compiler/slvreq.h].&lt;br /&gt;
&lt;br /&gt;
Support is added for three new statements relating to &#039;solver requests&#039; in the ASCEND language:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SOLVER&#039;&#039;&#039; to specify the solver that should be used.&lt;br /&gt;
* &#039;&#039;&#039;OPTION&#039;&#039;&#039; to specify values for options to be used during solving.&lt;br /&gt;
* &#039;&#039;&#039;SOLVE&#039;&#039;&#039; to actually trigger the user interface to go ahead and solve the MODEL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;MODEL mymodel;&lt;br /&gt;
    x,y IS_A solver_var;&lt;br /&gt;
&lt;br /&gt;
    y = x^2 - x*4 + 4;&lt;br /&gt;
&lt;br /&gt;
METHODS;&lt;br /&gt;
METHOD on_load;&lt;br /&gt;
    FIX y;&lt;br /&gt;
    y := 0;&lt;br /&gt;
&lt;br /&gt;
    SOLVER QRSlv;&lt;br /&gt;
    OPTION convopt &#039;RELNOM_SCALE&#039;;&lt;br /&gt;
    SOLVE;&lt;br /&gt;
END on_load;&lt;br /&gt;
&lt;br /&gt;
END mymodel;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=1&amp;quot; title=&amp;quot;Edit section: Syntax&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SOLVER solvername;&lt;br /&gt;
OPTION optionname valuexpression;&lt;br /&gt;
SOLVE;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is proposed to additionally set the syntax for solving particular instances, perhaps as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SOLVER solvername WITH myinstance&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or else perhaps as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SOLVE myinstance&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both of these have implications for the GUI layer and how it organises itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=2&amp;quot; title=&amp;quot;Edit section: Motivation&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
&lt;br /&gt;
Up until now, the ASCEND language has been carefully designed to avoid polluting the model description with anything relating to actually &#039;&#039;solving&#039;&#039; models; solving was left as something that had to be externally directed, either by .a4s scripts, Python scripts, GUI clicks, or low-level C or C++ code. This has been frequently frustrating when using the PyGTK GUI, because that GUI promotes the idea of being able to just load a model and immediately solve it.&lt;br /&gt;
&lt;br /&gt;
However, many models won&#039;t just solve with a simple click of the &#039;solve&#039; button. Some models need specific solvers to be selected first, and other models will only solve if suitable values of the solver parameters are defined. Neither of these things can be done from within the modelling language, so the result is that the write-test-debug loop for model-making has required the user to either do a lot of spurious clicking to set options each time, or else to write a script to &#039;drive&#039; ASCEND with the correct settings. Neither of these are particularly user-friendly; [[John Pye]] thinks it should be possible for the user to do &#039;everything they want&#039; from within a single modelling file.&lt;br /&gt;
&lt;br /&gt;
[[Ben Allan]] has pointed out that such a goal (doing &#039;everything you want&#039; from within an .a4c file) is unreasonable, because the syntax available within [[METHOD|METHODs]] is too limited to allow anything very sophisticated, and we don&#039;t want to develop a full-blown language there. That&#039;s a fair point, but the addition of these commands is seen as being so advantageous to user experience that John Pye thought it was worth attempting, regardless.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=3&amp;quot; title=&amp;quot;Edit section: Implementation&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
&lt;br /&gt;
Implementation of this was complicated, because of the deliberate separation of concerns in ASCEND. We have the &#039;&#039;&#039;instance tree&#039;&#039;&#039; which is manipulated by [[METHOD|METHODs]], then we have a &#039;&#039;&#039;slv_system_t&#039;&#039;&#039; which is built (by &#039;&#039;&#039;system_build&#039;&#039;&#039;), and then a &#039;&#039;&#039;solver&#039;&#039;&#039; essentially just visits that slv_system_t object in order to solve the model. The solver and its associated parameters exist outside the instance tree, making it hard for a METHOD, which works within the instance tree, to access those things.&lt;br /&gt;
&lt;br /&gt;
A new pointer was added to the &amp;lt;tt&amp;gt;SimulationInstance&amp;lt;/tt&amp;gt; object, called &amp;lt;tt&amp;gt;slvreq_hooks&amp;lt;/tt&amp;gt;, allowing an ASCEND &#039;driver&#039; (GUI, command-line interface, test suite, etc) to provide hook functions (via a call to &amp;lt;tt&amp;gt;slvreq_assign_hooks&amp;lt;/tt&amp;gt;) to which the different SOLVER, OPTION and SOLVE commands could be passed. What those commands then do is left entirely up to the &#039;driver&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Whenever the SOLVER command is encountered, it eventually finds its way to a call to &amp;lt;tt&amp;gt;slvreq_set_solver&amp;lt;/tt&amp;gt;. This function locates the slvreq_hooks object in the SimulationInstance, and then, if available, runs the &amp;lt;tt&amp;gt;set_solver_fn&amp;lt;/tt&amp;gt; hook function (hopefully) earlier provided by the &#039;driver&#039;.&lt;br /&gt;
&lt;br /&gt;
The OPTION allows an expression to be provided as its argument. This expression is first evaluated, returning a &#039;value_t&#039; structure. This value is then passed to &amp;lt;tt&amp;gt;slvreq_set_option&amp;lt;/tt&amp;gt;, which then runs the &amp;lt;tt&amp;gt;set_option_fn&amp;lt;/tt&amp;gt; hook function earlier assigned, if available. &lt;br /&gt;
&lt;br /&gt;
When the SOLVE command is executed, it calls &amp;lt;tt&amp;gt;slvreq_do_solve&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;do_solve_fn&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is currently no support for solving any MODEL other than that returned from &amp;amp;lt;/tt&amp;amp;gt;GetSimulationRoot&amp;amp;lt;/tt&amp;amp;gt;. Support for this seems to be a little difficult to design.&lt;br /&gt;
&lt;br /&gt;
As mentioned above, how these functions work exactly is up to the &#039;driver&#039; to define. Some standard error codes are defined, so that the &amp;lt;tt&amp;gt;Initialize&amp;lt;/tt&amp;gt; function in [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/ascend/compiler/initialize.c &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:ascend/compiler/initialize.c] is able to make sensible error messages for the user. But otherwise, the &#039;driver&#039; gets to decide.&lt;br /&gt;
&lt;br /&gt;
In order to allow the &#039;driver&#039; to store implementation-dependent data along with the &amp;lt;tt&amp;gt;slvreq_hooks&amp;lt;/tt&amp;gt;, a &amp;lt;tt&amp;gt;user_data&amp;lt;/tt&amp;gt; pointer can be provided when the hooks are assigned. This user_data parameter is then provided back the driver whenever any of those hook functions are actually called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=4&amp;quot; title=&amp;quot;Edit section: Sample driver: test_slvreq.c&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
&lt;br /&gt;
A sample &#039;driver&#039; implementation with support for the &amp;lt;tt&amp;gt;slvreq&amp;lt;/tt&amp;gt; functions is [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/ascend/compiler/test/test_slvreq.c &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:ascend/compiler/test/test_slvreq.c]. This implementation works as follows&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* SimulationInstance-&amp;amp;gt;slvreq_hooks points to a structure containing the simulation instance pointer together with (optionally) a &amp;lt;tt&amp;gt;slv_system_t&amp;lt;/tt&amp;gt; object, &#039;&#039;&#039;sys&#039;&#039;&#039;. If the system has been built this &#039;sys&#039; is non-NULL. Otherwise it is NULL. The system is built only once, when the first SOLVER statement is encountered.&lt;br /&gt;
* SOLVER command identifies the requested solver, calls &#039;system_build&#039; if necessary, then selects the found solver on the sys.&lt;br /&gt;
* OPTION command checks that system has been built, and searches for the requested option. If found, it sets the value, after first checking that the value provided in the METHOD matches the value type declared in the &amp;lt;tt&amp;gt;slv_parameter&amp;lt;/tt&amp;gt; structure.&lt;br /&gt;
* SOLVE runs &amp;lt;tt&amp;gt;slv_solve&amp;lt;/tt&amp;gt; on the sys, and returns error flags back as needed.&lt;br /&gt;
* The main driver is the function &amp;lt;tt&amp;gt;test_slvreq_c&amp;lt;/tt&amp;gt;. This essentially just loads a model, instantiates the instance tree, assigned the slvreq hooks, then runs the &#039;on_load&#039; method.&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=5&amp;quot; title=&amp;quot;Edit section: Connecting &#039;slvreq&#039; to the C++ layer&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
&lt;br /&gt;
Connecting the &#039;slvreq&#039; mechanism to the C++ layer was a bit more complicated. A SolverHooksManager singleton was created which can be assigned with a SolverHooks object. The SolverHooks object has virtual methods for setSolver, setOption, and doSolve. This can be sub-classed according to the user interface. A C++-only test was made ([http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/pygtk/testslvreq.cpp &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:pygtk/testslvreq.cpp] to demonstrate this code in use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;int main(void){&lt;br /&gt;
&lt;br /&gt;
	SolverReporter R;&lt;br /&gt;
	SolverHooks H(R);&lt;br /&gt;
	SolverHooksManager::Instance()-&amp;amp;gt;setHooks(&amp;amp;amp;H);&lt;br /&gt;
&lt;br /&gt;
	Library L;&lt;br /&gt;
	L.load(&amp;amp;quot;test/slvreq/test1.a4c&amp;amp;quot;);&lt;br /&gt;
	Type t = L.findType(&amp;amp;quot;test1&amp;amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	Simulation S = t.getSimulation(&amp;amp;quot;S&amp;amp;quot;);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this implementation, the SolverHooks can be instantiated with a SolverReporter, so that this SolverReporter can be passed by the doSolve when it makes its call to Simulation::solve(solver,solverreporter). If no SolverReporter or SolverHooks are set, then the SolverHooksManager instantiates a default fallback implementation. To get different behaviour, one sub-classes SolverHooks and uses the setHooks call to register the solver hooks that you want, see [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/pygtk/solverhooks.h &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:pygtk/solverhooks.h]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=6&amp;quot; title=&amp;quot;Edit section: Connecting &#039;slvreq&#039; to the Python layer&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
&lt;br /&gt;
The &#039;slvreq&#039; functionality is connected to ASCEND&#039;s Python API using the SWIG &#039;director&#039; functionality. This allows the class SolverHooks from the C++ layer to be sub-classed in the Python layer, and the additional of Python-specific or GUI-specific stuff to be done as required.&lt;br /&gt;
&lt;br /&gt;
Here is a first sketch of how this functionality would look from Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;a4c&amp;quot;&amp;gt;class PythonSolverHooks(ascpy.SolverHooks):&lt;br /&gt;
&lt;br /&gt;
  def __init__(self):&lt;br /&gt;
    self.mysolver = None&lt;br /&gt;
  def setSolver(name):&lt;br /&gt;
&lt;br /&gt;
    self.mysolver = ascpy.Solver(name)&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
  def doSolve(inst, sim):&lt;br /&gt;
    sim.solve(self.mysolver,PythonSolverReporter())&lt;br /&gt;
&lt;br /&gt;
  def setParam(*params):&lt;br /&gt;
    return ascpy.SLVREQ_NOT_IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
self.L.load(&#039;mymodelfile.a4c&#039;)&lt;br /&gt;
&lt;br /&gt;
ascpy.SolverHooksManager_Instance().setHooks(PythonSolverHooks())&lt;br /&gt;
T = self.L.findType(&#039;mymodel&#039;)&lt;br /&gt;
&lt;br /&gt;
M = T.getSimulation(&#039;sim&#039;,False)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This functionality still needs a little re-thinking. In fact, it should not be necessary to pass solver and reporter parameters during the &#039;sim.solve&#039; call, because the SolverParameters are actually stored in the &#039;sys&#039; within the &#039;Simulation&#039;, so passing in a new solver is just ambiguous and strange.&lt;br /&gt;
&lt;br /&gt;
However, this is now tested; you can see the test code in [http://ascendcode.cheme.cmu.edu/viewvc.cgi/code/branches/slvreq/test.py &amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;slvreq&amp;lt;/font&amp;gt;:test.py].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=7&amp;quot; title=&amp;quot;Edit section: Problems and questions&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem:&#039;&#039;&#039; some effort was made (simlist.c) to implement support for multiple SimulationInstances per instance tree. This has never been fully realised (and the merits of this idea are not yet completely clear to me). But the the current slvreq depends crucially on the fact that, within a running METHOD, it&#039;s possible to determine what is the current SimulationInstance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question:&#039;&#039;&#039; in some modelling environments, it is possible to define &#039;subsolvers&#039;. For example, a conditional solver might be able to make use of either [[CONOPT]] or [[IPOPT]] for optimisation, so it might be necessary to provide syntax that would work for this case. Or an optimisation solver might be wrapper around a dynamic solver. Can we support that? What changes would be required?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question:&#039;&#039;&#039; is it OK to associate the hook functions with the SimulationInstance? Is there any case where this data should be stored somewhere else?&lt;br /&gt;
&lt;br /&gt;
See also [[Solver NOTES]], another proposed solution to this problem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[&amp;lt;a href=&amp;quot;/index.php?title=Controlling_the_solvers_from_within_METHODS&amp;amp;amp;action=edit&amp;amp;amp;section=8&amp;quot; title=&amp;quot;Edit section: GUI integration&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;]==&lt;br /&gt;
{{outdated-section}}&lt;br /&gt;
&lt;br /&gt;
This syntax has not yet been incorporated into the ASCEND PyGTK or Tcl/Tk GUI. As a result it&#039;s not yet generally usable. The proposed GUI integration flow is something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GUI is started&lt;br /&gt;
* GUI loads a model&lt;br /&gt;
* GUI instantiates model&lt;br /&gt;
* GUI runs &amp;lt;tt&amp;gt;slvreq_register_hooks&amp;lt;/tt&amp;gt;&lt;br /&gt;
* libascend stores register hooks in SimulationInstance&lt;br /&gt;
* GUI requests &#039;on_load&#039; method to be run.&lt;br /&gt;
* libascend starts executing method statements&lt;br /&gt;
* libascend encounters &#039;USE&#039; statement.&lt;br /&gt;
* libascend locates SimulationInstance and find slvreq_hooks object.&lt;br /&gt;
* libascend runs slvreq_hooks-&amp;amp;gt;set_solver_fn.&lt;br /&gt;
* GUI received request to set solver&lt;br /&gt;
* GUI checks that solver is elegible for this problem&lt;br /&gt;
* GUI sets solver as requests (or writes an error message and returns error code)&lt;br /&gt;
* libascend proceeds with more method statements&lt;br /&gt;
* libascend find &#039;SET&#039; statment&lt;br /&gt;
* libascend runs slvreq_hooks-&amp;amp;gt;set_param_fn (passes string value of requested solver parameter to GUI)&lt;br /&gt;
* GUI receives reqest&lt;br /&gt;
* GUI either&lt;br /&gt;
** finds that solvername.parametername is valid, and sets the parameter (after casting it to the appropriate type)&lt;br /&gt;
** finds that solvername.parametername is not valid, and returns an error code&lt;br /&gt;
** finds that solvername.parametername is valid, and sets the parameter (after casting it to the appropriate type)&lt;br /&gt;
** finds that solvername.parametername is not valid, and returns an error code&lt;br /&gt;
* finds that solvername.parametername is valid, and sets the parameter (after casting it to the appropriate type)&lt;br /&gt;
* finds that solvername.parametername is not valid, and returns an error code&lt;br /&gt;
* libascend proceeds with more METHOD statments...&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=WITH_VALUE&amp;diff=325</id>
		<title>WITH VALUE</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=WITH_VALUE&amp;diff=325"/>
		<updated>2010-05-14T06:58:43Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:WITH_VALUE}}&lt;br /&gt;
{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=WITH_VALUE&amp;diff=324</id>
		<title>WITH VALUE</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=WITH_VALUE&amp;diff=324"/>
		<updated>2010-05-14T06:58:16Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[DISPLAYTITLE|WITH_VALUE]]&lt;br /&gt;
{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=WITH_VALUE&amp;diff=323</id>
		<title>WITH VALUE</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=WITH_VALUE&amp;diff=323"/>
		<updated>2010-05-14T06:58:02Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{DISPLAYTITLE|WITH_VALUE}} {{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE|WITH_VALUE}}&lt;br /&gt;
{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=ABsolver&amp;diff=322</id>
		<title>ABsolver</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=ABsolver&amp;diff=322"/>
		<updated>2010-05-14T06:57:34Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} {{task}}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
{{task}}&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Template:Solvers&amp;diff=321</id>
		<title>Template:Solvers</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Template:Solvers&amp;diff=321"/>
		<updated>2010-05-14T06:57:09Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| border=&amp;quot;1&amp;quot; align=&amp;quot;right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;[[NLA]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[QRSlv]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[CMSlv]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;pink&amp;quot;|&#039;&#039;&#039;[[IPSlv]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#DDDDDD&amp;quot;|&#039;&#039;&#039;[[Opt]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;[[NLA]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[CONOPT]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[IPOPT]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#DDDDDD&amp;quot;|&#039;&#039;&#039;[[TRON]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#DDDDDD&amp;quot;|&#039;&#039;&#039;[[MINOS]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;pink&amp;quot;|&#039;&#039;&#039;[[NGSlv]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;pink&amp;quot;|&#039;&#039;&#039;[[OptSQP]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;[[DAE]]&#039;&#039;&#039;/&#039;&#039;&#039;[[ODE]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[IDA]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[LSODE]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[DOPRI5]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;[[LA]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[Linsolqr]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#DDDDDD&amp;quot;|&#039;&#039;&#039;[[Linsol]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;[[LP]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;pink&amp;quot;|&#039;&#039;&#039;[[MakeMPS]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;[[Logic Solvers|Logic]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#88FF88&amp;quot;|&#039;&#039;&#039;[[LRSlv]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Solvers]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=NLP&amp;diff=320</id>
		<title>NLP</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=NLP&amp;diff=320"/>
		<updated>2010-05-14T06:56:49Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{solvers}} {{missing}}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{solvers}}&lt;br /&gt;
{{missing}}&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=METHOD&amp;diff=319</id>
		<title>METHOD</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=METHOD&amp;diff=319"/>
		<updated>2010-05-14T06:56:37Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Redirected page to METHODS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[METHODS]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=SELF&amp;diff=318</id>
		<title>SELF</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=SELF&amp;diff=318"/>
		<updated>2010-05-14T06:56:22Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Category:Miscellany&amp;diff=317</id>
		<title>Category:Miscellany</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Category:Miscellany&amp;diff=317"/>
		<updated>2010-05-14T06:55:53Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains information not directly related to ASCEND, but things which have been of use in our work on or using ASCEND.&lt;br /&gt;
&lt;br /&gt;
The following 12 files are in this category, out of 12 total.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:GSL-1.13.pkg.zip]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:GSL-1.13.pkg.zip|GSL-1.13.pkg.zip]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4,310,999 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Gsl-1.13.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Gsl-1.13.exe|Gsl-1.13.exe]]&amp;lt;br /&amp;gt;&lt;br /&gt;
1,618,840 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Boost-1.34.1-mingw.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Boost-1.34.1-mingw.exe|Boost-1.34.1-mingw.e...]]&amp;lt;br /&amp;gt;&lt;br /&gt;
3,582,601 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Buildbot-0.7.5.win32.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Buildbot-0.7.5.win32.exe|Buildbot-0.7.5.win32...]]&amp;lt;br /&amp;gt;&lt;br /&gt;
432,881 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|-&lt;br /&gt;
| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Buildbot-0.7.6.win32.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Buildbot-0.7.6.win32.exe|Buildbot-0.7.6.win32...]]&amp;lt;br /&amp;gt;&lt;br /&gt;
476,621 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Coin3d-2.5.0.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Coin3d-2.5.0.exe|Coin3d-2.5.0.exe]]&amp;lt;br /&amp;gt;&lt;br /&gt;
6,360,050 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Cunit-2.1-jdpipe.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Cunit-2.1-jdpipe.exe|Cunit-2.1-jdpipe.exe]]&amp;lt;br /&amp;gt;&lt;br /&gt;
93,645 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Graphicsmagick-1.1.10.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Graphicsmagick-1.1.10.exe|Graphicsmagick-1.1.1...]]&amp;lt;br /&amp;gt;&lt;br /&gt;
2,090,494 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|-&lt;br /&gt;
| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Graphicsmagick-1.2.020071109.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Graphicsmagick-1.2.020071109.exe|Graphicsmagick-1.2.0...]]&amp;lt;br /&amp;gt;&lt;br /&gt;
3,021,808 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Pycunit-0.2-1.src.rpm]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Pycunit-0.2-1.src.rpm|Pycunit-0.2-1.src.rp...]]&amp;lt;br /&amp;gt;&lt;br /&gt;
21,593 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Soqt-1.4.1.exe]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Soqt-1.4.1.exe|Soqt-1.4.1.exe]]&amp;lt;br /&amp;gt;&lt;br /&gt;
1,471,593 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;| &amp;lt;div class=&amp;quot;gallerybox&amp;quot; style=&amp;quot;width: 155px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot; style=&amp;quot;padding: 13px 0; width: 150px;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;margin-left: auto; margin-right: auto; width: 120px;&amp;quot;&amp;gt;[[Image:Sundials-2.3.0-0.i386.fc6.rpm]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerytext&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Sundials-2.3.0-0.i386.fc6.rpm|Sundials-2.3.0-0.i38...]]&amp;lt;br /&amp;gt;&lt;br /&gt;
891,131 bytes&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Ubuntu_installation_notes&amp;diff=316</id>
		<title>Ubuntu installation notes</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Ubuntu_installation_notes&amp;diff=316"/>
		<updated>2010-05-14T06:55:30Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Miscellany&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Miscellany]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=GraphicsMagick_on_MinGW&amp;diff=315</id>
		<title>GraphicsMagick on MinGW</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=GraphicsMagick_on_MinGW&amp;diff=315"/>
		<updated>2010-05-14T06:55:18Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Miscellany&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Miscellany]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Binary_installer_for_GSL-1.11_on_MinGW&amp;diff=314</id>
		<title>Binary installer for GSL-1.11 on MinGW</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Binary_installer_for_GSL-1.11_on_MinGW&amp;diff=314"/>
		<updated>2010-05-14T06:55:01Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Miscellany&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Miscellany]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Category:Stubs&amp;diff=313</id>
		<title>Category:Stubs</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Category:Stubs&amp;diff=313"/>
		<updated>2010-05-14T06:54:24Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;These are pages that have been started but still need content to be added before they are fully useful.&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are pages that have been started but still need content to be added before they are fully useful.&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Lower_bound&amp;diff=312</id>
		<title>Lower bound</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Lower_bound&amp;diff=312"/>
		<updated>2010-05-14T06:53:48Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=Upper_bound&amp;diff=311</id>
		<title>Upper bound</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=Upper_bound&amp;diff=311"/>
		<updated>2010-05-14T06:53:34Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=RUN&amp;diff=310</id>
		<title>RUN</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=RUN&amp;diff=310"/>
		<updated>2010-05-14T06:53:20Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=ASSERT&amp;diff=309</id>
		<title>ASSERT</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=ASSERT&amp;diff=309"/>
		<updated>2010-05-14T06:53:04Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=METHODS&amp;diff=308</id>
		<title>METHODS</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=METHODS&amp;diff=308"/>
		<updated>2010-05-14T06:52:50Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Built-in methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;notice metadata&amp;quot; id=&amp;quot;stub&amp;quot;&amp;gt;&#039;&#039;This article is a &#039;&#039;&#039;stub&#039;&#039;&#039;. You can help out by &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://ascendwiki.cheme.cmu.edu/index.php?title=METHODS&amp;amp;action=edit expanding it]&amp;lt;/span&amp;gt;. &#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;strong class=&amp;quot;selflink&amp;quot;&amp;gt;METHODS&amp;lt;/strong&amp;gt; part of a [[MODEL]] is where procedural statements are contained. In this part of your model declaration, you can not declare new [[Variable|variables]] or [[Equation|equations]], but you can set the values of [[Variable|variables]], make [[Equation|equations]] active/inactive, perform bounds checking and run [[External Methods]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [[Thin-walled_tank/Adding_methods_to_a_model]] for an introduction to the use of METHODS including some &#039;standard&#039; method naming conventions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Standard METHOD names ==&lt;br /&gt;
&lt;br /&gt;
There is a suggested set of names for METHODs that you should consider using in a model if you would like to make it easy for other people to reuse it. These are&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;specify&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: In this method, [[RUN]] &amp;lt;tt&amp;gt;ClearAll&amp;lt;/tt&amp;gt;, then [[FIX]] any variables that you would like to set as known values.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;values&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: In this method, set the values of your FIXed variables.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;default_self&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Set any other default values for variables in your model. Often, setting these default (initial/pre-solve) values this is necessary in order for your model to converge to the desired solution.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;bound_self&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Set the [[upper_bound]] and [[lower_bound]] for any variables that don&#039;t already have suitable bounds from their [[ATOM]] definitions.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;[[Scaling|scale_self]]&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Set (or re-set) the scaling for your model. Correct model [[scaling]] is critical for the good numerical behaviour of some models. Sometimes it can even be useful to re-scale the model after solving it with some &#039;easy&#039; initial conditions.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;on_load&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Write this method to make calls to the other METHODs in suitable sequence. The intention here is that after the GUI automatically runs this method, the model should be in a state where it &#039;just solves&#039;, so that the user can see what the results are.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;self_test&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Write this method with [[ASSERT]] statements to check that your model solves to the expected values. This allows you to quickly check that the model is working as you want, before then proceeding to use it for your other purposes. See [[Model self-testing]].&lt;br /&gt;
&lt;br /&gt;
Sometimes models require an unusual set of METHODs in order to be configured to solve the problem at hand. In this case, it is recommended that instructions for solving your model be added using [[NOTES]] on the model, perhaps giving the notes category as &amp;quot;solving&amp;quot;, for example.&lt;br /&gt;
&lt;br /&gt;
== Built-in methods ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;ClearAll&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: This method automatically [[FREE]]s all variables in the whole model tree.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;reset&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: This method runs &amp;lt;tt&amp;gt;ClearAll&amp;lt;/tt&amp;gt; and then attempts to run the &amp;lt;tt&amp;gt;specify&amp;lt;/tt&amp;gt; method. That means that all the FIXed and FREEd varibles should end up reset to their desired states.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Category:Stubs]]&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=METHODS&amp;diff=307</id>
		<title>METHODS</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=METHODS&amp;diff=307"/>
		<updated>2010-05-14T06:52:28Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Standard METHOD names */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;notice metadata&amp;quot; id=&amp;quot;stub&amp;quot;&amp;gt;&#039;&#039;This article is a &#039;&#039;&#039;stub&#039;&#039;&#039;. You can help out by &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://ascendwiki.cheme.cmu.edu/index.php?title=METHODS&amp;amp;action=edit expanding it]&amp;lt;/span&amp;gt;. &#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;strong class=&amp;quot;selflink&amp;quot;&amp;gt;METHODS&amp;lt;/strong&amp;gt; part of a [[MODEL]] is where procedural statements are contained. In this part of your model declaration, you can not declare new [[Variable|variables]] or [[Equation|equations]], but you can set the values of [[Variable|variables]], make [[Equation|equations]] active/inactive, perform bounds checking and run [[External Methods]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [[Thin-walled_tank/Adding_methods_to_a_model]] for an introduction to the use of METHODS including some &#039;standard&#039; method naming conventions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Standard METHOD names ==&lt;br /&gt;
&lt;br /&gt;
There is a suggested set of names for METHODs that you should consider using in a model if you would like to make it easy for other people to reuse it. These are&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;specify&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: In this method, [[RUN]] &amp;lt;tt&amp;gt;ClearAll&amp;lt;/tt&amp;gt;, then [[FIX]] any variables that you would like to set as known values.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;values&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: In this method, set the values of your FIXed variables.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;default_self&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Set any other default values for variables in your model. Often, setting these default (initial/pre-solve) values this is necessary in order for your model to converge to the desired solution.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;bound_self&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Set the [[upper_bound]] and [[lower_bound]] for any variables that don&#039;t already have suitable bounds from their [[ATOM]] definitions.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;[[Scaling|scale_self]]&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Set (or re-set) the scaling for your model. Correct model [[scaling]] is critical for the good numerical behaviour of some models. Sometimes it can even be useful to re-scale the model after solving it with some &#039;easy&#039; initial conditions.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;on_load&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: Write this method to make calls to the other METHODs in suitable sequence. The intention here is that after the GUI automatically runs this method, the model should be in a state where it &#039;just solves&#039;, so that the user can see what the results are.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;self_test&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Write this method with [[ASSERT]] statements to check that your model solves to the expected values. This allows you to quickly check that the model is working as you want, before then proceeding to use it for your other purposes. See [[Model self-testing]].&lt;br /&gt;
&lt;br /&gt;
Sometimes models require an unusual set of METHODs in order to be configured to solve the problem at hand. In this case, it is recommended that instructions for solving your model be added using [[NOTES]] on the model, perhaps giving the notes category as &amp;quot;solving&amp;quot;, for example.&lt;br /&gt;
&lt;br /&gt;
== Built-in methods ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;ClearAll&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;dl&amp;gt;&amp;lt;dd&amp;gt; This method automatically &amp;lt;a href=&amp;quot;/FREE&amp;quot; title=&amp;quot;FREE&amp;quot;&amp;gt;FREEs&amp;lt;/a&amp;gt; all variables in the whole model tree.&lt;br /&gt;
&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: This method automatically &amp;lt;a href=&amp;quot;/FREE&amp;quot; title=&amp;quot;FREE&amp;quot;&amp;gt;FREEs&amp;lt;/a&amp;gt; all variables in the whole model tree.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;reset&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;dl&amp;gt;&amp;lt;dd&amp;gt; This method runs &amp;lt;tt&amp;gt;ClearAll&amp;lt;/tt&amp;gt; and then attempts to run the &amp;lt;tt&amp;gt;specify&amp;lt;/tt&amp;gt; method. That means that all the FIXed and FREEd varibles should end up reset to their desired states.&lt;br /&gt;
&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: This method runs &amp;lt;tt&amp;gt;ClearAll&amp;lt;/tt&amp;gt; and then attempts to run the &amp;lt;tt&amp;gt;specify&amp;lt;/tt&amp;gt; method. That means that all the FIXed and FREEd varibles should end up reset to their desired states.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Category:Stubs]]&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=ASCEND_history&amp;diff=306</id>
		<title>ASCEND history</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=ASCEND_history&amp;diff=306"/>
		<updated>2010-05-14T06:49:50Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Redirected page to History of ASCEND&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[History of ASCEND]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=SWITCH&amp;diff=305</id>
		<title>SWITCH</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=SWITCH&amp;diff=305"/>
		<updated>2010-05-14T06:49:30Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://ascend4.org/index.php?title=CONDITIONAL&amp;diff=304</id>
		<title>CONDITIONAL</title>
		<link rel="alternate" type="text/html" href="https://ascend4.org/index.php?title=CONDITIONAL&amp;diff=304"/>
		<updated>2010-05-14T06:49:14Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;#039;{{missing}} Category:Syntax&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{missing}}&lt;br /&gt;
[[Category:Syntax]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
</feed>