787
787
schro_encoder_entropy_to_lambda (SchroEncoderFrame *frame, double entropy)
790
double log_lambda_hi, log_lambda_lo, log_lambda_mid;
790
double lambda_hi, lambda_lo, lambda_mid;
791
791
double entropy_hi, entropy_lo, entropy_mid;
793
log_lambda_hi = log(1);
794
entropy_hi = schro_encoder_lambda_to_entropy (frame, exp(log_lambda_hi));
795
SCHRO_DEBUG("start target=%g log_lambda=%g entropy=%g",
796
entropy, log_lambda_hi, entropy_hi, log_lambda_hi, entropy);
794
entropy_hi = schro_encoder_lambda_to_entropy (frame, lambda_hi);
795
SCHRO_DEBUG("start target=%g lambda=%g entropy=%g",
796
entropy, lambda_hi, entropy_hi);
798
798
if (entropy_hi < entropy) {
799
799
entropy_lo = entropy_hi;
800
log_lambda_lo = log_lambda_hi;
800
lambda_lo = lambda_hi;
802
802
for(j=0;j<5;j++) {
803
log_lambda_hi = log_lambda_lo + log(100);
804
entropy_hi = schro_encoder_lambda_to_entropy (frame, exp(log_lambda_hi));
803
lambda_hi = lambda_lo*100;
804
entropy_hi = schro_encoder_lambda_to_entropy (frame, lambda_hi);
806
SCHRO_DEBUG("have: log_lambda=[%g,%g] entropy=[%g,%g] target=%g",
807
log_lambda_lo, log_lambda_hi, entropy_lo, entropy_hi, entropy);
806
SCHRO_DEBUG("have: lambda=[%g,%g] entropy=[%g,%g] target=%g",
807
lambda_lo, lambda_hi, entropy_lo, entropy_hi, entropy);
808
808
if (entropy_hi > entropy) break;
810
810
SCHRO_DEBUG("--> step up");
812
812
entropy_lo = entropy_hi;
813
log_lambda_lo = log_lambda_hi;
813
lambda_lo = lambda_hi;
815
815
SCHRO_DEBUG("--> stopping");
817
817
for(j=0;j<5;j++) {
818
log_lambda_lo = log_lambda_hi - log(100);
819
entropy_lo = schro_encoder_lambda_to_entropy (frame, exp(log_lambda_lo));
818
lambda_lo = lambda_hi*0.01;
819
entropy_lo = schro_encoder_lambda_to_entropy (frame, lambda_lo);
821
SCHRO_DEBUG("have: log_lambda=[%g,%g] entropy=[%g,%g] target=%g",
822
log_lambda_lo, log_lambda_hi, entropy_lo, entropy_hi, entropy);
821
SCHRO_DEBUG("have: lambda=[%g,%g] entropy=[%g,%g] target=%g",
822
lambda_lo, lambda_hi, entropy_lo, entropy_hi, entropy);
824
824
SCHRO_DEBUG("--> step down");
825
825
if (entropy_lo < entropy) break;
827
827
entropy_hi = entropy_lo;
828
log_lambda_hi = log_lambda_lo;
828
lambda_hi = lambda_lo;
830
830
SCHRO_DEBUG("--> stopping");
832
832
if (entropy_lo == entropy_hi) {
833
return exp(0.5*(log_lambda_lo + log_lambda_hi));
833
return sqrt(lambda_lo*lambda_hi);
836
836
if (entropy_lo > entropy || entropy_hi < entropy) {
837
837
SCHRO_ERROR("entropy not bracketed");
841
841
if (entropy_hi == entropy_lo) break;
843
SCHRO_DEBUG("have: log_lambda=[%g,%g] entropy=[%g,%g] target=%g",
844
log_lambda_lo, log_lambda_hi, entropy_lo, entropy_hi, entropy);
846
log_lambda_mid = log_lambda_lo + (log_lambda_hi - log_lambda_lo) * 0.5;
847
entropy_mid = schro_encoder_lambda_to_entropy (frame, exp(log_lambda_mid));
849
SCHRO_DEBUG("picking log_lambda_mid=%g entropy=%g",
850
log_lambda_mid, entropy_mid);
843
SCHRO_DEBUG("have: lambda=[%g,%g] entropy=[%g,%g] target=%g",
844
lambda_lo, lambda_hi, entropy_lo, entropy_hi, entropy);
846
lambda_mid = sqrt(lambda_lo * lambda_hi);
847
entropy_mid = schro_encoder_lambda_to_entropy (frame, lambda_mid);
849
SCHRO_DEBUG("picking lambda_mid=%g entropy=%g",
850
lambda_mid, entropy_mid);
852
852
if (entropy_mid > entropy) {
853
log_lambda_hi = log_lambda_mid;
853
lambda_hi = lambda_mid;
854
854
entropy_hi = entropy_mid;
855
855
SCHRO_DEBUG("--> focus up");
857
log_lambda_lo = log_lambda_mid;
857
lambda_lo = lambda_mid;
858
858
entropy_lo = entropy_mid;
859
859
SCHRO_DEBUG("--> focus down");
863
log_lambda_mid = 0.5*(log_lambda_hi + log_lambda_lo);
864
SCHRO_DEBUG("done %g", exp(log_lambda_mid));
865
return exp(log_lambda_mid);
863
lambda_mid = sqrt(lambda_hi * lambda_lo);
864
SCHRO_DEBUG("done %g", lambda_mid);
905
905
schro_encoder_error_to_lambda (SchroEncoderFrame *frame, double error)
908
double log_lambda_hi, log_lambda_lo, log_lambda_mid;
908
double lambda_hi, lambda_lo, lambda_mid;
909
909
double error_hi, error_lo, error_mid;
911
log_lambda_lo = log(1);
912
error_lo = schro_encoder_lambda_to_error (frame, exp(log_lambda_lo));
913
SCHRO_DEBUG("start target=%g log_lambda=%g error=%g",
914
error, log_lambda_lo, error_lo, log_lambda_lo, error);
912
error_lo = schro_encoder_lambda_to_error (frame, lambda_lo);
913
SCHRO_DEBUG("start target=%g lambda=%g error=%g",
914
error, lambda_lo, error_lo, lambda_lo, error);
916
916
if (error < error_lo) {
917
917
error_hi = error_lo;
918
log_lambda_hi = log_lambda_lo;
918
lambda_hi = lambda_lo;
920
920
for(j=0;j<5;j++) {
921
log_lambda_lo = log_lambda_hi + log(100);
922
error_lo = schro_encoder_lambda_to_error (frame, exp(log_lambda_lo));
921
lambda_lo = lambda_hi * 100;
922
error_lo = schro_encoder_lambda_to_error (frame, lambda_lo);
924
SCHRO_DEBUG("have: log_lambda=[%g,%g] error=[%g,%g] target=%g",
925
log_lambda_lo, log_lambda_hi, error_lo, error_hi, error);
924
SCHRO_DEBUG("have: lambda=[%g,%g] error=[%g,%g] target=%g",
925
lambda_lo, lambda_hi, error_lo, error_hi, error);
926
926
if (error > error_lo) break;
928
928
SCHRO_DEBUG("--> step up");
930
930
error_hi = error_lo;
931
log_lambda_hi = log_lambda_lo;
931
lambda_hi = lambda_lo;
933
933
SCHRO_DEBUG("--> stopping");
935
935
for(j=0;j<5;j++) {
936
log_lambda_hi = log_lambda_lo - log(100);
937
error_hi = schro_encoder_lambda_to_error (frame, exp(log_lambda_hi));
936
lambda_hi = lambda_lo * 0.01;
937
error_hi = schro_encoder_lambda_to_error (frame, lambda_hi);
939
SCHRO_DEBUG("have: log_lambda=[%g,%g] error=[%g,%g] target=%g",
940
log_lambda_lo, log_lambda_hi, error_lo, error_hi, error);
939
SCHRO_DEBUG("have: lambda=[%g,%g] error=[%g,%g] target=%g",
940
lambda_lo, lambda_hi, error_lo, error_hi, error);
942
942
SCHRO_DEBUG("--> step down");
943
943
if (error < error_hi) break;
945
945
error_lo = error_hi;
946
log_lambda_lo = log_lambda_hi;
946
lambda_lo = lambda_hi;
948
948
SCHRO_DEBUG("--> stopping");
950
950
if (error_lo == error_hi) {
951
return exp(0.5*(log_lambda_lo + log_lambda_hi));
951
return sqrt(lambda_lo * lambda_hi);
954
954
if (error_lo > error || error_hi < error) {
958
958
for(j=0;j<14;j++){
959
959
if (error_hi == error_lo) break;
961
SCHRO_DEBUG("have: log_lambda=[%g,%g] error=[%g,%g] target=%g",
962
log_lambda_lo, log_lambda_hi, error_lo, error_hi, error);
964
log_lambda_mid = log_lambda_lo + (log_lambda_hi - log_lambda_lo) * 0.5;
965
error_mid = schro_encoder_lambda_to_error (frame, exp(log_lambda_mid));
967
SCHRO_DEBUG("picking log_lambda_mid=%g error=%g",
968
log_lambda_mid, error_mid);
961
SCHRO_DEBUG("have: lambda=[%g,%g] error=[%g,%g] target=%g",
962
lambda_lo, lambda_hi, error_lo, error_hi, error);
964
lambda_mid = sqrt(lambda_lo * lambda_hi);
965
error_mid = schro_encoder_lambda_to_error (frame, lambda_mid);
967
SCHRO_DEBUG("picking lambda_mid=%g error=%g",
968
lambda_mid, error_mid);
970
970
if (error_mid > error) {
971
log_lambda_hi = log_lambda_mid;
971
lambda_hi = lambda_mid;
972
972
error_hi = error_mid;
973
973
SCHRO_DEBUG("--> focus up");
975
log_lambda_lo = log_lambda_mid;
975
lambda_lo = lambda_mid;
976
976
error_lo = error_mid;
977
977
SCHRO_DEBUG("--> focus down");
981
log_lambda_mid = 0.5*(log_lambda_hi + log_lambda_lo);
982
SCHRO_DEBUG("done %g", exp(log_lambda_mid));
983
return exp(log_lambda_mid);
981
lambda_mid = sqrt(lambda_hi * lambda_lo);
982
SCHRO_DEBUG("done %g", lambda_mid);