• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

WISDEM / WEIS / 12283078613

11 Dec 2024 06:59PM UTC coverage: 78.249% (-0.6%) from 78.802%
12283078613

Pull #308

github

dzalkind
Merge remote-tracking branch 'origin/DLC_RefactorCaseInputs' into DLC_RefactorCaseInputs
Pull Request #308: DLC Generation - Refactor and New Cases

446 of 665 new or added lines in 9 files covered. (67.07%)

3 existing lines in 3 files now uncovered.

21416 of 27369 relevant lines covered (78.25%)

0.78 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.17
/weis/aeroelasticse/CaseGen_General.py
1
import os, itertools
1✔
2
import numpy as np
1✔
3
from weis.aeroelasticse.FileTools import save_yaml
1✔
4

5
def save_case_matrix(matrix_out, change_vars, dir_matrix, filename_ext=''):
1✔
6
    # save matrix file
7
    if type(change_vars[0]) is tuple:
1✔
8
        n_header_lines = len(change_vars[0])
1✔
9
    else:
10
        change_vars = [(var,) for var in change_vars]
×
11
        n_header_lines = 1
×
12

13
    n_cases = np.shape(matrix_out)[0]
1✔
14
    matrix_out = np.hstack((np.asarray([[i] for i in range(n_cases)]), matrix_out))
1✔
15

16
    change_vars = [('Case_ID',)+('',)*(n_header_lines-1)] + change_vars
1✔
17
    # col_len = [max([len(val) for val in matrix_out[:,j]] + [len(change_vars[j][0]), len(change_vars[j][1])]) for j in range(len(change_vars))]
18
    col_len = [max([len(str(val)) for val in matrix_out[:,j]] + [len(change_vars[j][header_i]) for header_i in range(n_header_lines)]) for j in range(len(change_vars))]
1✔
19

20
    text_out = []
1✔
21
    for header_i in range(n_header_lines):
1✔
22
        text_out.append(''.join([val.center(col+2) for val, col in zip([var[header_i] for var in change_vars], col_len)])+'\n')
1✔
23

24
    for row in matrix_out:
1✔
25
        row_str = ''
1✔
26
        for val, col in zip(row, col_len):
1✔
27
            if val is not str:
1✔
28
                val = str(val)
1✔
29
            row_str += val.center(col+2)
1✔
30
        row_str += '\n'
1✔
31
        text_out.append(row_str)
1✔
32

33
    if not os.path.exists(dir_matrix):
1✔
34
        os.makedirs(dir_matrix)
1✔
35
    ofh = open(os.path.join(dir_matrix,f'case_matrix{filename_ext}.txt'),'w')
1✔
36
    for row in text_out:
1✔
37
        ofh.write(row)
1✔
38
    ofh.close()
1✔
39

40
def save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_names, filename_ext=''):
1✔
41

42
    matrix_out_yaml = {}
1✔
43
    for var in change_vars:
1✔
44
        matrix_out_yaml[var] = []
1✔
45
    matrix_out_yaml['Case_ID'] = []
1✔
46
    matrix_out_yaml['Case_Name'] = []
1✔
47

48
    for i, row in enumerate(matrix_out):
1✔
49
        matrix_out_yaml['Case_ID'].append(i)
1✔
50
        matrix_out_yaml['Case_Name'].append(case_names[i])
1✔
51
        for val, var in zip(row, change_vars):
1✔
52
            if type(val) is list:
1✔
53
                if len(val) == 1:
×
54
                    val = val[0]
×
55
            if type(val) in [np.float32, np.float64, np.single, np.double, np.longdouble]:
1✔
56
                val = float(val)
×
57
            elif type(val) in [np.int8, np.int16, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64, np.intc, np.uintc, np.uint]:
1✔
58
                val = int(val)
×
59
            elif type(val) in [np.array, np.ndarray]:
1✔
60
                val = val.tolist()
×
61
            elif type(val) in [np.str_]:
1✔
62
                val = str(val)
1✔
63
            # elif len(val) > 0:
64
            #     val = val.tolist()
65
            matrix_out_yaml[var].append(val)
1✔
66

67
    if not os.path.exists(dir_matrix):
1✔
68
        os.makedirs(dir_matrix)
×
69

70
    save_yaml(dir_matrix, f'case_matrix{filename_ext}.yaml', matrix_out_yaml)
1✔
71

72
def case_naming(n_cases, namebase=None):
1✔
73
    # case naming
74
    case_name = [('%d'%i).zfill(len('%d'%(n_cases-1))) for i in range(n_cases)]
1✔
75
    if namebase:
1✔
76
        case_name = [namebase+'_'+caseid for caseid in case_name]
1✔
77

78
    return case_name
1✔
79

80
def convert_str(val):
1✔
81
    def try_type(val, data_type):
1✔
82
        try:
1✔
83
            data_type(val)
1✔
84
            return True
1✔
85
        except:
1✔
86
            return False
1✔
87
#        return isinstance(val, data_type)  ### this doesn't work b/c of numpy data types; they're not instances of base types
88
    def try_list(val):
1✔
89
        try:
×
90
            val[0]
×
91
            return True
×
92
        except:
×
93
            return False
×
94

95
    if try_type(val, int) and int(val) == float(val):
1✔
96
        return int(val)
1✔
97
    elif try_type(val, float):
1✔
98
        return float(val)
1✔
99
    elif val=='True':
1✔
100
        return True
1✔
101
    elif val=='False':
1✔
102
        return False
1✔
103
    elif try_type(val,str):
1✔
104
        return str(val)
1✔
105
    # elif type(val)!=str and try_list(val):
106
    #     return ", ".join(['{:}'.format(i) for i in val])
107
    else:
UNCOV
108
        return val
×
109

110
def CaseGen_General(case_inputs, dir_matrix='', namebase='', save_matrix=True, filename_ext=''):
1✔
111
    """ Cartesian product to enumerate over all combinations of set of variables that are changed together"""
112

113
    # put case dict into lists
114
    change_vars = sorted(case_inputs.keys())
1✔
115
    change_vals = [case_inputs[var]['vals'] for var in change_vars]
1✔
116
    change_group = [case_inputs[var]['group'] for var in change_vars]
1✔
117

118
    # find number of groups and length of groups
119
    group_set = list(set(change_group))
1✔
120
    group_len = [len(change_vals[change_group.index(i)]) for i in group_set]
1✔
121

122
    # case matrix, as indices
123
    group_idx = [range(n) for n in group_len]
1✔
124
    matrix_idx = list(itertools.product(*group_idx))
1✔
125

126
    # index of each group
127
    matrix_group_idx = [np.where([group_i == group_j for group_j in change_group])[0].tolist() for group_i in group_set]
1✔
128

129
    # build final matrix of variable values
130
    matrix_out = []
1✔
131
    for i, row in enumerate(matrix_idx):
1✔
132
        row_out = [None]*len(change_vars)
1✔
133
        for j, val in enumerate(row):
1✔
134
            for g in matrix_group_idx[j]:
1✔
135
                row_out[g] = change_vals[g][val]
1✔
136
        matrix_out.append(row_out)
1✔
137
    try:
1✔
138
        matrix_out = np.asarray(matrix_out, dtype=str)
1✔
139
    except:
×
140
        matrix_out = np.asarray(matrix_out)
×
141
    n_cases = np.shape(matrix_out)[0]
1✔
142

143
    # case naming
144
    case_name = case_naming(n_cases, namebase=namebase)
1✔
145
    
146
    # Save case matrix
147
    if save_matrix:
1✔
148
        if not dir_matrix:
1✔
149
            dir_matrix = os.getcwd()
×
150
        try:
1✔
151
            save_case_matrix(matrix_out, change_vars, dir_matrix, filename_ext=filename_ext)
1✔
152
            save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_name, filename_ext=filename_ext)
1✔
153
        except: 
×
NEW
154
            save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_name, filename_ext=filename_ext)
×
155

156
    case_list = []
1✔
157
    for i in range(n_cases):
1✔
158
        case_list_i = {}
1✔
159
        for j, var in enumerate(change_vars):
1✔
160
            case_list_i[var] = convert_str(matrix_out[i,j])
1✔
161
        case_list.append(case_list_i)
1✔
162

163

164
    return case_list, case_name
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc