Bonjour,
J'ai un programme en C et un autre en C++ que j'essaye d'exécuter en utilisant la version académique de OxEdit. Je suis un novice dans ces langages et je n'ai pas bien compris l'aide de OxMetrics.
Mon problème est le suivant: quand j'ouvre un code C ou C++ dans OxEdit, l'onglet run (représenté par un individu qui cours) est inactif. J'ai tenté de remplacer l'extension du programme (prg.c par prg.ox) et de l'exécuter. Voici le message d'erreur qui s'affiche ""Link error: 'main' undefined function"" indiquant si j'ai bien compris qu'il ne trouve pas le "main" du code ce qui est le cas.
Comment dois je faire pour compiler et exécuter des codes c , c++ et même certains *.ox sous oxedit sans qu'ils ne me revoit cette erreur?
Merci d'avance
Voici un exemple de code SV96A.OX qui pose le même problème
/* (C)(1996-98) Neil Shephard, Nuffield College, Oxford University, OX1 1NF, UK
Revised 1998 to use SsfPack 2.0.
Thanks go to Jurgen Doornik and Siem Jan Koopman for a great deal
of help on computational issues over a long period of time. Also
to Mike Pitt for allowing me to use his arms port of the Gilks
algorithm.
*/
/* Functions which implement MCMC type methods on SV model.
Diagnostic_Sim() --- filtering for the SV model.
--- Suggested by Pitt & Shephard(97). CODE NOT GENERALIZABLE
Integrate_SV_Many() --- offset mixture integration sampler of Kim, Shephard & Chib(96).
--- Includes resampling probabilities. CODE GENERALIZABLE in
--- many directions (heavy tails, dynamics, etc).
Gibbs_SV_Many() --- single move Gibbs sampler. Discussed in Shephard & Pitt(95)
--- and Kim, Shephard & Chib(96). CODE NOT VERY GENERALIZABLE
--- as dynamics can only be AR(1).
Mix_SV_Many() --- Offset mixture sampler without integration. Suggested by
--- Kim, Shephard & Chib(96). They prefer Integrate_SV_Many().
--- CODE GENERALIZABLE in many directions.
*/
#include <oxstd.h>
#include <oxfloat.h>
#include <maximize.h>
#import <database>
#include <oxdraw.h>
#include "mcmc_sv.h" // header for sv.dll
#include "arms.h" // header for arms.dll
#include <packages/ssfpack/ssfpack.h> // header for ssfpack.dll
decl g_random;
#include "mixsub.ox" // various mixture approximations
#include "arch.ox" // arch likelihood
#include "mcmc_dia.ox" // filtering, etc
Diagnostics_Sim(const n_rep, const vY, const phi1, const beta_const1, const q1)
{
decl i,n = columns(vY);
decl phi = phi1;
decl q = q1;
decl beta_const = beta_const1;
decl filter_sim = beta_const + sqrt(q/ (1.0 - (phi*phi))) * rann(1,n_rep);
decl filtered_signal = new matrix[2][n];
decl filter_fore = new matrix[2][n];;
decl prob_filter = new matrix[1][n];
decl smoothed_signal = zeros(1,n);
decl var_SV,den;
decl dens_filter = new matrix[1][n];
decl noise;
for (i=0; i<n; i++)
{ noise = (sqrt(q) * rann(1,n_rep));
filter_fore[0][] = beta_const + (phi * (-beta_const + filter_sim)) + noise;
filter_fore[1][] = beta_const + (phi * (-beta_const + filter_sim)) - noise;
filtered_signal[1][i] = meanr(exp(0.5*filter_fore[0][]));
var_SV = exp(filter_fore);
prob_filter[0][i] = meanr(probchi(vY[0][i]*vY[0][i]./var_SV[0][],1));
den = exp(-(0.5 * vY[0][i]*vY[0][i]) ./ var_SV) ./ sqrt(var_SV);
dens_filter[0][i] = 0.39894228 *meanc(meanr(den));
filter_sim = Filter_SV(filter_sim,vY[0][i],phi,beta_const,q);
filtered_signal[0][i] = meanr(exp(0.5*filter_sim));
}
decl norm_filter = quann(prob_filter);
decl diag_stat = new matrix[5][2];
diag_stat[4][0] = sumr(log(dens_filter));
diag_stat[0:2][] = MVNbowmanShenton(norm_filter')~MVNbowmanShenton(vY');
diag_stat[3][] = PortmanteauTest(norm_filter',1.0/(norm_filter*norm_filter'),30,0,0)[0][0]~
PortmanteauTest((vY.*vY)',1.0/((vY.*vY)*(vY.*vY)'),30,0,0)[0][0];
DrawTMatrix(0,filtered_signal[0][],{"Filtering"},0,0,1);
Draw(1,fabs(vY),0,1);
SetDrawWindow("Filtering window");
ShowDrawWindow();
DrawCorrelogram(0,vY.*vY,"",30);
Draw(1,norm_filter,0,1);
DrawCorrelogram(2,norm_filter,"",30);
DrawQQ(3,norm_filter,"",QQ_N,0,0);
SetDrawWindow("Diagnostics window");
ShowDrawWindow();
return diag_stat;
}
class SV_Sampler // sets up to use Pitt's Ox implementation of the
// gilks/wild routines
{
decl y;
decl means, mScales;
decl q,phi;
log_lik_s2(const x);
log_lik_phi(const x);
set_data(const new_y);
set_para(const new_q, const new_phi);
set_moments(const new_means, const new_mScales);
};
SV_Sampler::set_para(const new_q, const new_phi)
{
q = new_q;
phi=new_phi;
}
SV_Sampler::log_lik_s2(const x)
{ decl df = 5.0;
decl S_0 = 0.01*df;
decl q1 = exp(x);
decl dLik,dVar;
decl mPhi = zeros(3,2);
decl mOmega = diag(<0.01,0.0,4.93>);
decl mDelta = zeros(3,1);
decl mSigma = zeros(3,2);
decl mJ_Phi = <-1,-1;-1,-1;-1,-1>;
decl mJ_Omega=<-1,-1,-1;-1,-1,-1;-1,-1,0>;
decl mJ_Delta=<-1;-1;-1>;
mSigma[0][0] = q1 / (1.0 - (phi*phi)) + 1.0e6;
mSigma[0][1] = 1.0e6;
mSigma[1][0] = 1.0e6;
mSigma[1][1] = 1.0e6;
mPhi[0][0] = phi; mPhi[0][1] = 1.0-phi;
mPhi[1][1] = 1.0;
mPhi[2][0] = 1.0;
mOmega[0][0] = q1;
SsfLik(&dLik,&dVar,y-means,mPhi,mOmega,mSigma,mDelta,mJ_Phi,mJ_Omega,mJ_Delta,mScales);
return dLik - (S_0 / (q1 * 2.0)) - (((df/2.0)+1.0)*log(q1)) + log(q1);
}
SV_Sampler::log_lik_phi(const x)
{
decl gamma = 20.0;
decl delta = 1.5;
decl phi1 = exp(x)/(1.0+exp(x));
decl dLik,dVar;
decl mPhi = zeros(3,2);
decl mOmega = diag(<0.01,0.0,4.93>);
decl mDelta = zeros(3,1);
decl mSigma = zeros(3,2);
decl mJ_Phi = <-1,-1;-1,-1;-1,-1>;
decl mJ_Omega=<-1,-1,-1;-1,-1,-1;-1,-1,0>;
decl mJ_Delta=<-1;-1;-1>;
mSigma[0][0] = q / (1.0 - (phi1*phi1)) + 1.0e6;
mSigma[0][1] = 1.0e6;
mSigma[1][0] = 1.0e6;
mSigma[1][1] = 1.0e6;
mPhi[0][0] = phi1; mPhi[0][1] = 1.0-phi1;
mPhi[1][1] = 1.0;
mPhi[2][0] = 1.0;
mOmega[0][0] = q;
SsfLik(&dLik,&dVar,y-means,mPhi,mOmega,mSigma,mDelta,mJ_Phi,mJ_Omega,mJ_Delta,mScales);
return dLik + ((gamma - 1.0) * log(1.0 + phi1)) + ((delta - 1.0) * log(1.0 - phi1))
+ x - 2.0 * log(1.0 + exp(x));
}
SV_Sampler::set_data(const new_y) { y = new_y;}
SV_Sampler::set_moments(const new_means, const new_mScales)
{means = new_means; mScales = new_mScales;}
log_lik_s2(const x)
{
decl log_liks = g_random->log_lik_s2(x);
return log_liks;
}
log_lik_phi(const x)
{
decl log_liks = g_random->log_lik_phi(x);
return log_liks;
}
MultiDen(const y, const beta, const mHess)
{
decl ycentre = y - beta;
decl log_den = 0.5.*ycentre' * mHess * ycentre;
return -log_den;
}
GW_SV(const vY, const fuller_correct, const istart, const iLoop) // gilks/wild type sampler for SV model
{
decl i,j;
decl ytrans = 1.2704+log((vY.^2)+fuller_correct);
decl n = columns(ytrans);
decl beta_result = new matrix[3][iLoop-istart];
decl mSignal; // log-volatility
decl icount1=0; //counts MCMC iterations, useful for printing
decl phi = 0.98; //initial value
decl q =0.01; // initial value
decl gamma = 20.0, delta =1.5; // prior
decl df=5; decl S_0 = df * 0.01; // prior
decl mIndex; // setup storage
decl means = zeros(1,n);
decl mScales = 4.93 * ones(1,n); // initialise mixture
decl w, var, sig, pi;
decl beta_const,beta_mean;
SV_Mixture_Setup(&w,&var,&sig,&pi);
decl ninit = 6, xinit = zeros(1,ninit); //setup gilks/wild
decl mxl = zeros(1,1), mxr = zeros(1,1), xprev = zeros(1,1); // sampler
decl nsamp = 1, mxsamp = zeros(1,nsamp);
decl answer = zeros(1,1);
decl time = timer();
g_random = new SV_Sampler(); //setup class to
g_random->set_data(ytrans); //talk to gilks/wild sampler
g_random->set_moments(means,mScales);
g_random->set_para(q,phi);
decl mResult; // initialise SSFpack stuff
decl mPhi = zeros(3,2);
decl mOmega = diag(<0.01,0.0,4.93>);
decl mDelta = zeros(3,1);
decl mSigma = zeros(3,2);
decl mJ_Phi = <-1,-1;-1,-1;-1,-1>;
decl mJ_Omega=<-1,-1,-1;-1,-1,-1;-1,-1,0>;
decl mJ_Delta=<-1;-1;-1>;
mSigma[0][0] = q / (1.0 - (phi*phi)) + 1.0e6;
mSigma[0][1] = 1.0e6;
mSigma[1][0] = 1.0e6;
mSigma[1][1] = 1.0e6;
mPhi[0][0] = phi; mPhi[0][1] = 1.0-phi;
mPhi[1][1] = 1.0;
mPhi[2][0] = 1.0;
mOmega[0][0] = q;
for (i=0; i<iLoop; i++)
{
// SAMPLING sigma_eta^2
mxl[0][0] = -10.0; mxr[0][0] = 1.0;
xprev[0][0] = log(q);
answer = Arms_simple(log_lik_s2, ninit, mxl, mxr, 1, xprev, mxsamp);
q = exp(mxsamp[0][0]);
g_random->set_para(q,phi);
// SAMPLING phi
mxl[0][0] = -5.0; mxr[0][0] = 5.3;
xprev[0][0] = log(phi/(1.0-phi));
answer = Arms_simple(log_lik_phi, ninit, mxl, mxr, 1, xprev, mxsamp);
phi = exp(mxsamp[0][0])/(1.0 + exp(mxsamp[0][0]));
g_random->set_para(q,phi);
// RECORD SOME RESULTS
if (icount1 == 1000)
{
print(i~phi~q);
icount1 = 0;
}
icount1 +=1;
// UPDATE MIXTURE APPROX
mSigma[0][0] = q / (1.0 - (phi*phi)) + 1.0e6;
mPhi[0][0] = phi; mPhi[0][1] = 1.0-phi;
mOmega[0][0] = q;
mResult = SsfCondDens(ST_SIM,ytrans-means,mPhi,mOmega,mSigma,mDelta,mJ_Phi,mJ_Omega,mJ_Delta,mScales);
mSignal = mResult[2][];
beta_const = mResult[1][1];
MixtureUpdate(ytrans,mSignal,w,var,sig,pi,&mIndex);
Mean_var(mIndex,w,var,&means,&mScales);
g_random->set_moments(means,mScales);
if (i>=istart)
{
beta_result[2][i-istart] = exp(-0.5*beta_const);
beta_result[1][i-istart] = sqrt(q);
beta_result[0][i-istart] = phi;
}
}
return beta_result;
}
Integrate_SV_Many(const vY, const fuller_correct, const istart, const iLoop, prob1) // integrated MCMC algorithm
// KSC's favoured method
{
decl i,j;
decl ytrans = 1.2704+log((vY.^2)+fuller_correct);
decl n = columns(ytrans);
decl beta_result = new matrix[3][iLoop-istart];
decl prob = new matrix[1][iLoop-istart];
decl mV,mF,mN,mSignal; //KF stuff and log-volatility
decl para_keep = zeros(1,4);// records MCMC results
decl ans = zeros(3,3); //records MCMC results
decl icount1=0; //counts MCMC iterations, useful for printing
decl phi = 0.98;
decl q =0.01;
decl gamma = 20.0, delta =1.5;
decl df=5; decl S_0 = df * 0.01;
decl mIndex;
decl means = zeros(1,n);
decl mScales = 4.93 * ones(1,n);
decl w, var, sig, pi;
SV_Mixture_Setup(&w,&var,&sig,&pi);
decl iInitial = 150;
decl gilks = GW_SV(vY,fuller_correct,10,iInitial);
beta_result[0][0:iInitial-10-1] = log(gilks[0][]./(1.0 - gilks[0][]));
beta_result[1][0:iInitial-10-1] = 2.0*log(gilks[1][]);
decl mVaug,mVt=zeros(1,n);
decl nill = zeros(1,n);
decl beta_const,beta_mean;
decl time = timer();
decl vpfinish = meanr(beta_result[0:1][0:iInitial-10-1]);
decl mHess = 2.0.*variance(beta_result[0:1][0:iInitial-10-1]');
q = exp(vpfinish[1][0]);
phi = exp(vpfinish[0][0]) / (1.0 + exp(vpfinish[0][0]));
para_keep = 0.98~sqrt(q)~0.0;
decl mHessinv = invertsym(mHess);
decl mVaug1,like_est,vpstore = zeros(2,2);
decl likes1 = -1.0e16 + zeros(1,2);
decl Metro_lag = zeros(1,2);
decl vp = zeros(2,1);
vp[0][0] = log(0.98/(1.0-0.98));
vp[1][0] = log(0.15*0.15);
vpstore[0][] = vp';
vpstore[1][] = vp';
decl mResult,dLik,dVar; // initialise SSFpack stuff
decl mPhi = zeros(3,2);
decl mOmega = diag(<0.01,0.0,4.93>);
decl mDelta = zeros(3,1);
decl mSigma = zeros(3,2);
decl mJ_Phi = <-1,-1;-1,-1;-1,-1>;
decl mJ_Omega=<-1,-1,-1;-1,-1,-1;-1,-1,0>;
decl mJ_Delta=<-1;-1;-1>;
mSigma[0][0] = q / (1.0 - (phi*phi)) + 1.0e6;
mSigma[0][1] = 1.0e6;
mSigma[1][0] = 1.0e6;
mSigma[1][1] = 1.0e6;
mPhi[0][0] = phi; mPhi[0][1] = 1.0-phi;
mPhi[1][1] = 1.0;
mPhi[2][0] = 1.0;
mOmega[0][0] = q;
decl mean_lin = ytrans - means;
for (i=0; i<iLoop; i++)
{
vpstore[1][] = (vpfinish + (choleski(mHess) * rann(2,1)))';
mean_lin = ytrans - means;
for (j=0; j<2; j++)
{
q = exp(vpstore[j][1]);
phi = exp(vpstore[j][0]) / (1.0 + exp(vpstore[j][0]));
mSigma[0][0] = q / (1.0 - (phi*phi)) + 1.0e6;
mPhi[0][0] = phi; mPhi[0][1] = 1.0-phi;
mOmega[0][0] = q;
SsfLik(&dLik,&dVar,ytrans-means,mPhi,mOmega,mSigma,mDelta,mJ_Phi,mJ_Omega,mJ_Delta,mScales);
likes1[0][j] = dLik;
like_est = likes1[0][j]
+ (gamma - 1.0) * log(1.0 + phi) + (delta - 1.0) * log(1.0 - phi)
- (S_0 / (q * 2.0)) - (((df/2.0)+1.0)*log(q));
Metro_lag[0][j] = like_est - (MultiDen(vpstore[j][]',vpfinish,mHessinv)
- log(q)
- log(phi*(1.0 - phi)));
}
if (log(ranu(1,1)) < Metro_lag[0][1]-Metro_lag[0][0] && phi < 0.995)
{
para_keep[0][1] = sqrt(q);
para_keep[0][0] = phi;
para_keep[0][2] = exp(0.5*beta_const);
vpstore[0][] = vpstore[1][];
likes1[0][0] = likes1[0][1];
}
else
{
q = para_keep[0][1]*para_keep[0][1];
phi = para_keep[0][0];
}
mSigma[0][0] = q / (1.0 - (phi*phi)) + 1.0e6;
mPhi[0][0] = phi; mPhi[0][1] = 1.0-phi;
mOmega[0][0] = q;
mResult = SsfCondDens(ST_SIM,ytrans-means,mPhi,mOmega,mSigma,mDelta,mJ_Phi,mJ_Omega,mJ_Delta,mScales);
mSignal = mResult[2][];
beta_const = mResult[1][1];
MixtureUpdate(ytrans,mSignal,w,var,sig,pi,&mIndex);
Mean_var(mIndex,w,var,&means,&mScales);
if (i>=istart)
{
beta_result[][i-istart] = para_keep';
prob[0][i-istart] = weights(ytrans,mSignal,fuller_correct,0.0,w,var,pi);
}
if (icount1 == 1000)
{
print(i~para_keep);
icount1 = 0;
}
icount1 +=1;
}
prob = (1.0/sumr(exp(prob))).*exp(prob);
prob1[0] = prob;
print("time of Integration sampler (in sec) & per 100 scans",(timer()-time)/100~((timer()-time)/100)*100/iLoop);
return beta_result;
}
Gibbs_SV_Many(const vY, const istart, const iLoop) // plain gibbs sampler for SV model
{
decl i,j;
decl n = columns(vY);
decl beta_result = new matrix[3][iLoop-istart];
decl mSignal = zeros(1,n); // initialize log-volatility
decl ans = zeros(3,3); //records MCMC results
decl icount1=0; //counts MCMC iterations, useful for printing
decl beta_const = 0.6; // initialized parameters
decl phi = 0.97;
decl q = 0.2 * 0.2;
decl time = timer();
decl mean_beta, var_beta, var_post, mean_post; // working space
for (i=0, icount1 = 0; i<iLoop; i++)
{
mSignal=Gibbs_SV(vY,mSignal,(beta_const*(1.0-phi)),phi,q,1.0);
if (i>min(100,istart/2))
{
mean_beta = (sumr(mSignal[0][1:n-1])-phi*sumr(lag0(mSignal',1)[1:n-1][0]'));
var_beta = (n-1)*(1.0-phi)*(1.0-phi);
var_post = 1.0 / (var_beta + ((1.0-(phi*phi))));
mean_post = var_post * ((mean_beta*(1.0-phi)) + (mSignal[0][0] * (1.0 - (phi*phi))));
beta_const = (mean_post + sqrt(q*var_post)*rann(1,1))[0][0];
phi = Update_Phi(-beta_const+mSignal,q,phi);
q = Update_Q(-beta_const+mSignal,phi);
if (fabs(phi) > 0.9999 || q > 10.0)
{
phi = 0.975;
q = 0.1;
}
if (exp(0.5*beta_const) > 5.0)
print(beta_const~q~phi);
}
if (i>=istart)
{
beta_result[2][i-istart] = exp(0.5*beta_const);
beta_result[0][i-istart] = phi;
beta_result[1][i-istart] = sqrt(q);
}
if (icount1 == 2500)
{
if (i >= istart)
print(i~beta_result[][i-istart]');
icount1 = 0;
}
icount1 += 1;
}
print("time of Gibbs sampler (in sec) & per 100 scans",(timer()-time)/100~((timer()-time)/100)*100/iLoop);
return beta_result;
}
Mix_SV_Many(const vY, const istart, const iLoop) // mixture approach to SV model
{
decl i,j;
decl n = columns(vY);
decl fuller_correct = 0.00005; //sets up KSC algorithm
decl ytrans = 1.2704+log((vY.^2)+fuller_correct);
decl beta_result = new matrix[3][iLoop-istart];
decl mSignal; // setup log-volatility
decl icount1=0; //counts MCMC iterations, useful for printing
decl beta_const = log(0.6); // initialized parameters
decl phi = 0.97;
decl q = 0.2 * 0.2;
decl time = timer();
decl mean_beta, var_beta, var_post, mean_post; // working space
decl w, var, sig, pi, mIndex; // setup mixture & GSSF
decl means = zeros(1,n);
decl mScales = 4.93 * ones(1,n);
SV_Mixture_Setup(&w,&var,&sig,&pi);
decl mPhi = ones(2,1);
decl mOmega = diag(<0.01,4.93>);
decl mDelta = zeros(2,1);
decl mSigma = zeros(2,1);
decl mJ_Phi = <-1;-1>;
decl mJ_Omega=<-1,-1;-1,0>;
decl mJ_Delta=<-1;-1>;
for (i=0, icount1 = 0; i<iLoop; i++)
{
mSigma[0][0] = q / (1.0 - (phi*phi));
mSigma[1][0] = beta_const;
mDelta[0][0] = beta_const*(1.0-phi);
mPhi[0][0] = phi;
mOmega[0][0] = q;
mSignal = SsfCondDens(ST_SIM,ytrans-means,mPhi,mOmega,mSigma,mDelta,mJ_Phi,mJ_Omega,mJ_Delta,mScales)[0][];
MixtureUpdate(ytrans,mSignal,w,var,sig,pi,&mIndex);
Mean_var(mIndex,w,var,&means,&mScales);
if (i>min(1000,istart/2))
{
mean_beta = (sumr(mSignal[0][1:n-1])-phi*sumr(lag0(mSignal',1)[1:n-1][0]'));
var_beta = (n-1)*(1.0-phi)*(1.0-phi);
var_post = 1.0 / (var_beta + ((1.0-(phi*phi))));
mean_post = var_post * ((mean_beta*(1.0-phi)) + (mSignal[0][0] * (1.0 - (phi*phi))));
beta_const = (mean_post + sqrt(q*var_post)*rann(1,1))[0][0];
phi = Update_Phi(-beta_const+mSignal,q,phi);
q = Update_Q(-beta_const+mSignal,phi);
if (fabs(phi) > 0.9999 || q > 10.0)
{
phi = 0.975;
q = 0.1;
}
if (exp(0.5*beta_const) > 5.0)
print(beta_const~q~phi);
}
if (i>=istart)
{
beta_result[2][i-istart] = exp(0.5*beta_const);
beta_result[0][i-istart] = phi;
beta_result[1][i-istart] = sqrt(q);
}
if (icount1 == 1000)
{
if (i >= istart)
print(i~beta_result[][i-istart]');
icount1 = 0;
}
icount1 += 1;
}
print("time of Mixture sampler (in sec) & per 100 scans",(timer()-time)/100~((timer()-time)/100)*100/iLoop);
return beta_result;
}