<!-- 
RSS generated by JIRA (8.3.4#803005-sha1:1f96e09b3c60279a408a2ae47be3c745f571388b) at Sat Feb 10 15:31:44 JST 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>PFS-JIRA</title>
    <link>https://pfspipe.ipmu.jp/jira</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>8.3.4</version>
        <build-number>803005</build-number>
        <build-date>13-09-2019</build-date>
    </build-info>


<item>
            <title>[REDMINE1D-340] [RM-8427] [swing bindings]  remove the std::vector -&gt; numpy array wrapper </title>
                <link>https://pfspipe.ipmu.jp/jira/browse/REDMINE1D-340</link>
                <project id="11002" key="REDMINE1D">1D Redmine </project>
                    <description>&lt;p&gt;&lt;em&gt;&lt;font color=&quot;#505f79&quot;&gt; Created on 2023-10-19 14:15:44 by Didier Vibert. % Done: 100&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;The wrapper (pyconv.h) was written to be able to bind std::vector to numpy arrays. This wrapper has a drawback since it returns a raw pointer to the std::vector data buffer without having the property of this vector. Thus it is not controlling the life-time of the buffer which may not survive the use of the returned pointer that seems to be directly bind by swig to the numpy array buffer.&lt;/p&gt;

&lt;p&gt;we can remove all these wrappers, since swig is able to bind a std::vector to a python list, and then we can convert the list to a numpy array in the python API code.&lt;/p&gt;

&lt;p&gt;we should also check if swig 4 is able to bind a std::vector to a numpy array without any wrapper... If I am correct I think it can !&lt;/p&gt;

&lt;p&gt;MR: &lt;a href=&quot;https://gitlab.lam.fr/CPF/cpf-redshift/-/merge_requests/561&quot; class=&quot;external-link&quot; rel=&quot;nofollow&quot;&gt;https://gitlab.lam.fr/CPF/cpf-redshift/-/merge_requests/561&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
        <key id="24078">REDMINE1D-340</key>
            <summary>[RM-8427] [swing bindings]  remove the std::vector -&gt; numpy array wrapper </summary>
                <type id="3" iconUrl="https://pfspipe.ipmu.jp/jira/secure/viewavatar?size=xsmall&amp;avatarId=10518&amp;avatarType=issuetype">Task</type>
                                            <priority id="10000" iconUrl="https://pfspipe.ipmu.jp/jira/images/icons/priorities/medium.svg">Normal</priority>
                        <status id="10002" iconUrl="https://pfspipe.ipmu.jp/jira/images/icons/statuses/generic.png" description="The issue is resolved, reviewed, and merged">Done</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10000">Done</resolution>
                                        <assignee username="r2j.migrate">Redmine-Jira Migtation</assignee>
                                    <reporter username="r2j.migrate">Redmine-Jira Migtation</reporter>
                        <labels>
                    </labels>
                <created>Thu, 19 Oct 2023 18:16:34 +0000</created>
                <updated>Mon, 13 Nov 2023 18:20:55 +0000</updated>
                            <resolved>Mon, 13 Nov 2023 18:20:55 +0000</resolved>
                                                                        <due></due>
                            <votes>0</votes>
                                    <watches>1</watches>
                                                                <comments>
                            <comment id="35801" author="r2j.migrate" created="Mon, 13 Nov 2023 18:19:57 +0000"  >&lt;p&gt;Comment by Didier Vibert on 2023-10-20 09:12:02:&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;laconversionsimpleimplique2copies&quot;&gt;&lt;/a&gt;la conversion simple implique 2 copies&lt;/h2&gt;

&lt;p&gt;en creusant un peu, la solution d&apos;abandonner les wrapper et de passer par la simple conversion a l&apos;inconv&#233;nient de g&#233;n&#232;rer 2 copies...&lt;/p&gt;

&lt;p&gt;&amp;lt;pre&amp;gt;&lt;br/&gt;
 std::vector -&lt;del&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;swig std_vector.i&amp;#93;&lt;/span&gt;&lt;/del&gt;&lt;del&gt;&amp;gt; python tuple --&lt;span class=&quot;error&quot;&gt;&amp;#91;python api&amp;#93;&lt;/span&gt;&lt;/del&gt;-&amp;gt; numpy array&lt;br/&gt;
&amp;lt;/pre&amp;gt; &lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;l%27impl%C3%A9mentationactuelle%2Caucunecopie%2CMAIS...&quot;&gt;&lt;/a&gt;l&apos;impl&#233;mentation actuelle, aucune copie, MAIS...&lt;/h2&gt;

&lt;p&gt;&amp;lt;pre&amp;gt;&lt;br/&gt;
 std::vector -&lt;del&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;swig numpy.i (Argout View Arrays)&amp;#93;&lt;/span&gt;&lt;/del&gt;-&amp;gt; numpy array (m&#234;me buffer que celui du std::vector)&lt;br/&gt;
&amp;lt;/pre&amp;gt;&lt;br/&gt;
ne g&#233;n&#232;re aucune copie si on passe l&apos;adresse du buffer du std::vector mais pose alors le probl&#232;me de dur&#233;e de vie du buffer (cf &quot;Argout View Arrays&quot;:&lt;a href=&quot;https://numpy.org/doc/stable/reference/swig.interface-file.html#argout-view-arrays&quot; class=&quot;external-link&quot; rel=&quot;nofollow&quot;&gt;https://numpy.org/doc/stable/reference/swig.interface-file.html#argout-view-arrays&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;&amp;gt; There is almost no way to guarantee that the internal data from the C code will remain in existence for the entire lifetime of the NumPy array that encapsulates it. If the user destroys the object that provides the view of the data before destroying the NumPy array, then using that array may result in bad memory references or segmentation faults. Nevertheless, there are situations, working with large data sets, where you simply have no other choice.&lt;/p&gt;

&lt;p&gt;Avec cette solution on peut &#224; la place allouer dans le wrapper et copier le contenu, dans ce cas plus de risque de destruction intempestive du buffer, mais une fuite m&#233;moire, car la desallocation du nouveau buffer ne sera jamais faite.&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;Alternative%2Cavecunecopie&quot;&gt;&lt;/a&gt;Alternative, avec une copie&lt;/h2&gt;

&lt;p&gt;Il y a une autre possibilit&#233;, qui g&#233;n&#232;re une seule copie au lieu de deux, en modifiant le wrapper actuel, toujours via numpy.i mais en utilisant cette fois des &quot;Memory Managed Argout View Arrays&quot;:&lt;a href=&quot;https://numpy.org/doc/stable/reference/swig.interface-file.html#memory-managed-argout-view-arrays&quot; class=&quot;external-link&quot; rel=&quot;nofollow&quot;&gt;https://numpy.org/doc/stable/reference/swig.interface-file.html#memory-managed-argout-view-arrays&lt;/a&gt; :&lt;br/&gt;
&amp;lt;pre&amp;gt;&lt;br/&gt;
std::vector -&lt;del&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;swig numpy.i (Memory Managed Argout View Arrays)&amp;#93;&lt;/span&gt;&lt;/del&gt;-&amp;gt; numpy array  (buffer allou&#233; par le wrapper, d&#233;sallou&#233; par le code python &#224; la disparition du numpy array)&lt;br/&gt;
&amp;lt;/pre&amp;gt;&lt;/p&gt;

&lt;p&gt;(cf &lt;a href=&quot;https://scipy-cookbook.readthedocs.io/items/SWIG_Memory_Deallocation.html&quot; class=&quot;external-link&quot; rel=&quot;nofollow&quot;&gt;https://scipy-cookbook.readthedocs.io/items/SWIG_Memory_Deallocation.html&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;L&apos;utilisation des &quot;Memory Managed Argout View Arrays&quot; permet de transf&#233;rer &#224; python le contenu d&apos;un std::vector dont on ne connait pas la taille &#224; l&apos;avance, et dont pyhon va manager la desallocation (il faut alors allouer et copier le contenu du std::vector  dans le wrapper c++)&lt;/p&gt;

&lt;p&gt;Note: On peut aussi arriver au m&#234;me r&#233;sultat en utilisant des &quot;Argout Arrays&quot;:&lt;a href=&quot;https://numpy.org/doc/stable/reference/swig.interface-file.html#argout-arrays&quot; class=&quot;external-link&quot; rel=&quot;nofollow&quot;&gt;https://numpy.org/doc/stable/reference/swig.interface-file.html#argout-arrays&lt;/a&gt; mais dans ce cas, lors de l&apos;appel python pour retourner le tableau, il faut passer en argument la taille du tableau retourn&#233; (pour que swig alloue un numpy array de la bonne taille avant):&lt;br/&gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&quot;python&quot;&amp;gt;&lt;br/&gt;
myarray = PC.Get_Float64Array(binded_vector, known_size)&lt;br/&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br/&gt;
ce qui est moins &quot;pythonic&quot;  mais faisable dans notre cas car nous voulons des getter sur des vecteurs d&#233;j&#224; construits et dont on peut connaitre la taille en exportant une fonction qui la retourne.&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;Alternativesanscopies&quot;&gt;&lt;/a&gt;Alternative sans copies&lt;/h2&gt;

&lt;p&gt;pas trouv&#233; sans avoir de probl&#232;mes de memory management. &lt;/p&gt;</comment>
                            <comment id="35802" author="r2j.migrate" created="Mon, 13 Nov 2023 18:20:06 +0000"  >&lt;p&gt;Comment by Ali Allaoui on 2023-10-20 09:14:23:&lt;br/&gt;
On ne fait pas &#231;a un moment critique point de vue m&#233;moire ou performance, donc de mon point de vue ce n&apos;est pas grave de faire deux copies&lt;/p&gt;</comment>
                            <comment id="35803" author="r2j.migrate" created="Mon, 13 Nov 2023 18:20:19 +0000"  >&lt;p&gt;Comment by Didier Vibert on 2023-10-20 09:26:16:&lt;br/&gt;
Ali Allaoui wrote in #note-2:&lt;br/&gt;
&amp;gt; On ne fait pas &#231;a un moment critique point de vue m&#233;moire ou performance, donc de mon point de vue ce n&apos;est pas grave de faire deux copies&lt;/p&gt;

&lt;p&gt;c&apos;est pas faux, aujourd&apos;hui. &lt;/p&gt;

&lt;p&gt;De toute fa&#231;on il faut modifier le code dans un sens ou dans l&apos;autre, et ce n&apos;est bien compliqu&#233; d&apos;impl&#233;menter la version &#233;conome avec ce qu&apos;on a d&#233;j&#224; (pas de modif du code python, une allocation et copie &#224; ajouter dans les fonctions de pyconv.h, et la d&#233;claration modifi&#233;e pour passer des memory managed argout view arrays dans redshift.i)&lt;/p&gt;</comment>
                            <comment id="35804" author="r2j.migrate" created="Mon, 13 Nov 2023 18:20:30 +0000"  >&lt;p&gt;Comment by Didier Vibert on 2023-10-27 13:12:59:&lt;br/&gt;
finalement j&apos;ai impl&#233;ment&#233; la conversion vector -&amp;gt; numpy&lt;br/&gt;
qui gagne un peu en vitesse et en m&#233;moire&lt;/p&gt;
</comment>
                            <comment id="35805" author="r2j.migrate" created="Mon, 13 Nov 2023 18:20:41 +0000"  >&lt;p&gt;Comment by Pierre-yves Chabaud on 2023-11-10 15:17:23:&lt;br/&gt;
Merged into @develop@ (@8e65b718@)&lt;/p&gt;</comment>
                    </comments>
                    <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                <customfield id="customfield_10500" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|zzt01j:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                    </customfields>
    </item>
</channel>
</rss>