chenqinghong
2024-05-07 3ec06a830367465068963156dcc1d8e522571c13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Quintiq file version 2.0
#parent: #root
Method AdjustWorkLoad (
  LibOpt_Task task,
  Real timeA,
  Real timeB,
  Real timeC
)
{
  TextBody:
  [*
    timeA := timeA + 1; // avoid division by 0
    timeB := timeB + 1; 
    timeC := timeC + 1; 
    
    s := timeA + timeB + timeC; 
    
    fracA := timeA / s; 
    fracB := timeB / s; 
    fracC := timeC / s; 
    
    // task.Log( 'FracA,B,C=' + [String] fracA + ', ' + [String] fracB + ', ' + [String] fracC );  
    
    sizeA := this.ThreadAParameter(); 
    sizeB := this.ThreadBParameter() - this.ThreadAParameter(); 
    sizeC := 1000 - this.ThreadBParameter(); 
    N := sizeA + sizeB + sizeC; 
    
    factorA := fracA * 3; 
    factorB := fracB * 3; 
    factorC := fracC * 3;  
    
    // task.Log( 'FactorsA,B,C=' + [String] factorA + ', ' + [String] factorB + ', ' + [String] factorC );  
    
    newsizeA := sizeA / factorA; 
    newsizeB := sizeB / factorB; 
    newsizeC := sizeC / factorC; 
    total := maxvalue( 1.0, newsizeA + newsizeB + newsizeC ); 
    
    // task.Log( 'NewsizeA,B,C=' + [String] newsizeA + ', ' + [String] newsizeB + ', ' + [String] newsizeC );  
    
    newAratio := newsizeA / total; 
    newBratio := newsizeB / total; 
    // newCratio := newsizeC / total; 
    
    // task.Log( 'NewratioA,B,C=' + [String] newAratio + ', ' + [String] newBratio + ', ' + [String] newCratio );  
    
    
    newAparam := ceil( N * newAratio ); 
    newBparam := newAparam + ceil( N * newBratio ); 
    
    // task.Log( 'new A ' + [String] newAparam ); 
    // task.Log( 'new B ' + [String] newBparam ); 
    
    newAparam := maxvalue(  newAparam, 0 ); 
    newBparam := maxvalue( newBparam, 0 ); 
    newAparam := minvalue(  newAparam, 999 ); 
    newBparam := minvalue( newBparam, 999 ); 
    
    if ( newAparam > newBparam ) 
    {
      newAparam := newBparam; 
    }
    
    this.ThreadAParameter( newAparam ); 
    this.ThreadBParameter( newBparam );
  *]
  InterfaceProperties { Accessibility: 'Module' }
}