Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Constant LinearExpression * multi-term LinearExpression raises TypeError (mirrored product works)

Abierto Apto para principiantes
#1,055 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
68/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
python
Área
backend

Línea de trabajo

Empieza leyendo LinearExpression._multiply_by_linear_expression y __mul__, que el issue identifica como la causa; luego ejecuta las reproducciones con matrices densas y dispersas del issue. El trabajo está terminado cuando una LinearExpression constante multiplicada por una LinearExpression con varios términos devuelve el mismo resultado lineal escalado en ambos backends, y los casos reflejados existentes y los casos con un solo término siguen funcionando.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug

[!NOTE]
The following content was generated by AI.

Version Checks
  • I have confirmed this bug exists on the current master branch of Linopy (95f6bfa4).
Issue Description

Multiplying a constant LinearExpression (no terms) by a multi-term LinearExpression raises TypeError on both the dense and sparse backends. The mirrored product (multi-term × constant) and constant × one-term expression both work and return the scaled linear expression.

Cause: LinearExpression._multiply_by_linear_expression checks other.nterm > 1 and raises before checking self.is_constant. __mul__ then turns that TypeError into NotImplemented, so the user only sees the generic unsupported operand type(s) message.

Found while building the dense/sparse conformance suite for #1019.

Reproducible Example
import warnings
from linopy import LinearExpression, Model

warnings.simplefilter("ignore")  # PerformanceWarning on sparse
for sparse in (False, True):
    m = Model(sparse=sparse)
    x = m.add_variables(name="x")
    y = m.add_variables(name="y")
    c = LinearExpression(3, m)
    print(f"sparse={sparse}")
    for lab, f in {
        "c * (2*x + 3*y)": lambda: c * (2 * x + 3 * y),
        "(2*x + 3*y) * c": lambda: (2 * x + 3 * y) * c,
        "c * (2*x)": lambda: c * (2 * x),
        "3 * (2*x + 3*y)": lambda: 3 * (2 * x + 3 * y),
    }.items():
        try:
            r = repr(f()).splitlines()[-1]
        except Exception as e:
            r = f"{type(e).__name__}: {e}"
        print(f"  {lab:18} -> {r}")

Output:

sparse=False
  c * (2*x + 3*y)    -> TypeError: unsupported operand type(s) for *: 'LinearExpression' and 'LinearExpression'
  (2*x + 3*y) * c    -> +6 x + 9 y
  c * (2*x)          -> +6 x
  3 * (2*x + 3*y)    -> +6 x + 9 y
sparse=True
  c * (2*x + 3*y)    -> TypeError: unsupported operand type(s) for *: 'LinearExpression' and 'LinearExpression'
  (2*x + 3*y) * c    -> +6 x + 9 y
  c * (2*x)          -> +6 x
  3 * (2*x + 3*y)    -> +6 x + 9 y
Traceback (without try/except)
Traceback (most recent call last):
  File "repro.py", line 18, in <module>
    c * (2 * x + 3 * y)
    ~~^~~~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for *: 'LinearExpression' and 'LinearExpression'

The same asymmetry applies to non-constant one-term factors, e.g. (x*0 + 3) * (2*x + 3*y) raises while (2*x + 3*y) * (x*0 + 3) returns a QuadraticExpression.

Expected Behavior

A constant expression acts like a scalar factor: c * (2*x + 3*y) returns the LinearExpression +6 x + 9 y, the same as (2*x + 3*y) * c and 3 * (2*x + 3*y).

Lenguaje dominante
Python
Estrellas
262
Forks
89
Merge medio
2 d 4 h
PR fusionados (30 d)
37

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de PyPSA/linopy

Todos los issues de PyPSA/linopy

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.