1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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;
|