Show HN: I made a spreadsheet where formulas also update backwards

(victorpoughon.github.io)

116 points | by fouronnes3 1 day ago

26 comments

  • deckar01 8 minutes ago
    Sympy can (often) solve under constrained systems in terms of the free variables. The problem I run into is discrete constraints that make solving less closed form and more combinatorial search. When textbook amplifier formulas significantly diverge from physical reality I model the errors as linear correction factors and use gradient descent to correct it in a few experiments, but I’m curious if there is software that has solved this problem.
  • willrshansen 8 hours ago
    The first example on the main page has a formula with two variables being updated from changing one value. The immediate question I have is if I change the output, where does the extra degree of freedom come from on the inputs? Does one stay locked in place? Unclear.

    I am a huge fan of the concept though. It's been bugging me for years that my spreadsheet doesn't allow editing text fields after filtering and sorting them down to the subset I want. I have to go all the way back to the mess of unsorted input rows to actually edit them.

    • ximm 1 hour ago
      100% this. When I reached the end of that page I felt pranked because the obvious question was never answered. How are these cases resolved? Is it possible to fix some inputs and only update others? What if I sometimes want to change input A, and other times I want to update input B? All this should be explained as early as possible.
      • fouronnes3 1 hour ago
        You can do it and it is explained, actually. Use # as a prefix to indicate a constant, e.g.: #50 will be a constant and not a variable.

        In the future I'd like to support more user input constraints, in particular domain constraints for variables. So you could tell the solver that this cell must remain in some interval, and it would respect that interval instead of assigning any real value.

    • rahimnathwani 6 hours ago

        Does one stay locked in place? Unclear.
      
      If you set C1=A1+B1 then, when you set a value for C1, A1 and B1 are each half of that value, even if they started off unbalanced.
      • idiotsecant 4 hours ago
        What is inputs a,b,c,d,and e are polynomial coefficients? I am hoping to get a fields medal plz respond.
        • fouronnes3 1 hour ago
          You can actually solve fifth order polynomials with bidicalc! But it's a numerical solution, not an algebraic one, so no Fields medal.
      • exe34 5 hours ago
        I think it would be good if you could lock one of them.
  • SoftTalker 4 hours ago
    Can you enter an RSA key and have it produce two prime numbers?
    • spiderice 3 hours ago
      A random tool like this would be the most entertaining possible way for something like that to be unleashed on the world
      • jamestimmins 3 hours ago
        My brother once suggested that there are probably bits of code/algorithms that would be world changing if they were released in academic journals, but instead were written by some unknowing programmer in an afternoon for their job coding embedded systems for refrigerators.

        This particular example may be unlikely, but it's a very fun idea.

        • InsideOutSanta 1 hour ago
          Iirc, Heisenberg reinvented Matrix calculations to solve a problem in quantum physics. Not being a mathematician, he wasn't aware of the concept. Born recognized what Heisenberg had done and introduced him to his own reinvention.
        • Suppafly 3 hours ago
          Lots of people working in different fields end up reinventing things that have been known to math for centuries, often in clunky roundabout ways. I imagine some of them figure out things not known to math, but it's far more likely to go the other way.
          • Towaway69 1 hour ago
            Folks shouldn’t be afraid to “rediscover” stuff.

            Primarily because the learnings you make are the same as the original “discoverer”. Without those learnings, you might not be able to arrive at your true destination.

            • Suppafly 7 minutes ago
              >Folks shouldn’t be afraid to “rediscover” stuff.

              Luckily no one is suggesting that.

          • nico 3 hours ago
            > Lots of people working in different fields end up reinventing things that have been known to math for centuries

            I remember reading, about a year or two ago, about a medical doctor that published a paper rediscovering calculus (I just looked it up, it happened in 1994, there’s been many articles and videos about it)

        • RachelF 2 hours ago
          A lot of the time engineers are focussed with solving a problem, to build a working machine/program, while academics just want to publish.

          This is also true with patents.

      • fouronnes3 1 hour ago
        Jokes aside, let's say someone does figure out how to break RSA over a weekend project. The evil options are easy to come up with, but what is the actually responsible, ethical, thing to do? Never tell anyone?
        • zoky 23 minutes ago
          Contact a known and trusted security researcher who can verify to the world that you did what you said you did, so everyone else can have as much time as possible to figure out exactly how fucked they are. Doing nothing isn’t an option; once someone figures something like that out, it signifies that conditions were ripe for the discovery to be made, and it’s only a matter of time before it’s discovered again independently.
  • adonovan 3 hours ago
    “Formulas that update backwards” is the main idea behind neural networks such as LLMs: the computation network produces a value, the error in this value is computed, and then the error quantity is pushed backward through the network; this relies on the differentiability of the function computed at each node in the network.
    • uoaei 2 hours ago
      All those words and you forget to provide people the breadcrumbs to learn more for themselves.

      The term of interest is "backpropagation".

  • b-karl 7 hours ago
    In Excel you have goal seek for this functionality. I believe it does some form of numerical solving of the equation system.

    Good for every situation when you need to solve equations!

    In the context of using spreadsheets I think about solving simple financial or maybe construction/mechanical design problems where you don’t want to solve it manually or program it and a spreadsheet is a quick and useful interface.

    • moron4hire 5 hours ago
      It does not. It perturbates the variables and uses a hill-climbing algorithm.
      • fouronnes3 1 hour ago
        Interesting. Note that the backwards solver of bidicalc does not use the previous input values of variables at all.
  • zkmon 3 hours ago
    The idea is very interesting. As a default strategy you could preserve the ratio of inputs by scaling them to match the scaling of the output, instead of making them equal (for addition). Similarly, for multiplication, you could preserve the ratio of inputs as well, by scaling them by nth root of the scaling factor of the output.
    • fouronnes3 1 hour ago
      Currently the solver does not use the previous values of inputs at all when solving. But it could use it in some cases as a heuristic I guess, yes!
  • thomastay 7 hours ago
    This is really cool! It's like Excel's goal seek but can also handle the case of arbitrary input cells. Goal seeek can only handle one input and one output cell.

    But how do you handle the case where multiple variables can be changed? If multiple input cells is the key difference from Goal seek, i think some more rigor should be placed into the algorithm here

    e.g. setting A1 + B1 and wanting the result to be 5. Currently it bumps both A1 and B1 equally. What's the thought process behind this?

    • fragmede 7 hours ago
      Yeah. The UI could have a lock icon to set, eg B1 should stay fixed and then only A1 would change.
      • tkzed49 7 hours ago
        It supports this. If you type # before a number, like #5, it's made constant.
  • PaulHoule 8 hours ago
  • amirhirsch 5 hours ago
    Cool!

    Constraint propagation from SICP is a great reference here:

    https://sicp.sourceacademy.org/chapters/3.3.5.html

    • fouronnes3 41 minutes ago
      I wasn't aware of this chapter, but I did use constraint propagation for the solver (among other things), thanks!
  • remywang 8 hours ago
    A bidirectional formula is also known as an integrity constraint in databases (plus some triggers for restoring the constraint upon updates)!
  • nico 3 hours ago
    Could you build an inverse kinematics solver with this? (I recently watched a youtube video of someone iteratively working out the solutions for a robotic arm, by alternating modifying the inputs and the results)
    • fouronnes3 1 hour ago
      That's an interesting example I hadn't thought of. Probably? I'll need to try it. Thank you for the suggestion!

      I think one issue will be that trig functions are kinda weird because they are non-injective. So they work but they are awkward (try solving cos(A1) = 0.5). Inverse kinematics is so well studied, you're probably better off using a dedicated algorithm.

  • injidup 3 hours ago
    A 2d sketcher with constraints is kind of similar. For example the equation

    A = B + C

    Where A, B, C are the lengths of 3 parallel lines. Within the sketcher you can drag the length of any one of those lines and the other two will adjust to keep the constraints.

    • fouronnes3 1 hour ago
      Yes! I'd really like to make something graphical in this same idea space next. See g9.js for example, or parametric CAD software like FredCAD which kinda does what you said.
  • kccqzy 8 hours ago
    I think the concept is solid. I’ve only had a few minutes of playing with it, but I have the opinion is that from a UX perspective constants are more common than variables. So perhaps a cell containing a constant should not have a #, but a variable should.
  • throw310822 8 hours ago
    Hm? I don't get it.

    What's the point of calculating backwards non-invertible operations such as addition? Isn't the result just arbitrary?

    • fouronnes3 8 hours ago
      I made this mostly as a fun challenge :)

      You are right that there is some arbitrariness involved when picking a solution, however it's a bit more subtle than that.

      Let's say our problem has N free variables.

      Step 1 is finding the subset of R^N that is the solution to the root finding problem. If this subset is a point, we are done (return that point). Note that if there is no solution at all bidicalc should correctly report it.

      Step 2 is if the solution subset is not a point. Then there is multiple (maybe even an infinity of) solutions, and picking one is indeed arbitrary.

      • kolarski 7 hours ago
        does the algorithm tries to make minimal changes to the free variables ? If we have 1 + 1 = 2 and change 2 -> 4 then -100000 + 100004 = 4 is also a valid solution. When I tried it it changed it to 2 + 2 so perhaps there is optimization but also a valid optimization can be minimal free variable changes in which case it would be 1+3 = 4 and we update 1 free variable instead of 2. I have no idea which is better just curios how it works. I like the idea very much.
        • fouronnes3 36 minutes ago
          The actual heuristic used to pick a solution from an infinite solution subspace is a bit too complex to explain in a comment. I really need a blackboard :D The main goal was actually to find a solution, any solution at all, and fast. I wanted the backwards update to be very fast to feel as magic as possible. So the heuristic is pretty simple and could definitely be improved!
    • generalizations 8 hours ago
      They said this:

      > Even a normal spreadsheet is fairly complex beast. But the novel thing about bidicalc is the backwards solver. Mathematically, updating a spreadsheet "backward" is a (potentially underdetermined) root finding problem, because we are trying to find a vector of unknowns such that , where F is the function computed by the cells formulas, and G is the objective value entered in the cell. Note that F is not necessarily a single formula, but the result of composing an upstream graph of cells into a single function.

      > The actual root-finding solver is a custom algorithm that I made. It a general purpose algorithm that will find one root of any continuous-almost-everywhere function for which a complete syntactic expression is known. It uses a mix of continuous constraint propagation on interval union arithmetic , directional Newton's method and dichotomic search. It is of course limited by floating point precision and available computation time.

      But that really doesn't answer your question. I see no reason why the solver wouldn't decide every time it had a two-variable summation that ADD(X+Y) doesn't reverse to X=-90 and Y=100.

    • nrhrjrjrjtntbt 4 hours ago
      You could add hints as a feature to this. E.g. interest = rate × principle

      The user hints principle is preferred fixed so they can see what rate is needed for a givem amount of interest.

      Hints could have a precedence order (then prefer to fix earlier terms on an operation on a tie breaker.)

    • esafak 4 hours ago
      It is for fun. Commercial products do not support this because functions are generally not invertible.
  • iamwil 5 hours ago
    Reminds me of functional logical programming languages like Verse. when you specify the output and ask for the inputs, you get all possible inputs.
    • Towaway69 1 hour ago
      Came here to say the same thing but with reference to Prolog.
  • WillAdams 8 hours ago
    Very cool!

    I'd love to see a version where cells are "torn off" and named as they were in Lotus Improv and one had a "formula pane" where one could see all the formulae for a spreadsheet.

    Would it be possible to create this in Python so that it could be a part of pyspread?

  • digdugdirk 6 hours ago
    Super cool! Well done. Now take it down and never let Microsoft get their hands on the code, or the entire economic system will go down in flames.
  • jy14898 8 hours ago
    you might like https://omrelli.ug/g9/ which is a similar concept but for graphics
    • fouronnes3 8 hours ago
      I do like g9! It was a strong inspiration for bidicalc actually!
  • nrhrjrjrjtntbt 4 hours ago
    Excellent (sorry accidental pun)

    This is a nice exploration.

  • aghilmort 6 hours ago
    interesting. like Excel Solver? or OpenSolver, Gurobi, other optimizers? or different objective?
    • fouronnes3 1 hour ago
      Never used any of those, so I don't know! I'd be curious to read a comparison from anyone who knows about them.

      I think what's pretty unique about the bidicalc solver that I made is that it does not depend on the previous input values to update backwards. It's truly solving the root finding problem. The advantage is that there are never any "stuck in a local optimum" problems with the solver. So you can solve difficult problems like polynomials, etc.

  • d--b 3 hours ago
    The examples are great and these bidirectional calculators are something that people would love to have in traditional spreadsheets.

    So much so that Credit Suisse, which basically was running everything on heavily modded Excel, created a full language whose outputs were Excel spreadsheets capable of doing that. That thing called “paradise” was a total monstrosity but showed how much people wanted this.

    That said, you really need a way to set which cells are fixed and which cells are allowed to move if you want to move past basic examples.

    Most times you know what you want to do. like => if the user modifies that cell, find a solution for those specific ones.

    If you can enter that info, then you have a lot more constrains for your solver and will avoid a lot of edge cases where everything goes to 0, and you can check that the calculation entered is indeed reversible or not, or if it could have multiple solutions, and so on.

    • fouronnes3 1 hour ago
      Constants are supported, use # as a prefix, e.g.; #50.

      I'd like to add more constraints in the future like a domain constraint for variables.

  • TypeDeck 4 hours ago
    [dead]
  • NedF 3 hours ago
    [dead]
  • aatd86 7 hours ago
    LOL! Gemini suggested to implement this to me literally yesterday: bidirectional computations. The example was that given a temperature in Celsius and Fahrenheit, modifying either of them should update their counterpart. In angular that would be two linked signals for instance, but even that is a bit fringe. Gemini was going for something even more elaborated.

    I told Gemini that spreadsheets were actually not doing that and that I had ways to implement that behavior without the complexity.

    Just writing that to show the rabbit hole people are going to fall into if they let their llms go brrr. ;D

    In any case, the problem is interesting. The point was to include bi-directionality inside a graph of computations so that we didn't get bogged down by cycles. The benefit being that it would handle float precision issues.

    My more manual solution expect that floats precision issues are handled explicitly. I think that this level of explicitness is needed anyway for proper floating point error mitigation.

    • maplethorpe 3 hours ago
      That's weird, Gemini told me not to do this.
      • aatd86 2 hours ago
        To not do what, to not implement a constraint solver for bidirectional formulas? If you input my above comment it is for sure going to weigh the pros and cons. https://gemini.google.com/share/f40bf53d9c21

        Excerpt from the initial convo with gemini: Thinking with 3 Pro December 11, 2025 at 09:59 PM

        2. Propagators (Constraint Networks)The Problem: Your valueref binder and watch logic handle one-way data flow well. But complex forms (e.g., "Start Date must be before End Date," or "Fahrenheit <-> Celsius") require messy, cyclic event handlers to keep everything in sync.The Academic Concept: Propagators (Alexey Radul / Gerald Sussman, MIT).Instead of functions ($A \rightarrow B$), you define Constraints. A network of constraints seeks a consistent value for all connected nodes. It is "multi-directional" by design.

        I see my message above being downvoted, I don't even know why ;D

        In the end Gemini did agree that it was not necessary to introduce this level of complexity for my use case.

        To be fair, Victor goes further because he adds a solver on top. In the research of a solution that might make sense. The issue in general is that not everything has a reverse operation so, in a sense, it is but an approximation.