Opened 4 years ago

Last modified 3 days ago

#23576 new defect

Wrong results in vector matrix multiplication

Reported by: sbrandhorst Owned by:
Priority: major Milestone: sage-9.4
Component: linear algebra Keywords: sd91
Cc: tscrim Merged in:
Authors: Reviewers:
Report Upstream: N/A Work issues:
Branch: u/roed/vmat_action (Commits, GitHub, GitLab) Commit: 6021daa7081396ae0c418b8f34ad69dc96a682c7
Dependencies: Stopgaps:

Status badges


sage: M = FreeModule(ZZ,1).span([vector([1/3])])
sage: x = M([1/3])
sage: x
sage: A = Matrix(QQ,[1])
sage: x*A , A*x
((1/3), (1/3))

This is good.

sage: B = Matrix(ZZ,[1])
sage: x*B , B*x
((1), (1/3))

The first entry is clearly wrong. Somehow the first product is carried out in a wrong basis representation for x.

Change History (10)

comment:1 Changed 4 years ago by sbrandhorst

  • Keywords sd91 added

comment:2 Changed 4 years ago by roed

The problem appears in line 1122 of sage.matrix.matrix_integer_dense.pyx, inside the function cdef _vector_times_matrix_(self, Vector v):

w = <Vector_integer_dense> v

If you change that to

w = <Vector_integer_dense?> v

you'll get an error, because v is a Vector_rational_dense, and if you change it to

    w = <Vector_integer_dense?> v
except TypeError:
    return Matrix_dense._vector_times_matrix_(self, v)

you get (1/3).

This function is replacing a more general implementation in sage.matrix.matrix0, but it only replaces _vector_times_matrix_, not _matrix_times_vector_, thus the disparity based on whether B is acting on the left or right.

I don't know if the try/except block is the right answer. I'll think about it....

comment:3 Changed 4 years ago by roed

There's maybe a separate issue in sage.matrix.action, since it detects the base ring of the result by checking the base ring of the inputs. But here x and B both have base ring ZZ, and indeed

sage: from sage.structure.element import coercion_model
sage: from operator import mul
sage: coercion_model.explain(x.parent(), B.parent(), mul)
Action discovered.
    Right action by Full MatrixSpace of 1 by 1 dense matrices over Integer Ring on Free module of degree 1 and rank 1 over Integer Ring
    Echelon basis matrix:
Result lives in Ambient free module of rank 1 over the principal ideal domain Integer Ring
Ambient free module of rank 1 over the principal ideal domain Integer Ring

The result should probably have rational entries....

Last edited 4 years ago by roed (previous) (diff)

comment:4 Changed 4 years ago by roed

  • Branch set to u/roed/vmat_action

comment:5 Changed 4 years ago by roed

  • Commit set to 6021daa7081396ae0c418b8f34ad69dc96a682c7

There are segfaults in the new implementation that multiplies a non-square integral matrix times a rational vector. Still working on them...

New commits:

6021daaCorrect base ring for matrices acting on submodules, implement multiplication for Vector_rational_dense times an integral matrix.

comment:6 Changed 4 years ago by sbrandhorst

*ping* :) Maybe #24031 is related to this? After all that bug occurs for vectors as well. Does this one for matrices too?

comment:7 Changed 10 months ago by mkoeppe

  • Cc tscrim added
  • Milestone changed from sage-8.1 to sage-9.2

Still unresolved as of 9.2.beta2

comment:8 Changed 9 months ago by slelievre

There is a possibility that #28544 will solve this, see comment 10 there.

comment:9 Changed 7 months ago by mkoeppe

  • Milestone changed from sage-9.2 to sage-9.3

comment:10 Changed 3 days ago by mkoeppe

  • Milestone changed from sage-9.3 to sage-9.4

Moving to 9.4, as 9.3 has been released.

Note: See TracTickets for help on using tickets.