The first time it doesn't raise an error because there is no set of
multiple vectors that needs to be formed. However you do need to call
set_immutable on every vector that you pass in, including the first one.
Then it'll work.
On Friday, March 20, 2015 at 1:25:42 PM UTC+1, Jayant Apte wrote:
>
> Hi Volker
> I think I understand mutability. What I was wondering was in above MWE,
> everything works for the first time I insert an inequality and then the
> second time it raises this error.( Did you mean to say I should set the
> vectors immutable somewhere inside your code? Just tried setting "ineq"
> immutable which doesnt work.)
>
> I want to use DD iteration as a routine in a polyhedral projection
> algorithm. Now I could pull out DD iteration code from
> double_description.py (have already done so. It works fine. I like the
> caching for zero_set.), but if I am to submit the projection code as a
> ticket, it would mean duplication of code.
> Thanks
>
> On Thursday, 19 March 2015 17:38:49 UTC-4, Volker Braun wrote:
>>
>> The double description implementation isn't really meant to be used
>> directly, which is also why it is not by default in the global namespace.
>>
>> Basically all input must be immutable to be able to use caching. To make
>> an immutable vector, use:
>>
>> sage: v = vector([1,2,3])
>> sage: v.set_immutable()
>>
>> Immutable means the entries can't be changed any more:
>>
>> sage: v[0] = 1
>>
>> ---------------------------------------------------------------------------
>> ValueError Traceback (most recent call
>> last)
>> <ipython-input-6-cd90ec5e6613> in <module>()
>> ----> 1 v[Integer(0)] = Integer(1)
>>
>> /mnt/disk/home/release/Sage/src/sage/modules/vector_integer_dense.pyx in
>> sage.modules.vector_integer_dense.Vector_integer_dense.__setitem__
>> (build/cythonized/sage/modules/vector_integer_dense.c:3829)()
>> 183 """
>> 184 if not self._is_mutable:
>> --> 185 raise ValueError("vector is immutable; please change
>> a copy instead (use copy())")
>> 186 cdef Integer z
>> 187 cdef Py_ssize_t k, d, n
>>
>> ValueError: vector is immutable; please change a copy instead (use copy())
>>
>>
>> On Thursday, March 19, 2015 at 8:28:47 PM UTC+1, Jayant Apte wrote:
>>>
>>> Hi
>>> I was trying to use add_inequality( ) method
>>> of
>>> sage.geometry.polyhedron.double_description.StandardDoubleDescriptionPair
>>> when I encountered an error (see the MWE below). Upon pulling out the
>>> functions required for add_inequality( ) and running it seperately, it
>>> works fine. I wonder if this is a bug or I'm doing something wrong:
>>>
>>> sage: from sage.geometry.polyhedron.double_description import
>>> StandardAlgorithm
>>> sage: A= matrix([(-1, -1, 0, 0), (-1, 0, 0, 0), (-1, 0, -1, 0), (-1, 0,
>>> 0, -1)])
>>> sage: DD, _ = StandardAlgorithm(A).initial_pair()
>>> sage: ineq=vector([-1, -1, -1, -1])
>>> sage: DD = DD.add_inequality(ineq);
>>> sage: print DD
>>> Double description pair (A, R) defined by
>>> [-1 -1 0 0]
>>> [-1 0 0 0] [ 0 0 0 -1 -1 -1]
>>> A = [-1 0 -1 0], R = [-1 0 0 -1 1 1]
>>> [-1 0 0 -1] [ 0 -1 0 1 -1 1]
>>> [-1 -1 -1 -1] [ 0 0 -1 1 1 -1]
>>> sage: ineq=vector([-1,0,-1,-1])
>>> sage: DD = DD.add_inequality(ineq);
>>>
>>> ---------------------------------------------------------------------------
>>> TypeError Traceback (most recent call
>>> last)
>>> <ipython-input-8-d81bd32d70b2> in <module>()
>>> ----> 1 DD = DD.add_inequality(ineq);
>>>
>>> /home/jayant/Software/sagemath6_6/sage/local/lib/python2.7/site-packages/sage/geometry/polyhedron/double_description.pyc
>>>
>>> in add_inequality(self, a)
>>> 681 R_new = []
>>> 682 for rp, rn in CartesianProduct(R_pos, R_neg):
>>> --> 683 if not self.are_adjacent(rp, rn):
>>> 684 continue
>>> 685 r = a.inner_product(rp) * rn - a.inner_product(rn) *
>>> rp
>>>
>>> /home/jayant/Software/sagemath6_6/sage/local/lib/python2.7/site-packages/sage/geometry/polyhedron/double_description.pyc
>>>
>>> in are_adjacent(self, r1, r2)
>>> 418 Z_r1 = self.zero_set(r1)
>>> 419 Z_r2 = self.zero_set(r2)
>>> --> 420 Z_12 = set(Z_r1).intersection(Z_r2)
>>> 421 A_Z12 = matrix(self.problem.base_ring(), list(Z_12))
>>> 422 return A_Z12.rank() == self.problem.dim() - 2
>>>
>>> /home/jayant/Software/sagemath6_6/sage/src/sage/modules/vector_integer_dense.pyx
>>>
>>> in sage.modules.vector_integer_dense.Vector_integer_dense.__hash__
>>> (build/cythonized/sage/modules/vector_integer_dense.c:3589)()
>>> 170 True
>>> 171 """
>>> --> 172 return
>>> free_module_element.FreeModuleElement.__hash__(self)
>>> 173
>>> 174 def __setitem__(self, i, value):
>>>
>>> /home/jayant/Software/sagemath6_6/sage/src/sage/modules/free_module_element.pyx
>>>
>>> in sage.modules.free_module_element.FreeModuleElement.__hash__
>>> (build/cythonized/sage/modules/free_module_element.c:7403)()
>>> 963 """
>>> 964 if self._is_mutable:
>>> --> 965 raise TypeError("mutable vectors are unhashable")
>>> 966 return hash(tuple(self))
>>> 967
>>>
>>> TypeError: mutable vectors are unhashable
>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.