• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

FEniCS / ufl / 34578447636
81%

Build:
DEFAULT BRANCH: main
Ran 11 Sep 2026 08:19AM UTC
Jobs 1
Files 110
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

11 Sep 2026 08:13AM UTC coverage: 80.303% (+0.2%) from 80.114%
34578447636

push

github

web-flow
Fix Interpolate holes (#497)

* Fix Interpolate holes

* Interpolate._cache

* Expose Interpolate to the form compiler

* Fix shape and negation

* ruff

* Fix mypy

* Give a base form operator all of its domains

A base form operator's argument slots are not among its operands, so
traversing the operands misses the domains they are defined over. An
interpolation onto a point cloud is the case that notices: the target is
reachable only through the dual argument, and the form compiler numbers
its domains against this list.

extract_unique_domain still answers with the operand's domain, which is
where the operator takes its value.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* ruff

* Give every base form operator its domain analysis

BaseForm requires _analyze_domains and ufl_domains of its subclasses, and
BaseFormOperator never supplied them: Interpolate carried the pair alone, so
every other operator fell through to the deprecated Expr.ufl_domains, which
answers by calling extract_domains and recurses forever now that
extract_domains routes a base form operator back through it. Differentiating
an interpolation is the case that notices, as BaseFormOperatorDerivative has
no such override.

The analysis reads ufl_operands and argument_slots, both of which every base
form operator has, so it belongs on the base class unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Negate a base form operator through its parent type

Interpolate.__neg__ chose between the expression and the form negation by
testing is_dual(self._function_space), the interpolation's target space. That
space stays primal even when the interpolation is itself a form, so negating an
Interpolate built against a Cofunction gave a Product while multiplying the
same object by -1 gave a FormSum.

None of the other arithmetic operators consult the target space. __add__,
__radd__, __mul__ and __rmul__ all dispatch through _parent_type, which tests
is_dual(self.ufl_func... (continued)

128 of 138 new or added lines in 12 files covered. (92.75%)

1 existing line in 1 file now uncovered.

10270 of 12789 relevant lines covered (80.3%)

0.8 hits per line

Uncovered Changes

Lines Coverage ∆ File
4
88.24
-1.3% ufl/algorithms/apply_coefficient_split.py
4
93.18
2.11% ufl/core/interpolate.py
1
82.45
0.13% ufl/algorithms/estimate_degrees.py
1
83.33
0.98% ufl/referencevalue.py

Coverage Regressions

Lines Coverage ∆ File
1
91.35
1.35% ufl/core/base_form_operator.py
Jobs
ID Job ID Ran Files Coverage
1 34578447636.1 11 Sep 2026 08:19AM UTC 110
80.3
GitHub Action Run
Source Files on build 34578447636
  • Tree
  • List 110
  • Changed 12
  • Source Changed 0
  • Coverage Changed 12
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • 078a1cdc on github
  • Prev Build on main (#33064532876)
  • Next Build on main (#34579120279)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc