Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -33,6 +33,109 @@ def get_current_time_in_timezone(timezone: str) -> str:
|
|
| 33 |
except Exception as e:
|
| 34 |
return f"Error fetching time for timezone '{timezone}': {str(e)}"
|
| 35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
final_answer = FinalAnswerTool()
|
| 38 |
|
|
|
|
| 33 |
except Exception as e:
|
| 34 |
return f"Error fetching time for timezone '{timezone}': {str(e)}"
|
| 35 |
|
| 36 |
+
import numpy as np
|
| 37 |
+
|
| 38 |
+
@tool
|
| 39 |
+
def matrix_multiplication(matrix_a: list[list[float]], matrix_b: list[list[float]]) -> list[list[float]]:
|
| 40 |
+
"""计算两个矩阵的乘积。
|
| 41 |
+
|
| 42 |
+
此工具接受两个矩阵(表示为浮点数列表的列表)作为输入,并返回它们的乘积。
|
| 43 |
+
它要求矩阵是有效的乘法(即,第一个矩阵的列数必须等于第二个矩阵的行数)。
|
| 44 |
+
|
| 45 |
+
Args:
|
| 46 |
+
matrix_a: 第一个矩阵,表示为浮点数列表的列表。
|
| 47 |
+
matrix_b: 第二个矩阵,表示为浮点数列表的列表。
|
| 48 |
+
"""
|
| 49 |
+
try:
|
| 50 |
+
# 将列表的列表转换为 numpy 数组以实现高效的矩阵乘法
|
| 51 |
+
np_matrix_a = np.array(matrix_a)
|
| 52 |
+
np_matrix_b = np.array(matrix_b)
|
| 53 |
+
|
| 54 |
+
# 执行矩阵乘法
|
| 55 |
+
result_matrix = np.matmul(np_matrix_a, np_matrix_b)
|
| 56 |
+
|
| 57 |
+
# 将结果转换回列表的列表以符合返回类型
|
| 58 |
+
return result_matrix.tolist()
|
| 59 |
+
except ValueError as e:
|
| 60 |
+
# 处理矩阵维度不兼容导致无法乘法的情况
|
| 61 |
+
raise ValueError(f"矩阵乘法错误:{e}。请确保第一个矩阵的列数等于第二个矩阵的行数。")
|
| 62 |
+
except Exception as e:
|
| 63 |
+
# 捕获任何其他意外错误
|
| 64 |
+
raise Exception(f"矩阵乘法过程中发生意外错误:{e}")
|
| 65 |
+
|
| 66 |
+
import numpy as np
|
| 67 |
+
from decimal import Decimal, getcontext # 用于精确控制小数位数
|
| 68 |
+
|
| 69 |
+
@tool
|
| 70 |
+
def solve_linear_equations(coefficients: list[list[float]], constants: list[float]) -> dict:
|
| 71 |
+
"""求解多元一次线性方程组。
|
| 72 |
+
|
| 73 |
+
此工具接受一个系数矩阵和一个常数向量作为输入,并尝试求解由它们表示的线性方程组。
|
| 74 |
+
方程组的通用形式为 Ax = B,其中 A 是 coefficients,B 是 constants。
|
| 75 |
+
|
| 76 |
+
如果方程组有唯一的解,函数将返回一个字典,其中包含变量名(默认从 x1 开始)和它们对应的解。
|
| 77 |
+
解会以字符串形式表示,对于浮点数保留两位小数。
|
| 78 |
+
|
| 79 |
+
Args:
|
| 80 |
+
coefficients: 系数矩阵,表示为浮点数列表的列表。例如,对于 2x + 3y = 7, x - y = 1,
|
| 81 |
+
系数矩阵为 [[2, 3], [1, -1]]。
|
| 82 |
+
constants: 常数向量,表示为浮点数的列表。例如,对于上述方程组,常数向量为 [7, 1]。
|
| 83 |
+
"""
|
| 84 |
+
try:
|
| 85 |
+
np_coefficients = np.array(coefficients)
|
| 86 |
+
np_constants = np.array(constants)
|
| 87 |
+
|
| 88 |
+
# 检查矩阵是否为方阵,以及常数向量的维度是否匹配
|
| 89 |
+
if np_coefficients.shape[0] != np_coefficients.shape[1]:
|
| 90 |
+
raise ValueError("系数矩阵必须是方阵(行数和列数必须相等),才能有唯一解。")
|
| 91 |
+
if np_coefficients.shape[0] != np_constants.shape[0]:
|
| 92 |
+
raise ValueError("系数矩阵的行数必须与常数向量的元素数量相等。")
|
| 93 |
+
|
| 94 |
+
# 使用 numpy 求解线性方程组
|
| 95 |
+
solutions = np.linalg.solve(np_coefficients, np_constants)
|
| 96 |
+
|
| 97 |
+
# 设置 Decimal 的精度,用于控制小数位数
|
| 98 |
+
getcontext().prec = 50 # 设置一个足够大的精度,以防止中间计算的损失
|
| 99 |
+
|
| 100 |
+
results = {}
|
| 101 |
+
for i, sol in enumerate(solutions):
|
| 102 |
+
var_name = f"x_{i+1}"
|
| 103 |
+
|
| 104 |
+
# 使用 Decimal 进行精确的四舍五入到两位小数
|
| 105 |
+
# 先转换为 Decimal,然后使用 quantize 方法
|
| 106 |
+
decimal_sol = Decimal(str(sol)) # 将浮点数转换为字符串再转换为Decimal,以避免浮点数精度问题
|
| 107 |
+
|
| 108 |
+
# 将小数部分量化到小数点后两位
|
| 109 |
+
# ROUND_HALF_UP 是四舍五入到最近的值,如果距离相等,则向上进位
|
| 110 |
+
# '0.01' 表示两位小数的精度
|
| 111 |
+
formatted_sol = decimal_sol.quantize(Decimal('0.01'), rounding='ROUND_HALF_UP')
|
| 112 |
+
|
| 113 |
+
# 检查是否为整数或者浮点数
|
| 114 |
+
if formatted_sol == formatted_sol.to_integral_value():
|
| 115 |
+
# 如果是整数,显示为整数
|
| 116 |
+
results[var_name] = str(int(formatted_sol))
|
| 117 |
+
else:
|
| 118 |
+
# 否则,显示为两位小数
|
| 119 |
+
results[var_name] = str(formatted_sol)
|
| 120 |
+
|
| 121 |
+
# 注意此版本不直接处理“分式”输出。如果需要分式,需要使用类似 SymPy 的符号计算库。
|
| 122 |
+
# 这里对于小数,我们提供格式化为两位小数的字符串。
|
| 123 |
+
|
| 124 |
+
return results
|
| 125 |
+
|
| 126 |
+
except np.linalg.LinAlgError:
|
| 127 |
+
# 捕获方程组无解或有无穷多解的情况
|
| 128 |
+
raise ValueError("方程组无唯一解(可能无解或有无穷多解)。")
|
| 129 |
+
except ValueError as e:
|
| 130 |
+
# 捕获因输入维度不匹配或其他问题引起的 ValueError
|
| 131 |
+
raise ValueError(f"输入错误:{e}")
|
| 132 |
+
except Exception as e:
|
| 133 |
+
# 捕获其他所有意外错误
|
| 134 |
+
raise Exception(f"求解线性方程组时发生意外错���:{e}")
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
|
| 138 |
+
|
| 139 |
|
| 140 |
final_answer = FinalAnswerTool()
|
| 141 |
|