File size: 7,060 Bytes
6571e75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import os
import yaml

#Define a function that creates a list of all the files in the folder. We will use this for different things.
def create_list_of_files(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for filename in files:
            found_files.append(os.path.join(root, filename))

#Define a function that checks for a Project CC. Without this, there cannot be an analysis.
def check_for_project_cc(folder_path):
    found_files = []

    # Walk through the directory
    for root, dirs, files in os.walk(folder_path):
        for filename in files:
            if filename.lower() == 'project_cc.md':
                found_files.append(os.path.join(root, filename))

    # Check the results
    if len(found_files) == 0:
        print(f"We did not find a Project CC in your folder. We cannot run a compliance analysis without a Project CC.")
    elif len(found_files) == 1:
        print(f"We found exactly one Project CC in your folder. Great job!:")
        print(f"  - {found_files[0]}")
        run_compliance_analysis(folder_path + "project_cc.md")
    else:
        print(f"Multiple Project CCs found:")
        for file_path in found_files:
            print(f"  - {file_path}")
        print("We found multiple Project CCs in your folder. There should only be one Project CC per project.")

def run_compliance_analysis(project_cc)):

    # Load the Project CC's YAML file. This will be our starting point. 
    with open(project_cc, 'r') as file:
        project_cc_yaml = yaml.safe_load(file)

    # Check if the Act does not apply to the project, either because it is not on the EU market or falls into an exception
    
    # Check for prohibited practices -- these are by default non-compliant 

    # Iterate through values of the second-level keys of prohibited_ai_practice_status
    for key, value in project_cc_yaml['prohibited_ai_practice_status']:
        if value:  # This condition will be met whereever a prohibited practice exists 
            print(f"You have a prohibited practice and are non-compliant with the Act")
            break
    else:
        print("No prohibited practices found. That's good...")

    # Check if the key that indicates it is an AI system is present and if its value is true
    if 'AI project is a machine-based system that is designed to operate with varying levels of autonomy and that may exhibit adaptiveness after deployment, and that, for explicit or implicit objectives, infers, from the input it receives, how to generate outputs such as predictions, content, recommendations, or decisions that can influence physical or virtual environments' in projec_cc_yaml and project_cc_yaml['AI project is a machine-based system that is designed to operate with varying levels of autonomy and that may exhibit adaptiveness after deployment, and that, for explicit or implicit objectives, infers, from the input it receives, how to generate outputs such as predictions, content, recommendations, or decisions that can influence physical or virtual environments'] == True:
        print("The project is an AI system.")

        #iterate through all of the 

        all_true = True
        for key in secondary_keys:
            if key in secondary_data and secondary_data[key] == True:
                print(f"The key '{key}' is True in the secondary file.")
            else:
                print(f"The key '{key}' is not True in the secondary file.")
                all_true = False
        
        if all_true:
            print("All specified keys in the secondary file are True.")
        else:
            print("Not all specified keys in the secondary file are True.")
    else:
        print(f"The key '{main_key}' is not True in the main file.")


def check_if_within_scope(project_cc):
    within_scope = None
    if project_cc[ai_project_owner_role][provider_status][value] == True and (project_cc[ai_system_status][ai_system_status][value] == True and (project_cc[eu_market_status][placed_on_market_status][value] == True or project_cc[eu_market_status][put_into_service_status][value] == True)) or (project_cc[gpai_model_status][gpai_model_status][value] == True and (project_cc[eu_market_status][placed_on_market_status][value] == True)):   # Article 2.1(a)
        return True
    if project_cc[ai_project_owner_role][deployer_status][value] == True and project_cc[ai_project_owner_role][eu_location_status][value] == True: # Article 2.1(b)
        return True
    if (project_cc[ai_project_owner_role][provider_status][value] == True or project_cc[ai_project_owner_role][deployer_status][value]== True) and (project_cc[ai_system_status][ai_system_status][value] == True and project_cc[ai_project_owner_role][eu_location_status][value] == True and project_cc[ai_project_owner_role][output_status][value] == True): # Article 2.1(c)
        return True
    if (project_cc[ai_project_owner_role][importer_status][value] == True or project_cc[ai_project_owner_role][distributor_status][value] == True) and project_cc[ai_system_status][ai_system_status][value] == True: # Article 2.1(d)
        return True
    if project_cc[ai_project_owner_role][product_manufacturer_status][value] == True and project_cc[ai_system_status][ai_system_status][value] == True and ((project_cc[eu_market_status][placed_on_market_status][value] == True or project_cc[eu_market_status][put_into_service_status][value] == True)): # Article 2.1(e)
        return True
    else   
        return False

def check_data_ccs(folder_path):

    for filename in os.listdir(folder_path):
        # Check if the search word is in the filename
        if "model_cc.md" in filename.lower():
            # Construct the full file path
            file_path = os.path.join(folder_path, filename)
            
            # Process the file
            process_file(file_path)


def check_all_true(file_path):
        # Load the YAML file
    with open(project_cc, 'r') as file:
        data = yaml.safe_load(file)
    
    # Iterate through top-level keys
    for top_key, top_value in data.items():
        if isinstance(top_value, dict):
            # Iterate through second-level keys
            for second_key, second_value in top_value.items():
                if not second_value:
                    print("You are non-compliant with the Act")
                    break
            else:
                print("No problems here")



# Example usage
main_file = 'main.yaml'
secondary_file = 'secondary.yaml'
main_key = 'data_and_data_governance'
secondary_keys = [
    'Training data is relevant',
    'Training data is sufficiently representative',
    'Training data is, to the best extent possible, free of errors'
]

check_yaml_values(main_file, secondary_file, main_key, secondary_keys)


def main():
    # Prompt the user to enter a filename
    file_path = input("Please enter a file path to the folder containing all your AI project's Compliance Cards: ")

    # Call the function with the entered filename
    check_for_project_cc(file_path)

if __name__ == "__main__":
    main()