Opened 11 years ago

Last modified 8 years ago

## #12302 new defect

# Partial evaluation bug for callable vector functions

Reported by: | Geoff Ehrman | Owned by: | Geoff Ehrman |
---|---|---|---|

Priority: | major | Milestone: | sage-6.4 |

Component: | symbolics | Keywords: | sd35.5 |

Cc: | Jason Grout | Merged in: | |

Authors: | Reviewers: | ||

Report Upstream: | N/A | Work issues: | |

Branch: | Commit: | ||

Dependencies: | Stopgaps: |

### Description (last modified by )

For callable (scalar) functions, taking sections (partial evaluation) of functions works perfectly fine; that is to say the following code works perfectly as expected:

sage: f(x,y,z) = x*y*z; f (x, y, z) |--> x*y*z sage: g(x, z) = f(y=1); g (x, z) |--> x*z

Move up to callable vector functions and taking sections breaks however:

sage: v(x, y) = [x+y, x-y]; v (x, y) |--> (x + y, x - y) sage: v(x,0) (x, x) sage: w(x) = v(y=0) TypeError

**This is because all evaluation, even if partial, of a callable vector function returns a Vector_symbolic_dense.** The relevant function _ _call_ _() is defined in free_module_element.pyx.

The fix, of course, is to make the code intelligent enough to know that an evaluation is only partial -- one hopes that `type(vx)`

```
would return 'sage.modules.vector_callable_symbolic_dense.Vector_callable_symbolic_dense'> rather than 'sage.modules.vector_symbolic_dense.Vector_symbolic_dense'>
```

sage: v(x, y) = [x+y, x-y] sage: type(v) <class 'sage.modules.vector_callable_symbolic_dense.Vector_callable_symbolic_dense'> sage: vx = v(y=0); vx (x,x) sage: type(vx) <class 'sage.modules.vector_symbolic_dense.Vector_symbolic_dense'>

**Work-around**

This isn't *so* bad since we can still do:

sage: v(x, y) = [x+y, x-y] sage: vx = v(y=0)

Now, if every entry still has a variable everything, including positional rather than named arguments, works.

sage: v(x, y) = [x+y, x-y] sage: vx = v(y=0) sage: vx(x=1) (1, 1) sage: vx(1) #deprecated, but works fine

However, things break if taking a section kills off all variables in any component we try to use positional arguments:

sage: v(x, y) = [x+y, x-y] sage: vy = v(y=x) sage: vy (2*x, 0) sage: vx (x, x) sage: vy(x=1) #named arguments still work (2, 0) sage: vy(1) #positional arguments don't ValueError

### Change History (6)

### comment:1 Changed 11 years ago by

Description: | modified (diff) |
---|

### comment:2 Changed 11 years ago by

Description: | modified (diff) |
---|

### comment:3 Changed 9 years ago by

Milestone: | sage-5.11 → sage-5.12 |
---|

### comment:4 Changed 9 years ago by

Milestone: | sage-6.1 → sage-6.2 |
---|

### comment:5 Changed 8 years ago by

Milestone: | sage-6.2 → sage-6.3 |
---|

### comment:6 Changed 8 years ago by

Milestone: | sage-6.3 → sage-6.4 |
---|

**Note:**See TracTickets for help on using tickets.