Ticket #10341: trac_10431-part4.patch

File trac_10431-part4.patch, 29.2 KB (added by ncohen, 10 years ago)
  • sage/numerical/backends/coin_backend.pyx

    # HG changeset patch
    # User Nathann Cohen <nathann.cohen@gmail.com>
    # Date 1291057723 -3600
    # Node ID 214981100765f40322a4c90db831d069bbec0689
    # Parent  54d2524eb88c432db19ab7da9ef48c1ec80c2f1b
    trac 10341 - some other modifications to the new LP interface, for CPLEX and Coin
    
    diff -r 54d2524eb88c -r 214981100765 sage/numerical/backends/coin_backend.pyx
    a b  
    3535        else:
    3636            self.set_sense(-1)
    3737
    38     cpdef int add_variable(self, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False) except -1:
     38    cpdef int add_variable(self, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False, obj=0.0, name=None) except -1:
    3939        """
    4040        Add a variable.
    4141
     
    5454
    5555        - ``integer`` - ``True`` if the variable is binary (default: ``False``).
    5656
     57        - ``obj`` - (optional) coefficient of this variable in the objective function (default: 0.0)
     58
     59        - ``name`` - an optional name for the newly added variable (default: ``None``).
     60
    5761        OUTPUT: The index of the newly created variable           
    5862
     63        .. NOTE::
     64
     65            The names are ignored by Coin at the moment !!!
     66
    5967        EXAMPLE::
    6068
    6169            sage: from sage.numerical.backends.generic_backend import get_solver
     
    7482            Traceback (most recent call last):
    7583            ...
    7684            ValueError: ...           
     85            sage: p.add_variable(name='x',obj=1.0)                  # optional - Coin
     86            3
     87            sage: p.col_name(3)                                     # optional - Coin
     88            ''
     89            sage: p.objective_coefficient(3)                        # optional - Coin
     90            1.0
     91
    7792        """
    7893
    7994        cdef int vtype = int(bool(binary)) + int(bool(continuous)) + int(bool(integer))
     
    97112        elif integer:
    98113            self.set_variable_type(n,1)
    99114
     115        # THE NAMES ARE IGNORED BY COIN AT THE MOMENT
     116
     117        if obj:
     118            self.si.setObjCoeff(n, obj)
     119           
    100120        return n
    101121
    102     cpdef int add_variables(self, int number, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False) except -1:
     122    cpdef int add_variables(self, int number, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False, obj=0.0, names=None) except -1:
    103123        """
    104124        Add ``number`` new variables.
    105125
     
    120140
    121141        - ``integer`` - ``True`` if the variable is binary (default: ``False``).
    122142
     143        - ``obj`` - (optional) coefficient of all variables in the objective function (default: 0.0)
     144
     145        - ``names`` - optional list of names (default: ``None``)
     146
    123147        OUTPUT: The index of the variable created last.
    124148
     149        .. NOTE::
     150
     151            The names are ignored by Coin at the moment !!!
     152
    125153        EXAMPLE::
    126154
    127155            sage: from sage.numerical.backends.generic_backend import get_solver
     
    132160            4
    133161            sage: p.ncols()                                                # optional - Coin
    134162            5
    135             sage: p.add_variables(2, lower_bound=-2.0, integer=True)      # optional - Coin
     163            sage: p.add_variables(2, lower_bound=-2.0, integer=True, names=['a','b']) # optional - Coin
    136164            6
    137165        """
    138166        cdef int vtype = int(bool(binary)) + int(bool(continuous)) + int(bool(integer))
     
    160188            elif integer:
    161189                self.set_variable_type(n + i,1)
    162190
     191            if obj:
     192                self.si.setObjCoeff(n + i, obj)
     193
     194        # THE NAMES ARE IGNORED BY COIN AT THE MOMENT
     195
    163196        return n + number -1
    164197
    165198    cpdef set_variable_type(self, int variable, int vtype):
     
    221254        """
    222255        self.si.setObjSense(-sense)
    223256
    224     cpdef set_objective_coefficient(self, int variable, double coeff):
    225         r"""
    226         Sets the coefficient of a variable in the objective function
     257    cpdef objective_coefficient(self, int variable, coeff=None):
     258        """
     259        Set or get the coefficient of a variable in the objective function
    227260
    228261        INPUT:
    229262
    230263        - ``variable`` (integer) -- the variable's id
    231264
    232         - ``coeff`` (double) -- its coefficient
     265        - ``coeff`` (double) -- its coefficient or ``None`` for
     266          reading (default: ``None``)
    233267
    234268        EXAMPLE::
    235269
    236270            sage: from sage.numerical.backends.generic_backend import get_solver
    237             sage: p = get_solver(solver = "Coin")  # optional - Coin
    238             sage: p.add_variable()                                 # optional - Coin
     271            sage: p = get_solver(solver = "Coin")       # optional -- Coin
     272            sage: p.add_variable()                      # optional -- Coin
    239273            0
    240             sage: p.get_objective_coefficient(0)                         # optional - Coin
     274            sage: p.objective_coefficient(0)            # optional -- Coin
    241275            0.0
    242             sage: p.set_objective_coefficient(0,2)                       # optional - Coin
    243             sage: p.get_objective_coefficient(0)                         # optional - Coin
     276            sage: p.objective_coefficient(0,2)          # optional -- Coin
     277            sage: p.objective_coefficient(0)            # optional -- Coin
    244278            2.0
    245279        """
    246 
    247         self.si.setObjCoeff(variable, coeff)
     280        if coeff is not None:
     281            self.si.setObjCoeff(variable, coeff)
     282        else:
     283            return self.si.getObjCoefficients()[variable]
    248284
    249285    cpdef set_objective(self, list coeff):
    250286        r"""
     
    262298            sage: p.add_variables(5)                                 # optional - Coin
    263299            4
    264300            sage: p.set_objective([1, 1, 2, 1, 3])                   # optional - Coin
    265             sage: map(lambda x :p.get_objective_coefficient(x), range(5))  # optional - Coin
     301            sage: map(lambda x :p.objective_coefficient(x), range(5))  # optional - Coin
    266302            [1.0, 1.0, 2.0, 1.0, 3.0]
    267303        """
    268304
     
    292328        msg = model.messageHandler()
    293329        msg.setLogLevel(level)
    294330
    295     cpdef add_linear_constraints(self, int number, lower_bound, upper_bound):
     331    cpdef add_linear_constraints(self, int number, lower_bound, upper_bound, names = None):
    296332        """
    297333        Add ``'number`` linear constraints.
    298334
     
    304340
    305341        - ``upper_bound`` - an upper bound, either a real value or ``None``
    306342
     343        - ``names`` - an optional list of names (default: ``None``)
     344
     345        .. NOTE::
     346
     347            The names are ignored by Coin at the moment !!!
     348
    307349        EXAMPLE::
    308350
    309351            sage: from sage.numerical.backends.generic_backend import get_solver
     
    315357            ([], [])
    316358            sage: p.row_bounds(4)                        # optional - Coin
    317359            (None, 2.0)
     360            sage: p.add_linear_constraints(2, None, 2, names=['foo','bar']) # optional - Coin
    318361        """
    319362
    320363        cdef int i
    321364        for 0<= i<number:
    322365            self.add_linear_constraint([],lower_bound, upper_bound)
    323366
    324     cpdef add_linear_constraint(self, coefficients, lower_bound, upper_bound):
     367    cpdef add_linear_constraint(self, coefficients, lower_bound, upper_bound, name = None):
    325368        """
    326369        Add a linear constraint.
    327370
     
    334377        - ``lower_bound`` - a lower bound, either a real value or ``None``
    335378
    336379        - ``upper_bound`` - an upper bound, either a real value or ``None``
     380
     381        - ``name`` - an optional name for this row (default: ``None``)
     382
     383        .. NOTE::
     384
     385            The names are ignored by Coin at the moment !!!
    337386 
    338387        EXAMPLE::
    339388
     
    346395            ([0, 1, 2, 3, 4], [0.0, 1.0, 2.0, 3.0, 4.0])
    347396            sage: p.row_bounds(0)                                              # optional - Coin
    348397            (2.0, 2.0)
     398            sage: p.add_linear_constraint( zip(range(5), range(5)), 1.0, 1.0, name='foo') # optional - Coin
     399            sage: p.row_name(1)                                                           # optional - Coin
     400            ''
     401
    349402        """
    350403        if lower_bound is None and upper_bound is None:
    351404            raise ValueError("At least one of 'upper_bound' or 'lower_bound' must be set.")
     
    481534        return (lb[i] if lb[i] != - self.si.getInfinity() else None,
    482535                ub[i] if ub[i] != + self.si.getInfinity() else None)
    483536
    484     cpdef double get_objective_coefficient(self, int index):
    485         """
    486         Returns the value of the objective function.
    487 
    488         .. NOTE::
    489 
    490            Has no meaning unless ``solve`` has been called before.
    491 
    492         EXAMPLE::
    493 
    494             sage: from sage.numerical.backends.generic_backend import get_solver
    495             sage: p = get_solver(solver = "Coin")  # optional - Coin
    496             sage: p.add_variables(2)                               # optional - Coin
    497             1
    498             sage: p.add_linear_constraint([(0, 1), (1, 2)], None, 3)          # optional - Coin
    499             sage: p.set_objective([2, 5])                          # optional - Coin
    500             sage: p.solve()                                        # optional - Coin
    501             0
    502             sage: p.get_objective_value()                          # optional - Coin
    503             7.5
    504             sage: p.get_variable_value(0)                          # optional - Coin
    505             0.0
    506             sage: p.get_variable_value(1)                          # optional - Coin
    507             1.5
    508         """
    509         return self.si.getObjCoefficients()[index]
    510 
    511537    cpdef add_col(self, list indices, list coeffs):
    512538        r"""
    513539        Adds a column.
     
    582608            0
    583609            sage: p.add_linear_constraint([(0, 1)], None, 4) # optional - Coin
    584610            sage: p.add_linear_constraint([(0, 1)], 6, None) # optional - Coin
    585             sage: p.set_objective_coefficient(0,1)        # optional - Coin
     611            sage: p.objective_coefficient(0,1)        # optional - Coin
    586612            sage: p.solve()                         # optional - Coin
    587613            Traceback (most recent call last):
    588614            ...
     
    897923            sage: print p.problem_name()                        # optional - Coin
    898924            <BLANKLINE>
    899925        """
    900 
    901926        if name == NULL:
    902927            return ""
    903928
    904929
    905     cpdef row_name(self, int index, char * name = NULL):
     930    cpdef row_name(self, int index):
    906931        r"""
    907         Returns or defines the ``index`` th row name
     932        Returns the ``index`` th row name
    908933
    909934        INPUT:
    910935
    911936        - ``index`` (integer) -- the row's id
    912937
    913         - ``name`` (``char *``) -- its name. When set to ``NULL``
    914           (default), the method returns the current name.
    915 
    916938        EXAMPLE::
    917939
    918940            sage: from sage.numerical.backends.generic_backend import get_solver
    919             sage: p = get_solver(solver = "Coin")  # optional - Coin
    920             sage: p.add_linear_constraints(1, 2, None)                      # optional - Coin
    921             sage: p.row_name(0, "Empty constraint 1")          # optional - Coin
    922             sage: print p.row_name(0)                          # optional - Coin
     941            sage: p = get_solver(solver = "Coin")                                     # optional - Coin
     942            sage: p.add_linear_constraints(1, 2, None, names=['Empty constraint 1'])  # optional - Coin
     943            sage: print p.row_name(0)                                                 # optional - Coin
    923944            <BLANKLINE>
    924945        """
    925         if name == NULL:
    926             return ""
     946        return ""
    927947
    928     cpdef col_name(self, int index, char * name = NULL):
     948    cpdef col_name(self, int index):
    929949        r"""
    930         Returns or defines the ``index`` th col name
     950        Returns the ``index`` th col name
    931951
    932952        INPUT:
    933953
    934954        - ``index`` (integer) -- the col's id
    935955
    936         - ``name`` (``char *``) -- its name. When set to ``NULL``
    937           (default), the method returns the current name.
    938 
    939956        EXAMPLE::
    940957
    941958            sage: from sage.numerical.backends.generic_backend import get_solver
    942             sage: p = get_solver(solver = "Coin")  # optional - Coin
    943             sage: p.add_variable()                                 # optional - Coin
     959            sage: p = get_solver(solver = "Coin")          # optional - Coin
     960            sage: p.add_variable(name='I am a variable')   # optional - Coin
    944961            0
    945             sage: p.col_name(0, "I am a variable")             # optional - Coin
    946             sage: print p.col_name(0)                          # optional - Coin
     962            sage: print p.col_name(0)                      # optional - Coin
    947963            <BLANKLINE>
    948964        """
    949 
    950         if name == NULL:
    951             return ""
     965        return ""
  • sage/numerical/backends/cplex_backend.pyx

    diff -r 54d2524eb88c -r 214981100765 sage/numerical/backends/cplex_backend.pyx
    a b  
    3434        else:
    3535            self.set_sense(-1)
    3636
    37     cpdef int add_variable(self, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False) except -1:
     37    cpdef int add_variable(self, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False, obj=0.0, name=None) except -1:
    3838        """
    3939        Add a variable.
    4040
     
    5353
    5454        - ``integer`` - ``True`` if the variable is binary (default: ``False``).
    5555
     56        - ``obj`` - (optional) coefficient of this variable in the objective function (default: 0.0)
     57
     58        - ``name`` - an optional name for the newly added variable (default: ``None``).
     59
    5660        OUTPUT: The index of the newly created variable           
    5761
    5862        EXAMPLE::
     
    7377            Traceback (most recent call last):
    7478            ...
    7579            ValueError: ...           
     80            sage: p.add_variable(name='x',obj=1.0)                  # optional - CPLEX
     81            3
     82            sage: p.col_name(3)                                     # optional - CPLEX
     83            'x'
     84            sage: p.objective_coefficient(3)                        # optional - CPLEX
     85            1.0
     86
    7687        """
    77 
     88        cdef char * c_name
     89        cdef double c_coeff = obj
    7890        cdef int vtype = int(bool(binary)) + int(bool(continuous)) + int(bool(integer))
    7991        if  vtype == 0:
    8092            continuous = True           
     
    98110        elif integer:
    99111            self.set_variable_type(n,1)
    100112
     113        if name is not None:
     114            c_name = name
     115            status = CPXchgcolname(self.env, self.lp, 1, &n, &c_name)
     116            check(status)
     117
     118        if c_coeff:
     119            status = CPXchgobj(self.env, self.lp, 1, &n, &c_coeff)
     120            check(status)
     121       
    101122        return n
    102123
    103     cpdef int add_variables(self, int number, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False) except -1:
     124    cpdef int add_variables(self, int number, lower_bound=0.0, upper_bound=None, binary=False, continuous=False, integer=False, obj=0.0, names=None) except -1:
    104125        """
    105126        Add ``number`` new variables.
    106127
     
    121142
    122143        - ``integer`` - ``True`` if the variable is binary (default: ``False``).
    123144
     145        - ``obj`` - (optional) coefficient of all variables in the objective function (default: 0.0)
     146
     147        - ``names`` - optional list of names (default: ``None``)
     148
    124149        OUTPUT: The index of the variable created last.
    125150
    126151        EXAMPLE::
     
    133158            4
    134159            sage: p.ncols()                                                # optional - CPLEX
    135160            5
    136             sage: p.add_variables(2, lower_bound=-2.0, integer=True)      # optional - CPLEX
     161            sage: p.add_variables(2, lower_bound=-2.0, integer=True, names=['a','b']) # optional - CPLEX
    137162            6
    138163        """
     164        cdef char * c_name
     165        cdef double c_coeff = obj
    139166        cdef int vtype = int(bool(binary)) + int(bool(continuous)) + int(bool(integer))
    140167        if  vtype == 0:
    141168            continuous = True           
     
    149176        cdef int n
    150177        n = CPXgetnumcols(self.env, self.lp) - 1
    151178
    152         cdef int i
     179        cdef int i, j
    153180       
    154181        for 0<= i < number:
    155182            if lower_bound != 0.0:
     
    162189            elif integer:
    163190                self.set_variable_type(n - i,1)
    164191
     192            if names:
     193                j = n - i
     194                c_name = names[i]
     195                status = CPXchgcolname(self.env, self.lp, 1, &j, &c_name)
     196                check(status)
     197
     198            if c_coeff:
     199                j = n - i
     200                status = CPXchgobj(self.env, self.lp, 1, &j, &c_coeff)
     201                check(status)
     202
    165203        return n
    166204
    167205    cpdef set_variable_type(self, int variable, int vtype):
     
    228266
    229267        CPXchgobjsen(self.env, self.lp, -sense)
    230268
    231     cpdef set_objective_coefficient(self, int variable, double coeff):
    232         r"""
    233         Sets the coefficient of a variable in the objective function
     269    cpdef objective_coefficient(self, int variable, coeff=None):
     270        """
     271        Set or get the coefficient of a variable in the objective function
    234272
    235273        INPUT:
    236274
    237275        - ``variable`` (integer) -- the variable's id
    238276
    239         - ``coeff`` (double) -- its coefficient
     277        - ``coeff`` (double) -- its coefficient or ``None`` for
     278          reading (default: ``None``)
    240279
    241280        EXAMPLE::
    242281
    243282            sage: from sage.numerical.backends.generic_backend import get_solver
    244             sage: p = get_solver(solver = "CPLEX")  # optional - CPLEX
    245             sage: p.add_variable()                                 # optional - CPLEX
     283            sage: p = get_solver(solver = "CPLEX")       # optional -- CPLEX
     284            sage: p.add_variable()                      # optional -- CPLEX
    246285            0
    247             sage: p.get_objective_coefficient(0)                         # optional - CPLEX
     286            sage: p.objective_coefficient(0)            # optional -- CPLEX
    248287            0.0
    249             sage: p.set_objective_coefficient(0,2)                       # optional - CPLEX
    250             sage: p.get_objective_coefficient(0)                         # optional - CPLEX
     288            sage: p.objective_coefficient(0,2)          # optional -- CPLEX
     289            sage: p.objective_coefficient(0)            # optional -- CPLEX
    251290            2.0
    252291        """
    253292
    254293        cdef int status
    255         status = CPXchgobj(self.env, self.lp, 1, &variable, &coeff)
    256         check(status)
     294        cdef double value
     295       
     296        if coeff is None:
     297            status = CPXgetobj(self.env, self.lp, &value, variable, variable)
     298            check(status)
     299            return value
     300
     301        else:           
     302            value = coeff
     303            status = CPXchgobj(self.env, self.lp, 1, &variable, &value)
     304            check(status)
    257305
    258306    cpdef problem_name(self, char * name = NULL):
    259307        r"""
     
    307355            sage: p.add_variables(5)                                 # optional - CPLEX
    308356            4
    309357            sage: p.set_objective([1, 1, 2, 1, 3])                   # optional - CPLEX
    310             sage: map(lambda x :p.get_objective_coefficient(x), range(5))  # optional - CPLEX
     358            sage: map(lambda x :p.objective_coefficient(x), range(5))  # optional - CPLEX
    311359            [1.0, 1.0, 2.0, 1.0, 3.0]
    312360        """
    313361
     
    348396            status = CPXsetintparam (self.env, CPX_PARAM_SCRIND, CPX_ON)
    349397            check(status)
    350398
    351     cpdef add_linear_constraints(self, int number, lower_bound, upper_bound):
     399    cpdef add_linear_constraints(self, int number, lower_bound, upper_bound, names = None):
    352400        """
    353401        Add ``'number`` linear constraints.
    354402
     
    360408
    361409        - ``upper_bound`` - an upper bound, either a real value or ``None``
    362410
     411        - ``names`` - an optional list of names (default: ``None``)
     412
    363413        EXAMPLE::
    364414
    365415            sage: from sage.numerical.backends.generic_backend import get_solver
     
    371421            ([], [])
    372422            sage: p.row_bounds(4)                        # optional - CPLEX
    373423            (None, 2.0)
     424            sage: p.add_linear_constraints(2, None, 2, names=['foo','bar']) # optional - Coin
    374425        """
    375426        if lower_bound is None and upper_bound is None:
    376427            raise ValueError("At least one of 'upper_bound' or 'lower_bound' must be set.")
     
    380431        cdef double * bound = <double *> sage_malloc(number * sizeof(double))
    381432        cdef double * rng = NULL
    382433        cdef int i
     434        cdef char ** c_names = <char **> sage_malloc(number * sizeof(char *))
    383435
    384436        if upper_bound == lower_bound:
    385437            sense[0] = 'E'
     
    403455        elif lower_bound is not None:
    404456            sense[0] = 'G'
    405457            bound[0] = lower_bound
     458
     459        if names:
     460            c_names[0] = names[0]
    406461           
    407462        for 1<= i <number:
    408463            sense[i] = sense[0]
    409464            bound[i] = bound[0]
    410465            if rng != NULL:
    411466                rng[i] = rng[0]
     467            if names:
     468                c_names[i] = names[i]
    412469
    413         status = CPXnewrows(self.env, self.lp, number, bound, sense, rng, NULL)
     470        status = CPXnewrows(self.env, self.lp, number, bound, sense, rng, c_names if names else NULL)
    414471        check(status)       
    415472
    416     cpdef add_linear_constraint(self, coefficients, lower_bound, upper_bound):
     473    cpdef add_linear_constraint(self, coefficients, lower_bound, upper_bound, name = None):
    417474        """
    418475        Add a linear constraint.
    419476
     
    426483        - ``lower_bound`` - a lower bound, either a real value or ``None``
    427484
    428485        - ``upper_bound`` - an upper bound, either a real value or ``None``
     486
     487        - ``name`` - an optional name for this row (default: ``None``)
    429488 
    430489        EXAMPLE::
    431490
     
    438497            ([1, 2, 3, 4], [1.0, 2.0, 3.0, 4.0])
    439498            sage: p.row_bounds(0)                                              # optional - CPLEX
    440499            (2.0, 2.0)
     500            sage: p.add_linear_constraint( zip(range(5), range(5)), 1.0, 1.0, name='foo') # optional - CPLEX
     501            sage: p.row_name(1)                                                           # optional - CPLEX
     502            'foo'
     503
    441504        """
    442505        if lower_bound is None and upper_bound is None:
    443506            raise ValueError("At least one of 'upper_bound' or 'lower_bound' must be set.")
     
    448511        cdef int nrows = self.nrows()
    449512        cdef char sense
    450513
     514        cdef char * c_name
     515
    451516        cdef double * c_coeff
    452517        cdef int * c_indices
    453518        cdef int * c_row
     
    486551            sense = 'G'
    487552            bound = lower_bound
    488553
    489         status = CPXnewrows(self.env, self.lp, 1, &bound, &sense, &rng, NULL)
     554        if name:
     555            c_name = name
     556           
     557        status = CPXnewrows(self.env, self.lp, 1, &bound, &sense, &rng, NULL if (name is None) else &c_name)
     558
    490559        check(status)
    491560        status = CPXchgcoeflist(self.env, self.lp, n, c_row, c_indices, c_coeff)
    492561        check(status)
     
    629698        return (lb if lb != -CPX_INFBOUND else None,
    630699                ub if ub != +CPX_INFBOUND else None)
    631700
    632     cpdef double get_objective_coefficient(self, int index):
    633         r"""
    634         Sets the coefficient of a variable in the objective function
    635 
    636         INPUT:
    637 
    638         - ``variable`` (integer) -- the variable's id
    639 
    640         - ``coeff`` (double) -- its coefficient
    641 
    642         EXAMPLE::
    643 
    644             sage: from sage.numerical.backends.generic_backend import get_solver
    645             sage: p = get_solver(solver = "CPLEX")  # optional - CPLEX
    646             sage: p.add_variable()                                 # optional - CPLEX
    647             0
    648             sage: p.get_objective_coefficient(0)                         # optional - CPLEX
    649             0.0
    650             sage: p.set_objective_coefficient(0,2)                       # optional - CPLEX
    651             sage: p.get_objective_coefficient(0)                         # optional - CPLEX
    652             2.0
    653         """
    654 
    655         cdef int status
    656         cdef double value
    657         status = CPXgetobj(self.env, self.lp, &value, index, index)
    658         check(status)
    659         return value
    660            
    661 
    662701    cpdef add_col(self, list indices, list coeffs):
    663702        r"""
    664703        Adds a column.
     
    735774            sage: p.add_col(range(5), range(5))                   # optional - CPLEX
    736775            sage: p.solve()                                       # optional - CPLEX
    737776            0
    738             sage: p.set_objective_coefficient(0,1)                      # optional - CPLEX
     777            sage: p.objective_coefficient(0,1)                      # optional - CPLEX
    739778            sage: p.solve()                                       # optional - CPLEX
    740779            Traceback (most recent call last):
    741780            ...
     
    873912
    874913        return CPXgetnumrows(self.env, self.lp)
    875914
    876     cpdef row_name(self, int index, char * name = NULL):
     915    cpdef row_name(self, int index):
    877916        r"""
    878         Returns or defines the ``index`` th row name
     917        Return the ``index`` th row name
    879918
    880919        INPUT:
    881920
    882921        - ``index`` (integer) -- the row's id
    883922
    884         - ``name`` (``char *``) -- its name. When set to ``NULL``
    885           (default), the method returns the current name.
    886 
    887923        EXAMPLE::
    888924
    889925            sage: from sage.numerical.backends.generic_backend import get_solver
    890             sage: p = get_solver(solver = "CPLEX")  # optional - CPLEX
    891             sage: p.add_linear_constraints(1, 2, None)                      # optional - CPLEX
    892             sage: p.row_name(0, "Empty constraint 1")          # optional - CPLEX
    893             sage: p.row_name(0)                                # optional - CPLEX
     926            sage: p = get_solver(solver = "CPLEX")                                     # optional - CPLEX
     927            sage: p.add_linear_constraints(1, 2, None, names=['Empty constraint 1'])   # optional - CPLEX
     928            sage: p.row_name(0)                                                        # optional - CPLEX
    894929            'Empty constraint 1'
    895 
    896930        """
    897931
    898932        cdef int status
    899933        cdef int zero
    900934        cdef char * n
    901935
    902         if name == NULL:
    903             n = <char *>sage_malloc(500*sizeof(char))
    904             status = CPXgetrowname(self.env, self.lp, &n, n, 500, &zero, index, index)
    905             if status == 1219:
    906                 sage_free(n)
    907                 return ""
    908             check(status)
     936        n = <char *>sage_malloc(500*sizeof(char))
     937        status = CPXgetrowname(self.env, self.lp, &n, n, 500, &zero, index, index)
     938        if status == 1219:
     939            sage_free(n)
     940            return ""
     941        check(status)
    909942
    910             s = str(n)
    911             sage_free(n)
     943        s = str(n)
     944        sage_free(n)
    912945
    913             return s
     946        return s
    914947
    915             pass
    916         else:
    917             status = CPXchgrowname(self.env, self.lp, 1, &index, &name)
    918             check(status)
    919 
    920     cpdef col_name(self, int index, char * name = NULL):
     948    cpdef col_name(self, int index):
    921949        r"""
    922         Returns or defines the ``index`` th col name.
     950        Returns the ``index`` th col name.
    923951
    924952        INPUT:
    925953
    926954        - ``index`` (integer) -- the col's id
    927955
    928         - ``name`` (``char *``) -- its name. When set to ``NULL``
    929           (default), the method returns the current name.
    930 
    931956        EXAMPLE::
    932957
    933958            sage: from sage.numerical.backends.generic_backend import get_solver
    934             sage: p = get_solver(solver = "CPLEX")  # optional - CPLEX
    935             sage: p.add_variable()                                 # optional - CPLEX
     959            sage: p = get_solver(solver = "CPLEX")         # optional - CPLEX
     960            sage: p.add_variable(name='I am a variable')   # optional - CPLEX
    936961            0
    937             sage: p.col_name(0, "I am a variable")             # optional - CPLEX
    938             sage: p.col_name(0)                                # optional - CPLEX
     962            sage: p.col_name(0)                            # optional - CPLEX
    939963            'I am a variable'
    940964        """
    941965
     
    943967        cdef char * n
    944968        cdef int zero
    945969
    946         if name == NULL:
     970        n = <char *>sage_malloc(500*sizeof(char))
     971        status = CPXgetcolname(self.env, self.lp, &n, n, 500, &zero, index, index)
     972        if status == 1219:
     973            sage_free(n)
     974            return ""
     975        check(status)
    947976
    948             n = <char *>sage_malloc(500*sizeof(char))
    949             status = CPXgetcolname(self.env, self.lp, &n, n, 500, &zero, index, index)
    950             if status == 1219:
    951                 sage_free(n)
    952                 return ""
    953             check(status)
    954 
    955             s = str(n)
    956             sage_free(n)
    957             return s
    958 
    959         else:
    960             status = CPXchgcolname(self.env, self.lp, 1, &index, &name)
    961             check(status)
    962 
    963 
     977        s = str(n)
     978        sage_free(n)
     979        return s
    964980
    965981    cpdef bint is_variable_binary(self, int index):
    966982        r"""
  • sage/numerical/mip.pyx

    diff -r 54d2524eb88c -r 214981100765 sage/numerical/mip.pyx
    a b  
    367367        Displays the ``MixedIntegerLinearProgram`` in a human-readable
    368368        way.
    369369
    370         EXAMPLES::
     370        EXAMPLES:
     371
     372        When constraints have names ::
    371373
    372374            sage: p = MixedIntegerLinearProgram()
    373375            sage: x = p.new_variable()