Pick-A-Signal combinator?
Re: Pick-A-Signal combinator?
Unless I missed something, filtering positive and negative can be done with a single combinator (this might not've been present years ago):
I was messing with the combinators, and I came to a horrible conclusion: it's impossible to filter only one signal with only combinators. Combinators can only act on the quantities of signals present with the generic filters, and therefore if two signals have the same quantity, they will never be separable (and make some circuits like least, greatest, etc return sets).
Using stack filter inserters in a square, with containers, you can get one signal (the first signal in the signal list, the greatest quantity and probably least ID number), but there's some very edge cases where it will fail to do things on an exact tick schedule. This still takes putting items in the containers that match what you have on the network, because you can't read filters, only hand contents.
I did find some algebraic terms that were interesting: the sum of all signals on the input (as one output signal), the sum of all other signals that aren't that signal (sum - signal). Combine sum - signal + signal and you have all signals present, and the value of each is the sum of all values on the network.
Edit: rephrasing for clarity, a single circuit that is fixed-time, fixed-space, can never output exactly one signal that could be any signal, only sets.
And I did misinterpret things. Sue me : P
I was messing with the combinators, and I came to a horrible conclusion: it's impossible to filter only one signal with only combinators. Combinators can only act on the quantities of signals present with the generic filters, and therefore if two signals have the same quantity, they will never be separable (and make some circuits like least, greatest, etc return sets).
Using stack filter inserters in a square, with containers, you can get one signal (the first signal in the signal list, the greatest quantity and probably least ID number), but there's some very edge cases where it will fail to do things on an exact tick schedule. This still takes putting items in the containers that match what you have on the network, because you can't read filters, only hand contents.
I did find some algebraic terms that were interesting: the sum of all signals on the input (as one output signal), the sum of all other signals that aren't that signal (sum - signal). Combine sum - signal + signal and you have all signals present, and the value of each is the sum of all values on the network.
Edit: rephrasing for clarity, a single circuit that is fixed-time, fixed-space, can never output exactly one signal that could be any signal, only sets.
And I did misinterpret things. Sue me : P
I have mods! I guess!
Link
Link
Re: Pick-A-Signal combinator?
you can easily pick a signal by ordering them some way and then checking each in turn. You end up with at least two decider combinator per item checking for = 0 and =! 0. Its just that placing 800 combinators in a modded game to pick a signal is insane.Honktown wrote: βFri Dec 27, 2019 4:59 am Unless I missed something, filtering positive and negative can be done with a single combinator (this might not've been present years ago):
filter_only_positive.png
I was messing with the combinators, and I came to a horrible conclusion: it's impossible to filter only one signal with only combinators. Combinators can only act on the quantities of signals present with the generic filters, and therefore if two signals have the same quantity, they will never be separable (and make some circuits like least, greatest, etc return sets).
Using stack filter inserters in a square, with containers, you can get one signal (the first signal in the signal list, the greatest quantity and probably least ID number), but there's some very edge cases where it will fail to do things on an exact tick schedule. This still takes putting items in the containers that match what you have on the network, because you can't read filters, only hand contents.
I did find some algebraic terms that were interesting: the sum of all signals on the input (as one output signal), the sum of all other signals that aren't that signal (sum - signal). Combine sum - signal + signal and you have all signals present, and the value of each is the sum of all values on the network.
Edit: rephrasing for clarity, a single circuit that is fixed-time, fixed-space, can never output exactly one signal that could be any signal, only sets.
And I did misinterpret things. Sue me : P
Re: Pick-A-Signal combinator?
It's one thing to whittle down the signals to binary outputs, in space or in time. I unfortunately have a background in engineering and some math, and it actually bugs me that technically, two signals with the same value are indistinguishable. You can either sort signals down to that set of equal values, or none, depending on the circuit. I want an actual generic selector circuit damnit. It'd be easy enough to do in lua, just pick the first signal and call it a day, but ugh. There has to be a better way.
I have mods! I guess!
Link
Link
Re: Pick-A-Signal combinator?
Maybe my description was too brief. As said, per signal you need 2 combinators and you chain them together like this:Honktown wrote: βMon Jan 13, 2020 4:11 pmIt's one thing to whittle down the signals to binary outputs, in space or in time. I unfortunately have a background in engineering and some math, and it actually bugs me that technically, two signals with the same value are indistinguishable. You can either sort signals down to that set of equal values, or none, depending on the circuit. I want an actual generic selector circuit damnit. It'd be easy enough to do in lua, just pick the first signal and call it a day, but ugh. There has to be a better way.
Code: Select all
coal != 0 => coal -------------------------------
coal == 0 => each -- iron != 0 >= iron ------/
\- iron == 0 >= each -----/
If you want one signal that has the highest count that makes it even more complex. I would probably make a max finder first and then the above signal separator.
But yeah, there has to be a better way. The combinator solution is just unusable and the inserter thing is annoying with many items.
Re: Pick-A-Signal combinator?
Could you explain how my filter posted here: viewtopic.php?p=447487#p447487 doesn't work for you.
Any signal set to 1 on the cc between the poles will pass through anything else will blocked.
Any signal set to 1 on the cc between the poles will pass through anything else will blocked.
My Mods: mods.factorio.com
Re: Pick-A-Signal combinator?
@optera
I'm just bitching about not having something absolutely perfect and generic i.e. no settings. disentius used your circuit I think. dunno about mrvn
I'm just bitching about not having something absolutely perfect and generic i.e. no settings. disentius used your circuit I think. dunno about mrvn
I have mods! I guess!
Link
Link
Re: Pick-A-Signal combinator?
I'm still waiting or a pick-a-signal combinator. ONE signal.
Other ideas for a red/green aware combinator would be "each / each" and partitioning. I think "/" is self explanatory but partitioning not so. What I mean there is a combinator that has some input and splits the signals into two or more sets. For each set you could then choose the output. For example the combinator could be set to "each > 0". That then produces two sets, things > 0 and things <= 0. The outut could be set to "each green" and "each red" respectively.
Sounds like simply 2 decider combinators? Well, yes, for "each > 0" it is. But it could have a "pick-one" mode where one signal is separated from the rest. Or more general "pick-N" that separates N signals (second argument) and the rest. This would allow you to program a series of filter inserters with 5 different items each.
Other operations could be "max", "min", "average (above and below average)", "split (50/50 split)". I bet there are more.
Other ideas for a red/green aware combinator would be "each / each" and partitioning. I think "/" is self explanatory but partitioning not so. What I mean there is a combinator that has some input and splits the signals into two or more sets. For each set you could then choose the output. For example the combinator could be set to "each > 0". That then produces two sets, things > 0 and things <= 0. The outut could be set to "each green" and "each red" respectively.
Sounds like simply 2 decider combinators? Well, yes, for "each > 0" it is. But it could have a "pick-one" mode where one signal is separated from the rest. Or more general "pick-N" that separates N signals (second argument) and the rest. This would allow you to program a series of filter inserters with 5 different items each.
Other operations could be "max", "min", "average (above and below average)", "split (50/50 split)". I bet there are more.
Re: Pick-A-Signal combinator?
Above/below average is doable already: output an input count signal for each input on one combinator (sum). Output one for each input count as different signal (n). Arithmetic combinator sum / n = third signal (average), and then two more combinators, if original signals >= average, and original signals < average. I don't know what you'd want it for (deciding which trains should get more ore by trying to balance inputs?)
Edit: as for pick a signal, a new combinator could be added which just grabs the first signal on each tick... easy to do in lua.
Also, if anyone was good with guis, a single combinator could have radio buttons: first signal, last signal, max, min. It could be simple and for max/min do if next >/< current_max/min then replace. Would output the first signal it ran into that was max/min, and not the set of maxes/mins.
I have mods! I guess!
Link
Link
Re: Pick-A-Signal combinator?
I know average can be done. Provided your sum doesn't overflow. So not reliable but usually good enough. It's just an example what could be added in the new combinator besides just pick-a-signal.Honktown wrote: βWed Jan 15, 2020 11:50 pmAbove/below average is doable already: output an input count signal for each input on one combinator (sum). Output one for each input count as different signal (n). Arithmetic combinator sum / n = third signal (average), and then two more combinators, if original signals >= average, and original signals < average. I don't know what you'd want it for (deciding which trains should get more ore by trying to balance inputs?)
Edit: as for pick a signal, a new combinator could be added which just grabs the first signal on each tick... easy to do in lua.
Also, if anyone was good with guis, a single combinator could have radio buttons: first signal, last signal, max, min. It could be simple and for max/min do if next >/< current_max/min then replace. Would output the first signal it ran into that was max/min, and not the set of maxes/mins.
As for "easy to do in lua": It's easy but also horribly slow. Having just a bunch of those lua combinators will kill your UPS. That's the whole reason for the request.
Re: Pick-A-Signal combinator?
Hi Optera, your whitelist filter is awesome! I'm definitely going to use it to index my memory cells. Could you explain what the multiply is for? I think I got it working without it.
Re: Pick-A-Signal combinator?
My design for positive numbers only needs it to subtract the +1 from filters from the end result.
As far as I see you managed to optimize that combinator away. A quick test showed no over or underflow glitches with your design.
Now I feel blind for not seeing this much simpler design.
If the filter is static, your design you could easily remove the 2nd arithmetic combinator doing left shift 31 as well.
How would your design look for filtering positive and negative signals?
My Mods: mods.factorio.com
Re: Pick-A-Signal combinator?
Whew, it took me a couple days to understand it well enough, but it is possible to do in fewer combinators!
This design doesn't require overflow--just a number that is larger in magnitude than any potential input, to selectively flip the sign of inputs without needing EACH * EACH. The number I'm using is 2^31 - 1, which is the largest positive integer in Factorio for anyone unfamiliar.
As you said, you could remove the arithmetic combinators if you are willing to store the positive and negative constants in constant combinators. I have no need to preserve negative numbers at the moment, as I only wanted a way to select an index--what do you use it for?
Also thanks again, because I can't imagine I would have come with this method without seeing your design.
Re: Pick-A-Signal combinator?
Nice, that looks so deceptively simple.
I normally use only the positive whitelist filter as well. Filtering positive and negative signals was a challenge posed by this thread.
Did you notice both our designs have overflow errors in the negative filter path?
stone input of -2147483648 only outputs -2147483647, easy test is to hook a cc with -1 to the output pole, stone should overflow to +2147483647
I normally use only the positive whitelist filter as well. Filtering positive and negative signals was a challenge posed by this thread.
Did you notice both our designs have overflow errors in the negative filter path?
stone input of -2147483648 only outputs -2147483647, easy test is to hook a cc with -1 to the output pole, stone should overflow to +2147483647
My Mods: mods.factorio.com
Re: Pick-A-Signal combinator?
Heh, my approach cannot handle -2147483648, because there is no positive 32-bit integer you can add to it to make it non-negative. I suspect you could handle it specially through a separate signal path, but I would caution everyone against trying to do arithmetic on numbers over 2^30 anyway because of the chance of overflow.
-
- Manual Inserter
- Posts: 3
- Joined: Mon May 07, 2018 6:57 pm
- Contact:
Re: Pick-A-Signal combinator?
Unless I'm missing a trick here, and if you are happy with only positive outputs, you can do this with 2 combinators and an electric pole.
The left combinator contains item inputs with amounts. The right combinator contains item(s) you want filter with the amount set to a large negative number, (I used -1,000,000 but you could use any number). Both combinators go into a power pole and then to a decider combinator set to Each < 0 output Each (item count). The output of this goes into an arithmetic combinator set to Each + 1,000,000 output Each, (which just adds back the negative number your filter was set at) and the output will be your filter item with the correct amount.
Edit: I just realised you don't need the electric pole XD. Just connect both outputs of the combinators into the input of the first combinator.
The left combinator contains item inputs with amounts. The right combinator contains item(s) you want filter with the amount set to a large negative number, (I used -1,000,000 but you could use any number). Both combinators go into a power pole and then to a decider combinator set to Each < 0 output Each (item count). The output of this goes into an arithmetic combinator set to Each + 1,000,000 output Each, (which just adds back the negative number your filter was set at) and the output will be your filter item with the correct amount.
Edit: I just realised you don't need the electric pole XD. Just connect both outputs of the combinators into the input of the first combinator.
Re: Pick-A-Signal combinator?
That's basically fgcapo and my design with two major shortcomings:RedshiftOTF wrote: βSat May 30, 2020 8:41 pm Unless I'm missing a trick here, and if you are happy with only positive outputs, you can do this with 2 combinators and an electric pole.
Factorio_filter01.jpg
The left combinator contains item inputs with amounts. The right combinator contains item(s) you want filter with the amount set to a large negative number, (I used -1,000,000 but you could use any number). Both combinators go into a power pole and then to a decider combinator set to Each < 0 output Each (item count). The output of this goes into an arithmetic combinator set to Each + 1,000,000 output Each, (which just adds back the negative number your filter was set at) and the output will be your filter item with the correct amount.
Edit: I just realised you don't need the electric pole XD. Just connect both outputs of the combinators into the input of the first combinator.
1) no filter against negative signals
2) has to be supplied with the negative number for filtering
With a static cc already containing -2^31 like yours, fgcapo's can be reduced to 2 combinators including an input filter.
My Mods: mods.factorio.com
-
- Manual Inserter
- Posts: 3
- Joined: Mon May 07, 2018 6:57 pm
- Contact:
Re: Pick-A-Signal combinator?
Ah I see, thanks for the explanation. I guess I was searching for something super basic, couldn't find it, and so made my own but yours and fgcapo's designs are more efficient for sure.Optera wrote: βSun May 31, 2020 4:50 am
That's basically fgcapo and my design with two major shortcomings:
1) no filter against negative signals
2) has to be supplied with the negative number for filtering
With a static cc already containing -2^31 like yours, fgcapo's can be reduced to 2 combinators including an input filter.
-
- Burner Inserter
- Posts: 18
- Joined: Sun Jul 01, 2018 5:55 pm
- Contact:
Re: Pick-A-Signal combinator?
And here I was about to suggest a filter gate that just works like the CC just with in and out and only signals that are selected in it (like in a filter inserter) are allowed through, or removed when set to blacklisting mode instead (optional).
Edit: I've made my own version of Redshift's build which basically just sacrifices one signal to use for the multiplier and is used to multiply all filter signals once by it to get them to the negative threshold and afterwards substract it from the result.
Blueprint:
Edit: I've made my own version of Redshift's build which basically just sacrifices one signal to use for the multiplier and is used to multiply all filter signals once by it to get them to the negative threshold and afterwards substract it from the result.
Blueprint:
Code: Select all
0eNrNls2OmzAQx1+lmmMFVfhoI6Ge9wV6rFbIwCQZCWxkhrQo4t07Nm033TgJWe2hHBC2Z/6e8c9jc4KqHbG3pBmKE1Bt9ADF9xMMtNeqdX089QgFEGMHEWjVuZayxIcOmeq4Nl1FWrGxMEdAusGfUCRzdFejwZoatGGBdIWAC5aV5rBCFlQ4kuVRev6KLBbx05lnPj9HgJqJCZfV8I2p1GNXoZXsbuUQQW8GcTXaTStycfLpcwST+5A5GrJYL6Np5FJga9qywoM6kniLy2/NUsYarzO43h3ZgcvV+aCqDy6lP2sExcY1ul5ZH2UBX8XHjNyPb1LtJ4lv1FzurOlK0iIDBdsR52VSvSTpQ0/cy2JzvpTULPmTrUfipTk/i2/qjPcWUb82z/41T8R8doxfwUnvbNLrfDar8Lyovg+hAZ1MebfgmNoW7RSzsnuZXe9ji51hdBqmR8Hqo4aPb+Z6DV2QRv5CK4A2Wccqe5TV5rFS+t9Zxe/OKsDCH2dBhsllAYYo5TdP3EtGoWLKw4B21DLalVfOrVX1h5Hsi3Tjn4cuoh/GNGcayUOX0GBaauLdiG1QIlt1j/WyJ2JjMSixVNpK2JeH5BX2aahCxdiHVpz9FkTQqkqyK+CbT+PDk2cm/Uch5+Fut1mSpPmXLNvO8y+6a9kn
Re: Pick-A-Signal combinator?
to come back to the original problem, i created this "pick a signal" monstrosity:
blueprint contains small proof of concept with a stack filter inserter (you have to fill the chests to your liking).
conditions to use: limited to about 20 different signals. you have to prepare two constant combinators: one for creating a bitmask representing your signals, and one with all the signals set to -1.
idea:
1) encode signals to bits
2) create a bitmask representing all positive signals (=S)
3) find an arbitrary bit that is set (here: the lowest one, =B)
4) decode bit to signal
5) recover original value of signal
maybe you'll have ideas for simplifications or find bugs
Code: Select all
0eNrdWtGOqzYQ/Rc/trCKDYQQtZW26uvty31rdRURMmStgolss7rpKh/QD+mP9UtqwyZxiEkMSTdXXWlXAuzDjM94zozZN7QsathwyiSavyGaVUyg+e9vSNA1Swt9T243gOaISiiRh1ha6quUU/lSgqSZn1XlkrJUVhztPETZCr6iOd55VzFWkNEVcDsA2X3xEDBJJYXWouZiu2B1uQSu3nAJx0ObSqipFdNv1/bEE/wUeWiL5j5JEvWeFeWQtSNCDym/Ja+KxRJe0leqENS0d9yFerZqsIS+m1Mu5OLMtVfKZa3uHKxqR/iQZi/aLQEaxn3ez3qS8miT8sajOfpRjalqualHvD2rNlvlR83kIudVuaBMwaC55DXsmseMtYvRuIj1Hw4rc9mpuiJqJOVZTWV7qTk2H+PdFwVG9Ow1B2Dd+dPT+Xr4zsDYM0uuRJmNXHJKro3OI9htjH4eQ+eznlRtQJHZ2I38EWyqmBjAVtBlS20oKy3x2cA9ixZU7MZhMILD4Bvn8FOXw+dffxnB4vMgFmNXFmdDWCRuLIZH2+ulkK3fNuriPXEzd8/wlXSC415fcdhjcHQwGAplAldBBwz4eusrgQOepxnY7McT0/5lnecq7Qv6pwLCk8OP5X3TEWFu6FDspEP3CvqOFGmpl6nW/cbH09D+brTY9MW2nchBqWdyFrV98eEY3/HQGiI45e4/rxqOHE061cBPIwj6PLIUsK9x4F4NXFenfi7PqPQupb0+pme31RTxB+qRsS9vLxk+DdyQ/bWAdXjgtvrJiNU/SMr0KTpNk+RBabKTIr8fQcdvg7T/XCEvs6EV07r+OnOObpaij2+WzqTpJPX989ffD2+Fpq5lWVOqXNA0C8VWBvENUhU9Vqp+uD9beVqIQZ3rxIkgJ6HrS3L4xr41+jaKQR8/pBKcDqkEw26rMLlciySODI7pWsPr++wDOHtcBY+HaVTsSMWx9dy7eY2I6ZGI8KmPipwWqg90O+IUAsplQdnaL9W6UAY+aVNSrdc8jAYddrI6KyDlfl5DYaAEB5DQAUTIioExm5DD9KnDdMor5mcvIKSBgTWD7yCxA0ieCunXajxfc4Ww8pdQmHhRdDRq5oAHXzcchLgEeQRMmugaHZz4St7oPu/mGeKq1pFBWZr94VMmgKvAswburBu4pgrY0Kc2Rq8gRwrZhhV3LG03yGWDk1PYE4On9n23X7WyWsGiyhdGpjI4EqB+tRnvhy+6KPNawxZ71KYCGFZxO5cJYW+VkDgSPxtAPJ64ZKz9aw/K0dy8cC4wLH0nfZ4kjkFmehHtvXCqyYjzcc6s70vBZLBKGI1N4NhY3k8zfDxIM0SZFkqU9yeZm6oAOxgZm/wNjGC8iBkoY1TMmB715ndb7+T4LYLgwVESPDJK7hkk5PYYCe8RIrObIkQr3qgIcc0wjlUpIbccZAWOWvk/aPFsXCTX+uy+jzokGFJNJZe2rg6AJtTmxv89eOhVbdx2wAyHcULiIImVsgW73b8W+DhZ
conditions to use: limited to about 20 different signals. you have to prepare two constant combinators: one for creating a bitmask representing your signals, and one with all the signals set to -1.
idea:
1) encode signals to bits
2) create a bitmask representing all positive signals (=S)
3) find an arbitrary bit that is set (here: the lowest one, =B)
4) decode bit to signal
5) recover original value of signal
maybe you'll have ideas for simplifications or find bugs
Re: Pick-A-Signal combinator?
Old topic is dead.
My mods: Capsule Ammo | HandyHands - Automatic handcrafting | ChunkyChunks - Configurable Gridlines
Some other creations: Combinassembly Language GitHub w instructions and link to run it in your browser | 0~drain Laser
Some other creations: Combinassembly Language GitHub w instructions and link to run it in your browser | 0~drain Laser