Overflow error in `mtkcompile` for friction model with 32 nodes

Abierto
#172 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
52/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
julia
Área
backend

Línea de trabajo

The reproducer calls mtkcompile on a generated friction model network and reports an OverflowError at 32 or more nodes; start by running the script with the listed ModelingToolkit version to confirm the threshold. The issue points to ModelingToolkit PR #2089 as possibly related, so inspect that change and the state selection code reached during compilation. Done means identifying and fixing the overflow so the reproducer compiles at the reported node counts.

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

Descripción

A network of friction model fails to compile with node counts 32 or larger, it seems to be an integer that overflows. With 31 it works fine.

copilot-authored script to reproduce and monkeypatch to use BigInt below.

ModelingToolkit version 11.45.5, Julia 1.13.2.

Maybe ModelingToolkit #2089: Fix Barreiss algorithm is related in some way?

using ModelingToolkit
using ModelingToolkit: t_nounits as t, D_nounits as D

@connector function ContactPort(; name)
    variables = @variables begin
        velocity(t)
        force(t), [connect = Flow]
    end
    return System(Equation[], t, variables, []; name)
end

function contact_model(; name)
    parameters = @parameters stiffness = 1.0 rate_coefficient = 1.0
    variables = @variables begin
        deformation(t) = 0.0
        plastic_slip(t) = 0.0
        accumulated_slip(t) = 0.0
        resistance(t)
        capacity(t)
        positive_rate(t)
        negative_rate(t)
        slip_rate(t)
    end
    @named port = ContactPort()
    equations = [
        resistance ~ stiffness * deformation,
        capacity ~ 1 + exp(-accumulated_slip),
        positive_rate ~ (resistance - capacity + abs(resistance - capacity)) /
                         (2rate_coefficient),
        negative_rate ~ (-resistance - capacity + abs(-resistance - capacity)) /
                         (2rate_coefficient),
        slip_rate ~ positive_rate - negative_rate,
        D(deformation) ~ port.velocity - slip_rate,
        D(plastic_slip) ~ slip_rate,
        D(accumulated_slip) ~ positive_rate + negative_rate,
        port.force ~ resistance,
    ]
    return compose(System(equations, t, variables, parameters; name), port)
end

function velocity_source(; name)
    @named port = ContactPort()
    return compose(System([port.velocity ~ -1.0], t; name), port)
end

function contact_network(contact_count)
    @named source = velocity_source()
    contacts = [contact_model(; name = Symbol(:contact, index)) for index in 1:contact_count]
    equations = [connect(source.port, [contact.port for contact in contacts]...)]
    return compose(System(equations, t; name = :contact_network), source, contacts...)
end

function reproduce_main()
    for contact_count in (1, 30, 31, 32, 45, 60)
        try
            elapsed = @elapsed mtkcompile(contact_network(contact_count))
            println("PASS contacts=", contact_count, " compile_s=", elapsed)
        catch exception
            println("FAIL contacts=", contact_count, " ", sprint(showerror, exception))
            exception isa OverflowError || rethrow()
        end
    end
end

function enable_bigint_probe!()
    @eval ModelingToolkit.StateSelection begin
        function aag_bareiss!(structure, original::CLIL.SparseMatrixCLIL{Int, Int})
            pristine = copy(original)
            try
                return invoke(aag_bareiss!, Tuple{Any, CLIL.SparseMatrixCLIL},
                              structure, original)
            catch exception
                exception isa OverflowError || rethrow()
            end
            reduced, solvable, ranks = aag_bareiss!(structure,
                convert(CLIL.SparseMatrixCLIL{BigInt, Int}, pristine))
            maximum_coefficient = maximum(
                (maximum(abs, row; init = big(0)) for row in reduced.row_vals);
                init = big(0))
            println("BIGINT_RETRY_OK rows=", size(pristine, 1),
                    " max_reduced_coefficient=", maximum_coefficient)
            return convert(CLIL.SparseMatrixCLIL{Int, Int}, reduced), solvable, ranks
        end
    end
end

if "--bigint-probe" in ARGS
    enable_bigint_probe!()
end

if abspath(PROGRAM_FILE) == @__FILE__
    reproduce_main()
end
Lenguaje dominante
Julia
Estrellas
8
Forks
14
Merge medio
8 d 8 h
PR fusionados (30 d)
1

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

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 JuliaComputing/StateSelection.jl

Todos los issues de JuliaComputing/StateSelection.jl

Issues similares

Más issues de Julia

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.