Closed zepumph closed 3 years ago
Currently we are only trying to add support for this to the second screen. It wasn't totally clear if this is needed for the first screen. It may be the case that it is easy to add to the first once the second is in good shape.
In the last 2.5 hours I made progress on this issue.
Work done so far:
Currently the state wrapper will set state on the startup screen on a sim, but breaks when adding EnergyChunks
Up next:
From this investigation, I think that it is likely to take between 8-16 more hours to get an initial feature working for all sim elements. I hope to touch base with the greater team once I have my mini system working fully with state (2-4 more hours?) Tagging @kathy-phet so she is aware of my current time estimates.
The above fixes an infinite loop because of using string operations. The following case should return true for PhetioDynamicElementContainer.stateSetOnAllChildrenOfDynamicElement, but never returned:
potential parent: energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverPhetioGroup.energyChunkPathMoverPhetio_1
potential child:
energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverPhetioGroup.energyChunkPathMoverPhetio_134
(oops). Tagging @samreid to note the bug fix
Thanks to some consulting with @jbphet, I was able to get an initial pass implemented. Work done so far:
ObservableArrayIO( ReferenceIO( EnergyChunkIO ) )
or the same for EnergyChunkPathMoverIO
Now state is successfully being set through the entire system until the very end where the beaker emits a chunk as heat energy. This is because I haven't yet instrumented EnergyChunkContainerSlice
Still to do in order:
EnergyChunkContainerSlice
I'm working on a branch right now since I wanted to commit, but I didn't want to tip toe around the fact that I commented our most of the components on the second screen at this time. I will keep it up to date with master to make an easier transition later on.
Things are looking really good. In https://github.com/phetsims/energy-forms-and-changes/commit/33160bed9f2a3d260bb1152ace21dce1d1c3e5d1 I got the state wrapper working for the original three system elements.
Then I got the first screen working
Now I am on to adding support to individual system elements. I think it will go pretty fast from here, like in https://github.com/phetsims/energy-forms-and-changes/commit/4899a57ac936f2f74ef76ec0a0abc2d573a20dc5. There are ~5 more or so.
I have spent 8.5 Hours on this so far.
All system elements have now been added back for the second screen:
The dynamic element implementation has leaked into the first screen, and I can't think of a way to isolate this feature just to the second screen because Beaker (meaning RectangularThermalMovableModelElement
) needed to be outfitted with PhetioGroup support, so the first screen is still a bit broken. Right now the set state onto a block looks like:
Sad little chunks getting left behind. . . I hope it won't be too hard to sort it out in a way that is consistent, simple, and idiomatic with the behavior of energy chunks elsewhere.
I created https://github.com/phetsims/energy-forms-and-changes/issues/353 to investigate some first-screen trouble mentioned above.
Up next:
Error: Assertion failed: energyFormsAndChanges.systemsScreen.model.energyChunkGroup.countProperty should match array length.
. I will need to take a look to see if it has to do with mutating that group while state is being set from Property listeners.Second bullet solved by https://github.com/phetsims/energy-forms-and-changes/commit/37104230caf31517d1231fba15172919d3f84594.
RE performance, there seems to be many more instances of EnergyChunk (8250) and EnergyChunkContainerSlice (6084) in a random snapshot I made in the state wrapper. Then a couple of seconds later, we were up to EnergyChunk (18596) and EnergyChunkContainerSlice (2500).
What fun! Nothing like an obvious memory leak for a Thursday afternoon!!!
The above fix in EnergyChunkContainerSlice fixed the massive memory leak. Now after a bit of running we still stay within the 50-60MB range:
That said, I think that still feel that there may be a smaller memory leak. I will report back after 10 minutes of fuzzing.
There is definitely still a memory leak, just not as aggressive:
I think that I am on to something with this patch. I would have committed, but after this patch, toggling the energy chunks visible caused this assertion:
Assertion failed: energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverGroup.countProperty should match array length.
This only seems to happen in cases where energy chunks get preloaded.
The main issue with https://github.com/phetsims/energy-forms-and-changes/issues/350#issuecomment-690818017 was that I was directly calling dispose
, instead of PhetioGroup.disposeElement
. This handled some of the memory leak I was finding. Still though we are increasing the number of EnergyChunk and EnergyChunkPathMover instances without bound (just slower).
Still needing work:
Error: Assertion failed: Impossible set state from iterate; unset state:
{
"energyFormsAndChanges.systemsScreen.model.energyUsers.incandescentBulb.energyChunkList": {
"array": [
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_653",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_654",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_655",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_656",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_657",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_658",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_659",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_660",
"energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_661"
]
},
"energyFormsAndChanges.systemsScreen.model.energyUsers.incandescentBulb.radiatedEnergyChunkMovers": {
"array": [
"energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverGroup.energyChunkPathMover_20",
"energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverGroup.energyChunkPathMover_24"
]
},
"energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverGroup.energyChunkPathMover_20": {
"path": [
{
"x": 0.04051891480807868,
"y": 0.15000000000000002
}
],
"speed": 0.04,
"pathFullyTraversed": false,
"nextPoint": {
"x": 0.04051891480807868,
"y": 0.15000000000000002
},
"energyChunkPhetioID": "energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_653",
"phetioID": "energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverGroup.energyChunkPathMover_20"
},
"energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverGroup.energyChunkPathMover_24": {
"path": [
{
"x": 0.1296498160048301,
"y": 0.15000000000000002
}
],
"speed": 0.04,
"pathFullyTraversed": false,
"nextPoint": {
"x": 0.1296498160048301,
"y": 0.15000000000000002
},
"energyChunkPhetioID": "energyFormsAndChanges.systemsScreen.model.energyChunkGroup.energyChunk_654",
"phetioID": "energyFormsAndChanges.systemsScreen.model.energyChunkPathMoverGroup.energyChunkPathMover_24"
}
}
I didn't have access to the full state when this happened.
https://github.com/phetsims/energy-forms-and-changes/commit/0e5daa3bc04a161a9fc34525e21261f857215b71 fixed the first bullet by recognizing that energyChunk slices are actually static, and don't need to a PhetioGroup. This cleaned up a lot of code. It also changed the buggy behavior of https://github.com/phetsims/energy-forms-and-changes/issues/353. I'll comment over there.
From a basic check, it doesn't look like that changed the memory footprint of energyChunks (still incrementing slowly without bound)
@jbphet and I found that I'm not disposing for clearEnergyChunks
. I'll do that now!
I just merged to master, and @jbphet and I will work together in the same repo as we go from here.
In the above I am disposing the appropriate chunks and movers when clearing the chunks. This has led to a much more reasonable counts in the groups while interacting with the state wrapper, but we may still have a slow leak in some cases.
As you can see from linked issues, there is still a fair amount of work to do. The main stuff now is just caused by bugs in the friction with how PhetioGroup is strict with registration and de-registration.
I successfully cherry-picked everything above into the branch. Note I left a few superfluous tandem commits out, but included all of the EFAC ones. Here is the ordered list:
https://github.com/phetsims/tandem/commit/3420fef7da5d83f6948ff1eba9850e93aa251307
https://github.com/phetsims/energy-forms-and-changes/commit/65ceee44a9c10181b00c893154283c1ad1f89b5b https://github.com/phetsims/energy-forms-and-changes/commit/33160bed9f2a3d260bb1152ace21dce1d1c3e5d1 https://github.com/phetsims/energy-forms-and-changes/commit/41fcd8523d08f3bb7645fef60efc9884eb5b08f9 https://github.com/phetsims/energy-forms-and-changes/commit/61f3833f649d1a3f0b89676d5f704bd04780836f https://github.com/phetsims/energy-forms-and-changes/commit/4899a57ac936f2f74ef76ec0a0abc2d573a20dc5 https://github.com/phetsims/energy-forms-and-changes/commit/ffbe4d316deaa88c9bd0a5ec5f56f9ebf62b921f https://github.com/phetsims/energy-forms-and-changes/commit/2d0cf12e2c253e9879249087d8ce002cd3ef21e8 https://github.com/phetsims/energy-forms-and-changes/commit/270e5d9bd5d2fba9c7e4e77e06b7171ef8258f61 https://github.com/phetsims/energy-forms-and-changes/commit/9393dd74163ca992f5b71fa14f76c2eda5863cfa https://github.com/phetsims/energy-forms-and-changes/commit/7e2e8fa4bec05bd0338477ee13e79654f6348150 https://github.com/phetsims/energy-forms-and-changes/commit/37104230caf31517d1231fba15172919d3f84594 https://github.com/phetsims/energy-forms-and-changes/commit/1f67bd06d9b5888390bee8f637492e65de5ff215 https://github.com/phetsims/energy-forms-and-changes/commit/458d17a4ef684a2acdea3aa92b1f88f0c1316164 https://github.com/phetsims/energy-forms-and-changes/commit/996ddaa27fa93fb27e53efec1ac059cedd4f0568 https://github.com/phetsims/energy-forms-and-changes/commit/7d926c598605622b12780199c3f15a5c2976c458 https://github.com/phetsims/energy-forms-and-changes/commit/634c3d305d5ac3e786074b587f235c96960d0aca https://github.com/phetsims/energy-forms-and-changes/commit/0e5daa3bc04a161a9fc34525e21261f857215b71 https://github.com/phetsims/energy-forms-and-changes/commit/12203c18eecc3d9a05cf040f477cef5d3dcbf9a7 https://github.com/phetsims/energy-forms-and-changes/commit/e13ef6220ed7b473a3097c672de9026903fa415e https://github.com/phetsims/energy-forms-and-changes/commit/ae4615bb217f9f7c0d5080d065b82099e2f77425 https://github.com/phetsims/energy-forms-and-changes/commit/083035b0c699474337f6b7496e8df5d73e0e4173 https://github.com/phetsims/energy-forms-and-changes/commit/b678ead9a0a731222025f419dce3b63d1ed56c2b https://github.com/phetsims/energy-forms-and-changes/commit/ae4e901b36e341eed40b7ea0b09e5d307b3e9f54 https://github.com/phetsims/energy-forms-and-changes/commit/856ca5a6521711ba3b4582b651dd5962567a3c90 https://github.com/phetsims/energy-forms-and-changes/commit/8fb6ed189f80b5509f65a964f4e6b6d0db9fc238 https://github.com/phetsims/energy-forms-and-changes/commit/6209cfaeeaa696276fcd0c68a369fe255d1de410 https://github.com/phetsims/energy-forms-and-changes/commit/915c30c8fd122058e20f6b4018d0806e19e114ee https://github.com/phetsims/energy-forms-and-changes/commit/09af565e90d2194c961b5197742282e68a0d50f5 https://github.com/phetsims/energy-forms-and-changes/commit/bb27f799537bb1f4d2ab9bbbba993097062d1408 https://github.com/phetsims/energy-forms-and-changes/commit/7c9b8e5c1b368e59b1b0eb90c9d97b3f7b3bc922 https://github.com/phetsims/energy-forms-and-changes/commit/51a142ec2ada794e9d9b98d33a3e74e97da29c76 https://github.com/phetsims/energy-forms-and-changes/commit/c2dd784ad6dfdbb1efe9bf94a0aeb89e0c2fadbe https://github.com/phetsims/energy-forms-and-changes/commit/8e072d13ea4665f49fffb7d4226dd90f0ee337eb https://github.com/phetsims/energy-forms-and-changes/commit/a9693f520b7c9fd730aa24805e4324b248395d30
Everything above is a cherry-pick into 1.4 branch
EnergySystemElementIO.documentation = 'My Documentation';
as documentation. Oops.Thanks for all the work that you did here @zepumph. 1.4.0-rc.3 is in RC as of this writing (rc.2 had the first round of instrumented energy chunks, rc.1 did not), and so far things are looking good. I've done a fair amount of testing of this code, and have done some reviewing, and will continue the review under #367, so I think it's best to close this issue at this point.
After discussion with @jbphet last Thursday, I feel like I am well briefed on the structure of the EnergyChunks and how I want to begin investigation to add PhET-iO dynamic element support to them.
Brief notes from our meeting: