File: optimbase_function.sci

package info (click to toggle)
scilab 5.2.2-9
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 334,832 kB
  • ctags: 52,586
  • sloc: xml: 526,945; ansic: 223,590; fortran: 163,080; java: 56,934; cpp: 33,840; tcl: 27,936; sh: 20,397; makefile: 9,908; ml: 9,451; perl: 1,323; cs: 614; lisp: 30
file content (160 lines) | stat: -rw-r--r-- 6,952 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) 2009 - INRIA - Michael Baudin
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt

//
// optimbase_function --
//   Call the cost function and return the value.
//   If a cost function argument is defined in current object, 
//   pass it to the function.
//   If an index is defined as input argument, pass it to the 
//   function, always as second argument.
// Arguments
//   x : the point where the function is to be evaluated.
//   index, input : a flag to pass to the cost function
//      if index=1, output a message, and compute whatever is required
//      if index=2, compute f
//      if index=3, compute g
//      if index=4, compute f and g
//      if index=5, returns c
//      if index=6, returns f and c
//      if index=7, returns f, g, c and gc
//    where
//      f : the cost function
//      g : the gradient of the cost function
//      c : the nonlinear, positive constraints
//      gc : the gradient of the nonlinear, positive constraints
//    Other values of index might be used in the future,
//    for example, when an derivative-based optimizer with 
//    non linear constraints is required.
//   index, output : 
//     if index > 0, everything went find
//     if index == 0, interrupts the optimization
//     if index < 0, f cannot be evaluated
// Calling sequences :
//   [ this , f , index ] = optimbase_function ( this , x , index )
//   [ this , f , g , index ] = optimbase_function ( this , x , index )
//   [ this , f , c , index ] = optimbase_function ( this , x , index )
//   [ this , f , g , c , gc , index ] = optimbase_function ( this , x , index )
// Not Authorized Calling sequences of the optimbase_function:
//   Rejected because there is no index in input :
//   [ this , f , index ] = optimbase_function ( this , x )
//   [ this , f ] = optimbase_function ( this , x )
//   Rejected because there is no index in output :
//   [ this , f ] = optimbase_function ( this , x , index )
//   [ this , f , g ] = optimbase_function ( this , x , index )
//   [ this , f , c ] = optimbase_function ( this , x , index )
//   [ this , f , g , c , gc ] = optimbase_function ( this , x , index )
//
// Calling sequences of the cost function:
//   > Without additionnal data
//   [ f , index ] = costf ( x , index )
//   [ f , g , index ] = costf ( x , index )
//   [ f , c , index ] = costf ( x , index )
//   [ f , g , c , gc , index ] = costf ( x , index )
//   > With additionnal data
//   [ f , index , data ] = costf ( x , index , data )
//   [ f , g , index , data ] = costf ( x , index , data )
//   [ f , c , index , data ] = costf ( x , index , data )
//   [ f , g , c , gc , index , data ] = costf ( x , index , data )
// Not Authorized Calling sequences of the cost function:
//   Rejected because there is no index in input :
//   [ f ] = costf ( this , x )
//   [ f , index ] = costf ( this , x )
//   [ f , data ] = costf ( this , x , data )
//   [ f , index , data ] = costf ( this , x , data )
//   Rejected because there is no index in output :
//   [ f ] = costf ( this , x , index )
//   [ f , g ] = costf ( this , x , index )
//   [ f , c ] = costf ( this , x , index )
//   [ f , g , c ] = costf ( this , x , index )
//   [ f , data ] = costf ( this , x , index , data )
//   [ f , g , data ] = costf ( this , x , index , data )
//   [ f , g , c , data ] = costf ( this , x , index , data )
//   [ f , c , data ] = costf ( this , x , index , data )
//
function varargout = optimbase_function ( this , x , index )
  [lhs,rhs]=argn();
  if ( rhs <> 3 ) then
    errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while 2 are expected."), "optimbase_function", rhs);
    error(errmsg)
  end
  if ( ( lhs < 3 ) | ( lhs > 5 ) ) then
    errmsg = msprintf(gettext("%s: Unexpected number of output arguments : %d provided while 3 to 5 are expected."), "optimbase_function", lhs);
    error(errmsg)
  end
  if this.fun == "" then
    errmsg = msprintf(gettext("%s: Empty function (use -function option)."), "optimbase_function")
    error(errmsg)
  end
  this.funevals = this.funevals + 1;
  if this.verbose == 1 then
    msg = sprintf ( "Function Evaluation #%d at [%s]" , ...
      this.funevals , strcat(string(x)," ") )
    this = optimbase_log ( this , msg )
  end
    if ( this.withderivatives ) then 
      if ( this.nbineqconst == 0 ) then
        // [ f , g , index ] = costf ( x , index )
        // [ f , g , index , data ] = costf ( x , index , data )
        // [ this , f , g , index ] = optimbase_function ( this , x , index )
        if ( typeof(this.costfargument) == "string" ) then
          [ f , g , index ] = this.fun ( x , index );
        else
          [ f , g , index , this.costfargument ] = this.fun ( x , index , this.costfargument );
        end
        varargout(1) = this
        varargout(2) = f
        varargout(3) = g
        varargout(4) = index
      else
        // [ f , g , c , gc , index ] = costf ( x , index )
        // [ f , g , c , gc , index , data ] = costf ( x , index , data )
        // [ this , f , g , c , gc , index ] = optimbase_function ( this , x , index )
        if ( typeof(this.costfargument) == "string" ) then
          [ f , g , c , gc , index ] = this.fun ( x , index );
        else
          [ f , g , c , gc , index , this.costfargument ] = this.fun ( x , index , this.costfargument );
        end
        varargout(1) = this
        varargout(2) = f
        varargout(3) = g
        varargout(4) = c
        varargout(5) = gc
        varargout(6) = index
      end
    else
      if ( this.nbineqconst == 0 ) then
        // [ f , index ] = costf ( x , index )
        // [ f , index , data ] = costf ( x , index , data )
        // [ this , f , index ] = optimbase_function ( this , x , index )
        if ( typeof(this.costfargument) == "string" ) then
          [ f , index ] = this.fun ( x , index );
        else
          [ f , index , this.costfargument ] = this.fun ( x , index , this.costfargument );
        end
        varargout(1) = this
        varargout(2) = f
        varargout(3) = index
      else
        // [ f , c , index ] = costf ( x , index )
        // [ f , c , index , data ] = costf ( x , index , data )
        // [ this , f , c , index ] = optimbase_function ( this , x , index )
        if ( typeof(this.costfargument) == "string" ) then
          [ f , c , index ] = this.fun ( x , index );
        else
          [ f , c , index , this.costfargument ] = this.fun ( x , index , this.costfargument );
        end
        varargout(1) = this
        varargout(2) = f
        varargout(3) = c
        varargout(4) = index
      end
    end
endfunction