Artifact 78a2507cf17f55b20f974f5eb2c5175f7646e39a78ff8470cc226eb2923f6c42:
- Executable file
r37/packages/solve/ineq.red
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 2583) [annotate] [blame] [check-ins using] [more...]
module ineq; % Inequalities and linear optimization. % Author: Herbert Melenk <melenk@zib-berlin.dbp.de> % Driver for solving inequalities and inequality systems. % Implemented methods: % % - linear multivariate system % - polynomial/rational univariate inequality and system % Common algebraic interface: % % ineq_solve(<ineq/ineqlist> [,<variable/variablelist>]) create!-package('(ineq linineq liqsimp1 liqsimp2 polineq),'(solve)); load!-package 'solve; % Some routines from solve are needed. fluid '(solvemethods!*); if not memq('ineqseval,solvemethods!*) then solvemethods!* := 'ineqseval!*!* . solvemethods!*; if not get('geq,'simpfn) then <<mkop 'leq; mkop 'geq; mkop 'lessp; mkop 'greaterp>>; if not get('!*interval!*,'simpfn) then <<mkop '!*interval!*; infix !*interval!*; put('!*interval!*,'prtch," .. ") >>; symbolic procedure ineqseval!*!* u; % Interface to solve. (if null w then nil else if w='(failed) then if smemql('(leq geq lessp greaterp),u) then w else nil else w) where w=ineqseval u; symbolic procedure ineqseval!* u; % Interface to ineq_solve. (if null w or w='(failed) then car u else w) where w=ineqseval u; put('ineq_solve,'psopfn,'ineqseval!*); symbolic procedure ineqseval(u); begin scalar s,s1,v,v1,l,w1,w2,err,ineqp,str; integer n; s:=reval car u; s:=if eqcar(s,'list) then cdr s else {s}; if cdr u then <<v:= reval cadr u; v:=if eqcar(v,'list) then cdr v else {v}; >>; % test for linearity, collect variables. l:=t; s1:=for each q in s join if not err then <<if atom q or not memq(car q,'(leq geq lessp greaterp equal)) then err:=t else << if not(car q eq 'equal) then ineqp := t; n:=n#+1; str := str or memq(car q,'(lessp greaterp)); w1:=simp cadr q; w2:=simp caddr q; v1:=union(v1,solvevars{w1,w2}); if not domainp denr w1 or not domainp denr w2 then l:=nil; {numr w1,denr w1,numr w2,denr w2} >> >>; if err or not ineqp then return nil; if null v then v:=v1; l := l and not nonlnrsys(s1,v); if length v1 > length v or not subsetp(v,v1) or not l and cdr v1 then return '(failed); % Too many indeterminates in inequality system; % if not l and n#>1 then % return '(failed); % Nonlinear system not implemented. if l and str then return '(failed); % No strict linear system. return if l then linineqseval u else polineqeval u; end; endmodule; end;