[Developers] libraries of functions

John Sibert sibert at hawaii.edu
Fri Aug 15 10:57:58 PDT 2014


You shouldn't need any extra copy constructors or casts. For example, I 
recently wrote some overloaded functions with the following prototypes 
to be called from a tpl:
> double beta_pdf(const double& x, const double& a, const double& b);
> dvariable beta_pdf(const dvariable& x, const dvariable& a, const 
> dvariable& b);
> dvector beta_pdf(const dvector& x, const dvariable& a, const 
> dvariable& b);
> dvar_vector beta_pdf(const dvar_vector& x, const dvariable& a, const 
> dvariable& b);
>
The dvar_vector version is called using arguments of init_bounded_vector 
and init_bounded_number. No sweat. If you want I can send the code.

I guess I have lost sight of what you are trying to do.
//

John Sibert
Emeritus Researcher, SOEST
University of Hawaii at Manoa
Honolulu HI (GMT-10)
808-294-3842 (mobile)

Visit the ADMB project http://admb-project.org/

On 08/15/2014 07:33 AM, Mark Maunder wrote:
> John,
>
> What I can find for atan2 is the following.
>
> dvector  atan2 (const dvector &t1, const dvector &t2)
> dvector  atan2 (const dvector &t1, double t2)
> dvector  atan2 (double t1, const dvector &t2)
> dvar_vector  atan2 (const dvar_vector &t1, const dvar_vector &t2)
> dvar_vector  atan2 (const dvar_vector &t1, double t2)
> dvar_vector  atan2 (double t1, const dvar_vector &t2)
>
>
> In the source code I find in fvar_fn1.cpp
>
> prevariable &  atan2 (const prevariable &v1, const prevariable &v2)
>    Description not yet available.
>   
> prevariable &  atan2 (const prevariable &v1, const double v2)
>    Description not yet available.
>   
> prevariable &  atan2 (const double v1, const prevariable &v2)
>    Description not yet available.
>
> It's more like a field of rabbit holes. That's why I am reluctant to change the core code and would like to work with user defined libraries. I was advised to use templates and traits, but my experience with those was not very gratifying. Going back to multiple overloads using dvariables and prevariables looks like the best approach.
>
> Why would a copy constructor defined for a double to a prevariable be dangerous since there is already one from a double to a dvariable? This would eliminate a whole set of overloaded functions that would need to be created.
>
> Mark
>
> -----Original Message-----
> From: John Sibert [mailto:sibert at hawaii.edu]
> Sent: Thursday, August 14, 2014 12:57 PM
> To: Mark Maunder; William Stockhausen - NOAA Federal
> Cc: developers at admb-project.org
> Subject: Re: [Developers] libraries of functions
>
> You guys are headed down a rabbit hole.
> There are plenty of examples in admb of functions defined to take double, dvariable, dvar_vector, and ... arguments. Have a look at some of those (eg atan2(...) )before you start writing dangerous and useless constructors and casts.
>
> John Sibert
> Emeritus Researcher, SOEST
> University of Hawaii at Manoa
> Honolulu HI (GMT-10)
> 808-294-3842 (mobile)
>
> Visit the ADMB project http://admb-project.org/
>
> On 08/13/2014 12:26 PM, Mark Maunder wrote:
>> So we need a copy constructor defined for a double to a prevariable.
>> We probably also need a copy constructor defined for an int to a
>> prevariable
>>
>> What about a dvector[1], an ivector[1], or higher dimensions to a
>> prevariable?
>>
>> Then we could define the library functions as prevariables. Are there
>> any disadvantages to this?
>>
>> Mark
>>
>> *From:*William Stockhausen - NOAA Federal
>> [mailto:william.stockhausen at noaa.gov]
>> *Sent:* Wednesday, August 13, 2014 1:46 PM
>> *To:* Mark Maunder
>> *Cc:* Steve Martell; developers at admb-project.org
>> *Subject:* Re: [Developers] libraries of functions
>>
>> I think dvariable works with a double because it has a "copy
>> constructor" defined for a double (so you can do something like
>> "dvariable dv(0.124);" in your code. The compiler knows how to convert
>> a double to a dvariable when you pass a double as the 1st input to
>> Richards(const dvariable&,...) [note that your code calling this
>> function w/ a double wouldn't compile if you didn't have the "const"
>> there because c++ only constructs temporary variables (the resulting
>> dvariable) when they are declared consts (and thus don't modify them
>> in the function body)]. Passing a double as 1st input to
>> Richards(const prevariable&,...) wouldn't work because prevariable
>> doesn't have a copy constructor defined for a double, so the compiler
>> doesn't know how to convert a double to a temporary prevariable&.
>> Passing a dvariable to the latter function is no problem because a
>> dvariable is already a prevariable because it's a derived class of
>> prevariable.
>>
>> Where you'll get in trouble with Richards(const dvariable&,...) is
>> when you try Richards(dvarvector[1],...) where dvarvector is a
>> dvar_vector, because the operation dvarvector[1] returns a
>> prevariable, not a dvariable!  You're also out of luck with
>> dvar3_array(i,j) [returns a prevariable] and I suspect most/all of the
>> dvar array operations that return a single element.
>>
>> Buck
>>
>>
>> ***************************************************
>> * Dr. William T. Stockhausen                      *
>> ***************************************************
>> * Resource Ecology and Fisheries Management       *
>> * Alaska Fisheries Science Center                 *
>> * National Marine Fisheries Service               *
>> * National Oceanic and Atmospheric Administration *
>> * 7600 Sand Point Way N.E.                        *
>> * Seattle, Washington 98115-6349                  *
>> ***************************************************
>> * email: William.Stockhausen at noaa.gov
>> <mailto:William.Stockhausen at noaa.gov>          *
>> * voice: 206-526-4241 fax: 206-526-6723           *
>> * web  : http://www.afsc.noaa.gov                *
>> ***************************************************
>> All models are wrong, some are useful.--G.E.P. Box
>> Beware of geeks bearing equations.    --W. Buffett
>> ***************************************************
>> Disclaimer: The opinions expressed above are personal and do not
>> necessarily reflect official NOAA policy.
>>
>> On Wed, Aug 13, 2014 at 9:45 AM, Mark Maunder <mmaunder at iattc.org
>> <mailto:mmaunder at iattc.org>> wrote:
>>
>> Thanks Buck.
>>
>> However dvariable works for a double but a prevariable does not (nor
>> does a named_dvariable, whatever that is). The error I get using
>> prevariables is
>>
>> no matching function for call to 'Richards(double&, named_dvariable&,
>> named_dvariable&, param_init_number&, named_dvariable&)
>>
>> *From:*William Stockhausen - NOAA Federal
>> [mailto:william.stockhausen at noaa.gov
>> <mailto:william.stockhausen at noaa.gov>]
>> *Sent:* Tuesday, August 12, 2014 1:59 PM
>> *To:* Mark Maunder
>> *Cc:* Steve Martell; developers at admb-project.org
>> <mailto:developers at admb-project.org>
>>
>>
>> *Subject:* Re: [Developers] libraries of functions
>>
>> If you redefine all the dvariables in the function signature as
>> prevariables, you may be ok (as long as you don't try passing in a
>> double, which the last error in your error output seems to be
>> indicating). This is because (if I followed things correctly in the
>> online documentation):
>>
>>     param_init_number inherits from named_dvariable, which inherits
>> from dvariable, which inherits from prevariable.
>>
>> which you can partly see from the "Class Hierarchy" entry regarding
>> prevariable on the online documentation (although param_init_number is
>> missing). It would be a nice feature in the documentation if you could
>> see the class hierarchy tree starting from the most-derived
>> (param_init_number, in this case) to the base class(es).
>>
>> Buck
>>
>>
>> ***************************************************
>> * Dr. William T. Stockhausen         *
>> ***************************************************
>> * Resource Ecology and Fisheries Management       *
>> * Alaska Fisheries Science Center        *
>> * National Marine Fisheries Service        *
>> * National Oceanic and Atmospheric Administration *
>> * 7600 Sand Point Way N.E.         *
>> * Seattle, Washington 98115-6349         *
>> ***************************************************
>> * email: William.Stockhausen at noaa.gov
>> <mailto:William.Stockhausen at noaa.gov>            *
>> * voice: 206-526-4241 <tel:206-526-4241> fax: 206-526-6723
>> <tel:206-526-6723>           *
>> * web  : http://www.afsc.noaa.gov                *
>> ***************************************************
>> All models are wrong, some are useful.--G.E.P. Box
>> Beware of geeks bearing equations.    --W. Buffett
>> ***************************************************
>> Disclaimer: The opinions expressed above are personal and do not
>> necessarily reflect official NOAA policy.
>>
>> On Tue, Aug 12, 2014 at 12:51 PM, Mark Maunder <mmaunder at iattc.org
>> <mailto:mmaunder at iattc.org>> wrote:
>>
>> Any comments on the use of templates messing up the various forms of
>> dvariable and the automatic translation between the different forms of
>> dvariable (sorry for not using the right terminology). I think the
>> beneficial use of templates for functions in ADMB might be a redherring.
>>
>> Mark
>>
>> *From:*developers-bounces at admb-project.org
>> <mailto:developers-bounces at admb-project.org>
>> [mailto:developers-bounces at admb-project.org
>> <mailto:developers-bounces at admb-project.org>] *On Behalf Of *Steve
>> Martell
>> *Sent:* Tuesday, August 12, 2014 12:46 PM
>> *To:* William Stockhausen - NOAA Federal
>> *Cc:* developers at admb-project.org <mailto:developers at admb-project.org>
>>
>>
>> *Subject:* Re: [Developers] libraries of functions
>>
>> My bad
>>
>> Should have been
>>
>> FUNCTION dvariable Richards(...)
>>
>> S
>>
>> On Aug 12, 2014, at 12:40 PM, William Stockhausen - NOAA Federal
>> <william.stockhausen at noaa.gov <mailto:william.stockhausen at noaa.gov>>
>> wrote:
>>
>> I don't think your suggestion will work, Steve (he said without having
>> tried it). If I understand things correctly (going out on a looong
>> limb here), "FUNCTION" is an identifier to the tpl2cpp translator that
>> what follows is a function that 1) whose signature should be added to
>> the model_parameters class declaration in tpl_name.htp and 2) whose
>> implementation should be added to tpl_name.cpp.
>>
>> A nice (but probably tough to implement) feature in tpl2cpp would be
>> the ability to put the following:
>>
>> FUNCTION dvariable model_parameters::Richards(const dvariable &age,
>> const dvariable &Linf, const dvariable &K, const dvariable &t0, const
>> dvariable &p)
>>
>>    dvariable Length=Linf*pow((1+(1/p)*exp(-K*(age-t0))),-p);
>>
>>    return(Length);
>>
>> into a file (functions.cxx, say) and be able to "include" that text in
>> the tpl you're converting to cpp at a stage in the process before
>> FUNCTIONs get converted to cpp equivalents. If such a feature is
>> currently available, I haven't found it.
>>
>> Buck
>>
>> On Mon, Aug 11, 2014 at 3:59 PM, Steve Martell
>> <martell.steve at gmail.com <mailto:martell.steve at gmail.com>> wrote:
>>
>>      Try:
>>
>>          FUNCTION dvariable model_parameters::Richards(const dvariable
>>          &age, const dvariable &Linf, const dvariable &K, const
>>          dvariable &t0, const dvariable &p)
>>
>>          {
>>
>>          {
>>
>>          dvariable Length=Linf*pow((1+(1/p)*exp(-K*(age-t0))),-p);
>>
>>          return(Length);
>>
>>          }
>>
>>          }
>>
>>      On Aug 11, 2014, at 3:49 PM, Mark Maunder <mmaunder at iattc.org
>>      <mailto:mmaunder at iattc.org>> wrote:
>>
>>      Why do I get an error if I put the following function in the file
>>      CAPAM_Growth.hpp and include it using #include<CAPAM_Growth.hpp>
>>      but if I put it in the tpl using the FUNCTION section I do not?
>>      The translator appears to just put it in the cpp with no changes
>>
>>      dvariable model_parameters::Richards(const dvariable &age, const
>>      dvariable &Linf, const dvariable &K, const dvariable &t0, const
>>      dvariable &p)
>>
>>      {
>>
>>      {
>>
>>      dvariable Length=Linf*pow((1+(1/p)*exp(-K*(age-t0))),-p);
>>
>>      return(Length);
>>
>>      }
>>
>>      }
>>
>>      The errors I get are
>>
>>      In file included from igm.cpp:3:0:
>>
>>      ./CAPAM_Growth.hpp:130:142: error: invalid use of incomplete type
>>      'struct model_parameters'
>>
>>      c:/ADMB/admb101-gcc452-win32\include/admodel.h:107:9: error:
>>      forward declaration of 'struct model_parameters'
>>
>>      igm.cpp: In member function 'virtual void
>>      model_parameters::userfunction()':
>>
>>      igm.cpp:127:46: error: no matching function for call to
>>      'Richards(prevariable, named_dvariable&, named_dvariable&,
>>      param_init_number&, named_dvariable&)'
>>
>>      igm.cpp:128:58: error: no matching function for call to
>>      'Richards(prevariable&, named_dvariable&, named_dvariable&,
>>      param_init_number&, named_dvariable&)'
>>
>>      igm.cpp:139:49: error: no matching function for call to
>>      'Richards(double&, named_dvariable&, named_dvariable&,
>>      param_init_number&, named_dvariable&)'
>>
>>      The selectivity special issue of the journal Fisheries Research is
>>      now published
>>
>>      http://www.sciencedirect.com/science/journal/01657836/158/supp/C
>>
>>      The Stock Synthesis special issue of the journal Fisheries
>> Research
>>
>>      http://www.sciencedirect.com/science/journal/01657836/142
>>
>>      Mark Maunder
>>
>>      Head of the Stock Assessment Program
>>
>>      Inter-American Tropical Tuna Commission
>>
>>      8901 La Jolla Shores Dr.
>>
>>      La Jolla, CA 92037-1508, USA
>>
>>      Tel: (858) 546-7027 <tel:%28858%29%20546-7027>
>>
>>      Fax: (858) 546-7133 <tel:%28858%29%20546-7133>
>>
>>      mmaunder at iattc.org <mailto:mmaunder at iattc.org>
>>
>>      
>> http://www.fisheriesstockassessment.com/TikiWiki/tiki-index.php?page=M
>> ark+Maunder
>>
>>      Visit the Center for the Advancement of Population Assessment
>>      Methodology at
>>
>>      http://www.capamresearch.org/
>>
>>      Visit the AD Model Builder project at
>>
>>      http://admb-project.org/
>>
>>      See the following website for information on fisheries stock
>>      assessment http://www.fisheriesstockassessment.com/
>>
>>      --
>>      You received this message because you are subscribed to the Google
>>      Groups "admb-users" group.
>>      To unsubscribe from this group and stop receiving emails from it,
>>      send an email to admb-users+unsubscribe at googlegroups.com
>>      <mailto:admb-users+unsubscribe at googlegroups.com>.
>>      To post to this group, send email to admb-users at googlegroups.com
>>      <mailto:admb-users at googlegroups.com>.
>>      Visit this group at http://groups.google.com/group/admb-users.
>>      For more options, visit https://groups.google.com/d/optout.
>>
>>
>>      _______________________________________________
>>      Developers mailing list
>>      Developers at admb-project.org <mailto:Developers at admb-project.org>
>>      http://lists.admb-project.org/mailman/listinfo/developers
>>
>> _______________________________________________
>> Developers mailing list
>> Developers at admb-project.org <mailto:Developers at admb-project.org>
>> http://lists.admb-project.org/mailman/listinfo/developers
>>
>> ----------------------------------------------------------------------
>> --
>>
>>
>> This internet e-mail message, and any files transmitted with it,
>> contains confidential, privileged information that is intended only
>> for the addressee. If you have received this e-mail message in error,
>> please call us at (206) 634-1838 <tel:%28206%29%20634-1838> collect if
>> necessary) and ask to speak to the message sender. Nothing in this
>> e-mail or the act of transmitting it, is to be construed as a waiver
>> of any rights or privileges enjoyed by the sender or the International
>> Pacific Halibut Commission pursuant to the International Organizations
>> Immunities Act, 22 U.S.C. Sec. 288 et seq.
>>
>>
>>
>> _______________________________________________
>> Developers mailing list
>> Developers at admb-project.org
>> http://lists.admb-project.org/mailman/listinfo/developers
>



More information about the Developers mailing list