Commit 7173ba44 authored by Laurent Belcour's avatar Laurent Belcour
Browse files

Small additions, the CGAL fitter is stable for 1d transmi_lame_50_50 from 400 to 500

parents 9e94b16e 07c6d34c
* RP: je trouve qu il serait pas mal que le fait de ne pas spécifier
#VS [0|1|2] implique qu il y a #VS 0 pour toutes dimensions de
sortie
* RP: Format d output XML ou BRDF du fit des polynomes rationnels
+ Format texte d'entrée et de sortie
+ Format en Entrée
#DIM N P
# COMMENTAIRE
#VS [0|1|2]
# (0: pas de vertical segment, 1: VS min ou max?m 2: VS min et max)
#VS (P fois)
x1 .... xN y1.....yP
+ Format en Sortie
#DIM N P
#NP (nombre de coeffs ou degré max au numerateur )
#NQ (nombre de coeffs ou degré min au denominateur )
#BASIS "chaine_caract_decrivant_le_type_de_fonction_de_base"
Coeff_numerateur deg_1_fct_base deg_2_fct_base ... coeff_associe
Coeff denominateur
#NP
#NQ
......@@ -88,6 +88,7 @@ Notes avec Gael:
- Fitter dans des intervalles puis faire un fit non-lineaire à partir de là mais contraint aux intervalles ?
- Fitter de maniere a garantir que les oscillations ne sortent pas de la bande d'intervalle ? ( demande à Oliver son avis)
Réunion du 21 Janvier
* On a parlé architecture avec 3 classes pincipales
......@@ -96,32 +97,8 @@ Réunion du 21 Janvier
Function
Fitter
+ Plugins d'entrée et de sorties (GLSL, Cuda, )
--> La transformation de l output txt de sortie à GLSL, CUDA,
pourrait être fait en script python ?
+ Format texte d'entrée et de sortie
+ Format en Entrée
#DIM N P
# COMMENTAIRE
#VS [0|1|2]
# (0: pas de vertical segment, 1: VS min ou max?m 2: VS min et max)
#VS (P fois)
x1 .... xN y1.....yP
+ Format en Sortie
#DIM N P
#NP (nombre de coeffs ou degré max au numerateur )
#NQ (nombre de coeffs ou degré min au denominateur )
#BASIS "chaine_caract_decrivant_le_type_de_fonction_de_base"
Coeff_numerateur deg_1_fct_base deg_2_fct_base ... coeff_associe
Coeff denominateur
#NP
#NQ
+ Format IO (cf io-format.txt)
......@@ -121,7 +121,7 @@ void rational_1d_data::load(const std::string& filename, double min, double max)
linestream >> dy ;
} else {
// TODO Specify the delta in case
dy = 0.1f ;
dy = 0.01f ;
}
if(x <= max && x >= min)
......@@ -138,11 +138,23 @@ void rational_1d_data::load(const std::string& filename, double min, double max)
}
}
//TODO Test for small data
/* std::vector<std::vector<double> > temp ;
std::ofstream temp_out("temp.gnuplot", std::ios_base::trunc) ;
for(int i=0; i<20; ++i)
{
int k = (i * _data.size()) / 20 ;
temp_out << _data[k][0] << "\t" << _data[k][1] << "\t" << 0.5*(_data[k][2] - _data[k][1]) << std::endl ;
temp.push_back(_data[k]) ;
}
_data = temp ;
*/
// Sort the vector
std::sort(_data.begin(), _data.end(), [](const std::vector<double>& a, const std::vector<double>& b){return (a[0]<b[0]);});
std::cout << "<<INFO>> loaded file \"" << filename << "\"" << std::endl ;
std::cout << "<<INFO>> data inside [" << _min << ", " << _max << "]" << std::endl ;
std::cout << "<<INFO>> " << _data.size() << " elements to fit" << std::endl ;
}
bool rational_1d_data::get(int i, double& x, double& yl, double& yu) const
......
......@@ -94,12 +94,11 @@ bool rational_1d_fitter_cgal::fit_data(const rational_1d_data& data, int np, int
#ifdef DEBUG
std::cout << "<<DEBUG>> delta factor: " << sigma_m << " / " << sigma_M << " = " << delta << std::endl ;
#endif
//*
for(int i=0; i<2*data.size(); ++i)
{
qp.set_b(i, delta * ci(i)) ;
}
//*/
#ifdef DEBUG
// Export some informations on the problem to solve
std::cout << "<<DEBUG>> " << qp.get_n() << " variables" << std::endl ;
......
......@@ -50,18 +50,18 @@ bool rational_1d_fitter_eigen::fit_data(const rational_1d_data& data, int np, in
const double pi = r.p(data[i][0], j) ;
a0_norm += pi*pi ;
a1_norm += pi*pi ;
CI(j, 2*i+0) = pi ;
CI(j, 2*i+1) = -pi ;
CI(j, 2*i+0) = pi ;
CI(j, 2*i+1) = - pi ;
}
// Filling the q part
else
{
const double qi = r.q(data[i][0], j-np) ;
a0_norm += qi*qi * (data[i][1]*data[i][1]) ;
CI(j, 2*i+0) = -data[i][1] * qi ;
CI(j, 2*i+0) = - data[i][1] * qi ;
a1_norm += qi*qi * (data[i][2]*data[i][2]) ;
CI(j, 2*i+1) = data[i][2] * qi ;
CI(j, 2*i+1) = data[i][2] * qi ;
}
}
......
......@@ -8,10 +8,10 @@ int main(int argc, int argv)
for(int i=0; i<100; ++i)
{
const float x = i / (float)10.0f ;
const float y = exp(-10.0 * x*x) * x*x - 0.1 *x*x*x ;
const float x = i / (float)100.0f ;
const float y = 100.0f * exp(-10.0 * x*x) * x*x - 0.01 *x*x*x ;
f << x << "\t" << y << "\t" << 1.0f << std::endl ;
f << x << "\t" << y << "\t" << 0.1f << std::endl ;
}
return 0 ;
......
......@@ -4,6 +4,7 @@
#include <vector>
#include <iostream>
#include <fstream>
#include <limits>
#include <core/args.h>
......@@ -30,6 +31,14 @@ int main(int argc, char** argv)
{
data.load(args["input"], args.get_float("min", 0.0f), args.get_float("max", 1.0f));
}
else if(args.is_defined("min") && !args.is_defined("max"))
{
data.load(args["input"], args.get_float("min", 0.0f), std::numeric_limits<double>::max());
}
else if(args.is_defined("min") && !args.is_defined("max"))
{
data.load(args["input"], -std::numeric_limits<double>::max(), args.get_float("min", 0.0f));
}
else
{
data.load(args["input"]);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment