572 lines
16 KiB
Python
572 lines
16 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""Functions to perform conversions between the different Confidence scales.
|
|
As specified in STIX™ Version 2.1. Part 1: STIX Core Concepts - Appendix B"""
|
|
|
|
|
|
def none_low_med_high_to_value(scale_value):
|
|
"""
|
|
This method will transform a string value from the None / Low / Med /
|
|
High scale to its confidence integer representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: None, Low, Med, High to STIX Confidence
|
|
:header-rows: 1
|
|
|
|
* - None/ Low/ Med/ High
|
|
- STIX Confidence Value
|
|
* - Not Specified
|
|
- Not Specified
|
|
* - None
|
|
- 0
|
|
* - Low
|
|
- 15
|
|
* - Med
|
|
- 50
|
|
* - High
|
|
- 85
|
|
|
|
Args:
|
|
scale_value (str): A string value from the scale. Accepted strings are
|
|
"None", "Low", "Med" and "High". Argument is case sensitive.
|
|
|
|
Returns:
|
|
int: The numerical representation corresponding to values in the
|
|
None / Low / Med / High scale.
|
|
|
|
Raises:
|
|
ValueError: If `scale_value` is not within the accepted strings.
|
|
"""
|
|
if scale_value == 'None':
|
|
return 0
|
|
elif scale_value == 'Low':
|
|
return 15
|
|
elif scale_value == 'Med':
|
|
return 50
|
|
elif scale_value == 'High':
|
|
return 85
|
|
else:
|
|
raise ValueError("STIX Confidence value cannot be determined for %s" % scale_value)
|
|
|
|
|
|
def value_to_none_low_medium_high(confidence_value):
|
|
"""
|
|
This method will transform an integer value into the None / Low / Med /
|
|
High scale string representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: STIX Confidence to None, Low, Med, High
|
|
:header-rows: 1
|
|
|
|
* - Range of Values
|
|
- None/ Low/ Med/ High
|
|
* - 0
|
|
- None
|
|
* - 1-29
|
|
- Low
|
|
* - 30-69
|
|
- Med
|
|
* - 70-100
|
|
- High
|
|
|
|
Args:
|
|
confidence_value (int): An integer value between 0 and 100.
|
|
|
|
Returns:
|
|
str: A string corresponding to the None / Low / Med / High scale.
|
|
|
|
Raises:
|
|
ValueError: If `confidence_value` is out of bounds.
|
|
|
|
"""
|
|
if confidence_value == 0:
|
|
return 'None'
|
|
elif 29 >= confidence_value >= 1:
|
|
return 'Low'
|
|
elif 69 >= confidence_value >= 30:
|
|
return 'Med'
|
|
elif 100 >= confidence_value >= 70:
|
|
return 'High'
|
|
else:
|
|
raise ValueError("Range of values out of bounds: %s" % confidence_value)
|
|
|
|
|
|
def zero_ten_to_value(scale_value):
|
|
"""
|
|
This method will transform a string value from the 0-10 scale to its
|
|
confidence integer representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: 0-10 to STIX Confidence
|
|
:header-rows: 1
|
|
|
|
* - 0-10 Scale
|
|
- STIX Confidence Value
|
|
* - 0
|
|
- 0
|
|
* - 1
|
|
- 10
|
|
* - 2
|
|
- 20
|
|
* - 3
|
|
- 30
|
|
* - 4
|
|
- 40
|
|
* - 5
|
|
- 50
|
|
* - 6
|
|
- 60
|
|
* - 7
|
|
- 70
|
|
* - 8
|
|
- 80
|
|
* - 9
|
|
- 90
|
|
* - 10
|
|
- 100
|
|
|
|
Args:
|
|
scale_value (str): A string value from the scale. Accepted strings are "0"
|
|
through "10" inclusive.
|
|
|
|
Returns:
|
|
int: The numerical representation corresponding to values in the 0-10
|
|
scale.
|
|
|
|
Raises:
|
|
ValueError: If `scale_value` is not within the accepted strings.
|
|
|
|
"""
|
|
if scale_value == '0':
|
|
return 0
|
|
elif scale_value == '1':
|
|
return 10
|
|
elif scale_value == '2':
|
|
return 20
|
|
elif scale_value == '3':
|
|
return 30
|
|
elif scale_value == '4':
|
|
return 40
|
|
elif scale_value == '5':
|
|
return 50
|
|
elif scale_value == '6':
|
|
return 60
|
|
elif scale_value == '7':
|
|
return 70
|
|
elif scale_value == '8':
|
|
return 80
|
|
elif scale_value == '9':
|
|
return 90
|
|
elif scale_value == '10':
|
|
return 100
|
|
else:
|
|
raise ValueError("STIX Confidence value cannot be determined for %s" % scale_value)
|
|
|
|
|
|
def value_to_zero_ten(confidence_value):
|
|
"""
|
|
This method will transform an integer value into the 0-10 scale string
|
|
representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: STIX Confidence to 0-10
|
|
:header-rows: 1
|
|
|
|
* - Range of Values
|
|
- 0-10 Scale
|
|
* - 0-4
|
|
- 0
|
|
* - 5-14
|
|
- 1
|
|
* - 15-24
|
|
- 2
|
|
* - 25-34
|
|
- 3
|
|
* - 35-44
|
|
- 4
|
|
* - 45-54
|
|
- 5
|
|
* - 55-64
|
|
- 6
|
|
* - 65-74
|
|
- 7
|
|
* - 75-84
|
|
- 8
|
|
* - 95-94
|
|
- 9
|
|
* - 95-100
|
|
- 10
|
|
|
|
Args:
|
|
confidence_value (int): An integer value between 0 and 100.
|
|
|
|
Returns:
|
|
str: A string corresponding to the 0-10 scale.
|
|
|
|
Raises:
|
|
ValueError: If `confidence_value` is out of bounds.
|
|
|
|
"""
|
|
if 4 >= confidence_value >= 0:
|
|
return '0'
|
|
elif 14 >= confidence_value >= 5:
|
|
return '1'
|
|
elif 24 >= confidence_value >= 15:
|
|
return '2'
|
|
elif 34 >= confidence_value >= 25:
|
|
return '3'
|
|
elif 44 >= confidence_value >= 35:
|
|
return '4'
|
|
elif 54 >= confidence_value >= 45:
|
|
return '5'
|
|
elif 64 >= confidence_value >= 55:
|
|
return '6'
|
|
elif 74 >= confidence_value >= 65:
|
|
return '7'
|
|
elif 84 >= confidence_value >= 75:
|
|
return '8'
|
|
elif 94 >= confidence_value >= 85:
|
|
return '9'
|
|
elif 100 >= confidence_value >= 95:
|
|
return '10'
|
|
else:
|
|
raise ValueError("Range of values out of bounds: %s" % confidence_value)
|
|
|
|
|
|
def admiralty_credibility_to_value(scale_value):
|
|
"""
|
|
This method will transform a string value from the Admiralty Credibility
|
|
scale to its confidence integer representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: Admiralty Credibility Scale to STIX Confidence
|
|
:header-rows: 1
|
|
|
|
* - Admiralty Credibility
|
|
- STIX Confidence Value
|
|
* - 6 - Truth cannot be judged
|
|
- (Not present)
|
|
* - 5 - Improbable
|
|
- 10
|
|
* - 4 - Doubtful
|
|
- 30
|
|
* - 3 - Possibly True
|
|
- 50
|
|
* - 2 - Probably True
|
|
- 70
|
|
* - 1 - Confirmed by other sources
|
|
- 90
|
|
|
|
Args:
|
|
scale_value (str): A string value from the scale. Accepted strings are
|
|
"6 - Truth cannot be judged", "5 - Improbable", "4 - Doubtful",
|
|
"3 - Possibly True", "2 - Probably True" and
|
|
"1 - Confirmed by other sources". Argument is case sensitive.
|
|
|
|
Returns:
|
|
int: The numerical representation corresponding to values in the
|
|
Admiralty Credibility scale.
|
|
|
|
Raises:
|
|
ValueError: If `scale_value` is not within the accepted strings.
|
|
|
|
"""
|
|
if scale_value == '6 - Truth cannot be judged':
|
|
raise ValueError("STIX Confidence value cannot be determined for %s" % scale_value)
|
|
elif scale_value == '5 - Improbable':
|
|
return 10
|
|
elif scale_value == '4 - Doubtful':
|
|
return 30
|
|
elif scale_value == '3 - Possibly True':
|
|
return 50
|
|
elif scale_value == '2 - Probably True':
|
|
return 70
|
|
elif scale_value == '1 - Confirmed by other sources':
|
|
return 90
|
|
else:
|
|
raise ValueError("STIX Confidence value cannot be determined for %s" % scale_value)
|
|
|
|
|
|
def value_to_admiralty_credibility(confidence_value):
|
|
"""
|
|
This method will transform an integer value into the Admiralty Credibility
|
|
scale string representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: STIX Confidence to Admiralty Credibility Scale
|
|
:header-rows: 1
|
|
|
|
* - Range of Values
|
|
- Admiralty Credibility
|
|
* - N/A
|
|
- 6 - Truth cannot be judged
|
|
* - 0-19
|
|
- 5 - Improbable
|
|
* - 20-39
|
|
- 4 - Doubtful
|
|
* - 40-59
|
|
- 3 - Possibly True
|
|
* - 60-79
|
|
- 2 - Probably True
|
|
* - 80-100
|
|
- 1 - Confirmed by other sources
|
|
|
|
Args:
|
|
confidence_value (int): An integer value between 0 and 100.
|
|
|
|
Returns:
|
|
str: A string corresponding to the Admiralty Credibility scale.
|
|
|
|
Raises:
|
|
ValueError: If `confidence_value` is out of bounds.
|
|
|
|
"""
|
|
if 19 >= confidence_value >= 0:
|
|
return '5 - Improbable'
|
|
elif 39 >= confidence_value >= 20:
|
|
return '4 - Doubtful'
|
|
elif 59 >= confidence_value >= 40:
|
|
return '3 - Possibly True'
|
|
elif 79 >= confidence_value >= 60:
|
|
return '2 - Probably True'
|
|
elif 100 >= confidence_value >= 80:
|
|
return '1 - Confirmed by other sources'
|
|
else:
|
|
raise ValueError("Range of values out of bounds: %s" % confidence_value)
|
|
|
|
|
|
def wep_to_value(scale_value):
|
|
"""
|
|
This method will transform a string value from the WEP scale to its
|
|
confidence integer representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: WEP to STIX Confidence
|
|
:header-rows: 1
|
|
|
|
* - WEP
|
|
- STIX Confidence Value
|
|
* - Impossible
|
|
- 0
|
|
* - Highly Unlikely/Almost Certainly Not
|
|
- 10
|
|
* - Unlikely/Probably Not
|
|
- 20
|
|
* - Even Chance
|
|
- 50
|
|
* - Likely/Probable
|
|
- 70
|
|
* - Highly likely/Almost Certain
|
|
- 90
|
|
* - Certain
|
|
- 100
|
|
|
|
Args:
|
|
scale_value (str): A string value from the scale. Accepted strings are
|
|
"Impossible", "Highly Unlikely/Almost Certainly Not",
|
|
"Unlikely/Probably Not", "Even Chance", "Likely/Probable",
|
|
"Highly likely/Almost Certain" and "Certain". Argument is case
|
|
sensitive.
|
|
|
|
Returns:
|
|
int: The numerical representation corresponding to values in the WEP
|
|
scale.
|
|
|
|
Raises:
|
|
ValueError: If `scale_value` is not within the accepted strings.
|
|
|
|
"""
|
|
if scale_value == 'Impossible':
|
|
return 0
|
|
elif scale_value == 'Highly Unlikely/Almost Certainly Not':
|
|
return 10
|
|
elif scale_value == 'Unlikely/Probably Not':
|
|
return 30
|
|
elif scale_value == 'Even Chance':
|
|
return 50
|
|
elif scale_value == 'Likely/Probable':
|
|
return 70
|
|
elif scale_value == 'Highly likely/Almost Certain':
|
|
return 90
|
|
elif scale_value == 'Certain':
|
|
return 100
|
|
else:
|
|
raise ValueError("STIX Confidence value cannot be determined for %s" % scale_value)
|
|
|
|
|
|
def value_to_wep(confidence_value):
|
|
"""
|
|
This method will transform an integer value into the WEP scale string
|
|
representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: STIX Confidence to WEP
|
|
:header-rows: 1
|
|
|
|
* - Range of Values
|
|
- WEP
|
|
* - 0
|
|
- Impossible
|
|
* - 1-19
|
|
- Highly Unlikely/Almost Certainly Not
|
|
* - 20-39
|
|
- Unlikely/Probably Not
|
|
* - 40-59
|
|
- Even Chance
|
|
* - 60-79
|
|
- Likely/Probable
|
|
* - 80-99
|
|
- Highly likely/Almost Certain
|
|
* - 100
|
|
- Certain
|
|
|
|
Args:
|
|
confidence_value (int): An integer value between 0 and 100.
|
|
|
|
Returns:
|
|
str: A string corresponding to the WEP scale.
|
|
|
|
Raises:
|
|
ValueError: If `confidence_value` is out of bounds.
|
|
|
|
"""
|
|
if confidence_value == 0:
|
|
return 'Impossible'
|
|
elif 19 >= confidence_value >= 1:
|
|
return 'Highly Unlikely/Almost Certainly Not'
|
|
elif 39 >= confidence_value >= 20:
|
|
return 'Unlikely/Probably Not'
|
|
elif 59 >= confidence_value >= 40:
|
|
return 'Even Chance'
|
|
elif 79 >= confidence_value >= 60:
|
|
return 'Likely/Probable'
|
|
elif 99 >= confidence_value >= 80:
|
|
return 'Highly likely/Almost Certain'
|
|
elif confidence_value == 100:
|
|
return 'Certain'
|
|
else:
|
|
raise ValueError("Range of values out of bounds: %s" % confidence_value)
|
|
|
|
|
|
def dni_to_value(scale_value):
|
|
"""
|
|
This method will transform a string value from the DNI scale to its
|
|
confidence integer representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: DNI Scale to STIX Confidence
|
|
:header-rows: 1
|
|
|
|
* - DNI Scale
|
|
- STIX Confidence Value
|
|
* - Almost No Chance / Remote
|
|
- 5
|
|
* - Very Unlikely / Highly Improbable
|
|
- 15
|
|
* - Unlikely / Improbable
|
|
- 30
|
|
* - Roughly Even Chance / Roughly Even Odds
|
|
- 50
|
|
* - Likely / Probable
|
|
- 70
|
|
* - Very Likely / Highly Probable
|
|
- 85
|
|
* - Almost Certain / Nearly Certain
|
|
- 95
|
|
|
|
Args:
|
|
scale_value (str): A string value from the scale. Accepted strings are
|
|
"Almost No Chance / Remote", "Very Unlikely / Highly Improbable",
|
|
"Unlikely / Improbable", "Roughly Even Chance / Roughly Even Odds",
|
|
"Likely / Probable", "Very Likely / Highly Probable" and
|
|
"Almost Certain / Nearly Certain". Argument is case sensitive.
|
|
|
|
Returns:
|
|
int: The numerical representation corresponding to values in the DNI
|
|
scale.
|
|
|
|
Raises:
|
|
ValueError: If `scale_value` is not within the accepted strings.
|
|
|
|
"""
|
|
if scale_value == 'Almost No Chance / Remote':
|
|
return 5
|
|
elif scale_value == 'Very Unlikely / Highly Improbable':
|
|
return 15
|
|
elif scale_value == 'Unlikely / Improbable':
|
|
return 30
|
|
elif scale_value == 'Roughly Even Chance / Roughly Even Odds':
|
|
return 50
|
|
elif scale_value == 'Likely / Probable':
|
|
return 70
|
|
elif scale_value == 'Very Likely / Highly Probable':
|
|
return 85
|
|
elif scale_value == 'Almost Certain / Nearly Certain':
|
|
return 95
|
|
else:
|
|
raise ValueError("STIX Confidence value cannot be determined for %s" % scale_value)
|
|
|
|
|
|
def value_to_dni(confidence_value):
|
|
"""
|
|
This method will transform an integer value into the DNI scale string
|
|
representation.
|
|
|
|
The scale for this confidence representation is the following:
|
|
|
|
.. list-table:: STIX Confidence to DNI Scale
|
|
:header-rows: 1
|
|
|
|
* - Range of Values
|
|
- DNI Scale
|
|
* - 0-9
|
|
- Almost No Chance / Remote
|
|
* - 10-19
|
|
- Very Unlikely / Highly Improbable
|
|
* - 20-39
|
|
- Unlikely / Improbable
|
|
* - 40-59
|
|
- Roughly Even Chance / Roughly Even Odds
|
|
* - 60-79
|
|
- Likely / Probable
|
|
* - 80-89
|
|
- Very Likely / Highly Probable
|
|
* - 90-100
|
|
- Almost Certain / Nearly Certain
|
|
|
|
Args:
|
|
confidence_value (int): An integer value between 0 and 100.
|
|
|
|
Returns:
|
|
str: A string corresponding to the DNI scale.
|
|
|
|
Raises:
|
|
ValueError: If `confidence_value` is out of bounds.
|
|
|
|
"""
|
|
if 9 >= confidence_value >= 0:
|
|
return 'Almost No Chance / Remote'
|
|
elif 19 >= confidence_value >= 10:
|
|
return 'Very Unlikely / Highly Improbable'
|
|
elif 39 >= confidence_value >= 20:
|
|
return 'Unlikely / Improbable'
|
|
elif 59 >= confidence_value >= 40:
|
|
return 'Roughly Even Chance / Roughly Even Odds'
|
|
elif 79 >= confidence_value >= 60:
|
|
return 'Likely / Probable'
|
|
elif 89 >= confidence_value >= 80:
|
|
return 'Very Likely / Highly Probable'
|
|
elif 100 >= confidence_value >= 90:
|
|
return 'Almost Certain / Nearly Certain'
|
|
else:
|
|
raise ValueError("Range of values out of bounds: %s" % confidence_value)
|