Re: How to remove unneeded constraints
- To: mathgroup at smc.vnet.net
- Subject: [mg87965] Re: How to remove unneeded constraints
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Mon, 21 Apr 2008 03:27:30 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <fueeo7$b82$1@smc.vnet.net>
Kristian Schmidt wrote: > The problem I am working on is a pretty large problem, which I am solving by dividing it into a lot of subproblems. > > As such, I have a large list of constraints that apply to the entire problem, but are not relevant for each individual subproblem. > > This becomes a problem when I use Refine, as it takes a very long time when you have a lot of conditions, even though the conditions don't pertain to the problem. Example: > In[25]:= Table[Timing@Refine[p>q,Map[Subscript[x,#]>0&,Range[i]]],{i,1000,5000,1000}] > Out[25]= {{0.547,p>q},{1.797,p>q},{3.875,p>q},{8.594,p>q},{10.468,p>q}} > > And it only gets worse. > > However, for each individual call to Refine I make, I only need a small subset of the total constraints. > > So what I want to do is something like this: > expr = some expression of n different variables; > cond = DeleteCases[totalConstraints, all cases which do not contain a variable from expr]; > result = Refine[expr,cond]; > > I have no idea how to construct a pattern powerful enough to do what is required for the DeleteCases call, though. > > All of the variables are of the form Subscript[s,_,_,_] or Subscript[b,_,_] and the conditions can also contain expressions of several variables. Hi Kristian, A possible solution that I would recommend uses *FreeQ[]* for pattern matching and *Pick[]* to build the list of constraints that do not contains the unneeded variables. In[1]:= (* We make an arbitrary list of constraints *) conds = {E^(Subscript[s, 1, 1, 2] + Subscript[b, 3, 1]) > 1, E^(Subscript[s, 1, 1, 3] + Subscript[b, 3, 1])/+Subscript[b, 2, 2] <= 100, Abs[Log[Subscript[s, 1, 1, 3]^Sin[Subscript[b, 1, 2] Pi]]] <= 2}; (* We look for any expression that does not have a variable s for which the third index is 3 *) FreeQ[#, Subscript[s, _, _, 3] ] & /@ conds (*We look for any expression that does not have the variable b with first index equal to 3 *) FreeQ[#, Subscript[b, 3, _] ] & /@ conds (* The returned list does not contain any expression that contains the variable s for which its third index is 3 *) Pick[conds, FreeQ[#, Subscript[s, _, _, 3] ] & /@ conds] (* The following examples should be self-explanatory by now *) Pick[#, FreeQ[#, Subscript[b, ___, 3, ___] ] & /@ #] &@conds Pick[#, FreeQ[#, Subscript[_, 1, 2, ___] ] & /@ #] &@conds Pick[#, FreeQ[#, Subscript[b, 1, 2] | Subscript[s, 1, _, 2]] & /@ #] &@conds Out[2]= {True, False, False} Out[3]= {False, False, True} Out[4]= b + s 3,1 1,1,2 {E > 1} Out[5]= Sin[Pi b ] 1,2 {Abs[Log[s ]] <= 2} 1,1,3 Out[6]= b + s b + s 3,1 1,1,3 3,1 1,1,2 E {E > 1, -------------- <= 100} b 2,2 Out[7]= b + s 3,1 1,1,3 E {-------------- <= 100} b 2,2 Regards, -- Jean-Marc