[Scilab-users] Clone a function, continued

classic Classic list List threaded Threaded
8 messages Options
mottelet mottelet
Reply | Threaded
Open this post in threaded view
|

[Scilab-users] Clone a function, continued

Thanks Samuel, the problem is that

save('macros/%axesData_i_h.bin', '%axesData_i_h')

will produce a .sod file with a .bin extension. Both formats cannot be used indifferently for compiled macros of a library : in the following code (that can be copy/pasted), a library is built, the "fun1" function is saved in sod format, then the reference to "fun1.bin" is replaced by "fun1.sod" in the lib file :

path=TMPDIR+'/test/';
mkdir(path)
mputl('function y=fun1(x), y=x, end',path+'fun1.sci');
genlib('test',path)
save(path+'fun1.sod','fun1')
doc=xmlRead(path+'lib');
doc.root.children(1).attributes.file='fun1.sod';
disp(xmlDump(doc))
xmlWrite(doc,path+'lib');
clear
lib(TMPDIR+'/test/')

The following output is obtained:

!<?xml version="1.0" encoding="UTF-8" standalone="no"?>                         !
!                                                                               !
!<scilablib name="test">                                                        !
!                                                                               !
!  <macro name="fun1" file="fun1.sod" md5="a50d8a8cda2cd6036306e08e61ffcbeb"/>  !
!                                                                               !
!</scilablib>                                                                   !

Emplacement des fichiers des fonctions : /.

fun1 

-->

Unfortunately, calling fun1 crashes scilab...


S.

Le 28/02/2018 à 15:09, Samuel Gougeon a écrit :
Hello Stéphane,

I would try the following:
After genlibing the set of regular .sci files,
* save the clone with
   save('macros/%axesData_i_h.bin', "%axesData_i_h")
* add a line in the lib file
   <macro name="%axesData_i_h" file="%axesData_i_h.bin" md5="e833d190e21b93af335a011ea9e76aef"/>
The MD5 hash is of the content of the .sci file, that here does not exist. It is use by genlib to check whether the .sci must be recompiled or not. You may try to set any md5 (or the cloned one). As long as you don't recompile the lib with genlib -- just loading it with load() or lib() --, this should work.

My 2 cents..

Samuel


Le 28/02/2018 à 14:52, Stéphane Mottelet a écrit :
Hello,

With the new library system, it is no longer possible to clone a function in a library. This feature is still documented in the help page of "lib" but is not working anymore since saving a user-defined scilab function uses the sod/hdf5 format. Maybe one can ask why such a feature is needed ? Sometimes it can be usefull to have a function which is callable by different names but actually does the same thing. The different calling names can come from the adaptation for different types of data, which can sometimes lead to the same treatment, hence to the same function. Instead of writing two functions with the same source code but a different calling name, cloning the original one was an interesting feature.

I admit that the way it worked under scilab<6.x was not clean at all *but* officially documented in the "lib" help page. For example, imagine that a library has just been built (e.g. the plotlib...)

genlib('plotlib','macros')

I need to add to this library %axesData_i_h which is a clone of generic_i_h (in overloadinglib), which can be done in scilab<6.x by:

%axesData_i_h=generic_i_h;
save('macros/%axesData_i_h.bin',%axesData_i_h)
mputl([mgetl('macros/names');'%axesData_i_h'],'macros/names')

I said above "not clean at all", because the binary file "macros/lib" (which is created by the genlib call) does not need to be updated, as a subsequent

plotlib=lib("macros")

loads all functions, including %axesData_i_h


Doing things like this is not possible any more. It was was also to add persistent variables in libraries, with the same mechanism.

By the way, under scilab 6.0.1, the "macros/lib" is now an XML file with a clear syntax, e.g.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scilablib name="plotliblib">
  <macro name="%c_i_pltlibH" file="%c_i_pltlibH.bin" md5="d0966468b335a69681a29d84c99feb5c"/>
  <macro name="%figureDa_i_h" file="%figureDa_i_h.bin" md5="a1ebda57a1607b28095def2e415e2ec1"/>
...
</scilablib>

It does not seem to be documented either.

S.





_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users


-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet
-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Clone a function, continued

Le 28/02/2018 à 16:30, Stéphane Mottelet a écrit :
Thanks Samuel, the problem is that

save('macros/%axesData_i_h.bin', '%axesData_i_h')

will produce a .sod file with a .bin extension. Both formats cannot be used indifferently for compiled macros of a library : in the following code (that can be copy/pasted), a library is built, the "fun1" function is saved in sod format, then the reference to "fun1.bin" is replaced by "fun1.sod" in the lib file :

path=TMPDIR+'/test/';
mkdir(path)
mputl('function y=fun1(x), y=x, end',path+'fun1.sci');
genlib('test',path)
save(path+'fun1.sod','fun1')
doc=xmlRead(path+'lib');
doc.root.children(1).attributes.file='fun1.sod';
disp(xmlDump(doc))
xmlWrite(doc,path+'lib');
clear
lib(TMPDIR+'/test/')

The following output is obtained:

!<?xml version="1.0" encoding="UTF-8" standalone="no"?>                         !
!                                                                               !
!<scilablib name="test">                                                        !
!                                                                               !
!  <macro name="fun1" file="fun1.sod" md5="a50d8a8cda2cd6036306e08e61ffcbeb"/>  !
!                                                                               !
!</scilablib>                                                                   !

Emplacement des fichiers des fonctions : /.

fun1 

-->

Unfortunately, calling fun1 crashes scilab...

On my side, with the following lib file:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scilablib name="testlib">
  <macro name="fun1" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
  <macro name="fun2" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
</scilablib>

it is possible to load the library, but then, first issue, only fun2 is reported:
--> lib ./
 ans  =
Functions files location : TMPDIR\test.

fun2 


And then, also in this case, calling fun2(1) crashes Scilab...



_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Clone a function, continued

Le 28/02/2018 à 17:21, Samuel Gougeon a écrit :

On my side, with the following lib file:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scilablib name="testlib">
  <macro name="fun1" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
  <macro name="fun2" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
</scilablib>

it is possible to load the library, but then, first issue, only fun2 is reported:
--> lib ./
 ans  =
Functions files location : TMPDIR\test.

fun2 


And then, also in this case, calling fun2(1) crashes Scilab...

After http://mailinglists.scilab.org/Scilab-users-Scilab-and-hdf5-format-small-survey-tp4037711p4037721.html :

When on Windows making a symbolic link
--> host("mklink test2.sci test1.sci")  //  mklink  copy source

and then running genlib (=> no complain), genlib yields the following lib file:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scilablib name="testlib">
  <macro name="fun2" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
</scilablib>

!
Then, running fun2(1) crashes Scilab (at least this unstability is... constant ;)
Let's try making and using a hard link...


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Clone a function, continued

Le 28/02/2018 à 17:43, Samuel Gougeon a écrit :
Le 28/02/2018 à 17:21, Samuel Gougeon a écrit :

On my side, with the following lib file:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scilablib name="testlib">
  <macro name="fun1" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
  <macro name="fun2" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
</scilablib>

it is possible to load the library, but then, first issue, only fun2 is reported:
--> lib ./
 ans  =
Functions files location : TMPDIR\test.

fun2 


And then, also in this case, calling fun2(1) crashes Scilab...

After http://mailinglists.scilab.org/Scilab-users-Scilab-and-hdf5-format-small-survey-tp4037711p4037721.html :

When on Windows making a symbolic link
--> host("mklink test2.sci test1.sci")  //  mklink  copy source

and then running genlib (=> no complain), genlib yields the following lib file:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scilablib name="testlib">
  <macro name="fun2" file="fun1.bin" md5="332cdd3297cdcb56652a3399056f02ed"/>
</scilablib>

!
Then, running fun2(1) crashes Scilab (at least this unstability is... constant ;)
Let's try making and using a hard link...

If in the file myfun.sci genlib() does not find any function named "myfun",
then genlib ignores it and add no entry to the lib file.

Unless bypassing genlib(), this somewhat prevents using soft or hard links for the targeted purpose...

Samuel


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Clone a function, continued

In reply to this post by mottelet
About

http://mailinglists.scilab.org/Scilab-users-Scilab-and-hdf5-format-small-survey-tp4037711p4037718.html :
Le 28/02/2018 à 14:52, Stéphane Mottelet a écrit :
.../...
Doing things like this is not possible any more. It was was also to add persistent variables in libraries, with the same mechanism.

External libraries are not persistent. They are also erased by the so-loved-by-matlabers
clear
instruction...



_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Clone a function, continued

In reply to this post by mottelet
Le 28/02/2018 à 16:30, Stéphane Mottelet a écrit :
Thanks Samuel, the problem is that

save('macros/%axesData_i_h.bin', '%axesData_i_h')

will produce a .sod file with a .bin extension. Both formats cannot be used indifferently for compiled macros of a library : in the following code (that can be copy/pasted), a library is built, the "fun1" function is saved in sod format, then the reference to "fun1.bin" is replaced by "fun1.sod" in the lib file :

path=TMPDIR+'/test/';
mkdir(path)
mputl('function y=fun1(x), y=x, end',path+'fun1.sci');
genlib('test',path)
save(path+'fun1.sod','fun1')
doc=xmlRead(path+'lib');
doc.root.children(1).attributes.file='fun1.sod';
disp(xmlDump(doc))
xmlWrite(doc,path+'lib');
clear
lib(TMPDIR+'/test/')

The following output is obtained:

!<?xml version="1.0" encoding="UTF-8" standalone="no"?>                         !
!                                                                               !
!<scilablib name="test">                                                        !
!                                                                               !
!  <macro name="fun1" file="fun1.sod" md5="a50d8a8cda2cd6036306e08e61ffcbeb"/>  !
!                                                                               !
!</scilablib>                                                                   !

Emplacement des fichiers des fonctions : /.

fun1 

-->

Unfortunately, calling fun1 crashes scilab...

Last trial for today:
  • Define fun1() in fun1.sci.
  • Compile fun1.sci with genlib(): OK => fun1.bin available
  • Create fun2.bin as a hard link to fun1.bin:
    host("mklink /H fun2.bin fun1.bin")  // Windows
  • Update (by hand or code, not with genlib) the lib file:
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <scilablib name="testlib">
      <macro name="fun1" file="fun1.bin" md5="8a3737878c543f1a5005c42122236628"/>
      <macro name="fun2" file="fun2.bin" md5="8a3737878c543f1a5005c42122236628"/>
    </scilablib>
    
  • load the library (OK : both fun1 and fun2 are loaded):
    --> lib ./
     ans  =
    Functions files location : TMPDIR\test.
    fun1  fun2

  • fun1(1)   //=> OK
  • fun2(1)    // .... => crash

A bad end.
It is likeky vain to go on fighting without Antoine Elias advices and comments :)

Samuel


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
mottelet mottelet
Reply | Threaded
Open this post in threaded view
|

Re: Clone a function, continued

Le 28/02/2018 à 18:48, Samuel Gougeon a écrit :
Le 28/02/2018 à 16:30, Stéphane Mottelet a écrit :
Thanks Samuel, the problem is that

save('macros/%axesData_i_h.bin', '%axesData_i_h')

will produce a .sod file with a .bin extension. Both formats cannot be used indifferently for compiled macros of a library : in the following code (that can be copy/pasted), a library is built, the "fun1" function is saved in sod format, then the reference to "fun1.bin" is replaced by "fun1.sod" in the lib file :

path=TMPDIR+'/test/';
mkdir(path)
mputl('function y=fun1(x), y=x, end',path+'fun1.sci');
genlib('test',path)
save(path+'fun1.sod','fun1')
doc=xmlRead(path+'lib');
doc.root.children(1).attributes.file='fun1.sod';
disp(xmlDump(doc))
xmlWrite(doc,path+'lib');
clear
lib(TMPDIR+'/test/')

The following output is obtained:

!<?xml version="1.0" encoding="UTF-8" standalone="no"?>                         !
!                                                                               !
!<scilablib name="test">                                                        !
!                                                                               !
!  <macro name="fun1" file="fun1.sod" md5="a50d8a8cda2cd6036306e08e61ffcbeb"/>  !
!                                                                               !
!</scilablib>                                                                   !

Emplacement des fichiers des fonctions : /.

fun1 

-->

Unfortunately, calling fun1 crashes scilab...

Last trial for today:
  • Define fun1() in fun1.sci.
  • Compile fun1.sci with genlib(): OK => fun1.bin available
  • Create fun2.bin as a hard link to fun1.bin:
    host("mklink /H fun2.bin fun1.bin")  // Windows
  • Update (by hand or code, not with genlib) the lib file:
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <scilablib name="testlib">
      <macro name="fun1" file="fun1.bin" md5="8a3737878c543f1a5005c42122236628"/>
      <macro name="fun2" file="fun2.bin" md5="8a3737878c543f1a5005c42122236628"/>
    </scilablib>
    
  • load the library (OK : both fun1 and fun2 are loaded):
    --> lib ./
     ans  =
    Functions files location : TMPDIR\test.
    fun1  fun2

  • fun1(1)   //=> OK
  • fun2(1)    // .... => crash
Already tried this one with fun2.bin as a copy of fun1.bin. I noticed that under scilab 5.5.2,

  • Define fun1()
  • fun2=fun1
  • save("fun1.bin",fun1)
  • save('fun2.bin',fun2)

gives a fun2.bin different from fun1.bin as the string "fun1" appears in fun1.bin and "fun2" appears in fun2.bin

S.



A bad end.
It is likeky vain to go on fighting without Antoine Elias advices and comments :)

Samuel



_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users


-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Clone a function, continued

In reply to this post by Samuel GOUGEON
Le 28/02/2018 à 18:21, Samuel Gougeon a écrit :
About

http://mailinglists.scilab.org/Scilab-users-Scilab-and-hdf5-format-small-survey-tp4037711p4037718.html :
Le 28/02/2018 à 14:52, Stéphane Mottelet a écrit :
.../...
Doing things like this is not possible any more. It was was also to add persistent variables in libraries, with the same mechanism.

External libraries are not persistent. They are also erased by the so-loved-by-matlabers
clear
instruction...

My fault: External libraries that are autoloaded ARE protected and persistent.
They are protected by the startup procedure. So actually functions belonging to them are persistent.

Only the libraries that are loaded during the session may be cleared.

Samuel


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users