/
shvidkuli
/
kkrjava
Обзор
Документация
Войти
/
shvidkuli
/
kkrjava
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/com/montecarlo/Main.java
139 строк
6 KB
kroc400
first_commit
30 апр 2026, 22:44
30 апр 2026, 22:44
2347fdb
Код
Авторство
О чём код?
package com.montecarlo; import com.montecarlo.geometry.BoundingBox; import com.montecarlo.geometry.FigureDebf; import com.montecarlo.montecarlo.MonteCarloCalculator; import com.montecarlo.montecarlo.MonteCarloCalculator.ExperimentResult; import com.montecarlo.utils.ConfigReader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; /** * Application entry point for the Monte Carlo area estimator of figure "debf". * * <h3>Usage</h3> * <pre> * gradle run # uses default config path * gradle run --args="path/config.ini" # custom config * java -jar montecarlo-debf.jar path/config.ini * </pre> * * <h3>What it does</h3> * <ol> * <li>Reads the INI configuration (rectangle, figure points, experiment sizes).</li> * <li>Constructs the figure "debf" (triangle BEF + semicircle on the D-side of FE).</li> * <li>Logs the bounding box and analytical area.</li> * <li>Runs Monte Carlo experiments for each N in the config.</li> * <li>Prints a profiling table: N | estimated area | relative error | elapsed time.</li> * </ol> */ public class Main { private static final Logger log = LogManager.getLogger(Main.class); /** Default path to the configuration file (relative to working directory). */ private static final String DEFAULT_CONFIG = "src/main/resources/config.ini"; /** * Application entry point. * * @param args optional: args[0] overrides the configuration file path */ public static void main(String[] args) { String configPath = (args.length > 0) ? args[0] : DEFAULT_CONFIG; log.info("=== Monte Carlo area estimator — figure 'debf' ==="); log.info("Configuration file: {}", configPath); // ------------------------------------------------------------------ // Load configuration // ------------------------------------------------------------------ ConfigReader reader = new ConfigReader(); try { reader.load(configPath); } catch (IOException e) { log.error("Cannot read configuration file '{}': {}", configPath, e.getMessage()); System.err.println("[ERROR] Cannot read configuration: " + e.getMessage()); System.exit(1); } catch (RuntimeException e) { log.error("Invalid configuration: {}", e.getMessage()); System.err.println("[ERROR] Invalid configuration: " + e.getMessage()); System.exit(1); } // ------------------------------------------------------------------ // Build figure // ------------------------------------------------------------------ FigureDebf figure; long[] nValues; try { figure = reader.readFigure(); nValues = reader.readExperimentSizes(); } catch (RuntimeException e) { log.error("Failed to build figure from config: {}", e.getMessage()); System.err.println("[ERROR] " + e.getMessage()); System.exit(1); return; // unreachable; satisfies compiler } double analyticalArea = figure.analyticalArea(); BoundingBox box = figure.getBoundingBox(); log.info("Figure : {}", figure); log.info("Bounding box: {}", box); log.info("Bounding box area : {}", String.format("%.6f", box.area())); log.info("Analytical area : {}", String.format("%.10f", analyticalArea)); log.info("Sampling efficiency: {}%", String.format("%.2f", analyticalArea / box.area() * 100)); System.out.println(); System.out.println("Figure : " + figure); System.out.println("Bounding box : " + box); System.out.printf ("Analytical area = %.10f%n", analyticalArea); System.out.printf ("Bounding box area = %.6f%n", box.area()); System.out.printf ("Sampling efficiency = %.2f%%%n%n", analyticalArea / box.area() * 100); // ------------------------------------------------------------------ // Run experiments // ------------------------------------------------------------------ MonteCarloCalculator calc = new MonteCarloCalculator(figure); ExperimentResult[] results = calc.runAllExperiments(nValues, analyticalArea); // ------------------------------------------------------------------ // Print results table // ------------------------------------------------------------------ String sep = "+" + repeat('-', 14) + "+" + repeat('-', 18) + "+" + repeat('-', 20) + "+" + repeat('-', 14) + "+"; System.out.println(sep); System.out.printf("| %-12s | %-16s | %-18s | %-12s |%n", "N", "Area (est.)", "Rel. error (%)", "Time (ms)"); System.out.println(sep); for (ExperimentResult r : results) { System.out.printf("| %-12d | %-16.6f | %-18.6f | %-12d |%n", r.n, r.estimatedArea, r.relativeErrorPct, r.elapsedMillis); } System.out.println(sep); System.out.printf("| Analytical area: %-54.10f |%n", analyticalArea); System.out.println(sep); log.info("=== Done ==="); } /** * Returns a string consisting of {@code count} repetitions of {@code ch}. * * @param ch the character to repeat * @param count number of repetitions * @return repeated string */ private static String repeat(char ch, int count) { StringBuilder sb = new StringBuilder(count); for (int i = 0; i < count; i++) { sb.append(ch); } return sb.toString(); } }