Add a new equality, represented by the list of tuples vc=[(v, c), ..].
(self, vc: list[tuple[str, float]])
| 297 | self.v2e[v] = replace(e, v0, e0) |
| 298 | |
| 299 | def add_expr(self, vc: list[tuple[str, float]]) -> bool: |
| 300 | """Add a new equality, represented by the list of tuples vc=[(v, c), ..].""" |
| 301 | result = {} |
| 302 | free = [] |
| 303 | |
| 304 | for v, c in vc: |
| 305 | c = frac(c) |
| 306 | if v in self.v2e: |
| 307 | result = plus(result, mult(self.v2e[v], c)) |
| 308 | else: |
| 309 | free += [(v, c)] |
| 310 | |
| 311 | if free == []: # pylint: disable=g-explicit-bool-comparison |
| 312 | if is_zero(self.modulo(result)): |
| 313 | return False |
| 314 | result = recon(result, self.const) |
| 315 | if result is None: |
| 316 | return False |
| 317 | v, e = result |
| 318 | self.replace(v, e) |
| 319 | |
| 320 | elif len(free) == 1: |
| 321 | v, m = free[0] |
| 322 | self.v2e[v] = mult(result, frac(-1, m)) |
| 323 | |
| 324 | else: |
| 325 | dependent_v = None |
| 326 | for v, m in free: |
| 327 | if dependent_v is None and v != self.const: |
| 328 | dependent_v = (v, m) |
| 329 | continue |
| 330 | |
| 331 | self.add_free(v) |
| 332 | result = plus(result, {v: m}) |
| 333 | |
| 334 | v, m = dependent_v |
| 335 | self.v2e[v] = mult(result, frac(-1, m)) |
| 336 | |
| 337 | return True |
| 338 | |
| 339 | def register(self, vc: list[tuple[str, float]], dep: pr.Dependency) -> None: |
| 340 | """Register a new equality vc=[(v, c), ..] with traceback dependency dep.""" |