goad-py 0.5.4__tar.gz → 0.5.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of goad-py might be problematic. Click here for more details.

Files changed (136) hide show
  1. {goad_py-0.5.4 → goad_py-0.5.6}/PKG-INFO +1 -1
  2. goad_py-0.5.6/goad-py/examples/direct/multiproblem_phips_example.py +163 -0
  3. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/09_phips_convergence.py +0 -3
  4. {goad_py-0.5.4 → goad_py-0.5.6}/pyproject.toml +1 -1
  5. {goad_py-0.5.4 → goad_py-0.5.6}/.github/workflows/python.yml +0 -0
  6. {goad_py-0.5.4 → goad_py-0.5.6}/.github/workflows/rust.yml +0 -0
  7. {goad_py-0.5.4 → goad_py-0.5.6}/.gitignore +0 -0
  8. {goad_py-0.5.4 → goad_py-0.5.6}/Cargo.lock +0 -0
  9. {goad_py-0.5.4 → goad_py-0.5.6}/Cargo.toml +0 -0
  10. {goad_py-0.5.4 → goad_py-0.5.6}/LICENSE +0 -0
  11. {goad_py-0.5.4 → goad_py-0.5.6}/README-python.md +0 -0
  12. {goad_py-0.5.4 → goad_py-0.5.6}/README.md +0 -0
  13. {goad_py-0.5.4 → goad_py-0.5.6}/blender/addon/__init__.py +0 -0
  14. {goad_py-0.5.4 → goad_py-0.5.6}/blender/addon/goad_py/__init__.py +0 -0
  15. {goad_py-0.5.4 → goad_py-0.5.6}/blender/addon.zip +0 -0
  16. {goad_py-0.5.4 → goad_py-0.5.6}/blender/build.sh +0 -0
  17. {goad_py-0.5.4 → goad_py-0.5.6}/blender/dev.blend +0 -0
  18. {goad_py-0.5.4 → goad_py-0.5.6}/config/default.toml +0 -0
  19. {goad_py-0.5.4 → goad_py-0.5.6}/config_editor.sh +0 -0
  20. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/8col.obj +0 -0
  21. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/clip_test.obj +0 -0
  22. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/concave1.obj +0 -0
  23. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/concave2.obj +0 -0
  24. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/cone.obj +0 -0
  25. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/cube.obj +0 -0
  26. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/cube2.obj +0 -0
  27. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/cube_inside_cube.obj +0 -0
  28. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/cube_inside_hex.obj +0 -0
  29. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/cube_inside_ico.obj +0 -0
  30. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/cubes.obj +0 -0
  31. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex.obj +0 -0
  32. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex2.obj +0 -0
  33. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex3.obj +0 -0
  34. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex4.obj +0 -0
  35. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex5.obj +0 -0
  36. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex6.obj +0 -0
  37. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex7.obj +0 -0
  38. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex_20_30_30.obj +0 -0
  39. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex_distort.obj +0 -0
  40. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex_hollow.obj +0 -0
  41. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/hex_indented.obj +0 -0
  42. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/icosphere1.obj +0 -0
  43. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/multiple.obj +0 -0
  44. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/multiple2.obj +0 -0
  45. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/multiple3.obj +0 -0
  46. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/octo.obj +0 -0
  47. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/octo2.obj +0 -0
  48. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/para.obj +0 -0
  49. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/para_rough1.obj +0 -0
  50. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/plane_xy.obj +0 -0
  51. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/plane_yz.obj +0 -0
  52. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/plate.obj +0 -0
  53. {goad_py-0.5.4 → goad_py-0.5.6}/examples/data/plate_distort.obj +0 -0
  54. {goad_py-0.5.4 → goad_py-0.5.6}/examples/multi-problem.rs +0 -0
  55. {goad_py-0.5.4 → goad_py-0.5.6}/examples/problem-diff.rs +0 -0
  56. {goad_py-0.5.4 → goad_py-0.5.6}/examples/problem1.rs +0 -0
  57. {goad_py-0.5.4 → goad_py-0.5.6}/examples/simplify.rs +0 -0
  58. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/.gitignore +0 -0
  59. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/CLAUDE.md +0 -0
  60. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/Cargo.toml +0 -0
  61. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/DISTRIBUTION.md +0 -0
  62. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/README-python.md +0 -0
  63. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/UNIFIED_API.md +0 -0
  64. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/UNIFIED_API_SUMMARY.md +0 -0
  65. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/build_and_test.sh +0 -0
  66. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/build_wheels_local.sh +0 -0
  67. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/convergence.py +0 -0
  68. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/README.md +0 -0
  69. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/README.md +0 -0
  70. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/backscatter_convergence_example.py +0 -0
  71. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/convergence_example.py +0 -0
  72. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/ensemble_example.py +0 -0
  73. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/multiproblem_example.py +0 -0
  74. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/phips_convergence_example.py +0 -0
  75. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/phips_ensemble_convergence_example.py +0 -0
  76. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/s11_convergence_example.py +0 -0
  77. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/direct/simple_example.py +0 -0
  78. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/01_simple_asymmetry.py +0 -0
  79. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/02_interval_binning.py +0 -0
  80. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/03_multiple_targets.py +0 -0
  81. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/04_mueller_element.py +0 -0
  82. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/05_backscatter_specific_bin.py +0 -0
  83. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/06_ensemble_convergence.py +0 -0
  84. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/07_advanced_config.py +0 -0
  85. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/08_parameter_sweep.py +0 -0
  86. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/09_phips_convergence_results.json +0 -0
  87. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/examples/unified/README.md +0 -0
  88. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/goad_py.pyi +0 -0
  89. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/plot.ipynb +0 -0
  90. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/publish_test.sh +0 -0
  91. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/python/goad_py/__init__.py +0 -0
  92. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/python/goad_py/convergence.py +0 -0
  93. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/python/goad_py/goad_py.pyi +0 -0
  94. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/python/goad_py/phips_convergence.py +0 -0
  95. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/python/goad_py/unified_convergence.py +0 -0
  96. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/release.sh +0 -0
  97. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/src/lib.rs +0 -0
  98. {goad_py-0.5.4 → goad_py-0.5.6}/goad-py/test_wheels.sh +0 -0
  99. {goad_py-0.5.4 → goad_py-0.5.6}/python/goad_py/__init__.py +0 -0
  100. {goad_py-0.5.4 → goad_py-0.5.6}/python/goad_py/convergence.py +0 -0
  101. {goad_py-0.5.4 → goad_py-0.5.6}/python/goad_py/goad_py.pyi +0 -0
  102. {goad_py-0.5.4 → goad_py-0.5.6}/python/goad_py/phips_convergence.py +0 -0
  103. {goad_py-0.5.4 → goad_py-0.5.6}/python/goad_py/unified_convergence.py +0 -0
  104. {goad_py-0.5.4 → goad_py-0.5.6}/setup.sh +0 -0
  105. {goad_py-0.5.4 → goad_py-0.5.6}/src/_quickstart.rs +0 -0
  106. {goad_py-0.5.4 → goad_py-0.5.6}/src/beam.rs +0 -0
  107. {goad_py-0.5.4 → goad_py-0.5.6}/src/bins.rs +0 -0
  108. {goad_py-0.5.4 → goad_py-0.5.6}/src/clip.rs +0 -0
  109. {goad_py-0.5.4 → goad_py-0.5.6}/src/containment.rs +0 -0
  110. {goad_py-0.5.4 → goad_py-0.5.6}/src/diff.rs +0 -0
  111. {goad_py-0.5.4 → goad_py-0.5.6}/src/distortion.rs +0 -0
  112. {goad_py-0.5.4 → goad_py-0.5.6}/src/field.rs +0 -0
  113. {goad_py-0.5.4 → goad_py-0.5.6}/src/fresnel.rs +0 -0
  114. {goad_py-0.5.4 → goad_py-0.5.6}/src/geom.rs +0 -0
  115. {goad_py-0.5.4 → goad_py-0.5.6}/src/lib.rs +0 -0
  116. {goad_py-0.5.4 → goad_py-0.5.6}/src/main.rs +0 -0
  117. {goad_py-0.5.4 → goad_py-0.5.6}/src/multiproblem.rs +0 -0
  118. {goad_py-0.5.4 → goad_py-0.5.6}/src/orientation.rs +0 -0
  119. {goad_py-0.5.4 → goad_py-0.5.6}/src/output.rs +0 -0
  120. {goad_py-0.5.4 → goad_py-0.5.6}/src/params.rs +0 -0
  121. {goad_py-0.5.4 → goad_py-0.5.6}/src/powers.rs +0 -0
  122. {goad_py-0.5.4 → goad_py-0.5.6}/src/problem.rs +0 -0
  123. {goad_py-0.5.4 → goad_py-0.5.6}/src/result.rs +0 -0
  124. {goad_py-0.5.4 → goad_py-0.5.6}/src/settings/cli.rs +0 -0
  125. {goad_py-0.5.4 → goad_py-0.5.6}/src/settings/constants.rs +0 -0
  126. {goad_py-0.5.4 → goad_py-0.5.6}/src/settings/loading.rs +0 -0
  127. {goad_py-0.5.4 → goad_py-0.5.6}/src/settings/validation.rs +0 -0
  128. {goad_py-0.5.4 → goad_py-0.5.6}/src/settings.rs +0 -0
  129. {goad_py-0.5.4 → goad_py-0.5.6}/src/snell.rs +0 -0
  130. {goad_py-0.5.4 → goad_py-0.5.6}/template/custom_bins.toml +0 -0
  131. {goad_py-0.5.4 → goad_py-0.5.6}/template/goad_pbs.sh +0 -0
  132. {goad_py-0.5.4 → goad_py-0.5.6}/tests/fixed_orientation_tests.rs +0 -0
  133. {goad_py-0.5.4 → goad_py-0.5.6}/tests/helpers.rs +0 -0
  134. {goad_py-0.5.4 → goad_py-0.5.6}/tests/test_data/fixed_hex_30_20_20_mueller_scatgrid +0 -0
  135. {goad_py-0.5.4 → goad_py-0.5.6}/tests/test_data/fixed_hex_30_30_30_mueller_scatgrid +0 -0
  136. {goad_py-0.5.4 → goad_py-0.5.6}/tests/test_data/hex.obj +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: goad-py
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: Topic :: Scientific/Engineering :: Physics
@@ -0,0 +1,163 @@
1
+ """
2
+ Example script demonstrating MultiProblem Python API without config file dependencies.
3
+
4
+ This script shows how to:
5
+ 1. Create binning schemes explicitly
6
+ 2. Create orientation schemes explicitly
7
+ 3. Use Settings with absolute geometry paths
8
+ 4. Use MultiProblem for multi-orientation averaging with no external dependencies
9
+ """
10
+
11
+ import goad_py as goad
12
+ import os
13
+ from pathlib import Path
14
+ import sys
15
+ import toml
16
+
17
+ PHIPS_BINS_FILE = "../../../phips_bins_edges.toml"
18
+
19
+ # Check that PHIPS bins file exists
20
+ phips_bins_path = Path(PHIPS_BINS_FILE)
21
+ if not phips_bins_path.exists():
22
+ print(f"\nError: PHIPS bins file not found at {phips_bins_path}")
23
+ print("Please run phips_detector_angles_edges.py first to generate the file.")
24
+ sys.exit(1)
25
+
26
+ with open(phips_bins_path, "r") as f:
27
+ bins_data = toml.load(f)
28
+
29
+ # Convert to format expected by BinningScheme.custom()
30
+ custom_bins = bins_data["bins"]
31
+ print(f"Loaded {len(custom_bins)} custom bins")
32
+
33
+ # Create binning scheme
34
+ binning = goad.BinningScheme.custom(custom_bins)
35
+
36
+ print("MultiProblem Example - Config-Free API")
37
+ print("=" * 50)
38
+
39
+ # Get absolute path to geometry file
40
+ current_dir = os.path.dirname(os.path.abspath(__file__))
41
+ geom_path = os.path.join(current_dir, "..", "..", "..", "examples", "data", "hex.obj")
42
+ geom_path = os.path.abspath(geom_path)
43
+
44
+ print(f"Using geometry file: {geom_path}")
45
+
46
+ # Example 1: Uniform orientation scheme with custom settings
47
+ print("\n1. Creating MultiProblem with uniform orientations...")
48
+
49
+ # # Create custom binning scheme
50
+ # binning = goad.BinningScheme.simple(181, 181) # 181x181 angular grid
51
+ # print("Created binning scheme: Simple 181x181")
52
+
53
+ # Create uniform orientation (100 random orientations)
54
+ uniform_orientation = goad.create_uniform_orientation(100)
55
+ print("Created uniform orientation: 100 random orientations")
56
+
57
+ # Create settings with all parameters explicit (no config file dependencies)
58
+ settings = goad.Settings(
59
+ geom_path=geom_path,
60
+ wavelength=0.532, # 532nm green laser
61
+ particle_refr_index_re=1.31, # glass refractive index
62
+ particle_refr_index_im=0.0, # no absorption
63
+ medium_refr_index_re=1.0, # air/vacuum
64
+ medium_refr_index_im=0.0,
65
+ orientation=uniform_orientation,
66
+ binning=binning,
67
+ beam_power_threshold=0.005,
68
+ cutoff=0.99,
69
+ max_rec=10,
70
+ max_tir=10,
71
+ )
72
+
73
+ # Create and solve MultiProblem
74
+ print("Creating MultiProblem with uniform orientations...")
75
+ multi_problem = goad.MultiProblem(settings)
76
+ print(f"Number of orientations: {multi_problem.num_orientations}")
77
+
78
+ print("Solving MultiProblem (this averages over all orientations)...")
79
+ multi_problem.py_solve()
80
+
81
+ # Access averaged results
82
+ results = multi_problem.results
83
+ print(
84
+ f"Averaged Mueller matrix shape: {len(results.mueller)}x{len(results.mueller[0])}"
85
+ )
86
+ print(f"Averaged asymmetry parameter: {results.asymmetry}")
87
+
88
+ # Example 2: Discrete orientation scheme with custom binning
89
+ print("\n2. Creating MultiProblem with discrete orientations...")
90
+
91
+ # Create custom binning scheme with higher resolution in forward direction
92
+ interval_binning = goad.BinningScheme.interval(
93
+ thetas=[0.0, 30.0, 180.0], # Split at 30 degrees
94
+ theta_spacings=[1.0, 5.0], # Fine resolution near forward, coarse elsewhere
95
+ phis=[0.0, 360.0], # Full phi range
96
+ phi_spacings=[5.0], # 5 degree phi spacing
97
+ )
98
+ print("Created interval binning scheme")
99
+
100
+ # Create specific Euler angles
101
+ euler1 = goad.Euler(0.0, 0.0, 0.0) # No rotation
102
+ euler2 = goad.Euler(30.0, 30.0, 30.0) # 30 degree rotations
103
+ euler3 = goad.Euler(45.0, 60.0, 90.0) # Mixed rotations
104
+
105
+ # Create discrete orientation scheme
106
+ discrete_orientation = goad.create_discrete_orientation([euler1, euler2, euler3])
107
+ print("Created discrete orientation: 3 specific orientations")
108
+
109
+ # Create settings with discrete orientation and custom binning
110
+ settings2 = goad.Settings(
111
+ geom_path=geom_path,
112
+ wavelength=0.633, # 633nm red laser
113
+ particle_refr_index_re=1.5, # different material
114
+ particle_refr_index_im=0.01, # slight absorption
115
+ orientation=discrete_orientation,
116
+ binning=interval_binning,
117
+ )
118
+
119
+ # Create and solve MultiProblem
120
+ print("Creating MultiProblem with discrete orientations...")
121
+ multi_problem2 = goad.MultiProblem(settings2)
122
+ print(f"Number of orientations: {multi_problem2.num_orientations}")
123
+
124
+ print("Solving MultiProblem with specific orientations...")
125
+ multi_problem2.py_solve()
126
+
127
+ # Access averaged results
128
+ results2 = multi_problem2.results
129
+ print(
130
+ f"Averaged Mueller matrix shape: {len(results2.mueller)}x{len(results2.mueller[0])}"
131
+ )
132
+ print(f"Averaged asymmetry parameter: {results2.asymmetry}")
133
+
134
+ # Example 3: Custom binning with specific angles
135
+ print("\n3. Creating MultiProblem with custom binning...")
136
+
137
+ # Create custom binning scheme with specific angle pairs
138
+ custom_bins = [
139
+ (0.0, 0.0), # Forward scattering
140
+ (10.0, 0.0), # Near-forward
141
+ (30.0, 0.0), # Small angle
142
+ (90.0, 0.0), # Side scattering
143
+ (150.0, 0.0), # Backscattering region
144
+ (180.0, 0.0), # Exact backscattering
145
+ ]
146
+ custom_binning = goad.BinningScheme.custom(custom_bins)
147
+ print(f"Created custom binning with {len(custom_bins)} specific angles")
148
+
149
+ # Simple settings with default values
150
+ settings3 = goad.Settings(
151
+ geom_path=geom_path,
152
+ binning=custom_binning,
153
+ # All other parameters use defaults
154
+ )
155
+
156
+ multi_problem3 = goad.MultiProblem(settings3)
157
+ print(f"Number of orientations: {multi_problem3.num_orientations}")
158
+
159
+ print("Solving MultiProblem with custom binning...")
160
+ multi_problem3.py_solve()
161
+
162
+ results3 = multi_problem3.results
163
+ print(f"Custom binned results: {len(results3.mueller)} angle pairs")
@@ -6,10 +6,7 @@ Demonstrates converging on PHIPS detector bins (all except the first one).
6
6
  PHIPS detectors measure scattering at 20 specific angles from 18° to 170°.
7
7
  """
8
8
 
9
- import sys
10
9
  from pathlib import Path
11
-
12
- sys.path.insert(0, "../../python")
13
10
  import goad_py as goad
14
11
 
15
12
  print("=" * 80)
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "goad-py"
7
- version = "0.5.4"
7
+ version = "0.5.6"
8
8
  description = "Physical optics light scattering computation"
9
9
  authors = [{name = "Harry Ballington", email = "ballington@uni-wuppertal.de"}]
10
10
  license = {text = "GPL-3.0"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes