Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
26af71d
Add metrics script
lobrien6 Sep 20, 2024
0525e2d
Merge branch 'main' of https://github.com/lobrien6/ComplexLA
lobrien6 Sep 20, 2024
e7e26c3
Initial commit of all notebooks, scripts, and files
lobrien6 Sep 20, 2024
3f169cf
Delete Code/Files directory
lobrien6 Sep 20, 2024
7a4ed57
Add function to create arrays and find largest truth values
lobrien6 Sep 27, 2024
0d02e89
Merge branch 'main' of https://github.com/lobrien6/ComplexLA
lobrien6 Oct 11, 2024
97c6a3c
Delete Code/notebooks directory
lobrien6 Oct 11, 2024
8e25783
Delete misnamed folder
lobrien6 Oct 11, 2024
e6aee95
Add method to calculate metrics for precision and accuracy of Fermat …
lobrien6 Oct 11, 2024
2001c04
Merge branch 'main' of https://github.com/lobrien6/ComplexLA
lobrien6 Oct 11, 2024
29be88c
Calculate bias of Fermat potential differences and plot standard erro…
lobrien6 Oct 11, 2024
1d84fb6
Simulate one lens with substructure
lobrien6 Nov 15, 2024
cbf3072
Adding method to generate a sample of 100 lenses with and without sub…
lobrien6 Nov 18, 2024
3c5f8ef
Add docstrings
lobrien6 Dec 6, 2024
26ec302
Add method to calculuate residuals of WoS and WS, Remove single lens …
lobrien6 Dec 6, 2024
1b2df32
Calculate metrics for parameter predictions of the WoS and WS test se…
lobrien6 Jan 17, 2025
65a277f
Calculate fermat potential differences in image positions for WoS and…
lobrien6 Feb 2, 2025
6225a06
Remove unnecessary path definitions and print statements; general cle…
lobrien6 Jun 24, 2025
0bbb636
Change main deflector module call
lobrien6 Jun 24, 2025
c4bb674
Plotting additional images and residuals. Adding documentation. Remov…
lobrien6 Jun 25, 2025
b54fb78
Add index parameter to param_names array. Simplify parameter catalog …
lobrien6 Jun 25, 2025
d3f2cec
Remove unnecessary definition
lobrien6 Jun 25, 2025
1d4aff8
Fix lens parameters generation. Remove Fermat potential calculations …
lobrien6 Jun 25, 2025
b99c1e2
Remove unnecessary imports and path definitions
lobrien6 Jun 25, 2025
767be01
Rename config files to work towards a generalized config file calling…
lobrien6 Jun 25, 2025
c4bf445
Change sersic light distribution scale to 1. Declare sigma_sub distri…
lobrien6 Jun 25, 2025
4296a2e
Generalize to one function. Remove unnecessary path definitions
lobrien6 Jun 25, 2025
21f6824
Generalize perturber functions to one function
lobrien6 Jun 25, 2025
4801863
Rename config files to generalize to one config per test set
lobrien6 Jun 25, 2025
f1bc7dd
Delete unused notebooks
lobrien6 Jun 25, 2025
78f8514
Remove axis from lenstronomy model. Fix incorrect variable names. Plo…
lobrien6 Aug 1, 2025
b472f05
Restructure of folder organization
lobrien6 Sep 5, 2025
c6fe8f6
Deleting deprecated file structure
lobrien6 Sep 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
257 changes: 257 additions & 0 deletions complexLA/Analysis/metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,257 @@
import numpy as np
from statistics import median

#def single function for general case of n situations
def PerturberSample(sample_num, y_test, y_pred_wop, y_pred_wp, y_pred_wpl, std_pred_wop, std_pred_wp, std_pred_wpl):
""" Calculuate the median error, median absolute error, and the median standard deviation for the Wop, WP, and WPL cases.

Parameters
----------
sample_num : int
Number of mock sample lenses.
y_test : np.array
Known values of the lens parameters.
y_pred_wop, y_pred_wp, y_pred_wpl : np.array
Predicted values of the lens parameters for the wop, wp, and wpl cases.
std_pred_wop, std_pred_wp, std_pred_wpl : np.array
Standard deviations of the lens parameter predicted distributions.

Returns
-------

"""

##ME - Median Error
param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_wop[i]-y_test[i])
#print(param_diff)
sum=0
for i in param_diff:
#print(i)
sum=sum+i
mean=(sum/(sample_num-1))
ME_wop = list(np.round(mean,2))
#print(ME_wop)

param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_wp[i]-y_test[i])
sum=0
for i in param_diff:
sum=sum+i
mean=(sum/(sample_num-1))
ME_wp = list(np.round(mean,2))
#print(ME_wp)

param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_wpl[i]-y_test[i])
sum=0
for i in param_diff:
sum=sum+i
mean=(sum/(sample_num-1))
ME_wpl = list(np.round(mean,2))
#print(ME_wpl)

##MAE - Median Absolute Error
param_diff_abs=[]
for i in range(sample_num-1):
param_diff_abs.append(abs(y_pred_wop[i]-y_test[i]))
#print(param_diff_abs)
sum=0
for i in param_diff_abs:
sum=sum+i
mean=(sum/(sample_num-1))
MAE_wop = list(np.round(mean,2))
#print(MAE_wop)

param_diff_abs=[]
for i in range(sample_num-1):
param_diff_abs.append(abs(y_pred_wp[i]-y_test[i]))
sum=0
for i in param_diff_abs:
sum=sum+i
mean=(sum/(sample_num-1))
MAE_wp = list(np.round(mean,2))
#print(MAE_wp)

param_diff_abs=[]
for i in range(sample_num-1):
param_diff_abs.append(abs(y_pred_wpl[i]-y_test[i]))
sum=0
for i in param_diff_abs:
sum=sum+i
mean=(sum/(sample_num-1))
MAE_wpl = list(np.round(mean,2))
#print(MAE_wpl)

##Msigma - Median Standard Deviation
#print(std_pred_wop)
sum=0
for i in std_pred_wop:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_wop = list(np.round(mean,2))
#print(Mstd_wop)

##Msigma - Median Standard Deviation
sum=0
for i in std_pred_wp:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_wp = list(np.round(mean,2))
#print(Mstd_wp)

##Msigma - Median Standard Deviation
sum=0
for i in std_pred_wpl:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_wpl = list(np.round(mean,2))
#print(Mstd_wpl)

metrics = [ME_wop, ME_wp, ME_wpl, MAE_wop, MAE_wp, MAE_wpl, Mstd_wop, Mstd_wp, Mstd_wpl]

return metrics

def PerturberSampleTrunc(sample_num, y_test, y_pred_wop, y_pred_wp, y_pred_wpl, std_pred_wop, std_pred_wp, std_pred_wpl):

#WoP
param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_wop[i]-y_test[i])
#print(param_diff)

##ME - Mean Error
sum=0
for i in param_diff:
#print(i)
sum=sum+i
mean=(sum/(sample_num-1))
ME_wop = list(np.round(mean,2))
#print(ME_wop)

##MDE - Median Error
#for i in range(param_num):
# param_i = []
#for row in param_diff:
# for i in range(param_num):
# param_i.append(row[i])
#for i in param_num:
# print(param_i)


#Median_wop = list(np.round(median(param_diff),2))

#WP
param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_wp[i]-y_test[i])
#print(param_diff)
##ME - Mean Error
sum=0
for i in param_diff:
#print(i)
sum=sum+i
mean=(sum/(sample_num-1))
ME_wp = list(np.round(mean,2))

#WPL
param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_wpl[i]-y_test[i])
##ME - Mean Error
sum=0
for i in param_diff:
sum=sum+i
mean=(sum/(sample_num-1))
ME_wpl = list(np.round(mean,2))
#print(ME_wpl)
##MDE - Median Error
#Median_wpl = list(np.round(median(param_diff),2))

##Msigma - Mean Standard Deviation
sum=0
for i in std_pred_wop:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_wop = list(np.round(mean,2))
#print(Mstd_wop)
##MDsigma - Median Standard Deviation
#MDstd_wop = list(np.round(median(std_pred_wop),2))

##Msigma - Mean Standard Deviation
sum=0
for i in std_pred_wp:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_wp = list(np.round(mean,2))
#print(Mstd_wp)
##MDsigma - Median Standard Deviation
#MDstd_wp = list(np.round(median(std_pred_wp),2))

##Msigma - Median Standard Deviation
sum=0
for i in std_pred_wpl:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_wpl = list(np.round(mean,2))
#print(Mstd_wpl)
##MDsigma - Median Standard Deviation
#MDstd_wpl = list(np.round(median(std_pred_wpl),2))

mean_metrics = [ME_wop, ME_wp, ME_wpl, Mstd_wop, Mstd_wp, Mstd_wpl]
#median_metrics = [Median_wop, Median_wpl, MDstd_wop, MDstd_wpl]

return mean_metrics

def PerturberSampleTrunc_Substructure(sample_num, y_test, y_pred_WoS, y_pred_WS, std_pred_WoS, std_pred_WS):

#WoS
param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_WoS[i]-y_test[i])
#print(param_diff)

##ME - Mean Error
sum=0
for i in param_diff:
sum=sum+i
mean=(sum/(sample_num-1))
ME_WoS = list(np.round(mean,2))
#print(ME_wop)

#WS
param_diff=[]
for i in range(sample_num-1):
param_diff.append(y_pred_WS[i]-y_test[i])
#print(param_diff)

##ME - Mean Error
sum=0
for i in param_diff:
sum=sum+i
mean=(sum/(sample_num-1))
ME_WS = list(np.round(mean,2))

##Msigma - Mean Standard Deviation
sum=0
for i in std_pred_WoS:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_WoS = list(np.round(mean,2))
#print(Mstd_wop)

##Msigma - Mean Standard Deviation
sum=0
for i in std_pred_WS:
sum=sum+i
mean=(sum/(sample_num-1))
Mstd_WS = list(np.round(mean,2))
#print(Mstd_wp)

mean_metrics = [ME_WoS, ME_WS, Mstd_WoS, Mstd_WS]
#median_metrics = [Median_wop, Median_wpl, MDstd_wop, MDstd_wpl]

return mean_metrics
59 changes: 59 additions & 0 deletions complexLA/Analysis/network_predictions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import os
import sys
from deep_lens_modeling import network_predictions
import time

#define a function for a general case of n situations
def Predictions(config_file, image_folder, sample_num=1):
""" Generates network predictions from images

Parameters
----------
config_file : str
File location for the config file being used.
image_path : str
Image folder location where the images will be stored.
sample_num : int
Number of mock sample lenses. Default 1

Returns
-------
y_test_wop : float
Truth values of lens parameters.
y_pred_wop, y_pred_wp, y_pred_wpl : float
Prediction values for the wop, wp, and wpl cases.
std_pred_wop, std_pred_wp, std_pred_wpl : float
Standard deviation of the prediction values for the wop, wp and wpl cases.
prec_pred_wop, prec_pred_wp, prec_pred_wpl : array
Predicted precision matrix for the wop, wp and wpl cases.

"""

#Generating the images
import subprocess
command = f'python /Users/Logan/AppData/Local/Programs/Python/Python312/Lib/site-packages/paltas/paltas/generate.py {config_file} {image_folder} --n {sample_num} --tf_record'
print(f"Running: {command}")
result = subprocess.run(command, shell=True, capture_output=True, text=True)

print("STDOUT:", result.stdout)
print("STDERR:", result.stderr)
print("Exit code:", result.returncode)
#os.system(f'python /Users/Logan/AppData/Local/Programs/Python/Python312/Lib/site-packages/paltas/paltas/generate.py {config_file} {image_folder} --n {sample_num-1} --tf_record')

# Compute predictions for test sets
path_to_weights = '../docs/xresnet34_068--14.58.h5'
path_to_norms = '../docs/norms.csv'

learning_params = ['main_deflector_parameters_theta_E','main_deflector_parameters_gamma1',
'main_deflector_parameters_gamma2','main_deflector_parameters_gamma',
'main_deflector_parameters_e1','main_deflector_parameters_e2',
'main_deflector_parameters_center_x','main_deflector_parameters_center_y',
'source_parameters_center_x','source_parameters_center_y']

model_predictions = network_predictions.NetworkPredictions(path_to_weights,path_to_norms,
learning_params,loss_type='diag',model_type='xresnet34',norm_type='lognorm')

# generate network predictions
y_test, y_pred, std_pred, prec_pred = model_predictions.gen_network_predictions(image_folder)

return y_test, y_pred, std_pred, prec_pred
Loading