/vqdr/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/vqdr/trunk
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
1
using VQDR.Expression;
64 by Gustav Hartvigsson
[General] Major refactoring. Utils -> Vee nenaming.
2
using Vee;
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
3
35 by Gustav Hartvigsson
a few things: FastNumbers, simplifications and AbstractPoolToken.
4
public class VQDR.Expression.RollAndKeepFunctionToken : FunctionToken {
52.1.3 by Gustav Hartvigsson
int -> int32
5
  private const int32 INDEX_ROLL = 1;
6
  private const int32 INDEX_POOL = 1;
7
  private const int32 INDEX_KEEP = 2;
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
8
52.1.3 by Gustav Hartvigsson
int -> int32
9
  private const int32 MAX_POOL_SIZE = 50;
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
10
52.1.1 by Gustav Hartvigsson
Use int64 instead of long.
11
  private int64[] roll_values  = null; // = new long[MAX_POOL_SIZE];
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
12
  private bool[] valid_values = null; // = new bool[MAX_POOL_SIZE];
13
14
  construct {
15
    mandatory_num_child = 2;
16
    optional_num_child = 1;
17
  }
18
19
  protected override void evaluate_self (VQDR.Expression.Context instance) throws GLib.Error {
20
    Token? roll;
52.1.1 by Gustav Hartvigsson
Use int64 instead of long.
21
    int64  pool_size;
22
    int64 keep_size;
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
23
    
24
    roll = get_child (INDEX_ROLL);
25
    try {
26
      get_child (INDEX_POOL).evaluate (instance);
27
    } catch (Error e) {
28
      stderr.printf ("Error: %s, Error Domain: %s\n",
29
                     e.message, e.domain.to_string ());
30
      GLib.assert_not_reached ();
31
    }
32
    pool_size = get_child (INDEX_POOL).result_value.to_int ();
33
34
    if (pool_size > MAX_POOL_SIZE) {
35 by Gustav Hartvigsson
a few things: FastNumbers, simplifications and AbstractPoolToken.
35
      throw new ParamError.OUT_OF_BOUNDS
36
        (@"($(get_function_name (this.get_type ()))) Max value $MAX_POOL_SIZE, got $pool_size");
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
37
    }
38
39
    if (pool_size < 0) {
40
      pool_size = 0;
41
    }
42
43
    {
44
      Token? keep_child = get_child (INDEX_KEEP);
45
      if (keep_child != null) {
46
        keep_child.evaluate (instance);
47
        keep_size = keep_child.result_value.to_int ();
48
      } else {
49
        keep_size = pool_size;
50
      }
51
    }
52
53
    if (keep_size > pool_size) {
54
      keep_size = pool_size;
55
    }
56
57
    /* */
58
52.1.1 by Gustav Hartvigsson
Use int64 instead of long.
59
    int64 roll_result;
52.1.3 by Gustav Hartvigsson
int -> int32
60
    int64 min_keep = int64.MAX;
61
    int32 min_keep_index = 0;
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
62
    
63
    if (roll_values == null || roll_values.length < pool_size) {
52.1.1 by Gustav Hartvigsson
Use int64 instead of long.
64
      roll_values  = new int64[pool_size];
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
65
      valid_values = new bool[pool_size];
66
    }
67
52.1.3 by Gustav Hartvigsson
int -> int32
68
    for (int32 i = 0; i < pool_size; i++) {
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
69
      roll.evaluate (instance);
70
      roll_result = roll.result_value.raw_number;
71
      
72
      roll_values[i] = roll_result;
73
      valid_values[i] = true;
74
75
      if (i < keep_size) {
76
        // simply keep and detect the minium kept value
77
        if (min_keep > roll_result) {
78
          min_keep = roll_result;
79
          min_keep_index = i;
80
        }
81
      } else {
82
        // Chose what to do.
83
        if (roll_result >= min_keep) {
84
          // Discard the Minimum value
85
          valid_values[min_keep_index] = false;
86
87
          // Search for new Minimum value
52.1.1 by Gustav Hartvigsson
Use int64 instead of long.
88
          min_keep = int64.MAX;
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
89
          min_keep_index = 0;
90
52.1.3 by Gustav Hartvigsson
int -> int32
91
          for (int32 j = 0; j <= i; j++) {
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
92
            if (valid_values[j]) {
93
              if (min_keep > roll_values[j]) {
94
                min_keep = roll_values[j];
95
                min_keep_index = j;
96
              }
97
            }
98
          }
99
        } else {
100
          valid_values[i] = false;
101
        }
102
      }
103
    } // end for loop
104
105
    StringBuilder strbldr = new StringBuilder ();
106
    strbldr.append (SYM_BEGIN);
107
    
108
    FastNumber tmp_fstnmbr;
109
52.1.3 by Gustav Hartvigsson
int -> int32
110
    for (int32 i = 0; i < pool_size; i++) {
32 by Gustav Hartvigsson
Added RollAndKeepFunctionToken.
111
      if (strbldr.len < MAX_TOKEN_STRING_LENGTH) {
112
        //we don't start with a seperator mark.
113
        if (i > 0) {
114
          strbldr.append (SYM_SEP);
115
        }
116
        // We don't want to deal with the conertion directly.
117
        // FIXME: Convert everything to FastNumbers instead of using "raw" values?
118
        tmp_fstnmbr = FastNumber.raw (roll_values[i]);
119
        strbldr.append (tmp_fstnmbr.to_string ());
120
        
121
        if (valid_values[i] && keep_size != pool_size) {
122
          strbldr.append (SYM_SELECTED);
123
        }
124
      }
125
      if (valid_values[i]) {
126
        tmp_fstnmbr = FastNumber.raw (roll_values[i]);
127
        result_value.add (tmp_fstnmbr);
128
      }
129
    }
130
    
131
    result_max_value = roll.result_max_value.multiply (FastNumber(keep_size));
132
    result_min_value = roll.result_min_value.multiply (FastNumber(keep_size));
133
134
    if (strbldr.len < MAX_TOKEN_STRING_LENGTH) {
135
      strbldr.append (SYM_END);
136
      result_string = strbldr.str;
137
    } else {
138
      result_string = SYM_TRUNK_BEGIN + result_value.to_string () + SYM_TRUNK_END;
139
    }
140
  }
141
  
142
}
33 by Gustav Hartvigsson
Added sudfolders to the tests folder for future use.
143
/* vim: set tabstop=2:softtabstop=2:shiftwidth=2:expandtab */