Re: [Jmol-users] Degradation of complex variables

2016-09-29 Thread Robert Hanson
Whew!

On Thu, Sep 29, 2016 at 6:03 AM, Rolf Huehne 
wrote:

> Hi all,
>
> forget about it. I have found the problem. Sometimes it already helps to
> explain a problem to someone else to get a different look at it.
>
> The function call querying the array was actually a nested call of
> multiple functions and in one of the functions the parameter was
> accidetally set to a an empty string because the function initially
> wasn't prepared for working with an array as parameter.
>
> Regards,
> Rolf
>
> Am 29.09.16 um 12:25 schrieb Rolf Huehne:
> > Hi all,
> >
> > I am observing a strange degradation problem with a complex global
> > variable, consisting of nested hashes and arrays (Jmol
> 14.6.3_2016.09.18):
> >
> > Immediately after I have added another hash level containing an array
> > everything is fine. When I provide the new array as parameter to a
> > function it is there. But when I do the same function call again the
> > array has become an empty string.
> > This is fully reproducible.
> >
> > I tried to build a simple test system that mimics the levels and how the
> > new hash and array are added and queried by another function to
> > demonstrate the problem, but wasn't succesful (no degradation).
> > The real dataset is quite large. Exported with 'write var' it takes 59
> > megabytes of disk space. A compressed version is temporarily available
> > at
> > http://jenalib.leibniz-fli.de/ImgLibPDB/tmp/network_data_
> with_genes_of_interest-2016_09_29.txt.gz
> > The hash key for the subhash is 'genesOfInterest' and the key for the
> > array is 'nodeIds'.
> >
> > But the system below at least demonstrates the number of hash levels and
> > how the new hash and array are added:
> >
> >  Example system --
> > testData = [level2: [level3: {}]]
> >
> > function fillTest(dataRef, count) {
> >var level3   = {};
> >var testHash = {};
> >for (var i from [1 count]) {
> >  testHash[i] = [atomId: i];
> >}
> >
> >level3 = dataRef..level2..level3;
> >level3..level4 = {};
> >level3..level4..level5 = testHash.array("id").select("(atomId)");
> > }
> >
> > function readTest(testPar) {
> >print "type=" + testPar.type;
> >print "size=" + testPar.size;
> > }
> >
> > print " 1 =\n" + testData;
> > fillTest(testData,5);
> > print " 2 =\n" + testData;
> > readTest(testData..level2..level3..level4..level5);
> >
> >  Example output --
> >  1 =
> > {
> >"level2"  :
> >{
> >  "level3"  :
> >  {
> >   }
> > }
> >   }
> >  2 =
> > {
> >"level2"  :
> >{
> >  "level3"  :
> >  {
> >"level4"  :
> >{
> >  "level5"  :
> >  [
> >1
> >2
> >3
> >4
> >5
> >  ]
> > }
> >   }
> > }
> >   }
> > type=array
> > size=5
> > --
> >
> > Bob, do you have any idea how this can happen?
> >
> > Maybe I have made a wrong assumption regarding variables in Jmol:
> >
> > If a hash is provided as a parameter to a function it is used there by
> > reference and it is not created a copy used within the function.
> >
> > The example above at least shouldn't work without the assumption being
> true.
> >
> > The use of the 'level3' variable in the 'fillTest' function is common
> > within my system. It is created as a local hash variable to make sure it
> > is a hash. And if it is already provided in the parameter hash it is
> > replaced by the existing subhash (by reference through '='). If not the
> > new hash is inserted at the end of the function into the parameter hash.
> > I never observed any problems with this strategy before. The newly added
> > data always stayed within the global variable provided as parameter to
> > the function.
> >
> > Regards,
> > Rolf
> >
> >
> > 
> --
> > ___
> > Jmol-users mailing list
> > Jmol-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/jmol-users
> >
>
>
> 
> --
> ___
> Jmol-users mailing list
> Jmol-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/jmol-users
>



-- 
Robert M. Hanson
Larson-Anderson Professor of Chemistry
St. Olaf College
Northfield, MN
http://www.stolaf.edu/people/hansonr


If nature does not answer first what we want,
it is better to take what answer we get.

-- Josiah Willard Gibbs, Lecture XXX, Monday, February 5, 1900
--
___
Jmol-users mailing list
Jmol-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-users


Re: [Jmol-users] Degradation of complex variables

2016-09-29 Thread Rolf Huehne
Hi all,

forget about it. I have found the problem. Sometimes it already helps to 
explain a problem to someone else to get a different look at it.

The function call querying the array was actually a nested call of 
multiple functions and in one of the functions the parameter was 
accidetally set to a an empty string because the function initially 
wasn't prepared for working with an array as parameter.

Regards,
Rolf

Am 29.09.16 um 12:25 schrieb Rolf Huehne:
> Hi all,
>
> I am observing a strange degradation problem with a complex global
> variable, consisting of nested hashes and arrays (Jmol 14.6.3_2016.09.18):
>
> Immediately after I have added another hash level containing an array
> everything is fine. When I provide the new array as parameter to a
> function it is there. But when I do the same function call again the
> array has become an empty string.
> This is fully reproducible.
>
> I tried to build a simple test system that mimics the levels and how the
> new hash and array are added and queried by another function to
> demonstrate the problem, but wasn't succesful (no degradation).
> The real dataset is quite large. Exported with 'write var' it takes 59
> megabytes of disk space. A compressed version is temporarily available
> at
> http://jenalib.leibniz-fli.de/ImgLibPDB/tmp/network_data_with_genes_of_interest-2016_09_29.txt.gz
> The hash key for the subhash is 'genesOfInterest' and the key for the
> array is 'nodeIds'.
>
> But the system below at least demonstrates the number of hash levels and
> how the new hash and array are added:
>
>  Example system --
> testData = [level2: [level3: {}]]
>
> function fillTest(dataRef, count) {
>var level3   = {};
>var testHash = {};
>for (var i from [1 count]) {
>  testHash[i] = [atomId: i];
>}
>
>level3 = dataRef..level2..level3;
>level3..level4 = {};
>level3..level4..level5 = testHash.array("id").select("(atomId)");
> }
>
> function readTest(testPar) {
>print "type=" + testPar.type;
>print "size=" + testPar.size;
> }
>
> print " 1 =\n" + testData;
> fillTest(testData,5);
> print " 2 =\n" + testData;
> readTest(testData..level2..level3..level4..level5);
>
>  Example output --
>  1 =
> {
>"level2"  :
>{
>  "level3"  :
>  {
>   }
> }
>   }
>  2 =
> {
>"level2"  :
>{
>  "level3"  :
>  {
>"level4"  :
>{
>  "level5"  :
>  [
>1
>2
>3
>4
>5
>  ]
> }
>   }
> }
>   }
> type=array
> size=5
> --
>
> Bob, do you have any idea how this can happen?
>
> Maybe I have made a wrong assumption regarding variables in Jmol:
>
> If a hash is provided as a parameter to a function it is used there by
> reference and it is not created a copy used within the function.
>
> The example above at least shouldn't work without the assumption being true.
>
> The use of the 'level3' variable in the 'fillTest' function is common
> within my system. It is created as a local hash variable to make sure it
> is a hash. And if it is already provided in the parameter hash it is
> replaced by the existing subhash (by reference through '='). If not the
> new hash is inserted at the end of the function into the parameter hash.
> I never observed any problems with this strategy before. The newly added
> data always stayed within the global variable provided as parameter to
> the function.
>
> Regards,
> Rolf
>
>
> --
> ___
> Jmol-users mailing list
> Jmol-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/jmol-users
>


--
___
Jmol-users mailing list
Jmol-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-users