packages feed

HsASA 0.1 → 0.2

raw patch · 25 files changed

+8/−12605 lines, 25 filesdep +randomdep −haskell98dep ~basenew-uploaderPVP ok

version bump matches the API change (PVP)

Dependencies added: random

Dependencies removed: haskell98

Dependency ranges changed: base

API changes (from Hackage documentation)

- Optimize.Parameter: limitNegative :: Num a => Limit a
- Optimize.Parameter: limitPositive :: Num a => Limit a
- Optimize.Parameter: limitUnit :: Num a => Limit a
+ Optimize.Parameter: limitPositive, limitUnit, limitNegative :: Num a => Limit a

Files

HsASA.cabal view
@@ -1,5 +1,5 @@ name:               HsASA-version:            0.1+version:            0.2 homepage:           http://repetae.net/recent/out/HsASA.html synopsis:           A haskell interface to Lester Ingber's adaptive simulating annealing code description:        A haskell interface to Lester Ingber's adaptive simulating annealing code@@ -7,12 +7,13 @@ license:            BSD3 license-file:       LICENSE.asa author:             John Meacham+maintainer:         Don Stewart extra-source-files: Main.hs Makefile README cabal-version:      >= 1.2 build-type:         Simple  library-    build-depends:    base, array, haskell98+    build-depends:    base<=6, array, random     exposed-modules:                       Optimize.ASA                       Optimize.Parameter@@ -21,7 +22,7 @@     cc-options:       -O2 -msse     extensions:       ForeignFunctionInterface,                       UndecidableInstances,-                      PatternSignatures,+                      ScopedTypeVariables,                       Rank2Types      c-sources:        cbits/asa.c cbits/hs_asa.c
Optimize/ASA.hsc view
@@ -1,4 +1,4 @@-{-# OPTIONS -ffi -fglasgow-exts #-}+{-# LANGUAGE ForeignFunctionInterface #-} -- | interface to the Adaptive Simulated Annealing algorithm.  module Optimize.ASA where @@ -11,7 +11,7 @@ import Foreign.Ptr import Foreign.Marshal.Array import Foreign.Marshal.Alloc-import Random+import System.Random import Data.Array.Unboxed import Data.Int 
Optimize/Parameter.hs view
@@ -1,4 +1,4 @@-{-# OPTIONS -fglasgow-exts #-}+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} -- | Defines the mapping between haskell types and a set of optimization -- parameters used to represent said type. @@ -7,7 +7,7 @@ import Foreign.Storable import Foreign.Ptr import Foreign.C.Types-import Char+import Data.Char   smallDouble :: Double
− _darcs/format
@@ -1,1 +0,0 @@-darcs-1.0
− _darcs/inventory
@@ -1,8 +0,0 @@-[initial import-John Meacham <john@repetae.net>**20050119222636] -[Get ready for publication-John Meacham <john@repetae.net>**20050119223112] -[Fix for haddock-John Meacham <john@repetae.net>**20050119225844] -[Don't pass CFLAGS as a lump-Aaron Denney <wnoise@ofb.net>**20050518054418] 
− _darcs/patches/20050119222636-1a7c6-21b43a4c7b95ff8cf14b9172c183ce40fad6063a.gz

binary file changed (62384 → absent bytes)

− _darcs/patches/20050119223112-1a7c6-9e5331c024ae010cc8dbc5ac7b9c5f0535e42bd8.gz

binary file changed (220 → absent bytes)

− _darcs/patches/20050119225844-1a7c6-780693a86626c686cb86fec84175b7a2e901a1a0.gz

binary file changed (293 → absent bytes)

− _darcs/patches/20050518054418-859d9-e48366547a7cac704fd95ac4b7bd3333d6a28035.gz

binary file changed (203 → absent bytes)

− _darcs/prefs/binaries
@@ -1,59 +0,0 @@-# Binary file regexps:-\.png$-\.PNG$-\.gz$-\.GZ$-\.pdf$-\.PDF$-\.jpg$-\.JPG$-\.jpeg$-\.JPEG$-\.gif$-\.GIF$-\.tif$-\.TIF$-\.tiff$-\.TIFF$-\.pnm$-\.PNM$-\.pbm$-\.PBM$-\.pgm$-\.PGM$-\.ppm$-\.PPM$-\.bmp$-\.BMP$-\.mng$-\.MNG$-\.tar$-\.TAR$-\.bz2$-\.BZ2$-\.z$-\.Z$-\.zip$-\.ZIP$-\.jar$-\.JAR$-\.so$-\.SO$-\.a$-\.A$-\.tgz$-\.TGZ$-\.mpg$-\.MPG$-\.mpeg$-\.MPEG$-\.iso$-\.ISO$-\.exe$-\.EXE$-\.doc$-\.DOC$-\.elc$-\.ELC$-\.pyc$-\.PYC$
− _darcs/prefs/boring
@@ -1,68 +0,0 @@-# Boring file regexps:-\.hi$-\.hi-boot$-\.o-boot$-\.o$-\.o\.cmd$-\.p_hi$-\.p_o$-\.installed-pkg-config-\.setup-config-\.setup-config^dist(/|$)-# *.ko files aren't boring by default because they might-# be Korean translations rather than kernel modules.-# \.ko$-\.ko\.cmd$-\.mod\.c$-(^|/)\.tmp_versions($|/)-(^|/)CVS($|/)-\.cvsignore$-^\.#-(^|/)RCS($|/)-,v$-(^|/)\.svn($|/)-(^|/)\.hg($|/)-(^|/)\.git($|/)-\.bzr$-(^|/)SCCS($|/)-~$-(^|/)_darcs($|/)-(^|/)\.darcsrepo($|/)-\.bak$-\.BAK$-\.orig$-\.rej$-(^|/)vssver\.scc$-\.swp$-(^|/)MT($|/)-(^|/)\{arch\}($|/)-(^|/).arch-ids($|/)-(^|/),-\.prof$-(^|/)\.DS_Store$-(^|/)BitKeeper($|/)-(^|/)ChangeSet($|/)-\.py[co]$-\.elc$-\.class$-\.zwc$-\.revdep-rebuild.*-\..serverauth.*-\#-(^|/)Thumbs\.db$-(^|/)autom4te\.cache($|/)-(^|/)config\.(log|status)$-^\.depend$-(^|/)(tags|TAGS)$-#(^|/)\.[^/]-(^|/|\.)core$-\.(obj|a|exe|so|lo|la)$-^\.darcs-temp-mail$--darcs-backup[[:digit:]]+$-\.(fas|fasl|sparcf|x86f)$-\.part$-(^|/)\.waf-[[:digit:].]+-[[:digit:]]+($|/)-(^|/)\.lock-wscript$-^\.darcs-temp-mail$-\_vti_cnf$-\_vti_pvt$
− _darcs/prefs/defaultrepo
@@ -1,1 +0,0 @@-http://repetae.net/john/repos/HsASA
− _darcs/prefs/motd
− _darcs/prefs/repos
@@ -1,1 +0,0 @@-http://repetae.net/john/repos/HsASA
− _darcs/pristine/LICENSE.asa
@@ -1,58 +0,0 @@-/***********************************************************************-* Adaptive Simulated Annealing (ASA)-* Lester Ingber <ingber@ingber.com>-* Copyright (c) 1993-2004 Lester Ingber.  All Rights Reserved.-* This LICENSE file must be included with ASA code.-***********************************************************************/-	-$Id: LICENSE,v 25.15 2004/09/23 18:10:35 ingber Exp ingber $--Redistribution and use in source and binary forms, with or without-modification, are permitted provided that the following conditions are-met:--			CONDITIONS--1. Redistributions of ASA source code must retain the above copyright-notice, this list of conditions, and the following disclaimer.--2. Redistributions in binary form must contain the above copyright-notice, this list of conditions and the following disclaimer in the-documentation and/or other materials provided with the distribution.--3. All modifications to the source code must be clearly marked as-such.  Binary redistributions based on modified source code must be-clearly marked as modified versions in the documentation and/or other-materials provided with the distribution.--4. Notice must be given of the location of the availability of the-unmodified current source code, e.g.,-	http://www.ingber.com/-or-	ftp://ftp.ingber.com-in the documentation and/or other materials provided with the-distribution.--5. All advertising and published materials mentioning features or use-of this software must display the following acknowledgment:  "This-product includes software developed by Lester Ingber and other-contributors."--6. The name of Lester Ingber may not be used to endorse or promote-products derived from this software without specific prior written-permission.--			DISCLAIMER--This software is provided by Lester Ingber and contributors "as is" and-any expressed or implied warranties, including, but not limited to, the-implied warranties of merchantability and fitness for a particular-purpose are disclaimed.  In no event shall Lester Ingber or-contributors be liable for any direct, indirect, incidental, special,-exemplary, or consequential damages (including, but not limited to,-procurement of substitute goods or services; loss of use, data, or-profits; or business interruption) however caused and on any theory of-liability, whether in contract, strict liability, or tort (including-negligence or otherwise) arising in any way out of the use of this-software, even if advised of the possibility of such damage.-
− _darcs/pristine/Main.hs
@@ -1,23 +0,0 @@---import Optimize.ASA-import Optimize.Parameter-import Random---f :: (Bool,(Double,Double)) -> Double-f (tf,(x,y)) = if  tf then x*x + y*y else x + x*x - log y --g :: Either (Int,Int) Int -> Double-g (Left (x,y)) = realToFrac $ x * y-g (Right r) = pi*(realToFrac r)^2--main =  do-    v1 <- minimize (empty,(limit (-10) 3, limit 4 7)) f  -    v2 <- minimize (empty,(limit (-10) 3, limit 4 7)) (negate . f)  -    v3 <- minimize ((limit 10 100,limit 3 1000), limit 4 1000) g  -    v4 <- minimize ((limit 10 100,limit 3 1000), limit 4 1000) (negate . g)  -    print v1-    print v2-    print v3-    print v4
− _darcs/pristine/Makefile
@@ -1,27 +0,0 @@-HSC2HS = hsc2hs-CC = ghc-LDLIBS = -lm -CFLAGS = -O2 -optc-msse -optc-g-HSC_CFLAGS = -C -O2 -C -optc-msse -C -optc-g--main: Main.hs asa.o hs_asa.o  Optimize/*.hs Optimize/ASA.hs-	ghc -O --make Main.hs asa.o hs_asa.o  -o $@--www-publish: Optimize/ASA.hs--asa.o: asa.h asa_usr.h asa_usr_asa.h-hs_asa.o: asa_usr.h asa_usr_asa.h--clean:-	rm *.o main Optimize/*.o Optimize/*.hi *.hi--asa_fuzzy: asa_fuzzy.o asa.o --%.hi: %.o -	@:-%_hsc.c: %.hs-	@:-%_hsc.h: %.hs-	@:-%.hs: %.hsc-	$(HSC2HS) $(HSC_CFLAGS) -C -I. -C -I@srcdir@ -o $@ $<
− _darcs/pristine/Optimize/ASA.hsc
@@ -1,80 +0,0 @@-{-# OPTIONS -ffi -fglasgow-exts #-}--- | interface to the Adaptive Simulated Annealing algorithm.--module Optimize.ASA where --#include "asa_usr.h"--import Optimize.Parameter-import Foreign.C.Types-import Foreign.Storable-import Foreign.Ptr-import Foreign.Marshal.Array-import Foreign.Marshal.Alloc-import Random-import Data.Array.Unboxed-import Int---newtype UserOptions = UserOptions (Ptr UserOptions)-type Doubles = UArray Int Double    --data ExitCode =  NormalExit | PTempTooSmall | CTempTooSmall | CostRepeating | TooManyInvalidStates | ImmediateExit | InvalidUserInput | InvalidCostFunction | InvalidCostFunctionDeriv -    deriving(Eq,Ord,Enum,Show,Read)---data Results x = Results {-    optimalValue :: Double,-    optimalParam :: x,-    exitCode :: ExitCode-    }---type CostFunction =  Ptr Double -> Ptr Int -> IO Double--foreign import ccall "wrapper" mkCostFunction :: CostFunction -> IO (FunPtr CostFunction)  -foreign import ccall "asa_usr.h asa_main" asa_main :: FunPtr CostFunction -> CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> CInt -> IO CInt-----asa :: UserOptions     -- Options-    -> (Doubles -> IO (Maybe Double)) -- cost function -    -> Int64           -- random number seed-    -> Maybe Doubles   -- starting position-    -> Doubles         -- upper bounds-    -> Doubles         -- lower bounds-    -> UArray Int Bool -- parameters are integral-    -> IO (ExitCode,Doubles)      -- final answers-asa = undefined--toBasicCostFunction :: Parameter z x => z -> (x -> Double) -> CostFunction-toBasicCostFunction z fn = f where-    thePeek = peekParam z -    f pd pf = do-        poke pf 1-        x <- thePeek pd-        let v = fn x-        --putStrLn $ ">> Haskell Function Called: " ++ show v -        return $  v-        --minimize :: Parameter z x => z -> (x -> Double) -> IO x -minimize z (fn :: x -> Double ) = do-    cf <- mkCostFunction (toBasicCostFunction z fn)-    let n = numParams (undefined :: x) z -    let ps = paramInfo (undefined :: x) z []-    withArray (map limitLow ps) $ \lower_bounds -> do  -    withArray (map limitHigh ps) $ \upper_bounds -> do  -    withArray (map (\x -> if isIntegral x then (#const INTEGER_TYPE) else (#const REAL_TYPE)) ps) $ \real_int -> do  -    alloca $ \dummy_cost_val -> do -    allocaArray n $ \ret -> do-    alloca $ \exit_code -> do -    r <- randomIO-    asa_main cf (fromIntegral n) upper_bounds lower_bounds real_int dummy_cost_val ret exit_code (fromIntegral (r :: Int))-    --code <- peek exit_code-    --print (toEnum (fromIntegral code) :: ExitCode)-    peekParam z ret ---    
− _darcs/pristine/Optimize/Parameter.hs
@@ -1,202 +0,0 @@-{-# OPTIONS -fglasgow-exts #-}--- | Defines the mapping between haskell types and a set of optimization--- parameters used to represent said type.--module Optimize.Parameter where --import Foreign.Storable-import Foreign.Ptr-import Foreign.C.Types-import Char---smallDouble :: Double-smallDouble = 1.0e-12-bigDouble = 1.0e6--data ParamInfo = ParamInfo {-    limitLow :: {-# UNBOX #-} !Double,-    limitHigh :: {-# UNBOX #-} !Double,-    isIntegral :: {-# UNBOX #-} !Bool-}--paramInfoFloat = ParamInfo {-    limitLow = -bigDouble,-    limitHigh = bigDouble,-    isIntegral = False-}--paramInfoInt = paramInfoFloat { limitLow = realToFrac (minBound :: Int), limitHigh = realToFrac (maxBound :: Int), isIntegral = True }--data Limit a = Limit { minLimit :: Maybe a, maxLimit :: Maybe a }--limit x y = Limit { minLimit = Just x, maxLimit = Just y }-limitMin x = Limit { minLimit = Just x, maxLimit = Nothing }-limitMax x = Limit { minLimit = Nothing, maxLimit = Just x }-limitPositive,limitNegative,limitUnit :: Num a => Limit a-limitPositive = limitMin 0-limitNegative = limitMax 0-limitUnit = limit 0 1------ z is the meta-info for the given type. such as bounds.---- This really should be a superclass of Monoid-class Empty a where-    empty :: a--instance Empty () where-    empty = ()-instance (Empty x, Empty y) => Empty (x,y) where-    empty = (empty,empty)-instance (Empty x, Empty y, Empty z) => Empty (x,y,z) where-    empty = (empty,empty,empty)-instance Empty (Maybe a) where-    empty = Nothing-instance Empty (Limit a) where-    empty = Limit { minLimit = Nothing, maxLimit = Nothing }--class Empty z => Parameter z x | x -> z where-    pokeParam :: z -> x -> Ptr Double -> IO ()-    peekParam :: z -> Ptr Double -> IO x    -- needs to be as fast as possible-    -- x is only needed on these for its type. (can we do this in a better way?)-    paramInfo :: x -> z -> [ParamInfo] -> [ParamInfo]-    numParams :: x -> z ->  Int--instance Parameter () () where-    pokeParam _ _ _ = return ()-    peekParam _ _ = return ()-    numParams _ _ = 0-    paramInfo _ _ x = x---instance Parameter () Bool where-    pokeParam _ False p = poke p 0-    pokeParam _ True p = poke p 1-    peekParam _ p = do-        x <- peek p-        return (not $ abs x < smallDouble)-    paramInfo _ _ xs = ParamInfo { limitLow = 0, limitHigh = 1, isIntegral = True }:xs-    numParams _ _ = 1--instance (Parameter za a, Parameter zb b) => Parameter (za,zb) (a,b) where-    pokeParam (za,zb) ((a::a),b) p = do-        pokeParam za a p -        pokeParam zb b (p `advancePtr` numParams (undefined::a) za) -    peekParam (za,zb) p = do-        (a::a) <- peekParam za p -        b <- peekParam zb (p `advancePtr` numParams (undefined::a) za)-        return (a,b)-    paramInfo (_ :: (a,b)) (za,zb) = paramInfo a za . paramInfo b zb where-        a = undefined :: a-        b = undefined :: b--    numParams (_ :: (a,b)) (za,zb) = numParams a za + numParams b zb  where-        a = undefined :: a-        b = undefined :: b--instance (Parameter za a, Parameter zb b, Parameter zc c) => Parameter (za,zb,zc) (a,b,c) where-    pokeParam (za,zb,zc) (a,b,c) p = do-        pokeParam (za,(zb,zc)) (a,(b,c)) p-    peekParam (za,zb,zc) p = do-        (a,(b,c)) <- peekParam (za,(zb,zc)) p -        return (a,b,c)-    paramInfo (_ :: (a,b,c)) (za,zb,zc) = paramInfo a za . paramInfo b zb . paramInfo c zc where-        a = undefined :: a-        b = undefined :: b-        c = undefined :: c--    numParams (_ :: (a,b,c)) (za,zb,zc) = numParams a za + numParams b zb + numParams c zc  where-        a = undefined :: a-        b = undefined :: b-        c = undefined :: c--instance Parameter (Limit Double) Double where-    pokeParam _ x p = poke p  x-    peekParam _ p = peek p -    paramInfo _ Limit { minLimit = Nothing, maxLimit = Nothing } xs = paramInfoFloat :xs-    paramInfo _ Limit { minLimit = Just x, maxLimit = Nothing } xs = paramInfoFloat { limitLow =  x }:xs-    paramInfo _ Limit { minLimit = Just x, maxLimit = Just y } xs = paramInfoFloat { limitLow =  x, limitHigh =  y }:xs-    paramInfo _ Limit { minLimit = Nothing, maxLimit = Just y } xs = paramInfoFloat { limitHigh =  y }:xs-    numParams _ _ = 1-    -instance Parameter (Limit Int) Int where-    pokeParam _ x p = poke p (realToFrac x)-    peekParam _ p = peek p >>= return . round-    paramInfo _ Limit { minLimit = Nothing, maxLimit = Nothing } xs = paramInfoInt :xs-    paramInfo _ Limit { minLimit = Just x, maxLimit = Nothing } xs = paramInfoInt { limitLow = realToFrac x }:xs-    paramInfo _ Limit { minLimit = Just x, maxLimit = Just y } xs = paramInfoInt { limitLow = realToFrac x, limitHigh = realToFrac y }:xs-    paramInfo _ Limit { minLimit = Nothing, maxLimit = Just y } xs = paramInfoInt { limitHigh = realToFrac y }:xs-    numParams _ _ = 1----- Of questionable utility.-instance Parameter ()  Char where -    pokeParam _ x p = poke p (realToFrac $ ord x)-    peekParam _ p = peek p >>= return . chr . round-    paramInfo _ () xs = paramInfoInt { limitLow = 0x20, limitHigh = 0x7e }:xs-    numParams _ _ = 1-    ---instance Parameter (Limit Float) Float where-    pokeParam _ x p = poke p (realToFrac x)-    peekParam _ p = peek p >>= return . realToFrac-    paramInfo _ Limit { minLimit = Nothing, maxLimit = Nothing } xs = paramInfoFloat :xs-    paramInfo _ Limit { minLimit = Just x, maxLimit = Nothing } xs = paramInfoFloat { limitLow = realToFrac x }:xs-    paramInfo _ Limit { minLimit = Just x, maxLimit = Just y } xs = paramInfoFloat { limitLow = realToFrac x, limitHigh = realToFrac y }:xs-    paramInfo _ Limit { minLimit = Nothing, maxLimit = Just y } xs = paramInfoFloat { limitHigh = realToFrac y }:xs-    numParams _ _ = 1--instance Parameter zb b => Parameter zb (Maybe b) where-    pokeParam zb (Nothing :: Maybe b) p = do-        pokeParam ((),zb) (Left () :: Either () b) p-    pokeParam zb (Just b :: Maybe b) p = do-        pokeParam ((),zb) (Right b :: Either () b) p-    peekParam zb p = do-        v <- peekParam ((),zb) p-        case v of-            Right b -> return $ Just b-            Left () -> return $ Nothing-    paramInfo (_ :: Maybe b) z = paramInfo (undefined :: Either () b) ((),z)-    numParams (_ :: Maybe b) z = numParams (undefined :: Either () b) ((),z)--    -    -    --instance (Parameter za a, Parameter zb b) => Parameter (za,zb) (Either a b) where-    pokeParam (za,zb) (Left a :: Either a b) p = do-        pokeParam empty False p-        p <- return $  (p `advancePtr` 1)-        pokeParam za a p-    pokeParam (za,zb) (Right b :: Either a b) p = do-        pokeParam empty False p-        p <- return $  (p `advancePtr` (1 + numParams (undefined :: a) za))-        pokeParam zb b p-    peekParam (za,zb) p  = do-        b <- peekParam () p-        p <- return $  (p `advancePtr` 1)-        case b of-            False -> do-                a <- peekParam za p -                return $ Left a-            True -> do-                let f :: Either a b -> a -> Either a b-                    f x _ = x-                un <- return undefined-                p <- return $ (p `advancePtr` numParams un za)-                a <- peekParam zb p -                return $ f (Right a) un-    paramInfo (_ :: Either a b) (za,zb) = paramInfo (undefined :: Bool) empty . paramInfo a za . paramInfo b zb where-        a = undefined :: a-        b = undefined :: b-    numParams (_ :: Either a b) (za,zb) = 1 + numParams a za + numParams b zb  where-        a = undefined :: a-        b = undefined :: b--advancePtr (p :: Ptr a) n = p `plusPtr` (n * sizeOf (undefined :: a)) ----instance (Parameter a, Parameter b) => Parameter (Either a b) where---      pokeParam = pokeParam (Bool,a,b)
− _darcs/pristine/README
@@ -1,2 +0,0 @@-A haskell interface to Lester Ingber's adaptive simulating annealing code. -
− _darcs/pristine/asa.c
@@ -1,6387 +0,0 @@-/***********************************************************************-* Adaptive Simulated Annealing (ASA)-* Lester Ingber <ingber@ingber.com>-* Copyright (c) 1993-2004 Lester Ingber.  All Rights Reserved.-* The LICENSE file must be included with ASA code.-***********************************************************************/--#define ASA_ID \-"/* $Id: asa.c,v 25.15 2004/09/23 18:10:46 ingber Exp ingber $ */"--#include "asa.h"-static int asa_recursive_max = 0;       /* record of max recursions */--/***********************************************************************-* asa-*       This procedure implements the full ASA function optimization.-***********************************************************************/-#if HAVE_ANSI-double-asa (double (*user_cost_function)--      -     (double *, double *, double *, double *, double *, ALLOC_INT *, int *,-      int *, int *, USER_DEFINES *),-     double (*user_random_generator) (LONG_INT *), LONG_INT * seed,-     double *parameter_initial_final, double *parameter_minimum,-     double *parameter_maximum, double *tangents, double *curvature,-     ALLOC_INT * number_parameters, int *parameter_type,-     int *valid_state_generated_flag, int *exit_status,-     USER_DEFINES * OPTIONS)-#else-double-asa (user_cost_function,-     user_random_generator,-     seed,-     parameter_initial_final,-     parameter_minimum,-     parameter_maximum,-     tangents,-     curvature,-     number_parameters,-     parameter_type, valid_state_generated_flag, exit_status, OPTIONS)-     double (*user_cost_function) ();-     double (*user_random_generator) ();-     LONG_INT *seed;-     double *parameter_initial_final;-     double *parameter_minimum;-     double *parameter_maximum;-     double *tangents;-     double *curvature;-     ALLOC_INT *number_parameters;-     int *parameter_type;-     int *valid_state_generated_flag;-     int *exit_status;-     USER_DEFINES *OPTIONS;-#endif /* HAVE_ANSI */-{-#if USER_INITIAL_COST_TEMP-#if USER_REANNEAL_COST-#else-  int index_cost_constraint;    /* index cost functions averaged */-#endif /* USER_REANNEAL_COST */-#else /* USER_INITIAL_COST_TEMP */-  int index_cost_constraint;    /* index cost functions averaged */-#endif /* USER_INITIAL_COST_TEMP */--  int index_cost_repeat,        /* test OPTIONS->Cost_Precision when =-                                   OPTIONS->Maximum_Cost_Repeat */-    tmp_var_int, tmp_var_int1, tmp_var_int2;    /* temporary integers */--  ALLOC_INT index_v,            /* iteration index */-   *start_sequence;             /* initial OPTIONS->Sequential_Parameters-                                   used if >= 0 */-  double final_cost,            /* best cost to return to user */-    tmp_var_db, tmp_var_db1, tmp_var_db2;       /* temporary doubles */-  int *curvature_flag;-  FILE *ptr_asa_out;            /* file ptr to output file */--  /* The 3 states that are kept track of during the annealing process */-  STATE *current_generated_state, *last_saved_state, *best_generated_state;--#if ASA_SAVE-  FILE *ptr_save, *ptr_comm;-  int asa_read;-  char asa_save_comm[100];-#if ASA_SAVE_OPT-  char read_option[80];-  char read_if[4], read_FALSE[6], read_comm1[3], read_ASA_SAVE[9],-    read_comm2[3];-  int read_int;-#if INT_LONG-  LONG_INT read_long;-#endif-  double read_double;-  FILE *ptr_save_opt;-#endif-#endif /* ASA_SAVE */--#if ASA_PIPE_FILE-  FILE *ptr_asa_pipe;-#endif--  int immediate_flag;           /* save Immediate_Exit */-  int asa_exit_value;--  double xnumber_parameters[1];--  /* The array of tangents (absolute value of the numerical derivatives),-     and the maximum |tangent| of the array */-  double *maximum_tangent;--  /* ratio of acceptances to generated points - determines when to-     test/reanneal */-  double *accepted_to_generated_ratio;--  /* temperature parameters */-  double temperature_scale, *temperature_scale_parameters;-  /* relative scalings of cost and parameters to temperature_scale */-  double *temperature_scale_cost;-  double *current_user_parameter_temp;-  double *initial_user_parameter_temp;-  double *current_cost_temperature;-  double *initial_cost_temperature;-  double log_new_temperature_ratio;     /* current *temp = initial *temp *-                                           exp(log_new_temperature_ratio) */-  ALLOC_INT *index_exit_v;      /* information for asa_exit */--  /* counts of generated states and acceptances */-  LONG_INT *index_parameter_generations;-  LONG_INT *number_generated, *best_number_generated_saved;-  LONG_INT *recent_number_generated, *number_accepted;-  LONG_INT *recent_number_acceptances, *index_cost_acceptances;-  LONG_INT *number_acceptances_saved, *best_number_accepted_saved;--  /* Flag indicates that the parameters generated were-     invalid according to the cost function validity criteria. */-  LONG_INT *number_invalid_generated_states;-  LONG_INT repeated_invalid_states;--#if ASA_QUEUE-  int queue_new;                /* flag to add new entry */-  int *save_queue_flag;         /* save valid_state_generated_flag */-  LONG_INT queue;               /* index of queue */-  LONG_INT queue_v;             /* index of parameters in queue */-  LONG_INT save_queue_test;     /* test if all parameters are present */-  LONG_INT save_queue;          /* last filled position in queue */-  LONG_INT save_queue_indx;     /* current position in queue */-  double *save_queue_cost, *save_queue_param;   /* saved states */-  ALLOC_INT queue_size_tmp;-#endif--#if MULTI_MIN-  int multi_index;-  int multi_test, multi_test_cmp, multi_test_dim;-  int *multi_sort;-  double *multi_cost;-  double **multi_params;-#endif /* MULTI_MIN */--#if ASA_PARALLEL-  LONG_INT *parallel_sort;-  LONG_INT index_parallel, sort_index;  /* count of parallel generated states */-  LONG_INT parallel_generated;  /* saved *recent_number_generated */-  LONG_INT parallel_block_max;  /* saved OPTIONS->Gener_Block_Max */-  STATE *gener_block_state;-#endif--  /* used to index repeated and recursive calls to asa */-  /* This assumes that multiple calls (>= 1) _or_ recursive-     calls are being made to asa */-  static int asa_open = FALSE;-  static int number_asa_open = 0;-  static int recursive_asa_open = 0;--  /* initializations */--  if ((curvature_flag = (int *) calloc (1, sizeof (int))) == NULL) {-    strcpy (exit_msg, "asa(): curvature_flag");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((maximum_tangent = (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): maximum_tangent");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((accepted_to_generated_ratio =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): accepted_to_generated_ratio");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((temperature_scale_cost =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): temperature_scale_cost");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((current_cost_temperature =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): current_cost_temperature");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((initial_cost_temperature =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): initial_cost_temperature");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((index_exit_v = (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): index_exit_v");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((start_sequence = (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): start_sequence");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((number_generated =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): number_generated");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((best_number_generated_saved =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): best_number_generated_saved");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((recent_number_generated =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): recent_number_generated");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((number_accepted =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): number_accepted");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((recent_number_acceptances =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): recent_number_acceptances");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((index_cost_acceptances =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): index_cost_acceptances");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((number_acceptances_saved =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): number_acceptances_saved");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((best_number_accepted_saved =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): best_number_accepted_saved");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((number_invalid_generated_states =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): number_invalid_generated_states");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }--  if ((current_generated_state =-       (STATE *) calloc (1, sizeof (STATE))) == NULL) {-    strcpy (exit_msg, "asa(): current_generated_state");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((last_saved_state = (STATE *) calloc (1, sizeof (STATE))) == NULL) {-    strcpy (exit_msg, "asa(): last_saved_state");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((best_generated_state = (STATE *) calloc (1, sizeof (STATE))) == NULL) {-    strcpy (exit_msg, "asa(): best_generated_state");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-#if ASA_PARALLEL-  if ((gener_block_state =-       (STATE *) calloc (OPTIONS->Gener_Block_Max, sizeof (STATE))) == NULL) {-    strcpy (exit_msg, "asa(): gener_block_state");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  gener_block_state_qsort = gener_block_state;-  if ((parallel_sort =-       (LONG_INT *) calloc (OPTIONS->Gener_Block_Max,-                            sizeof (LONG_INT))) == NULL) {-    strcpy (exit_msg, "asa(): parallel_sort");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-#endif--  /* set default */-  ptr_asa_out = (FILE *) NULL;--  OPTIONS->Immediate_Exit = FALSE;--  if (asa_open == FALSE) {-    asa_open = TRUE;-    ++number_asa_open;-#if ASA_PRINT-    if (number_asa_open == 1) {-      /* open the output file */-#if USER_ASA_OUT-      if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-#if ASA_SAVE-        ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "a");-#else-        ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "w");-#endif-      }-#else /* USER_ASA_OUT */-      if (!strcmp (ASA_OUT, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-#if ASA_SAVE-        ptr_asa_out = fopen (ASA_OUT, "a");-#else-        ptr_asa_out = fopen (ASA_OUT, "w");-#endif-      }-#endif /* USER_ASA_OUT */-    } else {-#if USER_ASA_OUT-      if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "a");-      }-#else-      if (!strcmp (ASA_OUT, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (ASA_OUT, "a");-      }-#endif-      fprintf (ptr_asa_out, "\n\n\t\t number_asa_open = %d\n",-               number_asa_open);-    }-#endif /* ASA_PRINT */-  } else {-    ++recursive_asa_open;-#if ASA_PRINT-    if (recursive_asa_open == 1) {-      /* open the output file */-#if ASA_SAVE-#if USER_ASA_OUT-      if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "a");-      }-#else-      if (!strcmp (ASA_OUT, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (ASA_OUT, "a");-      }-#endif-#else /* ASA_SAVE */-#if USER_ASA_OUT-      if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "w");-      }-#else-      if (!strcmp (ASA_OUT, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (ASA_OUT, "w");-      }-#endif-#endif /* ASA_SAVE */-    } else {-#if USER_ASA_OUT-      if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "a");-      }-#else-      if (!strcmp (ASA_OUT, "STDOUT")) {-#if INCL_STDOUT-        ptr_asa_out = stdout;-#endif /* INCL_STDOUT */-      } else {-        ptr_asa_out = fopen (ASA_OUT, "a");-      }-#endif-      fprintf (ptr_asa_out, "\n\n\t\t recursive_asa_open = %d\n",-               recursive_asa_open);-    }-#endif /* ASA_PRINT */-  }--#if ASA_PIPE_FILE-  ptr_asa_pipe = fopen ("asa_pipe", "a");-  fprintf (ptr_asa_pipe, "%s", "%generate");-  fprintf (ptr_asa_pipe, "\t%s", "accept");-  fprintf (ptr_asa_pipe, "\t%s", "best_cost");-  VFOR (index_v)-#if INT_ALLOC-    fprintf (ptr_asa_pipe, "\t%s-%d", "param", index_v);-#else-#if INT_LONG-    fprintf (ptr_asa_pipe, "\t%s-%ld", "param", index_v);-#else-    fprintf (ptr_asa_pipe, "\t%s-%d", "param", index_v);-#endif-#endif-  fprintf (ptr_asa_pipe, "\t%s", "cost_temp");-  VFOR (index_v)-#if INT_ALLOC-    fprintf (ptr_asa_pipe, "\t%s-%d", "param_temp", index_v);-#else-#if INT_LONG-    fprintf (ptr_asa_pipe, "\t%s-%ld", "param_temp", index_v);-#else-    fprintf (ptr_asa_pipe, "\t%s-%d", "param_temp", index_v);-#endif-#endif-  fprintf (ptr_asa_pipe, "\t%s", "last_cost");-  fprintf (ptr_asa_pipe, "\n");-  fflush (ptr_asa_pipe);-#endif /* ASA_PIPE_FILE */--#if ASA_PRINT-  /* print header information as defined by user */-  print_asa_options (ptr_asa_out, OPTIONS);--  fflush (ptr_asa_out);-#endif /* ASA_PRINT */--  /* set indices and counts to 0 */-  *best_number_generated_saved =-    *number_generated =-    *recent_number_generated = *recent_number_acceptances = 0;-  *index_cost_acceptances =-    *best_number_accepted_saved =-    *number_accepted = *number_acceptances_saved = 0;-  index_cost_repeat = 0;--  OPTIONS->N_Accepted = *number_accepted;-  OPTIONS->N_Generated = *number_generated;--#if ASA_SAMPLE-  OPTIONS->N_Generated = 0;-  OPTIONS->Average_Weights = 1.0;-#endif--  /* do not calculate curvatures initially */-  *curvature_flag = FALSE;--  /* allocate storage for all parameters */-  if ((current_generated_state->parameter =-       (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): current_generated_state->parameter");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((last_saved_state->parameter =-       (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): last_saved_state->parameter");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((best_generated_state->parameter =-       (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): best_generated_state->parameter");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-#if ASA_PARALLEL-  parallel_block_max = OPTIONS->Gener_Block_Max;-  parallel_generated = OPTIONS->Gener_Block;--  for (index_parallel = 0; index_parallel < parallel_block_max;-       ++index_parallel) {-    if ((gener_block_state[index_parallel].parameter =-         (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-      strcpy (exit_msg, "asa(): gener_block_state[index_parallel].parameter");-      Exit_ASA (exit_msg);-      *exit_status = CALLOC_FAILED;-      return (-1);-    }-  }-#endif--  OPTIONS->Best_Cost = &(best_generated_state->cost);-  OPTIONS->Best_Parameters = best_generated_state->parameter;-  OPTIONS->Last_Cost = &(last_saved_state->cost);-  OPTIONS->Last_Parameters = last_saved_state->parameter;--  if ((initial_user_parameter_temp =-       (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): initial_user_parameter_temp");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((index_parameter_generations =-       (ALLOC_INT *) calloc (*number_parameters,-                             sizeof (ALLOC_INT))) == NULL) {-    strcpy (exit_msg, "asa(): index_parameter_generations");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }--  /* set all temperatures */-  if ((current_user_parameter_temp =-       (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): current_user_parameter_temp");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-#if USER_INITIAL_PARAMETERS_TEMPS-  VFOR (index_v)-    current_user_parameter_temp[index_v] =-    initial_user_parameter_temp[index_v] =-    OPTIONS->User_Parameter_Temperature[index_v];-#else-  VFOR (index_v)-    current_user_parameter_temp[index_v] =-    initial_user_parameter_temp[index_v] =-    OPTIONS->Initial_Parameter_Temperature;-#endif--  if ((temperature_scale_parameters =-       (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): temperature_scale_parameters");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-#if ASA_QUEUE-  if (OPTIONS->Queue_Size > 0) {-    queue_size_tmp = OPTIONS->Queue_Size;-  } else {-    queue_size_tmp = 1;-  }-  if ((save_queue_flag =-       (int *) calloc (queue_size_tmp, sizeof (int))) == NULL) {-    strcpy (exit_msg, "asa(): save_queue_flag");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((save_queue_cost =-       (double *) calloc (queue_size_tmp, sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): save_queue_cost");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((save_queue_param =-       (double *) calloc ((*number_parameters) * queue_size_tmp,-                          sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): save_queue_param");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-#endif /* ASA_QUEUE */--#if MULTI_MIN-  if ((multi_cost =-       (double *) calloc (OPTIONS->Multi_Number + 1,-                          sizeof (double))) == NULL) {-    strcpy (exit_msg, "asa(): *multi_cost");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  multi_cost_qsort = multi_cost;-  if ((multi_sort =-       (int *) calloc (OPTIONS->Multi_Number + 1, sizeof (int))) == NULL) {-    strcpy (exit_msg, "asa(): *multi_sort");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  if ((multi_params =-       (double **) calloc (OPTIONS->Multi_Number + 1,-                           sizeof (double *))) == NULL) {-    strcpy (exit_msg, "asa(): *multi_params");-    Exit_ASA (exit_msg);-    *exit_status = CALLOC_FAILED;-    return (-1);-  }-  for (multi_index = 0; multi_index <= OPTIONS->Multi_Number; ++multi_index) {-    if ((multi_params[multi_index] =-         (double *) calloc (*number_parameters, sizeof (double))) == NULL) {-      strcpy (exit_msg, "asa(): multi_params[multi_index]");-      Exit_ASA (exit_msg);-      *exit_status = CALLOC_FAILED;-      return (-1);-    }-  }-#endif /* MULTI_MIN */--#if USER_INITIAL_COST_TEMP-#if USER_ACCEPTANCE_TEST-  OPTIONS->Cost_Temp_Curr = OPTIONS->Cost_Temp_Init =-#endif-    *initial_cost_temperature = *current_cost_temperature =-    OPTIONS->User_Cost_Temperature[0];-#endif--  /* set parameters to the initial parameter values */-  VFOR (index_v)-    last_saved_state->parameter[index_v] =-    current_generated_state->parameter[index_v] =-    parameter_initial_final[index_v];-#if USER_ACCEPTANCE_TEST-  OPTIONS->Random_Seed = seed;-  OPTIONS->Random_Seed[0] = *seed;-  OPTIONS->User_Acceptance_Flag = TRUE;-  OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif--#if ASA_PRINT-#if INT_LONG-  fprintf (ptr_asa_out, "Initial Random Seed = %ld\n\n", *seed);-#else-  fprintf (ptr_asa_out, "Initial Random Seed = %d\n\n", *seed);-#endif-#endif /* ASA_PRINT */--  /* save initial user value of OPTIONS->Sequential_Parameters */-  *start_sequence = OPTIONS->Sequential_Parameters;--#if ASA_PRINT-  fprintf (ptr_asa_out,-#if INT_ALLOC-           "*number_parameters = %d\n\n", *number_parameters);-#else-#if INT_LONG-           "*number_parameters = %ld\n\n", *number_parameters);-#else-           "*number_parameters = %d\n\n", *number_parameters);-#endif-#endif--  /* print the min, max, current values, and types of parameters */-  fprintf (ptr_asa_out, "index_v parameter_minimum parameter_maximum\- parameter_value parameter_type \n");--#if ASA_PRINT_INTERMED-  VFOR (index_v) fprintf (ptr_asa_out,-#if INT_ALLOC-                          " %-8d %-*.*g \t\t %-*.*g \t %-*.*g %-7d\n",-#else-#if INT_LONG-                          " %-8ld %-*.*g \t\t %-*.*g \t %-*.*g %-7d\n",-#else-                          " %-8d %-*.*g \t\t %-*.*g \t %-*.*g %-7d\n",-#endif-#endif-                          index_v,-                          G_FIELD, G_PRECISION, parameter_minimum[index_v],-                          G_FIELD, G_PRECISION, parameter_maximum[index_v],-                          G_FIELD, G_PRECISION,-                          current_generated_state->parameter[index_v],-                          parameter_type[index_v]);--  fprintf (ptr_asa_out, "\n\n");-#endif /* ASA_PRINT_INTERMED */-  /* Print out user-defined OPTIONS */--#if DELTA_PARAMETERS-  VFOR (index_v) fprintf (ptr_asa_out,-#if INT_ALLOC-                          "OPTIONS->User_Delta_Parameter[%d] = %*.*g\n",-#else-#if INT_LONG-                          "OPTIONS->User_Delta_Parameter[%ld] = %*.*g\n",-#else-                          "OPTIONS->User_Delta_Parameter[%d] = %*.*g\n",-#endif-#endif-                          index_v,-                          G_FIELD, G_PRECISION,-                          OPTIONS->User_Delta_Parameter[index_v]);-  fprintf (ptr_asa_out, "\n");-#endif /* DELTA_PARAMETERS */--#if QUENCH_PARAMETERS-  VFOR (index_v) fprintf (ptr_asa_out,-#if INT_ALLOC-                          "OPTIONS->User_Quench_Param_Scale[%d] = %*.*g\n",-#else-#if INT_LONG-                          "OPTIONS->User_Quench_Param_Scale[%ld] = %*.*g\n",-#else-                          "OPTIONS->User_Quench_Param_Scale[%d] = %*.*g\n",-#endif-#endif-                          index_v,-                          G_FIELD, G_PRECISION,-                          OPTIONS->User_Quench_Param_Scale[index_v]);-#endif /* QUENCH_PARAMETERS */--#if QUENCH_COST-  fprintf (ptr_asa_out,-           "\nOPTIONS->User_Quench_Cost_Scale = %*.*g\n\n",-           G_FIELD, G_PRECISION, OPTIONS->User_Quench_Cost_Scale[0]);-#endif /* QUENCH_COST */--#if USER_INITIAL_PARAMETERS_TEMPS-  VFOR (index_v) fprintf (ptr_asa_out,-#if INT_ALLOC-                          "OPTIONS->User_Parameter_Temperature[%d] = %*.*g\n",-#else-#if INT_LONG-                          "OPTIONS->User_Parameter_Temperature[%ld] = %*.*g\n",-#else-                          "OPTIONS->User_Parameter_Temperature[%d] = %*.*g\n",-#endif-#endif-                          index_v,-                          G_FIELD, G_PRECISION,-                          initial_user_parameter_temp[index_v]);-#endif /* USER_INITIAL_PARAMETERS_TEMPS */--#if RATIO_TEMPERATURE_SCALES-  VFOR (index_v) fprintf (ptr_asa_out,-#if INT_ALLOC-                          "OPTIONS->User_Temperature_Ratio[%d] = %*.*g\n",-#else-#if INT_LONG-                          "OPTIONS->User_Temperature_Ratio[%ld] = %*.*g\n",-#else-                          "OPTIONS->User_Temperature_Ratio[%d] = %*.*g\n",-#endif-#endif-                          index_v,-                          G_FIELD, G_PRECISION,-                          OPTIONS->User_Temperature_Ratio[index_v]);-#endif /* RATIO_TEMPERATURE_SCALES */--#if USER_INITIAL_COST_TEMP-  fprintf (ptr_asa_out,-           "OPTIONS->User_Cost_Temperature[0] = %*.*g\n",-           G_FIELD, G_PRECISION, *initial_cost_temperature);-#endif /* USER_INITIAL_COST_TEMP */--  fflush (ptr_asa_out);-#endif /* ASA_PRINT */--#if MULTI_MIN-#if ASA_PRINT-  fprintf (ptr_asa_out, "\n");-  fprintf (ptr_asa_out, "Multi_Number = %d\n", OPTIONS->Multi_Number);-  fprintf (ptr_asa_out, "Multi_Specify = %d\n", OPTIONS->Multi_Specify);-#if ASA_RESOLUTION-#else-  VFOR (index_v) {-    fprintf (ptr_asa_out,-#if INT_ALLOC-             "Multi_Grid[%d] = %*.*g\n",-#else-#if INT_LONG-             "Multi_Grid[%ld] = %*.*g\n",-#else-             "Multi_Grid[%d] = %*.*g\n",-#endif-#endif-             index_v, G_FIELD, G_PRECISION, OPTIONS->Multi_Grid[index_v]);-  }-#endif /* ASA_RESOLUTION */-  fprintf (ptr_asa_out, "\n");-  fflush (ptr_asa_out);-#endif /* ASA_PRINT */-#endif /* MULTI_MIN */--#if ASA_PARALLEL-#if ASA_PRINT-  fprintf (ptr_asa_out,-#if INT_LONG-           "Initial ASA_PARALLEL OPTIONS->\n\t Gener_Block = %ld\n\- \t Gener_Block_Max = %ld\n \t Gener_Mov_Avr= %d\n\n",-#else-           "ASA_PARALLEL OPTIONS->\n\t Gener_Block = %d\n\- \t Gener_Block_Max = %d\n \t Gener_Mov_Avr= %d\n\n",-#endif-           OPTIONS->Gener_Block, OPTIONS->Gener_Block_Max,-           OPTIONS->Gener_Mov_Avr);-#endif-#endif /* ASA_PARALLEL */--#if ASA_SAMPLE-#if ASA_PRINT-  fprintf (ptr_asa_out, "OPTIONS->Limit_Weights = %*.*g\n\n",-           G_FIELD, G_PRECISION, OPTIONS->Limit_Weights);-#endif-#endif-  if (OPTIONS->Asa_Recursive_Level > asa_recursive_max)-    asa_recursive_max = OPTIONS->Asa_Recursive_Level;-#if ASA_SAVE-  if (OPTIONS->Asa_Recursive_Level > 0)-    sprintf (asa_save_comm, "asa_save_%d", OPTIONS->Asa_Recursive_Level);-  else-    sprintf (asa_save_comm, "asa_save");-  if ((ptr_save = fopen (asa_save_comm, "r")) == NULL) {-    asa_read = FALSE;-  } else {-#if ASA_PRINT-    fprintf (ptr_asa_out, "\n\n\trestart after ASA_SAVE\n\n");-#endif-    fclose (ptr_save);-    asa_read = TRUE;--    /* give some value to avoid any problems with other OPTIONS */-#if USER_ACCEPTANCE_TEST-    OPTIONS->Cost_Temp_Curr = OPTIONS->Cost_Temp_Init =-#endif-      current_generated_state->cost-      = *initial_cost_temperature = *current_cost_temperature = 3.1416;-  }-#endif--  tmp_var_int = cost_function_test (current_generated_state->cost,-                                    current_generated_state->parameter,-                                    parameter_minimum,-                                    parameter_maximum, number_parameters,-                                    xnumber_parameters);--  /* compute temperature scales */-  tmp_var_db1 = -F_LOG ((OPTIONS->Temperature_Ratio_Scale));-  tmp_var_db2 = F_LOG (OPTIONS->Temperature_Anneal_Scale);-  temperature_scale =-    tmp_var_db1 * F_EXP (-tmp_var_db2 / *xnumber_parameters);--  /* set here in case not used */-  tmp_var_db = ZERO;--#if QUENCH_PARAMETERS-#if RATIO_TEMPERATURE_SCALES-  VFOR (index_v) temperature_scale_parameters[index_v] = tmp_var_db1 * F_EXP-#if QUENCH_PARAMETERS_SCALE-    (-(tmp_var_db2 * OPTIONS->User_Quench_Param_Scale[index_v])-#else-    (-(tmp_var_db2)-#endif-     / *xnumber_parameters)-    * OPTIONS->User_Temperature_Ratio[index_v];-#else-  VFOR (index_v) temperature_scale_parameters[index_v] = tmp_var_db1 * F_EXP-#if QUENCH_PARAMETERS_SCALE-    (-(tmp_var_db2 * OPTIONS->User_Quench_Param_Scale[index_v])-#else-    (-(tmp_var_db2)-#endif-     / *xnumber_parameters);-#endif /* RATIO_TEMPERATURE_SCALES */-#else /* QUENCH_PARAMETERS */-#if RATIO_TEMPERATURE_SCALES-  VFOR (index_v)-    temperature_scale_parameters[index_v] =-    tmp_var_db1 * F_EXP (-(tmp_var_db2) / *xnumber_parameters)-    * OPTIONS->User_Temperature_Ratio[index_v];-#else-  VFOR (index_v)-    temperature_scale_parameters[index_v] =-    tmp_var_db1 * F_EXP (-(tmp_var_db2) / *xnumber_parameters);-#endif /* RATIO_TEMPERATURE_SCALES */-#endif /* QUENCH_PARAMETERS */--#if USER_ACCEPTANCE_TEST-  OPTIONS->Cost_Temp_Scale =-#endif-    *temperature_scale_cost =-#if QUENCH_COST-#if QUENCH_COST_SCALE-    tmp_var_db1 * F_EXP (-(tmp_var_db2 * OPTIONS->User_Quench_Cost_Scale[0])-#else-    tmp_var_db1 * F_EXP (-(tmp_var_db2)-#endif-                         / *xnumber_parameters) *-    OPTIONS->Cost_Parameter_Scale_Ratio;-#else /* QUENCH_COST */-    tmp_var_db1 * F_EXP (-(tmp_var_db2)-                         / *xnumber_parameters) *-    OPTIONS->Cost_Parameter_Scale_Ratio;-#endif /* QUENCH_COST */--  /* set the initial index of parameter generations to 1 */-  VFOR (index_v) index_parameter_generations[index_v] = 1;--  /* test user-defined options before calling cost function */-  tmp_var_int = asa_test_asa_options (seed,-                                      parameter_initial_final,-                                      parameter_minimum,-                                      parameter_maximum,-                                      tangents,-                                      curvature,-                                      number_parameters,-                                      parameter_type,-                                      valid_state_generated_flag,-                                      exit_status, ptr_asa_out, OPTIONS);-  if (tmp_var_int > 0) {-#if ASA_PRINT-    fprintf (ptr_asa_out, "total number invalid OPTIONS = %d\n", tmp_var_int);-    fflush (ptr_asa_out);-#endif-    *exit_status = INVALID_USER_INPUT;-    goto EXIT_ASA;-  }-#if USER_INITIAL_COST_TEMP-#else-#if ASA_SAVE-  if (asa_read == TRUE)-    OPTIONS->Number_Cost_Samples = 1;-#endif-  /* calculate the average cost over samplings of the cost function */-  if (OPTIONS->Number_Cost_Samples < -1) {-    tmp_var_db1 = ZERO;-    tmp_var_db2 = ZERO;-    tmp_var_int = -OPTIONS->Number_Cost_Samples;-  } else {-    tmp_var_db1 = ZERO;-    tmp_var_int = OPTIONS->Number_Cost_Samples;-  }--  OPTIONS->Locate_Cost = 0;     /* initial cost temp */--  for (index_cost_constraint = 0;-       index_cost_constraint < tmp_var_int; ++index_cost_constraint) {-    *number_invalid_generated_states = 0;-    repeated_invalid_states = 0;-    OPTIONS->Sequential_Parameters = *start_sequence - 1;-    do {-      ++(*number_invalid_generated_states);-      generate_new_state (user_random_generator,-                          seed,-                          parameter_minimum,-                          parameter_maximum, current_user_parameter_temp,-#if USER_GENERATING_FUNCTION-                          initial_user_parameter_temp,-                          temperature_scale_parameters,-#endif-                          number_parameters,-                          parameter_type,-                          current_generated_state, last_saved_state, OPTIONS);-      *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-      OPTIONS->User_Acceptance_Flag = TRUE;-      OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-      tmp_var_db =-        user_cost_function (current_generated_state->parameter,-                            parameter_minimum,-                            parameter_maximum,-                            tangents,-                            curvature,-                            number_parameters,-                            parameter_type,-                            valid_state_generated_flag, exit_status, OPTIONS);-      if (cost_function_test-          (tmp_var_db, current_generated_state->parameter,-           parameter_minimum, parameter_maximum, number_parameters,-           xnumber_parameters) == 0) {-        *exit_status = INVALID_COST_FUNCTION;-        goto EXIT_ASA;-      }--      ++repeated_invalid_states;-      if (repeated_invalid_states > OPTIONS->Limit_Invalid_Generated_States) {-        *exit_status = TOO_MANY_INVALID_STATES;-        goto EXIT_ASA;-      }-    }-    while (*valid_state_generated_flag == FALSE);-    --(*number_invalid_generated_states);--    if (OPTIONS->Number_Cost_Samples < -1) {-      tmp_var_db1 += tmp_var_db;-      tmp_var_db2 += (tmp_var_db * tmp_var_db);-    } else {-      tmp_var_db1 += fabs (tmp_var_db);-    }-  }-  if (OPTIONS->Number_Cost_Samples < -1) {-    tmp_var_db1 /= (double) tmp_var_int;-    tmp_var_db2 /= (double) tmp_var_int;-    tmp_var_db = sqrt (fabs ((tmp_var_db2 - tmp_var_db1 * tmp_var_db1)-                             * ((double) tmp_var_int-                                / ((double) tmp_var_int - ONE))))-      + (double) EPS_DOUBLE;-  } else {-    tmp_var_db = tmp_var_db1 / tmp_var_int;-  }--#if USER_ACCEPTANCE_TEST-  OPTIONS->Cost_Temp_Curr = OPTIONS->Cost_Temp_Init =-#endif-    *initial_cost_temperature = *current_cost_temperature = tmp_var_db;-#endif /* USER_INITIAL_COST_TEMP */--  /* set all parameters to the initial parameter values */-  VFOR (index_v)-    best_generated_state->parameter[index_v] =-    last_saved_state->parameter[index_v] =-    current_generated_state->parameter[index_v] =-    parameter_initial_final[index_v];--  OPTIONS->Locate_Cost = 1;     /* initial cost value */--  /* if using user's initial parameters */-  if (OPTIONS->User_Initial_Parameters == TRUE) {-    *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-    OPTIONS->User_Acceptance_Flag = TRUE;-    OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-#if ASA_SAVE-    if (asa_read == FALSE)-#endif-      current_generated_state->cost =-        user_cost_function (current_generated_state->parameter,-                            parameter_minimum,-                            parameter_maximum,-                            tangents,-                            curvature,-                            number_parameters,-                            parameter_type,-                            valid_state_generated_flag, exit_status, OPTIONS);-    if (cost_function_test-        (current_generated_state->cost, current_generated_state->parameter,-         parameter_minimum, parameter_maximum, number_parameters,-         xnumber_parameters) == 0) {-      *exit_status = INVALID_COST_FUNCTION;-      goto EXIT_ASA;-    }-#if ASA_PRINT-    if (*valid_state_generated_flag == FALSE)-      fprintf (ptr_asa_out, "user's initial parameters generated \-FALSE *valid_state_generated_flag\n");-#endif-  } else {-    /* let asa generate valid initial parameters */-    repeated_invalid_states = 0;-    OPTIONS->Sequential_Parameters = *start_sequence - 1;-    do {-      ++(*number_invalid_generated_states);-      generate_new_state (user_random_generator,-                          seed,-                          parameter_minimum,-                          parameter_maximum, current_user_parameter_temp,-#if USER_GENERATING_FUNCTION-                          initial_user_parameter_temp,-                          temperature_scale_parameters,-#endif-                          number_parameters,-                          parameter_type,-                          current_generated_state, last_saved_state, OPTIONS);-      *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-      OPTIONS->User_Acceptance_Flag = TRUE;-      OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-      current_generated_state->cost =-        user_cost_function (current_generated_state->parameter,-                            parameter_minimum,-                            parameter_maximum,-                            tangents,-                            curvature,-                            number_parameters,-                            parameter_type,-                            valid_state_generated_flag, exit_status, OPTIONS);-      if (cost_function_test-          (current_generated_state->cost,-           current_generated_state->parameter, parameter_minimum,-           parameter_maximum, number_parameters, xnumber_parameters) == 0) {-        *exit_status = INVALID_COST_FUNCTION;-        goto EXIT_ASA;-      }-      ++repeated_invalid_states;-      if (repeated_invalid_states > OPTIONS->Limit_Invalid_Generated_States) {-        *exit_status = TOO_MANY_INVALID_STATES;-        goto EXIT_ASA;-      }-    }-    while (*valid_state_generated_flag == FALSE);-    --(*number_invalid_generated_states);-  }                             /* OPTIONS->User_Initial_Parameters */--  /* set all states to the last one generated */-  VFOR (index_v) {-#if DROPPED_PARAMETERS-    /* ignore parameters that have too small a range */-    if (PARAMETER_RANGE_TOO_SMALL (index_v))-      continue;-#endif-    best_generated_state->parameter[index_v] =-      last_saved_state->parameter[index_v] =-      current_generated_state->parameter[index_v];-  }--  /* set all costs to the last one generated */-  best_generated_state->cost = last_saved_state->cost =-    current_generated_state->cost;--  *accepted_to_generated_ratio = ONE;--  /* do not calculate curvatures initially */-  *curvature_flag = FALSE;--#if ASA_PRINT-  fprintf (ptr_asa_out,-           "temperature_scale = %*.*g\n",-           G_FIELD, G_PRECISION, temperature_scale);-#if RATIO_TEMPERATURE_SCALES-#if ASA_PRINT_INTERMED-  VFOR (index_v) {-    fprintf (ptr_asa_out,-#if INT_ALLOC-             "temperature_scale_parameters[%d] = %*.*g\n",-#else-#if INT_LONG-             "temperature_scale_parameters[%ld] = %*.*g\n",-#else-             "temperature_scale_parameters[%d] = %*.*g\n",-#endif-#endif-             index_v,-             G_FIELD, G_PRECISION, temperature_scale_parameters[index_v]);-  }-#endif-#else-  fprintf (ptr_asa_out,-           "temperature_scale_parameters[0] = %*.*g\n",-           G_FIELD, G_PRECISION, temperature_scale_parameters[0]);-#endif /* RATIO_TEMPERATURE_SCALES */-  fprintf (ptr_asa_out,-           "*temperature_scale_cost = %*.*g\n",-           G_FIELD, G_PRECISION, *temperature_scale_cost);-  fprintf (ptr_asa_out, "\n\n");--#if ASA_PRINT_INTERMED-  print_state (parameter_minimum,-               parameter_maximum,-               tangents,-               curvature,-               current_cost_temperature,-               current_user_parameter_temp,-               accepted_to_generated_ratio,-               number_parameters,-               curvature_flag,-               number_accepted,-               index_cost_acceptances,-               number_generated,-               number_invalid_generated_states,-               last_saved_state, best_generated_state, ptr_asa_out, OPTIONS);-#endif-  fprintf (ptr_asa_out, "\n");--  fflush (ptr_asa_out);-#endif--#if ASA_SAMPLE-#if ASA_PRINT-  fprintf (ptr_asa_out,-           ":SAMPLE:   n_accept   cost        cost_temp    bias_accept    \- aver_weight\n");-  fprintf (ptr_asa_out,-           ":SAMPLE:   index      param[]     temp[]       bias_gener[]   \- range[]\n");-#endif-#endif--  /* reset the current cost and the number of generations performed */-  *number_invalid_generated_states = 0;-  *best_number_generated_saved =-    *number_generated = *recent_number_generated = 0;-  OPTIONS->N_Generated = *number_generated;-  VFOR (index_v) {-    /* ignore parameters that have too small a range */-    if (PARAMETER_RANGE_TOO_SMALL (index_v))-      continue;-    index_parameter_generations[index_v] = 1;-  }-#if USER_ACCEPTANCE_TEST-  OPTIONS->User_Acceptance_Flag = FALSE;-  OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif--#if ASA_QUEUE-#if ASA_PRINT-#if INT_ALLOC-  fprintf (ptr_asa_out, "OPTIONS->Queue_Size = %d\n", OPTIONS->Queue_Size);-#else-#if INT_LONG-  fprintf (ptr_asa_out, "OPTIONS->Queue_Size = %ld\n", OPTIONS->Queue_Size);-#else-  fprintf (ptr_asa_out, "OPTIONS->Queue_Size = %d\n", OPTIONS->Queue_Size);-#endif-#endif-  VFOR (index_v) {-    fprintf (ptr_asa_out,-#if INT_ALLOC-             "Queue_Resolution[%d] = %*.*g\n",-#else-#if INT_LONG-             "Queue_Resolution[%ld] = %*.*g\n",-#else-             "Queue_Resolution[%d] = %*.*g\n",-#endif-#endif-             index_v,-             G_FIELD, G_PRECISION, OPTIONS->Queue_Resolution[index_v]);-  }-#endif /* ASA_PRINT */--  /* fill arrays to check allocated memory */-  for (queue = 0; queue < queue_size_tmp; ++queue) {-    VFOR (index_v) {-      if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-        continue;-      }-      queue_v = index_v + queue * (LONG_INT) (*number_parameters);-      save_queue_param[queue_v] = current_generated_state->parameter[index_v];-    }-    save_queue_cost[queue] = current_generated_state->cost;-    save_queue_flag[queue] = *valid_state_generated_flag;-  }-  save_queue = save_queue_indx = 0;-#endif /* ASA_QUEUE */--#if ASA_RESOLUTION-#if ASA_PRINT-  VFOR (index_v) {-    fprintf (ptr_asa_out,-#if INT_ALLOC-             "Coarse_Resolution[%d] = %*.*g\n",-#else-#if INT_LONG-             "Coarse_Resolution[%ld] = %*.*g\n",-#else-             "Coarse_Resolution[%d] = %*.*g\n",-#endif-#endif-             index_v,-             G_FIELD, G_PRECISION, OPTIONS->Coarse_Resolution[index_v]);-  }-#endif /* ASA_PRINT */-#endif /* ASA_RESOLUTION */--#if MULTI_MIN-  multi_sort[OPTIONS->Multi_Number] = OPTIONS->Multi_Number;-  multi_cost[OPTIONS->Multi_Number] = current_generated_state->cost;-  VFOR (index_v) {-    multi_params[OPTIONS->Multi_Number][index_v] =-      current_generated_state->parameter[index_v];-  }-  for (multi_index = 0; multi_index < OPTIONS->Multi_Number; ++multi_index) {-    multi_sort[multi_index] = multi_index;-    multi_cost[multi_index] = OPTIONS->Multi_Cost[multi_index] =-      current_generated_state->cost;-    VFOR (index_v) {-      multi_params[multi_index][index_v] =-        OPTIONS->Multi_Params[multi_index][index_v] =-        current_generated_state->parameter[index_v];-    }-  }-#endif /* MULTI_MIN */--  OPTIONS->Sequential_Parameters = *start_sequence - 1;--  /* MAIN ANNEALING LOOP */-  while (((*number_accepted <= OPTIONS->Limit_Acceptances)-          || (OPTIONS->Limit_Acceptances == 0))-         && ((*number_generated <= OPTIONS->Limit_Generated)-             || (OPTIONS->Limit_Generated == 0))) {--    tmp_var_db1 = -F_LOG ((OPTIONS->Temperature_Ratio_Scale));--    /* compute temperature scales */-    tmp_var_db2 = F_LOG (OPTIONS->Temperature_Anneal_Scale);-    temperature_scale = tmp_var_db1 *-      F_EXP (-tmp_var_db2 / *xnumber_parameters);--#if QUENCH_PARAMETERS-#if RATIO_TEMPERATURE_SCALES-    VFOR (index_v)-      temperature_scale_parameters[index_v] = tmp_var_db1 * F_EXP-#if QUENCH_PARAMETERS_SCALE-      (-(tmp_var_db2 * OPTIONS->User_Quench_Param_Scale[index_v])-#else-      (-(tmp_var_db2)-#endif-       / *xnumber_parameters)-      * OPTIONS->User_Temperature_Ratio[index_v];-#else-    VFOR (index_v)-      temperature_scale_parameters[index_v] = tmp_var_db1 * F_EXP-#if QUENCH_PARAMETERS_SCALE-      (-(tmp_var_db2 * OPTIONS->User_Quench_Param_Scale[index_v])-#else-      (-(tmp_var_db2)-#endif-       / *xnumber_parameters);-#endif /* RATIO_TEMPERATURE_SCALES */-#else /* QUENCH_PARAMETERS */-#if RATIO_TEMPERATURE_SCALES-    VFOR (index_v)-      temperature_scale_parameters[index_v] =-      tmp_var_db1 * F_EXP (-(tmp_var_db2) / *xnumber_parameters)-      * OPTIONS->User_Temperature_Ratio[index_v];-#else-    VFOR (index_v)-      temperature_scale_parameters[index_v] =-      tmp_var_db1 * F_EXP (-(tmp_var_db2) / *xnumber_parameters);-#endif /* RATIO_TEMPERATURE_SCALES */-#endif /* QUENCH_PARAMETERS */--#if USER_ACCEPTANCE_TEST-    OPTIONS->Cost_Temp_Scale =-#endif-      *temperature_scale_cost =-#if QUENCH_COST-#if QUENCH_COST_SCALE-      tmp_var_db1 * F_EXP (-(tmp_var_db2 * OPTIONS->User_Quench_Cost_Scale[0])-#else-      tmp_var_db1 * F_EXP (-(tmp_var_db2)-#endif-                           / *xnumber_parameters) *-      OPTIONS->Cost_Parameter_Scale_Ratio;-#else /* QUENCH_COST */-      tmp_var_db1 * F_EXP (-(tmp_var_db2)-                           / *xnumber_parameters) *-      OPTIONS->Cost_Parameter_Scale_Ratio;-#endif /* QUENCH_COST */--    /* CALCULATE NEW TEMPERATURES */--    /* calculate new parameter temperatures */-    VFOR (index_v) {-      /* skip parameters with too small a range */-      if (PARAMETER_RANGE_TOO_SMALL (index_v))-        continue;--      log_new_temperature_ratio =-        -temperature_scale_parameters[index_v] *-        F_POW ((double) index_parameter_generations[index_v],-#if QUENCH_PARAMETERS-               OPTIONS->User_Quench_Param_Scale[index_v]-#else /* QUENCH_PARAMETERS */-               ONE-#endif /* QUENCH_PARAMETERS */-               / *xnumber_parameters);-      /* check (and correct) for too large an exponent */-      log_new_temperature_ratio = EXPONENT_CHECK (log_new_temperature_ratio);-      current_user_parameter_temp[index_v] =-        initial_user_parameter_temp[index_v]-        * F_EXP (log_new_temperature_ratio);--#if NO_PARAM_TEMP_TEST-      if (current_user_parameter_temp[index_v] < (double) EPS_DOUBLE)-        current_user_parameter_temp[index_v] = (double) EPS_DOUBLE;-#else-      /* check for too small a parameter temperature */-      if (current_user_parameter_temp[index_v] < (double) EPS_DOUBLE) {-        *exit_status = P_TEMP_TOO_SMALL;-        *index_exit_v = index_v;-        goto EXIT_ASA;-      }-#endif-    }--    /* calculate new cost temperature */-    log_new_temperature_ratio =-      -*temperature_scale_cost * F_POW ((double) *index_cost_acceptances,-#if QUENCH_COST-                                        OPTIONS->User_Quench_Cost_Scale[0]-#else-                                        ONE-#endif-                                        / *xnumber_parameters);-    log_new_temperature_ratio = EXPONENT_CHECK (log_new_temperature_ratio);-#if USER_ACCEPTANCE_TEST-    OPTIONS->Cost_Temp_Curr = OPTIONS->Cost_Temp_Init =-#endif-      *current_cost_temperature = *initial_cost_temperature-      * F_EXP (log_new_temperature_ratio);--#if NO_COST_TEMP_TEST-    if (*current_cost_temperature < (double) EPS_DOUBLE)-#if USER_ACCEPTANCE_TEST-      OPTIONS->Cost_Temp_Curr =-#endif-        *current_cost_temperature = (double) EPS_DOUBLE;-#else-    /* check for too small a cost temperature */-    if (*current_cost_temperature < (double) EPS_DOUBLE) {-      *exit_status = C_TEMP_TOO_SMALL;-      goto EXIT_ASA;-    }-#endif--#if ASA_SAVE-    if (asa_read == TRUE && OPTIONS->Asa_Recursive_Level == asa_recursive_max) {-      if (OPTIONS->Asa_Recursive_Level > 0)-        sprintf (asa_save_comm, "asa_save_%d", OPTIONS->Asa_Recursive_Level);-      else-        sprintf (asa_save_comm, "asa_save");-      ptr_save = fopen (asa_save_comm, "r");--      fread (number_parameters, sizeof (ALLOC_INT), 1, ptr_save);-      fread (xnumber_parameters, sizeof (double), 1, ptr_save);-      fread (parameter_minimum, sizeof (double),-             *number_parameters, ptr_save);-      fread (parameter_maximum, sizeof (double),-             *number_parameters, ptr_save);-      fread (tangents, sizeof (double), *number_parameters, ptr_save);-      fread (current_user_parameter_temp, sizeof (double),-             *number_parameters, ptr_save);-      fread (initial_user_parameter_temp, sizeof (double),-             *number_parameters, ptr_save);-      fread (temperature_scale_parameters, sizeof (double),-             *number_parameters, ptr_save);--      fread (parameter_type, sizeof (int), *number_parameters, ptr_save);-      fread (&index_cost_repeat, sizeof (int), 1, ptr_save);-      fread (&asa_open, sizeof (int), 1, ptr_save);-      fread (&number_asa_open, sizeof (int), 1, ptr_save);-      fread (&recursive_asa_open, sizeof (int), 1, ptr_save);--      fread (current_cost_temperature, sizeof (double), 1, ptr_save);-      fread (initial_cost_temperature, sizeof (double), 1, ptr_save);-      fread (temperature_scale_cost, sizeof (double), 1, ptr_save);-      fread (accepted_to_generated_ratio, sizeof (double), 1, ptr_save);--      fread (curvature_flag, sizeof (int), 1, ptr_save);--      fread (seed, sizeof (LONG_INT), 1, ptr_save);-      fread (number_generated, sizeof (LONG_INT), 1, ptr_save);-      fread (number_accepted, sizeof (LONG_INT), 1, ptr_save);-      fread (number_acceptances_saved, sizeof (LONG_INT), 1, ptr_save);-      fread (recent_number_acceptances, sizeof (LONG_INT), 1, ptr_save);-      fread (recent_number_generated, sizeof (LONG_INT), 1, ptr_save);-      fread (number_invalid_generated_states, sizeof (LONG_INT), 1, ptr_save);-      fread (index_cost_acceptances, sizeof (LONG_INT), 1, ptr_save);-      fread (best_number_generated_saved, sizeof (LONG_INT), 1, ptr_save);-      fread (best_number_accepted_saved, sizeof (LONG_INT), 1, ptr_save);--      fread (index_parameter_generations, sizeof (LONG_INT),-             *number_parameters, ptr_save);--      fread (current_generated_state->parameter,-             sizeof (double), *number_parameters, ptr_save);-      fread (last_saved_state->parameter,-             sizeof (double), *number_parameters, ptr_save);-      fread (best_generated_state->parameter,-             sizeof (double), *number_parameters, ptr_save);-      fread (&(current_generated_state->cost), sizeof (double), 1, ptr_save);-      fread (&(last_saved_state->cost), sizeof (double), 1, ptr_save);-      fread (&(best_generated_state->cost), sizeof (double), 1, ptr_save);--      fread (&(OPTIONS->Limit_Acceptances), sizeof (LONG_INT), 1, ptr_save);-      fread (&(OPTIONS->Limit_Generated), sizeof (LONG_INT), 1, ptr_save);-      fread (&(OPTIONS->Limit_Invalid_Generated_States), sizeof (int),-             1, ptr_save);-      fread (&(OPTIONS->Accepted_To_Generated_Ratio), sizeof (double),-             1, ptr_save);-      fread (&(OPTIONS->Cost_Precision), sizeof (double), 1, ptr_save);-      fread (&(OPTIONS->Maximum_Cost_Repeat), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Number_Cost_Samples), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Temperature_Ratio_Scale), sizeof (double),-             1, ptr_save);-      fread (&(OPTIONS->Cost_Parameter_Scale_Ratio), sizeof (double),-             1, ptr_save);-      fread (&(OPTIONS->Temperature_Anneal_Scale), sizeof (double),-             1, ptr_save);-      fread (&(OPTIONS->Include_Integer_Parameters), sizeof (int),-             1, ptr_save);-      fread (&(OPTIONS->User_Initial_Parameters), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Sequential_Parameters), sizeof (ALLOC_INT), 1,-             ptr_save);-      fread (&(OPTIONS->Initial_Parameter_Temperature), sizeof (double), 1,-             ptr_save);-      fread (&(OPTIONS->Acceptance_Frequency_Modulus), sizeof (int), 1,-             ptr_save);-      fread (&(OPTIONS->Generated_Frequency_Modulus), sizeof (int), 1,-             ptr_save);-      fread (&(OPTIONS->Reanneal_Cost), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Reanneal_Parameters), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Delta_X), sizeof (double), 1, ptr_save);-      fread (&(OPTIONS->User_Tangents), sizeof (int), 1, ptr_save);--#if USER_INITIAL_COST_TEMP-      fread (&(OPTIONS->User_Cost_Temperature), sizeof (double), 1, ptr_save);-#endif-#if RATIO_TEMPERATURE_SCALES-      fread (OPTIONS->User_Temperature_Ratio, sizeof (double),-             *number_parameters, ptr_save);-#endif-#if USER_INITIAL_PARAMETERS_TEMPS-      fread (OPTIONS->User_Parameter_Temperature, sizeof (double),-             *number_parameters, ptr_save);-#endif-#if DELTA_PARAMETERS-      fread (OPTIONS->User_Delta_Parameter, sizeof (double),-             *number_parameters, ptr_save);-#endif-#if QUENCH_PARAMETERS-      fread (OPTIONS->User_Quench_Param_Scale, sizeof (double),-             *number_parameters, ptr_save);-#endif-#if QUENCH_COST-      fread (OPTIONS->User_Quench_Cost_Scale, sizeof (double), 1, ptr_save);-#endif-      fread (&(OPTIONS->N_Accepted), sizeof (LONG_INT), 1, ptr_save);-      fread (&(OPTIONS->N_Generated), sizeof (LONG_INT), 1, ptr_save);-      fread (&(OPTIONS->Locate_Cost), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Immediate_Exit), sizeof (int), 1, ptr_save);-#if OPTIONAL_DATA_DBL-      fread (&(OPTIONS->Asa_Data_Dim_Dbl), sizeof (ALLOC_INT), 1, ptr_save);-      fread (OPTIONS->Asa_Data_Dbl, sizeof (double),-             OPTIONS->Asa_Data_Dim_Dbl, ptr_save);-#endif-      fread (&(OPTIONS->Random_Array_Dim), sizeof (ALLOC_INT), 1, ptr_save);-      fread (OPTIONS->Random_Array, sizeof (double),-             OPTIONS->Random_Array_Dim, ptr_save);-      fread (&(OPTIONS->Asa_Recursive_Level), sizeof (int), 1, ptr_save);-#if OPTIONAL_DATA_INT-      fread (&(OPTIONS->Asa_Data_Dim_Int), sizeof (ALLOC_INT), 1, ptr_save);-      fread (OPTIONS->Asa_Data_Int, sizeof (LONG_INT),-             OPTIONS->Asa_Data_Dim_Int, ptr_save);-#endif-#if OPTIONAL_DATA_PTR-      fread (&(OPTIONS->Asa_Data_Dim_Ptr), sizeof (ALLOC_INT), 1, ptr_save);-      if (OPTIONS->Asa_Recursive_Level == 0)-        fread (OPTIONS->Asa_Data_Ptr, sizeof (OPTIONAL_PTR_TYPE),-               OPTIONS->Asa_Data_Dim_Ptr, ptr_save);-#if ASA_TEMPLATE_SELFOPT-      if (OPTIONS->Asa_Recursive_Level == 1)-        fread (OPTIONS->Asa_Data_Ptr, sizeof (RECUR_OPTIONAL_PTR_TYPE),-               OPTIONS->Asa_Data_Dim_Ptr, ptr_save);-#endif-#endif-#if USER_ASA_OUT-      fread (OPTIONS->Asa_Out_File, sizeof (char), 1, ptr_save);-#endif-#if USER_COST_SCHEDULE-      fread (&(OPTIONS->Cost_Schedule), sizeof (char), 1, ptr_save);-#endif-#if USER_ACCEPT_ASYMP_EXP-      fread (&(OPTIONS->Asymp_Exp_Param), sizeof (double), 1, ptr_save);-#endif-#if USER_ACCEPTANCE_TEST-      fread (&(OPTIONS->Acceptance_Test), sizeof (char), 1, ptr_save);-      fread (&(OPTIONS->User_Acceptance_Flag), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Cost_Acceptance_Flag), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Cost_Temp_Curr), sizeof (double), 1, ptr_save);-      fread (&(OPTIONS->Cost_Temp_Init), sizeof (double), 1, ptr_save);-      fread (&(OPTIONS->Cost_Temp_Scale), sizeof (double), 1, ptr_save);-#endif-#if USER_GENERATING_FUNCTION-      fread (&(OPTIONS->Generating_Distrib), sizeof (char), 1, ptr_save);-#endif-#if USER_REANNEAL_COST-      fread (&(OPTIONS->Reanneal_Cost_Function), sizeof (char), 1, ptr_save);-#endif-#if USER_REANNEAL_PARAMETERS-      fread (&(OPTIONS->Reanneal_Params_Function), sizeof (char),-             1, ptr_save);-#endif-#if ASA_SAMPLE-      fread (&(OPTIONS->Bias_Acceptance), sizeof (double), 1, ptr_save);-      fread (OPTIONS->Bias_Generated, sizeof (double),-             *number_parameters, ptr_save);-      fread (&(OPTIONS->Average_Weights), sizeof (double), 1, ptr_save);-      fread (&(OPTIONS->Limit_Weights), sizeof (double), 1, ptr_save);-#endif-#if ASA_QUEUE-      fread (save_queue, sizeof (LONG_INT), 1, ptr_save);-      fread (save_queue_indx, sizeof (LONG_INT), 1, ptr_save);-      fread (&(OPTIONS->Queue_Size), sizeof (ALLOC_INT), 1, ptr_save);-      fread (save_queue_flag, sizeof (int), save_queue, ptr_save);-      fread (save_queue_cost, sizeof (double), save_queue, ptr_save);-      fread (save_queue_param, sizeof (double),-             (*number_parameters) * (OPTIONS->Queue_Size), ptr_save);-#if ASA_RESOLUTION-#else-      fread (OPTIONS->Queue_Resolution, sizeof (double),-             *number_parameters, ptr_save);-#endif-#endif-#if ASA_RESOLUTION-      fread (OPTIONS->Coarse_Resolution, sizeof (double),-             *number_parameters, ptr_save);-#endif-#if FITLOC-      fread (&(OPTIONS->Fit_Local), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Iter_Max), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Penalty), sizeof (double), 1, ptr_save);-#endif-#if MULTI_MIN-      fread (OPTIONS->Multi_Number, sizeof (int), 1, ptr_save);-      fread (OPTIONS->Multi_Grid,-             sizeof (double), *number_parameters, ptr_save);-      fread (&(OPTIONS->Multi_Specify), sizeof (int), 1, ptr_save);-      for (multi_index = 0; multi_index < OPTIONS->Multi_Number;-           ++multi_index) {-        fread (&(OPTIONS->Multi_Cost[multi_index]), sizeof (double), 1,-               ptr_save);-        fread (&(OPTIONS->Multi_Params[multi_index]), sizeof (double),-               *number_parameters, ptr_save);-      }-#endif-#if ASA_PARALLEL-      fread (&parallel_generated, sizeof (LONG_INT), 1, ptr_save);-      fread (&parallel_block_max, sizeof (LONG_INT), 1, ptr_save);-      for (index_parallel = 0; index_parallel < parallel_block_max;-           ++index_parallel) {-        fread (gener_block_state[index_parallel].parameter,-               sizeof (double), *number_parameters, ptr_save);-        fread (&(gener_block_state[index_parallel].cost),-               sizeof (double), 1, ptr_save);-#if USER_ACCEPTANCE_TEST-        fread (&-               (gener_block_state[index_parallel].par_user_accept_flag),-               sizeof (int), 1, ptr_save);-        fread (&-               (gener_block_state[index_parallel].par_cost_accept_flag),-               sizeof (int), 1, ptr_save);-#endif-      }-      fread (&(OPTIONS->Gener_Mov_Avr), sizeof (int), 1, ptr_save);-      fread (&(OPTIONS->Gener_Block), sizeof (LONG_INT), 1, ptr_save);-      fread (&(OPTIONS->Gener_Block_Max), sizeof (LONG_INT), 1, ptr_save);-#endif--      fclose (ptr_save);--      asa_read = FALSE;-#if ASA_PRINT-      print_state (parameter_minimum,-                   parameter_maximum,-                   tangents,-                   curvature,-                   current_cost_temperature,-                   current_user_parameter_temp,-                   accepted_to_generated_ratio,-                   number_parameters,-                   curvature_flag,-                   number_accepted,-                   index_cost_acceptances,-                   number_generated,-                   number_invalid_generated_states,-                   last_saved_state,-                   best_generated_state, ptr_asa_out, OPTIONS);-#endif /* ASA_PRINT */--#include "asa_opt"-#if ASA_SAVE_OPT-      if ((ptr_save_opt = fopen ("asa_save_opt", "r")) == NULL) {-#if INCL_STDOUT-        printf ("\n\n*** WARNING fopen asa_save_opt failed *** \n\n");-#endif /* INCL_STDOUT */-#if ASA_PRINT-        fprintf (ptr_asa_out,-                 "\n\n*** WARNING fopen asa_save_opt failed *** \n\n");-        fflush (ptr_asa_out);-#endif-      } else {-        fscanf (ptr_save_opt, "%s%s%s%s%s",-                read_if, read_FALSE, read_comm1, read_ASA_SAVE, read_comm2);-        if (strcmp (read_if, "#if") || strcmp (read_FALSE, "FALSE")-            || strcmp (read_comm1, "/*")-            || strcmp (read_ASA_SAVE, "ASA_SAVE")-            || strcmp (read_comm2, "*/")) {-#if INCL_STDOUT-          printf ("\n\n*** EXIT not asa_save_opt for this version *** \n\n");-#endif /* INCL_STDOUT */-#if ASA_PRINT-          fprintf (ptr_asa_out,-                   "\n\n*** not asa_save_opt for this version *** \n\n");-          fflush (ptr_asa_out);-#endif-          *exit_status = INVALID_USER_INPUT;-          goto EXIT_ASA;-        }-#if INT_LONG-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%ld", &read_long);-        OPTIONS->Limit_Acceptances = read_long;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%ld", &read_long);-        OPTIONS->Limit_Generated = read_long;-#else-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Limit_Acceptances = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Limit_Generated = read_int;-#endif-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Limit_Invalid_Generated_States = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%lf", &read_double);-        OPTIONS->Accepted_To_Generated_Ratio = read_double;--        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%lf", &read_double);-        OPTIONS->Cost_Precision = read_double;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Maximum_Cost_Repeat = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Number_Cost_Samples = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%lf", &read_double);-        OPTIONS->Temperature_Ratio_Scale = read_double;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%lf", &read_double);-        OPTIONS->Cost_Parameter_Scale_Ratio = read_double;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%lf", &read_double);-        OPTIONS->Temperature_Anneal_Scale = read_double;--        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Include_Integer_Parameters = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->User_Initial_Parameters = read_int;-#if INT_ALLOC-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Sequential_Parameters = read_int;-#else-#if INT_LONG-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%ld", &read_long);-        OPTIONS->Sequential_Parameters = read_long;-#else-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Sequential_Parameters = read_int;-#endif-#endif-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%lf", &read_double);-        OPTIONS->Initial_Parameter_Temperature = read_double;--        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Acceptance_Frequency_Modulus = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Generated_Frequency_Modulus = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Reanneal_Cost = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Reanneal_Parameters = read_int;--        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%lf", &read_double);-        OPTIONS->Delta_X = read_double;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->User_Tangents = read_int;-        fscanf (ptr_save_opt, "%s", read_option);-        fscanf (ptr_save_opt, "%d", &read_int);-        OPTIONS->Curvature_0 = read_int;--        fclose (ptr_save_opt);-      }-#endif /* ASA_SAVE_OPT */--      goto SAVED_ASA;-    }-#endif /* ASA_SAVE */--    /* GENERATE NEW PARAMETERS */--    /* generate a new valid set of parameters */-#if ASA_PARALLEL-    /* *** ENTER CODE TO SPAWN OFF PARALLEL GENERATED STATES *** */--    /* check if need more memory allocated to gener_block_state */-    if (OPTIONS->Gener_Block_Max > parallel_block_max) {-      for (index_parallel = 0; index_parallel < parallel_block_max;-           ++index_parallel) {-        free (gener_block_state[index_parallel].parameter);-      }-      free (gener_block_state);--      if ((gener_block_state =-           (STATE *) calloc (OPTIONS->Gener_Block_Max,-                             sizeof (STATE))) == NULL) {-        strcpy (exit_msg, "asa(): gener_block_state");-        Exit_ASA (exit_msg);-        *exit_status = CALLOC_FAILED;-        return (-1);-      }--      parallel_block_max = OPTIONS->Gener_Block_Max;--      for (index_parallel = 0; index_parallel < parallel_block_max;-           ++index_parallel) {-        if ((gener_block_state[index_parallel].parameter =-             (double *) calloc (*number_parameters,-                                sizeof (double))) == NULL) {-          strcpy (exit_msg,-                  "asa(): gener_block_state[index_parallel].parameter");-          Exit_ASA (exit_msg);-          *exit_status = CALLOC_FAILED;-          return (-1);-        }-      }-    }-#if ASA_TEMPLATE_PARALLEL-    for (index_parallel = 0; index_parallel < OPTIONS->Gener_Block;-         ++index_parallel) {-#endif /* ASA_TEMPLATE_PARALLEL */-#endif /* ASA_PARALLEL */--      if (OPTIONS->Locate_Cost < 0) {-        OPTIONS->Locate_Cost = 12;      /* generate new state from new best */-      } else {-        OPTIONS->Locate_Cost = 2;       /* generate new state */-      }--      repeated_invalid_states = 0;-      do {-        ++(*number_invalid_generated_states);-        generate_new_state (user_random_generator,-                            seed,-                            parameter_minimum,-                            parameter_maximum, current_user_parameter_temp,-#if USER_GENERATING_FUNCTION-                            initial_user_parameter_temp,-                            temperature_scale_parameters,-#endif-                            number_parameters,-                            parameter_type,-                            current_generated_state,-                            last_saved_state, OPTIONS);--        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = FALSE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-#if ASA_QUEUE-        /* Binary trees do not seem necessary since we are assuming-           that the cost function calculation is the bottleneck.-           However, see the MISC.DIR/asa_contrib file for-           source code for doubly-linked and hashed lists. */-        if (OPTIONS->Queue_Size == 0) {-          queue_new = 1;-        } else {-          queue_new = 1;-          for (queue = 0; queue < save_queue; ++queue) {-            save_queue_test = 0;-            VFOR (index_v) {-              if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-                ++save_queue_test;-              } else {-                queue_v = index_v + queue * (LONG_INT) (*number_parameters);-                if (fabs-                    (current_generated_state->parameter[index_v] --                     save_queue_param[queue_v]) <=-                    (OPTIONS->Queue_Resolution[index_v] + EPS_DOUBLE)) {-                  ++save_queue_test;-                }-              }-            }-            if (save_queue_test == *number_parameters) {-              tmp_var_db = save_queue_cost[queue];-              *valid_state_generated_flag = save_queue_flag[queue];-              queue_new = 0;-              --(*number_generated);-#if ASA_PRINT_MORE-#if INT_LONG-              fprintf (ptr_asa_out, "ASA_QUEUE: %ld \t %*.*g\n",-                       OPTIONS->N_Generated,-                       G_FIELD, G_PRECISION, tmp_var_db);-#else-              fprintf (ptr_asa_out, "ASA_QUEUE: %d \t %*.*g\n",-                       OPTIONS->N_Generated,-                       G_FIELD, G_PRECISION, tmp_var_db);-#endif-#endif-              break;-            }-          }-        }-        if (queue_new == 1) {-          tmp_var_db =-            user_cost_function (current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum,-                                tangents,-                                curvature,-                                number_parameters,-                                parameter_type,-                                valid_state_generated_flag,-                                exit_status, OPTIONS);-          if (cost_function_test (tmp_var_db,-                                  current_generated_state->parameter,-                                  parameter_minimum,-                                  parameter_maximum,-                                  number_parameters,-                                  xnumber_parameters) == 0) {-            *exit_status = INVALID_COST_FUNCTION;-            goto EXIT_ASA;-          }-          if (OPTIONS->Queue_Size > 0) {        /* in case recursive use */-            VFOR (index_v) {-              if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-                continue;-              }-              queue_v = index_v + save_queue_indx-                * (LONG_INT) (*number_parameters);-              save_queue_param[queue_v] =-                current_generated_state->parameter[index_v];-            }-            save_queue_cost[save_queue_indx] = tmp_var_db;-            save_queue_flag[save_queue_indx]-              = *valid_state_generated_flag;--            ++save_queue;-            if (save_queue == (LONG_INT) OPTIONS->Queue_Size)-              --save_queue;--            ++save_queue_indx;-            if (save_queue_indx == (LONG_INT) OPTIONS->Queue_Size)-              save_queue_indx = 0;-          }-        }-#else /* ASA_QUEUE */-        tmp_var_db =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (tmp_var_db,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION;-          goto EXIT_ASA;-        }-#endif /* ASA_QUEUE */-        current_generated_state->cost = tmp_var_db;-        ++repeated_invalid_states;-        if (repeated_invalid_states > OPTIONS->Limit_Invalid_Generated_States) {-          *exit_status = TOO_MANY_INVALID_STATES;-          goto EXIT_ASA;-        }-      }-      while (*valid_state_generated_flag == FALSE);-      --(*number_invalid_generated_states);-#if ASA_PARALLEL-      gener_block_state[index_parallel].cost = current_generated_state->cost;-#if USER_ACCEPTANCE_TEST-      gener_block_state[index_parallel].par_user_accept_flag =-        OPTIONS->User_Acceptance_Flag;-      gener_block_state[index_parallel].par_cost_accept_flag =-        OPTIONS->Cost_Acceptance_Flag;-#endif-      VFOR (index_v) {-        /* ignore parameters with too small a range */-        if (PARAMETER_RANGE_TOO_SMALL (index_v))-          continue;-        gener_block_state[index_parallel].parameter[index_v] =-          current_generated_state->parameter[index_v];-      }-#if ASA_TEMPLATE_PARALLEL-    }-#endif /* ASA_TEMPLATE_PARALLEL */-    /* *** EXIT CODE SPAWNING OFF PARALLEL GENERATED STATES *** */-#endif /* ASA_PARALLEL */--    /* ACCEPT/REJECT NEW PARAMETERS */--#if ASA_PARALLEL-    for (sort_index = 0; sort_index < OPTIONS->Gener_Block; ++sort_index)-      parallel_sort[sort_index] = sort_index;-    qsort (parallel_sort, OPTIONS->Gener_Block, sizeof (LONG_INT),-           sort_parallel);--    for (sort_index = 0; sort_index < OPTIONS->Gener_Block; ++sort_index) {-      index_parallel = parallel_sort[sort_index];-      current_generated_state->cost = gener_block_state[index_parallel].cost;-#if USER_ACCEPTANCE_TEST-      OPTIONS->User_Acceptance_Flag =-        gener_block_state[index_parallel].par_user_accept_flag;-      OPTIONS->Cost_Acceptance_Flag =-        gener_block_state[index_parallel].par_cost_accept_flag;-#endif-      VFOR (index_v) {-        /* ignore parameters with too small a range */-        if (PARAMETER_RANGE_TOO_SMALL (index_v))-          continue;-        current_generated_state->parameter[index_v] =-          gener_block_state[index_parallel].parameter[index_v];-      }-#endif /* ASA_PARALLEL */-      /* decide to accept/reject the new state */-      accept_new_state (user_random_generator,-                        seed,-                        parameter_minimum,-                        parameter_maximum, current_cost_temperature,-#if ASA_SAMPLE-                        current_user_parameter_temp,-#endif-                        number_parameters,-                        recent_number_acceptances,-                        number_accepted,-                        index_cost_acceptances,-                        number_acceptances_saved,-                        recent_number_generated,-                        number_generated,-                        index_parameter_generations,-                        current_generated_state, last_saved_state,-#if ASA_SAMPLE-                        ptr_asa_out,-#endif-                        OPTIONS);--#if ASA_PARALLEL-#else-#if ASA_PIPE_FILE-#if INT_ALLOC-      fprintf (ptr_asa_pipe, "%d", *number_generated);-#else-#if INT_LONG-      fprintf (ptr_asa_pipe, "%ld", *number_generated);-#else-      fprintf (ptr_asa_pipe, "%d", *number_generated);-#endif-#endif-#if INT_ALLOC-      fprintf (ptr_asa_pipe, "\t%d", *number_accepted);-#else-#if INT_LONG-      fprintf (ptr_asa_pipe, "\t%ld", *number_accepted);-#else-      fprintf (ptr_asa_pipe, "\t%d", *number_accepted);-#endif-#endif-      fprintf (ptr_asa_pipe, "\t%g", best_generated_state->cost);-      VFOR (index_v)-        fprintf (ptr_asa_pipe, "\t%g",-                 best_generated_state->parameter[index_v]);-      fprintf (ptr_asa_pipe, "\t%g", *current_cost_temperature);-      VFOR (index_v)-        fprintf (ptr_asa_pipe, "\t%g", current_user_parameter_temp[index_v]);-      fprintf (ptr_asa_pipe, "\t%g", last_saved_state->cost);-      fprintf (ptr_asa_pipe, "\n");-      fflush (ptr_asa_pipe);-#endif /* ASA_PIPE_FILE */-#if INCL_STDOUT-#if ASA_PIPE-#if INT_ALLOC-      printf ("%d", *number_generated);-#else-#if INT_LONG-      printf ("%ld", *number_generated);-#else-      printf ("%d", *number_generated);-#endif-#endif-#if INT_ALLOC-      printf ("\t%d", *number_accepted);-#else-#if INT_LONG-      printf ("\t%ld", *number_accepted);-#else-      printf ("\t%d", *number_accepted);-#endif-#endif-      printf ("\t%g", best_generated_state->cost);-      VFOR (index_v)-        printf ("\t%g", best_generated_state->parameter[index_v]);-      printf ("\t%g", *current_cost_temperature);-      VFOR (index_v)-        printf ("\t%g", current_user_parameter_temp[index_v]);-      printf ("\n");-#endif /* ASA_PIPE */-#endif /* INCL_STDOUT */-#endif /* ASA_PARALLEL */--      /* calculate the ratio of acceptances to generated states */-      *accepted_to_generated_ratio =-        (double) (*recent_number_acceptances + 1) /-        (double) (*recent_number_generated + 1);--#if MULTI_MIN-      if (((OPTIONS->Multi_Specify == 0)-           && (current_generated_state->cost <= best_generated_state->cost))-          || ((OPTIONS->Multi_Specify == 1)-              && (current_generated_state->cost <-                  best_generated_state->cost))) {-#if ASA_RESOLUTION-        VFOR (index_v) {-          if (OPTIONS->Multi_Grid[index_v] <-              OPTIONS->Coarse_Resolution[index_v])-            OPTIONS->Multi_Grid[index_v] =-              OPTIONS->Coarse_Resolution[index_v];-        }-#endif /* ASA_RESOLUTION */-        VFOR (index_v) {-          if (OPTIONS->Multi_Grid[index_v] < EPS_DOUBLE)-            OPTIONS->Multi_Grid[index_v] = EPS_DOUBLE;-        }--        multi_test = 0;-        for (multi_index = 0; multi_index < OPTIONS->Multi_Number;-             ++multi_index) {-          multi_test_cmp = 0;-          multi_test_dim = 0;-          VFOR (index_v) {-            if (PARAMETER_RANGE_TOO_SMALL (index_v))-              continue;-            ++multi_test_dim;-            if (fabs (current_generated_state->parameter[index_v]-                      - OPTIONS->Multi_Params[multi_index][index_v])-                < OPTIONS->Multi_Grid[index_v])-              ++multi_test_cmp;-          }-          if (multi_test_cmp == multi_test_dim)-            multi_test = 1;-          if (OPTIONS->Multi_Specify == 1)-            break;-        }--        if (multi_test == 0) {-          multi_cost[OPTIONS->Multi_Number] = current_generated_state->cost;-          VFOR (index_v) {-            multi_params[OPTIONS->Multi_Number][index_v] =-              current_generated_state->parameter[index_v];-          }-          for (multi_index = 0; multi_index < OPTIONS->Multi_Number;-               ++multi_index) {-            multi_cost[multi_index] = OPTIONS->Multi_Cost[multi_index];-            VFOR (index_v) {-              multi_params[multi_index][index_v] =-                OPTIONS->Multi_Params[multi_index][index_v];-            }-          }--          qsort (multi_sort, OPTIONS->Multi_Number + 1, sizeof (int),-                 multi_compare);-          for (multi_index = 0; multi_index < OPTIONS->Multi_Number;-               ++multi_index) {-            OPTIONS->Multi_Cost[multi_index] =-              multi_cost[multi_sort[multi_index]];-            VFOR (index_v) {-              OPTIONS->Multi_Params[multi_index][index_v] =-                multi_params[multi_sort[multi_index]][index_v];-            }-          }-        }-      }-#endif /* MULTI_MIN */--      /* CHECK FOR NEW MINIMUM */--      if (current_generated_state->cost < best_generated_state->cost) {-        /* NEW MINIMUM FOUND */--        OPTIONS->Locate_Cost = -1;--        /* reset the recent acceptances and generated counts */-#if ASA_PARALLEL-        parallel_generated = *recent_number_generated;-#endif-        *recent_number_acceptances = *recent_number_generated = 0;-        *best_number_generated_saved = *number_generated;-        *best_number_accepted_saved = *number_accepted;-        index_cost_repeat = 0;--        /* copy the current state into the best_generated state */-        best_generated_state->cost = current_generated_state->cost;-        VFOR (index_v) {-#if DROPPED_PARAMETERS-          /* ignore parameters that have too small a range */-          if (PARAMETER_RANGE_TOO_SMALL (index_v))-            continue;-#endif-          best_generated_state->parameter[index_v] =-            current_generated_state->parameter[index_v];-        }--        /* printout the new minimum state and value */-#if ASA_PRINT-        fprintf (ptr_asa_out,-#if INT_LONG-                 "best...->cost=%-*.*g  \-*number_accepted=%ld  *number_generated=%ld\n", G_FIELD, G_PRECISION, best_generated_state->cost,-#else-                 "best...->cost=%-*.*g  \-*number_accepted=%d  *number_generated=%d\n", G_FIELD, G_PRECISION, best_generated_state->cost,-#endif /* INT_LONG */-                 *number_accepted, *number_generated);-#if ASA_PARALLEL-        /* print OPTIONS->Gener_Block just used */-        fprintf (ptr_asa_out,-#if INT_LONG-                 "OPTIONS->Gener_Block = %ld\n",-#else-                 "OPTIONS->Gener_Block = %d\n",-#endif /* INT_LONG */-                 OPTIONS->Gener_Block);-#endif /* ASA_PARALLEL */-#if ASA_PRINT_MORE-#if INT_ALLOC-        fprintf (ptr_asa_out, "Present Random Seed = %d\n\n", *seed);-#else-#if INT_LONG-        fprintf (ptr_asa_out, "Present Random Seed = %ld\n\n", *seed);-#else-        fprintf (ptr_asa_out, "Present Random Seed = %d\n\n", *seed);-#endif-#endif-        print_state (parameter_minimum,-                     parameter_maximum,-                     tangents,-                     curvature,-                     current_cost_temperature,-                     current_user_parameter_temp,-                     accepted_to_generated_ratio,-                     number_parameters,-                     curvature_flag,-                     number_accepted,-                     index_cost_acceptances,-                     number_generated,-                     number_invalid_generated_states,-                     last_saved_state,-                     best_generated_state, ptr_asa_out, OPTIONS);-#endif /* ASA_PRINT_MORE */-        fflush (ptr_asa_out);-#endif /* ASA_PRINT */--#if ASA_PARALLEL-        /* leave index_parallel loop after new minimum */-        break;-#endif /* ASA_PARALLEL */-      }-#if ASA_PARALLEL-    }-#endif /* ASA_PARALLEL */--#if ASA_PARALLEL-    if (OPTIONS->Gener_Mov_Avr > 0) {-      OPTIONS->Gener_Block = (LONG_INT)-        ((((double) OPTIONS->Gener_Mov_Avr - ONE)-          * (double) (OPTIONS->Gener_Block) + (double) parallel_generated)-         / (double) (OPTIONS->Gener_Mov_Avr));-      OPTIONS->Gener_Block = MIN (OPTIONS->Gener_Block, parallel_block_max);-    }-#endif /* ASA_PARALLEL */--#if ASA_SAVE-    /* These writes are put here with these tests, instead of just-       after a new best state is found, to prevent any confusion with-       any parallel code that might be added by users. */-    if (*recent_number_acceptances == 0-        && *recent_number_generated == 0-        && *best_number_generated_saved == *number_generated-        && *best_number_accepted_saved == *number_accepted-        && OPTIONS->Asa_Recursive_Level == asa_recursive_max-        && index_cost_repeat == 0) {-      if (OPTIONS->Asa_Recursive_Level > 0)-        sprintf (asa_save_comm, "asa_save_%d", OPTIONS->Asa_Recursive_Level);-      else-        sprintf (asa_save_comm, "asa_save");-      ptr_save = fopen (asa_save_comm, "w");--      fwrite (number_parameters, sizeof (ALLOC_INT), 1, ptr_save);-      fwrite (xnumber_parameters, sizeof (double), 1, ptr_save);-      fwrite (parameter_minimum, sizeof (double),-              *number_parameters, ptr_save);-      fwrite (parameter_maximum, sizeof (double),-              *number_parameters, ptr_save);-      fwrite (tangents, sizeof (double), *number_parameters, ptr_save);-      fwrite (current_user_parameter_temp, sizeof (double),-              *number_parameters, ptr_save);-      fwrite (initial_user_parameter_temp, sizeof (double),-              *number_parameters, ptr_save);-      fwrite (temperature_scale_parameters, sizeof (double),-              *number_parameters, ptr_save);--      fwrite (parameter_type, sizeof (int), *number_parameters, ptr_save);-      fwrite (&index_cost_repeat, sizeof (int), 1, ptr_save);-      fwrite (&asa_open, sizeof (int), 1, ptr_save);-      fwrite (&number_asa_open, sizeof (int), 1, ptr_save);-      fwrite (&recursive_asa_open, sizeof (int), 1, ptr_save);--      fwrite (current_cost_temperature, sizeof (double), 1, ptr_save);-      fwrite (initial_cost_temperature, sizeof (double), 1, ptr_save);-      fwrite (temperature_scale_cost, sizeof (double), 1, ptr_save);-      fwrite (accepted_to_generated_ratio, sizeof (double), 1, ptr_save);--      fwrite (curvature_flag, sizeof (int), 1, ptr_save);--      fwrite (seed, sizeof (LONG_INT), 1, ptr_save);-      fwrite (number_generated, sizeof (LONG_INT), 1, ptr_save);-      fwrite (number_accepted, sizeof (LONG_INT), 1, ptr_save);-      fwrite (number_acceptances_saved, sizeof (LONG_INT), 1, ptr_save);-      fwrite (recent_number_acceptances, sizeof (LONG_INT), 1, ptr_save);-      fwrite (recent_number_generated, sizeof (LONG_INT), 1, ptr_save);-      fwrite (number_invalid_generated_states, sizeof (LONG_INT),-              1, ptr_save);-      fwrite (index_cost_acceptances, sizeof (LONG_INT), 1, ptr_save);-      fwrite (best_number_generated_saved, sizeof (LONG_INT), 1, ptr_save);-      fwrite (best_number_accepted_saved, sizeof (LONG_INT), 1, ptr_save);--      fwrite (index_parameter_generations, sizeof (LONG_INT),-              *number_parameters, ptr_save);--      fwrite (current_generated_state->parameter,-              sizeof (double), *number_parameters, ptr_save);-      fwrite (last_saved_state->parameter,-              sizeof (double), *number_parameters, ptr_save);-      fwrite (best_generated_state->parameter,-              sizeof (double), *number_parameters, ptr_save);-      fwrite (&(current_generated_state->cost), sizeof (double), 1, ptr_save);-      fwrite (&(last_saved_state->cost), sizeof (double), 1, ptr_save);-      fwrite (&(best_generated_state->cost), sizeof (double), 1, ptr_save);--      fwrite (&(OPTIONS->Limit_Acceptances), sizeof (LONG_INT), 1, ptr_save);-      fwrite (&(OPTIONS->Limit_Generated), sizeof (LONG_INT), 1, ptr_save);-      fwrite (&(OPTIONS->Limit_Invalid_Generated_States), sizeof (int),-              1, ptr_save);-      fwrite (&(OPTIONS->Accepted_To_Generated_Ratio), sizeof (double),-              1, ptr_save);-      fwrite (&(OPTIONS->Cost_Precision), sizeof (double), 1, ptr_save);-      fwrite (&(OPTIONS->Maximum_Cost_Repeat), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Number_Cost_Samples), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Temperature_Ratio_Scale), sizeof (double),-              1, ptr_save);-      fwrite (&(OPTIONS->Cost_Parameter_Scale_Ratio), sizeof (double),-              1, ptr_save);-      fwrite (&(OPTIONS->Temperature_Anneal_Scale), sizeof (double),-              1, ptr_save);-      fwrite (&(OPTIONS->Include_Integer_Parameters), sizeof (int),-              1, ptr_save);-      fwrite (&(OPTIONS->User_Initial_Parameters), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Sequential_Parameters), sizeof (ALLOC_INT), 1,-              ptr_save);-      fwrite (&(OPTIONS->Initial_Parameter_Temperature), sizeof (double), 1,-              ptr_save);-      fwrite (&(OPTIONS->Acceptance_Frequency_Modulus), sizeof (int), 1,-              ptr_save);-      fwrite (&(OPTIONS->Generated_Frequency_Modulus), sizeof (int), 1,-              ptr_save);-      fwrite (&(OPTIONS->Reanneal_Cost), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Reanneal_Parameters), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Delta_X), sizeof (double), 1, ptr_save);-      fwrite (&(OPTIONS->User_Tangents), sizeof (int), 1, ptr_save);--#if USER_INITIAL_COST_TEMP-      fwrite (&(OPTIONS->User_Cost_Temperature), sizeof (double),-              1, ptr_save);-#endif-#if RATIO_TEMPERATURE_SCALES-      fwrite (OPTIONS->User_Temperature_Ratio, sizeof (double),-              *number_parameters, ptr_save);-#endif-#if USER_INITIAL_PARAMETERS_TEMPS-      fwrite (OPTIONS->User_Parameter_Temperature, sizeof (double),-              *number_parameters, ptr_save);-#endif-#if DELTA_PARAMETERS-      fwrite (OPTIONS->User_Delta_Parameter, sizeof (double),-              *number_parameters, ptr_save);-#endif-#if QUENCH_PARAMETERS-      fwrite (OPTIONS->User_Quench_Param_Scale, sizeof (double),-              *number_parameters, ptr_save);-#endif-#if QUENCH_COST-      fwrite (OPTIONS->User_Quench_Cost_Scale, sizeof (double), 1, ptr_save);-#endif-      fwrite (&(OPTIONS->N_Accepted), sizeof (LONG_INT), 1, ptr_save);-      fwrite (&(OPTIONS->N_Generated), sizeof (LONG_INT), 1, ptr_save);-      fwrite (&(OPTIONS->Locate_Cost), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Immediate_Exit), sizeof (int), 1, ptr_save);-#if OPTIONAL_DATA_DBL-      fwrite (&(OPTIONS->Asa_Data_Dim_Dbl), sizeof (ALLOC_INT), 1, ptr_save);-      fwrite (OPTIONS->Asa_Data_Dbl, sizeof (double),-              OPTIONS->Asa_Data_Dim_Dbl, ptr_save);-#endif-      fwrite (&(OPTIONS->Random_Array_Dim), sizeof (ALLOC_INT), 1, ptr_save);-      fwrite (OPTIONS->Random_Array, sizeof (double),-              OPTIONS->Random_Array_Dim, ptr_save);-      fwrite (&(OPTIONS->Asa_Recursive_Level), sizeof (int), 1, ptr_save);-#if OPTIONAL_DATA_INT-      fwrite (&(OPTIONS->Asa_Data_Dim_Int), sizeof (ALLOC_INT), 1, ptr_save);-      fwrite (OPTIONS->Asa_Data_Int, sizeof (LONG_INT),-              OPTIONS->Asa_Data_Dim_Int, ptr_save);-#endif-#if OPTIONAL_DATA_PTR-      fwrite (&(OPTIONS->Asa_Data_Dim_Ptr), sizeof (ALLOC_INT), 1, ptr_save);-      if (OPTIONS->Asa_Recursive_Level == 0)-        fwrite (OPTIONS->Asa_Data_Ptr, sizeof (OPTIONAL_PTR_TYPE),-                OPTIONS->Asa_Data_Dim_Ptr, ptr_save);-#if ASA_TEMPLATE_SELFOPT-      if (OPTIONS->Asa_Recursive_Level == 1)-        fwrite (OPTIONS->Asa_Data_Ptr, sizeof (RECUR_OPTIONAL_PTR_TYPE),-                OPTIONS->Asa_Data_Dim_Ptr, ptr_save);-#endif-#endif-#if USER_ASA_OUT-      fwrite (OPTIONS->Asa_Out_File, sizeof (char), 1, ptr_save);-#endif-#if USER_COST_SCHEDULE-      fwrite (&(OPTIONS->Cost_Schedule), sizeof (char), 1, ptr_save);-#endif-#if USER_ACCEPT_ASYMP_EXP-      fwrite (&(OPTIONS->Asymp_Exp_Param), sizeof (double), 1, ptr_save);-#endif-#if USER_ACCEPTANCE_TEST-      fwrite (&(OPTIONS->Acceptance_Test), sizeof (char), 1, ptr_save);-      fwrite (&(OPTIONS->User_Acceptance_Flag), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Cost_Acceptance_Flag), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Cost_Temp_Curr), sizeof (double), 1, ptr_save);-      fwrite (&(OPTIONS->Cost_Temp_Init), sizeof (double), 1, ptr_save);-      fwrite (&(OPTIONS->Cost_Temp_Scale), sizeof (double), 1, ptr_save);-#endif-#if USER_GENERATING_FUNCTION-      fwrite (&(OPTIONS->Generating_Distrib), sizeof (char), 1, ptr_save);-#endif-#if USER_REANNEAL_COST-      fwrite (&(OPTIONS->Reanneal_Cost_Function), sizeof (char), 1, ptr_save);-#endif-#if USER_REANNEAL_PARAMETERS-      fwrite (&(OPTIONS->Reanneal_Params_Function), sizeof (char),-              1, ptr_save);-#endif-#if ASA_SAMPLE-      fwrite (&(OPTIONS->Bias_Acceptance), sizeof (double), 1, ptr_save);-      fwrite (OPTIONS->Bias_Generated, sizeof (double),-              *number_parameters, ptr_save);-      fwrite (&(OPTIONS->Average_Weights), sizeof (double), 1, ptr_save);-      fwrite (&(OPTIONS->Limit_Weights), sizeof (double), 1, ptr_save);-#endif-#if ASA_QUEUE-      fwrite (save_queue, sizeof (LONG_INT), 1, ptr_save);-      fwrite (save_queue_indx, sizeof (LONG_INT), 1, ptr_save);-      fwrite (&(OPTIONS->Queue_Size), sizeof (ALLOC_INT), 1, ptr_save);-      fwrite (save_queue_flag, sizeof (int), save_queue, ptr_save);-      fwrite (save_queue_cost, sizeof (double), save_queue, ptr_save);-      fwrite (save_queue_param, sizeof (double),-              (*number_parameters) * (OPTIONS->Queue_Size), ptr_save);-#if ASA_RESOLUTION-#else-      fwrite (OPTIONS->Queue_Resolution, sizeof (double),-              *number_parameters, ptr_save);-#endif-#endif-#if ASA_RESOLUTION-      fwrite (OPTIONS->Coarse_Resolution, sizeof (double),-              *number_parameters, ptr_save);-#endif-#if FITLOC-      fwrite (&(OPTIONS->Fit_Local), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Iter_Max), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Penalty), sizeof (double), 1, ptr_save);-#endif-#if MULTI_MIN-      fwrite (OPTIONS->Multi_Number, sizeof (int), 1, ptr_save);-      fwrite (OPTIONS->Multi_Grid,-              sizeof (double), *number_parameters, ptr_save);-      fwrite (&(OPTIONS->Multi_Specify), sizeof (int), 1, ptr_save);-      for (multi_index = 0; multi_index < OPTIONS->Multi_Number;-           ++multi_index) {-        fwrite (&(OPTIONS->Multi_Cost[multi_index]), sizeof (double), 1,-                ptr_save);-        fwrite (&(OPTIONS->Multi_Params[multi_index]), sizeof (double),-                *number_parameters, ptr_save);-      }-#endif-#if ASA_PARALLEL-      fwrite (&parallel_generated, sizeof (LONG_INT), 1, ptr_save);-      fwrite (&parallel_block_max, sizeof (LONG_INT), 1, ptr_save);-      for (index_parallel = 0; index_parallel < parallel_block_max;-           ++index_parallel) {-        fwrite (gener_block_state[index_parallel].parameter,-                sizeof (double), *number_parameters, ptr_save);-        fwrite (&(gener_block_state[index_parallel].cost),-                sizeof (double), 1, ptr_save);-#if USER_ACCEPTANCE_TEST-        fwrite (&-                (gener_block_state[index_parallel].-                 par_user_accept_flag), sizeof (int), 1, ptr_save);-        fwrite (&-                (gener_block_state[index_parallel].-                 par_cost_accept_flag), sizeof (int), 1, ptr_save);-#endif-      }-      fwrite (&(OPTIONS->Gener_Mov_Avr), sizeof (int), 1, ptr_save);-      fwrite (&(OPTIONS->Gener_Block), sizeof (LONG_INT), 1, ptr_save);-      fwrite (&(OPTIONS->Gener_Block_Max), sizeof (LONG_INT), 1, ptr_save);-#endif--      fclose (ptr_save);--    SAVED_ASA:-      ;--#if SYSTEM_CALL-#if ASA_SAVE_BACKUP-#if INT_LONG-      if (OPTIONS->Asa_Recursive_Level > 0)-        sprintf (asa_save_comm, "/bin/cp asa_save_%d asa_save_%d.%ld",-                 OPTIONS->Asa_Recursive_Level,-                 OPTIONS->Asa_Recursive_Level, OPTIONS->N_Accepted);-      else-        sprintf (asa_save_comm, "/bin/cp asa_save asa_save.%ld",-                 OPTIONS->N_Accepted);-#else-      if (OPTIONS->Asa_Recursive_Level > 0)-        sprintf (asa_save_comm, "/bin/cp asa_save_%d asa_save_%d.%d",-                 OPTIONS->Asa_Recursive_Level,-                 OPTIONS->Asa_Recursive_Level, OPTIONS->N_Accepted);-      else-        sprintf (asa_save_comm, "/bin/cp asa_save asa_save.%d",-                 OPTIONS->N_Accepted);-#endif-      ptr_comm = popen (asa_save_comm, "r");-      pclose (ptr_comm);-#else /* ASA_SAVE_BACKUP */-      /* extra protection in case run aborts during write */-      if (OPTIONS->Asa_Recursive_Level > 0)-        sprintf (asa_save_comm, "/bin/cp asa_save_%d asa_save_%d.old",-                 OPTIONS->Asa_Recursive_Level, OPTIONS->Asa_Recursive_Level);-      else-        sprintf (asa_save_comm, "/bin/cp asa_save asa_save.old");-      ptr_comm = popen (asa_save_comm, "r");-      pclose (ptr_comm);-#endif /* ASA_SAVE_BACKUP */-#endif /* SYSTEM_CALL */-    }-#endif /* ASA_SAVE */--    if (OPTIONS->Immediate_Exit == TRUE) {-      *exit_status = IMMEDIATE_EXIT;-      goto EXIT_ASA;-    }--    /* PERIODIC TESTING/REANNEALING/PRINTING SECTION */--    if (OPTIONS->Acceptance_Frequency_Modulus == 0)-      tmp_var_int1 = FALSE;-    else if ((int) (*number_accepted %-                    ((LONG_INT) OPTIONS->Acceptance_Frequency_Modulus)) == 0-             && *number_acceptances_saved == *number_accepted)-      tmp_var_int1 = TRUE;-    else-      tmp_var_int1 = FALSE;--    if (OPTIONS->Generated_Frequency_Modulus == 0)-      tmp_var_int2 = FALSE;-    else if ((int) (*number_generated %-                    ((LONG_INT) OPTIONS->Generated_Frequency_Modulus)) == 0)-      tmp_var_int2 = TRUE;-    else-      tmp_var_int2 = FALSE;--    if (tmp_var_int1 == TRUE || tmp_var_int2 == TRUE-        || (*accepted_to_generated_ratio-            < OPTIONS->Accepted_To_Generated_Ratio)) {-      if (*accepted_to_generated_ratio-          < (OPTIONS->Accepted_To_Generated_Ratio))-        *recent_number_acceptances = *recent_number_generated = 0;--      /* if best.cost repeats OPTIONS->Maximum_Cost_Repeat then exit */-      if (OPTIONS->Maximum_Cost_Repeat != 0) {-        if (fabs (last_saved_state->cost - best_generated_state->cost)-            < OPTIONS->Cost_Precision) {-          ++index_cost_repeat;-          if (index_cost_repeat == (OPTIONS->Maximum_Cost_Repeat)) {-            *exit_status = COST_REPEATING;-            goto EXIT_ASA;-          }-        } else {-          index_cost_repeat = 0;-        }-      }--      if (OPTIONS->Reanneal_Parameters == TRUE) {-        OPTIONS->Locate_Cost = 3;       /* reanneal parameters */--        /* calculate tangents, not curvatures, to reanneal */-        *curvature_flag = FALSE;-        cost_derivatives (user_cost_function,-                          parameter_minimum,-                          parameter_maximum,-                          tangents,-                          curvature,-                          maximum_tangent,-                          number_parameters,-                          parameter_type,-                          exit_status,-                          curvature_flag,-                          valid_state_generated_flag,-                          number_invalid_generated_states,-                          current_generated_state,-                          best_generated_state, ptr_asa_out, OPTIONS);-        if (*exit_status == INVALID_COST_FUNCTION_DERIV) {-          goto EXIT_ASA;-        }-      }-#if USER_REANNEAL_COST-#else-      if (OPTIONS->Reanneal_Cost == 0 || OPTIONS->Reanneal_Cost == 1) {-        ;-      } else {-        immediate_flag = OPTIONS->Immediate_Exit;--        if (OPTIONS->Reanneal_Cost < -1) {-          tmp_var_int = -OPTIONS->Reanneal_Cost;-        } else {-          tmp_var_int = OPTIONS->Reanneal_Cost;-        }-        tmp_var_db1 = ZERO;-        tmp_var_db2 = ZERO;--        for (index_cost_constraint = 0;-             index_cost_constraint < tmp_var_int; ++index_cost_constraint) {-          OPTIONS->Locate_Cost = 4;     /* reanneal cost */--          *number_invalid_generated_states = 0;-          repeated_invalid_states = 0;-          OPTIONS->Sequential_Parameters = *start_sequence - 1;-          do {-            ++(*number_invalid_generated_states);-            generate_new_state (user_random_generator,-                                seed,-                                parameter_minimum,-                                parameter_maximum,-                                current_user_parameter_temp,-#if USER_GENERATING_FUNCTION-                                initial_user_parameter_temp,-                                temperature_scale_parameters,-#endif-                                number_parameters,-                                parameter_type,-                                current_generated_state,-                                last_saved_state, OPTIONS);-            *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-            OPTIONS->User_Acceptance_Flag = TRUE;-            OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif--#if ASA_QUEUE-            if (OPTIONS->Queue_Size == 0) {-              queue_new = 1;-            } else {-              queue_new = 1;-              for (queue = 0; queue < save_queue; ++queue) {-                save_queue_test = 0;-                VFOR (index_v) {-                  if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-                    ++save_queue_test;-                  } else {-                    queue_v = index_v + queue-                      * (LONG_INT) (*number_parameters);-                    if (fabs-                        (current_generated_state->-                         parameter[index_v] --                         save_queue_param[queue_v]) <-                        (OPTIONS->Queue_Resolution[index_v] + EPS_DOUBLE)) {-                      ++save_queue_test;-                    }-                  }-                }-                if (save_queue_test == *number_parameters) {-                  tmp_var_db = save_queue_cost[queue];-                  *valid_state_generated_flag = save_queue_flag[queue];-                  queue_new = 0;-#if ASA_PRINT_MORE-#if INT_LONG-                  fprintf (ptr_asa_out,-                           "ASA_QUEUE: %ld \t %*.*g\n",-                           OPTIONS->N_Generated, G_FIELD,-                           G_PRECISION, tmp_var_db);-#else-                  fprintf (ptr_asa_out,-                           "ASA_QUEUE: %d \t %*.*g\n",-                           OPTIONS->N_Generated, G_FIELD,-                           G_PRECISION, tmp_var_db);-#endif-#endif-                  break;-                }-              }-            }-            if (queue_new == 1) {-              tmp_var_db =-                user_cost_function (current_generated_state->-                                    parameter, parameter_minimum,-                                    parameter_maximum, tangents,-                                    curvature, number_parameters,-                                    parameter_type,-                                    valid_state_generated_flag,-                                    exit_status, OPTIONS);-              if (cost_function_test-                  (tmp_var_db, current_generated_state->parameter,-                   parameter_minimum, parameter_maximum,-                   number_parameters, xnumber_parameters) == 0) {-                *exit_status = INVALID_COST_FUNCTION;-                goto EXIT_ASA;-              }-              if (OPTIONS->Queue_Size > 0) {-                VFOR (index_v) {-                  if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-                    continue;-                  }-                  queue_v = index_v + save_queue-                    * (LONG_INT) (*number_parameters);-                  save_queue_param[queue_v] =-                    current_generated_state->parameter[index_v];-                }-                save_queue_cost[save_queue] = tmp_var_db;-                save_queue_flag[save_queue]-                  = *valid_state_generated_flag;--                ++save_queue;-                if (save_queue == (LONG_INT) OPTIONS->Queue_Size)-                  --save_queue;--                ++save_queue_indx;-                if (save_queue_indx == (LONG_INT) OPTIONS->Queue_Size)-                  save_queue_indx = 0;-              }-            }-#else /* ASA_QUEUE */-            tmp_var_db =-              user_cost_function (current_generated_state->-                                  parameter, parameter_minimum,-                                  parameter_maximum, tangents,-                                  curvature, number_parameters,-                                  parameter_type,-                                  valid_state_generated_flag,-                                  exit_status, OPTIONS);-            if (cost_function_test-                (tmp_var_db, current_generated_state->parameter,-                 parameter_minimum, parameter_maximum,-                 number_parameters, xnumber_parameters) == 0) {-              *exit_status = INVALID_COST_FUNCTION;-              goto EXIT_ASA;-            }-#endif /* ASA_QUEUE */-            ++repeated_invalid_states;-            if (repeated_invalid_states >-                OPTIONS->Limit_Invalid_Generated_States) {-              *exit_status = TOO_MANY_INVALID_STATES;-              goto EXIT_ASA;-            }-          }-          while (*valid_state_generated_flag == FALSE);-          --(*number_invalid_generated_states);--          tmp_var_db1 += tmp_var_db;-          tmp_var_db2 += (tmp_var_db * tmp_var_db);-        }-        tmp_var_db1 /= (double) tmp_var_int;-        tmp_var_db2 /= (double) tmp_var_int;-        tmp_var_db =-          sqrt (fabs-                ((tmp_var_db2 --                  tmp_var_db1 * tmp_var_db1) * ((double) tmp_var_int /-                                                ((double) tmp_var_int --                                                 ONE))));-        if (OPTIONS->Reanneal_Cost < -1) {-          *current_cost_temperature = *initial_cost_temperature =-            tmp_var_db + (double) EPS_DOUBLE;-        } else {-          *initial_cost_temperature = tmp_var_db + (double) EPS_DOUBLE;-        }-        OPTIONS->Immediate_Exit = immediate_flag;-      }-#endif /* USER_REANNEAL_COST */--      reanneal (parameter_minimum,-                parameter_maximum,-                tangents,-                maximum_tangent,-                current_cost_temperature,-                initial_cost_temperature,-                temperature_scale_cost,-                current_user_parameter_temp,-                initial_user_parameter_temp,-                temperature_scale_parameters,-                number_parameters,-                parameter_type,-                index_cost_acceptances,-                index_parameter_generations,-                last_saved_state, best_generated_state, OPTIONS);-#if ASA_PRINT_INTERMED-#if ASA_PRINT-      print_state (parameter_minimum,-                   parameter_maximum,-                   tangents,-                   curvature,-                   current_cost_temperature,-                   current_user_parameter_temp,-                   accepted_to_generated_ratio,-                   number_parameters,-                   curvature_flag,-                   number_accepted,-                   index_cost_acceptances,-                   number_generated,-                   number_invalid_generated_states,-                   last_saved_state,-                   best_generated_state, ptr_asa_out, OPTIONS);--      fprintf (ptr_asa_out, "\n");-      fflush (ptr_asa_out);-#endif-#endif-    }-  }--  /* FINISHED ANNEALING and MINIMIZATION */--  *exit_status = NORMAL_EXIT;-EXIT_ASA:--  asa_exit_value = asa_exit (user_cost_function,-                             &final_cost,-                             parameter_initial_final,-                             parameter_minimum,-                             parameter_maximum,-                             tangents,-                             curvature,-                             maximum_tangent,-                             current_cost_temperature,-                             initial_user_parameter_temp,-                             current_user_parameter_temp,-                             accepted_to_generated_ratio,-                             number_parameters,-                             parameter_type,-                             valid_state_generated_flag,-                             exit_status,-                             index_exit_v,-                             start_sequence,-                             number_accepted,-                             best_number_accepted_saved,-                             index_cost_acceptances,-                             number_generated,-                             number_invalid_generated_states,-                             index_parameter_generations,-                             best_number_generated_saved,-                             current_generated_state,-                             last_saved_state,-                             best_generated_state, ptr_asa_out, OPTIONS);-  if (asa_exit_value == 9) {-    *exit_status = CALLOC_FAILED;-    return (-1);-  }--  free (curvature_flag);-  free (maximum_tangent);-  free (accepted_to_generated_ratio);-  free (temperature_scale_cost);-  free (current_cost_temperature);-  free (initial_cost_temperature);-  free (number_generated);-  free (best_number_generated_saved);-  free (recent_number_generated);-  free (number_accepted);-  free (recent_number_acceptances);-  free (index_cost_acceptances);-  free (number_acceptances_saved);-  free (best_number_accepted_saved);-  free (number_invalid_generated_states);-  free (current_generated_state->parameter);-  free (last_saved_state->parameter);-  free (best_generated_state->parameter);-  free (current_generated_state);-  free (last_saved_state);-  free (best_generated_state);-#if ASA_QUEUE-  free (save_queue_flag);-  free (save_queue_cost);-  free (save_queue_param);-#endif-#if MULTI_MIN-  for (multi_index = 0; multi_index <= OPTIONS->Multi_Number; ++multi_index)-    free (multi_params[multi_index]);-  free (multi_params);-  free (multi_sort);-  free (multi_cost);-#endif-#if ASA_PARALLEL-  for (index_parallel = 0; index_parallel < parallel_block_max;-       ++index_parallel) {-    free (gener_block_state[index_parallel].parameter);-  }-  free (gener_block_state);-  free (parallel_sort);-#endif-#if ASA_PIPE_FILE-  fclose (ptr_asa_pipe);-#endif-  free (initial_user_parameter_temp);-  free (index_exit_v);-  free (start_sequence);-  free (index_parameter_generations);-  free (current_user_parameter_temp);-  free (temperature_scale_parameters);-  if (recursive_asa_open == 0)-    asa_open = FALSE;-  return (final_cost);-}--/***********************************************************************-* asa_exit-*	This procedures copies the best parameters and cost into-*       final_cost and parameter_initial_final-***********************************************************************/-#if HAVE_ANSI-int-asa_exit (double (*user_cost_function)--           -          (double *, double *, double *, double *, double *, ALLOC_INT *,-           int *, int *, int *, USER_DEFINES *), double *final_cost,-          double *parameter_initial_final, double *parameter_minimum,-          double *parameter_maximum, double *tangents, double *curvature,-          double *maximum_tangent, double *current_cost_temperature,-          double *initial_user_parameter_temp,-          double *current_user_parameter_temp,-          double *accepted_to_generated_ratio,-          ALLOC_INT * number_parameters, int *parameter_type,-          int *valid_state_generated_flag, int *exit_status,-          ALLOC_INT * index_exit_v, ALLOC_INT * start_sequence,-          LONG_INT * number_accepted,-          LONG_INT * best_number_accepted_saved,-          LONG_INT * index_cost_acceptances, LONG_INT * number_generated,-          LONG_INT * number_invalid_generated_states,-          LONG_INT * index_parameter_generations,-          LONG_INT * best_number_generated_saved,-          STATE * current_generated_state, STATE * last_saved_state,-          STATE * best_generated_state, FILE * ptr_asa_out,-          USER_DEFINES * OPTIONS)-#else-int--asa_exit (user_cost_function,-          final_cost,-          parameter_initial_final,-          parameter_minimum,-          parameter_maximum,-          tangents,-          curvature,-          maximum_tangent,-          current_cost_temperature,-          initial_user_parameter_temp,-          current_user_parameter_temp,-          accepted_to_generated_ratio,-          number_parameters,-          parameter_type,-          valid_state_generated_flag,-          exit_status,-          index_exit_v,-          start_sequence,-          number_accepted,-          best_number_accepted_saved,-          index_cost_acceptances,-          number_generated,-          number_invalid_generated_states,-          index_parameter_generations,-          best_number_generated_saved,-          current_generated_state,-          last_saved_state, best_generated_state, ptr_asa_out, OPTIONS)-     double (*user_cost_function) ();-     double *final_cost;-     double *parameter_initial_final;-     double *parameter_minimum;-     double *parameter_maximum;-     double *tangents;-     double *curvature;-     double *maximum_tangent;-     double *current_cost_temperature;-     double *initial_user_parameter_temp;-     double *current_user_parameter_temp;-     double *accepted_to_generated_ratio;-     ALLOC_INT *number_parameters;-     int *parameter_type;-     int *valid_state_generated_flag;-     int *exit_status;-     ALLOC_INT *index_exit_v;-     ALLOC_INT *start_sequence;-     LONG_INT *number_accepted;-     LONG_INT *best_number_accepted_saved;-     LONG_INT *index_cost_acceptances;-     LONG_INT *number_generated;-     LONG_INT *number_invalid_generated_states;-     LONG_INT *index_parameter_generations;-     LONG_INT *best_number_generated_saved;-     STATE *current_generated_state;-     STATE *last_saved_state;-     STATE *best_generated_state;-     FILE *ptr_asa_out;-     USER_DEFINES *OPTIONS;-#endif-{-  ALLOC_INT index_v;            /* iteration index */-  int curvatureFlag;-  int exit_exit_status, tmp_locate;-#if MULTI_MIN-  int multi_index;-#endif--  tmp_locate = OPTIONS->Locate_Cost;--  /* return final function minimum and associated parameters */-  *final_cost = best_generated_state->cost;-  VFOR (index_v) {-    parameter_initial_final[index_v] =-      best_generated_state->parameter[index_v];-  }--  OPTIONS->N_Accepted = *best_number_accepted_saved;-  OPTIONS->N_Generated = *best_number_generated_saved;--#if MULTI_MIN-  for (multi_index = 0; multi_index < OPTIONS->Multi_Number; ++multi_index) {-    best_generated_state->cost = OPTIONS->Multi_Cost[multi_index];-    VFOR (index_v) {-      best_generated_state->parameter[index_v] =-        OPTIONS->Multi_Params[multi_index][index_v];-    }-#if ASA_PRINT-    fprintf (ptr_asa_out, "\n\t\t multi_index = %d\n", multi_index);-#endif /* ASA_PRINT */-#endif /* MULTI_MIN */-    if (*exit_status != TOO_MANY_INVALID_STATES-        && *exit_status != IMMEDIATE_EXIT-        && *exit_status != INVALID_USER_INPUT-        && *exit_status != INVALID_COST_FUNCTION-        && *exit_status != INVALID_COST_FUNCTION_DERIV) {-      if (OPTIONS->Curvature_0 != TRUE)-        OPTIONS->Locate_Cost = 5;       /* calc curvatures while exiting asa */--      /* calculate curvatures and tangents at best point */-      curvatureFlag = TRUE;-      cost_derivatives (user_cost_function,-                        parameter_minimum,-                        parameter_maximum,-                        tangents,-                        curvature,-                        maximum_tangent,-                        number_parameters,-                        parameter_type,-                        &exit_exit_status,-                        &curvatureFlag,-                        valid_state_generated_flag,-                        number_invalid_generated_states,-                        current_generated_state,-                        best_generated_state, ptr_asa_out, OPTIONS);-    }-#if ASA_PRINT-    if (exit_exit_status == INVALID_COST_FUNCTION_DERIV)-      fprintf (ptr_asa_out, "\n\n  in asa_exit: INVALID_COST_FUNCTION_DERIV");--    if (*exit_status != INVALID_USER_INPUT-        && *exit_status != INVALID_COST_FUNCTION-        && *exit_status != INVALID_COST_FUNCTION_DERIV)-      print_state (parameter_minimum,-                   parameter_maximum,-                   tangents,-                   curvature,-                   current_cost_temperature,-                   current_user_parameter_temp,-                   accepted_to_generated_ratio,-                   number_parameters,-                   &curvatureFlag,-                   number_accepted,-                   index_cost_acceptances,-                   number_generated,-                   number_invalid_generated_states,-                   last_saved_state,-                   best_generated_state, ptr_asa_out, OPTIONS);-#endif /* ASA_PRINT */--#if MULTI_MIN-  }-  best_generated_state->cost = OPTIONS->Multi_Cost[0];-  VFOR (index_v) {-    best_generated_state->parameter[index_v] =-      OPTIONS->Multi_Params[0][index_v];-  }-#endif /* MULTI_MIN */--#if ASA_PRINT-  switch (*exit_status) {-  case NORMAL_EXIT:-    fprintf (ptr_asa_out,-             "\n\n NORMAL_EXIT exit_status = %d\n", *exit_status);-    break;-  case P_TEMP_TOO_SMALL:-    fprintf (ptr_asa_out,-             "\n\n P_TEMP_TOO_SMALL exit_status = %d\n", *exit_status);-    fprintf (ptr_asa_out,-#if INT_ALLOC-             "current_user_parameter_temp[%d] too small = %*.*g\n",-#else-#if INT_LONG-             "current_user_parameter_temp[%ld] too small = %*.*g\n",-#else-             "current_user_parameter_temp[%d] too small = %*.*g\n",-#endif-#endif-             *index_exit_v,-             G_FIELD, G_PRECISION,-             current_user_parameter_temp[*index_exit_v]);-    break;-  case C_TEMP_TOO_SMALL:-    fprintf (ptr_asa_out,-             "\n\n C_TEMP_TOO_SMALL exit_status = %d\n", *exit_status);-    fprintf (ptr_asa_out,-             "*current_cost_temperature too small = %*.*g\n",-             G_FIELD, G_PRECISION, *current_cost_temperature);-    break;-  case COST_REPEATING:-    fprintf (ptr_asa_out,-             "\n\n COST_REPEATING exit_status = %d\n", *exit_status);-    break;-  case TOO_MANY_INVALID_STATES:-    fprintf (ptr_asa_out,-             "\n\n  TOO_MANY_INVALID_STATES exit_status = %d\n",-             *exit_status);-    break;-  case IMMEDIATE_EXIT:-    fprintf (ptr_asa_out,-             "\n\n  IMMEDIATE_EXIT exit_status = %d\n", *exit_status);-    break;-  case INVALID_USER_INPUT:-    fprintf (ptr_asa_out,-             "\n\n  INVALID_USER_INPUT exit_status = %d\n", *exit_status);-    break;-  case INVALID_COST_FUNCTION:-    fprintf (ptr_asa_out,-             "\n\n  INVALID_COST_FUNCTION exit_status = %d\n", *exit_status);-    break;-  case INVALID_COST_FUNCTION_DERIV:-    fprintf (ptr_asa_out,-             "\n\n  INVALID_COST_FUNCTION_DERIV exit_status = %d\n",-             *exit_status);-    break;-  default:-    fprintf (ptr_asa_out, "\n\n ERR: no exit code available = %d\n",-             *exit_status);-  }--  switch (OPTIONS->Locate_Cost) {-  case 0:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, initial cost temperature\n",-             OPTIONS->Locate_Cost);-    break;-  case 1:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, initial cost value\n", OPTIONS->Locate_Cost);-    break;-  case 2:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, new generated state\n",-             OPTIONS->Locate_Cost);-    break;-  case 12:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, new generated state just after a new best state\n",-             OPTIONS->Locate_Cost);-    break;-  case 3:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, cost derivatives, reannealing parameters\n",-             OPTIONS->Locate_Cost);-    break;-  case 4:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, reannealing cost temperature\n",-             OPTIONS->Locate_Cost);-    break;-  case 5:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, calculating curvatures while exiting asa ()\n",-             OPTIONS->Locate_Cost);-    break;-  case -1:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, exited main asa () loop by user-defined OPTIONS\n",-             OPTIONS->Locate_Cost);-    break;-  default:-    fprintf (ptr_asa_out,-             " Locate_Cost = %d, no index available for Locate_Cost\n",-             OPTIONS->Locate_Cost);-  }--  if (*exit_status != INVALID_USER_INPUT-      && *exit_status != INVALID_COST_FUNCTION-      && *exit_status != INVALID_COST_FUNCTION_DERIV) {-    fprintf (ptr_asa_out,-             "final_cost = best_generated_state->cost = %-*.*g\n",-             G_FIELD, G_PRECISION, *final_cost);-#if INT_LONG-    fprintf (ptr_asa_out,-             "*number_accepted at best_generated_state->cost = %ld\n",-             *best_number_accepted_saved);-    fprintf (ptr_asa_out,-             "*number_generated at best_generated_state->cost = %ld\n",-             *best_number_generated_saved);-#else-    fprintf (ptr_asa_out,-             "*number_accepted at best_generated_state->cost = %d\n",-             *best_number_accepted_saved);-    fprintf (ptr_asa_out,-             "*number_generated at best_generated_state->cost = %d\n",-             *best_number_generated_saved);-#endif-  }-#endif--#if ASA_TEMPLATE_SELFOPT-  if (OPTIONS->Asa_Data_Dbl[0] > (double) MIN_DOUBLE)-    OPTIONS->Asa_Data_Dbl[1] = (double) (*best_number_generated_saved);-#endif--  /* reset OPTIONS->Sequential_Parameters */-  OPTIONS->Sequential_Parameters = *start_sequence;--#if ASA_PRINT-#if TIME_CALC-  /* print ending time */-  print_time ("asa_end", ptr_asa_out);-#endif-  fprintf (ptr_asa_out, "\n\n\n");-  fflush (ptr_asa_out);-  ptr_asa_out != stdout && fclose (ptr_asa_out);-#endif--  return (0);-}--/***********************************************************************-* generate_new_state-*       Generates a valid new state from the old state-***********************************************************************/-#if HAVE_ANSI-void--generate_new_state (double (*user_random_generator) (LONG_INT *),-                    LONG_INT * seed,-                    double *parameter_minimum,-                    double *parameter_maximum,-                    double *current_user_parameter_temp,-#if USER_GENERATING_FUNCTION-                    double *initial_user_parameter_temp,-                    double *temperature_scale_parameters,-#endif-                    ALLOC_INT * number_parameters,-                    int *parameter_type,-                    STATE * current_generated_state,-                    STATE * last_saved_state, USER_DEFINES * OPTIONS)-#else-void--generate_new_state (user_random_generator,-                    seed,-                    parameter_minimum,-                    parameter_maximum, current_user_parameter_temp,-#if USER_GENERATING_FUNCTION-                    initial_user_parameter_temp, temperature_scale_parameters,-#endif-                    number_parameters,-                    parameter_type,-                    current_generated_state, last_saved_state, OPTIONS)-     double (*user_random_generator) ();-     LONG_INT *seed;-     double *parameter_minimum;-     double *parameter_maximum;-     double *current_user_parameter_temp;-#if USER_GENERATING_FUNCTION-     double *initial_user_parameter_temp;-     double *temperature_scale_parameters;-#endif-     ALLOC_INT *number_parameters;-     int *parameter_type;-     STATE *current_generated_state;-     STATE *last_saved_state;-     USER_DEFINES *OPTIONS;-#endif-{-  ALLOC_INT index_v;-  double x;-  double parameter_v, min_parameter_v, max_parameter_v, temperature_v,-    parameter_range_v;-#if USER_GENERATING_FUNCTION-  double init_param_temp_v;-  double temp_scale_params_v;-#endif-#if ASA_RESOLUTION-  double xres, xint, xminus, xplus, dx, dxminus, dxplus;-#endif--  /* generate a new value for each parameter */-  VFOR (index_v) {-    if (OPTIONS->Sequential_Parameters >= -1) {-      ++OPTIONS->Sequential_Parameters;-      if (OPTIONS->Sequential_Parameters == *number_parameters)-        OPTIONS->Sequential_Parameters = 0;-      index_v = OPTIONS->Sequential_Parameters;-    }-    min_parameter_v = parameter_minimum[index_v];-    max_parameter_v = parameter_maximum[index_v];-    parameter_range_v = max_parameter_v - min_parameter_v;--    /* ignore parameters that have too small a range */-    if (fabs (parameter_range_v) < (double) EPS_DOUBLE)-      continue;--    temperature_v = current_user_parameter_temp[index_v];-#if USER_GENERATING_FUNCTION-    init_param_temp_v = initial_user_parameter_temp[index_v];-    temp_scale_params_v = temperature_scale_parameters[index_v];-#endif-    parameter_v = last_saved_state->parameter[index_v];--    /* Handle discrete parameters. */-#if ASA_RESOLUTION-    xres = OPTIONS->Coarse_Resolution[index_v];-    if (xres > EPS_DOUBLE) {-      min_parameter_v -= (xres / TWO);-      max_parameter_v += (xres / TWO);-      parameter_range_v = max_parameter_v - min_parameter_v;-    }-#endif /* ASA_RESOLUTION */-    if (INTEGER_PARAMETER (index_v)) {-#if ASA_RESOLUTION-      if (xres > EPS_DOUBLE) {-        ;-      } else {-#endif /* ASA_RESOLUTION */-        min_parameter_v -= HALF;-        max_parameter_v += HALF;-        parameter_range_v = max_parameter_v - min_parameter_v;-      }-#if ASA_RESOLUTION-    }-#endif--    /* generate a new state x within the parameter bounds */-    for (;;) {-#if USER_GENERATING_FUNCTION-      x = OPTIONS->Generating_Distrib (seed,-                                       number_parameters,-                                       index_v,-                                       temperature_v,-                                       init_param_temp_v,-                                       temp_scale_params_v,-                                       parameter_v,-                                       parameter_range_v,-                                       last_saved_state->parameter, OPTIONS);-#else-      x = parameter_v-        + generate_asa_state (user_random_generator, seed, &temperature_v)-        * parameter_range_v;-#endif /* USER_GENERATING_FUNCTION */-#if ASA_RESOLUTION-      if (xres > EPS_DOUBLE) {-        xint = xres * (double) ((LONG_INT) (x / xres));-        xplus = xint + xres;-        xminus = xint - xres;-        dx = fabs (xint - x);-        dxminus = fabs (xminus - x);-        dxplus = fabs (xplus - x);--        if (dx < dxminus && dx < dxplus)-          x = xint;-        else if (dxminus < dxplus)-          x = xminus;-        else-          x = xplus;-      }-#endif /* ASA_RESOLUTION */--      /* exit the loop if within its valid parameter range */-      if (x <= max_parameter_v - (double) EPS_DOUBLE-          && x >= min_parameter_v + (double) EPS_DOUBLE)-        break;-    }--    /* Handle discrete parameters.-       You might have to check rounding on your machine. */-    if (INTEGER_PARAMETER (index_v)) {-#if ASA_RESOLUTION-      if (xres > EPS_DOUBLE) {-        ;-      } else {-#endif /* ASA_RESOLUTION */-        if (x < min_parameter_v + HALF)-          x = min_parameter_v + HALF + (double) EPS_DOUBLE;-        if (x > max_parameter_v - HALF)-          x = max_parameter_v - HALF + (double) EPS_DOUBLE;--        if (x + HALF > ZERO) {-          x = (double) ((LONG_INT) (x + HALF));-        } else {-          x = (double) ((LONG_INT) (x - HALF));-        }-        if (x > parameter_maximum[index_v])-          x = parameter_maximum[index_v];-        if (x < parameter_minimum[index_v])-          x = parameter_minimum[index_v];-      }-#if ASA_RESOLUTION-    }-    if (xres > EPS_DOUBLE) {-      if (x < min_parameter_v + xres / TWO)-        x = min_parameter_v + xres / TWO + (double) EPS_DOUBLE;-      if (x > max_parameter_v - xres / TWO)-        x = max_parameter_v - xres / TWO + (double) EPS_DOUBLE;--      if (x > parameter_maximum[index_v])-        x = parameter_maximum[index_v];-      if (x < parameter_minimum[index_v])-        x = parameter_minimum[index_v];-    }-#endif /* ASA_RESOLUTION */--    /* save the newly generated value */-    current_generated_state->parameter[index_v] = x;--    if (OPTIONS->Sequential_Parameters >= 0)-      break;-  }--}--/***********************************************************************-* generate_asa_state-*       This function generates a single value according to the-*       ASA generating function and the passed temperature-***********************************************************************/-#if HAVE_ANSI-double--generate_asa_state (double (*user_random_generator) (LONG_INT *),-                    LONG_INT * seed, double *temp)-#else-double-generate_asa_state (user_random_generator, seed, temp)-     double (*user_random_generator) ();-     LONG_INT *seed;-     double *temp;-#endif-{-  double x, y, z;--  x = (*user_random_generator) (seed);-  y = x < HALF ? -ONE : ONE;-  z = y * *temp * (F_POW ((ONE + ONE / *temp), fabs (TWO * x - ONE)) - ONE);--  return (z);--}--/***********************************************************************-* accept_new_state-*	This procedure accepts or rejects a newly generated state,-*	depending on whether the difference between new and old-*	cost functions passes a statistical test. If accepted,-*	the current state is updated.-***********************************************************************/-#if HAVE_ANSI-void--accept_new_state (double (*user_random_generator) (LONG_INT *),-                  LONG_INT * seed,-                  double *parameter_minimum,-                  double *parameter_maximum, double *current_cost_temperature,-#if ASA_SAMPLE-                  double *current_user_parameter_temp,-#endif-                  ALLOC_INT * number_parameters,-                  LONG_INT * recent_number_acceptances,-                  LONG_INT * number_accepted,-                  LONG_INT * index_cost_acceptances,-                  LONG_INT * number_acceptances_saved,-                  LONG_INT * recent_number_generated,-                  LONG_INT * number_generated,-                  LONG_INT * index_parameter_generations,-                  STATE * current_generated_state, STATE * last_saved_state,-#if ASA_SAMPLE-                  FILE * ptr_asa_out,-#endif-                  USER_DEFINES * OPTIONS)-#else-void--accept_new_state (user_random_generator,-                  seed,-                  parameter_minimum,-                  parameter_maximum, current_cost_temperature,-#if ASA_SAMPLE-                  current_user_parameter_temp,-#endif-                  number_parameters,-                  recent_number_acceptances,-                  number_accepted,-                  index_cost_acceptances,-                  number_acceptances_saved,-                  recent_number_generated,-                  number_generated,-                  index_parameter_generations,-                  current_generated_state, last_saved_state,-#if ASA_SAMPLE-                  ptr_asa_out,-#endif-                  OPTIONS)-     double (*user_random_generator) ();-     LONG_INT *seed;-     double *parameter_minimum;-     double *parameter_maximum;-     double *current_cost_temperature;-#if ASA_SAMPLE-     double *current_user_parameter_temp;-#endif-     ALLOC_INT *number_parameters;-     LONG_INT *recent_number_acceptances;-     LONG_INT *number_accepted;-     LONG_INT *index_cost_acceptances;-     LONG_INT *number_acceptances_saved;-     LONG_INT *recent_number_generated;-     LONG_INT *number_generated;-     LONG_INT *index_parameter_generations;-     STATE *current_generated_state;-     STATE *last_saved_state;-#if ASA_SAMPLE-     FILE *ptr_asa_out;-#endif-     USER_DEFINES *OPTIONS;--#endif-{-#if USER_ACCEPTANCE_TEST-#else-  double delta_cost;-#if USER_ACCEPT_ASYMP_EXP-  double q;-#endif-#endif-  double prob_test, unif_test;-  double curr_cost_temp;-  ALLOC_INT index_v;-#if ASA_SAMPLE-  LONG_INT active_params;-  double weight_param_ind, weight_aver, range;-#endif--  /* update accepted and generated count */-  ++*number_acceptances_saved;-  ++*recent_number_generated;-  ++*number_generated;-  OPTIONS->N_Generated = *number_generated;--  /* increment the parameter index generation for each parameter */-  if (OPTIONS->Sequential_Parameters >= 0) {-    /* ignore parameters with too small a range */-    if (!PARAMETER_RANGE_TOO_SMALL (OPTIONS->Sequential_Parameters))-      ++index_parameter_generations[OPTIONS->Sequential_Parameters];-  } else {-    VFOR (index_v) {-      if (!PARAMETER_RANGE_TOO_SMALL (index_v))-        ++index_parameter_generations[index_v];-    }-  }--  /* effective cost function for testing acceptance criteria,-     calculate the cost difference and divide by the temperature */-  curr_cost_temp = *current_cost_temperature;-#if USER_ACCEPTANCE_TEST-  if (OPTIONS->Cost_Acceptance_Flag == TRUE) {-    if (OPTIONS->User_Acceptance_Flag == TRUE) {-      unif_test = ZERO;-      OPTIONS->User_Acceptance_Flag = FALSE;-      OPTIONS->Cost_Acceptance_Flag = FALSE;-    } else {-      unif_test = ONE;-      OPTIONS->Cost_Acceptance_Flag = FALSE;-    }-  } else {-    OPTIONS->Acceptance_Test (current_generated_state->cost,-                              parameter_minimum,-                              parameter_maximum, *number_parameters, OPTIONS);-    if (OPTIONS->User_Acceptance_Flag == TRUE) {-      unif_test = ZERO;-      OPTIONS->User_Acceptance_Flag = FALSE;-    } else {-      unif_test = ONE;-    }-  }-  prob_test = OPTIONS->Prob_Bias;-#else /* USER_ACCEPTANCE_TEST */--#if USER_COST_SCHEDULE-  curr_cost_temp =-    (OPTIONS->Cost_Schedule (*current_cost_temperature, OPTIONS)-     + (double) EPS_DOUBLE);-#endif-  delta_cost = (current_generated_state->cost - last_saved_state->cost)-    / (curr_cost_temp + (double) EPS_DOUBLE);--#if USER_ACCEPT_ASYMP_EXP-  q = OPTIONS->Asymp_Exp_Param;-  if (fabs (ONE - q) < (double) EPS_DOUBLE)-    prob_test = MIN (ONE, (F_EXP (EXPONENT_CHECK (-delta_cost))));-  else if ((ONE - (ONE - q) * delta_cost) < (double) EPS_DOUBLE)-    prob_test = MIN (ONE, (F_EXP (EXPONENT_CHECK (-delta_cost))));-  else-    prob_test = MIN (ONE, F_POW ((ONE - (ONE - q) * delta_cost),-                                 (ONE / (ONE - q))));-#else /* USER_ACCEPT_ASYMP_EXP */--#if USER_ACCEPT_THRESHOLD       /* USER_ACCEPT_THRESHOLD */-  prob_test = delta_cost <= 1.0 ? 1.0 : 0.0;-#else /* Metropolis */-  prob_test = MIN (ONE, (F_EXP (EXPONENT_CHECK (-delta_cost))));-#endif /* USER_ACCEPT_THRESHOLD */--#endif /* USER_ACCEPT_ASYMP_EXP */--  unif_test = (*user_random_generator) (seed);-#endif /* USER_ACCEPTANCE_TEST */--#if ASA_SAMPLE-  active_params = 0;-  weight_aver = ZERO;-  VFOR (index_v) {-    /* ignore parameters with too small a range */-    if (PARAMETER_RANGE_TOO_SMALL (index_v))-      continue;-    ++active_params;-    range = parameter_maximum[index_v] - parameter_minimum[index_v];-    weight_param_ind = TWO * (fabs ((last_saved_state->parameter[index_v]-                                     --                                     current_generated_state->-                                     parameter[index_v]) / range)-                              + current_user_parameter_temp[index_v])-      * F_LOG (ONE + ONE / current_user_parameter_temp[index_v]);-    weight_aver += weight_param_ind;-    OPTIONS->Bias_Generated[index_v] = ONE / weight_param_ind;-  }-  weight_aver /= (double) active_params;-  OPTIONS->Average_Weights = weight_aver;-  if (prob_test >= unif_test) {-    OPTIONS->Bias_Acceptance = prob_test;-  } else {-    OPTIONS->Bias_Acceptance = ONE - prob_test;-  }--#if ASA_PRINT-  if (OPTIONS->Limit_Weights < OPTIONS->Average_Weights) {-    fprintf (ptr_asa_out, ":SAMPLE#\n");-    if (prob_test >= unif_test) {-      fprintf (ptr_asa_out,-#if INT_LONG-               ":SAMPLE+ %10ld %*.*g %*.*g %*.*g %*.*g\n",-#else-               ":SAMPLE+ %10d %*.*g %*.*g %*.*g\n",-#endif-               OPTIONS->N_Accepted,-               G_FIELD, G_PRECISION, current_generated_state->cost,-               G_FIELD, G_PRECISION, *current_cost_temperature,-               G_FIELD, G_PRECISION, OPTIONS->Bias_Acceptance,-               G_FIELD, G_PRECISION, OPTIONS->Average_Weights);-      VFOR (index_v) {-        /* ignore parameters with too small a range */-        if (PARAMETER_RANGE_TOO_SMALL (index_v))-          continue;-        range = parameter_maximum[index_v] - parameter_minimum[index_v];-        fprintf (ptr_asa_out,-#if INT_ALLOC-                 ":SAMPLE %11d %*.*g %*.*g %*.*g %*.*g\n",-#else-#if INT_LONG-                 ":SAMPLE %11ld %*.*g %*.*g %*.*g %*.*g\n",-#else-                 ":SAMPLE %11d %*.*g %*.*g %*.*g %*.*g\n",-#endif-#endif-                 index_v,-                 G_FIELD, G_PRECISION,-                 current_generated_state->parameter[index_v], G_FIELD,-                 G_PRECISION, current_user_parameter_temp[index_v],-                 G_FIELD, G_PRECISION, OPTIONS->Bias_Generated[index_v],-                 G_FIELD, G_PRECISION, range);-      }-    } else {-      fprintf (ptr_asa_out,-#if INT_LONG-               ":SAMPLE %11ld %*.*g %*.*g %*.*g %*.*g\n",-#else-               ":SAMPLE %11d %*.*g %*.*g %*.*g\n",-#endif-               OPTIONS->N_Accepted,-               G_FIELD, G_PRECISION, last_saved_state->cost,-               G_FIELD, G_PRECISION, *current_cost_temperature,-               G_FIELD, G_PRECISION, OPTIONS->Bias_Acceptance,-               G_FIELD, G_PRECISION, OPTIONS->Average_Weights);-      VFOR (index_v) {-        /* ignore parameters with too small a range */-        if (PARAMETER_RANGE_TOO_SMALL (index_v))-          continue;-        range = parameter_maximum[index_v] - parameter_minimum[index_v];-        fprintf (ptr_asa_out,-#if INT_ALLOC-                 ":SAMPLE %11d %*.*g %*.*g %*.*g %*.*g\n",-#else-#if INT_LONG-                 ":SAMPLE %11ld %*.*g %*.*g %*.*g %*.*g\n",-#else-                 ":SAMPLE %11d %*.*g %*.*g %*.*g %*.*g\n",-#endif-#endif-                 index_v,-                 G_FIELD, G_PRECISION,-                 last_saved_state->parameter[index_v], G_FIELD,-                 G_PRECISION, current_user_parameter_temp[index_v],-                 G_FIELD, G_PRECISION, OPTIONS->Bias_Generated[index_v],-                 G_FIELD, G_PRECISION, range);-      }-    }-  }-#endif-#endif /* ASA_SAMPLE */--  /* accept/reject the new state */-  if (prob_test >= unif_test) {-    /* copy current state to the last saved state */--    last_saved_state->cost = current_generated_state->cost;-    VFOR (index_v) {-      /* ignore parameters with too small a range */-      if (PARAMETER_RANGE_TOO_SMALL (index_v))-        continue;-      last_saved_state->parameter[index_v] =-        current_generated_state->parameter[index_v];-    }--    /* update acceptance counts */-    ++*recent_number_acceptances;-    ++*number_accepted;-    ++*index_cost_acceptances;-    *number_acceptances_saved = *number_accepted;-    OPTIONS->N_Accepted = *number_accepted;-  }-}--/***********************************************************************-* reanneal-*	Readjust temperatures of generating and acceptance functions-***********************************************************************/-#if HAVE_ANSI-void--reanneal (double *parameter_minimum,-          double *parameter_maximum,-          double *tangents,-          double *maximum_tangent,-          double *current_cost_temperature,-          double *initial_cost_temperature,-          double *temperature_scale_cost,-          double *current_user_parameter_temp,-          double *initial_user_parameter_temp,-          double *temperature_scale_parameters,-          ALLOC_INT * number_parameters,-          int *parameter_type,-          LONG_INT * index_cost_acceptances,-          LONG_INT * index_parameter_generations,-          STATE * last_saved_state,-          STATE * best_generated_state, USER_DEFINES * OPTIONS)-#else-void--reanneal (parameter_minimum,-          parameter_maximum,-          tangents,-          maximum_tangent,-          current_cost_temperature,-          initial_cost_temperature,-          temperature_scale_cost,-          current_user_parameter_temp,-          initial_user_parameter_temp,-          temperature_scale_parameters,-          number_parameters,-          parameter_type,-          index_cost_acceptances,-          index_parameter_generations,-          last_saved_state, best_generated_state, OPTIONS)-     double *parameter_minimum;-     double *parameter_maximum;-     double *tangents;-     double *maximum_tangent;-     double *current_cost_temperature;-     double *initial_cost_temperature;-     double *temperature_scale_cost;-     double *current_user_parameter_temp;-     double *initial_user_parameter_temp;-     double *temperature_scale_parameters;-     ALLOC_INT *number_parameters;-     int *parameter_type;-     LONG_INT *index_cost_acceptances;-     LONG_INT *index_parameter_generations;-     STATE *last_saved_state;-     STATE *best_generated_state;-     USER_DEFINES *OPTIONS;-#endif-{-  ALLOC_INT index_v;-  int cost_test;-  double tmp_var_db3;-  double new_temperature;-  double log_new_temperature_ratio;-  double log_init_cur_temp_ratio;-  double temperature_rescale_power;-  double cost_best, cost_last;-  double tmp_dbl, tmp_dbl1;--  double xnumber_parameters[1];--  cost_test = cost_function_test (last_saved_state->cost,-                                  last_saved_state->parameter,-                                  parameter_minimum,-                                  parameter_maximum, number_parameters,-                                  xnumber_parameters);--  if (OPTIONS->Reanneal_Parameters == TRUE) {-    VFOR (index_v) {-      if (NO_REANNEAL (index_v))-        continue;--      /* use the temp double to prevent overflow */-      tmp_dbl = (double) index_parameter_generations[index_v];--      /* skip parameters with too small range or integer parameters */-      if (OPTIONS->Include_Integer_Parameters == TRUE) {-        if (PARAMETER_RANGE_TOO_SMALL (index_v))-          continue;-      } else {-        if (PARAMETER_RANGE_TOO_SMALL (index_v) ||-            INTEGER_PARAMETER (index_v))-          continue;-      }--      /* ignore parameters with too small tangents */-      if (fabs (tangents[index_v]) < (double) EPS_DOUBLE)-        continue;--      /* reset the index of parameter generations appropriately */-#if USER_REANNEAL_PARAMETERS-      new_temperature =-        fabs (OPTIONS->-              Reanneal_Params_Function (current_user_parameter_temp-                                        [index_v], tangents[index_v],-                                        *maximum_tangent, OPTIONS));-#else-      new_temperature =-        fabs (FUNCTION_REANNEAL_PARAMS-              (current_user_parameter_temp[index_v], tangents[index_v],-               *maximum_tangent));-#endif-      if (new_temperature < initial_user_parameter_temp[index_v]) {-        log_init_cur_temp_ratio =-          fabs (F_LOG (((double) EPS_DOUBLE-                        + initial_user_parameter_temp[index_v])-                       / ((double) EPS_DOUBLE + new_temperature)));-        tmp_dbl = (double) EPS_DOUBLE-          + F_POW (log_init_cur_temp_ratio-                   / temperature_scale_parameters[index_v],-                   *xnumber_parameters-#if QUENCH_PARAMETERS-                   / OPTIONS->User_Quench_Param_Scale[index_v]);-#else-          );-#endif-      } else {-        tmp_dbl = ONE;-      }--      /* Reset index_parameter_generations if index reset too large,-         and also reset the initial_user_parameter_temp, to achieve-         the same new temperature. */-      while (tmp_dbl > ((double) MAXIMUM_REANNEAL_INDEX)) {-        log_new_temperature_ratio =-          -temperature_scale_parameters[index_v] * F_POW (tmp_dbl,-#if QUENCH_PARAMETERS-                                                          OPTIONS->-                                                          User_Quench_Param_Scale-                                                          [index_v]-#else-                                                          ONE-#endif-                                                          /-                                                          *xnumber_parameters);-        log_new_temperature_ratio =-          EXPONENT_CHECK (log_new_temperature_ratio);-        new_temperature =-          initial_user_parameter_temp[index_v] *-          F_EXP (log_new_temperature_ratio);-        tmp_dbl /= (double) REANNEAL_SCALE;-        temperature_rescale_power = ONE / F_POW ((double) REANNEAL_SCALE,-#if QUENCH_PARAMETERS-                                                 OPTIONS->-                                                 User_Quench_Param_Scale-                                                 [index_v]-#else-                                                 ONE-#endif-                                                 / *xnumber_parameters);-        initial_user_parameter_temp[index_v] =-          new_temperature * F_POW (initial_user_parameter_temp[index_v] /-                                   new_temperature,-                                   temperature_rescale_power);-      }-      /* restore from temporary double */-      index_parameter_generations[index_v] = (LONG_INT) tmp_dbl;-    }-  }--  if (OPTIONS->Reanneal_Cost == 0) {-    ;-  } else if (OPTIONS->Reanneal_Cost < -1) {-    *index_cost_acceptances = 1;-  } else {-    /* reanneal : Reset the current cost temp and rescale the-       index of cost acceptances. */--    cost_best = best_generated_state->cost;-    cost_last = last_saved_state->cost;-#if USER_REANNEAL_COST-    cost_test = OPTIONS->Reanneal_Cost_Function (&cost_best,-                                                 &cost_last,-                                                 initial_cost_temperature,-                                                 current_cost_temperature,-                                                 OPTIONS);-    tmp_dbl1 = *current_cost_temperature;-#else-    cost_test = TRUE;-    if (OPTIONS->Reanneal_Cost == 1) {-      /* (re)set the initial cost_temperature */-      tmp_dbl = MAX (fabs (cost_last), fabs (cost_best));-      tmp_dbl = MAX (tmp_dbl, fabs (cost_best - cost_last));-      tmp_dbl = MAX ((double) EPS_DOUBLE, tmp_dbl);-      *initial_cost_temperature = MIN (*initial_cost_temperature, tmp_dbl);-    }--    tmp_dbl = (double) *index_cost_acceptances;--    tmp_dbl1 = MAX (fabs (cost_last - cost_best), *current_cost_temperature);-    tmp_dbl1 = MAX ((double) EPS_DOUBLE, tmp_dbl1);-    tmp_dbl1 = MIN (tmp_dbl1, *initial_cost_temperature);-#endif /* USER_REANNEAL_COST */-    if (cost_test == TRUE && (*current_cost_temperature > tmp_dbl1)) {-      tmp_var_db3 =-        fabs (F_LOG (((double) EPS_DOUBLE + *initial_cost_temperature) /-                     (tmp_dbl1)));-      tmp_dbl = (double) EPS_DOUBLE + F_POW (tmp_var_db3-                                             / *temperature_scale_cost,-                                             *xnumber_parameters-#if QUENCH_COST-                                             /-                                             OPTIONS->-                                             User_Quench_Cost_Scale[0]);-#else-        );-#endif-    } else {-      log_init_cur_temp_ratio =-        fabs (F_LOG (((double) EPS_DOUBLE + *initial_cost_temperature) /-                     ((double) EPS_DOUBLE + *current_cost_temperature)));-      tmp_dbl = (double) EPS_DOUBLE-        + F_POW (log_init_cur_temp_ratio-                 / *temperature_scale_cost, *xnumber_parameters-#if QUENCH_COST-                 / OPTIONS->User_Quench_Cost_Scale[0]-#else-#endif-        );-    }--    /* reset index_cost_temperature if index reset too large */-    while (tmp_dbl > ((double) MAXIMUM_REANNEAL_INDEX)) {-      log_new_temperature_ratio = -*temperature_scale_cost * F_POW (tmp_dbl,-#if QUENCH_COST-                                                                    OPTIONS->-                                                                    User_Quench_Cost_Scale-                                                                    [0]-#else-                                                                    ONE-#endif-                                                                    /-                                                                    *xnumber_parameters);-      log_new_temperature_ratio = EXPONENT_CHECK (log_new_temperature_ratio);-      new_temperature =-        *initial_cost_temperature * F_EXP (log_new_temperature_ratio);-      tmp_dbl /= (double) REANNEAL_SCALE;-      temperature_rescale_power = ONE / F_POW ((double) REANNEAL_SCALE,-#if QUENCH_COST-                                               OPTIONS->-                                               User_Quench_Cost_Scale[0]-#else-                                               ONE-#endif-                                               / *xnumber_parameters);-      *initial_cost_temperature =-        new_temperature * F_POW (*initial_cost_temperature /-                                 new_temperature, temperature_rescale_power);-    }-    *index_cost_acceptances = (LONG_INT) tmp_dbl;-#if USER_ACCEPTANCE_TEST-    OPTIONS->Cost_Temp_Init = *initial_cost_temperature;-#endif-  }-}--/***********************************************************************-* cost_derivatives-*	This procedure calculates the derivatives of the cost function-*	with respect to its parameters.  The first derivatives are-*	used as a sensitivity measure for reannealing.  The second-*	derivatives are calculated only if *curvature_flag=TRUE;-*	these are a measure of the covariance of the fit when a-*	minimum is found.-***********************************************************************/-  /* Calculate the numerical derivatives of the best-     generated state found so far */--  /* In this implementation of ASA, no checks are made for-   *valid_state_generated_flag=FALSE for differential neighbors-   to the current best state. */--  /* Assuming no information is given about the metric of the parameter-     space, use simple Cartesian space to calculate curvatures. */--#if HAVE_ANSI-void-cost_derivatives (double (*user_cost_function)--                   -                  (double *, double *, double *, double *, double *,-                   ALLOC_INT *, int *, int *, int *, USER_DEFINES *),-                  double *parameter_minimum, double *parameter_maximum,-                  double *tangents, double *curvature,-                  double *maximum_tangent, ALLOC_INT * number_parameters,-                  int *parameter_type, int *exit_status,-                  int *curvature_flag, int *valid_state_generated_flag,-                  LONG_INT * number_invalid_generated_states,-                  STATE * current_generated_state,-                  STATE * best_generated_state, FILE * ptr_asa_out,-                  USER_DEFINES * OPTIONS)-#else-void--cost_derivatives (user_cost_function,-                  parameter_minimum,-                  parameter_maximum,-                  tangents,-                  curvature,-                  maximum_tangent,-                  number_parameters,-                  parameter_type,-                  exit_status,-                  curvature_flag,-                  valid_state_generated_flag,-                  number_invalid_generated_states,-                  current_generated_state,-                  best_generated_state, ptr_asa_out, OPTIONS)-     double (*user_cost_function) ();-     double *parameter_minimum;-     double *parameter_maximum;-     double *tangents;-     double *curvature;-     double *maximum_tangent;-     ALLOC_INT *number_parameters;-     int *parameter_type;-     int *exit_status;-     int *curvature_flag;-     int *valid_state_generated_flag;-     LONG_INT *number_invalid_generated_states;-     STATE *current_generated_state;-     STATE *best_generated_state;-     FILE *ptr_asa_out;-     USER_DEFINES *OPTIONS;-#endif-{-  ALLOC_INT index_v, index_vv, index_v_vv, index_vv_v;-  LONG_INT saved_num_invalid_gen_states;-#if ASA_PRINT-  LONG_INT tmp_saved;-#endif-  double parameter_v, parameter_vv, parameter_v_offset, parameter_vv_offset;-  double recent_best_cost;-  double new_cost_state_1, new_cost_state_2, new_cost_state_3;-  double delta_parameter_v, delta_parameter_vv;-  int immediate_flag;-  double xnumber_parameters[1];--  if (OPTIONS->Curvature_0 == TRUE)-    *curvature_flag = FALSE;-  if (OPTIONS->Curvature_0 == -1)-    *curvature_flag = TRUE;--  /* save Immediate_Exit flag */-  immediate_flag = OPTIONS->Immediate_Exit;--  /* save the best cost */-  recent_best_cost = best_generated_state->cost;--  /* copy the best state into the current state */-  VFOR (index_v) {-    /* ignore parameters with too small ranges */-    if (PARAMETER_RANGE_TOO_SMALL (index_v))-      continue;-    current_generated_state->parameter[index_v] =-      best_generated_state->parameter[index_v];-  }--  saved_num_invalid_gen_states = (*number_invalid_generated_states);--  /* set parameters (& possibly constraints) to best state */-  *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-  OPTIONS->User_Acceptance_Flag = TRUE;-  OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-  current_generated_state->cost =-    user_cost_function (current_generated_state->parameter,-                        parameter_minimum,-                        parameter_maximum,-                        tangents,-                        curvature,-                        number_parameters,-                        parameter_type,-                        valid_state_generated_flag, exit_status, OPTIONS);-  if (cost_function_test (current_generated_state->cost,-                          current_generated_state->parameter,-                          parameter_minimum,-                          parameter_maximum, number_parameters,-                          xnumber_parameters) == 0) {-    *exit_status = INVALID_COST_FUNCTION_DERIV;-    return;-  }-  if (*valid_state_generated_flag == FALSE)-    ++(*number_invalid_generated_states);--  if (OPTIONS->User_Tangents == TRUE) {-    *valid_state_generated_flag = FALSE;-#if USER_ACCEPTANCE_TEST-    OPTIONS->User_Acceptance_Flag = TRUE;-    OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-    current_generated_state->cost =-      user_cost_function (current_generated_state->parameter,-                          parameter_minimum,-                          parameter_maximum,-                          tangents,-                          curvature,-                          number_parameters,-                          parameter_type,-                          valid_state_generated_flag, exit_status, OPTIONS);-    if (cost_function_test (current_generated_state->cost,-                            current_generated_state->parameter,-                            parameter_minimum,-                            parameter_maximum, number_parameters,-                            xnumber_parameters) == 0) {-      *exit_status = INVALID_COST_FUNCTION_DERIV;-      return;-    }-    if (*valid_state_generated_flag == FALSE)-      ++(*number_invalid_generated_states);-  } else {-    /* calculate tangents */-    VFOR (index_v) {-      if (NO_REANNEAL (index_v)) {-        tangents[index_v] = ZERO;-        continue;-      }-      /* skip parameters with too small range or integer parameters */-      if (OPTIONS->Include_Integer_Parameters == TRUE) {-        if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-          tangents[index_v] = ZERO;-          continue;-        }-      } else {-        if (PARAMETER_RANGE_TOO_SMALL (index_v) ||-            INTEGER_PARAMETER (index_v)) {-          tangents[index_v] = ZERO;-          continue;-        }-      }--      /* save the v_th parameter and delta_parameter */-      parameter_v = best_generated_state->parameter[index_v];-#if DELTA_PARAMETERS-      delta_parameter_v = OPTIONS->User_Delta_Parameter[index_v];-#else-      delta_parameter_v = OPTIONS->Delta_X;-#endif--      parameter_v_offset = (ONE + delta_parameter_v) * parameter_v;-      if (parameter_v_offset > parameter_maximum[index_v] ||-          parameter_v_offset < parameter_minimum[index_v]) {-        delta_parameter_v = -delta_parameter_v;-        parameter_v_offset = (ONE + delta_parameter_v) * parameter_v;-      }--      /* generate the first sample point */-      current_generated_state->parameter[index_v] = parameter_v_offset;-      *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-      OPTIONS->User_Acceptance_Flag = TRUE;-      OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-      current_generated_state->cost =-        user_cost_function (current_generated_state->parameter,-                            parameter_minimum,-                            parameter_maximum,-                            tangents,-                            curvature,-                            number_parameters,-                            parameter_type,-                            valid_state_generated_flag, exit_status, OPTIONS);-      if (cost_function_test-          (current_generated_state->cost,-           current_generated_state->parameter, parameter_minimum,-           parameter_maximum, number_parameters, xnumber_parameters) == 0) {-        *exit_status = INVALID_COST_FUNCTION_DERIV;-        return;-      }-      if (*valid_state_generated_flag == FALSE)-        ++(*number_invalid_generated_states);-      new_cost_state_1 = current_generated_state->cost;--      /* restore the parameter state */-      current_generated_state->parameter[index_v] = parameter_v;--      /* calculate the numerical derivative */-      tangents[index_v] = (new_cost_state_1 - recent_best_cost)-        / (delta_parameter_v * parameter_v + (double) EPS_DOUBLE);--    }-  }--  /* find the maximum |tangent| from all tangents */-  *maximum_tangent = 0;-  VFOR (index_v) {-    if (NO_REANNEAL (index_v))-      continue;--    /* ignore too small ranges and integer parameters types */-    if (OPTIONS->Include_Integer_Parameters == TRUE) {-      if (PARAMETER_RANGE_TOO_SMALL (index_v))-        continue;-    } else {-      if (PARAMETER_RANGE_TOO_SMALL (index_v)-          || INTEGER_PARAMETER (index_v))-        continue;-    }--    /* find the maximum |tangent| (from all tangents) */-    if (fabs (tangents[index_v]) > *maximum_tangent) {-      *maximum_tangent = fabs (tangents[index_v]);-    }-  }--  if (*curvature_flag == TRUE || *curvature_flag == -1) {-    /* calculate diagonal curvatures */-    VFOR (index_v) {-      if (NO_REANNEAL (index_v)) {-        index_v_vv = ROW_COL_INDEX (index_v, index_v);-        curvature[index_v_vv] = ZERO;-        continue;-      }-      /* skip parameters with too small range or integer parameters */-      if (OPTIONS->Include_Integer_Parameters == TRUE) {-        if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-          index_v_vv = ROW_COL_INDEX (index_v, index_v);-          curvature[index_v_vv] = ZERO;-          continue;-        }-      } else {-        if (PARAMETER_RANGE_TOO_SMALL (index_v) ||-            INTEGER_PARAMETER (index_v)) {-          index_v_vv = ROW_COL_INDEX (index_v, index_v);-          curvature[index_v_vv] = ZERO;-          continue;-        }-      }--      /* save the v_th parameter and delta_parameter */-      parameter_v = best_generated_state->parameter[index_v];-#if DELTA_PARAMETERS-      delta_parameter_v = OPTIONS->User_Delta_Parameter[index_v];-#else-      delta_parameter_v = OPTIONS->Delta_X;-#endif--      if (parameter_v + delta_parameter_v * fabs (parameter_v)-          > parameter_maximum[index_v]) {-        /* generate the first sample point */-        current_generated_state->parameter[index_v] =-          parameter_v - TWO * delta_parameter_v * fabs (parameter_v);-        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_1 = current_generated_state->cost;--        /* generate the second sample point */-        current_generated_state->parameter[index_v] =-          parameter_v - delta_parameter_v * fabs (parameter_v);--        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_2 = current_generated_state->cost;--        /* restore the parameter state */-        current_generated_state->parameter[index_v] = parameter_v;--        /* index_v_vv: row index_v, column index_v */-        index_v_vv = ROW_COL_INDEX (index_v, index_v);--        /* calculate and store the curvature */-        curvature[index_v_vv] =-          (recent_best_cost - TWO * new_cost_state_2-           + new_cost_state_1) / (delta_parameter_v * delta_parameter_v-                                  * parameter_v * parameter_v +-                                  (double) EPS_DOUBLE);-      } else if (parameter_v - delta_parameter_v * fabs (parameter_v)-                 < parameter_minimum[index_v]) {-        /* generate the first sample point */-        current_generated_state->parameter[index_v] =-          parameter_v + TWO * delta_parameter_v * fabs (parameter_v);-        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_1 = current_generated_state->cost;--        /* generate the second sample point */-        current_generated_state->parameter[index_v] =-          parameter_v + delta_parameter_v * fabs (parameter_v);--        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_2 = current_generated_state->cost;--        /* restore the parameter state */-        current_generated_state->parameter[index_v] = parameter_v;--        /* index_v_vv: row index_v, column index_v */-        index_v_vv = ROW_COL_INDEX (index_v, index_v);--        /* calculate and store the curvature */-        curvature[index_v_vv] =-          (recent_best_cost - TWO * new_cost_state_2-           + new_cost_state_1) / (delta_parameter_v * delta_parameter_v-                                  * parameter_v * parameter_v +-                                  (double) EPS_DOUBLE);-      } else {-        /* generate the first sample point */-        parameter_v_offset = (ONE + delta_parameter_v) * parameter_v;-        current_generated_state->parameter[index_v] = parameter_v_offset;-        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_1 = current_generated_state->cost;--        /* generate the second sample point */-        current_generated_state->parameter[index_v] =-          (ONE - delta_parameter_v) * parameter_v;--        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_2 = current_generated_state->cost;--        /* restore the parameter state */-        current_generated_state->parameter[index_v] = parameter_v;--        /* index_v_vv: row index_v, column index_v */-        index_v_vv = ROW_COL_INDEX (index_v, index_v);--        /* calculate and store the curvature */-        curvature[index_v_vv] =-          (new_cost_state_2 - TWO * recent_best_cost-           + new_cost_state_1) / (delta_parameter_v * delta_parameter_v-                                  * parameter_v * parameter_v +-                                  (double) EPS_DOUBLE);-      }-    }--    /* calculate off-diagonal curvatures */-    VFOR (index_v) {-      /* save the v_th parameter and delta_x */-      parameter_v = current_generated_state->parameter[index_v];-#if DELTA_PARAMETERS-      delta_parameter_v = OPTIONS->User_Delta_Parameter[index_v];-#else-      delta_parameter_v = OPTIONS->Delta_X;-#endif--      VFOR (index_vv) {-        /* index_v_vv: row index_v, column index_vv */-        index_v_vv = ROW_COL_INDEX (index_v, index_vv);-        index_vv_v = ROW_COL_INDEX (index_vv, index_v);--        if (NO_REANNEAL (index_vv) || NO_REANNEAL (index_v)) {-          curvature[index_vv_v] = curvature[index_v_vv] = ZERO;-          continue;-        }--        /* calculate only the upper diagonal */-        if (index_v <= index_vv)-          continue;--        /* skip parms with too small range or integer parameters */-        if (OPTIONS->Include_Integer_Parameters == TRUE) {-          if (PARAMETER_RANGE_TOO_SMALL (index_v) ||-              PARAMETER_RANGE_TOO_SMALL (index_vv)) {-            curvature[index_vv_v] = curvature[index_v_vv] = ZERO;-            continue;-          }-        } else {-          if (INTEGER_PARAMETER (index_v) ||-              INTEGER_PARAMETER (index_vv) ||-              PARAMETER_RANGE_TOO_SMALL (index_v) ||-              PARAMETER_RANGE_TOO_SMALL (index_vv)) {-            curvature[index_vv_v] = curvature[index_v_vv] = ZERO;-            continue;-          }-        }-        /* save the vv_th parameter and delta_parameter */-        parameter_vv = current_generated_state->parameter[index_vv];-#if DELTA_PARAMETERS-        delta_parameter_vv = OPTIONS->User_Delta_Parameter[index_vv];-#else-        delta_parameter_vv = OPTIONS->Delta_X;-#endif--        /* generate first sample point */-        parameter_v_offset = current_generated_state->parameter[index_v] =-          (ONE + delta_parameter_v) * parameter_v;-        parameter_vv_offset = current_generated_state->parameter[index_vv] =-          (ONE + delta_parameter_vv) * parameter_vv;-        if (parameter_v_offset > parameter_maximum[index_v] ||-            parameter_v_offset < parameter_minimum[index_v]) {-          delta_parameter_v = -delta_parameter_v;-          current_generated_state->parameter[index_v] =-            (ONE + delta_parameter_v) * parameter_v;-        }-        if (parameter_vv_offset > parameter_maximum[index_vv] ||-            parameter_vv_offset < parameter_minimum[index_vv]) {-          delta_parameter_vv = -delta_parameter_vv;-          current_generated_state->parameter[index_vv] =-            (ONE + delta_parameter_vv) * parameter_vv;-        }--        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_1 = current_generated_state->cost;--        /* restore the v_th parameter */-        current_generated_state->parameter[index_v] = parameter_v;--        /* generate second sample point */-        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_2 = current_generated_state->cost;--        /* restore the vv_th parameter */-        current_generated_state->parameter[index_vv] = parameter_vv;--        /* generate third sample point */-        current_generated_state->parameter[index_v] =-          (ONE + delta_parameter_v) * parameter_v;-        *valid_state_generated_flag = TRUE;-#if USER_ACCEPTANCE_TEST-        OPTIONS->User_Acceptance_Flag = TRUE;-        OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-        current_generated_state->cost =-          user_cost_function (current_generated_state->parameter,-                              parameter_minimum,-                              parameter_maximum,-                              tangents,-                              curvature,-                              number_parameters,-                              parameter_type,-                              valid_state_generated_flag,-                              exit_status, OPTIONS);-        if (cost_function_test (current_generated_state->cost,-                                current_generated_state->parameter,-                                parameter_minimum,-                                parameter_maximum, number_parameters,-                                xnumber_parameters) == 0) {-          *exit_status = INVALID_COST_FUNCTION_DERIV;-          return;-        }-        if (*valid_state_generated_flag == FALSE)-          ++(*number_invalid_generated_states);-        new_cost_state_3 = current_generated_state->cost;--        /* restore the v_th parameter */-        current_generated_state->parameter[index_v] = parameter_v;--        /* calculate and store the curvature */-        curvature[index_vv_v] = curvature[index_v_vv] =-          (new_cost_state_1 - new_cost_state_2-           - new_cost_state_3 + recent_best_cost)-          / (delta_parameter_v * delta_parameter_vv-             * parameter_v * parameter_vv + (double) EPS_DOUBLE);-      }-    }-  }--  /* restore Immediate_Exit flag */-  OPTIONS->Immediate_Exit = immediate_flag;--  /* restore the best cost function value */-  current_generated_state->cost = recent_best_cost;-#if ASA_PRINT-  tmp_saved = *number_invalid_generated_states - saved_num_invalid_gen_states;-  if (tmp_saved > 0)-#if INT_LONG-    fprintf (ptr_asa_out,-             "Generated %ld invalid states when calculating the derivatives\n",-             tmp_saved);-#else-    fprintf (ptr_asa_out,-             "Generated %d invalid states when calculating the derivatives\n",-             tmp_saved);-#endif-#endif /* ASA_PRINT */-  *number_invalid_generated_states = saved_num_invalid_gen_states;-#if USER_ACCEPTANCE_TEST-  OPTIONS->User_Acceptance_Flag = TRUE;-  OPTIONS->Cost_Acceptance_Flag = FALSE;-#endif-}--/***********************************************************************-* asa_test_asa_options-*       Tests user's selected options-***********************************************************************/-#if HAVE_ANSI-int--asa_test_asa_options (LONG_INT * seed,-                      double *parameter_initial_final,-                      double *parameter_minimum,-                      double *parameter_maximum,-                      double *tangents,-                      double *curvature,-                      ALLOC_INT * number_parameters,-                      int *parameter_type,-                      int *valid_state_generated_flag,-                      int *exit_status,-                      FILE * ptr_asa_out, USER_DEFINES * OPTIONS)-#else-int--asa_test_asa_options (seed,-                      parameter_initial_final,-                      parameter_minimum,-                      parameter_maximum,-                      tangents,-                      curvature,-                      number_parameters,-                      parameter_type,-                      valid_state_generated_flag,-                      exit_status, ptr_asa_out, OPTIONS)-     LONG_INT *seed;-     double *parameter_initial_final;-     double *parameter_minimum;-     double *parameter_maximum;-     double *tangents;-     double *curvature;-     ALLOC_INT *number_parameters;-     int *parameter_type;-     int *valid_state_generated_flag;-     int *exit_status;-     FILE *ptr_asa_out;-     USER_DEFINES *OPTIONS;-#endif /* HAVE_ANSI */-{-  int invalid, index_v;--  invalid = 0;--  if (seed == NULL) {-    strcpy (exit_msg, "*** seed == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (parameter_initial_final == NULL) {-    strcpy (exit_msg, "*** parameter_initial_final == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (parameter_minimum == NULL) {-    strcpy (exit_msg, "*** parameter_minimum == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (parameter_maximum == NULL) {-    strcpy (exit_msg, "*** parameter_maximum == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (tangents == NULL) {-    strcpy (exit_msg, "*** tangents == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Curvature_0 == FALSE || OPTIONS->Curvature_0 == -1) {-    if (curvature == NULL) {-      strcpy (exit_msg, "*** curvature == NULL ***");-      print_string (ptr_asa_out, exit_msg);-      ++invalid;-    }-  }-  if (number_parameters == NULL) {-    strcpy (exit_msg, "*** number_parameters == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (parameter_type == NULL) {-    strcpy (exit_msg, "*** parameter_type == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (valid_state_generated_flag == NULL) {-    strcpy (exit_msg, "*** valid_state_generated_flag == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (exit_status == NULL) {-    strcpy (exit_msg, "*** exit_status == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS == NULL) {-    strcpy (exit_msg, "*** OPTIONS == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }--  VFOR (index_v) if (parameter_minimum[index_v] > parameter_maximum[index_v]) {-    strcpy (exit_msg, "*** parameter_minimum[] > parameter_maximum[] ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }-  VFOR (index_v)-    if (parameter_initial_final[index_v] < parameter_minimum[index_v]) {-    if (PARAMETER_RANGE_TOO_SMALL (index_v))-      continue;-    strcpy (exit_msg, "*** parameter_initial[] < parameter_minimum[] ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }-  VFOR (index_v)-    if (parameter_initial_final[index_v] > parameter_maximum[index_v]) {-    if (PARAMETER_RANGE_TOO_SMALL (index_v))-      continue;-    strcpy (exit_msg, "*** parameter_initial[] > parameter_maximum[] ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }-  if (*number_parameters < 1) {-    strcpy (exit_msg, "*** *number_parameters < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  VFOR (index_v)-    if (parameter_type[index_v] != -2 && parameter_type[index_v] != 2-        && parameter_type[index_v] != -1 && parameter_type[index_v] != 1) {-    strcpy (exit_msg,-            "*** parameter_type[] != -2 && parameter_type[] != 2 && parameter_type[] != -1 && parameter_type[] != 1 ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }--  if (OPTIONS_FILE != FALSE && OPTIONS_FILE != TRUE) {-    strcpy (exit_msg,-            "*** OPTIONS_FILE != FALSE && OPTIONS_FILE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS_FILE_DATA != FALSE && OPTIONS_FILE_DATA != TRUE) {-    strcpy (exit_msg,-            "*** OPTIONS_FILE_DATA != FALSE && OPTIONS_FILE_DATA != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (RECUR_OPTIONS_FILE != FALSE && RECUR_OPTIONS_FILE != TRUE) {-    strcpy (exit_msg,-            "*** RECUR_OPTIONS_FILE != FALSE && RECUR_OPTIONS_FILE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (RECUR_OPTIONS_FILE_DATA != FALSE && RECUR_OPTIONS_FILE_DATA != TRUE) {-    strcpy (exit_msg,-            "*** RECUR_OPTIONS_FILE_DATA != FALSE && RECUR_OPTIONS_FILE_DATA != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (COST_FILE != FALSE && COST_FILE != TRUE) {-    strcpy (exit_msg, "*** COST_FILE != FALSE && COST_FILE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_LIB != FALSE && ASA_LIB != TRUE) {-    strcpy (exit_msg, "*** ASA_LIB != FALSE && ASA_LIB != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (MY_TEMPLATE != FALSE && MY_TEMPLATE != TRUE) {-    strcpy (exit_msg, "*** MY_TEMPLATE != FALSE && MY_TEMPLATE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_LIB != FALSE && ASA_TEMPLATE_LIB != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_LIB != FALSE && ASA_TEMPLATE_LIB != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (HAVE_ANSI != FALSE && HAVE_ANSI != TRUE) {-    strcpy (exit_msg, "*** HAVE_ANSI != FALSE && HAVE_ANSI != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (IO_PROTOTYPES != FALSE && IO_PROTOTYPES != TRUE) {-    strcpy (exit_msg,-            "*** IO_PROTOTYPES != FALSE && IO_PROTOTYPES != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (TIME_CALC != FALSE && TIME_CALC != TRUE) {-    strcpy (exit_msg, "*** TIME_CALC != FALSE && TIME_CALC != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (TIME_STD != FALSE && TIME_STD != TRUE) {-    strcpy (exit_msg, "*** TIME_STD != FALSE && TIME_STD != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (TIME_GETRUSAGE != FALSE && TIME_GETRUSAGE != TRUE) {-    strcpy (exit_msg,-            "*** TIME_GETRUSAGE != FALSE && TIME_GETRUSAGE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (INT_LONG != FALSE && INT_LONG != TRUE) {-    strcpy (exit_msg, "*** INT_LONG != FALSE && INT_LONG != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (INT_ALLOC != FALSE && INT_ALLOC != TRUE) {-    strcpy (exit_msg, "*** INT_ALLOC != FALSE && INT_ALLOC != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (SMALL_FLOAT < ZERO) {-    strcpy (exit_msg, "*** SMALL_FLOAT < ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (MIN_DOUBLE < ZERO) {-    strcpy (exit_msg, "*** MIN_DOUBLE < ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (MAX_DOUBLE < ZERO) {-    strcpy (exit_msg, "*** MAX_DOUBLE < ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (EPS_DOUBLE < ZERO) {-    strcpy (exit_msg, "*** EPS_DOUBLE < ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (CHECK_EXPONENT != FALSE && CHECK_EXPONENT != TRUE) {-    strcpy (exit_msg,-            "*** CHECK_EXPONENT != FALSE && CHECK_EXPONENT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (NO_PARAM_TEMP_TEST != FALSE && NO_PARAM_TEMP_TEST != TRUE) {-    strcpy (exit_msg,-            "*** NO_PARAM_TEMP_TEST != FALSE && NO_PARAM_TEMP_TEST != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (NO_COST_TEMP_TEST != FALSE && NO_COST_TEMP_TEST != TRUE) {-    strcpy (exit_msg,-            "*** NO_COST_TEMP_TEST != FALSE && NO_COST_TEMP_TEST != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (SELF_OPTIMIZE != FALSE && SELF_OPTIMIZE != TRUE) {-    strcpy (exit_msg,-            "*** SELF_OPTIMIZE != FALSE && SELF_OPTIMIZE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEST != FALSE && ASA_TEST != TRUE) {-    strcpy (exit_msg, "*** ASA_TEST != FALSE && ASA_TEST != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEST_POINT != FALSE && ASA_TEST_POINT != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEST_POINT != FALSE && ASA_TEST_POINT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE != FALSE) {-    strcpy (exit_msg, "*** ASA_TEMPLATE != FALSE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_ASA_OUT_PID != FALSE && ASA_TEMPLATE_ASA_OUT_PID != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_ASA_OUT_PID != FALSE && ASA_TEMPLATE_ASA_OUT_PID != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_MULTIPLE != FALSE && ASA_TEMPLATE_MULTIPLE != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_MULTIPLE != FALSE && ASA_TEMPLATE_MULTIPLE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_SELFOPT != FALSE && ASA_TEMPLATE_SELFOPT != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_SELFOPT != FALSE && ASA_TEMPLATE_SELFOPT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_SAMPLE != FALSE && ASA_TEMPLATE_SAMPLE != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_SAMPLE != FALSE && ASA_TEMPLATE_SAMPLE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_QUEUE != FALSE && ASA_TEMPLATE_QUEUE != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_QUEUE != FALSE && ASA_TEMPLATE_QUEUE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_PARALLEL != FALSE && ASA_TEMPLATE_PARALLEL != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_PARALLEL != FALSE && ASA_TEMPLATE_PARALLEL != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_TEMPLATE_SAVE != FALSE && ASA_TEMPLATE_SAVE != TRUE) {-    strcpy (exit_msg,-            "*** ASA_TEMPLATE_SAVE != FALSE && ASA_TEMPLATE_SAVE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_INITIAL_COST_TEMP != FALSE && USER_INITIAL_COST_TEMP != TRUE) {-    strcpy (exit_msg,-            "*** USER_INITIAL_COST_TEMP != FALSE && USER_INITIAL_COST_TEMP != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (RATIO_TEMPERATURE_SCALES != FALSE && RATIO_TEMPERATURE_SCALES != TRUE) {-    strcpy (exit_msg,-            "*** RATIO_TEMPERATURE_SCALES != FALSE && RATIO_TEMPERATURE_SCALES != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_INITIAL_PARAMETERS_TEMPS != FALSE-      && USER_INITIAL_PARAMETERS_TEMPS != TRUE) {-    strcpy (exit_msg,-            "*** USER_INITIAL_PARAMETERS_TEMPS != FALSE && USER_INITIAL_PARAMETERS_TEMPS != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (DELTA_PARAMETERS != FALSE && DELTA_PARAMETERS != TRUE) {-    strcpy (exit_msg,-            "*** DELTA_PARAMETERS != FALSE && DELTA_PARAMETERS != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (QUENCH_PARAMETERS != FALSE && QUENCH_PARAMETERS != TRUE) {-    strcpy (exit_msg,-            "*** QUENCH_PARAMETERS != FALSE && QUENCH_PARAMETERS != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (QUENCH_COST != FALSE && QUENCH_COST != TRUE) {-    strcpy (exit_msg, "*** QUENCH_COST != FALSE && QUENCH_COST != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (QUENCH_PARAMETERS_SCALE != FALSE && QUENCH_PARAMETERS_SCALE != TRUE) {-    strcpy (exit_msg,-            "*** QUENCH_PARAMETERS_SCALE != FALSE && QUENCH_PARAMETERS_SCALE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (QUENCH_COST_SCALE != FALSE && QUENCH_COST_SCALE != TRUE) {-    strcpy (exit_msg,-            "*** QUENCH_COST_SCALE != FALSE && QUENCH_COST_SCALE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONAL_DATA_DBL != FALSE && OPTIONAL_DATA_DBL != TRUE) {-    strcpy (exit_msg,-            "*** OPTIONAL_DATA_DBL != FALSE && OPTIONAL_DATA_DBL != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONAL_DATA_INT != FALSE && OPTIONAL_DATA_INT != TRUE) {-    strcpy (exit_msg,-            "*** OPTIONAL_DATA_INT != FALSE && OPTIONAL_DATA_INT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONAL_DATA_PTR != FALSE && OPTIONAL_DATA_PTR != TRUE) {-    strcpy (exit_msg,-            "*** OPTIONAL_DATA_PTR != FALSE && OPTIONAL_DATA_PTR != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_COST_SCHEDULE != FALSE && USER_COST_SCHEDULE != TRUE) {-    strcpy (exit_msg,-            "*** USER_COST_SCHEDULE != FALSE && USER_COST_SCHEDULE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_ACCEPT_ASYMP_EXP != FALSE && USER_ACCEPT_ASYMP_EXP != TRUE) {-    strcpy (exit_msg,-            "*** USER_ACCEPT_ASYMP_EXP != FALSE && USER_ACCEPT_ASYMP_EXP != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_ACCEPT_THRESHOLD != FALSE && USER_ACCEPT_THRESHOLD != TRUE) {-    strcpy (exit_msg,-            "*** USER_ACCEPT_THRESHOLD != FALSE && USER_ACCEPT_THRESHOLD != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_ACCEPTANCE_TEST != FALSE && USER_ACCEPTANCE_TEST != TRUE) {-    strcpy (exit_msg,-            "*** USER_ACCEPTANCE_TEST != FALSE && USER_ACCEPTANCE_TEST != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_GENERATING_FUNCTION != FALSE && USER_GENERATING_FUNCTION != TRUE) {-    strcpy (exit_msg,-            "*** USER_GENERATING_FUNCTION != FALSE && USER_GENERATING_FUNCTION != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_REANNEAL_COST != FALSE && USER_REANNEAL_COST != TRUE) {-    strcpy (exit_msg,-            "*** USER_REANNEAL_COST != FALSE && USER_REANNEAL_COST != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_REANNEAL_PARAMETERS != FALSE && USER_REANNEAL_PARAMETERS != TRUE) {-    strcpy (exit_msg,-            "*** USER_REANNEAL_PARAMETERS != FALSE && USER_REANNEAL_PARAMETERS != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (MAXIMUM_REANNEAL_INDEX < 1) {-    strcpy (exit_msg, "*** MAXIMUM_REANNEAL_INDEX < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (REANNEAL_SCALE < ZERO) {-    strcpy (exit_msg, "*** REANNEAL_SCALE < ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_SAMPLE != FALSE && ASA_SAMPLE != TRUE) {-    strcpy (exit_msg, "*** ASA_SAMPLE != FALSE && ASA_SAMPLE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_QUEUE != FALSE && ASA_QUEUE != TRUE) {-    strcpy (exit_msg, "*** ASA_QUEUE != FALSE && ASA_QUEUE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_RESOLUTION != FALSE && ASA_RESOLUTION != TRUE) {-    strcpy (exit_msg,-            "*** ASA_RESOLUTION != FALSE && ASA_RESOLUTION != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (FITLOC != FALSE && FITLOC != TRUE) {-    strcpy (exit_msg, "*** FITLOC != FALSE && FITLOC != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (FITLOC_ROUND != FALSE && FITLOC_ROUND != TRUE) {-    strcpy (exit_msg,-            "*** FITLOC_ROUND != FALSE && FITLOC_ROUND != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (FITLOC_PRINT != FALSE && FITLOC_PRINT != TRUE) {-    strcpy (exit_msg,-            "*** FITLOC_PRINT != FALSE && FITLOC_PRINT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (MULTI_MIN != FALSE && MULTI_MIN != TRUE) {-    strcpy (exit_msg, "*** MULTI_MIN != FALSE && MULTI_MIN != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#if MULTI_MIN-  if (OPTIONS->Multi_Number <= 0) {-    strcpy (exit_msg, "*** OPTIONS->Multi_Number <= 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  VFOR (index_v) {-    if (((OPTIONS->Multi_Grid[index_v]) != (OPTIONS->Multi_Grid[index_v]))-        || OPTIONS->Multi_Grid[index_v] < 0) {-      strcpy (exit_msg,-              "*** (OPTIONS->Multi_Grid[]) != (OPTIONS->Multi_Grid[]) || OPTIONS->Multi_Grid[] < 0 ***");-      print_string_index (ptr_asa_out, exit_msg, index_v);-      ++invalid;-    }-  }-  if (OPTIONS->Multi_Specify != 0 && OPTIONS->Multi_Specify != 1) {-    strcpy (exit_msg,-            "*** OPTIONS->Multi_Specify != 0 && OPTIONS->Multi_Specify != 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-  if (ASA_PARALLEL != FALSE && ASA_PARALLEL != TRUE) {-    strcpy (exit_msg,-            "*** ASA_PARALLEL != FALSE && ASA_PARALLEL != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_SAVE != FALSE && ASA_SAVE != TRUE) {-    strcpy (exit_msg, "*** ASA_SAVE != FALSE && ASA_SAVE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_SAVE_OPT != FALSE && ASA_SAVE_OPT != TRUE) {-    strcpy (exit_msg,-            "*** ASA_SAVE_OPT != FALSE && ASA_SAVE_OPT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_SAVE_BACKUP != FALSE && ASA_SAVE_BACKUP != TRUE) {-    strcpy (exit_msg,-            "*** ASA_SAVE_BACKUP != FALSE && ASA_SAVE_BACKUP != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_PIPE != FALSE && ASA_PIPE != TRUE) {-    strcpy (exit_msg, "*** ASA_PIPE != FALSE && ASA_PIPE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_PIPE_FILE != FALSE && ASA_PIPE_FILE != TRUE) {-    strcpy (exit_msg,-            "*** ASA_PIPE_FILE != FALSE && ASA_PIPE_FILE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (SYSTEM_CALL != FALSE && SYSTEM_CALL != TRUE) {-    strcpy (exit_msg, "*** SYSTEM_CALL != FALSE && SYSTEM_CALL != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (FDLIBM_POW != FALSE && FDLIBM_POW != TRUE) {-    strcpy (exit_msg, "*** FDLIBM_POW != FALSE && FDLIBM_POW != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (FDLIBM_LOG != FALSE && FDLIBM_LOG != TRUE) {-    strcpy (exit_msg, "*** FDLIBM_LOG != FALSE && FDLIBM_LOG != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (FDLIBM_EXP != FALSE && FDLIBM_EXP != TRUE) {-    strcpy (exit_msg, "*** FDLIBM_EXP != FALSE && FDLIBM_EXP != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_PRINT != FALSE && ASA_PRINT != TRUE) {-    strcpy (exit_msg, "*** ASA_PRINT != FALSE && ASA_PRINT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (USER_ASA_OUT != FALSE && USER_ASA_OUT != TRUE) {-    strcpy (exit_msg,-            "*** USER_ASA_OUT != FALSE && USER_ASA_OUT != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_PRINT_INTERMED != FALSE && ASA_PRINT_INTERMED != TRUE) {-    strcpy (exit_msg,-            "*** ASA_PRINT_INTERMED != FALSE && ASA_PRINT_INTERMED != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (ASA_PRINT_MORE != FALSE && ASA_PRINT_MORE != TRUE) {-    strcpy (exit_msg,-            "*** ASA_PRINT_MORE != FALSE && ASA_PRINT_MORE != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (G_FIELD < 0) {-    strcpy (exit_msg, "*** G_FIELD < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (G_PRECISION < 0) {-    strcpy (exit_msg, "*** G_PRECISION < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }--  if (OPTIONS->Limit_Acceptances < 0) {-    strcpy (exit_msg, "*** Limit_Acceptances < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Limit_Generated < 0) {-    strcpy (exit_msg, "*** Limit_Generated < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Limit_Invalid_Generated_States < 0) {-    strcpy (exit_msg, "*** Limit_Invalid_Generated_States < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Accepted_To_Generated_Ratio <= ZERO) {-    strcpy (exit_msg, "*** Accepted_To_Generated_Ratio <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Cost_Precision <= ZERO) {-    strcpy (exit_msg, "*** Cost_Precision <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Maximum_Cost_Repeat < 0) {-    strcpy (exit_msg, "*** Maximum_Cost_Repeat < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Number_Cost_Samples == 0 || OPTIONS->Number_Cost_Samples == -1) {-    strcpy (exit_msg,-            "*** Number_Cost_Samples == 0 || Number_Cost_Samples == -1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Temperature_Ratio_Scale <= ZERO) {-    strcpy (exit_msg, "*** Temperature_Ratio_Scale <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Cost_Parameter_Scale_Ratio <= ZERO) {-    strcpy (exit_msg, "*** Cost_Parameter_Scale_Ratio <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Temperature_Anneal_Scale <= ZERO) {-    strcpy (exit_msg, "*** Temperature_Anneal_Scale <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#if USER_INITIAL_COST_TEMP-  if (OPTIONS->User_Cost_Temperature[0] <= ZERO) {-    strcpy (exit_msg, "*** User_Cost_Temperature[0] <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-  if (OPTIONS->Include_Integer_Parameters != FALSE-      && OPTIONS->Include_Integer_Parameters != TRUE) {-    strcpy (exit_msg, "");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->User_Initial_Parameters != FALSE-      && OPTIONS->User_Initial_Parameters != TRUE) {-    strcpy (exit_msg,-            "*** User_Initial_Parameters != FALSE && User_Initial_Parameters != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Sequential_Parameters >= *number_parameters) {-    strcpy (exit_msg, "*** Sequential_Parameters >= *number_parameters ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Initial_Parameter_Temperature <= ZERO) {-    strcpy (exit_msg, "*** Initial_Parameter_Temperature <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#if RATIO_TEMPERATURE_SCALES-  VFOR (index_v) if (OPTIONS->User_Temperature_Ratio[index_v] <= ZERO) {-    strcpy (exit_msg, "*** User_Temperature_Ratio[] <= ZERO ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }-#endif-#if USER_INITIAL_PARAMETERS_TEMPS-  VFOR (index_v) if (OPTIONS->User_Parameter_Temperature[index_v] <= ZERO) {-    strcpy (exit_msg, "*** User_Parameter_Temperature[] <= ZERO ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }-#endif-  if (OPTIONS->Acceptance_Frequency_Modulus < 0) {-    strcpy (exit_msg, "*** Acceptance_Frequency_Modulus < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Generated_Frequency_Modulus < 0) {-    strcpy (exit_msg, "*** Generated_Frequency_Modulus < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Reanneal_Cost == -1) {-    strcpy (exit_msg, "*** Reanneal_Cost == -1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Reanneal_Parameters != FALSE-      && OPTIONS->Reanneal_Parameters != TRUE) {-    strcpy (exit_msg,-            "*** Reanneal_Parameters != FALSE && Reanneal_Parameters != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Delta_X <= ZERO) {-    strcpy (exit_msg, "*** Delta_X <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#if DELTA_PARAMETERS-  VFOR (index_v) if (OPTIONS->User_Delta_Parameter[index_v] <= ZERO) {-    strcpy (exit_msg, "*** User_Delta_Parameter[] <= ZERO ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }-#endif-  if (OPTIONS->User_Tangents != FALSE && OPTIONS->User_Tangents != TRUE) {-    strcpy (exit_msg,-            "*** User_Tangents != FALSE && User_Tangents != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Curvature_0 != -1 && OPTIONS->Curvature_0 != FALSE-      && OPTIONS->Curvature_0 != TRUE) {-    strcpy (exit_msg,-            "*** Curvature_0 -1 && Curvature_0 != FALSE && Curvature_0 != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#if QUENCH_PARAMETERS-  VFOR (index_v) if (OPTIONS->User_Quench_Param_Scale[index_v] <= ZERO) {-    strcpy (exit_msg, "*** User_Quench_Param_Scale[] <= ZERO ***");-    print_string_index (ptr_asa_out, exit_msg, index_v);-    ++invalid;-  }-#endif-#if QUENCH_COST-  if (OPTIONS->User_Quench_Cost_Scale[0] <= ZERO) {-    strcpy (exit_msg, "*** User_Quench_Cost_Scale[0] <= ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if OPTIONAL_DATA_DBL-  if (OPTIONS->Asa_Data_Dim_Dbl < 1) {-    strcpy (exit_msg, "*** Asa_Data_Dim_Dbl < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Asa_Data_Dbl == NULL) {-    strcpy (exit_msg, "*** Asa_Data_Dbl == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if ASA_SAVE-  if (OPTIONS->Random_Array_Dim < 1) {-    strcpy (exit_msg, "*** Random_Array_Dim < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Random_Array == NULL) {-    strcpy (exit_msg, "*** Random_Array == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if OPTIONAL_DATA_INT-  if (OPTIONS->Asa_Data_Dim_Int < 1) {-    strcpy (exit_msg, "*** Asa_Data_Dim_Int < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Asa_Data_Int == NULL) {-    strcpy (exit_msg, "*** Asa_Data_Int == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if OPTIONAL_DATA_PTR-  if (OPTIONS->Asa_Data_Dim_Ptr < 1) {-    strcpy (exit_msg, "*** Asa_Data_Dim_Ptr < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Asa_Data_Ptr == NULL) {-    strcpy (exit_msg, "*** Asa_Data_Ptr == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if USER_ASA_OUT-  if (OPTIONS->Asa_Out_File == NULL) {-    strcpy (exit_msg, "*** Asa_Out_File == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if USER_COST_SCHEDULE-  if (OPTIONS->Cost_Schedule == NULL) {-    strcpy (exit_msg, "*** Cost_Schedule == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if USER_ACCEPTANCE_TEST-  if (OPTIONS->Acceptance_Test == NULL) {-    strcpy (exit_msg, "*** Acceptance_Test == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->User_Acceptance_Flag != FALSE-      && OPTIONS->User_Acceptance_Flag != TRUE) {-    strcpy (exit_msg,-            "*** User_Acceptance_Flag != FALSE && User_Acceptance_Flag != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Cost_Acceptance_Flag != FALSE-      && OPTIONS->Cost_Acceptance_Flag != TRUE) {-    strcpy (exit_msg,-            "*** Cost_Acceptance_Flag != FALSE && Cost_Acceptance_Flag != TRUE ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if USER_GENERATING_FUNCTION-  if (OPTIONS->Generating_Distrib == NULL) {-    strcpy (exit_msg, "*** Generating_Distrib == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if USER_REANNEAL_COST-  if (OPTIONS->Reanneal_Cost_Function == NULL) {-    strcpy (exit_msg, "*** Reanneal_Cost_Function == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if USER_REANNEAL_PARAMETERS-  if (OPTIONS->Reanneal_Params_Function == NULL) {-    strcpy (exit_msg, "*** Reanneal_Params_Function == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if ASA_SAMPLE-  if (OPTIONS->Bias_Generated == NULL) {-    strcpy (exit_msg, "*** Bias_Generated == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Limit_Weights < ZERO) {-    strcpy (exit_msg, "*** Limit_Weights < ZERO ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if ASA_QUEUE-  if (OPTIONS->Queue_Size < 0) {-    strcpy (exit_msg, "*** Queue_Size < 0 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Queue_Size > 0) {-    if (OPTIONS->Queue_Resolution == NULL) {-      strcpy (exit_msg, "*** Queue_Resolution == NULL ***");-      print_string (ptr_asa_out, exit_msg);-      ++invalid;-    }-  }-#endif-#if ASA_RESOLUTION-  if (OPTIONS->Coarse_Resolution == NULL) {-    strcpy (exit_msg, "*** Coarse_Resolution == NULL ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif-#if ASA_PARALLEL-  if (OPTIONS->Gener_Block < 1) {-    strcpy (exit_msg, "*** Gener_Block < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Gener_Block_Max < 1) {-    strcpy (exit_msg, "*** Gener_Block_Max < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-  if (OPTIONS->Gener_Mov_Avr < 1) {-    strcpy (exit_msg, "*** Gener_Mov_Avr < 1 ***");-    print_string (ptr_asa_out, exit_msg);-    ++invalid;-  }-#endif--  return (invalid);-}--/***********************************************************************-* cost_function_test-*       Tests user's returned cost function values and parameters-***********************************************************************/-#if HAVE_ANSI-int--cost_function_test (double cost,-                    double *parameter,-                    double *parameter_minimum,-                    double *parameter_maximum,-                    ALLOC_INT * number_parameters, double *xnumber_parameters)-#else-int--cost_function_test (cost,-                    parameter,-                    parameter_minimum, parameter_maximum,-                    number_parameters, xnumber_parameters)-     double cost;-     double *parameter;-     double *parameter_minimum;-     double *parameter_maximum;-     ALLOC_INT *number_parameters;-     double *xnumber_parameters;-#endif /* HAVE_ANSI */-{-  ALLOC_INT index_v;-  int test_flag;--  test_flag = 1;--  if (((cost) != (cost)) || (cost < -MAX_DOUBLE || cost > MAX_DOUBLE))-    test_flag = 0;--  *xnumber_parameters = (double) *number_parameters;-  VFOR (index_v) {-    if (PARAMETER_RANGE_TOO_SMALL (index_v)) {-      *xnumber_parameters -= 1.0;-      continue;-    }-    if (parameter[index_v] < parameter_minimum[index_v] ||-        parameter[index_v] > parameter_maximum[index_v]) {-      test_flag = 0;-    }-  }--  return (test_flag);-}--/***********************************************************************-* print_string-*	This prints the designated string-***********************************************************************/-#if HAVE_ANSI-void-print_string (FILE * ptr_asa_out, char *string)-#else-void-print_string (ptr_asa_out, string)-     FILE *ptr_asa_out;-     char *string;-#endif /* HAVE_ANSI */-{-#if INCL_STDOUT-  printf ("\n\n%s\n\n", string);-#endif /* INCL_STDOUT */-#if ASA_PRINT-  fprintf (ptr_asa_out, "\n\n%s\n\n", string);-#else-#endif-}--/***********************************************************************-* print_string_index-*	This prints the designated string and index-***********************************************************************/-#if HAVE_ANSI-void-print_string_index (FILE * ptr_asa_out, char *string, ALLOC_INT index)-#else-void-print_string_index (ptr_asa_out, string, index)-     FILE *ptr_asa_out;-     char *string;-     ALLOC_INT index;-#endif /* HAVE_ANSI */-{-#if INCL_STDOUT-#if INT_ALLOC-  printf ("\n\n%s index = %d\n\n", string, index);-#else /* INT_ALLOC */-#if INT_LONG-  printf ("\n\n%s index = %ld\n\n", string, index);-#else /* INT_LONG */-  printf ("\n\n%s index = %ld\n\n", string, index);-#endif /* INT_LONG */-#endif /* INT_ALLOC */-#endif /* INCL_STDOUT */--#if ASA_PRINT-#if INT_ALLOC-  fprintf (ptr_asa_out, "\n\n%s index = %d\n\n", string, index);-#else /* INT_ALLOC */-#if INT_LONG-  fprintf (ptr_asa_out, "\n\n%s index = %ld\n\n", string, index);-#else /* INT_LONG */-  fprintf (ptr_asa_out, "\n\n%s index = %d\n\n", string, index);-#endif /* INT_LONG */-#endif /* INT_ALLOC */-#else /* ASA_PRINT */-  ;-#endif /* ASA_PRINT */-}--#if ASA_PRINT-/***********************************************************************-* print_state-*	Prints a description of the current state of the system-***********************************************************************/-void-print_state (double *parameter_minimum,-             double *parameter_maximum,-             double *tangents,-             double *curvature,-             double *current_cost_temperature,-             double *current_user_parameter_temp,-             double *accepted_to_generated_ratio,-             ALLOC_INT * number_parameters,-             int *curvature_flag,-             LONG_INT * number_accepted,-             LONG_INT * index_cost_acceptances,-             LONG_INT * number_generated,-             LONG_INT * number_invalid_generated_states,-             STATE * last_saved_state,-             STATE * best_generated_state,-             FILE * ptr_asa_out, USER_DEFINES * OPTIONS)-{-  ALLOC_INT index_v;-  ALLOC_INT index_vv, index_v_vv;--  fprintf (ptr_asa_out, "\n");-#if TIME_CALC-  print_time ("", ptr_asa_out);-#endif--  if (OPTIONS->Curvature_0 == TRUE)-    *curvature_flag = FALSE;-  if (OPTIONS->Curvature_0 == -1)-    *curvature_flag = TRUE;--#if INT_LONG-  fprintf (ptr_asa_out,-           "*index_cost_acceptances = %ld, *current_cost_temperature = %*.*g\n",-           *index_cost_acceptances,-           G_FIELD, G_PRECISION, *current_cost_temperature);-  fprintf (ptr_asa_out, "*accepted_to_generated_ratio = %*.*g,\- *number_invalid... = %ld\n", G_FIELD, G_PRECISION, *accepted_to_generated_ratio, (*number_invalid_generated_states));-  fprintf (ptr_asa_out,-           "*number_generated = %ld, *number_accepted = %ld\n",-           *number_generated, *number_accepted);-#else-  fprintf (ptr_asa_out,-           "*index_cost_acceptances = %d, *current_cost_temperature = %*.*g\n",-           *index_cost_acceptances,-           G_FIELD, G_PRECISION, *current_cost_temperature);-  fprintf (ptr_asa_out, "*accepted_to_generated_ratio = %*.*g,\- *number_invalid... = %d\n", G_FIELD, G_PRECISION, *accepted_to_generated_ratio, *number_invalid_generated_states);-  fprintf (ptr_asa_out,-           "*number_generated = %d, *number_accepted = %d\n",-           *number_generated, *number_accepted);-#endif--  fprintf (ptr_asa_out, "best...->cost = %*.*g,\- last...->cost = %*.*g\n", G_FIELD, G_PRECISION, best_generated_state->cost, G_FIELD, G_PRECISION, last_saved_state->cost);--  /* Note that tangents will not be calculated until reanneal-     is called, and therefore their listing in the printout only-     is relevant then */--  fprintf (ptr_asa_out,-           "index_v  best...->parameter current_parameter_temp\ttangent\n");-  VFOR (index_v) {-    /* ignore too small ranges */-#if DROPPED_PARAMETERS-    if (PARAMETER_RANGE_TOO_SMALL (index_v))-      continue;-#endif-    fprintf (ptr_asa_out,-#if INT_ALLOC-             "%d\t%*.*g\t\t%*.*g\t%*.*g\n",-#else-#if INT_LONG-             "%ld\t%*.*g\t\t%*.*g\t%*.*g\n",-#else-             "%d\t%*.*g\t\t%*.*g\t%*.*g\n",-#endif-#endif-             index_v,-             G_FIELD, G_PRECISION, best_generated_state->parameter[index_v],-             G_FIELD, G_PRECISION, current_user_parameter_temp[index_v],-             G_FIELD, G_PRECISION, tangents[index_v]);-  }--  if (*curvature_flag == TRUE) {-    /* print curvatures */-    VFOR (index_v) {-      /* ignore too small ranges */-      if (PARAMETER_RANGE_TOO_SMALL (index_v))-        continue;-      fprintf (ptr_asa_out, "\n");-      VFOR (index_vv) {-        /* only print upper diagonal of matrix */-        if (index_v < index_vv)-          continue;-        /* ignore too small ranges (index_vv) */-        if (PARAMETER_RANGE_TOO_SMALL (index_vv))-          continue;--        /* index_v_vv: row index_v, column index_vv */-        index_v_vv = ROW_COL_INDEX (index_v, index_vv);--        if (index_v == index_vv) {-          fprintf (ptr_asa_out,-#if INT_ALLOC-                   "curvature[%d][%d] = %*.*g\n",-#else-#if INT_LONG-                   "curvature[%ld][%ld] = %*.*g\n",-#else-                   "curvature[%d][%d] = %*.*g\n",-#endif-#endif-                   index_v, index_vv,-                   G_FIELD, G_PRECISION, curvature[index_v_vv]);-        } else {-          fprintf (ptr_asa_out,-#if INT_ALLOC-                   "curvature[%d][%d] = %*.*g \t = curvature[%d][%d]\n",-#else-#if INT_LONG-                   "curvature[%ld][%ld] = %*.*g \t = curvature[%ld][%ld]\n",-#else-                   "curvature[%d][%d] = %*.*g \t = curvature[%d][%d]\n",-#endif-#endif-                   index_v, index_vv,-                   G_FIELD, G_PRECISION, curvature[index_v_vv],-                   index_vv, index_v);-        }-      }-    }-  }-  fprintf (ptr_asa_out, "\n");-  fflush (ptr_asa_out);--}--/***********************************************************************-* print_asa_options-*	Prints user's selected options-***********************************************************************/-void-print_asa_options (FILE * ptr_asa_out, USER_DEFINES * OPTIONS)-{-  fprintf (ptr_asa_out, "\t\tADAPTIVE SIMULATED ANNEALING\n\n");--  fprintf (ptr_asa_out, "%s\n\n", ASA_ID);--  fprintf (ptr_asa_out, "OPTIONS_FILE = %d\n", (int) OPTIONS_FILE);-  fprintf (ptr_asa_out, "OPTIONS_FILE_DATA = %d\n", (int) OPTIONS_FILE_DATA);-  fprintf (ptr_asa_out, "RECUR_OPTIONS_FILE = %d\n",-           (int) RECUR_OPTIONS_FILE);-  fprintf (ptr_asa_out, "RECUR_OPTIONS_FILE_DATA = %d\n",-           (int) RECUR_OPTIONS_FILE_DATA);-  fprintf (ptr_asa_out, "COST_FILE = %d\n", (int) COST_FILE);-  fprintf (ptr_asa_out, "ASA_LIB = %d\n", (int) ASA_LIB);-  fprintf (ptr_asa_out, "HAVE_ANSI = %d\n", (int) HAVE_ANSI);-  fprintf (ptr_asa_out, "IO_PROTOTYPES = %d\n", (int) IO_PROTOTYPES);-  fprintf (ptr_asa_out, "TIME_CALC = %d\n", (int) TIME_CALC);-  fprintf (ptr_asa_out, "TIME_STD = %d\n", (int) TIME_STD);-  fprintf (ptr_asa_out, "TIME_GETRUSAGE = %d\n", (int) TIME_GETRUSAGE);-  fprintf (ptr_asa_out, "INT_LONG = %d\n", (int) INT_LONG);-  fprintf (ptr_asa_out, "INT_ALLOC = %d\n", (int) INT_ALLOC);-  fprintf (ptr_asa_out, "SMALL_FLOAT = %*.*g\n",-           G_FIELD, G_PRECISION, (double) SMALL_FLOAT);-  fprintf (ptr_asa_out, "MIN_DOUBLE = %*.*g\n",-           G_FIELD, G_PRECISION, (double) MIN_DOUBLE);-  fprintf (ptr_asa_out, "MAX_DOUBLE = %*.*g\n",-           G_FIELD, G_PRECISION, (double) MAX_DOUBLE);-  fprintf (ptr_asa_out, "EPS_DOUBLE = %*.*g\n",-           G_FIELD, G_PRECISION, (double) EPS_DOUBLE);-  fprintf (ptr_asa_out, "CHECK_EXPONENT = %d\n", (int) CHECK_EXPONENT);-  fprintf (ptr_asa_out, "NO_PARAM_TEMP_TEST = %d\n",-           (int) NO_PARAM_TEMP_TEST);-  fprintf (ptr_asa_out, "NO_COST_TEMP_TEST = %d\n", (int) NO_COST_TEMP_TEST);-  fprintf (ptr_asa_out, "SELF_OPTIMIZE = %d\n", (int) SELF_OPTIMIZE);-  fprintf (ptr_asa_out, "ASA_TEST = %d\n", (int) ASA_TEST);-  fprintf (ptr_asa_out, "ASA_TEST_POINT = %d\n", (int) ASA_TEST_POINT);-  fprintf (ptr_asa_out, "ASA_TEMPLATE = %d\n", (int) ASA_TEMPLATE);-  fprintf (ptr_asa_out, "MY_TEMPLATE = %d\n", (int) MY_TEMPLATE);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_LIB = %d\n", (int) ASA_TEMPLATE_LIB);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_ASA_OUT_PID = %d\n",-           (int) ASA_TEMPLATE_ASA_OUT_PID);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_MULTIPLE = %d\n",-           (int) ASA_TEMPLATE_MULTIPLE);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_SELFOPT = %d\n",-           (int) ASA_TEMPLATE_SELFOPT);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_SAMPLE = %d\n",-           (int) ASA_TEMPLATE_SAMPLE);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_QUEUE = %d\n",-           (int) ASA_TEMPLATE_QUEUE);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_PARALLEL = %d\n",-           (int) ASA_TEMPLATE_PARALLEL);-  fprintf (ptr_asa_out, "ASA_TEMPLATE_SAVE = %d\n", (int) ASA_TEMPLATE_SAVE);-  fprintf (ptr_asa_out, "USER_INITIAL_COST_TEMP = %d\n",-           (int) USER_INITIAL_COST_TEMP);-  fprintf (ptr_asa_out, "RATIO_TEMPERATURE_SCALES = %d\n",-           (int) RATIO_TEMPERATURE_SCALES);-  fprintf (ptr_asa_out, "USER_INITIAL_PARAMETERS_TEMPS = %d\n",-           (int) USER_INITIAL_PARAMETERS_TEMPS);-  fprintf (ptr_asa_out, "DELTA_PARAMETERS = %d\n", (int) DELTA_PARAMETERS);-  fprintf (ptr_asa_out, "QUENCH_PARAMETERS = %d\n", (int) QUENCH_PARAMETERS);-  fprintf (ptr_asa_out, "QUENCH_COST = %d\n", (int) QUENCH_COST);-  fprintf (ptr_asa_out, "QUENCH_PARAMETERS_SCALE = %d\n",-           (int) QUENCH_PARAMETERS_SCALE);-  fprintf (ptr_asa_out, "QUENCH_COST_SCALE = %d\n", (int) QUENCH_COST_SCALE);-  fprintf (ptr_asa_out, "OPTIONAL_DATA_DBL = %d\n", (int) OPTIONAL_DATA_DBL);-  fprintf (ptr_asa_out, "OPTIONAL_DATA_INT = %d\n", (int) OPTIONAL_DATA_INT);-  fprintf (ptr_asa_out, "OPTIONAL_DATA_PTR = %d\n", (int) OPTIONAL_DATA_PTR);-  fprintf (ptr_asa_out, "USER_COST_SCHEDULE = %d\n",-           (int) USER_COST_SCHEDULE);-  fprintf (ptr_asa_out, "USER_ACCEPT_ASYMP_EXP = %d\n",-           (int) USER_ACCEPT_ASYMP_EXP);-  fprintf (ptr_asa_out, "USER_ACCEPT_THRESHOLD = %d\n",-           (int) USER_ACCEPT_THRESHOLD);-  fprintf (ptr_asa_out, "USER_ACCEPTANCE_TEST = %d\n",-           (int) USER_ACCEPTANCE_TEST);-  fprintf (ptr_asa_out, "USER_GENERATING_FUNCTION = %d\n",-           (int) USER_GENERATING_FUNCTION);-  fprintf (ptr_asa_out, "USER_REANNEAL_COST = %d\n",-           (int) USER_REANNEAL_COST);-  fprintf (ptr_asa_out, "USER_REANNEAL_PARAMETERS = %d\n",-           (int) USER_REANNEAL_PARAMETERS);-#if INT_LONG-  fprintf (ptr_asa_out, "MAXIMUM_REANNEAL_INDEX = %ld\n",-           (LONG_INT) MAXIMUM_REANNEAL_INDEX);-#else-  fprintf (ptr_asa_out, "MAXIMUM_REANNEAL_INDEX = %d\n",-           (LONG_INT) MAXIMUM_REANNEAL_INDEX);-#endif-  fprintf (ptr_asa_out, "REANNEAL_SCALE = %*.*g\n",-           G_FIELD, G_PRECISION, (double) REANNEAL_SCALE);-  fprintf (ptr_asa_out, "ASA_SAMPLE = %d\n", (int) ASA_SAMPLE);-  fprintf (ptr_asa_out, "ASA_QUEUE = %d\n", (int) ASA_QUEUE);-  fprintf (ptr_asa_out, "ASA_RESOLUTION = %d\n", (int) ASA_RESOLUTION);-  fprintf (ptr_asa_out, "FITLOC = %d\n", (int) FITLOC);-  fprintf (ptr_asa_out, "FITLOC_ROUND = %d\n", (int) FITLOC_ROUND);-  fprintf (ptr_asa_out, "FITLOC_PRINT = %d\n", (int) FITLOC_PRINT);-  fprintf (ptr_asa_out, "MULTI_MIN = %d\n", (int) MULTI_MIN);-  fprintf (ptr_asa_out, "ASA_PARALLEL = %d\n", (int) ASA_PARALLEL);-  fprintf (ptr_asa_out, "FDLIBM_POW = %d\n", (int) FDLIBM_POW);-  fprintf (ptr_asa_out, "FDLIBM_LOG = %d\n", (int) FDLIBM_LOG);-  fprintf (ptr_asa_out, "FDLIBM_EXP = %d\n\n", (int) FDLIBM_EXP);--  fprintf (ptr_asa_out, "ASA_PRINT = %d\n", (int) ASA_PRINT);-  fprintf (ptr_asa_out, "USER_OUT = %s\n", USER_OUT);-#if USER_ASA_OUT-  fprintf (ptr_asa_out, "ASA_OUT = %s\n", OPTIONS->Asa_Out_File);-#else-  fprintf (ptr_asa_out, "ASA_OUT = %s\n", ASA_OUT);-#endif-  fprintf (ptr_asa_out, "USER_ASA_OUT = %d\n", (int) USER_ASA_OUT);-  fprintf (ptr_asa_out, "ASA_PRINT_INTERMED = %d\n",-           (int) ASA_PRINT_INTERMED);-  fprintf (ptr_asa_out, "ASA_PRINT_MORE = %d\n", (int) ASA_PRINT_MORE);-  fprintf (ptr_asa_out, "INCL_STDOUT = %d\n", (int) INCL_STDOUT);-  fprintf (ptr_asa_out, "G_FIELD = %d\n", (int) G_FIELD);-  fprintf (ptr_asa_out, "G_PRECISION = %d\n", (int) G_PRECISION);-  fprintf (ptr_asa_out, "ASA_SAVE = %d\n", (int) ASA_SAVE);-  fprintf (ptr_asa_out, "ASA_SAVE_OPT = %d\n", (int) ASA_SAVE_OPT);-  fprintf (ptr_asa_out, "ASA_SAVE_BACKUP = %d\n", (int) ASA_SAVE_BACKUP);-  fprintf (ptr_asa_out, "ASA_PIPE = %d\n", (int) ASA_PIPE);-  fprintf (ptr_asa_out, "ASA_PIPE_FILE = %d\n", (int) ASA_PIPE_FILE);-  fprintf (ptr_asa_out, "SYSTEM_CALL = %d\n\n", (int) SYSTEM_CALL);--#if INT_LONG-  fprintf (ptr_asa_out, "OPTIONS->Limit_Acceptances = %ld\n",-           (LONG_INT) OPTIONS->Limit_Acceptances);-  fprintf (ptr_asa_out, "OPTIONS->Limit_Generated = %ld\n",-           (LONG_INT) OPTIONS->Limit_Generated);-#else-  fprintf (ptr_asa_out, "OPTIONS->Limit_Acceptances = %d\n",-           (LONG_INT) OPTIONS->Limit_Acceptances);-  fprintf (ptr_asa_out, "OPTIONS->Limit_Generated = %d\n",-           (LONG_INT) OPTIONS->Limit_Generated);-#endif-  fprintf (ptr_asa_out, "OPTIONS->Limit_Invalid_Generated_States = %d\n",-           OPTIONS->Limit_Invalid_Generated_States);-  fprintf (ptr_asa_out, "OPTIONS->Accepted_To_Generated_Ratio = %*.*g\n\n",-           G_FIELD, G_PRECISION, OPTIONS->Accepted_To_Generated_Ratio);--  fprintf (ptr_asa_out, "OPTIONS->Cost_Precision = %*.*g\n",-           G_FIELD, G_PRECISION, OPTIONS->Cost_Precision);-  fprintf (ptr_asa_out, "OPTIONS->Maximum_Cost_Repeat = %d\n",-           OPTIONS->Maximum_Cost_Repeat);-  fprintf (ptr_asa_out, "OPTIONS->Number_Cost_Samples = %d\n",-           OPTIONS->Number_Cost_Samples);-  fprintf (ptr_asa_out, "OPTIONS->Temperature_Ratio_Scale = %*.*g\n",-           G_FIELD, G_PRECISION, OPTIONS->Temperature_Ratio_Scale);-  fprintf (ptr_asa_out, "OPTIONS->Cost_Parameter_Scale_Ratio = %*.*g\n",-           G_FIELD, G_PRECISION, OPTIONS->Cost_Parameter_Scale_Ratio);-  fprintf (ptr_asa_out, "OPTIONS->Temperature_Anneal_Scale = %*.*g\n",-           G_FIELD, G_PRECISION, OPTIONS->Temperature_Anneal_Scale);--  fprintf (ptr_asa_out, "OPTIONS->Include_Integer_Parameters = %d\n",-           OPTIONS->Include_Integer_Parameters);-  fprintf (ptr_asa_out, "OPTIONS->User_Initial_Parameters = %d\n",-           OPTIONS->User_Initial_Parameters);-#if INT_ALLOC-  fprintf (ptr_asa_out, "OPTIONS->Sequential_Parameters = %d\n",-           (int) OPTIONS->Sequential_Parameters);-#else-#if INT_LONG-  fprintf (ptr_asa_out, "OPTIONS->Sequential_Parameters = %ld\n",-           (LONG_INT) OPTIONS->Sequential_Parameters);-#else-  fprintf (ptr_asa_out, "OPTIONS->Sequential_Parameters = %d\n",-           (LONG_INT) OPTIONS->Sequential_Parameters);-#endif-#endif-  fprintf (ptr_asa_out, "OPTIONS->Initial_Parameter_Temperature = %*.*g\n",-           G_FIELD, G_PRECISION, OPTIONS->Initial_Parameter_Temperature);--  fprintf (ptr_asa_out, "OPTIONS->Acceptance_Frequency_Modulus = %d\n",-           OPTIONS->Acceptance_Frequency_Modulus);-  fprintf (ptr_asa_out, "OPTIONS->Generated_Frequency_Modulus = %d\n",-           OPTIONS->Generated_Frequency_Modulus);-  fprintf (ptr_asa_out, "OPTIONS->Reanneal_Cost = %d\n",-           OPTIONS->Reanneal_Cost);-  fprintf (ptr_asa_out, "OPTIONS->Reanneal_Parameters = %d\n\n",-           OPTIONS->Reanneal_Parameters);--  fprintf (ptr_asa_out, "OPTIONS->Delta_X = %*.*g\n",-           G_FIELD, G_PRECISION, OPTIONS->Delta_X);-  fprintf (ptr_asa_out, "OPTIONS->User_Tangents = %d\n",-           OPTIONS->User_Tangents);-  fprintf (ptr_asa_out, "OPTIONS->Curvature_0 = %d\n", OPTIONS->Curvature_0);-  fprintf (ptr_asa_out, "OPTIONS->Asa_Recursive_Level = %d\n\n",-           OPTIONS->Asa_Recursive_Level);--  fprintf (ptr_asa_out, "\n");-}-#endif /* ASA_PRINT */--#if TIME_CALC-#if TIME_GETRUSAGE-/***********************************************************************-* print_time-*	This calculates the time and runtime and prints it.-***********************************************************************/-#if HAVE_ANSI-void-print_time (char *message, FILE * ptr_asa_out)-#else-void-print_time (message, ptr_asa_out)-     char *message;-     FILE *ptr_asa_out;-#endif /* HAVE_ANSI */-{-  int who = RUSAGE_SELF;        /* Check our own time */-  struct rusage usage;--  /* get the resource usage information */-#if TIME_STD-  syscall (SYS_GETRUSAGE, who, &usage);-#else-  getrusage (who, &usage);-#endif--  /* print the usage time in reasonable form */-  aux_print_time (&usage.ru_utime, message, ptr_asa_out);-}--/***********************************************************************-* aux_print_time-*      auxiliary print the time routine-***********************************************************************/-#if HAVE_ANSI-void-aux_print_time (struct timeval *time, char *message, FILE * ptr_asa_out)-#else-void-aux_print_time (time, message, ptr_asa_out)-     struct timeval *time;-     char *message;-     FILE *ptr_asa_out;-#endif /* HAVE_ANSI */-{-  static double sx;-  double us, s, m, h;-  double ds, dm, dh;--  /* calculate the new microseconds, seconds, minutes, hours-     and the differences since the last call */-  us = (double) ((int) ((double) EPS_DOUBLE + time->tv_usec)) / 1.E6;-  s = (double) ((int) ((double) EPS_DOUBLE + time->tv_sec)) + us;-  ds = s - sx;-  sx = s;--  h = (int) ((double) EPS_DOUBLE + s / 3600.);-  m = (int) ((double) EPS_DOUBLE + s / 60.) - 60. * h;-  s -= (3600. * h + 60. * m);-  dh = (int) ((double) EPS_DOUBLE + ds / 3600.);-  dm = (int) ((double) EPS_DOUBLE + ds / 60.) - 60. * dh;-  ds -= (3600. * dh + 60. * dm);--  /* print the statistics */-  fprintf (ptr_asa_out,-           "%s:time: %gh %gm %gs; incr: %gh %gm %gs\n",-           message, h, m, s, dh, dm, ds);-}-#else /* TIME_GETRUSAGE */-  /* Note that on many machines the time resolution of this algorithm-   * may be less than the other alternatives, e.g., rounding off the-   * number of ticks to the nearest tens of thousands.  Also, because-   * time here is typically indexed by a long integer, there typically-   * is a cycle of time in periods of fractions of an hour.  For-   * example, under Solaris 2.5.1:  The value returned by clock() is-   * defined in microseconds, since the first call to clock(), for-   *  compatibility with  systems that have * CPU clocks with much higher-   * resolution.  Because of this, the value returned will wrap around-   * after accumulating only 2147 seconds of CPU time (about 36 minutes).-   *-   * See asa.h for two places where some additional modifications should-   * be made under SunOS 4.1.x. */--#if HAVE_ANSI-void-print_time (char *message, FILE * ptr_asa_out)-#else-void-print_time (message, ptr_asa_out)-     char *message;-     FILE *ptr_asa_out;-#endif /* HAVE_ANSI */-{-  aux_print_time (clock (), message, ptr_asa_out);--}                               /*print_time */--/***********************************************************************-* aux_print_time-*      auxiliary print the time routine-***********************************************************************/-#if HAVE_ANSI-void-aux_print_time (clock_t time, char *message, FILE * ptr_asa_out)-#else-void-aux_print_time (time, message, ptr_asa_out)-     clock_t time;-     char *message;-     FILE *ptr_asa_out;-#endif /* HAVE_ANSI */-{-  static clock_t previousTime = -1;-  clock_t diffTime;-  double clocksPerSecF = CLOCKS_PER_SEC;-  double timeF, diffF;-  double s, m, h;-  double ds, dm, dh;--  if (previousTime != -1) {-    diffTime = time - previousTime;-    timeF = time;-    diffF = diffTime;-    previousTime = time;--    s = timeF / clocksPerSecF;-    ds = diffF / clocksPerSecF;--    h = (int) ((double) EPS_DOUBLE + s / 3600.);-    m = (int) ((double) EPS_DOUBLE + s / 60.) - 60. * h;-    s -= (3600. * h + 60. * m);-    dh = (int) ((double) EPS_DOUBLE + ds / 3600.);-    dm = (int) ((double) EPS_DOUBLE + ds / 60.) - 60. * dh;-    ds -= (3600. * dh + 60. * dm);--    fprintf (ptr_asa_out,-             "%s:time: %gh %gm %gs; incr: %gh %gm %gs\n",-             message, h, m, s, dh, dm, ds);-  } else {-    /* The first call will be invalid - don't output anything. */-    fprintf (ptr_asa_out, "TIMING PARAMETERS: ticks/sec: %lu\n",-             CLOCKS_PER_SEC);-    previousTime = time;-  }-}                               /* aux_print_time */--#endif /* TIME_GETRUSAGE */--#endif /* TIME_CALC */--#if MULTI_MIN-#if HAVE_ANSI-static int-multi_compare (const void *ii, const void *jj)-#else /* HAVE_ANSI */-static int-multi_compare (ii, jj)-     char *ii;-     char *jj;-#endif /* HAVE_ANSI */-{-  int i;-  int j;--  i = *(int *) ii;-  j = *(int *) jj;--  if (multi_cost_qsort[i] > multi_cost_qsort[j] + (double) EPS_DOUBLE)-    return (1);-  else if (multi_cost_qsort[i] < multi_cost_qsort[j] - (double) EPS_DOUBLE)-    return (-1);-  else-    return (0);-}-#endif /* MULTI_MIN */--#if ASA_PARALLEL-#if HAVE_ANSI-static int-sort_parallel (const void *ii, const void *jj)-#else /* HAVE_ANSI */-static int-sort_parallel (ii, jj)-     void *ii;-     void *jj;-#endif /* HAVE_ANSI */-{-  LONG_INT i;-  LONG_INT j;--  i = *(LONG_INT *) ii;-  j = *(LONG_INT *) jj;--  if (gener_block_state_qsort[i].cost > gener_block_state_qsort[j].cost)-    return (1);-  else if (gener_block_state_qsort[i].cost < gener_block_state_qsort[j].cost)-    return (-1);-  else-    return (0);-}-#endif /* ASA_PARALLEL */-#if HAVE_ANSI-void-Exit_ASA (char *statement)-#else /* HAVE_ANSI */-void-Exit_ASA (statement)-     char *statement;-#endif /* HAVE_ANSI */-{-#if INCL_STDOUT-  printf ("\n\n*** EXIT calloc failed in ASA *** %s\n\n", statement);-#else-  ;-#endif /* INCL_STDOUT */-}
− _darcs/pristine/asa.h
@@ -1,337 +0,0 @@-#ifndef _ASA_H_-#define _ASA_H_--/***********************************************************************-* Adaptive Simulated Annealing (ASA)-* Lester Ingber <ingber@ingber.com>-* Copyright (c) 1993-2004 Lester Ingber.  All Rights Reserved.-* The LICENSE file must be included with ASA code.-***********************************************************************/-- /* $Id: asa.h,v 25.15 2004/09/23 18:10:48 ingber Exp ingber $ */-- /* asa.h for Adaptive Simulated Annealing */--#include "asa_usr_asa.h"--#define ZERO			((double) 0.0)-#define ONE			((double) 1.0)-#define TWO			((double) 2.0)-#define TEN			((double) 10.0)-#define HALF			((double) 0.5)--#define NORMAL_EXIT			((int) 0)-#define P_TEMP_TOO_SMALL		((int) 1)-#define C_TEMP_TOO_SMALL		((int) 2)-#define COST_REPEATING			((int) 3)-#define TOO_MANY_INVALID_STATES		((int) 4)-#define IMMEDIATE_EXIT			((int) 5)-#define INVALID_USER_INPUT		((int) 7)-#define INVALID_COST_FUNCTION		((int) 8)-#define INVALID_COST_FUNCTION_DERIV	((int) 9)-#define CALLOC_FAILED			((int) -1)--#ifndef TIME_STD-#define TIME_STD FALSE-#endif--#ifndef TIME_GETRUSAGE-#define TIME_GETRUSAGE TRUE-#endif--#if TIME_CALC-#if TIME_GETRUSAGE-#include <sys/time.h>-#include <sys/resource.h>-#if TIME_STD-#include <sys/syscall.h>-#endif /* TIME_STD */-#else /* TIME_GETRUSAGE */-#if TRUE                        /* change to FALSE for SunOS 4.1.x */-#include <time.h>-#else-#include </usr/5include/time.h>-#endif-#endif /* TIME_GETRUSAGE */-#endif /* TIME_CALC */-- /* Set this to TRUE to override the P_TEMP_TOO_SMALL test */-#ifndef NO_PARAM_TEMP_TEST-#define NO_PARAM_TEMP_TEST FALSE-#endif-- /* Set this to TRUE to override the C_TEMP_TOO_SMALL test */-#ifndef NO_COST_TEMP_TEST-#define NO_COST_TEMP_TEST FALSE-#endif--#ifndef SYSTEM_CALL-#define SYSTEM_CALL TRUE-#endif-- /* Printing Options */--#ifndef ASA_PRINT-#define ASA_PRINT TRUE-#endif--#if ASA_PRINT-#else-#if ASA_SAMPLE-#define ASA_PRINT TRUE-#endif-#endif--#ifndef ASA_OUT-#define ASA_OUT "asa_out"-#endif--#ifndef DROPPED_PARAMETERS-#define DROPPED_PARAMETERS FALSE-#endif-- /* You can set ASA_PRINT_INTERMED to TRUE to print out-    intermediate data when SELF_OPTIMIZE is set to TRUE */-#ifndef ASA_PRINT_INTERMED-#if SELF_OPTIMIZE-#define ASA_PRINT_INTERMED FALSE-#else-#define ASA_PRINT_INTERMED TRUE-#endif-#endif--#ifndef ASA_PRINT_MORE-#define ASA_PRINT_MORE FALSE-#endif--char exit_msg[160];             /* temp storage for exit messages */-- /* The state of the system in terms of parameters and function value */-typedef struct {-  double cost;-  double *parameter;-#if ASA_PARALLEL-#if USER_ACCEPTANCE_TEST-  int par_user_accept_flag;-  int par_cost_accept_flag;-#endif-#endif-} STATE;--#if ASA_PARALLEL-  /* parallel generated states */-STATE *gener_block_state_qsort;-#endif-- /* essential MACROS */--#if USER_REANNEAL_PARAMETERS-#else- /* FUNCTION_REANNEAL_PARAMS(temperature, tangent, max_tangent)-    determines the reannealed temperature. */-#define FUNCTION_REANNEAL_PARAMS(temperature, tangent, max_tangent) \- (temperature * (max_tangent / tangent))-#endif-- /* IABS(i)-    absolute value for integers, in stdlib.h on _some_ machines */-#define IABS(i) ((i) < 0? -(i) : (i))-- /*  NO_REANNEAL(x)-    can determine whether to calculate derivatives. */-#define NO_REANNEAL(x)	(IABS(parameter_type[x]) == 2)-- /* VFOR-    is a simple macro to iterate on each parameter index. */--#define VFOR(index_v) \- for (index_v = 0; index_v < *number_parameters; ++index_v)--#if CHECK_EXPONENT- /* EXPONENT_CHECK-    checks that an exponent x is within a valid range and,-    if not, adjusts its magnitude to fit in the range. */-#define MIN_EXPONENT (0.9 * F_LOG ((double) MIN_DOUBLE))-#define MAX_EXPONENT (0.9 * F_LOG ((double) MAX_DOUBLE))-#define EXPONENT_CHECK(x) \- ((x) < MIN_EXPONENT ? MIN_EXPONENT : \- ((x) > MAX_EXPONENT ? MAX_EXPONENT : (x)))-#else-#define EXPONENT_CHECK(x) (x)-#endif /* CHECK_EXPONENT */-- /* PARAMETER_RANGE_TOO_SMALL(x)-    checks if the range of parameter x is too small to work with.-    If user_cost_function changes the parameter ranges,-    this test could be used to adaptively bypass-    some parameters, e.g., depending on constraints. */-#define PARAMETER_RANGE_TOO_SMALL(x) \- (fabs(parameter_minimum[x] - parameter_maximum[x]) < (double) EPS_DOUBLE)-- /* INTEGER_PARAMETER(x)-    determines if the parameter is an integer type. */-#define INTEGER_PARAMETER(x) (parameter_type[x] > 0)-- /* ROW_COL_INDEX(i, j)-    converts from row i, column j to an index. */-#define ROW_COL_INDEX(i, j) ((i) + *number_parameters * (j))--#if HAVE_ANSI-- /* asa function prototypes */-void accept_new_state (double (*user_random_generator) (LONG_INT *),-                       LONG_INT * seed,-                       double *parameter_minimum,-                       double *parameter_maximum,-                       double *current_cost_temperature,-#if ASA_SAMPLE-                       double *current_user_parameter_temp,-#endif-                       ALLOC_INT * number_parameters,-                       LONG_INT * recent_number_acceptances,-                       LONG_INT * number_accepted,-                       LONG_INT * index_cost_acceptances,-                       LONG_INT * number_acceptances_saved,-                       LONG_INT * recent_number_generated,-                       LONG_INT * number_generated,-                       LONG_INT * index_parameter_generations,-                       STATE * current_generated_state,-                       STATE * last_saved_state,-#if ASA_SAMPLE-                       FILE * ptr_asa_out,-#endif-                       USER_DEFINES * OPTIONS);--void generate_new_state (double (*user_random_generator) (LONG_INT *),-                         LONG_INT * seed,-                         double *parameter_minimum,-                         double *parameter_maximum,-                         double *current_parameter_temperature,-#if USER_GENERATING_FUNCTION-                         double *initial_user_parameter_temp,-                         double *temperature_scale_parameters,-#endif-                         ALLOC_INT * number_parameters,-                         int *parameter_type,-                         STATE * current_generated_state,-                         STATE * last_saved_state, USER_DEFINES * OPTIONS);--void reanneal (double *parameter_minimum,-               double *parameter_maximum,-               double *tangents,-               double *maximum_tangent,-               double *current_cost_temperature,-               double *initial_cost_temperature,-               double *temperature_scale_cost,-               double *current_user_parameter_temp,-               double *initial_user_parameter_temp,-               double *temperature_scale_parameters,-               ALLOC_INT * number_parameters,-               int *parameter_type,-               LONG_INT * index_cost_acceptances,-               LONG_INT * index_parameter_generations,-               STATE * last_saved_state,-               STATE * best_generated_state, USER_DEFINES * OPTIONS);--void-  cost_derivatives (double (*user_cost_function)--                     -                    (double *, double *, double *, double *, double *,-                     ALLOC_INT *, int *, int *, int *, USER_DEFINES *),-                    double *parameter_minimum, double *parameter_maximum,-                    double *tangents, double *curvature,-                    double *maximum_tangent, ALLOC_INT * number_parameters,-                    int *parameter_type, int *exit_status,-                    int *curvature_flag, int *valid_state_generated_flag,-                    LONG_INT * number_invalid_generated_states,-                    STATE * current_generated_state,-                    STATE * best_generated_state, FILE * ptr_asa_out,-                    USER_DEFINES * OPTIONS);--double generate_asa_state (double (*user_random_generator) (LONG_INT *),-                           LONG_INT * seed, double *temp);--int-  asa_exit (double (*user_cost_function)--             -            (double *, double *, double *, double *, double *, ALLOC_INT *,-             int *, int *, int *, USER_DEFINES *), double *final_cost,-            double *parameter_initial_final, double *parameter_minimum,-            double *parameter_maximum, double *tangents, double *curvature,-            double *maximum_tangent, double *current_cost_temperature,-            double *initial_user_parameter_temp,-            double *current_user_parameter_temp,-            double *accepted_to_generated_ratio,-            ALLOC_INT * number_parameters, int *parameter_type,-            int *valid_state_generated_flag, int *exit_status,-            ALLOC_INT * index_exit_v, ALLOC_INT * start_sequence,-            LONG_INT * number_accepted, LONG_INT * best_number_accepted_saved,-            LONG_INT * index_cost_acceptances, LONG_INT * number_generated,-            LONG_INT * number_invalid_generated_states,-            LONG_INT * index_parameter_generations,-            LONG_INT * best_number_generated_saved,-            STATE * current_generated_state, STATE * last_saved_state,-            STATE * best_generated_state, FILE * ptr_asa_out,-            USER_DEFINES * OPTIONS);--void Exit_ASA (char *statement);--int asa_test_asa_options (LONG_INT * seed,-                          double *parameter_initial_final,-                          double *parameter_minimum,-                          double *parameter_maximum,-                          double *tangents,-                          double *curvature,-                          ALLOC_INT * number_parameters,-                          int *parameter_type,-                          int *valid_state_generated_flag,-                          int *exit_status,-                          FILE * ptr_asa_out, USER_DEFINES * OPTIONS);--int cost_function_test (double cost,-                        double *parameter,-                        double *parameter_minimum,-                        double *parameter_maximum,-                        ALLOC_INT * number_parameters,-                        double *xnumber_parameters);--void print_string (FILE * ptr_asa_out, char *string);-void print_string_index (FILE * ptr_asa_out, char *string, ALLOC_INT index);--#if ASA_PRINT-void print_state (double *parameter_minimum,-                  double *parameter_maximum,-                  double *tangents,-                  double *curvature,-                  double *current_cost_temperature,-                  double *current_user_parameter_temp,-                  double *accepted_to_generated_ratio,-                  ALLOC_INT * number_parameters,-                  int *curvature_flag,-                  LONG_INT * number_accepted,-                  LONG_INT * index_cost_acceptances,-                  LONG_INT * number_generated,-                  LONG_INT * number_invalid_generated_states,-                  STATE * last_saved_state,-                  STATE * best_generated_state,-                  FILE * ptr_asa_out, USER_DEFINES * OPTIONS);--void print_asa_options (FILE * ptr_asa_out, USER_DEFINES * OPTIONS);-#endif /* ASA_PRINT */---#if MULTI_MIN-static int multi_compare (const void *cost_ii, const void *cost_jj);-double *multi_cost_qsort;-#endif--#if ASA_PARALLEL-static int sort_parallel (const void *cost_ii, const void *cost_jj);-#endif--#else /* HAVE_ANSI */-#endif /* HAVE_ANSI */--#endif /* _ASA_H_ */
− _darcs/pristine/asa_usr.h
@@ -1,293 +0,0 @@-#ifndef _ASA_USER_H_-#define _ASA_USER_H_--/***********************************************************************-* Adaptive Simulated Annealing (ASA)-* Lester Ingber <ingber@ingber.com>-* Copyright (c) 1993-2004 Lester Ingber.  All Rights Reserved.-* The LICENSE file must be included with ASA code.-***********************************************************************/-- /* $Id: asa_usr.h,v 25.15 2004/09/23 18:10:45 ingber Exp ingber $ */-- /* asa_usr.h for Adaptive Simulated Annealing */--#include "asa_usr_asa.h"--#define SHUFFLE 256             /* size of random array */--#if ASA_TEMPLATE_ASA_OUT_PID-#include <sys/types.h>-#endif--#if TIME_CALC- /* print the time every PRINT_FREQUENCY function evaluations-    Define PRINT_FREQUENCY to 0 to not print out the time. */-#define PRINT_FREQUENCY ((LONG_INT) 1000)-#endif--#if USER_ACCEPTANCE_TEST-#define MIN(x,y)	((x) < (y) ? (x) : (y))-#endif-- /* system function prototypes */--#if ASA_TEMPLATE_ASA_OUT_PID-int getpid ();-#endif--#if HAVE_ANSI---#if IO_PROTOTYPES-#if OPTIONS_FILE-int fscanf ();-#endif-#endif-- /* user-defined */-double USER_COST_FUNCTION (double *cost_parameters,-                           double *parameter_lower_bound,-                           double *parameter_upper_bound,-                           double *cost_tangents,-                           double *cost_curvature,-                           ALLOC_INT * parameter_dimension,-                           int *parameter_int_real,-                           int *cost_flag,-                           int *exit_code, USER_DEFINES * USER_OPTIONS);-#if ASA_LIB-int-asa_main (-           hs_cost_func *func, -           int number_parameters,-           double *upper_bounds,-           double *lower_bounds,-           int *type,-           double *main_cost_value,-           double *main_cost_parameters, -           int *main_exit_code,-           long int rand_seed-  );-#else-int main (int argc, char **argv);-#endif--#if ASA_TEMPLATE_LIB-int main ();-#endif-- /* possibly with accompanying data file */-int initialize_parameters (double *cost_parameters,-                           double *parameter_lower_bound,-                           double *parameter_upper_bound,-                           double *cost_tangents,-                           double *cost_curvature,-                           ALLOC_INT * parameter_dimension,-                           int *parameter_int_real,-#if OPTIONS_FILE_DATA-                           FILE * ptr_options,-#endif-                           USER_DEFINES * USER_OPTIONS);--//double myrand (LONG_INT * rand_seed);-//double randflt (LONG_INT * rand_seed);-//double resettable_randflt (LONG_INT * rand_seed, int reset);--#if USER_COST_SCHEDULE-double user_cost_schedule (double test_temperature,-                           USER_DEFINES * USER_OPTIONS);-#endif--#if USER_ACCEPTANCE_TEST-void user_acceptance_test (double current_cost,-                           double *parameter_lower_bound,-                           double *parameter_upper_bound,-                           ALLOC_INT * parameter_dimension,-                           USER_DEFINES * USER_OPTIONS);-#endif--#if USER_GENERATING_FUNCTION-double user_generating_distrib (LONG_INT * seed,-                                ALLOC_INT * parameter_dimension,-                                ALLOC_INT index_v,-                                double temperature_v,-                                double init_param_temp_v,-                                double temp_scale_params_v,-                                double parameter_v,-                                double parameter_range_v,-                                double *last_saved_parameter,-                                USER_DEFINES * USER_OPTIONS);-#endif--#if USER_REANNEAL_COST-int user_reanneal_cost (double *cost_best,-                        double *cost_last,-                        double *initial_cost_temperature,-                        double *current_cost_temperature,-                        USER_DEFINES * USER_OPTIONS);-#endif--#if USER_REANNEAL_PARAMETERS-double user_reanneal_params (double current_temp,-                             double tangent,-                             double max_tangent, USER_DEFINES * USER_OPTIONS);-#endif--#if ASA_TEMPLATE_SAMPLE-void sample (FILE * ptr_out, FILE * ptr_asa);-#endif--void Exit_USER (char *statement);--#else /* HAVE_ANSI */-#endif /* HAVE_ANSI */--void Exit_USER ();--#if SELF_OPTIMIZE-#if TIME_CALC-#define RECUR_PRINT_FREQUENCY ((LONG_INT) 1)-#endif--#if HAVE_ANSI                   /* HAVE_ANSI SELF_OPTIMIZE */-double RECUR_USER_COST_FUNCTION (double *recur_cost_parameters,-                                 double *recur_parameter_lower_bound,-                                 double *recur_parameter_upper_bound,-                                 double *recur_cost_tangents,-                                 double *recur_cost_curvature,-                                 ALLOC_INT * recur_parameter_dimension,-                                 int *recur_parameter_int_real,-                                 int *recur_cost_flag,-                                 int *recur_exit_code,-                                 USER_DEFINES * RECUR_USER_OPTIONS);--int recur_initialize_parameters (double *recur_cost_parameters,-                                 double *recur_parameter_lower_bound,-                                 double *recur_parameter_upper_bound,-                                 double *recur_cost_tangents,-                                 double *recur_cost_curvature,-                                 ALLOC_INT * recur_parameter_dimension,-                                 int *recur_parameter_int_real,-#if RECUR_OPTIONS_FILE_DATA-                                 FILE * recur_ptr_options,-#endif-                                 USER_DEFINES * RECUR_USER_OPTIONS);--#if USER_COST_SCHEDULE-double recur_user_cost_schedule (double test_temperature,-                                 USER_DEFINES * RECUR_USER_OPTIONS);-#endif--#if USER_ACCEPTANCE_TEST-void recur_user_acceptance_test (double current_cost,-                                 double *recur_parameter_lower_bound,-                                 double *recur_parameter_upper_bound,-                                 ALLOC_INT * recur_parameter_dimension,-                                 USER_DEFINES * RECUR_USER_OPTIONS);-#endif--#if USER_GENERATING_FUNCTION-double recur_user_generating_distrib (LONG_INT * seed,-                                      ALLOC_INT * recur_parameter_dimension,-                                      ALLOC_INT index_v,-                                      double temperature_v,-                                      double init_param_temp_v,-                                      double temp_scale_params_v,-                                      double parameter_v,-                                      double parameter_range_v,-                                      double *last_saved_parameter,-                                      USER_DEFINES * RECUR_USER_OPTIONS);-#endif--#if USER_REANNEAL_COST-int recur_user_reanneal_cost (double *cost_best,-                              double *cost_last,-                              double *initial_cost_temperature,-                              double *current_cost_temperature,-                              USER_DEFINES * RECUR_USER_OPTIONS);-#endif--#if USER_REANNEAL_PARAMETERS-double recur_user_reanneal_params (double current_temp,-                                   double tangent,-                                   double max_tangent,-                                   USER_DEFINES * RECUR_USER_OPTIONS);-#endif--#else /* HAVE_ANSI SELF_OPTIMIZE */--double RECUR_USER_COST_FUNCTION ();-int recur_initialize_parameters ();--#if USER_COST_SCHEDULE-double recur_user_cost_schedule ();-#endif--#if USER_ACCEPTANCE_TEST-void recur_user_acceptance_test ();-#endif--#if USER_GENERATING_FUNCTION-double recur_user_generating_distrib ();-#endif--#if USER_REANNEAL_COST-int recur_user_reanneal_cost ();-#endif--#if USER_REANNEAL_PARAMETERS-double recur_user_reanneal_params ();-#endif--#endif /* HAVE_ANSI */-#endif /* SELF_OPTIMIZE */--#if FITLOC-#if HAVE_ANSI-double-  calcf (double (*user_cost_function)--          -         (double *, double *, double *, double *, double *, ALLOC_INT *,-          int *, int *, int *, USER_DEFINES *), double *cost_parameters,-         double *parameter_lower_bound, double *parameter_upper_bound,-         double *cost_tangents, double *cost_curvature,-         ALLOC_INT * parameter_dimension, int *parameter_int_real,-         int *cost_flag, int *exit_code, USER_DEFINES * USER_OPTIONS,-         FILE * ptr_out);--double-  fitloc (double (*user_cost_function)--           -          (double *, double *, double *, double *, double *, ALLOC_INT *,-           int *, int *, int *, USER_DEFINES *), double *cost_parameters,-          double *parameter_lower_bound, double *parameter_upper_bound,-          double *cost_tangents, double *cost_curvature,-          ALLOC_INT * parameter_dimension, int *parameter_int_real,-          int *cost_flag, int *exit_code, USER_DEFINES * USER_OPTIONS,-          FILE * ptr_out);--int-  simplex (double (*user_cost_function)--            -           (double *, double *, double *, double *, double *, ALLOC_INT *,-            int *, int *, int *, USER_DEFINES *), double *cost_parameters,-           double *parameter_lower_bound, double *parameter_upper_bound,-           double *cost_tangents, double *cost_curvature,-           ALLOC_INT * parameter_dimension, int *parameter_int_real,-           int *cost_flag, int *exit_code, USER_DEFINES * USER_OPTIONS,-           FILE * ptr_out, double tol1, double tol2, int no_progress,-           double alpha, double beta1, double beta2, double gamma,-           double delta);-#else /* HAVE_ANSI */--double calcf ();-double fitloc ();-int simplex ();--#endif /* HAVE_ANSI */-#endif /* FITLOC */--#endif /* _ASA_USER_H_ */
− _darcs/pristine/asa_usr_asa.h
@@ -1,682 +0,0 @@-#ifndef _ASA_USER_ASA_H_-#define _ASA_USER_ASA_H_--/***********************************************************************-* Adaptive Simulated Annealing (ASA)-* Lester Ingber <ingber@ingber.com>-* Copyright (c) 1993-2004 Lester Ingber.  All Rights Reserved.-* The LICENSE file must be included with ASA code.-***********************************************************************/-- /* $Id: asa_usr_asa.h,v 25.15 2004/09/23 18:10:49 ingber Exp ingber $ */-- /* asa_usr_asa.h for Adaptive Simulated Annealing */--#include <errno.h>-#include <math.h>-#include <stdio.h>-#include <stdlib.h>             /* misc defs on most machines */-#include <string.h>--/* required if use machine-defined {DBL_EPSILON DBL_MIN DBL_MAX} */-/* #include <float.h> */--/* test for memory leaks */-/* #include "/usr/local/include/leak.h" */--#define	TRUE			1-#define	FALSE			0--#define MIN(x,y)	((x) < (y) ? (x) : (y))-#define MAX(x,y)	((x) > (y) ? (x) : (y))-- /* DEFAULT PARAMETERS SETTINGS */-- /* Pre-Compile Options */-- /* Special ASA_TEMPLATEs */--#ifndef MY_TEMPLATE-#define MY_TEMPLATE TRUE-#endif-#if MY_TEMPLATE                 /* MY_TEMPLATE_asa_user */--// #include <HsFFI.h>--typedef double hs_cost_func(double *x, int *flag);--/* #define ASA_LIB TRUE */-#define ASA_TEST FALSE-#define ASA_LIB TRUE-#define ASA_OUT  "STDOUT"-#define USER_OUT "STDOUT"-#define FITLOC TRUE-#define COST_FILE FALSE-// #define ASA_PRINT FALSE-// #define USER_ASA_OUT TRUE -#define OPTIONS_FILE FALSE-#define OPTIONAL_PTR_TYPE hs_cost_func-#define OPTIONAL_DATA_PTR TRUE-#define QUENCH_COST TRUE-#define QUENCH_PARAMETERS TRUE---  /* you can add your own set of #define here */-#endif /* MY_TEMPLATE */--#ifndef ASA_TEMPLATE_LIB-#define ASA_TEMPLATE_LIB FALSE-#endif-#if ASA_TEMPLATE_LIB-#define ASA_LIB TRUE-#define ASA_TEST TRUE-#endif--#ifndef ASA_TEMPLATE_ASA_OUT_PID-#define ASA_TEMPLATE_ASA_OUT_PID FALSE-#endif-#if ASA_TEMPLATE_ASA_OUT_PID-#define USER_ASA_OUT TRUE-#endif--#ifndef ASA_TEMPLATE_MULTIPLE-#define ASA_TEMPLATE_MULTIPLE FALSE-#endif-#if ASA_TEMPLATE_MULTIPLE-#define COST_FILE FALSE-#define USER_ASA_OUT TRUE-#define ASA_TEST TRUE-#define QUENCH_COST TRUE-#define QUENCH_PARAMETERS TRUE-#define OPTIONS_FILE FALSE-#endif--#ifndef ASA_TEMPLATE_SELFOPT-#define ASA_TEMPLATE_SELFOPT FALSE-#endif-#if ASA_TEMPLATE_SELFOPT-#define COST_FILE FALSE-#define SELF_OPTIMIZE TRUE-#define OPTIONAL_DATA_DBL TRUE-#define USER_ASA_OUT TRUE-#define ASA_TEST TRUE-#define OPTIONS_FILE FALSE-#endif--#ifndef ASA_TEMPLATE_SAMPLE-#define ASA_TEMPLATE_SAMPLE FALSE-#endif-#if ASA_TEMPLATE_SAMPLE-#define COST_FILE FALSE-#define ASA_SAMPLE TRUE-#define USER_ACCEPTANCE_TEST TRUE-#define USER_COST_SCHEDULE TRUE-#define OPTIONS_FILE_DATA FALSE-#define USER_ACCEPT_ASYMP_EXP TRUE-#endif--#ifndef ASA_TEMPLATE_PARALLEL-#define ASA_TEMPLATE_PARALLEL FALSE-#endif-#if ASA_TEMPLATE_PARALLEL-#define COST_FILE FALSE-#define ASA_TEST TRUE-#define ASA_PARALLEL TRUE-#endif--#ifndef ASA_TEMPLATE_SAVE-#define ASA_TEMPLATE_SAVE FALSE-#endif-#if ASA_TEMPLATE_SAVE-#define COST_FILE FALSE-#define ASA_TEST TRUE-#define ASA_SAVE TRUE-#define QUENCH_PARAMETERS TRUE-#define QUENCH_COST TRUE-#endif--#ifndef ASA_TEMPLATE_QUEUE-#define ASA_TEMPLATE_QUEUE FALSE-#endif-#if ASA_TEMPLATE_QUEUE-#define ASA_QUEUE TRUE-#define ASA_RESOLUTION FALSE-#define ASA_TEST TRUE-#define COST_FILE FALSE-#define ASA_PRINT_MORE TRUE-#endif--#ifndef ASA_TEST_POINT-#define ASA_TEST_POINT FALSE-#endif-#if ASA_TEST_POINT-#define ASA_TEST TRUE-#define COST_FILE FALSE-#define SMALL_FLOAT 1.0E-50-#define QUENCH_COST TRUE-#endif-- /* Standard Pre-Compile Options */--#ifndef USER_COST_FUNCTION-#define USER_COST_FUNCTION cost_function-#endif--#if SELF_OPTIMIZE-#ifndef RECUR_USER_COST_FUNCTION-#define RECUR_USER_COST_FUNCTION recur_cost_function-#endif-#endif--#ifndef INCL_STDOUT-#define INCL_STDOUT TRUE-#endif-#if INCL_STDOUT-#define TIME_CALC FALSE-#endif--#ifndef OPTIONS_FILE-#define OPTIONS_FILE TRUE-#endif--#if OPTIONS_FILE-#ifndef OPTIONS_FILE_DATA-#define OPTIONS_FILE_DATA TRUE-#endif-#else-#define OPTIONS_FILE_DATA FALSE-#endif--#ifndef RECUR_OPTIONS_FILE-#define RECUR_OPTIONS_FILE FALSE-#endif--#if RECUR_OPTIONS_FILE-#ifndef RECUR_OPTIONS_FILE_DATA-#define RECUR_OPTIONS_FILE_DATA FALSE-#endif-#else-#define RECUR_OPTIONS_FILE_DATA FALSE-#endif--#ifndef COST_FILE-#define COST_FILE TRUE-#endif--#ifndef ASA_LIB-#define ASA_LIB FALSE-#endif--#ifndef HAVE_ANSI-#define HAVE_ANSI TRUE-#endif--#ifndef IO_PROTOTYPES-#define IO_PROTOTYPES FALSE-#endif--#ifndef TIME_CALC-#define TIME_CALC FALSE-#endif--#ifndef INT_LONG-#define INT_LONG TRUE-#endif--#if INT_LONG-#define LONG_INT long int-#else-#define LONG_INT int-#endif--#ifndef INT_ALLOC-#define INT_ALLOC FALSE-#endif--#if INT_ALLOC-#define ALLOC_INT int-#else-#define ALLOC_INT LONG_INT-#endif-- /* You can define SMALL_FLOAT to better correlate to your machine's-    precision, i.e., as used in asa */-#ifndef SMALL_FLOAT-#define SMALL_FLOAT 1.0E-18-#endif-- /* You can define your machine's maximum and minimum doubles here */-#ifndef MIN_DOUBLE-#define MIN_DOUBLE ((double) SMALL_FLOAT)-#endif--#ifndef MAX_DOUBLE-#define MAX_DOUBLE ((double) 1.0 / (double) SMALL_FLOAT)-#endif--#ifndef EPS_DOUBLE-#define EPS_DOUBLE ((double) SMALL_FLOAT)-#endif--#ifndef CHECK_EXPONENT-#define CHECK_EXPONENT FALSE-#endif--#ifndef ASA_TEST-#define ASA_TEST FALSE-#endif--#ifndef ASA_TEMPLATE-#define ASA_TEMPLATE FALSE-#endif--#ifndef USER_INITIAL_COST_TEMP-#define USER_INITIAL_COST_TEMP FALSE-#endif--#ifndef RATIO_TEMPERATURE_SCALES-#define RATIO_TEMPERATURE_SCALES FALSE-#endif--#ifndef USER_INITIAL_PARAMETERS_TEMPS-#define USER_INITIAL_PARAMETERS_TEMPS FALSE-#endif--#ifndef DELTA_PARAMETERS-#define DELTA_PARAMETERS FALSE-#endif--#ifndef QUENCH_PARAMETERS-#define QUENCH_PARAMETERS FALSE-#endif--#ifndef QUENCH_COST-#define QUENCH_COST FALSE-#endif--#ifndef QUENCH_PARAMETERS_SCALE-#define QUENCH_PARAMETERS_SCALE TRUE-#endif--#ifndef QUENCH_COST_SCALE-#define QUENCH_COST_SCALE TRUE-#endif--#ifndef OPTIONAL_DATA_DBL-#define OPTIONAL_DATA_DBL FALSE-#endif--#ifndef OPTIONAL_DATA_INT-#define OPTIONAL_DATA_INT FALSE-#endif--#ifndef OPTIONAL_DATA_PTR-#define OPTIONAL_DATA_PTR FALSE-#endif-#if OPTIONAL_DATA_PTR-/* user must define USER_TYPE; if a struct, it must be declared above */-#ifndef OPTIONAL_PTR_TYPE-#define OPTIONAL_PTR_TYPE USER_TYPE-#endif-#endif /* OPTIONAL_DATA_PTR */--#ifndef USER_REANNEAL_COST-#define USER_REANNEAL_COST FALSE-#endif--#ifndef USER_REANNEAL_PARAMETERS-#define USER_REANNEAL_PARAMETERS FALSE-#endif--#ifndef MAXIMUM_REANNEAL_INDEX-#define MAXIMUM_REANNEAL_INDEX 50000-#endif--#ifndef REANNEAL_SCALE-#define REANNEAL_SCALE 10-#endif--#ifndef USER_COST_SCHEDULE-#define USER_COST_SCHEDULE FALSE-#endif--#ifndef USER_ACCEPT_ASYMP_EXP-#define USER_ACCEPT_ASYMP_EXP FALSE-#endif--#ifndef USER_ACCEPT_THRESHOLD-#define USER_ACCEPT_THRESHOLD FALSE-#endif--#ifndef USER_ACCEPTANCE_TEST-#define USER_ACCEPTANCE_TEST FALSE-#endif--#ifndef USER_GENERATING_FUNCTION-#define USER_GENERATING_FUNCTION FALSE-#endif-- /* in asa.c, field-width.precision = G_FIELD.G_PRECISION */-#ifndef G_FIELD-#define G_FIELD 12-#endif-#ifndef G_PRECISION-#define G_PRECISION 7-#endif--#define INTEGER_TYPE		((int) 1)-#define REAL_TYPE		((int) -1)-#define INTEGER_NO_REANNEAL	((int) 2)-#define REAL_NO_REANNEAL	((int) -2)-- /* Set this to TRUE to self-optimize the Program Options */-#ifndef SELF_OPTIMIZE-#define SELF_OPTIMIZE FALSE-#endif--#ifndef USER_OUT-#define USER_OUT "asa_usr_out"-#endif--#ifndef USER_ASA_OUT-#define USER_ASA_OUT FALSE-#endif--#ifndef ASA_SAMPLE-#define ASA_SAMPLE FALSE-#endif--#ifndef ASA_QUEUE-#define ASA_QUEUE FALSE-#endif--#ifndef ASA_RESOLUTION-#define ASA_RESOLUTION FALSE-#endif--#ifndef ASA_PARALLEL-#define ASA_PARALLEL FALSE-#endif--#ifndef ASA_SAVE_OPT-#define ASA_SAVE_OPT FALSE-#endif-#if ASA_SAVE_OPT-#define ASA_SAVE TRUE-#endif--#ifndef ASA_SAVE_BACKUP-#define ASA_SAVE_BACKUP FALSE-#endif-#if ASA_SAVE_BACKUP-#define ASA_SAVE TRUE-#endif--#ifndef ASA_SAVE-#define ASA_SAVE FALSE-#endif--#ifndef ASA_PIPE-#define ASA_PIPE FALSE-#endif--#ifndef ASA_PIPE_FILE-#define ASA_PIPE_FILE FALSE-#endif--#ifndef FDLIBM_POW-#define FDLIBM_POW FALSE-#endif-#if FDLIBM_POW-#define F_POW s_pow-#else-#define F_POW pow-#endif--#ifndef FDLIBM_LOG-#define FDLIBM_LOG FALSE-#endif-#if FDLIBM_LOG-#define F_LOG s_log-#else-#define F_LOG log-#endif--#ifndef FDLIBM_EXP-#define FDLIBM_EXP FALSE-#endif-#if FDLIBM_EXP-#define F_EXP s_exp-#else-#define F_EXP exp-#endif--#ifndef FITLOC-#define FITLOC FALSE-#endif--#ifndef FITLOC_ROUND-#define FITLOC_ROUND TRUE-#endif--#ifndef FITLOC_PRINT-#define FITLOC_PRINT TRUE-#endif--#ifndef MULTI_MIN-#define MULTI_MIN FALSE-#endif-- /* Program Options */--typedef struct {-  LONG_INT Limit_Acceptances;-  LONG_INT Limit_Generated;-  int Limit_Invalid_Generated_States;-  double Accepted_To_Generated_Ratio;--  double Cost_Precision;-  int Maximum_Cost_Repeat;-  int Number_Cost_Samples;-  double Temperature_Ratio_Scale;-  double Cost_Parameter_Scale_Ratio;-  double Temperature_Anneal_Scale;-#if USER_INITIAL_COST_TEMP-  double *User_Cost_Temperature;-#endif--  int Include_Integer_Parameters;-  int User_Initial_Parameters;-  ALLOC_INT Sequential_Parameters;-  double Initial_Parameter_Temperature;-#if RATIO_TEMPERATURE_SCALES-  double *User_Temperature_Ratio;-#endif-#if USER_INITIAL_PARAMETERS_TEMPS-  double *User_Parameter_Temperature;-#endif--  int Acceptance_Frequency_Modulus;-  int Generated_Frequency_Modulus;-  int Reanneal_Cost;-  int Reanneal_Parameters;--  double Delta_X;-#if DELTA_PARAMETERS-  double *User_Delta_Parameter;-#endif-  int User_Tangents;-  int Curvature_0;--#if QUENCH_PARAMETERS-  double *User_Quench_Param_Scale;-#endif-#if QUENCH_COST-  double *User_Quench_Cost_Scale;-#endif--  LONG_INT N_Accepted;-  LONG_INT N_Generated;-  int Locate_Cost;-  int Immediate_Exit;--  double *Best_Cost;-  double *Best_Parameters;-  double *Last_Cost;-  double *Last_Parameters;--#if OPTIONAL_DATA_DBL-  ALLOC_INT Asa_Data_Dim_Dbl;-  double *Asa_Data_Dbl;-#endif-#if OPTIONAL_DATA_INT-  ALLOC_INT Asa_Data_Dim_Int;-  LONG_INT *Asa_Data_Int;-#endif-#if OPTIONAL_DATA_PTR-  ALLOC_INT Asa_Data_Dim_Ptr;-  OPTIONAL_PTR_TYPE *Asa_Data_Ptr;-#endif-#if USER_ASA_OUT-  char *Asa_Out_File;-#endif-#if USER_COST_SCHEDULE-  double (*Cost_Schedule) ();-#endif-#if USER_ACCEPT_ASYMP_EXP-  double Asymp_Exp_Param;-#endif-#if USER_ACCEPTANCE_TEST-  void (*Acceptance_Test) ();-  int User_Acceptance_Flag;-  int Cost_Acceptance_Flag;-  double Cost_Temp_Curr;-  double Cost_Temp_Init;-  double Cost_Temp_Scale;-  double Prob_Bias;-  LONG_INT *Random_Seed;-#endif-#if USER_GENERATING_FUNCTION-  double (*Generating_Distrib) ();-#endif-#if USER_REANNEAL_COST-  int (*Reanneal_Cost_Function) ();-#endif-#if USER_REANNEAL_PARAMETERS-  double (*Reanneal_Params_Function) ();-#endif-#if ASA_SAMPLE-  double Bias_Acceptance;-  double *Bias_Generated;-  double Average_Weights;-  double Limit_Weights;-#endif-#if ASA_QUEUE-  ALLOC_INT Queue_Size;-  double *Queue_Resolution;-#endif-#if ASA_RESOLUTION-  double *Coarse_Resolution;-#endif-#if FITLOC-  int Fit_Local;-  int Iter_Max;-  double Penalty;-#endif-#if MULTI_MIN-  int Multi_Number;-  double *Multi_Cost;-  double **Multi_Params;-  double *Multi_Grid;-  int Multi_Specify;-#endif-#if ASA_PARALLEL-  int Gener_Mov_Avr;-  LONG_INT Gener_Block;-  LONG_INT Gener_Block_Max;-#endif-  int Asa_Recursive_Level;-} USER_DEFINES;-- /* system function prototypes */--#if HAVE_ANSI--/* This block gives trouble under some Ultrix */-#if FALSE-int fprintf (FILE * fp, const char *string, ...);-int sprintf (char *s, const char *format, ...);-FILE *popen (const char *command, const char *mode);-void exit (int code);-#endif--#if IO_PROTOTYPES-int fprintf ();-int sprintf ();-int fflush (FILE * fp);-int fclose (FILE * fp);-void exit ();-int fread ();-int fwrite ();-int pclose ();-#endif--double-  asa (double (*user_cost_function)--        -       (double *, double *, double *, double *, double *, ALLOC_INT *, int *,-        int *, int *, USER_DEFINES *),-       double (*user_random_generator) (LONG_INT *), LONG_INT * rand_seed,-       double *parameter_initial_final, double *parameter_minimum,-       double *parameter_maximum, double *tangents, double *curvature,-       ALLOC_INT * number_parameters, int *parameter_type,-       int *valid_state_generated_flag, int *exit_status,-       USER_DEFINES * OPTIONS);--#if TIME_CALC-void print_time (char *message, FILE * ptr_out);-#endif--#if FDLIBM_POW-double s_pow (double x, double y);-#endif-#if FDLIBM_LOG-double s_log (double x);-#endif-#if FDLIBM_EXP-double s_exp (double x);-#endif--#else /* HAVE_ANSI */--#if IO_PROTOTYPES-int fprintf ();-int sprintf ();-int fflush ();-int fclose ();-int fread ();-int fwrite ();-FILE *popen ();-int pclose ();-#endif--double asa ();--#if TIME_CALC-void print_time ();-#endif--#if FDLIBM_POW-double s_pow ();-#endif-#if FDLIBM_LOG-double s_log ();-#endif-#if FDLIBM_EXP-double s_exp ();-#endif--#endif /* HAVE_ANSI */--#endif /* _ASA_USER_ASA_H_ */
− _darcs/pristine/hs_asa.c
@@ -1,4369 +0,0 @@-/***********************************************************************-* Adaptive Simulated Annealing (ASA)-* Lester Ingber <ingber@ingber.com>-* Copyright (c) 1993-2004 Lester Ingber.  All Rights Reserved.-* The LICENSE file must be included with ASA code.-* Modified by John Meacham for Haskell interface-***********************************************************************/--#include "asa_usr.h"-----char user_exit_msg[160];        /* temp storage for exit messages */-FILE *ptr_out;--static double resettable_randflt (LONG_INT * rand_seed, int reset);-static double randflt (LONG_INT * rand_seed);-/***********************************************************************-* main-*	This is a sample calling program to optimize using ASA-***********************************************************************/-int-asa_main (-           hs_cost_func *func, -           int number_parameters,-           double *upper_bounds,-           double *lower_bounds,-           int *type,-           double *main_cost_value,-           double *main_cost_parameters, -           int *main_exit_code,-           long int initial_rand_seed-  )-{-  int i;-  int *exit_code;-  ALLOC_INT n_param;-#if ASA_TEMPLATE_SAMPLE-  FILE *ptr_asa;-#endif-#if MULTI_MIN-  int multi_index;-#endif--  /* pointer to array storage for asa arguments */-  double *parameter_lower_bound, *parameter_upper_bound, *cost_parameters,-    *cost_tangents, *cost_curvature;-  double cost_value;--  int initialize_parameters_value;--  /* the number of parameters to optimize */-  ALLOC_INT *parameter_dimension;--  /* pointer to array storage for parameter type flags */-  int *parameter_int_real;--  /* valid flag for cost function */-  int *cost_flag;--  /* seed for random number generator */-  LONG_INT *rand_seed;--  USER_DEFINES *USER_OPTIONS;--#if MY_TEMPLATE                 /* MY_TEMPLATE_main_decl */-  /* add some declarations if required */-#endif--#if ASA_TEMPLATE_MULTIPLE-  int n_asa, n_trajectory;-  ALLOC_INT index;-#if HAVE_ANSI-  char asa_file[8] = "asa_x_y";-#else-  char asa_file[8];-#endif /* HAVE_ANSI */-#endif /* ASA_TEMPLATE_MULTIPLE */---  if ((USER_OPTIONS =-       (USER_DEFINES *) calloc (1, sizeof (USER_DEFINES))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): USER_DEFINES");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if OPTIONAL_DATA_PTR-#if ASA_TEMPLATE-  USER_OPTIONS->Asa_Data_Dim_Ptr = 256;-  if ((USER_OPTIONS->Asa_Data_Ptr =-       (OPTIONAL_PTR_TYPE *) calloc (USER_OPTIONS->Asa_Data_Dim_Ptr,-                                     sizeof (OPTIONAL_PTR_TYPE))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): USER_OPTIONS->Asa_Data_Ptr");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif /* ASA_TEMPLATE */-#endif /* OPTIONAL_DATA_PTR */---  if (!strcmp (USER_OUT, "STDOUT")) {-#if INCL_STDOUT-    ptr_out = stdout;-#endif /* INCL_STDOUT */-  } else {-    ptr_out = fopen (USER_OUT, "w");-  }---  fflush (ptr_out);--  if ((rand_seed = (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): rand_seed");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  *rand_seed = initial_rand_seed;--  /* initialize random number generator with first call */-  resettable_randflt (rand_seed, 1);--  /* Initialize the users parameters, allocating space, etc.-     Note that the default is to have asa generate the initial-     cost_parameters that satisfy the user's constraints. */--  if ((parameter_dimension =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): parameter_dimension");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((exit_code = (int *) calloc (1, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): exit_code");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((cost_flag = (int *) calloc (1, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): cost_flag");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  //USER_OPTIONS->Limit_Acceptances = 10000; -  USER_OPTIONS->Limit_Acceptances = 1000;-  USER_OPTIONS->Limit_Generated = 99999;-  USER_OPTIONS->Limit_Invalid_Generated_States = 1000;-  /* USER_OPTIONS->Accepted_To_Generated_Ratio = 1.0E-6; */-  USER_OPTIONS->Accepted_To_Generated_Ratio = 1.0E-4;--  USER_OPTIONS->Cost_Precision = 1.0E-18;-  USER_OPTIONS->Maximum_Cost_Repeat = 5;-  USER_OPTIONS->Number_Cost_Samples = 5;-  USER_OPTIONS->Temperature_Ratio_Scale = 1.0E-5;-  USER_OPTIONS->Cost_Parameter_Scale_Ratio = 1.0;-  USER_OPTIONS->Temperature_Anneal_Scale = 100.0;--  USER_OPTIONS->Include_Integer_Parameters = FALSE;-  USER_OPTIONS->User_Initial_Parameters = FALSE;-  USER_OPTIONS->Sequential_Parameters = -1;-  USER_OPTIONS->Initial_Parameter_Temperature = 1.0;--  USER_OPTIONS->Acceptance_Frequency_Modulus = 100;-  USER_OPTIONS->Generated_Frequency_Modulus = 10000;-  USER_OPTIONS->Reanneal_Cost = 1;-  USER_OPTIONS->Reanneal_Parameters = TRUE;--  USER_OPTIONS->Delta_X = 0.001;-  USER_OPTIONS->User_Tangents = FALSE;-  USER_OPTIONS->Curvature_0 = FALSE;---  /* ALLOCATE STORAGE */---#if USER_ASA_OUT-  if ((USER_OPTIONS->Asa_Out_File =-       (char *) calloc (80, sizeof (char))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): USER_OPTIONS->Asa_Out_File");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif--  /* the number of parameters for the cost function */-#if OPTIONS_FILE_DATA-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%s", read_option);--#if INT_ALLOC-  fscanf (ptr_options, "%d", &read_int);-  *parameter_dimension = read_int;-#else-#if INT_LONG-  fscanf (ptr_options, "%ld", &read_long);-  *parameter_dimension = read_long;-#else-  fscanf (ptr_options, "%d", &read_int);-  *parameter_dimension = read_int;-#endif-#endif--#else /* OPTIONS_FILE_DATA */-#endif /* OPTIONS_FILE_DATA */-#if MY_TEMPLATE                 /* MY_TEMPLATE_dim */-  *parameter_dimension = number_parameters;-  /* If not using OPTIONS_FILE_DATA or data read from asa_opt,-     insert the number of parameters for the cost_function */-#endif /* MY_TEMPLATE dim */--#if ASA_TEMPLATE_SAMPLE-  *parameter_dimension = 2;-  USER_OPTIONS->Limit_Acceptances = 2000;-  USER_OPTIONS->User_Tangents = TRUE;-  USER_OPTIONS->Limit_Weights = 1.0E-7;-#endif-#if ASA_TEMPLATE_PARALLEL-  USER_OPTIONS->Gener_Block = 100;-  USER_OPTIONS->Gener_Block_Max = 512;-  USER_OPTIONS->Gener_Mov_Avr = 3;-#endif--  /* allocate parameter minimum space */-  if ((parameter_lower_bound =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): parameter_lower_bound");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  /* allocate parameter maximum space */-  if ((parameter_upper_bound =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): parameter_upper_bound");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  /* allocate parameter initial values; the parameter final values-     will be stored here later */-  if ((cost_parameters =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): cost_parameters");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  /* allocate the parameter types, real or integer */-  if ((parameter_int_real =-       (int *) calloc (*parameter_dimension, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): parameter_int_real");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  /* allocate space for parameter cost_tangents --     used for reannealing */-  if ((cost_tangents =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): cost_tangents");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if (USER_OPTIONS->Curvature_0 == FALSE || USER_OPTIONS->Curvature_0 == -1) {-    /* allocate space for parameter cost_curvatures/covariance */-    if ((cost_curvature =-         (double *) calloc ((*parameter_dimension) *-                            (*parameter_dimension),-                            sizeof (double))) == NULL) {-      strcpy (user_exit_msg, "main()/asa_main(): cost_curvature");-      Exit_USER (user_exit_msg);-      return (-2);-    }-  } else {-    cost_curvature = (double *) NULL;-  }--#if USER_COST_SCHEDULE-  USER_OPTIONS->Cost_Schedule = user_cost_schedule;-#endif-#if USER_ACCEPTANCE_TEST-  USER_OPTIONS->Acceptance_Test = user_acceptance_test;-#endif-#if USER_ACCEPT_ASYMP_EXP-  USER_OPTIONS->Asymp_Exp_Param = 1.0;-#endif-#if USER_GENERATING_FUNCTION-  USER_OPTIONS->Generating_Distrib = user_generating_distrib;-#endif-#if USER_REANNEAL_COST-  USER_OPTIONS->Reanneal_Cost_Function = user_reanneal_cost;-#endif-#if USER_REANNEAL_PARAMETERS-  USER_OPTIONS->Reanneal_Params_Function = user_reanneal_params;-#endif--#if MY_TEMPLATE                 /* MY_TEMPLATE_pre_initialize */-  /* last changes before entering initialize_parameters() */-  USER_OPTIONS->Asa_Data_Ptr = func;-  USER_OPTIONS->Asa_Data_Dim_Ptr = 1;-  memcpy(parameter_lower_bound,lower_bounds,sizeof(double)*number_parameters);-  memcpy(cost_parameters,lower_bounds,sizeof(double)*number_parameters);-  memcpy(parameter_upper_bound,upper_bounds,sizeof(double)*number_parameters);-  memcpy(parameter_int_real, type, sizeof(int)*number_parameters);-#endif--  initialize_parameters_value = initialize_parameters (cost_parameters,-                                                       parameter_lower_bound,-                                                       parameter_upper_bound,-                                                       cost_tangents,-                                                       cost_curvature,-                                                       parameter_dimension,-                                                       parameter_int_real,-#if OPTIONS_FILE_DATA-                                                       ptr_options,-#endif-                                                       USER_OPTIONS);--  if (initialize_parameters_value == -2)-    return (initialize_parameters_value);--  for(i = 0; i < number_parameters; i++) {-          USER_OPTIONS->User_Quench_Param_Scale[i] = 1.0;-  }-        USER_OPTIONS->User_Quench_Cost_Scale[0] = 1.0;--  /* optimize the cost_function, returning the results in-     cost_value and cost_parameters */-#if ASA_TEMPLATE_MULTIPLE-  /* multiple asa() quenched calls + multiple asa_out files-     (To get longer quenched runs, decrease SMALL_FLOAT.) */-  for (n_asa = 1; n_asa <= *parameter_dimension; n_asa++) {-    asa_file[4] = 'A' + n_asa - 1;-    USER_OPTIONS->User_Quench_Cost_Scale[0] = (double) n_asa;-    for (index = 0; index < *parameter_dimension; ++index)-      USER_OPTIONS->User_Quench_Param_Scale[index] = (double) n_asa;-    for (n_trajectory = 0; n_trajectory < 3; ++n_trajectory) {-      asa_file[6] = 'a' + n_trajectory;-      strcpy (USER_OPTIONS->Asa_Out_File, asa_file);-#endif--#if ASA_TEMPLATE_ASA_OUT_PID-      pid_file[0] = 'a';-      pid_file[1] = 's';-      pid_file[2] = 'a';-      pid_file[3] = '_';-      pid_file[4] = 'o';-      pid_file[5] = 'u';-      pid_file[6] = 't';-      pid_file[7] = '_';--      pid_int = getpid ();-      if (pid_int < 0) {-        pid_file[7] = '0';-        pid_int = -pid_int;-      }--      strcpy (USER_OPTIONS->Asa_Out_File, pid_file);-#endif-      cost_value =-        asa (USER_COST_FUNCTION,-             randflt,-             rand_seed,-             cost_parameters,-             parameter_lower_bound,-             parameter_upper_bound,-             cost_tangents,-             cost_curvature,-             parameter_dimension,-             parameter_int_real, cost_flag, exit_code, USER_OPTIONS);-      if (*exit_code == -1) {-#if INCL_STDOUT-        printf ("\n\n*** error in calloc in ASA ***\n\n");-#endif /* INCL_STDOUT */-        fprintf (ptr_out, "\n\n*** error in calloc in ASA ***\n\n");-        fflush (ptr_out);-        return (-1);-      }-#if MULTI_MIN-      fprintf (ptr_out, "Multi_Specify = %d\n", USER_OPTIONS->Multi_Specify);-#if INT_LONG-      fprintf (ptr_out, "N_Accepted = %ld\n", USER_OPTIONS->N_Accepted);-#else-      fprintf (ptr_out, "N_Accepted = %d\n", USER_OPTIONS->N_Accepted);-#endif-#if ASA_RESOLUTION-      for (n_param = 0; n_param < *parameter_dimension; ++n_param) {-        fprintf (ptr_out,-#if INT_ALLOC-                 "Coarse_Resolution[%d] = %12.7g\n",-#else-#if INT_LONG-                 "Coarse_Resolution[%ld] = %12.7g\n",-#else-                 "Coarse_Resolution[%d] = %12.7g\n",-#endif-#endif-                 n_param, USER_OPTIONS->Coarse_Resolution[n_param]);-      }-#else /* ASA_RESOLUTION */-      for (n_param = 0; n_param < *parameter_dimension; ++n_param) {-        fprintf (ptr_out,-#if INT_ALLOC-                 "Multi_Grid[%d] = %12.7g\n",-#else-#if INT_LONG-                 "Multi_Grid[%ld] = %12.7g\n",-#else-                 "Multi_Grid[%d] = %12.7g\n",-#endif-#endif-                 n_param, USER_OPTIONS->Multi_Grid[n_param]);-      }-#endif /* ASA_RESOLUTION */-      fprintf (ptr_out, "\n");-      for (multi_index = 0; multi_index < USER_OPTIONS->Multi_Number;-           ++multi_index) {-        fprintf (ptr_out, "\n");-        fprintf (ptr_out, "Multi_Cost[%d] = %12.7g\n",-                 multi_index, USER_OPTIONS->Multi_Cost[multi_index]);-        for (n_param = 0; n_param < *parameter_dimension; ++n_param) {-          fprintf (ptr_out,-#if INT_ALLOC-                   "Multi_Params[%d][%d] = %12.7g\n",-#else-#if INT_LONG-                   "Multi_Params[%d][%ld] = %12.7g\n",-#else-                   "Multi_Params[%d][%d] = %12.7g\n",-#endif-#endif-                   multi_index, n_param,-                   USER_OPTIONS->Multi_Params[multi_index][n_param]);-        }-      }-      fprintf (ptr_out, "\n");-      fflush (ptr_out);-#endif /* MULTI_MIN */--#if FITLOC-      /* Fit_Local, Iter_Max and Penalty may be set adaptively */-      USER_OPTIONS->Penalty = 1000;-      USER_OPTIONS->Fit_Local = 0;-      USER_OPTIONS->Iter_Max = 500;-      if (USER_OPTIONS->Fit_Local >= 1) {-        cost_value = fitloc (USER_COST_FUNCTION,-                             cost_parameters,-                             parameter_lower_bound,-                             parameter_upper_bound,-                             cost_tangents,-                             cost_curvature,-                             parameter_dimension,-                             parameter_int_real,-                             cost_flag, exit_code, USER_OPTIONS, ptr_out);-      }-#endif /* FITLOC */-#if MY_TEMPLATE                 /* MY_TEMPLATE_post_asa */-#endif-      *main_cost_value = cost_value;-      for (n_param = 0; n_param < *parameter_dimension; ++n_param) {-        main_cost_parameters[n_param] = cost_parameters[n_param];-      }-      *main_exit_code = *exit_code;--      fprintf (ptr_out, "exit code = %d\n", *exit_code);-      fprintf (ptr_out, "final cost value = %-12.7g\n", cost_value);-      fprintf (ptr_out, "%12s %12s\n","parameter","value");-      for (n_param = 0; n_param < *parameter_dimension; ++n_param) {-        fprintf (ptr_out,-#if INT_ALLOC-                 "%12d %12.7g\n",-#else-#if INT_LONG-                 "%12ld %12.7g\n",-#else-                 "%12d %12.7g\n",-#endif-#endif-                 n_param, cost_parameters[n_param]);-      }---#if ASA_TEMPLATE_MULTIPLE-    }-  }-#endif--#if ASA_TEMPLATE_SAMPLE-  ptr_asa = fopen ("asa_out", "r");-  sample (ptr_out, ptr_asa);-#endif--  /* close all files */-  ptr_out != stdout && fclose (ptr_out);-#if OPTIONAL_DATA_DBL-  free (USER_OPTIONS->Asa_Data_Dbl);-#endif-#if OPTIONAL_DATA_INT-  free (USER_OPTIONS->Asa_Data_Int);-#endif-#if OPTIONAL_DATA_PTR-#if MY_TEMPLATE-  /* Instead of freeing Asa_Data_Ptr, if memory has been allocated-   * outside ASA, e.g., by the use of ASA_LIB, use the following: */-  USER_OPTIONS->Asa_Data_Ptr = NULL; -#endif /* MY_TEMPLATE */-  free (USER_OPTIONS->Asa_Data_Ptr);-#endif-#if USER_ASA_OUT-  free (USER_OPTIONS->Asa_Out_File);-#endif-#if ASA_SAMPLE-  free (USER_OPTIONS->Bias_Generated);-#endif-#if ASA_QUEUE-#if ASA_RESOLUTION-#else-  free (USER_OPTIONS->Queue_Resolution);-#endif-#endif-#if ASA_RESOLUTION-  free (USER_OPTIONS->Coarse_Resolution);-#endif-  if (USER_OPTIONS->Curvature_0 == FALSE || USER_OPTIONS->Curvature_0 == -1)-    free (cost_curvature);-#if USER_INITIAL_PARAMETERS_TEMPS-  free (USER_OPTIONS->User_Parameter_Temperature);-#endif-#if USER_INITIAL_COST_TEMP-  free (USER_OPTIONS->User_Cost_Temperature);-#endif-#if DELTA_PARAMETERS-  free (USER_OPTIONS->User_Delta_Parameter);-#endif-#if QUENCH_PARAMETERS-  free (USER_OPTIONS->User_Quench_Param_Scale);-#endif-#if QUENCH_COST-  free (USER_OPTIONS->User_Quench_Cost_Scale);-#endif-#if RATIO_TEMPERATURE_SCALES-  free (USER_OPTIONS->User_Temperature_Ratio);-#endif-#if MULTI_MIN-  free (USER_OPTIONS->Multi_Cost);-  free (USER_OPTIONS->Multi_Grid);-  for (multi_index = 0; multi_index < USER_OPTIONS->Multi_Number;-       ++multi_index) {-    free (USER_OPTIONS->Multi_Params[multi_index]);-  }-  free (USER_OPTIONS->Multi_Params);-#endif /* MULTI_MIN */-  free (USER_OPTIONS);-  free (parameter_dimension);-  free (exit_code);-  free (cost_flag);-  free (parameter_lower_bound);-  free (parameter_upper_bound);-  free (cost_parameters);-  free (parameter_int_real);-  free (cost_tangents);-  free (rand_seed);-  return (0);-  /* NOTREACHED */-}--/***********************************************************************-* initialize_parameters - sample parameter initialization function-*	This depends on the users cost function to optimize (minimum).-*	The routine allocates storage needed for asa. The user should-*	define the number of parameters and their ranges,-*	and make sure the initial parameters are within-*	the minimum and maximum ranges. The array-*	parameter_int_real should be REAL_TYPE (-1) for real parameters,-*	and INTEGER_TYPE (1) for integer values-***********************************************************************/-#if HAVE_ANSI-int-initialize_parameters (double *cost_parameters,-                       double *parameter_lower_bound,-                       double *parameter_upper_bound,-                       double *cost_tangents,-                       double *cost_curvature,-                       ALLOC_INT * parameter_dimension,-                       int *parameter_int_real,-#if OPTIONS_FILE_DATA-                       FILE * ptr_options,-#endif-                       USER_DEFINES * USER_OPTIONS)-#else-int-initialize_parameters (cost_parameters,-                       parameter_lower_bound,-                       parameter_upper_bound,-                       cost_tangents,-                       cost_curvature,-                       parameter_dimension, parameter_int_real,-#if OPTIONS_FILE_DATA-                       ptr_options,-#endif-                       USER_OPTIONS)-     double *cost_parameters;-     double *parameter_lower_bound;-     double *parameter_upper_bound;-     double *cost_tangents;-     double *cost_curvature;-     ALLOC_INT *parameter_dimension;-     int *parameter_int_real;-#if OPTIONS_FILE_DATA-     FILE *ptr_options;-#endif-     USER_DEFINES *USER_OPTIONS;-#endif-{-  ALLOC_INT index;-#if OPTIONS_FILE_DATA-  char read_option[80];-  ALLOC_INT read_index;-#endif-#if MULTI_MIN-  int multi_index;-#endif-#if MY_TEMPLATE                 /* MY_TEMPLATE_init_decl */-  /* add some declarations if required */-#endif--  index = 0;-#if OPTIONS_FILE_DATA-  fscanf (ptr_options, "%s", read_option);--  for (index = 0; index < *parameter_dimension; ++index) {-#if MY_TEMPLATE                 /* MY_TEMPLATE_read_opt */-    /* put in some code as required to alter lines read from asa_opt */-#endif-#if INT_ALLOC-    fscanf (ptr_options, "%d", &read_index);-#else-#if INT_LONG-    fscanf (ptr_options, "%ld", &read_index);-#else-    fscanf (ptr_options, "%d", &read_index);-#endif-#endif-    fscanf (ptr_options, "%lf%lf%lf%d",-            &(parameter_lower_bound[read_index]),-            &(parameter_upper_bound[read_index]),-            &(cost_parameters[read_index]),-            &(parameter_int_real[read_index]));-  }-#else /* OPTIONS_FILE_DATA */-#if ASA_TEST-  /* store the parameter ranges */-  for (index = 0; index < *parameter_dimension; ++index)-    parameter_lower_bound[index] = -10000.0;-  for (index = 0; index < *parameter_dimension; ++index)-    parameter_upper_bound[index] = 10000.0;--  /* store the initial parameter types */-  for (index = 0; index < *parameter_dimension; ++index)-    parameter_int_real[index] = REAL_TYPE;--  /* store the initial parameter values */-  for (index = 0; index < *parameter_dimension / 4.0; ++index) {-    cost_parameters[4 * (index + 1) - 4] = 999.0;-    cost_parameters[4 * (index + 1) - 3] = -1007.0;-    cost_parameters[4 * (index + 1) - 2] = 1001.0;-    cost_parameters[4 * (index + 1) - 1] = -903.0;-  }-#endif /* ASA_TEST */-#endif /* OPTIONS_FILE_DATA */-#if ASA_TEMPLATE_SAMPLE-  for (index = 0; index < *parameter_dimension; ++index)-    parameter_lower_bound[index] = 0;-  for (index = 0; index < *parameter_dimension; ++index)-    parameter_upper_bound[index] = 2.0;-  for (index = 0; index < *parameter_dimension; ++index)-    parameter_int_real[index] = REAL_TYPE;-  for (index = 0; index < *parameter_dimension; ++index)-    cost_parameters[index] = 0.5;-#endif--#if USER_INITIAL_PARAMETERS_TEMPS-  if ((USER_OPTIONS->User_Parameter_Temperature =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->User_Parameter_Temperature");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->User_Parameter_Temperature[index] = 1.0;-#endif-#endif /* USER_INITIAL_PARAMETERS_TEMPS */-#if USER_INITIAL_COST_TEMP-  if ((USER_OPTIONS->User_Cost_Temperature =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->User_Cost_Temperature");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  USER_OPTIONS->User_Cost_Temperature[0] = 5.936648E+09;-#endif-#endif /* USER_INITIAL_COST_TEMP */-#if DELTA_PARAMETERS-  if ((USER_OPTIONS->User_Delta_Parameter =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->User_Delta_Parameter");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->User_Delta_Parameter[index] = 0.001;-#endif-#endif /* DELTA_PARAMETERS */-#if QUENCH_PARAMETERS-  if ((USER_OPTIONS->User_Quench_Param_Scale =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->User_Quench_Param_Scale");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->User_Quench_Param_Scale[index] = 1.0;-#endif-#if ASA_TEMPLATE_MULTIPLE-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->User_Quench_Param_Scale[index] = 1.0;-#endif-#if ASA_TEMPLATE_SAVE-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->User_Quench_Param_Scale[index] = 1.0;-#endif-#endif /* QUENCH_PARAMETERS */-#if QUENCH_COST-  if ((USER_OPTIONS->User_Quench_Cost_Scale =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->User_Quench_Cost_Scale");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  USER_OPTIONS->User_Quench_Cost_Scale[0] = 1.0;-#endif-#if ASA_TEMPLATE_MULTIPLE-  USER_OPTIONS->User_Quench_Cost_Scale[0] = 1.0;-#endif-#if ASA_TEMPLATE_SAVE-  USER_OPTIONS->User_Quench_Cost_Scale[0] = 1.0;-#endif-#endif /* QUENCH_COST */--  /* use asa_opt to read in QUENCH USER_OPTIONS */-#if OPTIONS_FILE_DATA-#if QUENCH_COST-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &(USER_OPTIONS->User_Quench_Cost_Scale[0]));--#if QUENCH_PARAMETERS-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%s", read_option);-  for (index = 0; index < *parameter_dimension; ++index) {-#if INT_ALLOC-    fscanf (ptr_options, "%d", &read_index);-#else-#if INT_LONG-    fscanf (ptr_options, "%ld", &read_index);-#else-    fscanf (ptr_options, "%d", &read_index);-#endif-#endif-    fscanf (ptr_options, "%lf",-            &(USER_OPTIONS->User_Quench_Param_Scale[read_index]));-  }-#endif /* QUENCH_PARAMETERS */-#endif /* QUENCH_COST */-#endif /* OPTIONS_FILE_DATA */--#if RATIO_TEMPERATURE_SCALES-  if ((USER_OPTIONS->User_Temperature_Ratio =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->User_Temperature_Ratio");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->User_Temperature_Ratio[index] = 1.0;-#endif-#endif /* RATIO_TEMPERATURE_SCALES */-  /* Defines the limit of collection of sampled data by asa */-#if ASA_SAMPLE-  /* create memory for Bias_Generated[] */-  if ((USER_OPTIONS->Bias_Generated =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->Bias_Generated");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif--#if ASA_RESOLUTION-  if ((USER_OPTIONS->Coarse_Resolution =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->Coarse_Resolution");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->Coarse_Resolution[index] = 1.0;-#endif-#endif /* ASA_RESOLUTION */-#if ASA_QUEUE-#if ASA_RESOLUTION-  USER_OPTIONS->Queue_Resolution = USER_OPTIONS->Coarse_Resolution;-#else /* ASA_RESOLUTION */-  if ((USER_OPTIONS->Queue_Resolution =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->Queue_Resolution");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif /* ASA_RESOLUTION */-#if ASA_TEMPLATE_QUEUE-  USER_OPTIONS->Queue_Size = 100;-  for (index = 0; index < *parameter_dimension; ++index)-    USER_OPTIONS->Queue_Resolution[index] = 0.001;-#endif-#endif /* ASA_QUEUE */-#if MULTI_MIN-#if ASA_TEMPLATE-  USER_OPTIONS->Multi_Number = 2;-#endif-  if ((USER_OPTIONS->Multi_Cost =-       (double *) calloc (USER_OPTIONS->Multi_Number,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->Multi_Cost");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((USER_OPTIONS->Multi_Grid =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->Multi_Grid");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((USER_OPTIONS->Multi_Params =-       (double **) calloc (USER_OPTIONS->Multi_Number,-                           sizeof (double *))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): USER_OPTIONS->Multi_Params");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  for (multi_index = 0; multi_index < USER_OPTIONS->Multi_Number;-       ++multi_index) {-    if ((USER_OPTIONS->Multi_Params[multi_index] =-         (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-      strcpy (user_exit_msg,-              "initialize_parameters(): USER_OPTIONS->Multi_Params[multi_index]");-      Exit_USER (user_exit_msg);-      return (-2);-    }-  }-#if ASA_TEST-  for (index = 0; index < *parameter_dimension; ++index) {-    USER_OPTIONS->Multi_Grid[index] = 0.05;-  }-  USER_OPTIONS->Multi_Specify = 0;-#endif-#if ASA_TEMPLATE-  for (index = 0; index < *parameter_dimension; ++index) {-    USER_OPTIONS->Multi_Grid[index] =-      (parameter_upper_bound[index] - parameter_lower_bound[index]) / 100.0;-  }-  USER_OPTIONS->Multi_Specify = 0;-#endif /* ASA_TEMPLATE */-#endif /* MULTI_MIN */-  USER_OPTIONS->Asa_Recursive_Level = 0;--#if MY_TEMPLATE                 /* MY_TEMPLATE_params */-  /* If not using RECUR_OPTIONS_FILE_DATA or data read from asa_opt,-     store the parameter ranges-     store the parameter types-     store the initial parameter values-     other changes needed for initialization */-#endif /* MY_TEMPLATE params */--  return (0);-}--#if COST_FILE-#else-/***********************************************************************-* double cost_function-*	This is the users cost function to optimize-*	(find the minimum).-*	cost_flag is set to TRUE if the parameter set-*	does not violates any constraints-*       parameter_lower_bound and parameter_upper_bound may be-*       adaptively changed during the search.-***********************************************************************/--#if HAVE_ANSI-double-cost_function (double *x,-               double *parameter_lower_bound,-               double *parameter_upper_bound,-               double *cost_tangents,-               double *cost_curvature,-               ALLOC_INT * parameter_dimension,-               int *parameter_int_real,-               int *cost_flag, int *exit_code, USER_DEFINES * USER_OPTIONS)-#else-double-cost_function (x,-               parameter_lower_bound,-               parameter_upper_bound,-               cost_tangents,-               cost_curvature,-               parameter_dimension,-               parameter_int_real, cost_flag, exit_code, USER_OPTIONS)-     double *x;-     double *parameter_lower_bound;-     double *parameter_upper_bound;-     double *cost_tangents;-     double *cost_curvature;-     ALLOC_INT *parameter_dimension;-     int *parameter_int_real;-     int *cost_flag;-     int *exit_code;-     USER_DEFINES *USER_OPTIONS;-#endif-{--#if ASA_TEST                    /* ASA test problem */-  /* Objective function from-   * %A A. Corana-   * %A M. Marchesi-   * %A C. Martini-   * %A S. Ridella-   * %T Minimizing multimodal functions of continuous variables-   *    with the "simulated annealing" algorithm-   * %J ACM Trans. Mathl. Software-   * %V 13-   * %N 3-   * %P 262-279-   * %D 1987-   *-   * This function, when used with ASA_TEST_POINT set to TRUE, contains-   * 1.0E20 local minima.  When *parameter_dimension is equal to 4, visiting-   * each minimum for a millisecond would take about the present age of the-   * universe to visit all these minima. */--  /* defines for the test problem, which assume *parameter_dimension-     is a multiple of 4.  If this is set to a large number, you-     likely should set Curvature_0 to TRUE. */-  double q_n, d_i, s_i, t_i, z_i, c_r;-  int k_i;-#if ASA_TEST_POINT-  ALLOC_INT k_flag;-#endif-  ALLOC_INT i, j;-#if SELF_OPTIMIZE-#else-  static LONG_INT funevals = 0;-#endif-#if ASA_TEMPLATE_SAVE-  static int read_test = 0;-  FILE *ptr_read_test;-#endif--#if MY_TEMPLATE                 /* MY_TEMPLATE_diminishing_ranges */-  /* insert code to automate changing ranges of parameters */-#endif-#if ASA_TEMPLATE                /* example of diminishing ranges */-  if (USER_OPTIONS->Locate_Cost == 12 && *(USER_OPTIONS->Best_Cost) < 1.0) {-    fprintf (ptr_out, "best_cost = %g\n", *(USER_OPTIONS->Best_Cost));-    for (i = 0; i < *parameter_dimension; ++i) {-      parameter_lower_bound[i] = USER_OPTIONS->Best_Parameters[i]-        - 0.5 * fabs (parameter_lower_bound[i]-                      - USER_OPTIONS->Best_Parameters[i]);-      parameter_upper_bound[i] = USER_OPTIONS->Best_Parameters[i]-        + 0.5 * fabs (parameter_upper_bound[i]-                      - USER_OPTIONS->Best_Parameters[i]);-      parameter_lower_bound[i] = MIN (parameter_lower_bound[i],-                                      USER_OPTIONS->Best_Parameters[i] --                                      0.01);-      parameter_upper_bound[i] =-        MAX (parameter_upper_bound[i],-             USER_OPTIONS->Best_Parameters[i] + 0.01);-    }-  }-#endif /* ASA_TEMPLATE */--  /* a_i = parameter_upper_bound[i] */-  s_i = 0.2;-  t_i = 0.05;-  c_r = 0.15;--#if ASA_TEST_POINT-  k_flag = 0;-  for (i = 0; i < *parameter_dimension; ++i) {-    if (fabs (parameter_upper_bound[i] - parameter_lower_bound[i]) <-        (double) EPS_DOUBLE)-      continue;--    if (x[i] > 0.0) {-      k_i = (int) (x[i] / s_i + 0.5);-    } else if (x[i] < 0.0) {-      k_i = (int) (x[i] / s_i - 0.5);-    } else {-      k_i = 0;-    }-    if (k_i == 0)-      ++k_flag;-  }-#endif /* ASA_TEST_POINT */--  q_n = 0.0;-  for (i = 0; i < *parameter_dimension; ++i) {-    if (fabs (parameter_upper_bound[i] - parameter_lower_bound[i]) <-        (double) EPS_DOUBLE)-      continue;--    j = i % 4;-    switch (j) {-    case 0:-      d_i = 1.0;-      break;-    case 1:-      d_i = 1000.0;-      break;-    case 2:-      d_i = 10.0;-      break;-    default:-      d_i = 100.0;-    }-    if (x[i] > 0.0) {-      k_i = (int) (x[i] / s_i + 0.5);-    } else if (x[i] < 0.0) {-      k_i = (int) (x[i] / s_i - 0.5);-    } else {-      k_i = 0;-    }--#if ASA_TEST_POINT-    if (fabs (k_i * s_i - x[i]) < t_i && k_flag != *parameter_dimension)-#else-    if (fabs (k_i * s_i - x[i]) < t_i)-#endif-    {-      if (k_i < 0) {-        z_i = k_i * s_i + t_i;-      } else if (k_i > 0) {-        z_i = k_i * s_i - t_i;-      } else {-        z_i = 0.0;-      }-      q_n += c_r * d_i * z_i * z_i;-    } else {-      q_n += d_i * x[i] * x[i];-    }-  }-  funevals = funevals + 1;--#if ASA_TEMPLATE_SAVE-  /* cause a crash */-  if ((ptr_read_test = fopen ("asa_save", "r")) == NULL) {-    read_test = 1;-    fclose (ptr_read_test);-  } else {-    fclose (ptr_read_test);-  }-  /* will need a few hundred if testing ASA_PARALLEL to get an asa_save */-  if (funevals == 50 && read_test == 1) {-    fprintf (ptr_out, "\n\n*** intended crash to test ASA_SAVE *** \n\n");-    fflush (ptr_out);-#if INCL_STDOUT-    printf ("\n\n*** intended crash to test ASA_SAVE *** \n\n");-#endif /* INCL_STDOUT */-    exit (2);-  }-#endif--  *cost_flag = TRUE;--#if SELF_OPTIMIZE-#else-#if TIME_CALC-  /* print the time every PRINT_FREQUENCY evaluations */-  if ((PRINT_FREQUENCY > 0) && ((funevals % PRINT_FREQUENCY) == 0)) {-    fprintf (ptr_out, "funevals = %ld  ", funevals);-#if INCL_STDOUT-    print_time ("", ptr_out);-#endif /* INCL_STDOUT */-  }-#endif-#endif--#if ASA_TEMPLATE_SAMPLE-  USER_OPTIONS->Cost_Acceptance_Flag = TRUE;-  if (USER_OPTIONS->User_Acceptance_Flag == FALSE && *cost_flag == TRUE)-    USER_OPTIONS->Acceptance_Test (q_n,-                                   parameter_lower_bound,-                                   parameter_upper_bound,-                                   *parameter_dimension, USER_OPTIONS);-#endif /* ASA_TEMPLATE_SAMPLE */--  return (q_n);-#endif /* ASA_TEST */-#if ASA_TEMPLATE_SAMPLE--  int n;-  double cost;--  if (*cost_flag == FALSE) {-    for (n = 0; n < *parameter_dimension; ++n)-      if (fabs (parameter_upper_bound[n] - parameter_lower_bound[n]) <-          (double) EPS_DOUBLE)-        continue;--    cost_tangents[n] = 2.0 * x[n];-  }--  cost = 0.0;-  for (n = 0; n < *parameter_dimension; ++n) {-    if (fabs (parameter_upper_bound[n] - parameter_lower_bound[n]) <-        (double) EPS_DOUBLE)-      continue;--    cost += (x[n] * x[n]);-  }--  *cost_flag = TRUE;--  USER_OPTIONS->Cost_Acceptance_Flag = TRUE;-  if (USER_OPTIONS->User_Acceptance_Flag == FALSE && *cost_flag == TRUE)-    USER_OPTIONS->Acceptance_Test (cost,-                                   parameter_lower_bound,-                                   parameter_upper_bound,-                                   *parameter_dimension, USER_OPTIONS);--  return (cost);-#endif /* ASA_TEMPLATE_SAMPLE */-#if MY_TEMPLATE                 /* MY_TEMPLATE_cost */-   return USER_OPTIONS->Asa_Data_Ptr(x,cost_flag); -  /* Use the parameter values x[] and define your cost_function.-     The {} brackets around this function are already in place. */-#endif /* MY_TEMPLATE cost */-}-#endif /* COST_FILE */--  /* Here is a good random number generator */--#define MULT ((LONG_INT) 25173)-#define MOD ((LONG_INT) 65536)-#define INCR ((LONG_INT) 13849)-#define FMOD ((double) 65536.0)---/***********************************************************************-* double myrand - returns random number between 0 and 1-*	This routine returns the random number generator between 0 and 1-***********************************************************************/--static double-myrand (LONG_INT * rand_seed)-  /* returns random number in {0,1} */-{-#if TRUE                        /* (change to FALSE for alternative RNG) */-  *rand_seed = (LONG_INT) ((MULT * (*rand_seed) + INCR) % MOD);-  return ((double) (*rand_seed) / FMOD);-#else-  /* See "Random Number Generators: Good Ones Are Hard To Find,"-     Park & Miller, CACM 31 (10) (October 1988) pp. 1192-1201.-     ***********************************************************-     THIS IMPLEMENTATION REQUIRES AT LEAST 32 BIT INTEGERS-     *********************************************************** */-#define _A_MULTIPLIER  16807L-#define _M_MODULUS     2147483647L      /* (2**31)-1 */-#define _Q_QUOTIENT    127773L  /* 2147483647 / 16807 */-#define _R_REMAINDER   2836L    /* 2147483647 % 16807 */-  long lo;-  long hi;-  long test;--  hi = *rand_seed / _Q_QUOTIENT;-  lo = *rand_seed % _Q_QUOTIENT;-  test = _A_MULTIPLIER * lo - _R_REMAINDER * hi;-  if (test > 0) {-    *rand_seed = test;-  } else {-    *rand_seed = test + _M_MODULUS;-  }-  return ((double) *rand_seed / _M_MODULUS);-#endif /* alternative RNG */-}--/***********************************************************************-* double randflt-***********************************************************************/--static double-randflt (LONG_INT * rand_seed)-{-  return (resettable_randflt (rand_seed, 0));-}--/***********************************************************************-* double resettable_randflt-***********************************************************************/--static double-resettable_randflt (LONG_INT * rand_seed, int reset)-  /* shuffles random numbers in random_array[SHUFFLE] array */-{--  /* This RNG is a modified algorithm of that presented in-   * %A K. Binder-   * %A D. Stauffer-   * %T A simple introduction to Monte Carlo simulations and some-   *    specialized topics-   * %B Applications of the Monte Carlo Method in statistical physics-   * %E K. Binder-   * %I Springer-Verlag-   * %C Berlin-   * %D 1985-   * %P 1-36-   * where it is stated that such algorithms have been found to be-   * quite satisfactory in many statistical physics applications. */--  double rranf;-  unsigned kranf;-  int n;-  static int initial_flag = 0;-  LONG_INT initial_seed;-  static double random_array[SHUFFLE];  /* random variables */--  if (*rand_seed < 0)-    *rand_seed = -*rand_seed;--  if ((initial_flag == 0) || reset) {-    initial_seed = *rand_seed;--    for (n = 0; n < SHUFFLE; ++n)-      random_array[n] = myrand (&initial_seed);--    initial_flag = 1;--    for (n = 0; n < 1000; ++n)  /* warm up random generator */-      rranf = randflt (&initial_seed);--    rranf = randflt (rand_seed);--    return (rranf);-  }--  kranf = (unsigned) (myrand (rand_seed) * SHUFFLE) % SHUFFLE;-  rranf = *(random_array + kranf);-  *(random_array + kranf) = myrand (rand_seed);--  return (rranf);-}--#if USER_COST_SCHEDULE-#if HAVE_ANSI-double-user_cost_schedule (double test_temperature, USER_DEFINES * USER_OPTIONS)-#else-double-user_cost_schedule (test_temperature, USER_OPTIONS)-     double test_temperature;-     USER_DEFINES *USER_OPTIONS;-#endif /* HAVE_ANSI */-{-  double x;--#if ASA_TEMPLATE_SAMPLE-  x = F_POW (test_temperature, 0.15);-#endif-#if ASA_TEMPLATE-  x = test_temperature;-#endif--  return (x);-}-#endif /* USER_COST_SCHEDULE */--#if USER_ACCEPTANCE_TEST-#if HAVE_ANSI-void-user_acceptance_test (double current_cost,-                      double *parameter_lower_bound,-                      double *parameter_upper_bound,-                      ALLOC_INT * parameter_dimension,-                      USER_DEFINES * USER_OPTIONS)-#else-void-user_acceptance_test (current_cost, parameter_lower_bound,-                      parameter_upper_bound, parameter_dimension,-                      USER_OPTIONS)-     double current_cost;-     double *parameter_lower_bound;-     double *parameter_upper_bound;-     ALLOC_INT *parameter_dimension;-     USER_DEFINES *USER_OPTIONS;-#endif /* HAVE_ANSI */-{-  double uniform_test, curr_cost_temp;-#if USER_ACCEPT_ASYMP_EXP-  double x, q, delta_cost;-#endif--#if ASA_TEMPLATE                /* ASA cost index */-  /* Calculate the current ASA cost index.  This could be useful-     to define a new schedule for the cost temperature, beyond-     simple changes that can be made using USER_COST_SCHEDULE. */--  int index;-  double k_temperature, quench, y;-  double xparameter_dimension;--#if QUENCH_COST-  quench = USER_OPTIONS->User_Quench_Cost_Scale[0];-#else-  quench = 1.0;-#endif /* QUENCH_COST */-  xparameter_dimension = (double) *parameter_dimension;-  for (index = 0; index < *parameter_dimension; ++index)-    if (fabs (parameter_upper_bound[index] - parameter_lower_bound[index]) <-        (double) EPS_DOUBLE)-      *xparameter_dimension -= 1.0;--  y = -F_LOG (USER_OPTIONS->Cost_Temp_Curr-              / USER_OPTIONS->Cost_Temp_Init) / USER_OPTIONS->Cost_Temp_Scale;--  k_temperature = F_POW (y, xparameter_dimension / quench);-#endif /* ASA cost index */--  uniform_test = randflt (USER_OPTIONS->Random_Seed);-  curr_cost_temp = USER_OPTIONS->Cost_Temp_Curr;--#if ASA_TEMPLATE-#if USER_COST_SCHEDULE-  curr_cost_temp =-    (USER_OPTIONS->Cost_Schedule (USER_OPTIONS->Cost_Temp_Curr,-                                  USER_OPTIONS) + (double) EPS_DOUBLE);-#else-  curr_cost_temp = USER_OPTIONS->Cost_Temp_Curr;-#endif-#endif /* ASA_TEMPLATE */--  /* You must add in your own test here.  If USER_ACCEPT_ASYMP_EXP-     also is TRUE here, then you can use the default-     Asymp_Exp_Param=1 to replicate the code in asa.c. */--#if USER_ACCEPT_ASYMP_EXP-#if USER_COST_SCHEDULE-  curr_cost_temp =-    (USER_OPTIONS->Cost_Schedule (USER_OPTIONS->Cost_Temp_Curr,-                                  USER_OPTIONS) + (double) EPS_DOUBLE);-#endif--  delta_cost = (current_cost - *(USER_OPTIONS->Last_Cost))-    / (curr_cost_temp + (double) EPS_DOUBLE);--  /* The following asymptotic approximation to the exponential-   * function, "Tsallis statistics," was proposed in-   * %A T.J.P. Penna-   * %T Traveling salesman problem and Tsallis statistics-   * %J Phys. Rev. E-   * %V 50-   * %N 6-   * %P R1-R3-   * %D 1994-   * While the use of the TSP for a test case is of dubious value (since-   * there are many special algorithms for this problem), the use of this-   * function is another example of how to control the rate of annealing-   * of the acceptance criteria.  E.g., if you require a more moderate-   * acceptance test, then negative q may be helpful. */--  q = USER_OPTIONS->Asymp_Exp_Param;-  if (fabs (1.0 - q) < (double) EPS_DOUBLE)-    x = MIN (1.0, (F_EXP (-delta_cost)));       /* Boltzmann test */-  else if ((1.0 - (1.0 - q) * delta_cost) < (double) EPS_DOUBLE)-    x = MIN (1.0, (F_EXP (-delta_cost)));       /* Boltzmann test */-  else-    x = MIN (1.0, F_POW ((1.0 - (1.0 - q) * delta_cost), (1.0 / (1.0 - q))));--  USER_OPTIONS->Prob_Bias = x;-  if (x >= uniform_test)-    USER_OPTIONS->User_Acceptance_Flag = TRUE;-  else-    USER_OPTIONS->User_Acceptance_Flag = FALSE;--#endif /* USER_ACCEPT_ASYMP_EXP */-}-#endif /* USER_ACCEPTANCE_TEST */--#if USER_GENERATING_FUNCTION-#if HAVE_ANSI-double-user_generating_distrib (LONG_INT * seed,-                         ALLOC_INT * parameter_dimension,-                         ALLOC_INT index_v,-                         double temperature_v,-                         double init_param_temp_v,-                         double temp_scale_params_v,-                         double parameter_v,-                         double parameter_range_v,-                         double *last_saved_parameter,-                         USER_DEFINES * USER_OPTIONS)-#else-double-user_generating_distrib (seed,-                         parameter_dimension,-                         index_v,-                         temperature_v,-                         init_param_temp_v,-                         temp_scale_params_v,-                         parameter_v,-                         parameter_range_v,-                         last_saved_parameter, USER_OPTIONS)-     LONG_INT *seed;-     ALLOC_INT *parameter_dimension;-     ALLOC_INT index_v;-     double temperature_v;-     double init_param_temp_v;-     double temp_scale_params_v;-     double parameter_v;-     double parameter_range_v;-     double *last_saved_parameter;-     USER_DEFINES *USER_OPTIONS;-#endif-{-#if ASA_TEMPLATE-  double x, y, z;--  /* This is the ASA distribution.  A slower temperature schedule can be-     obtained here, e.g., temperature_v = pow(temperature_v, 0.5); */--  x = randflt (seed);-  y = x < 0.5 ? -1.0 : 1.0;-  z = y * temperature_v * (F_POW ((1.0 + 1.0 / temperature_v),-                                  fabs (2.0 * x - 1.0)) - 1.0);--  x = parameter_v + z * parameter_range_v;--  return (x);-#endif /* ASA_TEMPLATE */-}-#endif /* USER_GENERATING_FUNCTION */--#if USER_REANNEAL_COST-#if HAVE_ANSI-int-user_reanneal_cost (double *cost_best,-                    double *cost_last,-                    double *initial_cost_temperature,-                    double *current_cost_temperature,-                    USER_DEFINES * USER_OPTIONS)-#else-int-user_reanneal_cost (cost_best,-                    cost_last,-                    initial_cost_temperature,-                    current_cost_temperature, USER_OPTIONS)-     double *cost_best;-     double *cost_last;-     double *initial_cost_temperature;-     double *current_cost_temperature;-     USER_DEFINES *USER_OPTIONS;-#endif /* HAVE_ANSI */-{-  int cost_test;-  double tmp_dbl;--#if ASA_TEMPLATE-  static int first_time = 1;-  static double save_last[3];-  double average_cost_last;--  if (first_time == 1) {-    first_time = 0;-    save_last[0] = save_last[1] = save_last[2] = *cost_last;-  }--  save_last[2] = save_last[1];-  save_last[1] = save_last[0];-  save_last[0] = *cost_last;-  average_cost_last =-    fabs ((save_last[0] + save_last[1] + save_last[2]) / 3.0);--  tmp_dbl = MAX (fabs (*cost_best), average_cost_last);-  tmp_dbl = MAX ((double) EPS_DOUBLE, tmp_dbl);-  *initial_cost_temperature = MIN (*initial_cost_temperature, tmp_dbl);--  /* This test can be useful if your cost function goes from a positive-     to a negative value, and you do not want to get get stuck in a local-     minima around zero due to the default in reanneal().  Pick any-     number instead of 0.0001 */-  tmp_dbl = MIN (fabs (*cost_last), fabs (*cost_best));-  if (tmp_dbl < 0.0001)-    cost_test = FALSE;-  else-    cost_test = TRUE;-#endif /* ASA_TEMPLATE */--  tmp_dbl = MAX (fabs (cost_last), fabs (cost_best));-  tmp_dbl = MAX ((double) EPS_DOUBLE, tmp_dbl);-  *initial_cost_temperature = MIN (*initial_cost_temperature, tmp_dbl);--  *current_cost_temperature =-    MAX (fabs (cost_last - cost_best), *current_cost_temperature);-  *current_cost_temperature =-    MAX ((double) EPS_DOUBLE, *current_cost_temperature);-  *current_cost_temperature =-    MIN (*current_cost_temperature, *initial_cost_temperature);--  cost_test = TRUE;--  return (cost_test);-}-#endif /* USER_REANNEAL_COST */--#if USER_REANNEAL_PARAMETERS-#if HAVE_ANSI-double-user_reanneal_params (double current_temp,-                      double tangent,-                      double max_tangent, USER_DEFINES * USER_OPTIONS)-#else-double-user_reanneal_params (current_temp, tangent, max_tangent, USER_OPTIONS)-     double current_temp;-     double tangent;-     double max_tangent;-     USER_DEFINES *USER_OPTIONS;-#endif /* HAVE_ANSI */-{-#if ASA_TEMPLATE-  double x;--  x = current_temp * (max_tangent / tangent);--  return (x);-#endif-}-#endif /* USER_REANNEAL_PARAMETERS */--#if SELF_OPTIMIZE--/***********************************************************************-* main-*	This is a sample calling program to self-optimize ASA-***********************************************************************/-#if HAVE_ANSI--#if ASA_LIB-int-asa_main (-#if ASA_TEMPLATE_LIB-           double *main_recur_cost_value,-           double *main_recur_cost_parameters, int *main_recur_exit_code-#endif-  )-#else /* ASA_LIB */-int-main (int argc, char **argv)-#endif                          /* ASA_LIB */-#else /* HAVE_ANSI */--#if ASA_LIB-int-asa_main (-#if ASA_TEMPLATE_LIB-           main_recur_cost_value,-           main_recur_cost_parameters, main_recur_exit_code-#endif-  )-#if ASA_TEMPLATE_LIB-     double *main_recur_cost_value;-     double *main_recur_cost_parameters;-     int *main_recur_exit_code;-#endif--#else /* ASA_LIB */-int-main (argc, argv)-     int argc;-     char **argv;-#endif /* ASA_LIB */--#endif /* HAVE_ANSI */-{--  /* seed for random number generator */-  LONG_INT *recur_rand_seed;--#if RECUR_OPTIONS_FILE-  FILE *recur_ptr_options;-  char read_option[80];-  char read_if[4], read_FALSE[6], read_comm1[3], read_ASA_SAVE[9],-    read_comm2[3];-  int read_int;-#if INT_LONG-  LONG_INT read_long;-#endif-  double read_double;-#endif--  int *recur_exit_code;-#if MULTI_MIN-  int multi_index;-  ALLOC_INT n_param;-#endif--  double *recur_parameter_lower_bound, *recur_parameter_upper_bound;-  double *recur_cost_parameters, *recur_cost_tangents, *recur_cost_curvature;-  double recur_cost_value;--  ALLOC_INT *recur_parameter_dimension;-  int *recur_parameter_int_real;-  int *recur_cost_flag;-  int recur_initialize_parameters_value;-  ALLOC_INT recur_v;-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_main_decl */-  /* add some declarations if required */-#endif--  USER_DEFINES *RECUR_USER_OPTIONS;--  if ((recur_parameter_dimension =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_parameter_dimension");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((recur_exit_code = (int *) calloc (1, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_exit_code");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((recur_cost_flag = (int *) calloc (1, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_cost_flag");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if ((RECUR_USER_OPTIONS =-       (USER_DEFINES *) calloc (1, sizeof (USER_DEFINES))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): RECUR_USER_OPTIONS");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if RECUR_OPTIONS_FILE-  recur_ptr_options = fopen ("asa_opt_recur", "r");--  fscanf (recur_ptr_options, "%s%s%s%s%s",-          read_if, read_FALSE, read_comm1, read_ASA_SAVE, read_comm2);-  if (strcmp (read_if, "#if") || strcmp (read_FALSE, "FALSE") ||-      strcmp (read_comm1, "/*") || strcmp (read_ASA_SAVE, "ASA_SAVE") ||-      strcmp (read_comm2, "*/")) {-    fprintf (ptr_out, "\n\n*** not asa_opt_recur for this version *** \n\n");-    fflush (ptr_out);-#if INCL_STDOUT-    printf ("\n\n*** EXIT not asa_opt_recur for this version *** \n\n");-#endif /* INCL_STDOUT */-    return (-6);-  }-#if INT_LONG-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%ld", &read_long);-  RECUR_USER_OPTIONS->Limit_Acceptances = read_long;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%ld", &read_long);-  RECUR_USER_OPTIONS->Limit_Generated = read_long;-#else-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Limit_Acceptances = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Limit_Generated = read_int;-#endif-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Limit_Invalid_Generated_States = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf", &read_double);-  RECUR_USER_OPTIONS->Accepted_To_Generated_Ratio = read_double;--  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf", &read_double);-  RECUR_USER_OPTIONS->Cost_Precision = read_double;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Maximum_Cost_Repeat = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Number_Cost_Samples = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf", &read_double);-  RECUR_USER_OPTIONS->Temperature_Ratio_Scale = read_double;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf", &read_double);-  RECUR_USER_OPTIONS->Cost_Parameter_Scale_Ratio = read_double;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf", &read_double);-  RECUR_USER_OPTIONS->Temperature_Anneal_Scale = read_double;--  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Include_Integer_Parameters = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->User_Initial_Parameters = read_int;-#if INT_ALLOC-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Sequential_Parameters = read_int;-#else-#if INT_LONG-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%ld", &read_long);-  RECUR_USER_OPTIONS->Sequential_Parameters = read_long;-#else-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Sequential_Parameters = read_int;-#endif-#endif-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf", &read_double);-  RECUR_USER_OPTIONS->Initial_Parameter_Temperature = read_double;--  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Acceptance_Frequency_Modulus = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Generated_Frequency_Modulus = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Reanneal_Cost = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Reanneal_Parameters = read_int;--  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf", &read_double);-  RECUR_USER_OPTIONS->Delta_X = read_double;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->User_Tangents = read_int;-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%d", &read_int);-  RECUR_USER_OPTIONS->Curvature_0 = read_int;--#else /* RECUR_OPTIONS_FILE */-  RECUR_USER_OPTIONS->Limit_Acceptances = 100;-  RECUR_USER_OPTIONS->Limit_Generated = 1000;-  RECUR_USER_OPTIONS->Limit_Invalid_Generated_States = 1000;-  RECUR_USER_OPTIONS->Accepted_To_Generated_Ratio = 1.0E-4;--  RECUR_USER_OPTIONS->Cost_Precision = 1.0E-18;-  RECUR_USER_OPTIONS->Maximum_Cost_Repeat = 2;-  RECUR_USER_OPTIONS->Number_Cost_Samples = 2;-  RECUR_USER_OPTIONS->Temperature_Ratio_Scale = 1.0E-5;-  RECUR_USER_OPTIONS->Cost_Parameter_Scale_Ratio = 1.0;-  RECUR_USER_OPTIONS->Temperature_Anneal_Scale = 100.0;--  RECUR_USER_OPTIONS->Include_Integer_Parameters = FALSE;-  RECUR_USER_OPTIONS->User_Initial_Parameters = FALSE;-  RECUR_USER_OPTIONS->Sequential_Parameters = -1;-  RECUR_USER_OPTIONS->Initial_Parameter_Temperature = 1.0;--  RECUR_USER_OPTIONS->Acceptance_Frequency_Modulus = 15;-  RECUR_USER_OPTIONS->Generated_Frequency_Modulus = 10000;-  RECUR_USER_OPTIONS->Reanneal_Cost = FALSE;-  RECUR_USER_OPTIONS->Reanneal_Parameters = FALSE;--  RECUR_USER_OPTIONS->Delta_X = 1.0E-6;-  RECUR_USER_OPTIONS->User_Tangents = FALSE;-  RECUR_USER_OPTIONS->Curvature_0 = TRUE;--#endif /* RECUR_OPTIONS_FILE */--  /* the number of parameters for the recur_cost_function */-#if RECUR_OPTIONS_FILE_DATA-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%s", read_option);--#if INT_ALLOC-  fscanf (recur_ptr_options, "%d", &read_int);-  *recur_parameter_dimension = read_int;-#else-#if INT_LONG-  fscanf (recur_ptr_options, "%ld", &read_long);-  *recur_parameter_dimension = read_long;-#else-  fscanf (recur_ptr_options, "%d", &read_int);-  *recur_parameter_dimension = read_int;-#endif-#endif--#else /* RECUR_OPTIONS_FILE_DATA */-#if ASA_TEMPLATE_SELFOPT-  *recur_parameter_dimension = 2;-#endif-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_dim */-  /* If not using RECUR_OPTIONS_FILE_DATA or data read from recur_asa_opt,-     insert the number of parameters for the recur_cost_function */-#endif /* MY_TEMPLATE recur_dim */-#endif /* RECUR_OPTIONS_FILE_DATA */-  if ((recur_parameter_lower_bound =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_parameter_lower_bound");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((recur_parameter_upper_bound =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_parameter_upper_bound");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if ((recur_cost_parameters =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_cost_parameters");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if ((recur_parameter_int_real =-       (int *) calloc (*recur_parameter_dimension, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_parameter_int_real");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if ((recur_cost_tangents =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_cost_tangents");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if (RECUR_USER_OPTIONS->Curvature_0 == FALSE-      || RECUR_USER_OPTIONS->Curvature_0 == -1) {--    if ((recur_cost_curvature =-         (double *) calloc ((*recur_parameter_dimension)-                            * (*recur_parameter_dimension),-                            sizeof (double))) == NULL) {-      strcpy (user_exit_msg, "main()/asa_main(): recur_cost_curvature");-      Exit_USER (user_exit_msg);-      return (-2);-    }-  } else {-    recur_cost_curvature = (double *) NULL;-  }--#if ASA_TEMPLATE_SELFOPT-  /* Set memory to that required for use. */-  RECUR_USER_OPTIONS->Asa_Data_Dim_Dbl = 1;-  if ((RECUR_USER_OPTIONS->Asa_Data_Dbl =-       (double *) calloc (RECUR_USER_OPTIONS->Asa_Data_Dim_Dbl,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "main()/asa_main(): RECUR_USER_OPTIONS->Asa_Data_Dbl");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  /* Use Asa_Data[0] as flag, e.g., if used with SELF_OPTIMIZE. */-  RECUR_USER_OPTIONS->Asa_Data_Dbl[0] = 0;-#endif /* ASA_TEMPLATE_SELFOPT */--#if OPTIONAL_DATA_PTR-#if ASA_TEMPLATE-  RECUR_USER_OPTIONS->Asa_Data_Dim_Ptr = 1;-  if ((RECUR_USER_OPTIONS->Asa_Data_Ptr =-       (OPTIONAL_PTR_TYPE *) calloc (RECUR_USER_OPTIONS->Asa_Data_Dim_Ptr,-                                     sizeof (OPTIONAL_PTR_TYPE))) == NULL) {-    strcpy (user_exit_msg,-            "main()/asa_main(): RECUR_USER_OPTIONS->Asa_Data_Ptr");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif /* ASA_TEMPLATE */-#endif /* OPTIONAL_DATA_PTR */--#if ASA_SAVE-  /* Such data could be saved in a user_save file, but for-     convenience here everything is saved in asa_save. */-  RECUR_USER_OPTIONS->Random_Array_Dim = SHUFFLE;-  RECUR_USER_OPTIONS->Random_Array = random_array;-#endif /* ASA_SAVE */--  /* open the output file */-#if ASA_SAVE-  if (!strcmp (USER_OUT, "STDOUT")) {-#if INCL_STDOUT-    ptr_out = stdout;-#endif /* INCL_STDOUT */-  } else {-    ptr_out = fopen (USER_OUT, "a");-  }-#else-  if (!strcmp (USER_OUT, "STDOUT")) {-#if INCL_STDOUT-    ptr_out = stdout;-#endif /* INCL_STDOUT */-  } else {-    ptr_out = fopen (USER_OUT, "w");-  }-#endif-//  fprintf (ptr_out, "%s\n\n", USER_ID);--  fflush (ptr_out);--  if ((recur_rand_seed =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (user_exit_msg, "main()/asa_main(): recur_rand_seed");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  /* first value of *recur_rand_seed */-#if ASA_LIB-  *recur_rand_seed = (asa_rand_seed ? *asa_rand_seed : (LONG_INT) 696969);-#else-  *recur_rand_seed = 696969;-#endif--  randflt (recur_rand_seed);--#if USER_COST_SCHEDULE-  RECUR_USER_OPTIONS->Cost_Schedule = recur_user_cost_schedule;-#endif-#if USER_ACCEPTANCE_TEST-  RECUR_USER_OPTIONS->Acceptance_Test = recur_user_acceptance_test;-#endif-#if USER_ACCEPT_ASYMP_EXP-  RECUR_USER_OPTIONS->Asymp_Exp_Param = 1.0;-#endif-#if USER_GENERATING_FUNCTION-  RECUR_USER_OPTIONS->Generating_Distrib = recur_user_generating_distrib;-#endif-#if USER_REANNEAL_COST-  RECUR_USER_OPTIONS->Reanneal_Cost_Function = recur_user_reanneal_cost;-#endif-#if USER_REANNEAL_PARAMETERS-  RECUR_USER_OPTIONS->Reanneal_Params_Function = recur_user_reanneal_params;-#endif--#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_pre_initialize */-  /* last changes before entering recur_initialize_parameters() */-#endif--  /* initialize the users parameters, allocating space, etc.-     Note that the default is to have asa generate the initial-     recur_cost_parameters that satisfy the user's constraints. */--  recur_initialize_parameters_value =-    recur_initialize_parameters (recur_cost_parameters,-                                 recur_parameter_lower_bound,-                                 recur_parameter_upper_bound,-                                 recur_cost_tangents,-                                 recur_cost_curvature,-                                 recur_parameter_dimension,-                                 recur_parameter_int_real,-#if RECUR_OPTIONS_FILE_DATA-                                 recur_ptr_options,-#endif-                                 RECUR_USER_OPTIONS);-#if RECUR_OPTIONS_FILE-  fclose (recur_ptr_options);-#endif-  if (recur_initialize_parameters_value == -2)-    return (recur_initialize_parameters_value);--#if USER_ASA_OUT-  if ((RECUR_USER_OPTIONS->Asa_Out_File =-       (char *) calloc (80, sizeof (char))) == NULL) {-    strcpy (user_exit_msg,-            "main()/asa_main(): RECUR_USER_OPTIONS->Asa_Out_File");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE_SELFOPT-  strcpy (RECUR_USER_OPTIONS->Asa_Out_File, "asa_sfop");-#endif-#endif--  recur_cost_value = asa (RECUR_USER_COST_FUNCTION,-                          randflt,-                          recur_rand_seed,-                          recur_cost_parameters,-                          recur_parameter_lower_bound,-                          recur_parameter_upper_bound,-                          recur_cost_tangents,-                          recur_cost_curvature,-                          recur_parameter_dimension,-                          recur_parameter_int_real,-                          recur_cost_flag,-                          recur_exit_code, RECUR_USER_OPTIONS);-  if (*recur_exit_code == -1) {-#if INCL_STDOUT-    printf ("\n\n*** error in calloc in ASA ***\n\n");-#endif /* INCL_STDOUT */-    fprintf (ptr_out, "\n\n*** error in calloc in ASA ***\n\n");-    fflush (ptr_out);-    return (-1);-  }-#if MULTI_MIN-  fprintf (ptr_out, "Multi_Specify = %d\n",-           RECUR_USER_OPTIONS->Multi_Specify);-  for (n_param = 0; n_param < *recur_parameter_dimension; ++n_param) {-    fprintf (ptr_out,-#if INT_ALLOC-             "Multi_Grid[%d] = %12.7g\n",-#else-#if INT_LONG-             "Multi_Grid[%ld] = %12.7g\n",-#else-             "Multi_Grid[%d] = %12.7g\n",-#endif-#endif-             n_param, RECUR_USER_OPTIONS->Multi_Grid[n_param]);-  }-  fprintf (ptr_out, "\n");-  for (multi_index = 0; multi_index < RECUR_USER_OPTIONS->Multi_Number;-       ++multi_index) {-    fprintf (ptr_out, "\n");-    fprintf (ptr_out, "Multi_Cost[%d] = %12.7g\n",-             multi_index, RECUR_USER_OPTIONS->Multi_Cost[multi_index]);-    for (n_param = 0; n_param < *recur_parameter_dimension; ++n_param) {-      fprintf (ptr_out,-#if INT_ALLOC-               "Multi_Params[%d][%d] = %12.7g\n",-#else-#if INT_LONG-               "Multi_Params[%d][%ld] = %12.7g\n",-#else-               "Multi_Params[%d][%d] = %12.7g\n",-#endif-#endif-               multi_index, n_param,-               RECUR_USER_OPTIONS->Multi_Params[multi_index][n_param]);-    }-  }-  fprintf (ptr_out, "\n");-  fflush (ptr_out);-#endif /* MULTI_MIN */--#if FITLOC-  /* Fit_Local and Penalty may be set adaptively */-  RECUR_USER_OPTIONS->Penalty = 1000;-  RECUR_USER_OPTIONS->Fit_Local = 0;-  RECUR_USER_OPTIONS->Iter_Max = 500;-  if (RECUR_USER_OPTIONS->Fit_Local >= 1) {-    recur_cost_value = fitloc (RECUR_USER_COST_FUNCTION,-                               recur_cost_parameters,-                               recur_parameter_lower_bound,-                               recur_parameter_upper_bound,-                               recur_cost_tangents,-                               recur_cost_curvature,-                               recur_parameter_dimension,-                               recur_parameter_int_real,-                               recur_cost_flag,-                               recur_exit_code, RECUR_USER_OPTIONS, ptr_out);-  }-#endif /* FITLOC */--  fprintf (ptr_out, "\n\n recur_cost_value = %12.7g\n", recur_cost_value);-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_post_recur_asa */-#endif-#if ASA_TEMPLATE_LIB-  *main_recur_cost_value = recur_cost_value;-  for (recur_v = 0; recur_v < *recur_parameter_dimension; ++recur_v) {-    main_recur_cost_parameters[recur_v] = recur_cost_parameters[recur_v];-  }-  *main_recur_exit_code = *recur_exit_code;-#endif--  for (recur_v = 0; recur_v < *recur_parameter_dimension; ++recur_v)-#if INT_ALLOC-    fprintf (ptr_out, "recur_cost_parameters[%d] = %12.7g\n",-#else-#if INT_LONG-    fprintf (ptr_out, "recur_cost_parameters[%ld] = %12.7g\n",-#else-    fprintf (ptr_out, "recur_cost_parameters[%d] = %12.7g\n",-#endif-#endif-             recur_v, recur_cost_parameters[recur_v]);--  fprintf (ptr_out, "\n\n");---  /* close all files */-  ptr_out != stdout && fclose (ptr_out);--#if OPTIONAL_DATA_DBL-  free (RECUR_USER_OPTIONS->Asa_Data_Dbl);-#endif-#if OPTIONAL_DATA_INT-  free (RECUR_USER_OPTIONS->Asa_Data_Int);-#endif-#if OPTIONAL_DATA_PTR-  free (RECUR_USER_OPTIONS->Asa_Data_Ptr);-#endif-#if USER_ASA_OUT-  free (RECUR_USER_OPTIONS->Asa_Out_File);-#endif-#if ASA_SAMPLE-  free (RECUR_USER_OPTIONS->Bias_Generated);-#endif-#if ASA_QUEUE-#if ASA_RESOLUTION-#else-  free (RECUR_USER_OPTIONS->Queue_Resolution);-#endif-#endif-#if ASA_RESOLUTION-  free (RECUR_USER_OPTIONS->Coarse_Resolution);-#endif-  if (RECUR_USER_OPTIONS->Curvature_0 == FALSE-      || RECUR_USER_OPTIONS->Curvature_0 == -1)-    free (recur_cost_curvature);-#if USER_INITIAL_PARAMETERS_TEMPS-  free (RECUR_USER_OPTIONS->User_Parameter_Temperature);-#endif-#if USER_INITIAL_COST_TEMP-  free (RECUR_USER_OPTIONS->User_Cost_Temperature);-#endif-#if DELTA_PARAMETERS-  free (RECUR_USER_OPTIONS->User_Delta_Parameter);-#endif-#if QUENCH_PARAMETERS-  free (RECUR_USER_OPTIONS->User_Quench_Param_Scale);-#endif-#if QUENCH_COST-  free (RECUR_USER_OPTIONS->User_Quench_Cost_Scale);-#endif-#if RATIO_TEMPERATURE_SCALES-  free (RECUR_USER_OPTIONS->User_Temperature_Ratio);-#endif-#if MULTI_MIN-  free (RECUR_USER_OPTIONS->Multi_Cost);-  free (RECUR_USER_OPTIONS->Multi_Grid);-  for (multi_index = 0; multi_index < RECUR_USER_OPTIONS->Multi_Number;-       ++multi_index) {-    free (RECUR_USER_OPTIONS->Multi_Params[multi_index]);-  }-  free (RECUR_USER_OPTIONS->Multi_Params);-#endif /* MULTI_MIN */-  free (RECUR_USER_OPTIONS);-  free (recur_parameter_dimension);-  free (recur_exit_code);-  free (recur_cost_flag);-  free (recur_parameter_lower_bound);-  free (recur_parameter_upper_bound);-  free (recur_cost_parameters);-  free (recur_parameter_int_real);-  free (recur_cost_tangents);-  free (recur_rand_seed);--  return (0);-  /* NOTREACHED */-}--/***********************************************************************-* recur_initialize_parameters-*	This depends on the users cost function to optimize (minimum).-*	The routine allocates storage needed for asa. The user should-*	define the number of parameters and their ranges,-*	and make sure the initial parameters are within-*	the minimum and maximum ranges. The array-*	recur_parameter_int_real should be REAL_TYPE (-1)-*       for real parameters,-***********************************************************************/-#if HAVE_ANSI-int-recur_initialize_parameters (double *recur_cost_parameters,-                             double *recur_parameter_lower_bound,-                             double *recur_parameter_upper_bound,-                             double *recur_cost_tangents,-                             double *recur_cost_curvature,-                             ALLOC_INT * recur_parameter_dimension,-                             int *recur_parameter_int_real,-#if RECUR_OPTIONS_FILE_DATA-                             FILE * recur_ptr_options,-#endif-                             USER_DEFINES * RECUR_USER_OPTIONS)-#else-int-recur_initialize_parameters (recur_cost_parameters,-                             recur_parameter_lower_bound,-                             recur_parameter_upper_bound,-                             recur_cost_tangents,-                             recur_cost_curvature,-                             recur_parameter_dimension,-                             recur_parameter_int_real,-#if RECUR_OPTIONS_FILE_DATA-                             recur_ptr_options,-#endif-                             RECUR_USER_OPTIONS)-     double *recur_parameter_lower_bound;-     double *recur_parameter_upper_bound;-     double *recur_cost_parameters;-     double *recur_cost_tangents;-     double *recur_cost_curvature;-     ALLOC_INT *recur_parameter_dimension;-     int *recur_parameter_int_real;-#if RECUR_OPTIONS_FILE_DATA-     FILE *recur_ptr_options;-#endif-     USER_DEFINES *RECUR_USER_OPTIONS;-#endif-{-  ALLOC_INT index;-#if RECUR_OPTIONS_FILE_DATA-  char read_option[80];-  ALLOC_INT read_index;-#endif-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_init_decl */-  /* add some declarations if required */-#endif-#if MULTI_MIN-  int multi_index;-#endif--#if RECUR_OPTIONS_FILE_DATA-  fscanf (recur_ptr_options, "%s", read_option);--  for (index = 0; index < *recur_parameter_dimension; ++index) {-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_read_opt */-    /* put in some code as required to alter lines read from recur_asa_opt */-#endif-#if INT_ALLOC-    fscanf (recur_ptr_options, "%d", &read_index);-#else-#if INT_LONG-    fscanf (recur_ptr_options, "%ld", &read_index);-#else-    fscanf (recur_ptr_options, "%d", &read_index);-#endif-#endif-    fscanf (recur_ptr_options, "%lf%lf%lf%d",-            &(recur_parameter_lower_bound[read_index]),-            &(recur_parameter_upper_bound[read_index]),-            &(recur_cost_parameters[read_index]),-            &(recur_parameter_int_real[read_index]));-  }-#else /* RECUR_OPTIONS_FILE_DATA */-#if ASA_TEMPLATE_SELFOPT-  /*  NOTE:-     USER_OPTIONS->Temperature_Ratio_Scale = x[0];-     USER_OPTIONS->Cost_Parameter_Scale_Ratio = x[1];-   */--  /* store the initial parameter values */-  recur_cost_parameters[0] = 1.0E-5;-  recur_cost_parameters[1] = 1.0;--  recur_parameter_lower_bound[0] = 1.0E-6;-  recur_parameter_upper_bound[0] = 1.0E-4;--  recur_parameter_lower_bound[1] = 0.5;-  recur_parameter_upper_bound[1] = 3.0;--  /* store the initial parameter types */-  for (index = 0; index < *recur_parameter_dimension; ++index)-    recur_parameter_int_real[index] = REAL_TYPE;-#endif-#endif /* RECUR_OPTIONS_FILE_DATA */--#if USER_INITIAL_PARAMETERS_TEMPS-  if ((RECUR_USER_OPTIONS->User_Parameter_Temperature =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->User_Parameter_Temperature");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  for (index = 0; index < *recur_parameter_dimension; ++index)-    RECUR_USER_OPTIONS->User_Parameter_Temperature[index] = 1.0;-#endif /* USER_INITIAL_PARAMETERS_TEMPS */-#if USER_INITIAL_COST_TEMP-  if ((RECUR_USER_OPTIONS->User_Cost_Temperature =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->User_Cost_Temperature");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  RECUR_USER_OPTIONS->User_Cost_Temperature[0] = 5.936648E+09;-#endif /* USER_INITIAL_COST_TEMP */-#if DELTA_PARAMETERS-  if ((RECUR_USER_OPTIONS->User_Delta_Parameter =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->User_Delta_Parameter");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  for (index = 0; index < *recur_parameter_dimension; ++index)-    RECUR_USER_OPTIONS->User_Delta_Parameter[index] = 0.001;-#endif /* DELTA_PARAMETERS */-#if QUENCH_PARAMETERS-  if ((RECUR_USER_OPTIONS->User_Quench_Param_Scale =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->User_Quench_Param_Scale");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  for (index = 0; index < *recur_parameter_dimension; ++index)-    RECUR_USER_OPTIONS->User_Quench_Param_Scale[index] = 1.0;-#endif-#endif /* QUENCH_PARAMETERS */-#if QUENCH_COST-  if ((RECUR_USER_OPTIONS->User_Quench_Cost_Scale =-       (double *) calloc (1, sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->User_Quench_Cost_Scale");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  RECUR_USER_OPTIONS->User_Quench_Cost_Scale[0] = 1.0;-#endif-#endif /* QUENCH_COST */--  /* use asa_opt_recur to read in QUENCH RECUR_USER_OPTIONS */-#if RECUR_OPTIONS_FILE_DATA-#if QUENCH_COST-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%lf",-          &(RECUR_USER_OPTIONS->User_Quench_Cost_Scale[0]));--#if QUENCH_PARAMETERS-  fscanf (recur_ptr_options, "%s", read_option);-  fscanf (recur_ptr_options, "%s", read_option);-  for (index = 0; index < *recur_parameter_dimension; ++index) {-#if INT_ALLOC-    fscanf (recur_ptr_options, "%d", &read_index);-#else-#if INT_LONG-    fscanf (recur_ptr_options, "%ld", &read_index);-#else-    fscanf (recur_ptr_options, "%d", &read_index);-#endif-#endif-    fscanf (recur_ptr_options, "%lf",-            &(RECUR_USER_OPTIONS->User_Quench_Param_Scale[read_index]));-  }-#endif /* QUENCH_PARAMETERS */-#endif /* QUENCH_COST */-#endif /* RECUR_OPTIONS_FILE_DATA */-#if RATIO_TEMPERATURE_SCALES-  if ((RECUR_USER_OPTIONS->User_Temperature_Ratio =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->User_Temperature_Ratio");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  for (index = 0; index < *recur_parameter_dimension; ++index)-    RECUR_USER_OPTIONS->User_Temperature_Ratio[index] = 1.0;-#endif-#endif /* RATIO_TEMPERATURE_SCALES */-  /* Defines the limit of collection of sampled data by asa */-#if ASA_SAMPLE-  /* create memory for Bias_Generated[] */-  if ((RECUR_USER_OPTIONS->Bias_Generated =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->Bias_Generated");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE-  RECUR_USER_OPTIONS->Limit_Weights = 1.0E-7;-#if QUENCH_COST-  RECUR_USER_OPTIONS->User_Quench_Cost_Scale[0] = 1.0;-#endif-#if QUENCH_PARAMETERS-  for (index = 0; index < *recur_parameter_dimension; ++index)-    RECUR_USER_OPTIONS->User_Quench_Param_Scale[index] = 1.0;-#endif-#endif /* ASA_TEMPLATE */-#endif /* ASA_SAMPLE */--#if ASA_TEMPLATE-#if ASA_PARALLEL-  RECUR_USER_OPTIONS->Gener_Block = 1;-  RECUR_USER_OPTIONS->Gener_Block_Max = 1;-  RECUR_USER_OPTIONS->Gener_Mov_Avr = 1;-#endif-#endif-#if ASA_RESOLUTION-  if ((RECUR_USER_OPTIONS->Coarse_Resolution =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->Coarse_Resolution");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif-#if MULTI_MIN-#if ASA_TEMPLATE-  RECUR_USER_OPTIONS->Multi_Number = 2;-#endif-  if ((RECUR_USER_OPTIONS->Multi_Cost =-       (double *) calloc (RECUR_USER_OPTIONS->Multi_Number,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): RECUR_USER_OPTIONS->Multi_Cost");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((RECUR_USER_OPTIONS->Multi_Grid =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->Multi_Grid");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((RECUR_USER_OPTIONS->Multi_Params =-       (double **) calloc (RECUR_USER_OPTIONS->Multi_Number,-                           sizeof (double *))) == NULL) {-    strcpy (user_exit_msg,-            "initialize_parameters(): RECUR_USER_OPTIONS->Multi_Params");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  for (multi_index = 0; multi_index < RECUR_USER_OPTIONS->Multi_Number;-       ++multi_index) {-    if ((RECUR_USER_OPTIONS->Multi_Params[multi_index] =-         (double *) calloc (*recur_parameter_dimension,-                            sizeof (double))) == NULL) {-      strcpy (user_exit_msg,-              "recur_initialize_parameters(): RECUR_USER_OPTIONS->Multi_Params[multi_index]");-      Exit_USER (user_exit_msg);-      return (-2);-    }-  }-#if ASA_TEST-  for (index = 0; index < *recur_parameter_dimension; ++index) {-    RECUR_USER_OPTIONS->Multi_Grid[index] = 0.05;-  }-  RECUR_USER_OPTIONS->Multi_Specify = 0;-#endif-#if ASA_TEMPLATE-  for (index = 0; index < *recur_parameter_dimension; ++index) {-    RECUR_USER_OPTIONS->Multi_Grid[index] =-      (recur_parameter_upper_bound[index] --       recur_parameter_lower_bound[index]) / 100.0;-  }-  RECUR_USER_OPTIONS->Multi_Specify = 0;-#endif /* ASA_TEMPLATE */-#endif /* MULTI_MIN */-#if ASA_TEMPLATE_QUEUE-  RECUR_USER_OPTIONS->Queue_Size = 0;-#endif-#if ASA_QUEUE-#if ASA_RESOLUTION-  RECUR_USER_OPTIONS->Queue_Resolution =-    RECUR_USER_OPTIONS->Coarse_Resolution;-#else /* ASA_RESOLUTION */-  if ((RECUR_USER_OPTIONS->Queue_Resolution =-       (double *) calloc (*recur_parameter_dimension,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_initialize_parameters(): RECUR_USER_OPTIONS->Queue_Resolution");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif /* ASA_RESOLUTION */-#if ASA_TEMPLATE_QUEUE-  RECUR_USER_OPTIONS->Queue_Size = 0;-#endif-#endif /* ASA_QUEUE */-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_params */-  /* If not using RECUR_OPTIONS_FILE_DATA or data read from recur_asa_opt,-     store the recur_parameter ranges-     store the recur_parameter types-     store the initial recur_parameter values-     other changes needed for initialization */-#endif /* MY_TEMPLATE recur_params */-  RECUR_USER_OPTIONS->Asa_Recursive_Level = 1;--  return (0);-}--/***********************************************************************-* double recur_cost_function-*	This is the users cost function to optimize-*	(find the minimum).-*	cost_flag is set to TRUE if the parameter set-*	does not violates any constraints-*       recur_parameter_lower_bound and recur_parameter_upper_bound-*       may be adaptively changed during the search.-***********************************************************************/-#if HAVE_ANSI-double-recur_cost_function (double *x,-                     double *recur_parameter_lower_bound,-                     double *recur_parameter_upper_bound,-                     double *recur_cost_tangents,-                     double *recur_cost_curvature,-                     ALLOC_INT * recur_parameter_dimension,-                     int *recur_parameter_int_real,-                     int *recur_cost_flag,-                     int *recur_exit_code, USER_DEFINES * RECUR_USER_OPTIONS)-#else-double-recur_cost_function (x,-                     recur_parameter_lower_bound,-                     recur_parameter_upper_bound,-                     recur_cost_tangents,-                     recur_cost_curvature,-                     recur_parameter_dimension,-                     recur_parameter_int_real,-                     recur_cost_flag, recur_exit_code, RECUR_USER_OPTIONS)-     double *x;-     double *recur_parameter_lower_bound;-     double *recur_parameter_upper_bound;-     double *recur_cost_tangents;-     double *recur_cost_curvature;-     ALLOC_INT *recur_parameter_dimension;-     int *recur_parameter_int_real;-     int *recur_cost_flag;-     int *recur_exit_code;-     USER_DEFINES *RECUR_USER_OPTIONS;-#endif-{-  double cost_value;-  static LONG_INT recur_funevals = 0;-  int *exit_code;-#if OPTIONAL_DATA_PTR-  int data_ptr_flg;-#endif-#if OPTIONS_FILE-  FILE *ptr_options;-  char read_option[80];-  char read_if[4], read_FALSE[6], read_comm1[3], read_ASA_SAVE[9],-    read_comm2[3];-  int read_int;-#if INT_LONG-  LONG_INT read_long;-#endif-  double read_double;-#endif-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_cost_decl */-  /* add some declarations if required */-#endif--  double *parameter_lower_bound, *parameter_upper_bound;-  double *cost_parameters;-  double *cost_tangents, *cost_curvature;-  ALLOC_INT *parameter_dimension;-  int *parameter_int_real;-  int *cost_flag;-  static LONG_INT *rand_seed;-  static int initial_flag = 0;-#if MULTI_MIN-  int multi_index;-#endif--  USER_DEFINES *USER_OPTIONS;--  recur_funevals = recur_funevals + 1;--  if ((rand_seed = (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): rand_seed");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if ((USER_OPTIONS =-       (USER_DEFINES *) calloc (1, sizeof (USER_DEFINES))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): USER_OPTIONS");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if OPTIONS_FILE-  /* Test to see if asa_opt is in correct directory.-     This is useful for some PC and Mac compilers. */-  if ((ptr_options = fopen ("asa_opt", "r")) == NULL) {-    fprintf (ptr_out, "\n\n*** fopen asa_opt failed *** \n\n");-    fflush (ptr_out);-#if INCL_STDOUT-    printf ("\n\n*** EXIT fopen asa_opt failed *** \n\n");-#endif /* INCL_STDOUT */-    return (6);-  }--  fscanf (ptr_options, "%s%s%s%s%s",-          read_if, read_FALSE, read_comm1, read_ASA_SAVE, read_comm2);-  if (strcmp (read_if, "#if") || strcmp (read_FALSE, "FALSE") ||-      strcmp (read_comm1, "/*") || strcmp (read_ASA_SAVE, "ASA_SAVE") ||-      strcmp (read_comm2, "*/")) {-    fprintf (ptr_out, "\n\n*** not asa_opt for this version *** \n\n");-    fflush (ptr_out);-#if INCL_STDOUT-    printf ("\n\n*** EXIT not asa_opt for this version *** \n\n");-#endif /* INCL_STDOUT */-    return (-6);-  }-#if INT_LONG-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%ld", &read_long);-  USER_OPTIONS->Limit_Acceptances = read_long;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%ld", &read_long);-  USER_OPTIONS->Limit_Generated = read_long;-#else-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Limit_Acceptances = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Limit_Generated = read_int;-#endif-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Limit_Invalid_Generated_States = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &read_double);-  USER_OPTIONS->Accepted_To_Generated_Ratio = read_double;--  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &read_double);-  USER_OPTIONS->Cost_Precision = read_double;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Maximum_Cost_Repeat = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Number_Cost_Samples = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &read_double);-  USER_OPTIONS->Temperature_Ratio_Scale = read_double;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &read_double);-  USER_OPTIONS->Cost_Parameter_Scale_Ratio = read_double;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &read_double);-  USER_OPTIONS->Temperature_Anneal_Scale = read_double;--  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Include_Integer_Parameters = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->User_Initial_Parameters = read_int;-#if INT_ALLOC-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Sequential_Parameters = read_int;-#else-#if INT_LONG-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%ld", &read_long);-  USER_OPTIONS->Sequential_Parameters = read_long;-#else-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Sequential_Parameters = read_int;-#endif-#endif-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &read_double);-  USER_OPTIONS->Initial_Parameter_Temperature = read_double;--  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Acceptance_Frequency_Modulus = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Generated_Frequency_Modulus = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Reanneal_Cost = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Reanneal_Parameters = read_int;--  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%lf", &read_double);-  USER_OPTIONS->Delta_X = read_double;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->User_Tangents = read_int;-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%d", &read_int);-  USER_OPTIONS->Curvature_0 = read_int;-#else /* OPTIONS_FILE */-  /* USER_OPTIONS->Limit_Acceptances = 10000; */-  USER_OPTIONS->Limit_Acceptances = 1000;-  USER_OPTIONS->Limit_Generated = 99999;-  USER_OPTIONS->Limit_Invalid_Generated_States = 1000;-  USER_OPTIONS->Accepted_To_Generated_Ratio = 1.0E-6;--  USER_OPTIONS->Cost_Precision = 1.0E-18;-  USER_OPTIONS->Maximum_Cost_Repeat = 2;-  USER_OPTIONS->Number_Cost_Samples = 2;--  /* These variables are set below in x[.] */-  /* USER_OPTIONS->Temperature_Ratio_Scale = 1.0E-5; */-  /* USER_OPTIONS->Cost_Parameter_Scale_Ratio = 1.0; */--  USER_OPTIONS->Temperature_Anneal_Scale = 100.;--  USER_OPTIONS->Include_Integer_Parameters = FALSE;-  USER_OPTIONS->User_Initial_Parameters = FALSE;-  USER_OPTIONS->Sequential_Parameters = -1;-  USER_OPTIONS->Initial_Parameter_Temperature = 1.0;--  USER_OPTIONS->Acceptance_Frequency_Modulus = 100;-  USER_OPTIONS->Generated_Frequency_Modulus = 10000;-  USER_OPTIONS->Reanneal_Cost = 1;-  USER_OPTIONS->Reanneal_Parameters = TRUE;--  USER_OPTIONS->Delta_X = 0.001;-  USER_OPTIONS->User_Tangents = FALSE;-  USER_OPTIONS->Curvature_0 = TRUE;-#endif /* OPTIONS_FILE */--  USER_OPTIONS->Temperature_Ratio_Scale = x[0];-  USER_OPTIONS->Cost_Parameter_Scale_Ratio = x[1];--  if (initial_flag == 0) {-    /* first value of *rand_seed */-#if ASA_LIB-    *rand_seed = (asa_rand_seed ? *asa_rand_seed : (LONG_INT) 696969);-#else-    *rand_seed = 696969;-#endif-  }--  if ((parameter_dimension =-       (ALLOC_INT *) calloc (1, sizeof (ALLOC_INT))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): parameter_dimension");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((exit_code = (int *) calloc (1, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): exit_code");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((cost_flag = (int *) calloc (1, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): cost_flag");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  /* the number of parameters for the cost function */-#if OPTIONS_FILE_DATA-  fscanf (ptr_options, "%s", read_option);-  fscanf (ptr_options, "%s", read_option);--#if INT_ALLOC-  fscanf (ptr_options, "%d", &read_int);-  *parameter_dimension = read_int;-#else-#if INT_LONG-  fscanf (ptr_options, "%ld", &read_long);-  *parameter_dimension = read_long;-#else-  fscanf (ptr_options, "%d", &read_int);-  *parameter_dimension = read_int;-#endif-#endif--#else /* OPTIONS_FILE_DATA */-#if ASA_TEST-  /* set parameter dimension if SELF_OPTIMIZE=TRUE */-  *parameter_dimension = 4;-#endif /* ASA_TEST */-#endif /* OPTIONS_FILE_DATA */-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_dim */-  /* If not using OPTIONS_FILE_DATA or data read from asa_opt,-     set parameter dimension if SELF_OPTIMIZE=TRUE */-#endif /* MY_TEMPLATE recur_dim */--  if ((parameter_lower_bound =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): parameter_lower_bound");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((parameter_upper_bound =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): parameter_upper_bound");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((cost_parameters =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): cost_parameters");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((parameter_int_real =-       (int *) calloc (*parameter_dimension, sizeof (int))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): parameter_int_real");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  if ((cost_tangents =-       (double *) calloc (*parameter_dimension, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "recur_cost_function(): cost_tangents");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  if (USER_OPTIONS->Curvature_0 == FALSE || USER_OPTIONS->Curvature_0 == -1) {-    if ((cost_curvature =-         (double *) calloc ((*parameter_dimension) *-                            (*parameter_dimension),-                            sizeof (double))) == NULL) {-      strcpy (user_exit_msg, "recur_cost_function(): cost_curvature");-      Exit_USER (user_exit_msg);-      return (-2);-    }-  } else {-    cost_curvature = (double *) NULL;-  }--#if ASA_TEMPLATE_SELFOPT-  /* Set memory to that required for use. */-  USER_OPTIONS->Asa_Data_Dim_Dbl = 2;-  if ((USER_OPTIONS->Asa_Data_Dbl =-       (double *) calloc (USER_OPTIONS->Asa_Data_Dim_Dbl,-                          sizeof (double))) == NULL) {-    strcpy (user_exit_msg,-            "recur_cost_function(): USER_OPTIONS->Asa_Data_Dbl");-    Exit_USER (user_exit_msg);-    return (-2);-  }-  /* Use Asa_Data_Dbl[0] as flag, e.g., if used with SELF_OPTIMIZE. */-  USER_OPTIONS->Asa_Data_Dbl[0] = 1.0;-#endif /* ASA_TEMPLATE_SELFOPT */--#if USER_COST_SCHEDULE-  USER_OPTIONS->Cost_Schedule = user_cost_schedule;-#endif-#if USER_ACCEPTANCE_TEST-  USER_OPTIONS->Acceptance_Test = user_acceptance_test;-#endif-#if USER_ACCEPT_ASYMP_EXP-  USER_OPTIONS->Asymp_Exp_Param = 1.0;-#endif-#if USER_GENERATING_FUNCTION-  USER_OPTIONS->Generating_Distrib = user_generating_distrib;-#endif-#if USER_REANNEAL_COST-  USER_OPTIONS->Reanneal_Cost_Function = user_reanneal_cost;-#endif-#if USER_REANNEAL_PARAMETERS-  USER_OPTIONS->Reanneal_Params_Function = user_reanneal_params;-#endif--  initialize_parameters (cost_parameters,-                         parameter_lower_bound,-                         parameter_upper_bound,-                         cost_tangents,-                         cost_curvature,-                         parameter_dimension, parameter_int_real,-#if OPTIONS_FILE_DATA-                         ptr_options,-#endif-                         USER_OPTIONS);-#if OPTIONS_FILE-  fclose (ptr_options);-#endif--#if ASA_SAVE-  USER_OPTIONS->Random_Array_Dim = SHUFFLE;-  USER_OPTIONS->Random_Array = random_array;-#endif /* ASA_SAVE */--  /* It might be a good idea to place a loop around this call,-     and to average over several values of funevals returned by-     trajectories of cost_value. */--  funevals = 0;--#if USER_ASA_OUT-  if ((USER_OPTIONS->Asa_Out_File =-       (char *) calloc (80, sizeof (char))) == NULL) {-    strcpy (user_exit_msg,-            "recur_cost_function(): USER_OPTIONS->Asa_Out_File");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#if ASA_TEMPLATE_SELFOPT-  strcpy (USER_OPTIONS->Asa_Out_File, "asa_rcur");-#endif-#endif--#if OPTIONAL_DATA_PTR-  data_ptr_flg = 1;-#if ASA_TEMPLATE-  /* N.b.:  If OPTIONAL_DATA_PTR is being used for RECUR_USER_OPTIONS-   * as well as for USER_OPTIONS, do not create (or free) additional memory-   * in recur_cost_function() for Asa_Data_Dim_Ptr and Asa_Data_Ptr to-   * be passed to the inner cost_function(), but rather link pointers to-   * those in RECUR_USER_OPTIONS.  Typically, define separate structures-   * within the structure defined by Asa_Data_Ptr to access info depending-   * on whether the run in a particular level of cost function in this-   * recursive operation.  In this case, set * #if TRUE to #if FALSE just-   * below.  See the ASA-README for more discussion.-   */--#if TRUE-  USER_OPTIONS->Asa_Data_Dim_Ptr = 1;-  if ((USER_OPTIONS->Asa_Data_Ptr =-       (OPTIONAL_PTR_TYPE *) calloc (USER_OPTIONS->Asa_Data_Dim_Ptr,-                                     sizeof (OPTIONAL_PTR_TYPE))) == NULL) {-    strcpy (user_exit_msg,-            "recur_cost_function(): USER_OPTIONS->Asa_Data_Ptr");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#else-  USER_OPTIONS->Asa_Data_Dim_Ptr = RECUR_USER_OPTIONS->Asa_Data_Dim_Ptr;-  USER_OPTIONS->Asa_Data_Ptr = RECUR_USER_OPTIONS->Asa_Data_Ptr;-  data_ptr_flg = 0;-#endif-#endif /* ASA_TEMPLATE */-  USER_OPTIONS->Asa_Data_Dim_Ptr = 1;-  if ((USER_OPTIONS->Asa_Data_Ptr =-       (OPTIONAL_PTR_TYPE *) calloc (USER_OPTIONS->Asa_Data_Dim_Ptr,-                                     sizeof (OPTIONAL_PTR_TYPE))) == NULL) {-    strcpy (user_exit_msg,-            "recur_cost_function(): USER_OPTIONS->Asa_Data_Ptr");-    Exit_USER (user_exit_msg);-    return (-2);-  }-#endif /* OPTIONAL_DATA_PTR */--  cost_value = asa (USER_COST_FUNCTION,-                    randflt,-                    rand_seed,-                    cost_parameters,-                    parameter_lower_bound,-                    parameter_upper_bound,-                    cost_tangents,-                    cost_curvature,-                    parameter_dimension,-                    parameter_int_real, cost_flag, exit_code, USER_OPTIONS);-  if (*exit_code == -1) {-#if INCL_STDOUT-    printf ("\n\n*** error in calloc in ASA ***\n\n");-#endif /* INCL_STDOUT */-    fprintf (ptr_out, "\n\n*** error in calloc in ASA ***\n\n");-    fflush (ptr_out);-    return (-1);-  }-#if MY_TEMPLATE                 /* MY_TEMPLATE_recur_post_asa */-#endif--  if (cost_value > .001) {-    *recur_cost_flag = FALSE;-  } else {-    *recur_cost_flag = TRUE;-  }--#if FALSE                       /* set to 1 to activate FAST EXIT */-  /* Make a quick exit */-  if (recur_funevals >= 10) {-    *recur_cost_flag = FALSE;-    RECUR_USER_OPTIONS->Limit_Invalid_Generated_States = 0;-    fprintf (ptr_out, "FAST EXIT set at recur_funevals = 10\n\n");-  }-#endif--#if TIME_CALC-  /* print every RECUR_PRINT_FREQUENCY evaluations */-  if ((RECUR_PRINT_FREQUENCY > 0) &&-      ((recur_funevals % RECUR_PRINT_FREQUENCY) == 0)) {-    USER_OPTIONS->Temperature_Ratio_Scale = x[0];-    fprintf (ptr_out, "USER_OPTIONS->Temperature_Ratio_Scale = %12.7g\n",-             USER_OPTIONS->Temperature_Ratio_Scale);-    USER_OPTIONS->Cost_Parameter_Scale_Ratio = x[1];-    fprintf (ptr_out, "USER_OPTIONS->Cost_Parameter_Scale_Ratio = %12.7g\n",-             USER_OPTIONS->Cost_Parameter_Scale_Ratio);-  }-  print_time ("", ptr_out);-#endif--  fprintf (ptr_out, "recur_funevals = %ld, *recur_cost_flag = %d\n",-           recur_funevals, *recur_cost_flag);-  /* cost function = number generated at best cost */-#if ASA_TEMPLATE_SELFOPT-  funevals = (LONG_INT) (USER_OPTIONS->Asa_Data_Dbl[1]);-  fprintf (ptr_out, "\tbest_funevals = %ld, cost_value = %12.7g\n\n",-           funevals, cost_value);-  /* cost function = total number generated during run */-#endif /* ASA_TEMPLATE_SELFOPT */--#if ASA_SAMPLE-  fprintf (ptr_out, "\tfunevals = %ld, cost_value = %12.7g\n\n",-           funevals, cost_value);-#endif-  fflush (ptr_out);--#if ASA_TEMPLATE_SAMPLE-  ptr_asa = fopen ("asa_out", "r");-  sample (ptr_out, ptr_asa);-#endif--#if OPTIONAL_DATA_DBL-  free (USER_OPTIONS->Asa_Data_Dbl);-#endif-#if OPTIONAL_DATA_INT-  free (USER_OPTIONS->Asa_Data_Int);-#endif-#if OPTIONAL_DATA_PTR-  if (data_ptr_flg == 1) {-    free (USER_OPTIONS->Asa_Data_Ptr);-  }-#endif-#if USER_ASA_OUT-  free (USER_OPTIONS->Asa_Out_File);-#endif-#if ASA_SAMPLE-  free (USER_OPTIONS->Bias_Generated);-#endif-#if ASA_QUEUE-#if ASA_RESOLUTION-#else-  free (USER_OPTIONS->Queue_Resolution);-#endif-#endif-#if ASA_RESOLUTION-  free (USER_OPTIONS->Coarse_Resolution);-#endif-  if (USER_OPTIONS->Curvature_0 == FALSE || USER_OPTIONS->Curvature_0 == -1)-    free (cost_curvature);-#if USER_INITIAL_PARAMETERS_TEMPS-  free (USER_OPTIONS->User_Parameter_Temperature);-#endif-#if USER_INITIAL_COST_TEMP-  free (USER_OPTIONS->User_Cost_Temperature);-#endif-#if DELTA_PARAMETERS-  free (USER_OPTIONS->User_Delta_Parameter);-#endif-#if QUENCH_PARAMETERS-  free (USER_OPTIONS->User_Quench_Param_Scale);-#endif-#if QUENCH_COST-  free (USER_OPTIONS->User_Quench_Cost_Scale);-#endif-#if RATIO_TEMPERATURE_SCALES-  free (USER_OPTIONS->User_Temperature_Ratio);-#endif-#if MULTI_MIN-  free (USER_OPTIONS->Multi_Grid);-  for (multi_index = 0; multi_index < USER_OPTIONS->Multi_Number;-       ++multi_index) {-    free (USER_OPTIONS->Multi_Params[multi_index]);-  }-#endif /* MULTI_MIN */-#if OPTIONAL_DATA_PTR-  if (data_ptr_flg == 0) {-    USER_OPTIONS = NULL;-  }-#endif-  free (USER_OPTIONS);-  free (parameter_dimension);-  free (exit_code);-  free (cost_flag);-  free (parameter_lower_bound);-  free (parameter_upper_bound);-  free (cost_parameters);-  free (parameter_int_real);-  free (cost_tangents);-  free (rand_seed);--  return ((double) funevals);-}--#if USER_COST_SCHEDULE-#if HAVE_ANSI-double-recur_user_cost_schedule (double test_temperature,-                          USER_DEFINES * RECUR_USER_OPTIONS)-#else-double-recur_user_cost_schedule (test_temperature, RECUR_USER_OPTIONS)-     double test_temperature;-     USER_DEFINES *RECUR_USER_OPTIONS;-#endif /* HAVE_ANSI */-{-#if ASA_TEMPLATE-  double x;--  x = test_temperature;--  return (x);-#endif-}-#endif /* USER_COST_SCHEDULE */--#if USER_ACCEPTANCE_TEST-#if HAVE_ANSI-void-recur_user_acceptance_test (double current_cost,-                            double *recur_parameter_lower_bound,-                            double *recur_parameter_upper_bound,-                            ALLOC_INT * recur_parameter_dimension,-                            USER_DEFINES * RECUR_USER_OPTIONS)-#else-void-recur_user_acceptance_test (current_cost, recur_parameter_lower_bound,-                            recur_parameter_upper_bound,-                            recur_parameter_dimension, RECUR_USER_OPTIONS)-     double current_cost;-     double *recur_parameter_lower_bound;-     double *recur_parameter_upper_bound;-     ALLOC_INT *recur_parameter_dimension;-     USER_DEFINES *RECUR_USER_OPTIONS;-#endif /* HAVE_ANSI */-{-  double uniform_test, curr_cost_temp;-#if USER_ACCEPT_ASYMP_EXP-  double x, q, delta_cost;-#endif--#if ASA_TEMPLATE                /* ASA cost index */-  /* Calculate the current ASA cost index.  This could be useful-     to define a new schedule for the cost temperature, beyond-     simple changes that can be made using USER_COST_SCHEDULE. */--  int index;-  double k_temperature, quench, y;-  double xrecur_parameter_dimension;--#if QUENCH_COST-  quench = RECUR_USER_OPTIONS->User_Quench_Cost_Scale[0];-#else-  quench = 1.0;-#endif /* QUENCH_COST */-  xrecur_parameter_dimension = (double) *recur_parameter_dimension;-  for (index = 0; index < *recur_parameter_dimension; ++index)-    if (fabs-        (recur_parameter_upper_bound[index] --         recur_parameter_lower_bound[index]) < (double) EPS_DOUBLE)-      *xrecur_parameter_dimension -= 1.0;--  y = -F_LOG (RECUR_USER_OPTIONS->Cost_Temp_Curr-              / RECUR_USER_OPTIONS->Cost_Temp_Init)-    / RECUR_USER_OPTIONS->Cost_Temp_Scale;--  k_temperature = F_POW (y, xrecur_parameter_dimension / quench);-#endif /* ASA cost index */--  uniform_test = randflt (RECUR_USER_OPTIONS->Random_Seed);-  curr_cost_temp = RECUR_USER_OPTIONS->Cost_Temp_Curr;--#if ASA_TEMPLATE-#if USER_COST_SCHEDULE-  curr_cost_temp =-    (RECUR_USER_OPTIONS->Cost_Schedule (RECUR_USER_OPTIONS->Cost_Temp_Curr,-                                        RECUR_USER_OPTIONS)-     + (double) EPS_DOUBLE);-#else-  curr_cost_temp = RECUR_USER_OPTIONS->Cost_Temp_Curr;-#endif-#endif /* ASA_TEMPLATE */--#if USER_ACCEPT_ASYMP_EXP-#if USER_COST_SCHEDULE-  curr_cost_temp =-    (RECUR_USER_OPTIONS->Cost_Schedule (RECUR_USER_OPTIONS->Cost_Temp_Curr,-                                        RECUR_USER_OPTIONS)-     + (double) EPS_DOUBLE);-#endif--  delta_cost = (current_cost - *(RECUR_USER_OPTIONS->Last_Cost))-    / (curr_cost_temp + (double) EPS_DOUBLE);--  q = RECUR_USER_OPTIONS->Asymp_Exp_Param;-  if (fabs (1.0 - q) < (double) EPS_DOUBLE)-    x = MIN (1.0, (F_EXP (-delta_cost)));       /* Boltzmann test */-  else if ((1.0 - (1.0 - q) * delta_cost) < (double) EPS_DOUBLE)-    x = MIN (1.0, (F_EXP (-delta_cost)));       /* Boltzmann test */-  else-    x = MIN (1.0, F_POW ((1.0 - (1.0 - q) * delta_cost), (1.0 / (1.0 - q))));--  RECUR_USER_OPTIONS->Prob_Bias = x;-  if (x >= uniform_test)-    RECUR_USER_OPTIONS->User_Acceptance_Flag = TRUE;-  else-    RECUR_USER_OPTIONS->User_Acceptance_Flag = FALSE;--#endif /* USER_ACCEPT_ASYMP_EXP */-}-#endif /* USER_ACCEPTANCE_TEST */--#if USER_GENERATING_FUNCTION-#if HAVE_ANSI-double-recur_user_generating_distrib (LONG_INT * seed,-                               ALLOC_INT * recur_parameter_dimension,-                               ALLOC_INT index_v,-                               double temperature_v,-                               double init_param_temp_v,-                               double temp_scale_params_v,-                               double parameter_v,-                               double parameter_range_v,-                               double *last_saved_parameter,-                               USER_DEFINES * RECUR_USER_OPTIONS)-#else-double-recur_user_generating_distrib (seed,-                               recur_parameter_dimension,-                               index_v,-                               temperature_v,-                               init_param_temp_v,-                               temp_scale_params_v,-                               parameter_v,-                               parameter_range_v,-                               last_saved_parameter, RECUR_USER_OPTIONS)-     LONG_INT *seed;-     ALLOC_INT *recur_parameter_dimension;-     ALLOC_INT index_v;-     double temperature_v;-     double init_param_temp_v;-     double temp_scale_params_v;-     double parameter_v;-     double parameter_range_v;-     double *last_saved_parameter;-     USER_DEFINES *RECUR_USER_OPTIONS;-#endif-{-#if ASA_TEMPLATE-  double x, y, z;--  /* This is the ASA distribution.  A slower temperature schedule can be-     obtained here, e.g., temperature_v = pow(temperature_v, 0.5); */--  x = randflt (seed);-  y = x < 0.5 ? -1.0 : 1.0;-  z = y * temperature_v * (F_POW ((1.0 + 1.0 / temperature_v),-                                  fabs (2.0 * x - 1.0)) - 1.0);--  x = parameter_v + z * parameter_range_v;--  return (x);-#endif /* ASA_TEMPLATE */-}-#endif /* USER_GENERATING_FUNCTION */--#if USER_REANNEAL_COST-#if HAVE_ANSI-int-recur_user_reanneal_cost (double *cost_best,-                          double *cost_last,-                          double *initial_cost_temperature,-                          double *current_cost_temperature,-                          USER_DEFINES * RECUR_USER_OPTIONS)-#else-int-recur_user_reanneal_cost (cost_best,-                          cost_last,-                          initial_cost_temperature,-                          current_cost_temperature, RECUR_USER_OPTIONS)-     double *cost_best;-     double *cost_last;-     double *initial_cost_temperature;-     double *current_cost_temperature;-     USER_DEFINES *RECUR_USER_OPTIONS;-#endif /* HAVE_ANSI */-{-#if ASA_TEMPLATE-  double tmp_dbl;--  tmp_dbl = MAX (fabs (*cost_last), fabs (*cost_best));-  tmp_dbl = MAX ((double) EPS_DOUBLE, tmp_dbl);-  *initial_cost_temperature = MIN (*initial_cost_temperature, tmp_dbl);--  return (TRUE);-#endif-}-#endif /* USER_REANNEAL_COST */--#if USER_REANNEAL_PARAMETERS-#if HAVE_ANSI-double-recur_user_reanneal_params (double current_temp,-                            double tangent,-                            double max_tangent,-                            USER_DEFINES * RECUR_USER_OPTIONS)-#else-double-recur_user_reanneal_params (current_temp,-                            tangent, max_tangent, RECUR_USER_OPTIONS)-     double current_temp;-     double tangent;-     double max_tangent;-     USER_DEFINES *RECUR_USER_OPTIONS;-#endif /* HAVE_ANSI */-{-#if ASA_TEMPLATE-  double x;--  x = current_temp * (max_tangent / tangent);--  return (x);-#endif-}-#endif /* USER_REANNEAL_PARAMETERS */-#endif /* SELF_OPTIMIZE */--#if FITLOC-#if HAVE_ANSI-double-calcf (double (*user_cost_function)--        -       (double *, double *, double *, double *, double *, ALLOC_INT *, int *,-        int *, int *, USER_DEFINES *), double *xloc,-       double *parameter_lower_bound, double *parameter_upper_bound,-       double *cost_tangents, double *cost_curvature,-       ALLOC_INT * parameter_dimension, int *parameter_int_real,-       int *cost_flag, int *exit_code, USER_DEFINES * OPTIONS, FILE * ptr_out)-#else-double-calcf (user_cost_function,-       xloc,-       parameter_lower_bound,-       parameter_upper_bound,-       cost_tangents,-       cost_curvature,-       parameter_dimension,-       parameter_int_real, cost_flag, exit_code, OPTIONS, ptr_out)-     double (*user_cost_function) ();-     double *x;-     double *parameter_lower_bound;-     double *parameter_upper_bound;-     double *cost_tangents;-     double *cost_curvature;-     ALLOC_INT *parameter_dimension;-     int *parameter_int_real;-     int *cost_flag;-     int *exit_code;-     USER_DEFINES *OPTIONS;-     FILE *ptr_out;-#endif-{-  ALLOC_INT index_v;-#if FITLOC_ROUND-  double x, min_parameter_v, max_parameter_v, parameter_range_v;-#endif-  double floc;-#if ASA_RESOLUTION-  double xres, xint, xplus, xminus, dx, dxminus, dxplus;-#endif--#if FITLOC_ROUND-  /* The following section for adjustments of parameters is taken from-     generate_new_state() in asa.c */-  for (index_v = 0; index_v < *parameter_dimension; ++index_v) {-    if (fabs-        (parameter_lower_bound[index_v] - parameter_upper_bound[index_v]) <-        EPS_DOUBLE)-      continue;--    x = xloc[index_v];--    min_parameter_v = parameter_lower_bound[index_v];-    max_parameter_v = parameter_upper_bound[index_v];-    parameter_range_v = max_parameter_v - min_parameter_v;--    /* Handle discrete parameters. */-#if ASA_RESOLUTION-    xres = OPTIONS->Coarse_Resolution[index_v];-    if (xres > EPS_DOUBLE) {-      min_parameter_v -= (xres / 2.0);-      max_parameter_v += (xres / 2.0);-      parameter_range_v = max_parameter_v - min_parameter_v;-    }-#endif /* ASA_RESOLUTION */-    if (parameter_int_real[index_v] > 0) {-#if ASA_RESOLUTION-      if (xres > EPS_DOUBLE) {-        ;-      } else {-#endif /* ASA_RESOLUTION */-        min_parameter_v -= 0.5;-        max_parameter_v += 0.5;-        parameter_range_v = max_parameter_v - min_parameter_v;-      }-#if ASA_RESOLUTION-    }-#endif-#if ASA_RESOLUTION-    if (xres > EPS_DOUBLE) {-      xint = xres * (double) ((LONG_INT) (x / xres));-      xplus = xint + xres;-      xminus = xint - xres;-      dx = fabs (xint - x);-      dxminus = fabs (xminus - x);-      dxplus = fabs (xplus - x);--      if (dx < dxminus && dx < dxplus)-        x = xint;-      else if (dxminus < dxplus)-        x = xminus;-      else-        x = xplus;-    }-#endif /* ASA_RESOLUTION */--    /* Handle discrete parameters.-       You might have to check rounding on your machine. */-    if (parameter_int_real[index_v] > 0) {-#if ASA_RESOLUTION-      if (xres > EPS_DOUBLE) {-        ;-      } else {-#endif /* ASA_RESOLUTION */-        if (x < min_parameter_v + 0.5)-          x = min_parameter_v + 0.5 + (double) EPS_DOUBLE;-        if (x > max_parameter_v - 0.5)-          x = max_parameter_v - 0.5 + (double) EPS_DOUBLE;--        if (x + 0.5 > 0.0) {-          x = (double) ((LONG_INT) (x + 0.5));-        } else {-          x = (double) ((LONG_INT) (x - 0.5));-        }-        if (x > parameter_upper_bound[index_v])-          x = parameter_upper_bound[index_v];-        if (x < parameter_lower_bound[index_v])-          x = parameter_lower_bound[index_v];-      }-#if ASA_RESOLUTION-    }-    if (xres > EPS_DOUBLE) {-      if (x < min_parameter_v + xres / 2.0)-        x = min_parameter_v + xres / 2.0 + (double) EPS_DOUBLE;-      if (x > max_parameter_v - xres / 2.0)-        x = max_parameter_v - xres / 2.0 + (double) EPS_DOUBLE;--      if (x > parameter_upper_bound[index_v])-        x = parameter_upper_bound[index_v];-      if (x < parameter_lower_bound[index_v])-        x = parameter_lower_bound[index_v];-    }-#endif /* ASA_RESOLUTION */-    if ((x < parameter_lower_bound[index_v])-        || (x > parameter_upper_bound[index_v])) {-      ;-    } else {-      xloc[index_v] = x;-    }-  }-#endif /* FITLOC_ROUND */--  floc = user_cost_function (xloc,-                             parameter_lower_bound,-                             parameter_upper_bound,-                             cost_tangents,-                             cost_curvature,-                             parameter_dimension,-                             parameter_int_real,-                             cost_flag, exit_code, OPTIONS);--  if (*cost_flag == FALSE) {-    floc += OPTIONS->Penalty;-  }--  for (index_v = 0; index_v < *parameter_dimension; ++index_v) {-    if (parameter_upper_bound[index_v] - xloc[index_v] < EPS_DOUBLE)-      floc += OPTIONS->Penalty;-    else if (xloc[index_v] - parameter_lower_bound[index_v] < EPS_DOUBLE)-      floc += OPTIONS->Penalty;-  }--  return (floc);-}--#if HAVE_ANSI-double-fitloc (double (*user_cost_function)--         -        (double *, double *, double *, double *, double *, ALLOC_INT *, int *,-         int *, int *, USER_DEFINES *), double *xloc,-        double *parameter_lower_bound, double *parameter_upper_bound,-        double *cost_tangents, double *cost_curvature,-        ALLOC_INT * parameter_dimension, int *parameter_int_real,-        int *cost_flag, int *exit_code, USER_DEFINES * OPTIONS,-        FILE * ptr_out)-#else-double-fitloc (user_cost_function,-        xloc,-        parameter_lower_bound,-        parameter_upper_bound,-        cost_tangents,-        cost_curvature,-        parameter_dimension,-        parameter_int_real, cost_flag, exit_code, OPTIONS, ptr_out)-     double (*user_cost_function) ();-     double *xloc;-     double *parameter_lower_bound;-     double *parameter_upper_bound;-     double *cost_tangents;-     double *cost_curvature;-     ALLOC_INT *parameter_dimension;-     int *parameter_int_real;-     int *cost_flag;-     int *exit_code;-     USER_DEFINES *OPTIONS;-     FILE *ptr_out;-#endif-{-  double x;-  ALLOC_INT index_v;-#if FITLOC_ROUND-  double min_parameter_v, max_parameter_v, parameter_range_v;-#endif-  double *xsave;-  double tol1, tol2, alpha, beta1, beta2, gamma, delta, floc, fsave, ffinal;-  int no_progress, tot_iters, locflg, bndflg;-#if ASA_RESOLUTION-  double xres, xint, xminus, xplus, dx, dxminus, dxplus;-#endif--#if FITLOC_PRINT-  if (OPTIONS->Fit_Local >= 1) {-    fprintf (ptr_out, "\n\nSTART LOCAL FIT\n");-  } else {-    fprintf (ptr_out, "\n\nSTART LOCAL FIT Independent of ASA\n");-  }-  fflush (ptr_out);-#endif /* FITLOC_PRINT */--  xsave = (double *) calloc (*parameter_dimension, sizeof (double));-  bndflg = 0;--  /* The following simplex parameters may need adjustments for your system. */-  tol1 = EPS_DOUBLE;-  tol2 = EPS_DOUBLE * 100.;-  no_progress = 4;-  alpha = 1.0;-  beta1 = 0.75;-  beta2 = 0.75;-  gamma = 1.25;-  delta = 2.50;--  for (index_v = 0; index_v < *parameter_dimension; ++index_v) {-    xsave[index_v] = xloc[index_v];-  }--  fsave = user_cost_function (xloc,-                              parameter_lower_bound,-                              parameter_upper_bound,-                              cost_tangents,-                              cost_curvature,-                              parameter_dimension,-                              parameter_int_real,-                              cost_flag, exit_code, OPTIONS);--  tot_iters = simplex (user_cost_function,-                       xloc,-                       parameter_lower_bound,-                       parameter_upper_bound,-                       cost_tangents,-                       cost_curvature,-                       parameter_dimension,-                       parameter_int_real,-                       cost_flag,-                       exit_code,-                       OPTIONS,-                       ptr_out,-                       tol1,-                       tol2, no_progress, alpha, beta1, beta2, gamma, delta);-  fflush (ptr_out);--  for (index_v = 0; index_v < *parameter_dimension; ++index_v) {-    x = xloc[index_v];-    if ((x < parameter_lower_bound[index_v])-        || (x > parameter_upper_bound[index_v])) {-      bndflg = 1;-    }-  }--  /* The following section for adjustments of parameters is taken from-     generate_new_state() in asa.c */-#if FITLOC_ROUND-  for (index_v = 0; index_v < *parameter_dimension; ++index_v) {-    if (fabs-        (parameter_lower_bound[index_v] - parameter_upper_bound[index_v]) <-        EPS_DOUBLE)-      continue;--    x = xloc[index_v];--    min_parameter_v = parameter_lower_bound[index_v];-    max_parameter_v = parameter_upper_bound[index_v];-    parameter_range_v = max_parameter_v - min_parameter_v;--    /* Handle discrete parameters. */-#if ASA_RESOLUTION-    xres = OPTIONS->Coarse_Resolution[index_v];-    if (xres > EPS_DOUBLE) {-      min_parameter_v -= (xres / 2.0);-      max_parameter_v += (xres / 2.0);-      parameter_range_v = max_parameter_v - min_parameter_v;-    }-#endif /* ASA_RESOLUTION */-    if (parameter_int_real[index_v] > 0) {-#if ASA_RESOLUTION-      if (xres > EPS_DOUBLE) {-        ;-      } else {-#endif /* ASA_RESOLUTION */-        min_parameter_v -= 0.5;-        max_parameter_v += 0.5;-        parameter_range_v = max_parameter_v - min_parameter_v;-      }-#if ASA_RESOLUTION-    }-#endif-#if ASA_RESOLUTION-    if (xres > EPS_DOUBLE) {-      xint = xres * (double) ((LONG_INT) (x / xres));-      xplus = xint + xres;-      xminus = xint - xres;-      dx = fabs (xint - x);-      dxminus = fabs (xminus - x);-      dxplus = fabs (xplus - x);--      if (dx < dxminus && dx < dxplus)-        x = xint;-      else if (dxminus < dxplus)-        x = xminus;-      else-        x = xplus;-    }-#endif /* ASA_RESOLUTION */--    /* Handle discrete parameters.-       You might have to check rounding on your machine. */-    if (parameter_int_real[index_v] > 0) {-#if ASA_RESOLUTION-      if (xres > EPS_DOUBLE) {-        ;-      } else {-#endif /* ASA_RESOLUTION */-        if (x < min_parameter_v + 0.5)-          x = min_parameter_v + 0.5 + (double) EPS_DOUBLE;-        if (x > max_parameter_v - 0.5)-          x = max_parameter_v - 0.5 + (double) EPS_DOUBLE;--        if (x + 0.5 > 0.0) {-          x = (double) ((LONG_INT) (x + 0.5));-        } else {-          x = (double) ((LONG_INT) (x - 0.5));-        }-        if (x > parameter_upper_bound[index_v])-          x = parameter_upper_bound[index_v];-        if (x < parameter_lower_bound[index_v])-          x = parameter_lower_bound[index_v];-      }-#if ASA_RESOLUTION-    }-    if (xres > EPS_DOUBLE) {-      if (x < min_parameter_v + xres / 2.0)-        x = min_parameter_v + xres / 2.0 + (double) EPS_DOUBLE;-      if (x > max_parameter_v - xres / 2.0)-        x = max_parameter_v - xres / 2.0 + (double) EPS_DOUBLE;--      if (x > parameter_upper_bound[index_v])-        x = parameter_upper_bound[index_v];-      if (x < parameter_lower_bound[index_v])-        x = parameter_lower_bound[index_v];-    }-#endif /* ASA_RESOLUTION */-    if ((x < parameter_lower_bound[index_v])-        || (x > parameter_upper_bound[index_v])) {-      bndflg = 1;-#if FITLOC_PRINT-      if (OPTIONS->Fit_Local == 2)-        fprintf (ptr_out, "IGNORE FITLOC: OUT OF BOUNDS xloc[%ld] = %g\n",-                 index_v, xloc[index_v]);-      else-        fprintf (ptr_out, "OUT OF BOUNDS xloc[%ld] = %g\n",-                 index_v, xloc[index_v]);-#else-      ;-#endif /* FITLOC_PRINT */-    } else {-      xloc[index_v] = x;-    }-  }-#endif /* FITLOC_ROUND */--  floc = user_cost_function (xloc,-                             parameter_lower_bound,-                             parameter_upper_bound,-                             cost_tangents,-                             cost_curvature,-                             parameter_dimension,-                             parameter_int_real,-                             cost_flag, exit_code, OPTIONS);--  if (fabs (floc - fsave) < (double) EPS_DOUBLE) {-    locflg = 1;-    ffinal = fsave;-#if FITLOC_PRINT-    fprintf (ptr_out, "\nsame global cost = %g\tlocal cost = %g\n\n",-             fsave, floc);-#endif /* FITLOC_PRINT */-  } else {-    if (floc < fsave) {-      if (OPTIONS->Fit_Local == 2 && bndflg == 1) {-        locflg = 1;-        ffinal = fsave;-      } else {-        locflg = 0;-        ffinal = floc;-      }-    } else {-      locflg = 1;-      ffinal = fsave;-    }-#if FITLOC_PRINT-    fprintf (ptr_out, "\nDIFF global cost = %g\tlocal cost = %g\n\n",-             fsave, floc);-#endif /* FITLOC_PRINT */-  }--  for (index_v = 0; index_v < *parameter_dimension; ++index_v) {-    if (fabs (xloc[index_v] - xsave[index_v]) < (double) EPS_DOUBLE) {-#if FITLOC_PRINT-      fprintf (ptr_out, "same global param[%ld] = %g\tlocal param = %g\n",-               index_v, xsave[index_v], xloc[index_v]);-#else-      ;-#endif /* FITLOC_PRINT */-    } else {-#if FITLOC_PRINT-      fprintf (ptr_out, "DIFF global param[%ld] = %g\tlocal param = %g\n",-               index_v, xsave[index_v], xloc[index_v]);-#else-      ;-#endif /* FITLOC_PRINT */-      if (locflg == 1) {-        xloc[index_v] = xsave[index_v];-      }-    }-  }--#if FITLOC_PRINT-  fprintf (ptr_out, "\n");-  fflush (ptr_out);-#endif /* FITLOC_PRINT */--  free (xsave);--  return (ffinal);-}--/*-   Written by Mark Johnson <mjohnson@netcom.com>, based on --   %A J.A. Nelder-   %A R. Mead-   %T A simplex method for function minimization-   %J Computer J. (UK)-   %V 7-   %D 1964-   %P 308-313--   with improvements from--   %A G.P. Barabino-   %A G.S. Barabino-   %A B. Bianco-   %A M. Marchesi-   %T A study on the performances of simplex methods for function minimization-   %B Proc. IEEE Int. Conf. Circuits and Computers-   %D 1980-   %P 1150-1153--   adapted for use in ASA by Lester Ingber <ingber@ingber.com>- */--#if HAVE_ANSI-int-simplex (double (*user_cost_function)--          -         (double *, double *, double *, double *, double *, ALLOC_INT *,-          int *, int *, int *, USER_DEFINES *), double *x,-         double *parameter_lower_bound, double *parameter_upper_bound,-         double *cost_tangents, double *cost_curvature,-         ALLOC_INT * parameter_dimension, int *parameter_int_real,-         int *cost_flag, int *exit_code, USER_DEFINES * OPTIONS,-         FILE * ptr_out, double tol1, double tol2, int no_progress,-         double alpha, double beta1, double beta2, double gamma, double delta)-#else-int-simplex (user_cost_function,-         x,-         parameter_lower_bound,-         parameter_upper_bound,-         cost_tangents,-         cost_curvature,-         parameter_dimension,-         parameter_int_real,-         cost_flag,-         exit_code,-         OPTIONS,-         ptr_out, tol1, tol2, no_progress, alpha, beta1, beta2, gamma, delta)-     double (*user_cost_function) ();-     double *x;-     double *parameter_lower_bound;-     double *parameter_upper_bound;-     double *cost_tangents;-     double *cost_curvature;-     ALLOC_INT *parameter_dimension;-     int *parameter_int_real;-     int *cost_flag;-     int *exit_code;-     USER_DEFINES *OPTIONS;-     FILE *ptr_out;-     double tol1;-     double tol2;-     int no_progress;-     double alpha;-     double beta1;-     double beta2;-     double gamma;-     double delta;-#endif-{-  double fs, fl, fh, fr, fe, fc1, fc2, ftmp, flast;-  double err1;-  double *fvals;-  double **splx;                /* the simplex of points */-  double *x0;                   /* centroid of simplex */-  double *xr;                   /* point for a reflection */-  double *xe;                   /* point for an expansion */-  double *xc1;                  /* point for a minor contraction */-  double *xc2;                  /* point for a major contraction */-  int s, l, h;-  int i, j, iters, futility;-  int lastprint;--  fvals = (double *) calloc (*parameter_dimension + 1, sizeof (double));-  splx = (double **) calloc (*parameter_dimension + 1, sizeof (double *));-  for (i = 0; i <= *parameter_dimension; i++)-    splx[i] = (double *) calloc (*parameter_dimension, sizeof (double));-  x0 = (double *) calloc (*parameter_dimension, sizeof (double));-  xr = (double *) calloc (*parameter_dimension, sizeof (double));-  xe = (double *) calloc (*parameter_dimension, sizeof (double));-  xc1 = (double *) calloc (*parameter_dimension, sizeof (double));-  xc2 = (double *) calloc (*parameter_dimension, sizeof (double));--  /* build the initial simplex */-  for (i = 0; i < *parameter_dimension; i++) {-    splx[0][i] = x[i];-  }-  for (i = 1; i <= *parameter_dimension; i++) {-    for (j = 0; j < *parameter_dimension; j++) {-      if ((j + 1) == i)-        splx[i][j] = (x[j] * 2.25) + tol2;-      else-        splx[i][j] = x[j];-      xr[j] = splx[i][j];-    }-    fvals[i] = calcf (user_cost_function,-                      xr,-                      parameter_lower_bound,-                      parameter_upper_bound,-                      cost_tangents,-                      cost_curvature,-                      parameter_dimension,-                      parameter_int_real,-                      cost_flag, exit_code, OPTIONS, ptr_out);-  }--  /* and of course compute function at starting point */-  fvals[0] = calcf (user_cost_function,-                    x,-                    parameter_lower_bound,-                    parameter_upper_bound,-                    cost_tangents,-                    cost_curvature,-                    parameter_dimension,-                    parameter_int_real,-                    cost_flag, exit_code, OPTIONS, ptr_out);--  /* now find the largest, 2nd largest, smallest f values */-  if (fvals[0] > fvals[1]) {-    h = 0;-    s = 1;-    l = 1;-  } else {-    h = 1;-    s = 0;-    l = 0;-  }-  fh = fvals[h];-  fs = fvals[s];-  fl = fvals[l];-  for (i = 2; i <= *parameter_dimension; i++) {-    if (fvals[i] <= fvals[l]) {-      l = i;-      fl = fvals[i];-    } else {-      if (fvals[i] >= fvals[h]) {-        s = h;-        fs = fh;-        h = i;-        fh = fvals[i];-      } else if (fvals[i] >= fvals[s]) {-        s = i;-        fs = fvals[i];-      }-    }-  }-#if FITLOC_PRINT-  if ((s == h) || (s == l) || (h == l))-    fprintf (ptr_out, "\nPANIC: s,l,h not unique %d %d %d\n", s, h, l);--  fprintf (ptr_out, "INITIAL SIMPLEX:\n");-  for (i = 0; i <= *parameter_dimension; i++) {-    for (j = 0; j < *parameter_dimension; j++) {-      fprintf (ptr_out, "   %11.4g", splx[i][j]);-    }-    fprintf (ptr_out, "      f = %12.5g", fvals[i]);-    if (i == h)-      fprintf (ptr_out, "  HIGHEST");-    if (i == s)-      fprintf (ptr_out, "  SECOND HIGHEST");-    if (i == l)-      fprintf (ptr_out, "  LOWEST");-    fprintf (ptr_out, "\n");-  }-#endif /* FITLOC_PRINT */--/* MAJOR LOOP */--  flast = fl;-  futility = 0;-  lastprint = 0;-  iters = 0;-  err1 = 1.1 + (1.1 * tol1);-  while ((err1 > tol1) && (iters < OPTIONS->Iter_Max) &&-         (futility < (*parameter_dimension * no_progress))) {-    iters++;--    /* now find the largest, 2nd largest, smallest f values */-    if (fvals[0] > fvals[1]) {-      h = 0;-      s = 1;-      l = 1;-    } else {-      h = 1;-      s = 0;-      l = 0;-    }-    fh = fvals[h];-    fs = fvals[s];-    fl = fvals[l];-    for (i = 2; i <= *parameter_dimension; i++) {-      if (fvals[i] <= fvals[l]) {-        l = i;-        fl = fvals[i];-      } else {-        if (fvals[i] >= fvals[h]) {-          s = h;-          fs = fh;-          h = i;-          fh = fvals[i];-        } else if (fvals[i] >= fvals[s]) {-          s = i;-          fs = fvals[i];-        }-      }-    }-#if FITLOC_PRINT-    if ((s == h) || (s == l) || (h == l))-      fprintf (ptr_out, "\nPANIC: s,l,h not unique %d %d %d\n", s, h, l);-#endif--    /* compute the centroid */-    for (j = 0; j < *parameter_dimension; j++) {-      x0[j] = 0.0;-      for (i = 0; i <= *parameter_dimension; i++) {-        if (i != h)-          x0[j] += splx[i][j];-      }-      x0[j] /= ((double) *parameter_dimension);-    }--    if (fl < flast) {-      flast = fl;-      futility = 0;-    } else-      futility += 1;--#if FITLOC_PRINT-    fprintf (ptr_out, "Iteration %3d f(best) = %12.6g halt? = %11.5g\n",-             iters, fl, err1);-    if ((iters - lastprint) >= 100) {-      fprintf (ptr_out, "\n     Best point seen so far:\n");-      for (i = 0; i < *parameter_dimension; i++) {-        fprintf (ptr_out, "     x[%3d] = %15.7g\n", i, splx[l][i]);-      }-      lastprint = iters;-      fprintf (ptr_out, "\n");-    }-    fflush (ptr_out);-#endif /* FITLOC_PRINT */--    /* STEP 1: compute a reflected point xr */-    for (i = 0; i < *parameter_dimension; i++) {-      xr[i] = ((1.0 + alpha) * x0[i]) - (alpha * splx[h][i]);-    }-    fr = calcf (user_cost_function,-                xr,-                parameter_lower_bound,-                parameter_upper_bound,-                cost_tangents,-                cost_curvature,-                parameter_dimension,-                parameter_int_real, cost_flag, exit_code, OPTIONS, ptr_out);--    /* typical outcome: <2nd-biggest , >lowest .  Go again */-    if ((fr < fs) && (fr > fl)) {-      for (i = 0; i < *parameter_dimension; i++) {-        splx[h][i] = xr[i];-      }-      fvals[h] = fr;-      goto more_iterations;-    }--    /* STEP 2: if reflected point is favorable, expand the simplex */-    if (fr < fl) {-      for (i = 0; i < *parameter_dimension; i++) {-        xe[i] = (gamma * xr[i]) + ((1.0 - gamma) * x0[i]);-      }-      fe = calcf (user_cost_function,-                  xe,-                  parameter_lower_bound,-                  parameter_upper_bound,-                  cost_tangents,-                  cost_curvature,-                  parameter_dimension,-                  parameter_int_real, cost_flag, exit_code, OPTIONS, ptr_out);-      if (fe < fr) {            /* win big; expansion point tiny */-        for (i = 0; i < *parameter_dimension; i++) {-          splx[h][i] = xe[i];-        }-        fvals[h] = fh = fe;-      } else-        /* still ok; reflection point a winner */-      {-        for (i = 0; i < *parameter_dimension; i++) {-          splx[h][i] = xr[i];-        }-        fvals[h] = fh = fr;-      }-      goto more_iterations;-    }--    /* STEP 3: if reflected point is unfavorable, contract simplex */-    if (fr > fs) {-      if (fr < fh) {            /* may as well replace highest pt */-        for (i = 0; i < *parameter_dimension; i++) {-          splx[h][i] = xr[i];-        }-        fvals[h] = fh = fr;-      }-      for (i = 0; i < *parameter_dimension; i++) {-        xc1[i] = (beta1 * xr[i]) + ((1.0 - beta1) * x0[i]);-      }-      fc1 = calcf (user_cost_function,-                   xc1,-                   parameter_lower_bound,-                   parameter_upper_bound,-                   cost_tangents,-                   cost_curvature,-                   parameter_dimension,-                   parameter_int_real,-                   cost_flag, exit_code, OPTIONS, ptr_out);-      if (fc1 < fh) {           /* slight contraction worked */-        for (i = 0; i < *parameter_dimension; i++) {-          splx[h][i] = xc1[i];-        }-        fvals[h] = fh = fc1;-        goto more_iterations;-      }-      /* now have to try strong contraction */-      for (i = 0; i < *parameter_dimension; i++) {-        xc2[i] = (beta2 * splx[h][i]) + ((1.0 - beta2) * x0[i]);-      }-      fc2 = calcf (user_cost_function,-                   xc2,-                   parameter_lower_bound,-                   parameter_upper_bound,-                   cost_tangents,-                   cost_curvature,-                   parameter_dimension,-                   parameter_int_real,-                   cost_flag, exit_code, OPTIONS, ptr_out);-      if (fc2 < fh) {           /* strong contraction worked */-        for (i = 0; i < *parameter_dimension; i++) {-          splx[h][i] = xc2[i];-        }-        fvals[h] = fh = fc2;-        goto more_iterations;-      }-    }--    /* STEP 4: nothing worked.  collapse the simplex around xl */-    for (i = 0; i <= *parameter_dimension; i++) {-      if (i != l) {-        for (j = 0; j < *parameter_dimension; j++) {-          splx[i][j] = (splx[i][j] + splx[l][j]) / delta;-          xr[j] = splx[i][j];-        }-        fvals[i] = calcf (user_cost_function,-                          xr,-                          parameter_lower_bound,-                          parameter_upper_bound,-                          cost_tangents,-                          cost_curvature,-                          parameter_dimension,-                          parameter_int_real,-                          cost_flag, exit_code, OPTIONS, ptr_out);-      }-    }--  more_iterations:--    ftmp = 0.00;-    for (i = 0; i <= *parameter_dimension; i++) {-      ftmp += fvals[i];-    }-    ftmp /= ((double) (*parameter_dimension + 1));--    err1 = 0.00;-    for (i = 0; i <= *parameter_dimension; i++) {-      err1 += ((fvals[i] - ftmp) * (fvals[i] - ftmp));-    }-    err1 /= ((double) (*parameter_dimension + 1));-    err1 = sqrt (err1);-  }                             /* end of major while loop */--  /* find the smallest f value */-  l = 0;-  fl = fvals[0];-  for (i = 1; i <= *parameter_dimension; i++) {-    if (fvals[i] < fvals[l])-      l = i;-  }--  /* give it back to the user */-  for (i = 0; i < *parameter_dimension; i++) {-    x[i] = splx[l][i];-  }--  free (fvals);-  for (i = 0; i <= *parameter_dimension; i++)-    free (splx[i]);-  free (splx);-  free (x0);-  free (xr);-  free (xe);-  free (xc1);-  free (xc2);--  return (iters);-}-#else-#endif /* FITLOC */--#if ASA_TEMPLATE_SAMPLE--#if HAVE_ANSI-void-sample (FILE * ptr_out, FILE * ptr_asa)-#else-void-sample (ptr_out, ptr_asa)-     FILE *ptr_out;-     FILE *ptr_asa;-#endif-{-  int ind, n_samples, n_accept, index, dim;-  double cost, cost_temp, bias_accept;-  double param, temp, bias_gener, aver_weight, range;-  double sum, norm, answer, prod, binsize;-  char ch[80], sample[8];--  /*-     This is a demonstration of using ASA_SAMPLE to perform the double integral-     of exp(-x^2 - y^2) for x and y between 0 and 2.  The mesh is quite crude.--     The temperature-dependent acceptance and generated biases factor are-     divided out, and the actual cost function weights each point.-   */--  dim = 2;-  norm = sum = 0.;-  n_samples = 0;--  fprintf (ptr_out,-           ":SAMPLE:   n_accept   cost        cost_temp    bias_accept    \- aver_weight\n");-  fprintf (ptr_out,-           ":SAMPLE:   index      param[]     temp[]       bias_gener[]   \- range[]\n");-  for (;;) {-    fscanf (ptr_asa, "%s", ch);-    if (!strcmp (ch, "exit_status")) {-      break;-    }-    if (strcmp (ch, ":SAMPLE#")) {-      continue;-    }-    ++n_samples;-    fprintf (ptr_out, "%s\n", ch);-    fflush (ptr_out);-    fscanf (ptr_asa, "%s%d%lf%lf%lf%lf",-            sample, &n_accept, &cost, &cost_temp, &bias_accept, &aver_weight);-    if (strcmp (sample, ":SAMPLE+")) {-      fprintf (ptr_out, "%s %11d %12.7g %12.7g %12.7g %12.7g\n",-               sample, n_accept, cost, cost_temp, bias_accept, aver_weight);-    } else {-      fprintf (ptr_out, "%s %10d %12.7g %12.7g %12.7g %12.7g\n",-               sample, n_accept, cost, cost_temp, bias_accept, aver_weight);-    }-    prod = bias_accept;-    binsize = 1.0;-    for (ind = 0; ind < dim; ++ind) {-      fscanf (ptr_asa, "%s%d%lf%lf%lf%lf",-              sample, &index, &param, &temp, &bias_gener, &range);-      fprintf (ptr_out, "%s %11d %12.7g %12.7g %12.7g %12.7g\n",-               sample, index, param, temp, bias_gener, range);-      prod *= bias_gener;-      binsize *= range;-    }-    /* In this example, retrieve integrand from sampling function */-    sum += ((F_EXP (-cost) * binsize) / prod);-    norm += (binsize / prod);-  }-  sum /= norm;--  answer = 1.0;-  for (ind = 0; ind < dim; ++ind) {-    answer *= (0.5 * sqrt (3.14159265) * erf (2.0));-  }--  fprintf (ptr_out, "\n");-  fprintf (ptr_out, "sum = %12.7g, answer = %12.7g\n", sum, answer);-  fprintf (ptr_out, "n_samples = %d, norm = %12.7g\n", n_samples, norm);-  fflush (ptr_out);--}-#endif /* ASA_TEMPLATE_SAMPLE */-#if ASA_TEMPLATE_LIB-int-main ()-{-  double main_cost_value;-  double *main_cost_parameters;-  int main_exit_code;-  LONG_INT number_params;-  ALLOC_INT n_param;-  FILE *ptr_main;--#if INCL_STDOUT-  ptr_main = stdout;-#endif /* INCL_STDOUT */--  /* Note this assumes the *parameter_dimension = 4 */-  number_params = 4;--  if ((main_cost_parameters =-       (double *) calloc (number_params, sizeof (double))) == NULL) {-    strcpy (user_exit_msg, "ASA_TEMPLATE_LIB main(): main_cost_parameters");-    Exit_USER (user_exit_msg);-    return (-2);-  }--  asa_seed (696969);            /* This is the default random seed. */-  asa_main (&main_cost_value, main_cost_parameters, &main_exit_code);--  fprintf (ptr_main, "main_exit_code = %d\n", main_exit_code);-  fprintf (ptr_main, "main_cost_value = %12.7g\n", main_cost_value);-  fprintf (ptr_main, "parameter\tvalue\n");-  for (n_param = 0; n_param < number_params; ++n_param) {-    fprintf (ptr_main,-#if INT_ALLOC-             "%d\t\t%12.7g\n",-#else-#if INT_LONG-             "%ld\t\t%12.7g\n",-#else-             "%d\t\t%12.7g\n",-#endif-#endif-             n_param, main_cost_parameters[n_param]);-  }--  free (main_cost_parameters);--  return (0);-/* NOTREACHED */-}-#endif /* ASA_TEMPLATE_LIB */--void-Exit_USER (char *statement)-{-#if INCL_STDOUT-  printf ("\n\n*** EXIT calloc failed *** %s\n\n", statement);-#else-  ;-#endif /* INCL_STDOUT */-}