Ticket #10151: trac_10151.patch
| File trac_10151.patch, 44.4 KB (added by ncohen, 3 years ago) |
|---|
-
sage/graphs/digraph.py
# HG changeset patch # User Nathann Cohen <nathann.cohen@gmail.com> # Date 1287679187 -7200 # Node ID f7037b2573b17fd670a37d71e1921ea65b494ad5 # Parent c759dc92eeb3e94e38c3226ecba4f836438c7442 trac 10151 -- Update calls to MixedIntegerLinearProgram and its solve function to follow the new interface diff -r c759dc92eeb3 -r f7037b2573b1 sage/graphs/digraph.py
a b 1180 1180 1181 1181 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 1182 1182 1183 p=MixedIntegerLinearProgram(maximization=False )1183 p=MixedIntegerLinearProgram(maximization=False, solver=solver) 1184 1184 1185 1185 b=p.new_variable() 1186 1186 x=p.new_variable(dim=2) … … 1204 1204 p.set_objective(Sum([b[(u,v)] for (u,v) in self.edges(labels=None)])) 1205 1205 1206 1206 if value_only: 1207 return p.solve(objective_only=True, solver=solver,log=verbose)1207 return p.solve(objective_only=True, log=verbose) 1208 1208 else: 1209 p.solve( solver=solver,log=verbose)1209 p.solve(log=verbose) 1210 1210 1211 1211 b_sol=p.get_values(b) 1212 1212 … … 1302 1302 1303 1303 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 1304 1304 1305 p=MixedIntegerLinearProgram(maximization=False )1305 p=MixedIntegerLinearProgram(maximization=False, solver=solver) 1306 1306 1307 1307 b=p.new_variable() 1308 1308 x=p.new_variable(dim=2) … … 1326 1326 p.set_objective(Sum([b[v] for v in self])) 1327 1327 1328 1328 if value_only: 1329 return p.solve(objective_only=True, solver=solver,log=verbose)1329 return p.solve(objective_only=True, log=verbose) 1330 1330 else: 1331 p.solve( solver=solver,log=verbose)1331 p.solve(log=verbose) 1332 1332 b_sol=p.get_values(b) 1333 1333 1334 1334 from sage.sets.set import Set -
sage/graphs/generic_graph.py
diff -r c759dc92eeb3 -r f7037b2573b1 sage/graphs/generic_graph.py
a b 2243 2243 2244 2244 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 2245 2245 2246 p = MixedIntegerLinearProgram(maximization=False )2246 p = MixedIntegerLinearProgram(maximization=False, solver=solver) 2247 2247 2248 2248 # The orientation of an edge is boolean 2249 2249 # and indicates whether the edge uv … … 2264 2264 2265 2265 p.set_binary(orientation) 2266 2266 2267 p.solve( solver=solver,log=verbose)2267 p.solve(log=verbose) 2268 2268 2269 2269 orientation = p.get_values(orientation) 2270 2270 … … 3278 3278 return B, C 3279 3279 3280 3280 3281 def steiner_tree(self,vertices, weighted = False ):3281 def steiner_tree(self,vertices, weighted = False, solver = None, verbose = 0): 3282 3282 r""" 3283 3283 Returns a tree of minimum weight connecting the given 3284 3284 set of vertices. … … 3305 3305 ``None`` as a weight of `1`. If ``weighted=False`` (default) 3306 3306 all edges are considered to have a weight of `1`. 3307 3307 3308 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 3309 solver to be used. If set to ``None``, the default one is used. For 3310 more information on LP solvers and which default solver is used, see 3311 the method 3312 :meth:`solve <sage.numerical.mip.MixedIntegerLinearProgram.solve>` 3313 of the class 3314 :class:`MixedIntegerLinearProgram <sage.numerical.mip.MixedIntegerLinearProgram>`. 3315 3316 - ``verbose`` -- integer (default: ``0``). Sets the level of 3317 verbosity. Set to 0 by default, which means quiet. 3318 3319 3308 3320 .. NOTE:: 3309 3321 3310 3322 * This problem being defined on undirected graphs, the … … 3376 3388 3377 3389 # Then, LP formulation 3378 3390 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 3379 p = MixedIntegerLinearProgram(maximization = False )3391 p = MixedIntegerLinearProgram(maximization = False, solver = solver) 3380 3392 3381 3393 # Reorder an edge 3382 3394 R = lambda (x,y) : (x,y) if x<y else (y,x) … … 3419 3431 p.set_objective(Sum([w(e)*edges[R(e)] for e in g.edges(labels = False)])) 3420 3432 3421 3433 p.set_binary(edges) 3422 p.solve( )3434 p.solve(log = verbose) 3423 3435 3424 3436 edges = p.get_values(edges) 3425 3437 … … 3427 3439 st.delete_vertices([v for v in g if st.degree(v) == 0]) 3428 3440 return st 3429 3441 3430 def edge_disjoint_spanning_trees(self,k, root=None, **kwds):3442 def edge_disjoint_spanning_trees(self,k, root=None, solver = None, verbose = 0): 3431 3443 r""" 3432 3444 Returns the desired number of edge-disjoint spanning 3433 3445 trees/arborescences. … … 3441 3453 when the graph is directed. 3442 3454 If set to ``None``, the first vertex in the graph is picked. 3443 3455 3444 - ``**kwds`` -- arguments to be passed down to the ``solve`` 3445 function of ``MixedIntegerLinearProgram``. See the documentation 3446 of ``MixedIntegerLinearProgram.solve`` for more informations. 3456 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 3457 solver to be used. If set to ``None``, the default one is used. For 3458 more information on LP solvers and which default solver is used, see 3459 the method 3460 :meth:`solve <sage.numerical.mip.MixedIntegerLinearProgram.solve>` 3461 of the class 3462 :class:`MixedIntegerLinearProgram <sage.numerical.mip.MixedIntegerLinearProgram>`. 3463 3464 - ``verbose`` -- integer (default: ``0``). Sets the level of 3465 verbosity. Set to 0 by default, which means quiet. 3447 3466 3448 3467 ALGORITHM: 3449 3468 … … 3514 3533 """ 3515 3534 3516 3535 from sage.numerical.mip import MixedIntegerLinearProgram, MIPSolverException, Sum 3517 p = MixedIntegerLinearProgram( )3536 p = MixedIntegerLinearProgram(solver = solver) 3518 3537 p.set_objective(None) 3519 3538 3520 3539 # The colors we can use … … 3605 3624 p.set_binary(edges) 3606 3625 3607 3626 try: 3608 p.solve( **kwds)3627 p.solve(log = verbose) 3609 3628 3610 3629 except MIPSolverException: 3611 3630 raise ValueError("This graph does not contain the required number of trees/arborescences !") … … 3779 3798 3780 3799 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 3781 3800 g = self 3782 p = MixedIntegerLinearProgram(maximization=False )3801 p = MixedIntegerLinearProgram(maximization=False, solver=solver) 3783 3802 b = p.new_variable(dim=2) 3784 3803 v = p.new_variable() 3785 3804 … … 3810 3829 p.set_binary(b) 3811 3830 3812 3831 if value_only: 3813 return p.solve(objective_only=True, solver=solver,log=verbose)3814 else: 3815 obj = p.solve( solver=solver,log=verbose)3832 return p.solve(objective_only=True, log=verbose) 3833 else: 3834 obj = p.solve(log=verbose) 3816 3835 b = p.get_values(b) 3817 3836 answer = [obj] 3818 3837 if g.is_directed(): … … 3902 3921 if vertices: 3903 3922 value_only = False 3904 3923 3905 p = MixedIntegerLinearProgram(maximization=False )3924 p = MixedIntegerLinearProgram(maximization=False, solver=solver) 3906 3925 b = p.new_variable() 3907 3926 v = p.new_variable() 3908 3927 … … 3935 3954 p.set_binary(v) 3936 3955 3937 3956 if value_only: 3938 return p.solve(objective_only=True, solver=solver,log=verbose)3939 else: 3940 obj = p.solve( solver=solver,log=verbose)3957 return p.solve(objective_only=True, log=verbose) 3958 else: 3959 obj = p.solve(log=verbose) 3941 3960 b = p.get_values(b) 3942 3961 answer = [obj,[x for x in g if b[x] == 1]] 3943 3962 if vertices: … … 3955 3974 return tuple(answer) 3956 3975 3957 3976 3958 def multiway_cut(self, vertices, value_only = False, use_edge_labels = False, **kwds):3977 def multiway_cut(self, vertices, value_only = False, use_edge_labels = False, solver = None, verbose = 0): 3959 3978 r""" 3960 3979 Returns a minimum edge multiway cut corresponding to the 3961 3980 given set of vertices … … 3987 4006 an edge has no label, `1` is assumed ) 3988 4007 3989 4008 - when set to ``False`` (default), each edge has weight `1`. 3990 3991 - ``**kwds`` -- arguments to be passed down to the ``solve`` 3992 function of ``MixedIntegerLinearProgram``. See the documentation 3993 of ``MixedIntegerLinearProgram.solve`` for more information. 4009 4010 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 4011 solver to be used. If set to ``None``, the default one is used. For 4012 more information on LP solvers and which default solver is used, see 4013 the method 4014 :meth:`solve <sage.numerical.mip.MixedIntegerLinearProgram.solve>` 4015 of the class 4016 :class:`MixedIntegerLinearProgram <sage.numerical.mip.MixedIntegerLinearProgram>`. 4017 4018 - ``verbose`` -- integer (default: ``0``). Sets the level of 4019 verbosity. Set to 0 by default, which means quiet. 3994 4020 3995 4021 EXAMPLES: 3996 4022 … … 4033 4059 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 4034 4060 from itertools import combinations, chain 4035 4061 4036 p = MixedIntegerLinearProgram(maximization = False )4062 p = MixedIntegerLinearProgram(maximization = False, solver= solver) 4037 4063 4038 4064 # height[c][v] represents the height of vertex v for commodity c 4039 4065 height = p.new_variable(dim = 2) … … 4084 4110 4085 4111 p.set_binary(cut) 4086 4112 if value_only: 4087 return p.solve(objective_only = True, **kwds)4088 4089 p.solve( **kwds)4113 return p.solve(objective_only = True, log = verbose) 4114 4115 p.solve(log = verbose) 4090 4116 4091 4117 cut = p.get_values(cut) 4092 4118 … … 4179 4205 4180 4206 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 4181 4207 g = self 4182 p = MixedIntegerLinearProgram(maximization=False )4208 p = MixedIntegerLinearProgram(maximization=False, solver=solver) 4183 4209 b = p.new_variable() 4184 4210 4185 4211 # minimizes the number of vertices in the set … … 4192 4218 p.set_binary(b) 4193 4219 4194 4220 if value_only: 4195 return p.solve(objective_only=True, solver=solver,log=verbose)4221 return p.solve(objective_only=True, log=verbose) 4196 4222 else: 4197 p.solve( solver=solver,log=verbose)4223 p.solve(log=verbose) 4198 4224 b = p.get_values(b) 4199 4225 return set([v for v in g.vertices() if b[v] == 1]) 4200 4226 else: … … 4279 4305 4280 4306 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 4281 4307 4282 p = MixedIntegerLinearProgram(maximization=True )4308 p = MixedIntegerLinearProgram(maximization=True, solver=solver) 4283 4309 4284 4310 in_set = p.new_variable(dim=2) 4285 4311 in_cut = p.new_variable(dim=1) … … 4320 4346 p.set_objective(Sum([weight(l ) * in_cut[reorder_edge(u,v)] for (u,v,l ) in g.edge_iterator()])) 4321 4347 4322 4348 if value_only: 4323 obj = p.solve(objective_only=True, solver=solver,log=verbose)4349 obj = p.solve(objective_only=True, log=verbose) 4324 4350 return obj if use_edge_labels else round(obj) 4325 4351 else: 4326 obj = p.solve( solver=solver,log=verbose)4352 obj = p.solve(log=verbose) 4327 4353 val = [obj if use_edge_labels else round(obj)] 4328 4354 4329 4355 in_cut = p.get_values(in_cut) … … 4348 4374 4349 4375 return val 4350 4376 4351 def traveling_salesman_problem(self, weighted = True ):4377 def traveling_salesman_problem(self, weighted = True, solver = None, verbose = 0): 4352 4378 r""" 4353 4379 Solves the traveling salesman problem (TSP) 4354 4380 … … 4373 4399 account, and the edges whose weight is ``None`` 4374 4400 are assumed to be set to `1` 4375 4401 4402 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 4403 solver to be used. If set to ``None``, the default one is used. For 4404 more information on LP solvers and which default solver is used, see 4405 the method 4406 :meth:`solve <sage.numerical.mip.MixedIntegerLinearProgram.solve>` 4407 of the class 4408 :class:`MixedIntegerLinearProgram <sage.numerical.mip.MixedIntegerLinearProgram>`. 4409 4410 - ``verbose`` -- integer (default: ``0``). Sets the level of 4411 verbosity. Set to 0 by default, which means quiet. 4412 4413 4376 4414 OUTPUT: 4377 4415 4378 4416 A solution to the TSP, as a ``Graph`` object whose vertex … … 4458 4496 4459 4497 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 4460 4498 4461 p = MixedIntegerLinearProgram(maximization = False )4499 p = MixedIntegerLinearProgram(maximization = False, solver = solver) 4462 4500 4463 4501 f = p.new_variable() 4464 4502 r = p.new_variable() … … 4561 4599 from sage.numerical.mip import MIPSolverException 4562 4600 4563 4601 try: 4564 obj = p.solve( )4602 obj = p.solve(log = verbose) 4565 4603 f = p.get_values(f) 4566 4604 tsp.add_vertices(g.vertices()) 4567 4605 tsp.set_pos(g.get_pos()) … … 4824 4862 4825 4863 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 4826 4864 g=self 4827 p=MixedIntegerLinearProgram(maximization=True )4865 p=MixedIntegerLinearProgram(maximization=True, solver = solver) 4828 4866 flow=p.new_variable(dim=1) 4829 4867 4830 4868 if use_edge_labels: … … 4876 4914 4877 4915 4878 4916 if value_only: 4879 return p.solve(objective_only=True )4880 4881 obj=p.solve( )4917 return p.solve(objective_only=True, log = verbose) 4918 4919 obj=p.solve(log = verbose) 4882 4920 4883 4921 flow=p.get_values(flow) 4884 4922 # Builds a clean flow Draph … … 5132 5170 5133 5171 from sage.numerical.mip import MixedIntegerLinearProgram , Sum 5134 5172 g=self 5135 p=MixedIntegerLinearProgram(maximization=True )5173 p=MixedIntegerLinearProgram(maximization=True, solver = solver) 5136 5174 5137 5175 # Adding the intensity if not present 5138 5176 terminals = [(x if len(x) == 3 else (x[0],x[1],1)) for x in terminals] … … 5216 5254 from sage.numerical.mip import MIPSolverException 5217 5255 5218 5256 try: 5219 obj=p.solve( )5257 obj=p.solve(log = verbose) 5220 5258 except MIPSolverException: 5221 5259 raise ValueError("The multiflow problem has no solution") 5222 5260 … … 5552 5590 g = self 5553 5591 # returns the weight of an edge considering it may not be 5554 5592 # weighted ... 5555 p = MixedIntegerLinearProgram(maximization=True )5593 p = MixedIntegerLinearProgram(maximization=True, solver=solver) 5556 5594 b = p.new_variable(dim=2) 5557 5595 p.set_objective( 5558 5596 Sum([weight(w) * b[min(u, v)][max(u, v)] … … 5565 5603 for u in g.neighbors(v)]), max=1) 5566 5604 p.set_binary(b) 5567 5605 if value_only: 5568 return p.solve(objective_only=True, solver=solver,log=verbose)5606 return p.solve(objective_only=True, log=verbose) 5569 5607 else: 5570 p.solve( solver=solver,log=verbose)5608 p.solve(log=verbose) 5571 5609 b = p.get_values(b) 5572 5610 return [(u, v, w) for u, v, w in g.edges() 5573 5611 if b[min(u, v)][max(u, v)] == 1] … … 5642 5680 """ 5643 5681 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 5644 5682 g=self 5645 p=MixedIntegerLinearProgram(maximization=False )5683 p=MixedIntegerLinearProgram(maximization=False, solver=solver) 5646 5684 b=p.new_variable() 5647 5685 5648 5686 # For any vertex v, one of its neighbors or v itself is in … … 5662 5700 p.set_integer(b) 5663 5701 5664 5702 if value_only: 5665 return p.solve(objective_only=True, solver=solver,log=verbose)5666 else: 5667 p.solve( solver=solver,log=verbose)5703 return p.solve(objective_only=True, log=verbose) 5704 else: 5705 p.solve(log=verbose) 5668 5706 b=p.get_values(b) 5669 5707 return [v for v in g.vertices() if b[v]==1] 5670 5708 … … 5812 5850 5813 5851 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 5814 5852 5815 p = MixedIntegerLinearProgram(maximization=False )5853 p = MixedIntegerLinearProgram(maximization=False, solver=solver) 5816 5854 5817 5855 in_set = p.new_variable(dim=2) 5818 5856 in_cut = p.new_variable(dim=1) … … 5847 5885 p.set_objective(Sum([weight(l ) * in_cut[reorder_edge(u,v)] for (u,v,l) in g.edge_iterator()])) 5848 5886 5849 5887 if value_only: 5850 obj = p.solve(objective_only=True, solver=solver,log=verbose)5888 obj = p.solve(objective_only=True, log=verbose) 5851 5889 return obj if use_edge_labels else round(obj) 5852 5890 5853 5891 else: 5854 obj = p.solve( solver=solver,log=verbose)5892 obj = p.solve(log=verbose) 5855 5893 val = [obj if use_edge_labels else round(obj)] 5856 5894 5857 5895 in_cut = p.get_values(in_cut) … … 5988 6026 5989 6027 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 5990 6028 5991 p = MixedIntegerLinearProgram(maximization=False )6029 p = MixedIntegerLinearProgram(maximization=False, solver=solver) 5992 6030 5993 6031 # Sets 0 and 2 are "real" sets while set 1 represents the cut 5994 6032 in_set = p.new_variable(dim=2) … … 6022 6060 p.set_objective(Sum([in_set[1][v] for v in g])) 6023 6061 6024 6062 if value_only: 6025 return p.solve(objective_only=True, solver=solver,log=verbose)6026 else: 6027 val = [int(p.solve( solver=solver,log=verbose))]6063 return p.solve(objective_only=True, log=verbose) 6064 else: 6065 val = [int(p.solve(log=verbose))] 6028 6066 6029 6067 in_set = p.get_values(in_set) 6030 6068 … … 7815 7853 7816 7854 return 2*Integer(self.size())/Integer(self.order()) 7817 7855 7818 def maximum_average_degree(self, value_only=True ):7856 def maximum_average_degree(self, value_only=True, solver = None, verbose = 0): 7819 7857 r""" 7820 7858 Returns the Maximum Average Degree (MAD) of the current graph. 7821 7859 … … 7836 7874 - Else, the subgraph of `G` realizing the `MAD` 7837 7875 is returned. 7838 7876 7877 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 7878 solver to be used. If set to ``None``, the default one is used. For 7879 more information on LP solvers and which default solver is used, see 7880 the method 7881 :meth:`solve <sage.numerical.mip.MixedIntegerLinearProgram.solve>` 7882 of the class 7883 :class:`MixedIntegerLinearProgram <sage.numerical.mip.MixedIntegerLinearProgram>`. 7884 7885 - ``verbose`` -- integer (default: ``0``). Sets the level of 7886 verbosity. Set to 0 by default, which means quiet. 7887 7839 7888 EXAMPLES: 7840 7889 7841 7890 In any graph, the `Mad` is always larger than the average … … 7874 7923 g = self 7875 7924 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 7876 7925 7877 p = MixedIntegerLinearProgram(maximization=True )7926 p = MixedIntegerLinearProgram(maximization=True, solver = solver) 7878 7927 7879 7928 d = p.new_variable() 7880 7929 one = p.new_variable() … … 7891 7940 7892 7941 p.set_objective( Sum([ one[reorder(u,v)] for u,v in g.edge_iterator(labels=False)]) ) 7893 7942 7894 obj = p.solve( )7943 obj = p.solve(log = verbose) 7895 7944 7896 7945 # Paying attention to numerical error : 7897 7946 # The zero values could be something like 0.000000000001 -
sage/graphs/graph.py
diff -r c759dc92eeb3 -r f7037b2573b1 sage/graphs/graph.py
a b 1910 1910 1911 1911 from sage.numerical.mip import MixedIntegerLinearProgram, MIPSolverException, Sum 1912 1912 1913 p = MixedIntegerLinearProgram(maximization=False )1913 p = MixedIntegerLinearProgram(maximization=False, solver=solver) 1914 1914 b = p.new_variable() 1915 1915 1916 1916 reorder = lambda x,y: (x,y) if x<y else (y,x) … … 1937 1937 p.set_binary(b) 1938 1938 1939 1939 try: 1940 p.solve( solver=solver,log=verbose)1940 p.solve(log=verbose) 1941 1941 g = self.copy() 1942 1942 b = p.get_values(b) 1943 1943 g.delete_edges([(x,y) for x,y,_ in g.edge_iterator() if b[reorder(x,y)] < 0.5]) … … 2352 2352 """ 2353 2353 2354 2354 from sage.numerical.mip import MixedIntegerLinearProgram, Sum 2355 p=MixedIntegerLinearProgram( )2355 p=MixedIntegerLinearProgram(solver=solver) 2356 2356 2357 2357 # Boolean variable indicating whether the vertex 2358 2358 # is the representative of some set … … 2392 2392 p.set_binary(classss) 2393 2393 2394 2394 try: 2395 p.solve( solver=solver,log=verbose)2395 p.solve(log=verbose) 2396 2396 except: 2397 2397 return None 2398 2398 … … 2495 2495 """ 2496 2496 2497 2497 from sage.numerical.mip import MixedIntegerLinearProgram, MIPSolverException, Sum 2498 p = MixedIntegerLinearProgram( )2498 p = MixedIntegerLinearProgram(solver=solver) 2499 2499 2500 2500 # sorts an edge 2501 2501 S = lambda (x,y) : (x,y) if x<y else (y,x) … … 2560 2560 p.set_objective(None) 2561 2561 2562 2562 try: 2563 p.solve( solver=solver,log=verbose)2563 p.solve(log=verbose) 2564 2564 except MIPSolverException: 2565 2565 raise ValueError("This graph has no minor isomorphic to H !") 2566 2566 -
sage/graphs/graph_coloring.py
diff -r c759dc92eeb3 -r f7037b2573b1 sage/graphs/graph_coloring.py
a b 250 250 for C in all_graph_colorings(G,n): 251 251 return n 252 252 253 def vertex_coloring(g, k=None, value_only=False, hex_colors=False, log=0):253 def vertex_coloring(g, k=None, value_only=False, hex_colors=False, solver = None, verbose = 0): 254 254 r""" 255 255 Computes the chromatic number of the given graph or tests its 256 256 `k`-colorability. See http://en.wikipedia.org/wiki/Graph_coloring for … … 275 275 partition returned is a dictionary whose keys are colors and whose 276 276 values are the color classes (ideal for plotting). 277 277 278 - ``log`` -- (default: ``0``) as vertex-coloring is an `NP`-complete 279 problem, this function may take some time depending on the graph. 280 Use ``log`` to define the level of verbosity you want from the 281 linear program solver. By default ``log=0``, meaning that there will 282 be no message printed by the solver. 278 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 279 solver to be used. If set to ``None``, the default one is 280 used. For more information on LP solvers and which default 281 solver is used, see the method :meth:`solve 282 <sage.numerical.mip.MixedIntegerLinearProgram.solve>` of the 283 class :class:`MixedIntegerLinearProgram 284 <sage.numerical.mip.MixedIntegerLinearProgram>`. 285 286 - ``verbose`` -- integer (default: ``0``). Sets the level of 287 verbosity. Set to 0 by default, which means quiet. 288 283 289 284 290 OUTPUT: 285 291 … … 331 337 while True: 332 338 # tries to color the graph, increasing k each time it fails. 333 339 tmp = vertex_coloring(g, k=k, value_only=value_only, 334 hex_colors=hex_colors, log=log)340 hex_colors=hex_colors, verbose=verbose) 335 341 if tmp is not False: 336 342 if value_only: 337 343 return k … … 359 365 tmp = vertex_coloring(g.subgraph(component), k=k, 360 366 value_only=value_only, 361 367 hex_colors=hex_colors, 362 log=log)368 verbose=verbose) 363 369 if tmp is False: 364 370 return False 365 371 return True … … 367 373 for component in g.connected_components(): 368 374 tmp = vertex_coloring(g.subgraph(component), k=k, 369 375 value_only=value_only, 370 hex_colors=False, log=log)376 hex_colors=False, verbose=verbose) 371 377 if tmp is False: 372 378 return False 373 379 colorings.append(tmp) … … 398 404 return vertex_coloring(g.subgraph(list(vertices)), k=k, 399 405 value_only=value_only, 400 406 hex_colors=hex_colors, 401 log=log)407 verbose=verbose) 402 408 value = vertex_coloring(g.subgraph(list(vertices)), k=k, 403 409 value_only=value_only, 404 410 hex_colors=False, 405 log=log)411 verbose=verbose) 406 412 if value is False: 407 413 return False 408 414 while len(deg) > 0: … … 416 422 else: 417 423 return value 418 424 419 p = MixedIntegerLinearProgram(maximization=True )425 p = MixedIntegerLinearProgram(maximization=True, solver = solver) 420 426 color = p.new_variable(dim=2) 421 427 # a vertex has exactly one color 422 428 [p.add_constraint(Sum([color[v][i] for i in xrange(k)]), min=1, max=1) … … 432 438 from sage.numerical.mip import MIPSolverException 433 439 try: 434 440 if value_only: 435 p.solve(objective_only=True, log= log)441 p.solve(objective_only=True, log=verbose) 436 442 return True 437 443 else: 438 chi = p.solve(log= log)444 chi = p.solve(log=verbose) 439 445 except MIPSolverException: 440 446 return False 441 447 … … 534 540 from sage.numerical.mip import MixedIntegerLinearProgram 535 541 from sage.numerical.mip import MIPSolverException, Sum 536 542 537 p = MixedIntegerLinearProgram( )543 p = MixedIntegerLinearProgram(solver = solver) 538 544 539 545 # List of colors 540 546 classes = range(k) … … 581 587 p.set_objective( Sum( is_used[i] for i in classes ) ) 582 588 583 589 try: 584 obj = p.solve( solver = solver,log = verbose, objective_only = value_only)590 obj = p.solve(log = verbose, objective_only = value_only) 585 591 from sage.rings.integer import Integer 586 592 obj = Integer(obj) 587 593 … … 720 726 k = m 721 727 722 728 723 p = MixedIntegerLinearProgram( )729 p = MixedIntegerLinearProgram(solver = solver) 724 730 725 731 # List of possible colors 726 732 classes = range(k) … … 786 792 787 793 788 794 try: 789 obj = p.solve( solver = solver,log = verbose, objective_only = value_only)795 obj = p.solve(log = verbose, objective_only = value_only) 790 796 from sage.rings.integer import Integer 791 797 obj = Integer(obj) 792 798 … … 810 816 811 817 return obj, coloring 812 818 813 def edge_coloring(g, value_only=False, vizing=False, hex_colors=False, log=0):819 def edge_coloring(g, value_only=False, vizing=False, hex_colors=False, solver = None,verbose = 0): 814 820 r""" 815 821 Properly colors the edges of a graph. See the URL 816 822 http://en.wikipedia.org/wiki/Edge_coloring for further details on … … 841 847 partition returned is a dictionary whose keys are colors and whose 842 848 values are the color classes (ideal for plotting). 843 849 844 - ``log`` -- (default: ``0``) as edge-coloring is an `NP`-complete 845 problem, this function may take some time depending on the graph. Use 846 ``log`` to define the level of verbosity you wantfrom the linear 847 program solver. By default ``log=0``, meaning that there will be no 848 message printed by the solver. 850 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 851 solver to be used. If set to ``None``, the default one is 852 used. For more information on LP solvers and which default 853 solver is used, see the method :meth:`solve 854 <sage.numerical.mip.MixedIntegerLinearProgram.solve>` of the 855 class :class:`MixedIntegerLinearProgram 856 <sage.numerical.mip.MixedIntegerLinearProgram>`. 857 858 - ``verbose`` -- integer (default: ``0``). Sets the level of 859 verbosity. Set to 0 by default, which means quiet. 849 860 850 861 OUTPUT: 851 862 … … 908 919 if value_only and g.is_overfull(): 909 920 return max(g.degree())+1 910 921 911 p = MixedIntegerLinearProgram(maximization=True )922 p = MixedIntegerLinearProgram(maximization=True, solver = solver) 912 923 color = p.new_variable(dim=2) 913 924 obj = {} 914 925 k = max(g.degree()) … … 932 943 p.set_binary(color) 933 944 try: 934 945 if value_only: 935 p.solve(objective_only=True, log= log)946 p.solve(objective_only=True, log=verbose) 936 947 else: 937 chi = p.solve(log= log)948 chi = p.solve(log=verbose) 938 949 except MIPSolverException: 939 950 if value_only: 940 951 return k + 1 941 952 else: 942 953 # if the coloring with Delta colors fails, tries Delta + 1 943 return edge_coloring(g, vizing=True, hex_colors=hex_colors, log=log) 954 return edge_coloring(g, 955 vizing=True, 956 hex_colors=hex_colors, 957 verbose=verbose, 958 solver = solver) 944 959 if value_only: 945 960 return k 946 961 # Builds the color classes … … 1023 1038 g.delete_vertex(n) 1024 1039 return g 1025 1040 1026 def linear_arboricity(g, hex_colors=False, value_only=False, k=1, **kwds):1041 def linear_arboricity(g, k=1, hex_colors=False, value_only=False, solver = None, verbose = 0): 1027 1042 r""" 1028 1043 Computes the linear arboricity of the given graph. 1029 1044 … … 1070 1085 - If ``k=None``, computes a decomposition using the 1071 1086 least possible number of colors. 1072 1087 1073 - ``**kwds`` -- arguments to be passed down to the ``solve`` 1074 function of ``MixedIntegerLinearProgram``. See the documentation 1075 of ``MixedIntegerLinearProgram.solve`` for more informations. 1088 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 1089 solver to be used. If set to ``None``, the default one is 1090 used. For more information on LP solvers and which default 1091 solver is used, see the method :meth:`solve 1092 <sage.numerical.mip.MixedIntegerLinearProgram.solve>` of the 1093 class :class:`MixedIntegerLinearProgram 1094 <sage.numerical.mip.MixedIntegerLinearProgram>`. 1095 1096 - ``verbose`` -- integer (default: ``0``). Sets the level of 1097 verbosity. Set to 0 by default, which means quiet. 1076 1098 1077 1099 ALGORITHM: 1078 1100 … … 1119 1141 1120 1142 if k is None: 1121 1143 try: 1122 return linear_arboricity(g, value_only = value_only,hex_colors = hex_colors, k = (Integer(max(g.degree()))/2).ceil() ) 1144 return linear_arboricity(g, 1145 k = (Integer(max(g.degree()))/2).ceil(), 1146 value_only = value_only, 1147 hex_colors = hex_colors, 1148 solver = solver, 1149 verbose = verbose) 1123 1150 except ValueError: 1124 return linear_arboricity(g, value_only = value_only,hex_colors = hex_colors, k = 0) 1151 return linear_arboricity(g, 1152 k = 0, 1153 value_only = value_only, 1154 hex_colors = hex_colors, 1155 solver = solver, 1156 verbose = verbose) 1125 1157 elif k==1: 1126 1158 k = (Integer(1+max(g.degree()))/2).ceil() 1127 1159 elif k==0: … … 1130 1162 from sage.numerical.mip import MixedIntegerLinearProgram, MIPSolverException, Sum 1131 1163 from sage.plot.colors import rainbow 1132 1164 1133 p = MixedIntegerLinearProgram( )1165 p = MixedIntegerLinearProgram(solver = solver) 1134 1166 1135 1167 1136 1168 # c is a boolean value such that c[i][(u,v)] = 1 if and only if (u,v) is colored with i … … 1167 1199 1168 1200 try: 1169 1201 if value_only: 1170 return p.solve(objective_only = True )1202 return p.solve(objective_only = True, log = verbose) 1171 1203 else: 1172 p.solve( )1204 p.solve(log = verbose) 1173 1205 1174 1206 except MIPSolverException: 1175 1207 if k == (Integer(max(g.degree()))/2).ceil(): … … 1198 1230 else: 1199 1231 return answer 1200 1232 1201 def acyclic_edge_coloring(g, hex_colors=False, value_only=False, k=0, **kwds):1233 def acyclic_edge_coloring(g, hex_colors=False, value_only=False, k=0, solver = None, verbose = 0): 1202 1234 r""" 1203 1235 Computes an acyclic edge coloring of the current graph. 1204 1236 … … 1252 1284 - If ``k=None``, computes a decomposition using the 1253 1285 least possible number of colors. 1254 1286 1255 - ``**kwds`` -- arguments to be passed down to the ``solve`` 1256 function of ``MixedIntegerLinearProgram``. See the documentation 1257 of ``MixedIntegerLinearProgram.solve`` for more informations. 1287 - ``solver`` -- (default: ``None``) Specify a Linear Program (LP) 1288 solver to be used. If set to ``None``, the default one is 1289 used. For more information on LP solvers and which default 1290 solver is used, see the method :meth:`solve 1291 <sage.numerical.mip.MixedIntegerLinearProgram.solve>` of the 1292 class :class:`MixedIntegerLinearProgram 1293 <sage.numerical.mip.MixedIntegerLinearProgram>`. 1294 1295 - ``verbose`` -- integer (default: ``0``). Sets the level of 1296 verbosity. Set to 0 by default, which means quiet. 1258 1297 1259 1298 ALGORITHM: 1260 1299 … … 1311 1350 1312 1351 while True: 1313 1352 try: 1314 return acyclic_edge_coloring(g, value_only = value_only,hex_colors = hex_colors, k = k) 1353 return acyclic_edge_coloring(g, 1354 value_only = value_only, 1355 hex_colors = hex_colors, 1356 k = k, 1357 solver = solver, 1358 verbose = verbose) 1315 1359 except ValueError: 1316 1360 k = k+1 1317 1361 … … 1323 1367 from sage.numerical.mip import MixedIntegerLinearProgram, MIPSolverException, Sum 1324 1368 from sage.plot.colors import rainbow 1325 1369 1326 p = MixedIntegerLinearProgram( )1370 p = MixedIntegerLinearProgram(solver = solver) 1327 1371 1328 1372 # c is a boolean value such that c[i][(u,v)] = 1 if and only if (u,v) is colored with i 1329 1373 c = p.new_variable(dim=2) … … 1360 1404 1361 1405 try: 1362 1406 if value_only: 1363 return p.solve(objective_only = True, **kwds)1407 return p.solve(objective_only = True, log = verbose) 1364 1408 else: 1365 p.solve( **kwds)1409 p.solve(log = verbose) 1366 1410 1367 1411 except MIPSolverException: 1368 1412 if k == max(g.degree()) + 2: -
sage/numerical/all.py
diff -r c759dc92eeb3 -r f7037b2573b1 sage/numerical/all.py
a b 2 2 find_minimum_on_interval,minimize,minimize_constrained, 3 3 linear_program, find_fit) 4 4 from sage.numerical.mip import MixedIntegerLinearProgram 5 from sage.numerical.backends.generic_backend import default_mip_solver -
sage/numerical/backends/generic_backend.pyx
diff -r c759dc92eeb3 -r f7037b2573b1 sage/numerical/backends/generic_backend.pyx
a b 783 783 784 784 raise NotImplementedError() 785 785 786 default_solver = None 787 788 def default_mip_solver(solver = None): 789 r""" 790 Returns/Sets the default MILP Solver used by Sage 791 792 INPUT: 793 794 - ``solver`` -- defines the solver to use: 795 796 - GLPK (``solver="GLPK"``). See the `GLPK 797 <http://www.gnu.org/software/glpk/>`_ web site. 798 799 - COIN Branch and Cut (``solver="Coin"``). See the `COIN-OR 800 <http://www.coin-or.org>`_ web site. 801 802 - CPLEX (``solver="CPLEX"``). See the 803 `CPLEX <http://www.ilog.com/products/cplex/>`_ web site. 804 An interface to CPLEX is not yet implemented. 805 806 ``solver`` should then be equal to one of ``"GLPK"``, 807 ``"Coin"``, ``"CPLEX"``. 808 809 - If ``solver=None`` (default), the current default solver's name is 810 returned. 811 812 OUTPUT: 813 814 This function returns the current default solver's name if ``solver = None`` 815 (default). Otherwise, it sets the default solver to the one given. If this 816 solver does not exist, or is not available, a ``ValueError`` exception is 817 raised. 818 819 EXAMPLE:: 820 821 sage: former_solver = default_mip_solver() 822 sage: default_mip_solver("GLPK") 823 sage: default_mip_solver() 824 'GLPK' 825 sage: default_mip_solver("Yeahhhhhhhhhhh") 826 Traceback (most recent call last): 827 ... 828 ValueError: 'solver' should be set to 'GLPK', 'Coin', 'CPLEX' or None. 829 sage: default_mip_solver(former_solver) 830 """ 831 global default_solver 832 833 if solver is None: 834 835 if default_solver is not None: 836 return default_solver 837 838 else: 839 for s in ["CPLEX", "Coin", "GLPK"]: 840 try: 841 default_mip_solver(s) 842 return s 843 except ValueError: 844 pass 845 846 elif solver == "CPLEX": 847 try: 848 from sage.numerical.backends.cplex_backend import CPLEXBackend 849 default_solver = solver 850 except ImportError: 851 raise ValueError("CPLEX is not available. Please refer to the documentation to install it.") 852 853 elif solver == "Coin": 854 try: 855 from sage.numerical.backends.coin_backend import CoinBackend 856 default_solver = solver 857 except ImportError: 858 raise ValueError("COIN is not available. Please refer to the documentation to install it.") 859 860 elif solver == "GLPK": 861 default_solver = solver 862 863 else: 864 raise ValueError("'solver' should be set to 'GLPK', 'Coin', 'CPLEX' or None.") 786 865 787 866 cpdef GenericBackend get_solver(constraint_generation = False, solver = None): 788 867 r""" … … 802 881 `CPLEX <http://www.ilog.com/products/cplex/>`_ web site. 803 882 An interface to CPLEX is not yet implemented. 804 883 805 ``solver`` should then be equal to one of ``"GLPK"``, 806 ``"Coin"``, ``"CPLEX"``, or ``None``. If ``solver=None`` 807 (default), the solvers are tried in this order : 808 809 * CPLEX 810 * Coin 811 * GLPK 812 813 A backend corresponding to the first solver available is then 814 returned 884 ``solver`` should then be equal to one of ``"GLPK"``, ``"Coin"``, 885 ``"CPLEX"``, or ``None``. If ``solver=None`` (default), the default 886 solver is used (see ``default_mip_solver`` method. 815 887 816 888 - ``constraint_generation`` (boolean) -- whether the solver 817 889 returned is to be used for constraint/variable generation. As … … 820 892 ensures that the backend to Coin is not returned when ``solver = 821 893 None``. This is set to ``False`` by default. 822 894 895 .. SEEALSO:: 896 897 - :func:`default_mip_solver` -- Returns/Sets the default MIP solver. 898 823 899 EXAMPLE:: 824 900 825 901 sage: from sage.numerical.backends.generic_backend import get_solver 826 902 sage: p = get_solver() 827 828 903 """ 829 904 830 905 if solver is None: 906 solver = default_mip_solver() 907 908 # We do not want to use Coin for constraint_generation. It just does not 909 # work with it. 910 if solver == "Coin" and constraint_generation: 911 solver = "GLPK" 831 912 832 try: 833 from sage.numerical.backends.cplex_backend import CPLEXBackend 834 return CPLEXBackend() 835 except ImportError: 836 pass 837 838 try: 839 if not constraint_generation: 840 from sage.numerical.backends.coin_backend import CoinBackend 841 return CoinBackend() 842 except ImportError: 843 pass 844 845 from sage.numerical.backends.glpk_backend import GLPKBackend 846 return GLPKBackend() 847 848 elif solver == "Coin": 913 if solver == "Coin": 849 914 from sage.numerical.backends.coin_backend import CoinBackend 850 915 return CoinBackend() 851 916 -
sage/numerical/mip.pyx
diff -r c759dc92eeb3 -r f7037b2573b1 sage/numerical/mip.pyx
a b 92 92 cdef class MixedIntegerLinearProgram: 93 93 r""" 94 94 The ``MixedIntegerLinearProgram`` class is the link between Sage, linear 95 programming (LP) and mixed integer programming (MIP) solvers. See the 96 Wikipedia article on 97 `linear programming <http://en.wikipedia.org/wiki/Linear_programming>`_ 98 for further information. A mixed integer program consists of variables, 99 linear constraints on these variables, and an objective function which is 100 to be maximised or minimised under these constraints. An instance of 101 ``MixedIntegerLinearProgram`` also requires the information on the 102 direction of the optimization. 95 programming (LP) and mixed integer programming (MIP) solvers. 103 96 104 A ``MixedIntegerLinearProgram`` (or ``LP``) is defined as a maximization 105 if ``maximization=True`` and is a minimization if ``maximization=False``. 97 See the Wikipedia article on `linear programming 98 <http://en.wikipedia.org/wiki/Linear_programming>`_ for further information. 99 100 A mixed integer program consists of variables, linear constraints on these 101 variables, and an objective function which is to be maximised or minimised 102 under these constraints. An instance of ``MixedIntegerLinearProgram`` also 103 requires the information on the direction of the optimization. 106 104 107 105 INPUT: 108 106 107 - ``solver`` -- 3 solvers should be available through this class: 108 109 - GLPK (``solver="GLPK"``). See the `GLPK 110 <http://www.gnu.org/software/glpk/>`_ web site. 111 112 - COIN Branch and Cut (``solver="Coin"``). See the `COIN-OR 113 <http://www.coin-or.org>`_ web site. 114 115 - CPLEX (``solver="CPLEX"``). See the `CPLEX 116 <http://www.ilog.com/products/cplex/>`_ web site. An interface to 117 CPLEX is not yet implemented. 118 119 ``solver`` should then be equal to one of ``"GLPK"``, ``"Coin"``, 120 ``"CPLEX"``, or ``None``. 121 122 - If ``solver=None`` (default), the default solver is used (see 123 ``default_mip_solver`` method. 124 109 125 - ``maximization`` 110 126 111 - When set to ``True`` (default), the ``MixedIntegerLinearProgram`` is 112 defined as a maximization. 113 - When set to ``False``, the ``MixedIntegerLinearProgram`` is defined as 114 a minimization. 127 - When set to ``True`` (default), the ``MixedIntegerLinearProgram`` 128 is defined as a maximization. 129 130 - When set to ``False``, the ``MixedIntegerLinearProgram`` is 131 defined as a minimization. 132 133 .. SEEALSO:: 134 135 - :func:`default_mip_solver` -- Returns/Sets the default MIP solver. 115 136 116 137 EXAMPLES: 117 138 … … 136 157 137 158 - ``solver`` -- 3 solvers should be available through this class: 138 159 139 - GLPK (``solver="GLPK"``). See the 140 `GLPK<http://www.gnu.org/software/glpk/>`_ web site.160 - GLPK (``solver="GLPK"``). See the `GLPK 161 <http://www.gnu.org/software/glpk/>`_ web site. 141 162 142 - COIN Branch and Cut (``solver="Coin"``). See the143 `COIN-OR<http://www.coin-or.org>`_ web site.163 - COIN Branch and Cut (``solver="Coin"``). See the `COIN-OR 164 <http://www.coin-or.org>`_ web site. 144 165 145 - CPLEX (``solver="CPLEX"``). See the 146 `CPLEX <http://www.ilog.com/products/cplex/>`_ web site.147 An interface toCPLEX is not yet implemented.166 - CPLEX (``solver="CPLEX"``). See the `CPLEX 167 <http://www.ilog.com/products/cplex/>`_ web site. An interface to 168 CPLEX is not yet implemented. 148 169 149 ``solver`` should then be equal to one of ``"GLPK"``, 150 ``"Coin"``, ``"CPLEX"``, or ``None``. If ``solver=None`` 151 (default), the solvers are tried in this order : 152 153 * CPLEX 154 * Coin 155 * GLPK 156 157 A backend corresponding to the first solver available is 158 then returned 159 160 170 ``solver`` should then be equal to one of ``"GLPK"``, ``"Coin"``, 171 ``"CPLEX"``, or ``None``. If ``solver=None`` (default), the default 172 solver is used (see ``default_mip_solver`` method. 161 173 162 174 - ``maximization`` 163 175 … … 166 178 - When set to ``False``, the ``MixedIntegerLinearProgram`` is 167 179 defined as a minimization. 168 180 181 .. SEEALSO:: 182 183 - :meth:`default_mip_solver` -- Returns/Sets the default MIP solver. 184 185 169 186 EXAMPLE:: 170 187 171 188 sage: p = MixedIntegerLinearProgram(maximization=True)
